Repository: lxqt/lxqt-panel Branch: master Commit: 5d1be0e72747 Files: 2503 Total size: 8.6 MB Directory structure: gitextract_ry8cbf98/ ├── .ci/ │ └── build.sh ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── feature_request.md │ ├── ISSUE_TEMPLATE.md │ └── workflows/ │ └── test.yml ├── .gitignore ├── .translation-update ├── AUTHORS ├── CHANGELOG ├── CMakeLists.txt ├── LICENSE ├── README.md ├── autostart/ │ ├── CMakeLists.txt │ ├── lxqt-panel.desktop.in │ ├── lxqt-panel_wayland.desktop.in │ └── translations/ │ ├── lxqt-panel.desktop.yaml │ ├── lxqt-panel_ar.desktop.yaml │ ├── lxqt-panel_bg.desktop.yaml │ ├── lxqt-panel_ca.desktop.yaml │ ├── lxqt-panel_cs.desktop.yaml │ ├── lxqt-panel_da.desktop.yaml │ ├── lxqt-panel_de.desktop.yaml │ ├── lxqt-panel_el.desktop.yaml │ ├── lxqt-panel_en_GB.desktop.yaml │ ├── lxqt-panel_eo.desktop.yaml │ ├── lxqt-panel_es.desktop.yaml │ ├── lxqt-panel_es_VE.desktop.yaml │ ├── lxqt-panel_et.desktop.yaml │ ├── lxqt-panel_eu.desktop.yaml │ ├── lxqt-panel_fi.desktop.yaml │ ├── lxqt-panel_fr.desktop.yaml │ ├── lxqt-panel_gl.desktop.yaml │ ├── lxqt-panel_he.desktop.yaml │ ├── lxqt-panel_hr.desktop.yaml │ ├── lxqt-panel_hu.desktop.yaml │ ├── lxqt-panel_ia.desktop.yaml │ ├── lxqt-panel_id.desktop.yaml │ ├── lxqt-panel_it.desktop.yaml │ ├── lxqt-panel_ja.desktop.yaml │ ├── lxqt-panel_ka.desktop.yaml │ ├── lxqt-panel_kab.desktop.yaml │ ├── lxqt-panel_kk.desktop.yaml │ ├── lxqt-panel_ko.desktop.yaml │ ├── lxqt-panel_lg.desktop.yaml │ ├── lxqt-panel_lt.desktop.yaml │ ├── lxqt-panel_lv.desktop.yaml │ ├── lxqt-panel_nb_NO.desktop.yaml │ ├── lxqt-panel_nl.desktop.yaml │ ├── lxqt-panel_oc.desktop.yaml │ ├── lxqt-panel_pa.desktop.yaml │ ├── lxqt-panel_pl.desktop.yaml │ ├── lxqt-panel_pt.desktop.yaml │ ├── lxqt-panel_pt_BR.desktop.yaml │ ├── lxqt-panel_ro.desktop.yaml │ ├── lxqt-panel_ru.desktop.yaml │ ├── lxqt-panel_si.desktop.yaml │ ├── lxqt-panel_sk.desktop.yaml │ ├── lxqt-panel_sl.desktop.yaml │ ├── lxqt-panel_sr.desktop.yaml │ ├── lxqt-panel_sv.desktop.yaml │ ├── lxqt-panel_th.desktop.yaml │ ├── lxqt-panel_tr.desktop.yaml │ ├── lxqt-panel_uk.desktop.yaml │ ├── lxqt-panel_zh_CN.desktop.yaml │ └── lxqt-panel_zh_TW.desktop.yaml ├── cmake/ │ └── BuildPlugin.cmake ├── panel/ │ ├── CMakeLists.txt │ ├── backends/ │ │ ├── CMakeLists.txt │ │ ├── ilxqtabstractwmiface.cpp │ │ ├── ilxqtabstractwmiface.h │ │ ├── lxqtdummywmbackend.cpp │ │ ├── lxqtdummywmbackend.h │ │ ├── lxqttaskbartypes.h │ │ ├── wayland/ │ │ │ ├── CMakeLists.txt │ │ │ ├── kwin_wayland/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── lxqtplasmavirtualdesktop.cpp │ │ │ │ ├── lxqtplasmavirtualdesktop.h │ │ │ │ ├── lxqttaskbarplasmawindowmanagment.cpp │ │ │ │ ├── lxqttaskbarplasmawindowmanagment.h │ │ │ │ ├── lxqtwmbackend_kwinwayland.cpp │ │ │ │ ├── lxqtwmbackend_kwinwayland.h │ │ │ │ └── protocols/ │ │ │ │ ├── org-kde-plasma-virtual-desktop.xml │ │ │ │ └── plasma-window-management.xml │ │ │ ├── protocols/ │ │ │ │ ├── org-kde-plasma-virtual-desktop.xml │ │ │ │ └── plasma-window-management.xml │ │ │ ├── wayfire/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── lxqtwmbackend_wf.cpp │ │ │ │ ├── lxqtwmbackend_wf.h │ │ │ │ ├── wayfire-common.cpp │ │ │ │ └── wayfire-common.h │ │ │ └── wlroots/ │ │ │ ├── CMakeLists.txt │ │ │ ├── ext-workspace-v1.xml │ │ │ ├── lxqttaskbarwlrwm.cpp │ │ │ ├── lxqttaskbarwlrwm.h │ │ │ ├── lxqtwmbackend_wlr.cpp │ │ │ ├── lxqtwmbackend_wlr.h │ │ │ ├── wlr-foreign-toplevel-management-unstable-v1.xml │ │ │ ├── workspace.cpp │ │ │ └── workspace.hpp │ │ └── xcb/ │ │ ├── CMakeLists.txt │ │ ├── lxqtwmbackend_x11.cpp │ │ └── lxqtwmbackend_x11.h │ ├── config/ │ │ ├── addplugindialog.cpp │ │ ├── addplugindialog.h │ │ ├── addplugindialog.ui │ │ ├── configpaneldialog.cpp │ │ ├── configpaneldialog.h │ │ ├── configplacement.cpp │ │ ├── configplacement.h │ │ ├── configplacement.ui │ │ ├── configpluginswidget.cpp │ │ ├── configpluginswidget.h │ │ ├── configpluginswidget.ui │ │ ├── configstyling.cpp │ │ ├── configstyling.h │ │ └── configstyling.ui │ ├── ilxqtpanel.h │ ├── ilxqtpanelplugin.h │ ├── lxqtpanel.cpp │ ├── lxqtpanel.h │ ├── lxqtpanelapplication.cpp │ ├── lxqtpanelapplication.h │ ├── lxqtpanelapplication_p.h │ ├── lxqtpanelglobals.h │ ├── lxqtpanellayout.cpp │ ├── lxqtpanellayout.h │ ├── lxqtpanellimits.h │ ├── lxqtpanelpluginconfigdialog.cpp │ ├── lxqtpanelpluginconfigdialog.h │ ├── main.cpp │ ├── man/ │ │ └── lxqt-panel.1 │ ├── panelpluginsmodel.cpp │ ├── panelpluginsmodel.h │ ├── plugin.cpp │ ├── plugin.h │ ├── pluginmoveprocessor.cpp │ ├── pluginmoveprocessor.h │ ├── pluginsettings.cpp │ ├── pluginsettings.h │ ├── pluginsettings_p.h │ ├── popupmenu.cpp │ ├── popupmenu.h │ ├── resources/ │ │ └── panel.conf │ ├── translations/ │ │ ├── lxqt-panel.ts │ │ ├── lxqt-panel_ar.ts │ │ ├── lxqt-panel_arn.ts │ │ ├── lxqt-panel_ast.ts │ │ ├── lxqt-panel_bg.ts │ │ ├── lxqt-panel_ca.ts │ │ ├── lxqt-panel_cs.ts │ │ ├── lxqt-panel_cy.ts │ │ ├── lxqt-panel_da.ts │ │ ├── lxqt-panel_de.ts │ │ ├── lxqt-panel_el.ts │ │ ├── lxqt-panel_en_GB.ts │ │ ├── lxqt-panel_eo.ts │ │ ├── lxqt-panel_es.ts │ │ ├── lxqt-panel_es_UY.ts │ │ ├── lxqt-panel_es_VE.ts │ │ ├── lxqt-panel_et.ts │ │ ├── lxqt-panel_eu.ts │ │ ├── lxqt-panel_fa.ts │ │ ├── lxqt-panel_fi.ts │ │ ├── lxqt-panel_fr.ts │ │ ├── lxqt-panel_gl.ts │ │ ├── lxqt-panel_he.ts │ │ ├── lxqt-panel_hr.ts │ │ ├── lxqt-panel_hu.ts │ │ ├── lxqt-panel_ia.ts │ │ ├── lxqt-panel_id.ts │ │ ├── lxqt-panel_is.ts │ │ ├── lxqt-panel_it.ts │ │ ├── lxqt-panel_ja.ts │ │ ├── lxqt-panel_ka.ts │ │ ├── lxqt-panel_kab.ts │ │ ├── lxqt-panel_kk.ts │ │ ├── lxqt-panel_ko.ts │ │ ├── lxqt-panel_lg.ts │ │ ├── lxqt-panel_lt.ts │ │ ├── lxqt-panel_lv.ts │ │ ├── lxqt-panel_nb_NO.ts │ │ ├── lxqt-panel_nl.ts │ │ ├── lxqt-panel_oc.ts │ │ ├── lxqt-panel_pa.ts │ │ ├── lxqt-panel_pl.ts │ │ ├── lxqt-panel_pt.ts │ │ ├── lxqt-panel_pt_BR.ts │ │ ├── lxqt-panel_ro_RO.ts │ │ ├── lxqt-panel_ru.ts │ │ ├── lxqt-panel_si.ts │ │ ├── lxqt-panel_sk_SK.ts │ │ ├── lxqt-panel_sl.ts │ │ ├── lxqt-panel_sr@ijekavian.ts │ │ ├── lxqt-panel_sr@latin.ts │ │ ├── lxqt-panel_sr_BA.ts │ │ ├── lxqt-panel_sr_RS.ts │ │ ├── lxqt-panel_sv.ts │ │ ├── lxqt-panel_th_TH.ts │ │ ├── lxqt-panel_tr.ts │ │ ├── lxqt-panel_uk.ts │ │ ├── lxqt-panel_vi.ts │ │ ├── lxqt-panel_zh_CN.ts │ │ └── lxqt-panel_zh_TW.ts │ ├── windownotifier.cpp │ └── windownotifier.h ├── plugin-backlight/ │ ├── CMakeLists.txt │ ├── backlight.cpp │ ├── backlight.h │ ├── resources/ │ │ └── backlight.desktop.in │ ├── sliderdialog.cpp │ ├── sliderdialog.h │ └── translations/ │ ├── backlight.desktop.yaml │ ├── backlight_ar.desktop.yaml │ ├── backlight_bg.desktop.yaml │ ├── backlight_ca.desktop.yaml │ ├── backlight_cs.desktop.yaml │ ├── backlight_da.desktop.yaml │ ├── backlight_de.desktop.yaml │ ├── backlight_el.desktop.yaml │ ├── backlight_en_GB.desktop.yaml │ ├── backlight_es.desktop.yaml │ ├── backlight_et.desktop.yaml │ ├── backlight_fi.desktop.yaml │ ├── backlight_fr.desktop.yaml │ ├── backlight_he.desktop.yaml │ ├── backlight_hr.desktop.yaml │ ├── backlight_hu.desktop.yaml │ ├── backlight_it.desktop.yaml │ ├── backlight_ja.desktop.yaml │ ├── backlight_ka.desktop.yaml │ ├── backlight_kk.desktop.yaml │ ├── backlight_ko.desktop.yaml │ ├── backlight_lg.desktop.yaml │ ├── backlight_lt.desktop.yaml │ ├── backlight_lv.desktop.yaml │ ├── backlight_nb_NO.desktop.yaml │ ├── backlight_nl.desktop.yaml │ ├── backlight_oc.desktop.yaml │ ├── backlight_pa.desktop.yaml │ ├── backlight_pl.desktop.yaml │ ├── backlight_pt.desktop.yaml │ ├── backlight_ru.desktop.yaml │ ├── backlight_si.desktop.yaml │ ├── backlight_sk.desktop.yaml │ ├── backlight_sr.desktop.yaml │ ├── backlight_sv.desktop.yaml │ ├── backlight_tr.desktop.yaml │ ├── backlight_uk.desktop.yaml │ ├── backlight_zh_CN.desktop.yaml │ └── backlight_zh_TW.desktop.yaml ├── plugin-colorpicker/ │ ├── CMakeLists.txt │ ├── colorbutton.cpp │ ├── colorbutton.h │ ├── colorpicker.cpp │ ├── colorpicker.h │ ├── resources/ │ │ └── colorpicker.desktop.in │ └── translations/ │ ├── colorpicker.desktop.yaml │ ├── colorpicker.ts │ ├── colorpicker_ar.desktop.yaml │ ├── colorpicker_ar.ts │ ├── colorpicker_bg.desktop.yaml │ ├── colorpicker_bg.ts │ ├── colorpicker_ca.desktop.yaml │ ├── colorpicker_ca.ts │ ├── colorpicker_cs.desktop.yaml │ ├── colorpicker_cs.ts │ ├── colorpicker_da.desktop.yaml │ ├── colorpicker_da.ts │ ├── colorpicker_de.desktop.yaml │ ├── colorpicker_de.ts │ ├── colorpicker_el.desktop.yaml │ ├── colorpicker_el.ts │ ├── colorpicker_en_GB.desktop.yaml │ ├── colorpicker_en_GB.ts │ ├── colorpicker_es.desktop.yaml │ ├── colorpicker_es_VE.desktop.yaml │ ├── colorpicker_et.desktop.yaml │ ├── colorpicker_et.ts │ ├── colorpicker_eu.desktop.yaml │ ├── colorpicker_fi.desktop.yaml │ ├── colorpicker_fi.ts │ ├── colorpicker_fr.desktop.yaml │ ├── colorpicker_fr.ts │ ├── colorpicker_he.desktop.yaml │ ├── colorpicker_he.ts │ ├── colorpicker_hr.desktop.yaml │ ├── colorpicker_hr.ts │ ├── colorpicker_hu.desktop.yaml │ ├── colorpicker_hu.ts │ ├── colorpicker_it.desktop.yaml │ ├── colorpicker_it.ts │ ├── colorpicker_ja.desktop.yaml │ ├── colorpicker_ka.desktop.yaml │ ├── colorpicker_ka.ts │ ├── colorpicker_kab.desktop.yaml │ ├── colorpicker_kab.ts │ ├── colorpicker_kk.desktop.yaml │ ├── colorpicker_kk.ts │ ├── colorpicker_ko.desktop.yaml │ ├── colorpicker_ko.ts │ ├── colorpicker_lg.desktop.yaml │ ├── colorpicker_lg.ts │ ├── colorpicker_lt.desktop.yaml │ ├── colorpicker_lt.ts │ ├── colorpicker_lv.desktop.yaml │ ├── colorpicker_nb_NO.desktop.yaml │ ├── colorpicker_nl.desktop.yaml │ ├── colorpicker_nl.ts │ ├── colorpicker_oc.desktop.yaml │ ├── colorpicker_oc.ts │ ├── colorpicker_pa.desktop.yaml │ ├── colorpicker_pl.desktop.yaml │ ├── colorpicker_pl.ts │ ├── colorpicker_pt.desktop.yaml │ ├── colorpicker_pt.ts │ ├── colorpicker_pt_BR.desktop.yaml │ ├── colorpicker_pt_BR.ts │ ├── colorpicker_ro.desktop.yaml │ ├── colorpicker_ru.desktop.yaml │ ├── colorpicker_ru.ts │ ├── colorpicker_si.desktop.yaml │ ├── colorpicker_sk.desktop.yaml │ ├── colorpicker_sk.ts │ ├── colorpicker_sr.desktop.yaml │ ├── colorpicker_sr.ts │ ├── colorpicker_sv.desktop.yaml │ ├── colorpicker_sv.ts │ ├── colorpicker_th.desktop.yaml │ ├── colorpicker_tr.desktop.yaml │ ├── colorpicker_tr.ts │ ├── colorpicker_uk.desktop.yaml │ ├── colorpicker_zh_CN.desktop.yaml │ ├── colorpicker_zh_CN.ts │ ├── colorpicker_zh_TW.desktop.yaml │ └── colorpicker_zh_TW.ts ├── plugin-cpuload/ │ ├── CMakeLists.txt │ ├── lxqtcpuload.cpp │ ├── lxqtcpuload.h │ ├── lxqtcpuloadconfiguration.cpp │ ├── lxqtcpuloadconfiguration.h │ ├── lxqtcpuloadconfiguration.ui │ ├── lxqtcpuloadplugin.cpp │ ├── lxqtcpuloadplugin.h │ ├── resources/ │ │ └── cpuload.desktop.in │ └── translations/ │ ├── cpuload.desktop.yaml │ ├── cpuload.ts │ ├── cpuload_ar.desktop.yaml │ ├── cpuload_ar.ts │ ├── cpuload_arn.ts │ ├── cpuload_ast.ts │ ├── cpuload_bg.desktop.yaml │ ├── cpuload_bg.ts │ ├── cpuload_ca.desktop.yaml │ ├── cpuload_ca.ts │ ├── cpuload_cs.desktop.yaml │ ├── cpuload_cs.ts │ ├── cpuload_cy.ts │ ├── cpuload_da.desktop.yaml │ ├── cpuload_da.ts │ ├── cpuload_de.desktop.yaml │ ├── cpuload_de.ts │ ├── cpuload_el.desktop.yaml │ ├── cpuload_el.ts │ ├── cpuload_en_GB.desktop.yaml │ ├── cpuload_en_GB.ts │ ├── cpuload_eo.desktop.yaml │ ├── cpuload_eo.ts │ ├── cpuload_es.desktop.yaml │ ├── cpuload_es.ts │ ├── cpuload_es_VE.desktop.yaml │ ├── cpuload_es_VE.ts │ ├── cpuload_et.desktop.yaml │ ├── cpuload_et.ts │ ├── cpuload_eu.desktop.yaml │ ├── cpuload_eu.ts │ ├── cpuload_fi.desktop.yaml │ ├── cpuload_fi.ts │ ├── cpuload_fr.desktop.yaml │ ├── cpuload_fr.ts │ ├── cpuload_gl.ts │ ├── cpuload_he.desktop.yaml │ ├── cpuload_he.ts │ ├── cpuload_hr.desktop.yaml │ ├── cpuload_hr.ts │ ├── cpuload_hu.desktop.yaml │ ├── cpuload_hu.ts │ ├── cpuload_id.ts │ ├── cpuload_it.desktop.yaml │ ├── cpuload_it.ts │ ├── cpuload_ja.desktop.yaml │ ├── cpuload_ja.ts │ ├── cpuload_ka.desktop.yaml │ ├── cpuload_ka.ts │ ├── cpuload_kab.desktop.yaml │ ├── cpuload_kk.desktop.yaml │ ├── cpuload_kk.ts │ ├── cpuload_ko.desktop.yaml │ ├── cpuload_ko.ts │ ├── cpuload_lg.desktop.yaml │ ├── cpuload_lg.ts │ ├── cpuload_lt.desktop.yaml │ ├── cpuload_lt.ts │ ├── cpuload_lv.desktop.yaml │ ├── cpuload_lv.ts │ ├── cpuload_nb_NO.desktop.yaml │ ├── cpuload_nb_NO.ts │ ├── cpuload_nl.desktop.yaml │ ├── cpuload_nl.ts │ ├── cpuload_oc.desktop.yaml │ ├── cpuload_oc.ts │ ├── cpuload_pa.desktop.yaml │ ├── cpuload_pa.ts │ ├── cpuload_pl.desktop.yaml │ ├── cpuload_pl.ts │ ├── cpuload_pt.desktop.yaml │ ├── cpuload_pt.ts │ ├── cpuload_pt_BR.desktop.yaml │ ├── cpuload_pt_BR.ts │ ├── cpuload_ro.desktop.yaml │ ├── cpuload_ro_RO.ts │ ├── cpuload_ru.desktop.yaml │ ├── cpuload_ru.ts │ ├── cpuload_si.desktop.yaml │ ├── cpuload_si.ts │ ├── cpuload_sk.desktop.yaml │ ├── cpuload_sk_SK.ts │ ├── cpuload_sl.desktop.yaml │ ├── cpuload_sl.ts │ ├── cpuload_sr.desktop.yaml │ ├── cpuload_sr.ts │ ├── cpuload_sv.desktop.yaml │ ├── cpuload_sv.ts │ ├── cpuload_th.desktop.yaml │ ├── cpuload_th_TH.ts │ ├── cpuload_tr.desktop.yaml │ ├── cpuload_tr.ts │ ├── cpuload_uk.desktop.yaml │ ├── cpuload_uk.ts │ ├── cpuload_zh_CN.desktop.yaml │ ├── cpuload_zh_CN.ts │ ├── cpuload_zh_TW.desktop.yaml │ └── cpuload_zh_TW.ts ├── plugin-customcommand/ │ ├── CMakeLists.txt │ ├── colorLabel.cpp │ ├── colorLabel.h │ ├── custombutton.cpp │ ├── custombutton.h │ ├── lxqtcustomcommand.cpp │ ├── lxqtcustomcommand.h │ ├── lxqtcustomcommandconfiguration.cpp │ ├── lxqtcustomcommandconfiguration.h │ ├── lxqtcustomcommandconfiguration.ui │ ├── resources/ │ │ └── customcommand.desktop.in │ └── translations/ │ ├── customcommand.desktop.yaml │ ├── customcommand.ts │ ├── customcommand_ar.desktop.yaml │ ├── customcommand_ar.ts │ ├── customcommand_bg.desktop.yaml │ ├── customcommand_bg.ts │ ├── customcommand_ca.desktop.yaml │ ├── customcommand_ca.ts │ ├── customcommand_cs.desktop.yaml │ ├── customcommand_cs.ts │ ├── customcommand_da.desktop.yaml │ ├── customcommand_da.ts │ ├── customcommand_de.desktop.yaml │ ├── customcommand_de.ts │ ├── customcommand_el.desktop.yaml │ ├── customcommand_el.ts │ ├── customcommand_en_GB.desktop.yaml │ ├── customcommand_en_GB.ts │ ├── customcommand_es.desktop.yaml │ ├── customcommand_es.ts │ ├── customcommand_et.desktop.yaml │ ├── customcommand_et.ts │ ├── customcommand_fi.desktop.yaml │ ├── customcommand_fi.ts │ ├── customcommand_fr.desktop.yaml │ ├── customcommand_fr.ts │ ├── customcommand_he.desktop.yaml │ ├── customcommand_he.ts │ ├── customcommand_hr.desktop.yaml │ ├── customcommand_hr.ts │ ├── customcommand_hu.desktop.yaml │ ├── customcommand_hu.ts │ ├── customcommand_it.desktop.yaml │ ├── customcommand_it.ts │ ├── customcommand_ja.desktop.yaml │ ├── customcommand_ja.ts │ ├── customcommand_ka.desktop.yaml │ ├── customcommand_ka.ts │ ├── customcommand_kk.ts │ ├── customcommand_ko.desktop.yaml │ ├── customcommand_ko.ts │ ├── customcommand_lg.desktop.yaml │ ├── customcommand_lg.ts │ ├── customcommand_lt.desktop.yaml │ ├── customcommand_lt.ts │ ├── customcommand_lv.desktop.yaml │ ├── customcommand_lv.ts │ ├── customcommand_nb_NO.desktop.yaml │ ├── customcommand_nb_NO.ts │ ├── customcommand_nl.desktop.yaml │ ├── customcommand_nl.ts │ ├── customcommand_oc.ts │ ├── customcommand_pa.ts │ ├── customcommand_pl.desktop.yaml │ ├── customcommand_pl.ts │ ├── customcommand_pt.desktop.yaml │ ├── customcommand_pt.ts │ ├── customcommand_pt_BR.desktop.yaml │ ├── customcommand_pt_BR.ts │ ├── customcommand_ru.desktop.yaml │ ├── customcommand_ru.ts │ ├── customcommand_sk.desktop.yaml │ ├── customcommand_sk.ts │ ├── customcommand_sr.ts │ ├── customcommand_sv.desktop.yaml │ ├── customcommand_sv.ts │ ├── customcommand_tr.desktop.yaml │ ├── customcommand_tr.ts │ ├── customcommand_uk.desktop.yaml │ ├── customcommand_uk.ts │ ├── customcommand_zh_CN.desktop.yaml │ ├── customcommand_zh_CN.ts │ ├── customcommand_zh_TW.desktop.yaml │ └── customcommand_zh_TW.ts ├── plugin-desktopswitch/ │ ├── CMakeLists.txt │ ├── desktopswitch.cpp │ ├── desktopswitch.h │ ├── desktopswitchbutton.cpp │ ├── desktopswitchbutton.h │ ├── desktopswitchconfiguration.cpp │ ├── desktopswitchconfiguration.h │ ├── desktopswitchconfiguration.ui │ ├── resources/ │ │ └── desktopswitch.desktop.in │ └── translations/ │ ├── desktopswitch.desktop.yaml │ ├── desktopswitch.ts │ ├── desktopswitch_ar.desktop.yaml │ ├── desktopswitch_ar.ts │ ├── desktopswitch_arn.ts │ ├── desktopswitch_ast.ts │ ├── desktopswitch_bg.desktop.yaml │ ├── desktopswitch_bg.ts │ ├── desktopswitch_ca.desktop.yaml │ ├── desktopswitch_ca.ts │ ├── desktopswitch_cs.desktop.yaml │ ├── desktopswitch_cs.ts │ ├── desktopswitch_cy.ts │ ├── desktopswitch_da.desktop.yaml │ ├── desktopswitch_da.ts │ ├── desktopswitch_de.desktop.yaml │ ├── desktopswitch_de.ts │ ├── desktopswitch_el.desktop.yaml │ ├── desktopswitch_el.ts │ ├── desktopswitch_en_GB.desktop.yaml │ ├── desktopswitch_en_GB.ts │ ├── desktopswitch_eo.desktop.yaml │ ├── desktopswitch_eo.ts │ ├── desktopswitch_es.desktop.yaml │ ├── desktopswitch_es.ts │ ├── desktopswitch_es_UY.ts │ ├── desktopswitch_es_VE.desktop.yaml │ ├── desktopswitch_es_VE.ts │ ├── desktopswitch_et.desktop.yaml │ ├── desktopswitch_et.ts │ ├── desktopswitch_eu.desktop.yaml │ ├── desktopswitch_eu.ts │ ├── desktopswitch_fi.desktop.yaml │ ├── desktopswitch_fi.ts │ ├── desktopswitch_fr.desktop.yaml │ ├── desktopswitch_fr.ts │ ├── desktopswitch_gl.ts │ ├── desktopswitch_he.desktop.yaml │ ├── desktopswitch_he.ts │ ├── desktopswitch_hr.desktop.yaml │ ├── desktopswitch_hr.ts │ ├── desktopswitch_hu.desktop.yaml │ ├── desktopswitch_hu.ts │ ├── desktopswitch_ia.ts │ ├── desktopswitch_id.ts │ ├── desktopswitch_it.desktop.yaml │ ├── desktopswitch_it.ts │ ├── desktopswitch_ja.desktop.yaml │ ├── desktopswitch_ja.ts │ ├── desktopswitch_ka.desktop.yaml │ ├── desktopswitch_ka.ts │ ├── desktopswitch_kab.ts │ ├── desktopswitch_kk.ts │ ├── desktopswitch_ko.desktop.yaml │ ├── desktopswitch_ko.ts │ ├── desktopswitch_lg.desktop.yaml │ ├── desktopswitch_lg.ts │ ├── desktopswitch_lt.desktop.yaml │ ├── desktopswitch_lt.ts │ ├── desktopswitch_lv.desktop.yaml │ ├── desktopswitch_lv.ts │ ├── desktopswitch_nb_NO.desktop.yaml │ ├── desktopswitch_nb_NO.ts │ ├── desktopswitch_nl.desktop.yaml │ ├── desktopswitch_nl.ts │ ├── desktopswitch_oc.ts │ ├── desktopswitch_pa.desktop.yaml │ ├── desktopswitch_pa.ts │ ├── desktopswitch_pl.desktop.yaml │ ├── desktopswitch_pl.ts │ ├── desktopswitch_pt.desktop.yaml │ ├── desktopswitch_pt.ts │ ├── desktopswitch_pt_BR.desktop.yaml │ ├── desktopswitch_pt_BR.ts │ ├── desktopswitch_ro.desktop.yaml │ ├── desktopswitch_ro_RO.ts │ ├── desktopswitch_ru.desktop.yaml │ ├── desktopswitch_ru.ts │ ├── desktopswitch_si.desktop.yaml │ ├── desktopswitch_si.ts │ ├── desktopswitch_sk.desktop.yaml │ ├── desktopswitch_sk_SK.ts │ ├── desktopswitch_sl.desktop.yaml │ ├── desktopswitch_sl.ts │ ├── desktopswitch_sr.desktop.yaml │ ├── desktopswitch_sr@ijekavian.desktop.yaml │ ├── desktopswitch_sr@ijekavian.ts │ ├── desktopswitch_sr@ijekavianlatin.desktop.yaml │ ├── desktopswitch_sr@latin.desktop.yaml │ ├── desktopswitch_sr@latin.ts │ ├── desktopswitch_sr_BA.ts │ ├── desktopswitch_sr_RS.ts │ ├── desktopswitch_sv.desktop.yaml │ ├── desktopswitch_sv.ts │ ├── desktopswitch_th.desktop.yaml │ ├── desktopswitch_th_TH.ts │ ├── desktopswitch_tr.desktop.yaml │ ├── desktopswitch_tr.ts │ ├── desktopswitch_uk.desktop.yaml │ ├── desktopswitch_uk.ts │ ├── desktopswitch_zh_CN.desktop.yaml │ ├── desktopswitch_zh_CN.ts │ ├── desktopswitch_zh_TW.desktop.yaml │ └── desktopswitch_zh_TW.ts ├── plugin-directorymenu/ │ ├── CMakeLists.txt │ ├── directorymenu.cpp │ ├── directorymenu.h │ ├── directorymenuconfiguration.cpp │ ├── directorymenuconfiguration.h │ ├── directorymenuconfiguration.ui │ ├── resources/ │ │ └── directorymenu.desktop.in │ └── translations/ │ ├── directorymenu.desktop.yaml │ ├── directorymenu.ts │ ├── directorymenu_ar.desktop.yaml │ ├── directorymenu_ar.ts │ ├── directorymenu_arn.ts │ ├── directorymenu_ast.ts │ ├── directorymenu_bg.desktop.yaml │ ├── directorymenu_bg.ts │ ├── directorymenu_ca.desktop.yaml │ ├── directorymenu_ca.ts │ ├── directorymenu_cs.desktop.yaml │ ├── directorymenu_cs.ts │ ├── directorymenu_cy.ts │ ├── directorymenu_da.desktop.yaml │ ├── directorymenu_da.ts │ ├── directorymenu_de.desktop.yaml │ ├── directorymenu_de.ts │ ├── directorymenu_el.desktop.yaml │ ├── directorymenu_el.ts │ ├── directorymenu_en_GB.desktop.yaml │ ├── directorymenu_en_GB.ts │ ├── directorymenu_es.desktop.yaml │ ├── directorymenu_es.ts │ ├── directorymenu_et.desktop.yaml │ ├── directorymenu_et.ts │ ├── directorymenu_fi.desktop.yaml │ ├── directorymenu_fi.ts │ ├── directorymenu_fr.desktop.yaml │ ├── directorymenu_fr.ts │ ├── directorymenu_gl.ts │ ├── directorymenu_he.desktop.yaml │ ├── directorymenu_he.ts │ ├── directorymenu_hr.desktop.yaml │ ├── directorymenu_hr.ts │ ├── directorymenu_hu.desktop.yaml │ ├── directorymenu_hu.ts │ ├── directorymenu_id.ts │ ├── directorymenu_it.desktop.yaml │ ├── directorymenu_it.ts │ ├── directorymenu_ja.desktop.yaml │ ├── directorymenu_ja.ts │ ├── directorymenu_ka.desktop.yaml │ ├── directorymenu_ka.ts │ ├── directorymenu_kab.ts │ ├── directorymenu_kk.desktop.yaml │ ├── directorymenu_kk.ts │ ├── directorymenu_ko.desktop.yaml │ ├── directorymenu_ko.ts │ ├── directorymenu_lg.desktop.yaml │ ├── directorymenu_lg.ts │ ├── directorymenu_lt.desktop.yaml │ ├── directorymenu_lt.ts │ ├── directorymenu_lv.desktop.yaml │ ├── directorymenu_lv.ts │ ├── directorymenu_nb_NO.desktop.yaml │ ├── directorymenu_nb_NO.ts │ ├── directorymenu_nl.desktop.yaml │ ├── directorymenu_nl.ts │ ├── directorymenu_oc.desktop.yaml │ ├── directorymenu_oc.ts │ ├── directorymenu_pa.desktop.yaml │ ├── directorymenu_pa.ts │ ├── directorymenu_pl.desktop.yaml │ ├── directorymenu_pl.ts │ ├── directorymenu_pt.desktop.yaml │ ├── directorymenu_pt.ts │ ├── directorymenu_pt_BR.desktop.yaml │ ├── directorymenu_pt_BR.ts │ ├── directorymenu_ru.desktop.yaml │ ├── directorymenu_ru.ts │ ├── directorymenu_si.desktop.yaml │ ├── directorymenu_si.ts │ ├── directorymenu_sk.desktop.yaml │ ├── directorymenu_sk_SK.ts │ ├── directorymenu_sr.desktop.yaml │ ├── directorymenu_sv.desktop.yaml │ ├── directorymenu_sv.ts │ ├── directorymenu_tr.desktop.yaml │ ├── directorymenu_tr.ts │ ├── directorymenu_uk.desktop.yaml │ ├── directorymenu_uk.ts │ ├── directorymenu_zh_CN.desktop.yaml │ ├── directorymenu_zh_CN.ts │ ├── directorymenu_zh_TW.desktop.yaml │ └── directorymenu_zh_TW.ts ├── plugin-dom/ │ ├── CMakeLists.txt │ ├── domplugin.cpp │ ├── domplugin.h │ ├── domtreeitem.cpp │ ├── domtreeitem.h │ ├── resources/ │ │ └── dom.desktop.in │ ├── resources.qrc │ ├── translations/ │ │ ├── dom.desktop.yaml │ │ ├── dom.ts │ │ ├── dom_ar.desktop.yaml │ │ ├── dom_ar.ts │ │ ├── dom_arn.ts │ │ ├── dom_ast.ts │ │ ├── dom_bg.desktop.yaml │ │ ├── dom_bg.ts │ │ ├── dom_ca.desktop.yaml │ │ ├── dom_ca.ts │ │ ├── dom_cs.desktop.yaml │ │ ├── dom_cs.ts │ │ ├── dom_cy.ts │ │ ├── dom_da.desktop.yaml │ │ ├── dom_da.ts │ │ ├── dom_de.desktop.yaml │ │ ├── dom_de.ts │ │ ├── dom_el.desktop.yaml │ │ ├── dom_el.ts │ │ ├── dom_en_GB.desktop.yaml │ │ ├── dom_en_GB.ts │ │ ├── dom_es.desktop.yaml │ │ ├── dom_es.ts │ │ ├── dom_et.desktop.yaml │ │ ├── dom_et.ts │ │ ├── dom_fi.desktop.yaml │ │ ├── dom_fi.ts │ │ ├── dom_fr.desktop.yaml │ │ ├── dom_fr.ts │ │ ├── dom_gl.ts │ │ ├── dom_he.desktop.yaml │ │ ├── dom_he.ts │ │ ├── dom_hr.desktop.yaml │ │ ├── dom_hr.ts │ │ ├── dom_hu.desktop.yaml │ │ ├── dom_hu.ts │ │ ├── dom_id.ts │ │ ├── dom_it.desktop.yaml │ │ ├── dom_it.ts │ │ ├── dom_ja.desktop.yaml │ │ ├── dom_ja.ts │ │ ├── dom_ka.desktop.yaml │ │ ├── dom_ka.ts │ │ ├── dom_kab.ts │ │ ├── dom_kk.desktop.yaml │ │ ├── dom_kk.ts │ │ ├── dom_ko.desktop.yaml │ │ ├── dom_ko.ts │ │ ├── dom_lg.desktop.yaml │ │ ├── dom_lg.ts │ │ ├── dom_lt.desktop.yaml │ │ ├── dom_lt.ts │ │ ├── dom_lv.desktop.yaml │ │ ├── dom_lv.ts │ │ ├── dom_nb_NO.desktop.yaml │ │ ├── dom_nb_NO.ts │ │ ├── dom_nl.desktop.yaml │ │ ├── dom_nl.ts │ │ ├── dom_oc.ts │ │ ├── dom_pa.ts │ │ ├── dom_pl.desktop.yaml │ │ ├── dom_pl.ts │ │ ├── dom_pt.desktop.yaml │ │ ├── dom_pt.ts │ │ ├── dom_pt_BR.desktop.yaml │ │ ├── dom_pt_BR.ts │ │ ├── dom_ru.desktop.yaml │ │ ├── dom_ru.ts │ │ ├── dom_si.desktop.yaml │ │ ├── dom_si.ts │ │ ├── dom_sk.desktop.yaml │ │ ├── dom_sk_SK.ts │ │ ├── dom_sr.ts │ │ ├── dom_sr@ijekavian.ts │ │ ├── dom_sv.desktop.yaml │ │ ├── dom_sv.ts │ │ ├── dom_tr.desktop.yaml │ │ ├── dom_tr.ts │ │ ├── dom_uk.desktop.yaml │ │ ├── dom_uk.ts │ │ ├── dom_zh_CN.desktop.yaml │ │ ├── dom_zh_CN.ts │ │ ├── dom_zh_TW.desktop.yaml │ │ └── dom_zh_TW.ts │ ├── treewindow.cpp │ ├── treewindow.h │ └── treewindow.ui ├── plugin-fancymenu/ │ ├── CMakeLists.txt │ ├── lxqtfancymenu.cpp │ ├── lxqtfancymenu.h │ ├── lxqtfancymenuappmap.cpp │ ├── lxqtfancymenuappmap.h │ ├── lxqtfancymenuappmodel.cpp │ ├── lxqtfancymenuappmodel.h │ ├── lxqtfancymenucategoriesmodel.cpp │ ├── lxqtfancymenucategoriesmodel.h │ ├── lxqtfancymenuconfiguration.cpp │ ├── lxqtfancymenuconfiguration.h │ ├── lxqtfancymenuconfiguration.ui │ ├── lxqtfancymenutypes.h │ ├── lxqtfancymenuwindow.cpp │ ├── lxqtfancymenuwindow.h │ ├── resources/ │ │ └── fancymenu.desktop.in │ └── translations/ │ ├── fancymenu.desktop.yaml │ ├── fancymenu.ts │ ├── fancymenu_ar.desktop.yaml │ ├── fancymenu_ar.ts │ ├── fancymenu_ast.ts │ ├── fancymenu_bg.desktop.yaml │ ├── fancymenu_bg.ts │ ├── fancymenu_ca.desktop.yaml │ ├── fancymenu_ca.ts │ ├── fancymenu_cs.desktop.yaml │ ├── fancymenu_cs.ts │ ├── fancymenu_cy.ts │ ├── fancymenu_da.ts │ ├── fancymenu_de.desktop.yaml │ ├── fancymenu_de.ts │ ├── fancymenu_el.desktop.yaml │ ├── fancymenu_el.ts │ ├── fancymenu_en_GB.desktop.yaml │ ├── fancymenu_en_GB.ts │ ├── fancymenu_eo.ts │ ├── fancymenu_es.desktop.yaml │ ├── fancymenu_es.ts │ ├── fancymenu_es_UY.ts │ ├── fancymenu_es_VE.ts │ ├── fancymenu_et.desktop.yaml │ ├── fancymenu_et.ts │ ├── fancymenu_eu.desktop.yaml │ ├── fancymenu_eu.ts │ ├── fancymenu_fi.desktop.yaml │ ├── fancymenu_fi.ts │ ├── fancymenu_fr.desktop.yaml │ ├── fancymenu_fr.ts │ ├── fancymenu_gl.desktop.yaml │ ├── fancymenu_gl.ts │ ├── fancymenu_he.desktop.yaml │ ├── fancymenu_he.ts │ ├── fancymenu_hr.ts │ ├── fancymenu_hu.desktop.yaml │ ├── fancymenu_hu.ts │ ├── fancymenu_ia.ts │ ├── fancymenu_id.ts │ ├── fancymenu_is.ts │ ├── fancymenu_it.desktop.yaml │ ├── fancymenu_it.ts │ ├── fancymenu_ja.desktop.yaml │ ├── fancymenu_ja.ts │ ├── fancymenu_ka.desktop.yaml │ ├── fancymenu_ka.ts │ ├── fancymenu_kk.ts │ ├── fancymenu_ko.desktop.yaml │ ├── fancymenu_ko.ts │ ├── fancymenu_lg.desktop.yaml │ ├── fancymenu_lg.ts │ ├── fancymenu_lt.desktop.yaml │ ├── fancymenu_lt.ts │ ├── fancymenu_lv.ts │ ├── fancymenu_nb_NO.ts │ ├── fancymenu_nl.desktop.yaml │ ├── fancymenu_nl.ts │ ├── fancymenu_oc.ts │ ├── fancymenu_pa.desktop.yaml │ ├── fancymenu_pa.ts │ ├── fancymenu_pl.desktop.yaml │ ├── fancymenu_pl.ts │ ├── fancymenu_pt.desktop.yaml │ ├── fancymenu_pt.ts │ ├── fancymenu_pt_BR.desktop.yaml │ ├── fancymenu_pt_BR.ts │ ├── fancymenu_ro_RO.ts │ ├── fancymenu_ru.desktop.yaml │ ├── fancymenu_ru.ts │ ├── fancymenu_si.ts │ ├── fancymenu_sk.desktop.yaml │ ├── fancymenu_sk_SK.ts │ ├── fancymenu_sl.ts │ ├── fancymenu_sr@latin.ts │ ├── fancymenu_sr_BA.ts │ ├── fancymenu_sr_RS.ts │ ├── fancymenu_sv.desktop.yaml │ ├── fancymenu_sv.ts │ ├── fancymenu_th_TH.ts │ ├── fancymenu_tr.desktop.yaml │ ├── fancymenu_tr.ts │ ├── fancymenu_uk.ts │ ├── fancymenu_zh_CN.desktop.yaml │ ├── fancymenu_zh_CN.ts │ ├── fancymenu_zh_TW.desktop.yaml │ └── fancymenu_zh_TW.ts ├── plugin-kbindicator/ │ ├── CMakeLists.txt │ ├── kbindicator-plugin.cpp │ ├── resources/ │ │ └── kbindicator.desktop.in │ ├── src/ │ │ ├── content.cpp │ │ ├── content.h │ │ ├── controls.h │ │ ├── kbdinfo.h │ │ ├── kbdkeeper.cpp │ │ ├── kbdkeeper.h │ │ ├── kbdlayout.h │ │ ├── kbdstate.cpp │ │ ├── kbdstate.h │ │ ├── kbdstateconfig.cpp │ │ ├── kbdstateconfig.h │ │ ├── kbdstateconfig.ui │ │ ├── kbdwatcher.cpp │ │ ├── kbdwatcher.h │ │ ├── settings.cpp │ │ ├── settings.h │ │ └── x11/ │ │ ├── kbdlayout.cpp │ │ └── kbdlayout.h │ └── translations/ │ ├── kbindicator.desktop.yaml │ ├── kbindicator.ts │ ├── kbindicator_ar.desktop.yaml │ ├── kbindicator_ar.ts │ ├── kbindicator_arn.ts │ ├── kbindicator_ast.ts │ ├── kbindicator_bg.desktop.yaml │ ├── kbindicator_bg.ts │ ├── kbindicator_ca.desktop.yaml │ ├── kbindicator_ca.ts │ ├── kbindicator_cs.desktop.yaml │ ├── kbindicator_cs.ts │ ├── kbindicator_cy.ts │ ├── kbindicator_da.desktop.yaml │ ├── kbindicator_da.ts │ ├── kbindicator_de.desktop.yaml │ ├── kbindicator_de.ts │ ├── kbindicator_el.desktop.yaml │ ├── kbindicator_el.ts │ ├── kbindicator_en_GB.desktop.yaml │ ├── kbindicator_en_GB.ts │ ├── kbindicator_es.desktop.yaml │ ├── kbindicator_es.ts │ ├── kbindicator_et.desktop.yaml │ ├── kbindicator_et.ts │ ├── kbindicator_fi.desktop.yaml │ ├── kbindicator_fi.ts │ ├── kbindicator_fr.desktop.yaml │ ├── kbindicator_fr.ts │ ├── kbindicator_gl.ts │ ├── kbindicator_he.desktop.yaml │ ├── kbindicator_he.ts │ ├── kbindicator_hr.desktop.yaml │ ├── kbindicator_hr.ts │ ├── kbindicator_hu.desktop.yaml │ ├── kbindicator_hu.ts │ ├── kbindicator_id.ts │ ├── kbindicator_it.desktop.yaml │ ├── kbindicator_it.ts │ ├── kbindicator_ja.desktop.yaml │ ├── kbindicator_ja.ts │ ├── kbindicator_ka.desktop.yaml │ ├── kbindicator_ka.ts │ ├── kbindicator_kab.ts │ ├── kbindicator_kk.ts │ ├── kbindicator_ko.desktop.yaml │ ├── kbindicator_ko.ts │ ├── kbindicator_lg.desktop.yaml │ ├── kbindicator_lg.ts │ ├── kbindicator_lt.desktop.yaml │ ├── kbindicator_lt.ts │ ├── kbindicator_lv.desktop.yaml │ ├── kbindicator_lv.ts │ ├── kbindicator_nb_NO.desktop.yaml │ ├── kbindicator_nb_NO.ts │ ├── kbindicator_nl.desktop.yaml │ ├── kbindicator_nl.ts │ ├── kbindicator_oc.ts │ ├── kbindicator_pa.ts │ ├── kbindicator_pl.desktop.yaml │ ├── kbindicator_pl.ts │ ├── kbindicator_pt.desktop.yaml │ ├── kbindicator_pt.ts │ ├── kbindicator_ru.desktop.yaml │ ├── kbindicator_ru.ts │ ├── kbindicator_si.desktop.yaml │ ├── kbindicator_si.ts │ ├── kbindicator_sk.desktop.yaml │ ├── kbindicator_sk_SK.ts │ ├── kbindicator_sr.ts │ ├── kbindicator_sv.desktop.yaml │ ├── kbindicator_sv.ts │ ├── kbindicator_tr.desktop.yaml │ ├── kbindicator_tr.ts │ ├── kbindicator_uk.desktop.yaml │ ├── kbindicator_uk.ts │ ├── kbindicator_zh_CN.desktop.yaml │ ├── kbindicator_zh_CN.ts │ ├── kbindicator_zh_TW.desktop.yaml │ └── kbindicator_zh_TW.ts ├── plugin-mainmenu/ │ ├── CMakeLists.txt │ ├── actionview.cpp │ ├── actionview.h │ ├── lxqtmainmenu.cpp │ ├── lxqtmainmenu.h │ ├── lxqtmainmenuconfiguration.cpp │ ├── lxqtmainmenuconfiguration.h │ ├── lxqtmainmenuconfiguration.ui │ ├── menustyle.cpp │ ├── menustyle.h │ ├── resources/ │ │ └── mainmenu.desktop.in │ └── translations/ │ ├── mainmenu.desktop.yaml │ ├── mainmenu.ts │ ├── mainmenu_ar.desktop.yaml │ ├── mainmenu_ar.ts │ ├── mainmenu_arn.ts │ ├── mainmenu_ast.ts │ ├── mainmenu_bg.desktop.yaml │ ├── mainmenu_bg.ts │ ├── mainmenu_ca.desktop.yaml │ ├── mainmenu_ca.ts │ ├── mainmenu_cs.desktop.yaml │ ├── mainmenu_cs.ts │ ├── mainmenu_cy.ts │ ├── mainmenu_da.desktop.yaml │ ├── mainmenu_da.ts │ ├── mainmenu_de.desktop.yaml │ ├── mainmenu_de.ts │ ├── mainmenu_el.desktop.yaml │ ├── mainmenu_el.ts │ ├── mainmenu_en_GB.desktop.yaml │ ├── mainmenu_en_GB.ts │ ├── mainmenu_eo.desktop.yaml │ ├── mainmenu_eo.ts │ ├── mainmenu_es.desktop.yaml │ ├── mainmenu_es.ts │ ├── mainmenu_es_UY.ts │ ├── mainmenu_es_VE.desktop.yaml │ ├── mainmenu_es_VE.ts │ ├── mainmenu_et.desktop.yaml │ ├── mainmenu_et.ts │ ├── mainmenu_eu.desktop.yaml │ ├── mainmenu_eu.ts │ ├── mainmenu_fi.desktop.yaml │ ├── mainmenu_fi.ts │ ├── mainmenu_fr.desktop.yaml │ ├── mainmenu_fr.ts │ ├── mainmenu_gl.ts │ ├── mainmenu_he.desktop.yaml │ ├── mainmenu_he.ts │ ├── mainmenu_hr.desktop.yaml │ ├── mainmenu_hr.ts │ ├── mainmenu_hu.desktop.yaml │ ├── mainmenu_hu.ts │ ├── mainmenu_ia.ts │ ├── mainmenu_id.desktop.yaml │ ├── mainmenu_id.ts │ ├── mainmenu_is.ts │ ├── mainmenu_it.desktop.yaml │ ├── mainmenu_it.ts │ ├── mainmenu_ja.desktop.yaml │ ├── mainmenu_ja.ts │ ├── mainmenu_ka.desktop.yaml │ ├── mainmenu_ka.ts │ ├── mainmenu_kab.ts │ ├── mainmenu_kk.desktop.yaml │ ├── mainmenu_kk.ts │ ├── mainmenu_ko.desktop.yaml │ ├── mainmenu_ko.ts │ ├── mainmenu_lg.desktop.yaml │ ├── mainmenu_lg.ts │ ├── mainmenu_lt.desktop.yaml │ ├── mainmenu_lt.ts │ ├── mainmenu_lv.desktop.yaml │ ├── mainmenu_lv.ts │ ├── mainmenu_nb_NO.desktop.yaml │ ├── mainmenu_nb_NO.ts │ ├── mainmenu_nl.desktop.yaml │ ├── mainmenu_nl.ts │ ├── mainmenu_oc.desktop.yaml │ ├── mainmenu_oc.ts │ ├── mainmenu_pa.desktop.yaml │ ├── mainmenu_pa.ts │ ├── mainmenu_pl.desktop.yaml │ ├── mainmenu_pl.ts │ ├── mainmenu_pt.desktop.yaml │ ├── mainmenu_pt.ts │ ├── mainmenu_pt_BR.desktop.yaml │ ├── mainmenu_pt_BR.ts │ ├── mainmenu_ro_RO.desktop.yaml │ ├── mainmenu_ro_RO.ts │ ├── mainmenu_ru.desktop.yaml │ ├── mainmenu_ru.ts │ ├── mainmenu_si.desktop.yaml │ ├── mainmenu_si.ts │ ├── mainmenu_sk.desktop.yaml │ ├── mainmenu_sk_SK.ts │ ├── mainmenu_sl.desktop.yaml │ ├── mainmenu_sl.ts │ ├── mainmenu_sr.desktop.yaml │ ├── mainmenu_sr@ijekavian.desktop.yaml │ ├── mainmenu_sr@ijekavianlatin.desktop.yaml │ ├── mainmenu_sr@latin.desktop.yaml │ ├── mainmenu_sr@latin.ts │ ├── mainmenu_sr_BA.ts │ ├── mainmenu_sr_RS.ts │ ├── mainmenu_sv.desktop.yaml │ ├── mainmenu_sv.ts │ ├── mainmenu_th.desktop.yaml │ ├── mainmenu_th_TH.ts │ ├── mainmenu_tr.desktop.yaml │ ├── mainmenu_tr.ts │ ├── mainmenu_uk.desktop.yaml │ ├── mainmenu_uk.ts │ ├── mainmenu_zh_CN.desktop.yaml │ ├── mainmenu_zh_CN.ts │ ├── mainmenu_zh_TW.desktop.yaml │ └── mainmenu_zh_TW.ts ├── plugin-mount/ │ ├── CMakeLists.txt │ ├── actions/ │ │ ├── deviceaction.cpp │ │ ├── deviceaction.h │ │ ├── deviceaction_info.cpp │ │ ├── deviceaction_info.h │ │ ├── deviceaction_menu.cpp │ │ ├── deviceaction_menu.h │ │ ├── deviceaction_nothing.cpp │ │ ├── deviceaction_nothing.h │ │ ├── ejectaction.cpp │ │ ├── ejectaction.h │ │ ├── ejectaction_nothing.cpp │ │ ├── ejectaction_nothing.h │ │ ├── ejectaction_optical.cpp │ │ └── ejectaction_optical.h │ ├── button.cpp │ ├── button.h │ ├── configuration.cpp │ ├── configuration.h │ ├── configuration.ui │ ├── lxqtmountplugin.cpp │ ├── lxqtmountplugin.h │ ├── menudiskitem.cpp │ ├── menudiskitem.h │ ├── popup.cpp │ ├── popup.h │ ├── resources/ │ │ └── mount.desktop.in │ └── translations/ │ ├── mount.desktop.yaml │ ├── mount.ts │ ├── mount_ar.desktop.yaml │ ├── mount_ar.ts │ ├── mount_arn.ts │ ├── mount_ast.ts │ ├── mount_bg.desktop.yaml │ ├── mount_bg.ts │ ├── mount_ca.desktop.yaml │ ├── mount_ca.ts │ ├── mount_cs.desktop.yaml │ ├── mount_cs.ts │ ├── mount_cy.ts │ ├── mount_da.desktop.yaml │ ├── mount_da.ts │ ├── mount_de.desktop.yaml │ ├── mount_de.ts │ ├── mount_el.desktop.yaml │ ├── mount_el.ts │ ├── mount_en_GB.desktop.yaml │ ├── mount_en_GB.ts │ ├── mount_eo.desktop.yaml │ ├── mount_eo.ts │ ├── mount_es.desktop.yaml │ ├── mount_es.ts │ ├── mount_es_UY.ts │ ├── mount_es_VE.desktop.yaml │ ├── mount_es_VE.ts │ ├── mount_et.desktop.yaml │ ├── mount_et.ts │ ├── mount_eu.desktop.yaml │ ├── mount_eu.ts │ ├── mount_fi.desktop.yaml │ ├── mount_fi.ts │ ├── mount_fr.desktop.yaml │ ├── mount_fr.ts │ ├── mount_gl.ts │ ├── mount_he.desktop.yaml │ ├── mount_he.ts │ ├── mount_hr.desktop.yaml │ ├── mount_hr.ts │ ├── mount_hu.desktop.yaml │ ├── mount_hu.ts │ ├── mount_ia.ts │ ├── mount_id.ts │ ├── mount_it.desktop.yaml │ ├── mount_it.ts │ ├── mount_ja.desktop.yaml │ ├── mount_ja.ts │ ├── mount_ka.desktop.yaml │ ├── mount_ka.ts │ ├── mount_kab.desktop.yaml │ ├── mount_kab.ts │ ├── mount_kk.desktop.yaml │ ├── mount_kk.ts │ ├── mount_ko.desktop.yaml │ ├── mount_ko.ts │ ├── mount_lg.desktop.yaml │ ├── mount_lg.ts │ ├── mount_lt.desktop.yaml │ ├── mount_lt.ts │ ├── mount_lv.desktop.yaml │ ├── mount_lv.ts │ ├── mount_nb_NO.desktop.yaml │ ├── mount_nb_NO.ts │ ├── mount_nl.desktop.yaml │ ├── mount_nl.ts │ ├── mount_oc.desktop.yaml │ ├── mount_oc.ts │ ├── mount_pa.ts │ ├── mount_pl.desktop.yaml │ ├── mount_pl.ts │ ├── mount_pt.desktop.yaml │ ├── mount_pt.ts │ ├── mount_pt_BR.desktop.yaml │ ├── mount_pt_BR.ts │ ├── mount_ro.desktop.yaml │ ├── mount_ro_RO.ts │ ├── mount_ru.desktop.yaml │ ├── mount_ru.ts │ ├── mount_si.desktop.yaml │ ├── mount_si.ts │ ├── mount_sk.desktop.yaml │ ├── mount_sk_SK.ts │ ├── mount_sl.desktop.yaml │ ├── mount_sl.ts │ ├── mount_sr.desktop.yaml │ ├── mount_sr@ijekavian.desktop.yaml │ ├── mount_sr@ijekavianlatin.desktop.yaml │ ├── mount_sr@latin.desktop.yaml │ ├── mount_sr@latin.ts │ ├── mount_sr_BA.ts │ ├── mount_sr_RS.ts │ ├── mount_sv.desktop.yaml │ ├── mount_sv.ts │ ├── mount_th.desktop.yaml │ ├── mount_th_TH.ts │ ├── mount_tr.desktop.yaml │ ├── mount_tr.ts │ ├── mount_uk.desktop.yaml │ ├── mount_uk.ts │ ├── mount_zh_CN.desktop.yaml │ ├── mount_zh_CN.ts │ ├── mount_zh_TW.desktop.yaml │ └── mount_zh_TW.ts ├── plugin-networkmonitor/ │ ├── CMakeLists.txt │ ├── lxqtnetworkmonitor.cpp │ ├── lxqtnetworkmonitor.h │ ├── lxqtnetworkmonitorconfiguration.cpp │ ├── lxqtnetworkmonitorconfiguration.h │ ├── lxqtnetworkmonitorconfiguration.ui │ ├── lxqtnetworkmonitorplugin.cpp │ ├── lxqtnetworkmonitorplugin.h │ ├── resources/ │ │ └── networkmonitor.desktop.in │ ├── resources.qrc │ └── translations/ │ ├── networkmonitor.desktop.yaml │ ├── networkmonitor.ts │ ├── networkmonitor_ar.desktop.yaml │ ├── networkmonitor_ar.ts │ ├── networkmonitor_arn.ts │ ├── networkmonitor_ast.ts │ ├── networkmonitor_bg.desktop.yaml │ ├── networkmonitor_bg.ts │ ├── networkmonitor_ca.desktop.yaml │ ├── networkmonitor_ca.ts │ ├── networkmonitor_cs.desktop.yaml │ ├── networkmonitor_cs.ts │ ├── networkmonitor_cy.ts │ ├── networkmonitor_da.desktop.yaml │ ├── networkmonitor_da.ts │ ├── networkmonitor_de.desktop.yaml │ ├── networkmonitor_de.ts │ ├── networkmonitor_el.desktop.yaml │ ├── networkmonitor_el.ts │ ├── networkmonitor_en_GB.desktop.yaml │ ├── networkmonitor_en_GB.ts │ ├── networkmonitor_eo.desktop.yaml │ ├── networkmonitor_eo.ts │ ├── networkmonitor_es.desktop.yaml │ ├── networkmonitor_es.ts │ ├── networkmonitor_et.desktop.yaml │ ├── networkmonitor_et.ts │ ├── networkmonitor_eu.desktop.yaml │ ├── networkmonitor_eu.ts │ ├── networkmonitor_fi.desktop.yaml │ ├── networkmonitor_fi.ts │ ├── networkmonitor_fr.desktop.yaml │ ├── networkmonitor_fr.ts │ ├── networkmonitor_gl.ts │ ├── networkmonitor_he.desktop.yaml │ ├── networkmonitor_he.ts │ ├── networkmonitor_hi.ts │ ├── networkmonitor_hr.desktop.yaml │ ├── networkmonitor_hr.ts │ ├── networkmonitor_hu.desktop.yaml │ ├── networkmonitor_hu.ts │ ├── networkmonitor_id.ts │ ├── networkmonitor_is.ts │ ├── networkmonitor_it.desktop.yaml │ ├── networkmonitor_it.ts │ ├── networkmonitor_ja.desktop.yaml │ ├── networkmonitor_ja.ts │ ├── networkmonitor_ka.desktop.yaml │ ├── networkmonitor_ka.ts │ ├── networkmonitor_kab.desktop.yaml │ ├── networkmonitor_kab.ts │ ├── networkmonitor_kk.desktop.yaml │ ├── networkmonitor_kk.ts │ ├── networkmonitor_ko.desktop.yaml │ ├── networkmonitor_ko.ts │ ├── networkmonitor_lg.desktop.yaml │ ├── networkmonitor_lg.ts │ ├── networkmonitor_lt.desktop.yaml │ ├── networkmonitor_lt.ts │ ├── networkmonitor_lv.desktop.yaml │ ├── networkmonitor_lv.ts │ ├── networkmonitor_nb_NO.desktop.yaml │ ├── networkmonitor_nb_NO.ts │ ├── networkmonitor_nl.desktop.yaml │ ├── networkmonitor_nl.ts │ ├── networkmonitor_oc.desktop.yaml │ ├── networkmonitor_oc.ts │ ├── networkmonitor_pa.desktop.yaml │ ├── networkmonitor_pa.ts │ ├── networkmonitor_pl.desktop.yaml │ ├── networkmonitor_pl.ts │ ├── networkmonitor_pt.desktop.yaml │ ├── networkmonitor_pt.ts │ ├── networkmonitor_pt_BR.desktop.yaml │ ├── networkmonitor_pt_BR.ts │ ├── networkmonitor_ro_RO.desktop.yaml │ ├── networkmonitor_ro_RO.ts │ ├── networkmonitor_ru.desktop.yaml │ ├── networkmonitor_ru.ts │ ├── networkmonitor_si.desktop.yaml │ ├── networkmonitor_si.ts │ ├── networkmonitor_sk.desktop.yaml │ ├── networkmonitor_sk_SK.ts │ ├── networkmonitor_sr.desktop.yaml │ ├── networkmonitor_sr.ts │ ├── networkmonitor_sr@ijekavian.ts │ ├── networkmonitor_sr@latin.desktop.yaml │ ├── networkmonitor_sv.desktop.yaml │ ├── networkmonitor_sv.ts │ ├── networkmonitor_th.desktop.yaml │ ├── networkmonitor_th_TH.ts │ ├── networkmonitor_tr.desktop.yaml │ ├── networkmonitor_tr.ts │ ├── networkmonitor_uk.desktop.yaml │ ├── networkmonitor_uk.ts │ ├── networkmonitor_zh_CN.desktop.yaml │ ├── networkmonitor_zh_CN.ts │ ├── networkmonitor_zh_TW.desktop.yaml │ └── networkmonitor_zh_TW.ts ├── plugin-qeyes/ │ ├── CMakeLists.txt │ ├── qeyes.cpp │ ├── qeyes.h │ ├── qeyesconfigdialog.cpp │ ├── qeyesconfigdialog.h │ ├── qeyesimagewidget.cpp │ ├── qeyesimagewidget.h │ ├── qeyesplugin.desktop │ ├── qeyesvectorwidget.cpp │ ├── qeyesvectorwidget.h │ ├── qeyeswidget.cpp │ ├── qeyeswidget.h │ ├── resources/ │ │ └── qeyes.desktop.in │ ├── translations/ │ │ ├── qeyes.desktop.yaml │ │ ├── qeyes.ts │ │ ├── qeyes_ar.desktop.yaml │ │ ├── qeyes_ar.ts │ │ ├── qeyes_bg.desktop.yaml │ │ ├── qeyes_bg.ts │ │ ├── qeyes_ca.desktop.yaml │ │ ├── qeyes_ca.ts │ │ ├── qeyes_cs.desktop.yaml │ │ ├── qeyes_cs.ts │ │ ├── qeyes_da.desktop.yaml │ │ ├── qeyes_da.ts │ │ ├── qeyes_de.desktop.yaml │ │ ├── qeyes_de.ts │ │ ├── qeyes_el.desktop.yaml │ │ ├── qeyes_el.ts │ │ ├── qeyes_en_GB.desktop.yaml │ │ ├── qeyes_en_GB.ts │ │ ├── qeyes_et.desktop.yaml │ │ ├── qeyes_et.ts │ │ ├── qeyes_fi.desktop.yaml │ │ ├── qeyes_fi.ts │ │ ├── qeyes_fr.desktop.yaml │ │ ├── qeyes_fr.ts │ │ ├── qeyes_he.desktop.yaml │ │ ├── qeyes_he.ts │ │ ├── qeyes_hu.desktop.yaml │ │ ├── qeyes_hu.ts │ │ ├── qeyes_it.desktop.yaml │ │ ├── qeyes_it.ts │ │ ├── qeyes_ja.desktop.yaml │ │ ├── qeyes_ka.desktop.yaml │ │ ├── qeyes_ka.ts │ │ ├── qeyes_kab.desktop.yaml │ │ ├── qeyes_kab.ts │ │ ├── qeyes_kk.desktop.yaml │ │ ├── qeyes_kk.ts │ │ ├── qeyes_ko.desktop.yaml │ │ ├── qeyes_ko.ts │ │ ├── qeyes_lg.desktop.yaml │ │ ├── qeyes_lg.ts │ │ ├── qeyes_lt.desktop.yaml │ │ ├── qeyes_lt.ts │ │ ├── qeyes_nl.desktop.yaml │ │ ├── qeyes_nl.ts │ │ ├── qeyes_oc.desktop.yaml │ │ ├── qeyes_oc.ts │ │ ├── qeyes_pa.ts │ │ ├── qeyes_pl.desktop.yaml │ │ ├── qeyes_pl.ts │ │ ├── qeyes_pt.desktop.yaml │ │ ├── qeyes_pt.ts │ │ ├── qeyes_ru.desktop.yaml │ │ ├── qeyes_ru.ts │ │ ├── qeyes_sk.desktop.yaml │ │ ├── qeyes_sk.ts │ │ ├── qeyes_sr.desktop.yaml │ │ ├── qeyes_sr.ts │ │ ├── qeyes_sv.desktop.yaml │ │ ├── qeyes_sv.ts │ │ ├── qeyes_tr.desktop.yaml │ │ ├── qeyes_tr.ts │ │ ├── qeyes_zh_CN.desktop.yaml │ │ ├── qeyes_zh_CN.ts │ │ ├── qeyes_zh_TW.desktop.yaml │ │ └── qeyes_zh_TW.ts │ └── types/ │ ├── Bizarre/ │ │ └── config │ ├── Bloodshot/ │ │ └── config │ ├── Brown-EyedGirl/ │ │ └── config │ ├── CMakeLists.txt │ ├── Crystal/ │ │ └── config │ ├── Default/ │ │ └── config │ ├── Default-tiny/ │ │ └── config │ ├── Digital/ │ │ └── config │ ├── EyelashLarge/ │ │ └── config │ ├── Green-EyedGirl/ │ │ └── config │ ├── Horrid/ │ │ └── config │ ├── Pink-EyedGirl/ │ │ └── config │ ├── PumpkinMonster/ │ │ └── config │ ├── README │ └── Tango/ │ └── config ├── plugin-quicklaunch/ │ ├── CMakeLists.txt │ ├── lxqtquicklaunch.cpp │ ├── lxqtquicklaunch.h │ ├── lxqtquicklaunchplugin.cpp │ ├── lxqtquicklaunchplugin.h │ ├── quicklaunchaction.cpp │ ├── quicklaunchaction.h │ ├── quicklaunchbutton.cpp │ ├── quicklaunchbutton.h │ ├── resources/ │ │ └── quicklaunch.desktop.in │ └── translations/ │ ├── quicklaunch.desktop.yaml │ ├── quicklaunch.ts │ ├── quicklaunch_ar.desktop.yaml │ ├── quicklaunch_ar.ts │ ├── quicklaunch_arn.ts │ ├── quicklaunch_ast.ts │ ├── quicklaunch_bg.desktop.yaml │ ├── quicklaunch_bg.ts │ ├── quicklaunch_ca.desktop.yaml │ ├── quicklaunch_ca.ts │ ├── quicklaunch_cs.desktop.yaml │ ├── quicklaunch_cs.ts │ ├── quicklaunch_cy.ts │ ├── quicklaunch_da.desktop.yaml │ ├── quicklaunch_da.ts │ ├── quicklaunch_de.desktop.yaml │ ├── quicklaunch_de.ts │ ├── quicklaunch_el.desktop.yaml │ ├── quicklaunch_el.ts │ ├── quicklaunch_en_GB.desktop.yaml │ ├── quicklaunch_en_GB.ts │ ├── quicklaunch_eo.desktop.yaml │ ├── quicklaunch_eo.ts │ ├── quicklaunch_es.desktop.yaml │ ├── quicklaunch_es.ts │ ├── quicklaunch_es_VE.desktop.yaml │ ├── quicklaunch_es_VE.ts │ ├── quicklaunch_et.desktop.yaml │ ├── quicklaunch_et.ts │ ├── quicklaunch_eu.desktop.yaml │ ├── quicklaunch_eu.ts │ ├── quicklaunch_fi.desktop.yaml │ ├── quicklaunch_fi.ts │ ├── quicklaunch_fr.desktop.yaml │ ├── quicklaunch_fr.ts │ ├── quicklaunch_gl.ts │ ├── quicklaunch_he.desktop.yaml │ ├── quicklaunch_he.ts │ ├── quicklaunch_hr.desktop.yaml │ ├── quicklaunch_hr.ts │ ├── quicklaunch_hu.desktop.yaml │ ├── quicklaunch_hu.ts │ ├── quicklaunch_ia.ts │ ├── quicklaunch_id.desktop.yaml │ ├── quicklaunch_id.ts │ ├── quicklaunch_it.desktop.yaml │ ├── quicklaunch_it.ts │ ├── quicklaunch_ja.desktop.yaml │ ├── quicklaunch_ja.ts │ ├── quicklaunch_ka.desktop.yaml │ ├── quicklaunch_ka.ts │ ├── quicklaunch_kab.ts │ ├── quicklaunch_kk.ts │ ├── quicklaunch_ko.desktop.yaml │ ├── quicklaunch_ko.ts │ ├── quicklaunch_lg.desktop.yaml │ ├── quicklaunch_lg.ts │ ├── quicklaunch_lt.desktop.yaml │ ├── quicklaunch_lt.ts │ ├── quicklaunch_lv.desktop.yaml │ ├── quicklaunch_lv.ts │ ├── quicklaunch_nb_NO.desktop.yaml │ ├── quicklaunch_nb_NO.ts │ ├── quicklaunch_nl.desktop.yaml │ ├── quicklaunch_nl.ts │ ├── quicklaunch_oc.ts │ ├── quicklaunch_pa.ts │ ├── quicklaunch_pl.desktop.yaml │ ├── quicklaunch_pl.ts │ ├── quicklaunch_pt.desktop.yaml │ ├── quicklaunch_pt.ts │ ├── quicklaunch_pt_BR.desktop.yaml │ ├── quicklaunch_pt_BR.ts │ ├── quicklaunch_ro.desktop.yaml │ ├── quicklaunch_ro_RO.ts │ ├── quicklaunch_ru.desktop.yaml │ ├── quicklaunch_ru.ts │ ├── quicklaunch_si.desktop.yaml │ ├── quicklaunch_si.ts │ ├── quicklaunch_sk.desktop.yaml │ ├── quicklaunch_sk_SK.ts │ ├── quicklaunch_sl.desktop.yaml │ ├── quicklaunch_sl.ts │ ├── quicklaunch_sr.desktop.yaml │ ├── quicklaunch_sr@ijekavian.desktop.yaml │ ├── quicklaunch_sr@ijekavianlatin.desktop.yaml │ ├── quicklaunch_sr@latin.desktop.yaml │ ├── quicklaunch_sr@latin.ts │ ├── quicklaunch_sr_BA.ts │ ├── quicklaunch_sr_RS.ts │ ├── quicklaunch_sv.desktop.yaml │ ├── quicklaunch_sv.ts │ ├── quicklaunch_th.desktop.yaml │ ├── quicklaunch_th_TH.ts │ ├── quicklaunch_tr.desktop.yaml │ ├── quicklaunch_tr.ts │ ├── quicklaunch_uk.desktop.yaml │ ├── quicklaunch_uk.ts │ ├── quicklaunch_zh_CN.desktop.yaml │ ├── quicklaunch_zh_CN.ts │ ├── quicklaunch_zh_TW.desktop.yaml │ └── quicklaunch_zh_TW.ts ├── plugin-sensors/ │ ├── CMakeLists.txt │ ├── chip.cpp │ ├── chip.h │ ├── feature.cpp │ ├── feature.h │ ├── lxqtsensors.cpp │ ├── lxqtsensors.h │ ├── lxqtsensorsconfiguration.cpp │ ├── lxqtsensorsconfiguration.h │ ├── lxqtsensorsconfiguration.ui │ ├── lxqtsensorsplugin.cpp │ ├── lxqtsensorsplugin.h │ ├── resources/ │ │ └── sensors.desktop.in │ ├── sensors.cpp │ ├── sensors.h │ └── translations/ │ ├── sensors.desktop.yaml │ ├── sensors.ts │ ├── sensors_ar.desktop.yaml │ ├── sensors_ar.ts │ ├── sensors_arn.ts │ ├── sensors_ast.ts │ ├── sensors_bg.desktop.yaml │ ├── sensors_bg.ts │ ├── sensors_ca.desktop.yaml │ ├── sensors_ca.ts │ ├── sensors_cs.desktop.yaml │ ├── sensors_cs.ts │ ├── sensors_cy.ts │ ├── sensors_da.desktop.yaml │ ├── sensors_da.ts │ ├── sensors_de.desktop.yaml │ ├── sensors_de.ts │ ├── sensors_el.desktop.yaml │ ├── sensors_el.ts │ ├── sensors_en_GB.desktop.yaml │ ├── sensors_en_GB.ts │ ├── sensors_eo.desktop.yaml │ ├── sensors_es.desktop.yaml │ ├── sensors_es.ts │ ├── sensors_es_VE.desktop.yaml │ ├── sensors_es_VE.ts │ ├── sensors_et.desktop.yaml │ ├── sensors_et.ts │ ├── sensors_eu.desktop.yaml │ ├── sensors_eu.ts │ ├── sensors_fi.desktop.yaml │ ├── sensors_fi.ts │ ├── sensors_fr.desktop.yaml │ ├── sensors_fr.ts │ ├── sensors_gl.ts │ ├── sensors_he.desktop.yaml │ ├── sensors_he.ts │ ├── sensors_hr.desktop.yaml │ ├── sensors_hr.ts │ ├── sensors_hu.desktop.yaml │ ├── sensors_hu.ts │ ├── sensors_id.ts │ ├── sensors_is.ts │ ├── sensors_it.desktop.yaml │ ├── sensors_it.ts │ ├── sensors_ja.desktop.yaml │ ├── sensors_ja.ts │ ├── sensors_ka.desktop.yaml │ ├── sensors_ka.ts │ ├── sensors_kab.ts │ ├── sensors_kk.desktop.yaml │ ├── sensors_kk.ts │ ├── sensors_ko.desktop.yaml │ ├── sensors_ko.ts │ ├── sensors_lg.desktop.yaml │ ├── sensors_lg.ts │ ├── sensors_lt.desktop.yaml │ ├── sensors_lt.ts │ ├── sensors_lv.desktop.yaml │ ├── sensors_lv.ts │ ├── sensors_nb_NO.desktop.yaml │ ├── sensors_nb_NO.ts │ ├── sensors_nl.desktop.yaml │ ├── sensors_nl.ts │ ├── sensors_oc.ts │ ├── sensors_pa.ts │ ├── sensors_pl.desktop.yaml │ ├── sensors_pl.ts │ ├── sensors_pt.desktop.yaml │ ├── sensors_pt.ts │ ├── sensors_pt_BR.desktop.yaml │ ├── sensors_pt_BR.ts │ ├── sensors_ro.desktop.yaml │ ├── sensors_ro_RO.ts │ ├── sensors_ru.desktop.yaml │ ├── sensors_ru.ts │ ├── sensors_si.desktop.yaml │ ├── sensors_si.ts │ ├── sensors_sk.desktop.yaml │ ├── sensors_sk_SK.ts │ ├── sensors_sl.desktop.yaml │ ├── sensors_sr.ts │ ├── sensors_sv.desktop.yaml │ ├── sensors_sv.ts │ ├── sensors_th.desktop.yaml │ ├── sensors_th_TH.ts │ ├── sensors_tr.desktop.yaml │ ├── sensors_tr.ts │ ├── sensors_uk.desktop.yaml │ ├── sensors_uk.ts │ ├── sensors_zh_CN.desktop.yaml │ ├── sensors_zh_CN.ts │ ├── sensors_zh_TW.desktop.yaml │ └── sensors_zh_TW.ts ├── plugin-showdesktop/ │ ├── CMakeLists.txt │ ├── resources/ │ │ └── showdesktop.desktop.in │ ├── showdesktop.cpp │ ├── showdesktop.h │ └── translations/ │ ├── showdesktop.desktop.yaml │ ├── showdesktop.ts │ ├── showdesktop_ar.desktop.yaml │ ├── showdesktop_ar.ts │ ├── showdesktop_arn.ts │ ├── showdesktop_ast.ts │ ├── showdesktop_bg.desktop.yaml │ ├── showdesktop_bg.ts │ ├── showdesktop_ca.desktop.yaml │ ├── showdesktop_ca.ts │ ├── showdesktop_cs.desktop.yaml │ ├── showdesktop_cs.ts │ ├── showdesktop_cy.ts │ ├── showdesktop_da.desktop.yaml │ ├── showdesktop_da.ts │ ├── showdesktop_de.desktop.yaml │ ├── showdesktop_de.ts │ ├── showdesktop_el.desktop.yaml │ ├── showdesktop_el.ts │ ├── showdesktop_en_GB.desktop.yaml │ ├── showdesktop_en_GB.ts │ ├── showdesktop_eo.desktop.yaml │ ├── showdesktop_eo.ts │ ├── showdesktop_es.desktop.yaml │ ├── showdesktop_es.ts │ ├── showdesktop_es_VE.desktop.yaml │ ├── showdesktop_es_VE.ts │ ├── showdesktop_et.desktop.yaml │ ├── showdesktop_et.ts │ ├── showdesktop_eu.desktop.yaml │ ├── showdesktop_eu.ts │ ├── showdesktop_fi.desktop.yaml │ ├── showdesktop_fi.ts │ ├── showdesktop_fr.desktop.yaml │ ├── showdesktop_fr.ts │ ├── showdesktop_gl.ts │ ├── showdesktop_he.desktop.yaml │ ├── showdesktop_he.ts │ ├── showdesktop_hr.desktop.yaml │ ├── showdesktop_hr.ts │ ├── showdesktop_hu.desktop.yaml │ ├── showdesktop_hu.ts │ ├── showdesktop_ia.ts │ ├── showdesktop_id.ts │ ├── showdesktop_id_ID.desktop.yaml │ ├── showdesktop_is.ts │ ├── showdesktop_it.desktop.yaml │ ├── showdesktop_it.ts │ ├── showdesktop_ja.desktop.yaml │ ├── showdesktop_ja.ts │ ├── showdesktop_ka.desktop.yaml │ ├── showdesktop_ka.ts │ ├── showdesktop_kab.ts │ ├── showdesktop_kk.desktop.yaml │ ├── showdesktop_kk.ts │ ├── showdesktop_ko.desktop.yaml │ ├── showdesktop_ko.ts │ ├── showdesktop_lg.desktop.yaml │ ├── showdesktop_lg.ts │ ├── showdesktop_lt.desktop.yaml │ ├── showdesktop_lt.ts │ ├── showdesktop_lv.desktop.yaml │ ├── showdesktop_lv.ts │ ├── showdesktop_nb_NO.desktop.yaml │ ├── showdesktop_nb_NO.ts │ ├── showdesktop_nl.desktop.yaml │ ├── showdesktop_nl.ts │ ├── showdesktop_oc.desktop.yaml │ ├── showdesktop_oc.ts │ ├── showdesktop_pa.desktop.yaml │ ├── showdesktop_pa.ts │ ├── showdesktop_pl.desktop.yaml │ ├── showdesktop_pl.ts │ ├── showdesktop_pt.desktop.yaml │ ├── showdesktop_pt.ts │ ├── showdesktop_pt_BR.desktop.yaml │ ├── showdesktop_pt_BR.ts │ ├── showdesktop_ro_RO.desktop.yaml │ ├── showdesktop_ro_RO.ts │ ├── showdesktop_ru.desktop.yaml │ ├── showdesktop_ru.ts │ ├── showdesktop_si.desktop.yaml │ ├── showdesktop_si.ts │ ├── showdesktop_sk.desktop.yaml │ ├── showdesktop_sk_SK.ts │ ├── showdesktop_sl.desktop.yaml │ ├── showdesktop_sl.ts │ ├── showdesktop_sr.desktop.yaml │ ├── showdesktop_sr@ijekavian.desktop.yaml │ ├── showdesktop_sr@ijekavianlatin.desktop.yaml │ ├── showdesktop_sr@latin.desktop.yaml │ ├── showdesktop_sr@latin.ts │ ├── showdesktop_sr_BA.ts │ ├── showdesktop_sr_RS.ts │ ├── showdesktop_sv.desktop.yaml │ ├── showdesktop_sv.ts │ ├── showdesktop_th.desktop.yaml │ ├── showdesktop_th_TH.ts │ ├── showdesktop_tr.desktop.yaml │ ├── showdesktop_tr.ts │ ├── showdesktop_uk.desktop.yaml │ ├── showdesktop_uk.ts │ ├── showdesktop_zh_CN.desktop.yaml │ ├── showdesktop_zh_CN.ts │ ├── showdesktop_zh_TW.desktop.yaml │ └── showdesktop_zh_TW.ts ├── plugin-spacer/ │ ├── CMakeLists.txt │ ├── resources/ │ │ └── spacer.desktop.in │ ├── spacer.cpp │ ├── spacer.h │ ├── spacerconfiguration.cpp │ ├── spacerconfiguration.h │ ├── spacerconfiguration.ui │ └── translations/ │ ├── spacer.desktop.yaml │ ├── spacer.ts │ ├── spacer_ar.desktop.yaml │ ├── spacer_ar.ts │ ├── spacer_arn.ts │ ├── spacer_ast.ts │ ├── spacer_bg.desktop.yaml │ ├── spacer_bg.ts │ ├── spacer_ca.desktop.yaml │ ├── spacer_ca.ts │ ├── spacer_cs.desktop.yaml │ ├── spacer_cs.ts │ ├── spacer_cy.ts │ ├── spacer_da.desktop.yaml │ ├── spacer_da.ts │ ├── spacer_de.desktop.yaml │ ├── spacer_de.ts │ ├── spacer_el.desktop.yaml │ ├── spacer_el.ts │ ├── spacer_en_GB.desktop.yaml │ ├── spacer_en_GB.ts │ ├── spacer_es.desktop.yaml │ ├── spacer_es.ts │ ├── spacer_et.desktop.yaml │ ├── spacer_et.ts │ ├── spacer_fi.desktop.yaml │ ├── spacer_fi.ts │ ├── spacer_fr.desktop.yaml │ ├── spacer_fr.ts │ ├── spacer_gl.ts │ ├── spacer_he.desktop.yaml │ ├── spacer_he.ts │ ├── spacer_hr.desktop.yaml │ ├── spacer_hr.ts │ ├── spacer_hu.desktop.yaml │ ├── spacer_hu.ts │ ├── spacer_id.ts │ ├── spacer_it.desktop.yaml │ ├── spacer_it.ts │ ├── spacer_ja.desktop.yaml │ ├── spacer_ja.ts │ ├── spacer_ka.desktop.yaml │ ├── spacer_ka.ts │ ├── spacer_kab.ts │ ├── spacer_kk.ts │ ├── spacer_ko.desktop.yaml │ ├── spacer_ko.ts │ ├── spacer_lg.desktop.yaml │ ├── spacer_lg.ts │ ├── spacer_lt.desktop.yaml │ ├── spacer_lt.ts │ ├── spacer_lv.desktop.yaml │ ├── spacer_lv.ts │ ├── spacer_nb_NO.desktop.yaml │ ├── spacer_nb_NO.ts │ ├── spacer_nl.desktop.yaml │ ├── spacer_nl.ts │ ├── spacer_oc.ts │ ├── spacer_pa.ts │ ├── spacer_pl.desktop.yaml │ ├── spacer_pl.ts │ ├── spacer_pt.desktop.yaml │ ├── spacer_pt.ts │ ├── spacer_pt_BR.desktop.yaml │ ├── spacer_pt_BR.ts │ ├── spacer_ru.desktop.yaml │ ├── spacer_ru.ts │ ├── spacer_si.desktop.yaml │ ├── spacer_si.ts │ ├── spacer_sk.desktop.yaml │ ├── spacer_sk.ts │ ├── spacer_sr.ts │ ├── spacer_sv.desktop.yaml │ ├── spacer_sv.ts │ ├── spacer_tr.desktop.yaml │ ├── spacer_tr.ts │ ├── spacer_uk.desktop.yaml │ ├── spacer_uk.ts │ ├── spacer_zh_CN.desktop.yaml │ ├── spacer_zh_CN.ts │ ├── spacer_zh_TW.desktop.yaml │ └── spacer_zh_TW.ts ├── plugin-statusnotifier/ │ ├── CMakeLists.txt │ ├── dbustypes.cpp │ ├── dbustypes.h │ ├── org.kde.StatusNotifierItem.xml │ ├── resources/ │ │ └── statusnotifier.desktop.in │ ├── sniasync.cpp │ ├── sniasync.h │ ├── statusnotifier.cpp │ ├── statusnotifier.h │ ├── statusnotifierbutton.cpp │ ├── statusnotifierbutton.h │ ├── statusnotifierconfiguration.cpp │ ├── statusnotifierconfiguration.h │ ├── statusnotifierconfiguration.ui │ ├── statusnotifieriteminterface.cpp │ ├── statusnotifieriteminterface.h │ ├── statusnotifierproxy.cpp │ ├── statusnotifierproxy.h │ ├── statusnotifierwatcher.cpp │ ├── statusnotifierwatcher.h │ ├── statusnotifierwidget.cpp │ ├── statusnotifierwidget.h │ └── translations/ │ ├── statusnotifier.desktop.yaml │ ├── statusnotifier.ts │ ├── statusnotifier_ar.desktop.yaml │ ├── statusnotifier_ar.ts │ ├── statusnotifier_arn.ts │ ├── statusnotifier_ast.ts │ ├── statusnotifier_bg.desktop.yaml │ ├── statusnotifier_bg.ts │ ├── statusnotifier_ca.desktop.yaml │ ├── statusnotifier_ca.ts │ ├── statusnotifier_cs.desktop.yaml │ ├── statusnotifier_cs.ts │ ├── statusnotifier_cy.ts │ ├── statusnotifier_da.desktop.yaml │ ├── statusnotifier_da.ts │ ├── statusnotifier_de.desktop.yaml │ ├── statusnotifier_de.ts │ ├── statusnotifier_el.desktop.yaml │ ├── statusnotifier_el.ts │ ├── statusnotifier_en_GB.desktop.yaml │ ├── statusnotifier_en_GB.ts │ ├── statusnotifier_es.desktop.yaml │ ├── statusnotifier_et.desktop.yaml │ ├── statusnotifier_et.ts │ ├── statusnotifier_fi.desktop.yaml │ ├── statusnotifier_fi.ts │ ├── statusnotifier_fr.desktop.yaml │ ├── statusnotifier_fr.ts │ ├── statusnotifier_gl.ts │ ├── statusnotifier_he.desktop.yaml │ ├── statusnotifier_he.ts │ ├── statusnotifier_hr.desktop.yaml │ ├── statusnotifier_hr.ts │ ├── statusnotifier_hu.desktop.yaml │ ├── statusnotifier_hu.ts │ ├── statusnotifier_it.desktop.yaml │ ├── statusnotifier_it.ts │ ├── statusnotifier_ja.desktop.yaml │ ├── statusnotifier_ja.ts │ ├── statusnotifier_ka.desktop.yaml │ ├── statusnotifier_ka.ts │ ├── statusnotifier_kk.desktop.yaml │ ├── statusnotifier_kk.ts │ ├── statusnotifier_ko.desktop.yaml │ ├── statusnotifier_ko.ts │ ├── statusnotifier_lg.desktop.yaml │ ├── statusnotifier_lg.ts │ ├── statusnotifier_lt.desktop.yaml │ ├── statusnotifier_lt.ts │ ├── statusnotifier_lv.desktop.yaml │ ├── statusnotifier_lv.ts │ ├── statusnotifier_nb_NO.desktop.yaml │ ├── statusnotifier_nb_NO.ts │ ├── statusnotifier_nl.desktop.yaml │ ├── statusnotifier_nl.ts │ ├── statusnotifier_oc.desktop.yaml │ ├── statusnotifier_oc.ts │ ├── statusnotifier_pa.desktop.yaml │ ├── statusnotifier_pa.ts │ ├── statusnotifier_pl.desktop.yaml │ ├── statusnotifier_pl.ts │ ├── statusnotifier_pt.desktop.yaml │ ├── statusnotifier_pt.ts │ ├── statusnotifier_pt_BR.desktop.yaml │ ├── statusnotifier_pt_BR.ts │ ├── statusnotifier_ru.desktop.yaml │ ├── statusnotifier_ru.ts │ ├── statusnotifier_si.desktop.yaml │ ├── statusnotifier_si.ts │ ├── statusnotifier_sk.desktop.yaml │ ├── statusnotifier_sk_SK.ts │ ├── statusnotifier_sv.desktop.yaml │ ├── statusnotifier_sv.ts │ ├── statusnotifier_tr.desktop.yaml │ ├── statusnotifier_tr.ts │ ├── statusnotifier_uk.desktop.yaml │ ├── statusnotifier_uk.ts │ ├── statusnotifier_zh_CN.desktop.yaml │ ├── statusnotifier_zh_CN.ts │ ├── statusnotifier_zh_TW.desktop.yaml │ └── statusnotifier_zh_TW.ts ├── plugin-sysstat/ │ ├── CMakeLists.txt │ ├── lxqtsysstat.cpp │ ├── lxqtsysstat.h │ ├── lxqtsysstatcolours.cpp │ ├── lxqtsysstatcolours.h │ ├── lxqtsysstatcolours.ui │ ├── lxqtsysstatconfiguration.cpp │ ├── lxqtsysstatconfiguration.h │ ├── lxqtsysstatconfiguration.ui │ ├── lxqtsysstatutils.cpp │ ├── lxqtsysstatutils.h │ ├── resources/ │ │ └── sysstat.desktop.in │ └── translations/ │ ├── sysstat.desktop.yaml │ ├── sysstat.ts │ ├── sysstat_ar.desktop.yaml │ ├── sysstat_ar.ts │ ├── sysstat_arn.ts │ ├── sysstat_ast.ts │ ├── sysstat_bg.desktop.yaml │ ├── sysstat_bg.ts │ ├── sysstat_ca.desktop.yaml │ ├── sysstat_ca.ts │ ├── sysstat_cs.desktop.yaml │ ├── sysstat_cs.ts │ ├── sysstat_cy.ts │ ├── sysstat_da.desktop.yaml │ ├── sysstat_da.ts │ ├── sysstat_de.desktop.yaml │ ├── sysstat_de.ts │ ├── sysstat_el.desktop.yaml │ ├── sysstat_el.ts │ ├── sysstat_en_GB.desktop.yaml │ ├── sysstat_en_GB.ts │ ├── sysstat_es.desktop.yaml │ ├── sysstat_es.ts │ ├── sysstat_et.desktop.yaml │ ├── sysstat_et.ts │ ├── sysstat_fi.desktop.yaml │ ├── sysstat_fi.ts │ ├── sysstat_fr.desktop.yaml │ ├── sysstat_fr.ts │ ├── sysstat_gl.ts │ ├── sysstat_he.desktop.yaml │ ├── sysstat_he.ts │ ├── sysstat_hr.desktop.yaml │ ├── sysstat_hr.ts │ ├── sysstat_hu.desktop.yaml │ ├── sysstat_hu.ts │ ├── sysstat_id.ts │ ├── sysstat_it.desktop.yaml │ ├── sysstat_it.ts │ ├── sysstat_ja.desktop.yaml │ ├── sysstat_ja.ts │ ├── sysstat_ka.desktop.yaml │ ├── sysstat_ka.ts │ ├── sysstat_kab.ts │ ├── sysstat_kk.desktop.yaml │ ├── sysstat_kk.ts │ ├── sysstat_ko.desktop.yaml │ ├── sysstat_ko.ts │ ├── sysstat_lg.desktop.yaml │ ├── sysstat_lg.ts │ ├── sysstat_lt.desktop.yaml │ ├── sysstat_lt.ts │ ├── sysstat_lv.desktop.yaml │ ├── sysstat_lv.ts │ ├── sysstat_nb_NO.desktop.yaml │ ├── sysstat_nb_NO.ts │ ├── sysstat_nl.desktop.yaml │ ├── sysstat_nl.ts │ ├── sysstat_oc.ts │ ├── sysstat_pa.ts │ ├── sysstat_pl.desktop.yaml │ ├── sysstat_pl.ts │ ├── sysstat_pt.desktop.yaml │ ├── sysstat_pt.ts │ ├── sysstat_pt_BR.ts │ ├── sysstat_ru.desktop.yaml │ ├── sysstat_ru.ts │ ├── sysstat_si.desktop.yaml │ ├── sysstat_si.ts │ ├── sysstat_sk.desktop.yaml │ ├── sysstat_sk_SK.ts │ ├── sysstat_sv.desktop.yaml │ ├── sysstat_sv.ts │ ├── sysstat_tr.desktop.yaml │ ├── sysstat_tr.ts │ ├── sysstat_uk.desktop.yaml │ ├── sysstat_uk.ts │ ├── sysstat_zh_CN.desktop.yaml │ ├── sysstat_zh_CN.ts │ ├── sysstat_zh_TW.desktop.yaml │ └── sysstat_zh_TW.ts ├── plugin-taskbar/ │ ├── CMakeLists.txt │ ├── lxqtgrouppopup.cpp │ ├── lxqtgrouppopup.h │ ├── lxqttaskbar.cpp │ ├── lxqttaskbar.h │ ├── lxqttaskbarconfiguration.cpp │ ├── lxqttaskbarconfiguration.h │ ├── lxqttaskbarconfiguration.ui │ ├── lxqttaskbarplugin.cpp │ ├── lxqttaskbarplugin.h │ ├── lxqttaskbutton.cpp │ ├── lxqttaskbutton.h │ ├── lxqttaskgroup.cpp │ ├── lxqttaskgroup.h │ ├── resources/ │ │ └── taskbar.desktop.in │ └── translations/ │ ├── taskbar.desktop.yaml │ ├── taskbar.ts │ ├── taskbar_ar.desktop.yaml │ ├── taskbar_ar.ts │ ├── taskbar_arn.ts │ ├── taskbar_ast.ts │ ├── taskbar_bg.desktop.yaml │ ├── taskbar_bg.ts │ ├── taskbar_ca.desktop.yaml │ ├── taskbar_ca.ts │ ├── taskbar_cs.desktop.yaml │ ├── taskbar_cs.ts │ ├── taskbar_cy.ts │ ├── taskbar_da.desktop.yaml │ ├── taskbar_da.ts │ ├── taskbar_de.desktop.yaml │ ├── taskbar_de.ts │ ├── taskbar_el.desktop.yaml │ ├── taskbar_el.ts │ ├── taskbar_en_GB.desktop.yaml │ ├── taskbar_en_GB.ts │ ├── taskbar_eo.desktop.yaml │ ├── taskbar_eo.ts │ ├── taskbar_es.desktop.yaml │ ├── taskbar_es.ts │ ├── taskbar_es_VE.desktop.yaml │ ├── taskbar_es_VE.ts │ ├── taskbar_et.desktop.yaml │ ├── taskbar_et.ts │ ├── taskbar_eu.desktop.yaml │ ├── taskbar_eu.ts │ ├── taskbar_fi.desktop.yaml │ ├── taskbar_fi.ts │ ├── taskbar_fr.desktop.yaml │ ├── taskbar_fr.ts │ ├── taskbar_gl.ts │ ├── taskbar_he.desktop.yaml │ ├── taskbar_he.ts │ ├── taskbar_hr.desktop.yaml │ ├── taskbar_hr.ts │ ├── taskbar_hu.desktop.yaml │ ├── taskbar_hu.ts │ ├── taskbar_ia.ts │ ├── taskbar_id.ts │ ├── taskbar_it.desktop.yaml │ ├── taskbar_it.ts │ ├── taskbar_ja.desktop.yaml │ ├── taskbar_ja.ts │ ├── taskbar_ka.desktop.yaml │ ├── taskbar_ka.ts │ ├── taskbar_kab.ts │ ├── taskbar_kk.desktop.yaml │ ├── taskbar_kk.ts │ ├── taskbar_ko.desktop.yaml │ ├── taskbar_ko.ts │ ├── taskbar_lg.desktop.yaml │ ├── taskbar_lg.ts │ ├── taskbar_lt.desktop.yaml │ ├── taskbar_lt.ts │ ├── taskbar_lv.desktop.yaml │ ├── taskbar_lv.ts │ ├── taskbar_nb_NO.desktop.yaml │ ├── taskbar_nb_NO.ts │ ├── taskbar_nl.desktop.yaml │ ├── taskbar_nl.ts │ ├── taskbar_oc.desktop.yaml │ ├── taskbar_oc.ts │ ├── taskbar_pa.desktop.yaml │ ├── taskbar_pa.ts │ ├── taskbar_pl.desktop.yaml │ ├── taskbar_pl.ts │ ├── taskbar_pt.desktop.yaml │ ├── taskbar_pt.ts │ ├── taskbar_pt_BR.desktop.yaml │ ├── taskbar_pt_BR.ts │ ├── taskbar_ro.desktop.yaml │ ├── taskbar_ro_RO.ts │ ├── taskbar_ru.desktop.yaml │ ├── taskbar_ru.ts │ ├── taskbar_si.desktop.yaml │ ├── taskbar_si.ts │ ├── taskbar_sk.desktop.yaml │ ├── taskbar_sk_SK.ts │ ├── taskbar_sl.desktop.yaml │ ├── taskbar_sl.ts │ ├── taskbar_sr.desktop.yaml │ ├── taskbar_sr@ijekavian.desktop.yaml │ ├── taskbar_sr@ijekavianlatin.desktop.yaml │ ├── taskbar_sr@latin.desktop.yaml │ ├── taskbar_sr@latin.ts │ ├── taskbar_sr_BA.ts │ ├── taskbar_sr_RS.ts │ ├── taskbar_sv.desktop.yaml │ ├── taskbar_sv.ts │ ├── taskbar_th.desktop.yaml │ ├── taskbar_th_TH.ts │ ├── taskbar_tr.desktop.yaml │ ├── taskbar_tr.ts │ ├── taskbar_uk.desktop.yaml │ ├── taskbar_uk.ts │ ├── taskbar_zh_CN.desktop.yaml │ ├── taskbar_zh_CN.ts │ ├── taskbar_zh_TW.desktop.yaml │ └── taskbar_zh_TW.ts ├── plugin-tray/ │ ├── CMakeLists.txt │ ├── fdoselectionmanager.cpp │ ├── fdoselectionmanager.h │ ├── lxqttrayplugin.cpp │ ├── lxqttrayplugin.h │ ├── org.kde.StatusNotifierItem.xml │ ├── org.kde.StatusNotifierWatcher.xml │ ├── resources/ │ │ └── tray.desktop.in │ ├── snidbus.cpp │ ├── snidbus.h │ ├── sniproxy.cpp │ ├── sniproxy.h │ ├── translations/ │ │ ├── tray.desktop.yaml │ │ ├── tray_ar.desktop.yaml │ │ ├── tray_bg.desktop.yaml │ │ ├── tray_ca.desktop.yaml │ │ ├── tray_cs.desktop.yaml │ │ ├── tray_da.desktop.yaml │ │ ├── tray_de.desktop.yaml │ │ ├── tray_el.desktop.yaml │ │ ├── tray_en_GB.desktop.yaml │ │ ├── tray_eo.desktop.yaml │ │ ├── tray_es.desktop.yaml │ │ ├── tray_es_VE.desktop.yaml │ │ ├── tray_et.desktop.yaml │ │ ├── tray_eu.desktop.yaml │ │ ├── tray_fi.desktop.yaml │ │ ├── tray_fr.desktop.yaml │ │ ├── tray_he.desktop.yaml │ │ ├── tray_hr.desktop.yaml │ │ ├── tray_hu.desktop.yaml │ │ ├── tray_is.desktop.yaml │ │ ├── tray_it.desktop.yaml │ │ ├── tray_ja.desktop.yaml │ │ ├── tray_ka.desktop.yaml │ │ ├── tray_kab.desktop.yaml │ │ ├── tray_kk.desktop.yaml │ │ ├── tray_ko.desktop.yaml │ │ ├── tray_lg.desktop.yaml │ │ ├── tray_lt.desktop.yaml │ │ ├── tray_lv.desktop.yaml │ │ ├── tray_nb_NO.desktop.yaml │ │ ├── tray_nl.desktop.yaml │ │ ├── tray_oc.desktop.yaml │ │ ├── tray_pa.desktop.yaml │ │ ├── tray_pl.desktop.yaml │ │ ├── tray_pt.desktop.yaml │ │ ├── tray_pt_BR.desktop.yaml │ │ ├── tray_ro.desktop.yaml │ │ ├── tray_ru.desktop.yaml │ │ ├── tray_si.desktop.yaml │ │ ├── tray_sk.desktop.yaml │ │ ├── tray_sl.desktop.yaml │ │ ├── tray_sr.desktop.yaml │ │ ├── tray_sr@ijekavian.desktop.yaml │ │ ├── tray_sr@ijekavianlatin.desktop.yaml │ │ ├── tray_sr@latin.desktop.yaml │ │ ├── tray_sv.desktop.yaml │ │ ├── tray_th.desktop.yaml │ │ ├── tray_tr.desktop.yaml │ │ ├── tray_uk.desktop.yaml │ │ ├── tray_zh_CN.desktop.yaml │ │ └── tray_zh_TW.desktop.yaml │ ├── xcbutils.h │ ├── xtestsender.cpp │ └── xtestsender.h ├── plugin-volume/ │ ├── CMakeLists.txt │ ├── alsadevice.cpp │ ├── alsadevice.h │ ├── alsaengine.cpp │ ├── alsaengine.h │ ├── audiodevice.cpp │ ├── audiodevice.h │ ├── audioengine.cpp │ ├── audioengine.h │ ├── lxqtvolume.cpp │ ├── lxqtvolume.h │ ├── lxqtvolumeconfiguration.cpp │ ├── lxqtvolumeconfiguration.h │ ├── lxqtvolumeconfiguration.ui │ ├── ossengine.cpp │ ├── ossengine.h │ ├── pulseaudioengine.cpp │ ├── pulseaudioengine.h │ ├── resources/ │ │ └── volume.desktop.in │ ├── translations/ │ │ ├── volume.desktop.yaml │ │ ├── volume.ts │ │ ├── volume_ar.desktop.yaml │ │ ├── volume_ar.ts │ │ ├── volume_arn.ts │ │ ├── volume_ast.ts │ │ ├── volume_bg.desktop.yaml │ │ ├── volume_bg.ts │ │ ├── volume_ca.desktop.yaml │ │ ├── volume_ca.ts │ │ ├── volume_cs.desktop.yaml │ │ ├── volume_cs.ts │ │ ├── volume_cy.ts │ │ ├── volume_da.desktop.yaml │ │ ├── volume_da.ts │ │ ├── volume_de.desktop.yaml │ │ ├── volume_de.ts │ │ ├── volume_el.desktop.yaml │ │ ├── volume_el.ts │ │ ├── volume_en_GB.desktop.yaml │ │ ├── volume_en_GB.ts │ │ ├── volume_eo.ts │ │ ├── volume_es.desktop.yaml │ │ ├── volume_es.ts │ │ ├── volume_es_VE.desktop.yaml │ │ ├── volume_es_VE.ts │ │ ├── volume_et.desktop.yaml │ │ ├── volume_et.ts │ │ ├── volume_eu.desktop.yaml │ │ ├── volume_eu.ts │ │ ├── volume_fi.desktop.yaml │ │ ├── volume_fi.ts │ │ ├── volume_fr.desktop.yaml │ │ ├── volume_fr.ts │ │ ├── volume_gl.ts │ │ ├── volume_he.desktop.yaml │ │ ├── volume_he.ts │ │ ├── volume_hr.desktop.yaml │ │ ├── volume_hr.ts │ │ ├── volume_hu.desktop.yaml │ │ ├── volume_hu.ts │ │ ├── volume_id.ts │ │ ├── volume_it.desktop.yaml │ │ ├── volume_it.ts │ │ ├── volume_ja.desktop.yaml │ │ ├── volume_ja.ts │ │ ├── volume_ka.desktop.yaml │ │ ├── volume_ka.ts │ │ ├── volume_kab.ts │ │ ├── volume_kk.desktop.yaml │ │ ├── volume_kk.ts │ │ ├── volume_ko.desktop.yaml │ │ ├── volume_ko.ts │ │ ├── volume_lg.desktop.yaml │ │ ├── volume_lg.ts │ │ ├── volume_lt.desktop.yaml │ │ ├── volume_lt.ts │ │ ├── volume_lv.desktop.yaml │ │ ├── volume_lv.ts │ │ ├── volume_nb_NO.desktop.yaml │ │ ├── volume_nb_NO.ts │ │ ├── volume_nl.desktop.yaml │ │ ├── volume_nl.ts │ │ ├── volume_oc.desktop.yaml │ │ ├── volume_oc.ts │ │ ├── volume_pa.desktop.yaml │ │ ├── volume_pa.ts │ │ ├── volume_pl.desktop.yaml │ │ ├── volume_pl.ts │ │ ├── volume_pt.desktop.yaml │ │ ├── volume_pt.ts │ │ ├── volume_pt_BR.desktop.yaml │ │ ├── volume_pt_BR.ts │ │ ├── volume_ro_RO.desktop.yaml │ │ ├── volume_ro_RO.ts │ │ ├── volume_ru.desktop.yaml │ │ ├── volume_ru.ts │ │ ├── volume_si.desktop.yaml │ │ ├── volume_si.ts │ │ ├── volume_sk.desktop.yaml │ │ ├── volume_sk_SK.ts │ │ ├── volume_sl.ts │ │ ├── volume_sv.desktop.yaml │ │ ├── volume_sv.ts │ │ ├── volume_th.desktop.yaml │ │ ├── volume_th_TH.ts │ │ ├── volume_tr.desktop.yaml │ │ ├── volume_tr.ts │ │ ├── volume_uk.desktop.yaml │ │ ├── volume_uk.ts │ │ ├── volume_zh_CN.desktop.yaml │ │ ├── volume_zh_CN.ts │ │ ├── volume_zh_TW.desktop.yaml │ │ └── volume_zh_TW.ts │ ├── volumebutton.cpp │ ├── volumebutton.h │ ├── volumepopup.cpp │ └── volumepopup.h └── plugin-worldclock/ ├── CMakeLists.txt ├── lxqtworldclock.cpp ├── lxqtworldclock.h ├── lxqtworldclockconfiguration.cpp ├── lxqtworldclockconfiguration.h ├── lxqtworldclockconfiguration.ui ├── lxqtworldclockconfigurationmanualformat.cpp ├── lxqtworldclockconfigurationmanualformat.h ├── lxqtworldclockconfigurationmanualformat.ui ├── lxqtworldclockconfigurationtimezones.cpp ├── lxqtworldclockconfigurationtimezones.h ├── lxqtworldclockconfigurationtimezones.ui ├── resources/ │ └── worldclock.desktop.in └── translations/ ├── worldclock.desktop.yaml ├── worldclock.ts ├── worldclock_ar.desktop.yaml ├── worldclock_ar.ts ├── worldclock_arn.ts ├── worldclock_ast.ts ├── worldclock_bg.desktop.yaml ├── worldclock_bg.ts ├── worldclock_ca.desktop.yaml ├── worldclock_ca.ts ├── worldclock_cs.desktop.yaml ├── worldclock_cs.ts ├── worldclock_cy.ts ├── worldclock_da.desktop.yaml ├── worldclock_da.ts ├── worldclock_de.desktop.yaml ├── worldclock_de.ts ├── worldclock_el.desktop.yaml ├── worldclock_el.ts ├── worldclock_en_GB.desktop.yaml ├── worldclock_en_GB.ts ├── worldclock_es.desktop.yaml ├── worldclock_es.ts ├── worldclock_et.desktop.yaml ├── worldclock_et.ts ├── worldclock_fi.desktop.yaml ├── worldclock_fi.ts ├── worldclock_fr.desktop.yaml ├── worldclock_fr.ts ├── worldclock_gl.ts ├── worldclock_he.desktop.yaml ├── worldclock_he.ts ├── worldclock_hi.desktop.yaml ├── worldclock_hr.desktop.yaml ├── worldclock_hr.ts ├── worldclock_hu.desktop.yaml ├── worldclock_hu.ts ├── worldclock_id.ts ├── worldclock_it.desktop.yaml ├── worldclock_it.ts ├── worldclock_ja.desktop.yaml ├── worldclock_ja.ts ├── worldclock_ka.desktop.yaml ├── worldclock_ka.ts ├── worldclock_kab.ts ├── worldclock_kk.desktop.yaml ├── worldclock_kk.ts ├── worldclock_ko.desktop.yaml ├── worldclock_ko.ts ├── worldclock_lg.desktop.yaml ├── worldclock_lg.ts ├── worldclock_lt.desktop.yaml ├── worldclock_lt.ts ├── worldclock_lv.desktop.yaml ├── worldclock_lv.ts ├── worldclock_nb_NO.desktop.yaml ├── worldclock_nb_NO.ts ├── worldclock_nl.desktop.yaml ├── worldclock_nl.ts ├── worldclock_oc.ts ├── worldclock_pa.desktop.yaml ├── worldclock_pa.ts ├── worldclock_pl.desktop.yaml ├── worldclock_pl.ts ├── worldclock_pt.desktop.yaml ├── worldclock_pt.ts ├── worldclock_pt_BR.desktop.yaml ├── worldclock_pt_BR.ts ├── worldclock_ru.desktop.yaml ├── worldclock_ru.ts ├── worldclock_si.desktop.yaml ├── worldclock_si.ts ├── worldclock_sk.desktop.yaml ├── worldclock_sk_SK.ts ├── worldclock_sr.desktop.yaml ├── worldclock_sr.ts ├── worldclock_sv.desktop.yaml ├── worldclock_sv.ts ├── worldclock_tr.desktop.yaml ├── worldclock_tr.ts ├── worldclock_uk.desktop.yaml ├── worldclock_uk.ts ├── worldclock_zh_CN.desktop.yaml ├── worldclock_zh_CN.ts ├── worldclock_zh_TW.desktop.yaml └── worldclock_zh_TW.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .ci/build.sh ================================================ set -ex source shared-ci/prepare-archlinux.sh # See *depends in https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=lxqt-panel-git pacman -S --noconfirm --needed git cmake qt6-base qt6-tools lxqt-build-tools-git alsa-lib libpulse lm_sensors libstatgrab libsysstat-git solid lxqt-menu-data-git libdbusmenu-lxqt-git lxqt-globalkeys-git libxtst cmake -B build -S . make -C build ================================================ FILE: .gitattributes ================================================ # remove files from deployment using `git archive` # git files .gitattributes export-ignore .github export-ignore .gitignore export-ignore # several files and directories we never want to export # a little bit belt and braces as the most of these files # should never ever be in the repository .*~ export-ignore .kdev4 export-ignore .translation_update export-ignore /build export-ignore /temp export-ignore /tmp export-ignore ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help improve lxqt-panel title: '' labels: '' assignees: '' --- ##### Expected Behavior ##### Current Behavior ##### Possible Solution ##### Steps to Reproduce (for bugs) 1. 2. 3. 4. ##### Context ##### System Information * LXQt Version: * Distribution & Version: * Qt Version: * liblxqt Version: ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: LXQt Discussions url: https://github.com/lxqt/lxqt/discussions/ about: For general questions, problems and else. - name: Instant Messaging url: https://lxqt-project.org/ about: For Matrix, Telegram and IRC see channel list on lxqt-project.org ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for lxqt-panel title: "[Feature request]" labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** **Describe the solution you'd like** **Describe eventual alternatives you've considered** #### Context ================================================ FILE: .github/ISSUE_TEMPLATE.md ================================================ ##### Expected Behavior ##### Current Behavior ##### Possible Solution ##### Steps to Reproduce (for bugs) 1. 2. 3. 4. ##### Context ##### System Information * Distribution & Version: * Kernel: * Qt Version: * liblxqt Version: * lxqt-build-tools Version: * Package version: ================================================ FILE: .github/workflows/test.yml ================================================ name: Testing on: [push, pull_request] jobs: build: runs-on: ubuntu-20.04 container: archlinux:base-devel steps: - name: Checkout the repo uses: actions/checkout@v2 - name: Checkout shared CI repo uses: actions/checkout@v2 with: repository: lxqt/ci path: shared-ci - name: Build run: bash ./.ci/build.sh ================================================ FILE: .gitignore ================================================ build *.kdev4 CMakeLists.txt.user ================================================ FILE: .translation-update ================================================ translations=' ./panel ./plugin-colorpicker ./plugin-cpuload ./plugin-desktopswitch ./plugin-directorymenu ./plugin-dom ./plugin-kbindicator ./plugin-mainmenu ./plugin-mount ./plugin-networkmonitor ./plugin-quicklaunch ./plugin-sensors ./plugin-showdesktop ./plugin-spacer ./plugin-statusnotifier ./plugin-sysstat ./plugin-taskbar ./plugin-tray ./plugin-volume ./plugin-worldclock ' ================================================ FILE: AUTHORS ================================================ Upstream Authors: LXQt team: https://lxqt-project.org/ Razor team: http://razor-qt.org Copyright: Copyright (c) 2010-2012 Razor team Copyright (c) 2012-2017 LXQt team License: LGPL-2.1+ The full text of the licenses can be found in the 'COPYING' file. ================================================ FILE: CHANGELOG ================================================ lxqt-panel-2.4.0 / 2026-04-20 ============================== * Implemented multi sink volume plugin. * Added some more padding in LXQtWorldClockPopup. * Fixed weird behavior in panel length configuration when switching between px and %. lxqt-panel-2.3.3 / 2026-04-02 ============================== * Fixed too strict parsing of icon themes with Qt6.11. * Prioritize starting strings of titles with Fancy Menu's filtering. * Disabled shortcutselector in panel menus on Wayland and show tooltip info. * Version check for 6.10 for filterstring. * Removed obsolete Qt5 version check. * Fixed auto-hiding on dragging over Task Manager and Show Desktop. * KeyboardInteractivityNone also for labwc (0.9.4). * Added tooltip to opacity slider to communicate value. * Cleaned up some ui files. * Updated translations and code cleanup. lxqt-panel-2.3.2 / 2025-12-21 ============================== * Used `QPointer` for handling wlroots desktops to prevent dangling pointers, especially with bad compositor codes (previously, Hyprland could make the panel crash). lxqt-panel-2.3.1 / 2025-11-25 ============================== * Fixed build failure with Qt < 6.8. lxqt-panel-2.3.0 / 2025-11-05 ============================== * Added Wayfire backend. * Made Desktop Switcher work with Wayland compositors that support ext-workspaces-v1 protocol (like labwc, niri, …). * Activate Show Desktop plugin on drag-and-drop. * Made the initial config file available outside LXQt. * Updated the button of Custom Command every time it receives output. * Added support for structured output to Custom Command. * Added a 50-ms delay before making desktop switcher urgent. * Fixed building with Qt 6.10. * Fixed building with C++20. * Fix a discrepancy in the default action of mouse wheel in Task Manager plugin. * Accept base-names of menu files in Fancy Menu and Main Menu plugins. * Used `lxqt-panel-applications.menu` in Fancy Menu by default. * Added category separators of menu files to Fancy Menu. * Prevented changing backlight on showing the backlight slider. * Adjust backlight with mouse wheel on the button of backlight plugin. * Silenced some compilation warnings. * Cleaned up some ui files. * Removed unneeded QOverloads. * Used locale-aware sorting in Fancy Menu and Main Menu. * Follow better model/view architcture for PanelPluginsModel. * Properly handle plugin move by configview. * Workaround for a Qt regression that prevented plugin move indicators from being removed. lxqt-panel-2.2.2 / 2025-06-22 ============================== * Made searching for backend in EVs case-insensitive. * Added backend info to README. * Added a missing removal signal to kwin_wayland backend. * Disabled automatic showing of mount popup on Wayland. * Support showing of current screen windows in the wlroots taskbar. lxqt-panel-2.2.1 / 2025-05-17 ============================== * Made "Show Desktop" work under Wayland compositors compatible with wlroots. * Workaround for kwin_wayland's problems with showing desktop. * Minimize children of a window with it on kwin_wayland. * No attention demand for active parent-child pairs on kwin_wayland. * Prevented a rare DND crash in Task Manager under Wayland. * Removed ancient QT_USE_XXXX variables and dropped QTX_LIBRARIES. * Made timezone switching by mouse wheel optional in World Clock. * Added an icon for plugin-sensors. * Code cleanup. lxqt-panel-2.2.0 / 2025-04-17 ============================== * Handle Wayland screens by using their names, not numbers. * Added tooltip to plugin-dom. * Prevent redundant writing to the config file on startup. * Added an option for the text color of Custom Command. * Corrected the order of focusing in config dialogs by reordering blocks in ui files. * Updated manpage. * Changed "desktop" to "screen" in Panel's config dialog. * Tidy up some whitespaces in the code. * Enabled PageDown/PageUp for Fancy Menu. * Replaced qMin, qMax, qBound, qRound and qAbs with standard functions. * Cleaned up the config ui files of Main Menu and Fancy Menu. * Removed menu-cache support. * Removed debug messages for "UnknownProperty" errors in Status Notifier. lxqt-panel-2.1.4 / 2025-01-11 ============================== * Fixed Task Manager when a window is shown on all desktops. * Fixed handling of windows that are on all desktops. * Check visibility of task buttons only relative to task-bar (this fixes icon shift with auto-hiding on Wayland). * Added exclusion list to Task Manager's config. * Added X11-only info for kbindicator. * Added configurable tooltip to Custom Command plugin. * Fixed regression in showing only task buttons of the current screen. lxqt-panel-2.1.3 / 2024-12-01 ============================== * Taken into account an empty shortcut in Fancy/Main Menu. This also fixes searching with non-Latin keyboard layouts under Wayland. * Fixed bugs about multi-screen setups on Wayland. lxqt-panel-2.1.2 / 2024-11-24 ============================== * Fixed changing of desktop names under X11. lxqt-panel-2.1.1 / 2024-11-07 ============================== * Fixed destination dir of `lxqt-panel_wayland.desktop` to prevent packaging failure. * Made auto-hiding on overlapping work under `kwin_wayland`. Also, made auto-hiding animation work on Wayland in general. lxqt-panel-2.1.0 / 2024-11-05 ============================== * Refactored Window Manager interaction and added 2 Wayland back-ends for task-bar. * Made horizontal wheel scrolling work with Custom Command. * Fixed main popup positions under Wayland. * Made Fancy Menu filtering work with exec name. * Set size policy in `plugin-backlight` and `plugin-colorpicker`. * Always consider minimized windows deactivated with wlroots. * Improved `plugin-directorymenu` icons. * Fixed issues in wlroots task buttons. * Optionally disable move-to-layer and move-to-output. * Fixed keep_below state in LXQtWMBackend_KWinWayland. * Fixed issues in kwin_wayland task buttons. * Split DesktopSwitch and MoveToDesktop. * Fixed the urgent hint of desktop switcher. * Fixed default terminal of directorymenu plugin. * Added an option to reverse the order of tray items. * Fixed closing of menu with "Meta" shortcut in mainmenu/fancymenu. * Fixed a regression in reloading X11 taskbar. * Fixed putting of same-class task buttons under Wayland. * Handle errors and clean up the code of the volume plugin with Alsa. * Capitalize plugin config titles. * Don't use invalid value of `DesktopSwitchButton::LabelType` in `plugin-desktopswitch`. * Don't use uninitialized variables/struct members in `plugin-fancymenu`, and initialize in the constructor. * Initialize every member in the constructors of the panel, `plugin-sysstat` and `plugin-kbindicator`. * Fixed a crash in worldclock popup on Wayland with Qt 6.8.0. * Workaround for lack of context menu with Qt 6.8.0 in Fancy Menu. * Prevent panel from accepting focus with some Wayland compositors. * Workaround for translucency artifacts with Qt 6.8.0 on Wayland. * Workaround for the lack of context menu with Qt 6.8.0 in Main Menu. * Silenced compilation warning about `QCheckBox::stateChanged`. lxqt-panel-2.0.1 / 2024-05-08 ============================== * Fixed a runtime failure in the plugin loader. * Workaround for Removable Media plugin with a GLib-mounted encrypted volume. lxqt-panel-2.0.0 / 2024-04-17 ============================== * Added Fancy Menu plugin. * Removed spaces from saved settings of Custom Command plugin. * Added the SVG format to the panel background picker dialog. * Ported to Qt6. * Added Wayland support for positioning the panel by using layer shell. lxqt-panel-1.4.0 / 2023-11-05 ============================== * Use lxqt-menu-data instead of lxmenu-data. * Consider the WM2Urgency hint in task bar. * Fixed checking/clearing of urgency in task bar. * Fixed window cycling with mouse wheel and focus stealing prevention in task bar. * Removed unused non trivial variable from plugin-dom. * Ported away from deprecated Qt::MidButton. * Ported deprecated KWindowSystem methods to KX11Extras. * Added a clear button to the search bar of Add Plugins dialog. * Create dummy widget on unsupported platforms in desktop switch plugin (fixes crashing on Wayland). * Added parameter parsing to launched command of volume plugin. * Fixed the initial displayed volume with PulseAudio in volume plugin. * Fixed the tooltips of volume control under Wayland. * Added an option to show the output as an image in the custom command plugin. lxqt-panel-1.3.0 / 2023-04-15 ============================== * Removed redundant classes from `VolumeButton` in volume plugin. * Fixed typos. * Added nullity check for quicklaunch placeholder. * Fixed the seconds shown by the clock widget. * Enable DOM plugin by default. lxqt-panel-1.2.1 / 2023-01-02 ============================== * Fixed a regression in volume popup. * Added Qeyes plugin. * Avoid covering fullscreen windows. lxqt-panel-1.2.0 / 2022-11-05 ============================== * Added context items to Quick Launch for reloading desktop entries. * Set window flags of the volume popup explicitly (useful under Wayland). * Fixed Quick Launch icons when there are multiple config files. lxqt-panel-1.1.0 / 2022-04-15 ============================== * Updated `README.md`. * Split panel config dialog into 3 sections. * Modified default conf file. * Prevented flickering of desktop switcher when only active button is shown. * Close QProcess in the d-tor of CustomCommand. * Show desktop names on taskbutton's context menu. * Keep stat history on width change in sysstat (fixes the resetting of graph on auto-hiding panels). * Close main menu on pressing its shortcut (the clash with the built-in shortcuts of the search entry is fixed). * Made SNI proxy for xembed tray icons. Now the legacy tray icons are shown inside Status Notifier. * Added lxqt-build-tools build dependency to README. * Added options for button label and style of Directory Menu. * Fixed Reset button in taskbar config dialog. * Fixed Reset button in Status Notifier config dialog. * Fix storing/restoring of settings in general. lxqt-panel-1.0.0 / 2021-11-04 ============================== * Updated AUTHORS. * Fixed the keypad navigation in main menu. * Bumped minimum required Qt version to 5.15. * Added Custom Command plugin. * Added context menu and drag-and-drop support to search results of main menu. * Consider icon names that end with a valid extension in Status Notifier. * Don't check icon name with hasTheme() in Status Notifier. * Prevent sliding of volume tooltip. * Do not force Openbox configs under LXQt. lxqt-panel-0.17.1 / 2021-04-16 ============================== * Fixed compilation against Qt < 5.15. lxqt-panel-0.17.0 / 2021-04-15 ============================== * Fixed the popup of grouped task button in a special case. * Code cleanup (using nullptr, removing deprecated headers/methods, using default member initializers, etc.). * Fixed changing of world clock's time zone with mouse wheel. * Optionally auto-hide panel only when it overlaps a window. * Workaround for an issue with glibc 2.33 on old Docker engines. * Completely move to Qt5 signal/slot syntax. * Check pressed mouse buttons before closing grouped task popup. lxqt-panel-0.16.1 / 2020-11-04 ============================== * Fixed compilation with Qt 5.12 and Qt 5.13. lxqt-panel-0.16.0 / 2020-11-01 ============================== * Use a stylesheet for progress-bars of Sensors plugin. * Implemented auto-hiding for Status Notifier. * Added option to task button for moving the window to next monitor. * Added option to place task buttons of new windows next to the existing ones of same class when task buttons are ungrouped. * Removed incorrect and redundant explanation of milliseconds from World Clock. * Don't call non-const member functions on temporaries. * Prevent possible C++11 range loop container detachment. * Fixed the sizes and alignments of some plugins at startup. * Added right-click menu to main menu items. * Address deprecation warnings/errors. * Added XF86Eject button action. lxqt-panel-0.15.1 / 2020-05-20 ============================== * Bumped version to 0.15.1. * Fixed a problem in keyboard indicator flag, that might cause a huge amount of error messages. * Let the panel be at virtual screen edges but not between screens. lxqt-panel-0.15.0 / 2020-04-22 ============================== * Bumped version to 0.15.0. * Fixed cut text in World Clock text. * Silenced some compiler warnings. * Show (the old) system tray icons in a predictable order and add a spacing between them. * Made showing of the week number optional in World Clock. * Fixed icons of applications like Skype, Doscord, etc. in Status Notifier. * Fixed possible abort on assert in WindowNotifier. * Don't include headers of plugins that aren't being built. * Fetch window icons in an appropriate size to avoid scaling in task bar. * Don't (possibly) block on initializing statusnotifier. * Avoid char raw strings literals memory allocations. * Don't use automatic string conversions. * Override the menu icon size only if a custom font size is selected. * Enhance service name registration in statusnotifier. * Fixed a crash in LXQtTaskButton under kwin_wayland. * Only show group popup on left clicking a grouping task button. * Added the option "Show only active desktop" to Desktop Switcher. * Better text eliding and painting of task buttons. * Smoother menu search. * Added an option to toggle volume notifications with keyboard. * Made quicklaunch respect Panel's lock state. * Added hints for Ctrl+DND to Quick Launch. * Cleanup and fixes for the taksbar code. * Release mouse after task button DND (to prevent them from remaining pressed after being dragged). * Reset panel style sheet before updating it (to update plugin handles with Qt ≥ 5.13 when panel orientation changes). * Removed press-and-hold popup menu from launchers in Quick Launch. * Check if panel is under mouse on auto-hiding. * Removed QDesktopWidget from panel. * Put panel only at an edge of virtual screen (to prevent it from being positioned at the middle of virtual screen). * Set the geometry of panel before showing it (because, otherwise. some WMs might not position the panel correctly). * Removed deprecated QImage method `byteCount()` and used `sizeInBytes()` instead. * Remove deprecated `trUtf8()` and used `tr()` instead. * Fixd eventFilter() logic in kbindicator. * Set alignment for layout button in kbindicator. * Add basic support for country flags to Keyboard status indicator. * Fixed high CPU usage of Desktop Switcher. * Added an option to Task Manager for moving window with mouse wheel. * Added a plugin to change display backlight. lxqt-panel-0.14.1 / 2019-02-25 ============================== * Bumped version to 0.14.1 * Only translations was changed. lxqt-panel-0.14.0 / 2019-01-25 ============================== * New implemented: plugin-spacer: Add auto-expansion feature * Deprecated plugin-clock finally removed * Implementation fixed: - plugin-colorpicker: Removed content margins and reduce spacing - plugin-mainmenu: Also include exec name in filtering without menu-cache - plugin-mount: Store device names to show them upon remove - plugin-panel: Optional overriding of icon theme for panels - plugin-panel: Allow plugin's "static" configuration change - plugin-spacer: Change type of mExpandable - plugin-spacer: Use QStringLiteral whenever possible - plugin-spacer: Add "override" to declarations - plugin-volume: Do not auto-unmute on volume change - plugin-worldclock: Don't use enum for bool parameter - plugin-worldclock: Set manual format dialog title * Improved cmake scripting - plugin-tray: Use XCOMPOSITE_LDFLAGS instead of XCOMPOSITE_LIBRARIES - Set cmake_minimum_required to 3.1.0 - Use lxqt-build-tools and -compilersettings - Removed locale compile definitions * Moved translations from lxqt-l10n back to lxqt-panel - Removed obsolete translation fuctionality - Removed now obsolete and harmful panel/translations/.gitignore - Added translation promo in README.md * Translation updates lxqt-panel-0.13.0 / 2018-05-21 ============================== * Remove spurious newline * Remove spurious newline * Spanish translation update * mainmenu: Use new signal/slot connection notation * lxqtmainmenuconfiguration.cpp: include QAction explicitly * CMake: Prevent in-source builds * Fix task button removal on class change * plugin-kbindicator: Go directly to the Keyboard Layout config page * Update XdgAction icons appropriately * Introduce option USE_MENU_CACHE, default OFF * fixed razor-qt -> lxqt and http -> https * Fixed mentions of LXDE * mainmenu: Don't use "fallback" QIcon::fromTheme * mainmenu: Use the QIcon::fromTheme() * Set the initial task button text (and icon) correctly (#454) * Update Simplified Chinese translations (#456) * Fix worldclock in panel.conf * Move and Resize items in task-button context menu * Drop missed foreach * Prevent possible container detachments * Drop Qt foreach * avoid infinite recursion when no icon available. * pavucontrol should be pavucontrol-qt * cpuload: Do proper cleanup * cmake: Handle CMP0071 * taskbar: Avoid conditionals on uninitialized values * mount: Fix leak * mainmenu: Fix possible leaks in menu-cache usage * move panel config to /usr/share/lxqt * lxqtpanel: Fix wrongly positioned popups * ixlqtpanel: Fix typo Gometry -> Geometry * plugin-volume: Use a specific icon for the panel * Use the new FindXKBCommon CMake module * plugin-volume: Add % to value for notification * worldclock: Fix widget size updating (#438) * Fix stupid whitespace. lxqt-panel-0.12.0 / 2017-10-21 ============================== * Release 0.12.0: Update changelog * Set patch version * quicklaunch: Show popup menu aligned to clicked button * quicklaunch: Add "Desktop Action" support * l10n: Update Polish translation * Fix Danish spelling * plugin-tray: Fix dupe icon display error * Don't export github templates * Use worldclock by default instead of clock. * clock: Show deprecation message on startup/add * Fix clock text update * Avoid calling text() in MatchAction on a QAction == 0 * volume: Do check for OSS availability in run-time * Update Polish .desktop entry * Remove space from end of "Show popup on mouse hover " string * Updated Lithuanian translation * Add/update Lithuanian translation * Update directorymenu_it.desktop * mainmenu: Don't hold the references for menu-cache * mainmenu: Fix menu-cache usage * set Qt::AA_UseHighDpiPixmaps to true * l10n: Updated Polish translation * Improved lxqt-panel version display * Added default CMAKE_BUILD_TYPE and LXQT_PANEL_PATCH_VERSION * plugins: Make widgets/buttons use whole space * LXQtPanelLayout: Honor item's expanding size policy * mainmenu: Install eventFiler for all (sub)menus * volume: Add all changes notifications (configurable) * Fixes a FTBFS in superbuild mode * Added merged autostart and menu to CMakeLists.txt * Updated *_da.desktop files and removed *_da_DK.desktop files * translation: Add Portuguese directories * Update desktop entries and Replace fr_FR by fr * Merge pull request #45 from lxde/menu-comment * lxqt-applications.menu: remove accidentally added topics from "System Tools" * Update Greek translation (el) Remove country variant from language code * Rename LxQt to LXQt everywhere * CMake: Adds Runtime and Devel install COMPONENTs * Coding style changes * Adds double quotes to everything that may break * Use GNUINnstallDirs * Updates the build system to use the Targets infrastructure * Place LXQt About over Preferences in the main menu * Added italian translation in menu * Added german translation for the settings directory. * Drops hardcoded /etc/xdg paths * menu: hungarian translations added * Add Russian translation * Restore the old preferences menu layout of razor-qt. * Updated german translation, replaced Qt4 by Qt in all xsession/translations * add lxqt-leave directory files * use LXQt-specific menu file * Updates translations infrastructure * Update the required minimum cmake version * remove dead template lines switch OnlyShowIn from Razor -> LXQt stringchanges LxQt -> LXQt * Support lxqt-session and add necessary xdg autostart desktop entry files. * Fit the task group to its contents * mainmenu: Add "true" translucency support * Show "unknown" when an icon is missing * volume: Force step for wheel over popup slider * volume: Always show tooltip over button * volume: Force configured step for wheel over button * volume: Use "override" keyword * Enable translucency for taskbar group popup * tray: Move tray icon window into correct place * taskbar: Elide texts of buttons when needed * volume: Fix calculating of alsa volume * volume: Remove duplicated code * volume: Fix reporting of pulse volume * sysstat: Fix saving of network maximum speed * mainmenu: Redesign config dialog * mainmenu: Clear search upon show (configurable) * plugin-kbindicator: Undef the "explicit" workaround * plugin-sysstat: Avoid "set but unused var" warning * panel: Make space reserve on display configurable * panel: Add wrong logic warning * panel: Hide correctly upon the DragLeave * plugin-mount: Fix firing the actions * plugin-mount: Notify just on "real" add/remove * plugin: Save settings before signal connect * taskbar: Add Meta+1..9 shortcuts to raise windows * Bump year lxqt-panel-0.11.1 / 2017-01-01 ============================== * Release 0.11.1: Update changelog * Show Auto-Hiding Panels with Delay (#387) * Enabling testing on weston (#380) * Update *da.desktop files * plugin-showdesktop: Cleanup left behind XCB artifacts * plugin-kbindicator: Use FindXCB CMake module * plugin-tray: Use the FindXCB CMake module * Use the new lxqt-build-tools CMake modules (FindMenuCache) * plugin-desktopswitch: Add LABEL_TYPE_NONE * Add/Update Portuguese translations * taskbar: Add "cycle on wheel" configuration * taskbar: Forward wheelEvent * Add/Update french desktop entries * taskbar: Set toolButtonStyle for popup correctly * Fix faulty link in README.md * Remove arbitrary limit of taskbar button width * Remove cpack (#371) lxqt-panel-0.11.0 / 2016-09-24 ============================== * Release 0.11.0: Add changelog * Update README.md: Reflect changes introduced in 1c22479 * CMakeLists: Fail for unmet dependencies * mainmenu: Remove setting base style in StyleChange * mainmenu: Workaround transparent search * mainmenu: Dispose old menu first when building new * Add README.md * sensors: Add default bar scale * sensors: Check for existence of the max value * sensors: Add minor code optimization * mainmenu: Handle QAction disposal correctly * panel: Don't use autoFillBackground * Plugin: Fix FTBFS for older Qt versions * mainmenu: Fix show/hide actions after menu rebuild * Statusnotifier: Remove setParent on StatusNotifierMenu. * Add XKB_COMMON_X11_INCLUDE_DIRS * panel: Remove/deprecate plugin-screensaver (#363) * Add and Update Arabic Translations for Desktop Files * Fix updating panel geometry on screen size change * panel: Fix screen number config change saving * Separate a String for I18N Enhancement * plugin: Force config dialog activation/raise * plugin: Fix crossreferencing of config dialogs * panel: Dispose unneeded menu * panel: Destroy panel's config dialog * showPopupMenu: Remove extraneous setParent() call (#359) * statusnotifier: fix popup position on right click * desktopswitch: Take layoutDirection into account * taskbar: Remove orientation specific logic for DnD * LXQtPanelLayout: Take layoutDirection into account * taskbar: Remove forgotten debug * taskbar: Consider layoutDirection for DnD * panel: Optimize search a bit * plugin-volume: Avoid an buffer overflow * Respect the OnlyShowIn property for menu entries when using menu-cache (#351) * kbindicator-plugin: fix linking with libxcb-1.12 * plugin-volume: Handle errors when trying to determine the next card * Clean up CMakeLists.txt * plugin/directorymenu: Removes no use code (#350) * build: Forward translations parameters * ts-files removal (#346) * Fix memory leaks * Use const references with the foreach iterator * Small fix * statusnotifier: Fix showing icons in menu * kbindicator: (Re)Add .desktop translations * Update desktopswitchconfiguration.ui * panel: (Re)Add translations dir * Revert unintended *.desktop files removal * Remove translations (can be pulled in build time) * Use external translations * Update lxqt-panel_it.ts * Add documentation/comments for PanelPluginsModel. * Fix segfault on plugin initialization (#338) * translations: updated german translation (#323) * plugin-mainmenu: update mainmenu_it.ts (#337) * Russian translation update * mainmenu: Use style sheet to override icon * plugins: Change "repolish" logic * mainmenu: Reduce delay of popup when using shortcut * volume: Remove debug * plugins: Don't unload -> avoid dangling resources * Added new translated strings. * Added missing context for lupdate. * Updated german translation. * Ask for confirmation when removing a panel * panel: Add "Lock Panel" functionality * fix updating panel geometry on screen changes * Try find a free position when adding a new panel * LXQtPanelApplication: Use D-Pointers * Animate auto-hiding panels. * Add QT_USE_QSTRINGBUILDER to the compile definitions * tray: Fix SEGFAULT on stop * mainmenu: Fix visual search problems * mainmenu: Remove duplicates from search * mainmenu: Add new configuration options for search * mainmenu: Workadound QLineEdit's wakups(QTBUG-52021) * mainmenu: Add configurable way of search * taskbar: separate adding from changing windows * plugins: Make buttons flat for cleaner look * mainmenu: Fix search interacion * mainmenu: Add search/hide possibility * taskbar: Add show icon by WindowClass to config * taskbar: Use icon from theme (based on windowClass) * panellayout: Do not allow oversized plugins * panellayout: Avoid plugin margins * PluginSettings: Make settings object/class public * Bump year Fix licenses: lxqt-panel is pure LGPL * worldclock: Fix possible SEGFAULT * Add comments for ILXQtPanel and LXQtPanel. * plugin-taskbar: fix German translation of configuration dialogue * panel: Correct PanelPluginsModel logic * volume: Avoid infinite cycle in config dialog * plugins: Use "cleaner" style logic * mainmenu: Remove unneeded includes * mainmenu: Fix freeze for some widget styles (e.g. breeze) * tray: Fix "BadDamage" warning message * tray: Postpone tray icon initialization * PluginSettings: Emit settingsChanged only for owned keys * taskbar: Fix (auto)hide after window menu is shown * mainmenu: Use directory of current icon for search * mainmenu: Fix showing icon path in configuration * plugin-taskbar: avoid icon-only style for groups * statusnotifier: fix position of context menus * plugin-quicklaunch: remove preset applications * plugin-tray: Fix native window sizes for high DPI devices * taskbar: Refactor/improove window handling logic * taskbar: Fix multiple groups when WindowClass changes * plugin settings: Publish PluginSettings symbols * Add support for nested groups in PluginSettings * Add PluginSettings::{read,set}Array for atomicity * Add PluginSettings for shared settings for plugins * plugins config: remove a lot of redundant code * LXQtPanelPluginConfigDialog: add ctor overload * Update lxqt-panel_fr_FR.ts * Create HR translations for panel and plugins * lxqt-panel: Update/format and install man page * plugin-kbindicator: remove ru_RU translations * plugin-kbindicator: add russian translations * Update Russian translations for the panel and plugins * Italian translation update * Updated german translation. * Adds comments for lxqtpanelapplication.h. * Correct some minor spelling mistakes. * panel-config: Fix background opacity slider * taskbar: Avoid "noop" button if window ID changes * mainmenu: Fix URL assembly for Drag&Drop * panel: Fill background * mainmenu: Use configurable icon * worldclock: Fix update interval * panel: Add periodic hide checking * clock: Fix content update if transform/autorotate * quicklaunch: Fix panel hiding upon showing menu * worldclock: Decrease (unnecessary) wake-ups * panel: Remove periodic checking for hide * Prevent panel hiding in case any (standalone) window shown * plugins: Unify window popup-ing * directorymenu: Fix indentation (spaces) * panel: Use override for overridden virt func * hu translations fixed * plugin-sysstat: translations fix * desktop-switch: Highlight only windows in taskbar * fix misspelled prefered lxqt-panel-0.10.0 / 2015-10-31 ============================== * Fix license file * panel: Fix reserved space on screen * mainmenu: Fix close menu by "weird" shortcut * volume: Handle add/removal of pulse sink correctly * Workaround to the QStringLiteral static finalization bug * plugin-mount: Fix SEGFAULT in finalization time * mainmenu: Fix global shortcut configuration * taskbar: Enhance show icon for moving * taskbar: Fix incorrect move between multiple instances * taskbar: Simplify drag originator logic * Fix a couple of warnings * Make panel's settings private for more reliability * Fix warning about possibly uninitialized variable * taskbar: Use the icon as the DnD pixmap * taskbar: Add visual effect to button move * worldclock: Fix popup showing after closed * plugins: Unify popups behaviour * taskbar: Fix showing group popup for DnD * taskbar: Enhance moving buttons * CPU count begins with 0 not with 1. * Updated german translation. * Added missing cpu10, updated translation template. * Added some translateable strings, tooltips. * plugin-statusnotifier: corrected CMakeLists.txt * panel: referencing symbol in static plugins to not stip the loader object in linking time * Use "automatic" plugin translations loader * addplugindialog: show also the plugin ID (desktop file name) * Optimization on plugin name generation, as suggested by palinek. * Fix #839 - lxqt-panel plugins enumeration * Revert "plugin-statusnotifier: fix FTBFS with dbusmenu-qt" * panel: remember configured screen * plugin-statusnotifier: fix FTBFS with dbusmenu-qt * plugin-statusnotifier: better callable checking for static_assert * plugin-statusnotifier: polish of SniAsync::propertyGetAsync usage * Replace QPixmap::grabWindow with QScreen's version * plugin-statusnotifier: add missing license headers * plugin-statusnotifier: get all icons from DBus * plugin-statusnotifier: async communication in DBus * plugin-statusnotifier: postpone registration of new item to not block DBus response * plugin-statusnotifier: correct memory release & existing menu check (avoid SEGFAULT) * Transition LxQt --> LXQt: remnants in TS files * Italian translation: remove country-specific translation "_IT", several updates * Rename LxQt to LXQt everywhere * Update Greek translation Remove country variant from language code * license text don't match license declaration * license headers for kbindicator plugin * plugin-mainmenu: set icon size according to font size * plugin-mainmenu: removed unused QProxyStyle object * plugin-statusnotifier: fix popup position on * Redesigned settings dialog, switching policy set as global by default * Update Russian translation * Removed unneeded entries from include_directories() * Use CMAKE_AUTORCC. Drop qt5_add_resources(). * Use CMAKE_AUTOUIC. Drop qt5_wrap_ui(). * Prefer list(APPEND ...) over set(....) * panel: QMenu positioning workaround for multihead/multipanel setup * plugin-sysstat: fix for source strings translation * plugin-sysstat: translatable type/source strings * plugin-sysstat: enhanced tooltip texts * plugin-sysstat: correct configuration displaying/changing * plugin-spacer: configuration UI load fix * Removes ancient QT_USE_XXXX variables * Use find_package() to find libdbusmenu-qt5 * plugin-sysstat: added tooltip information * minor fix in German translation of plugin-kbindicator * Re-added german translation. * Updated translation template for tooltips. * Updated german translation. * Add placeholders to fr translation * Add french translation * Remove faulty lithuanian translation * Complete dutch translation * Fix romanian translation * Remove country specific Italian * Complete italian translation * Update hungarian translation * Remove faulty lithaunian * Update slovenian * Delete incomplete arabian translations * Update romanian translations for the desktopswitch plugin * Update romanian translations for the cpuload plugin * Update romanian desktop file for the cpuload plugin * Update romanian translations for the clock plugin * Update romanian translation for the clock desktop file * Update romanian translations for the main panel ui * Add missing romanian translation for the network monitor * Update romanian translations for the network monitor desktop file * panel: fix reserved space * autohide: correctly reserve screen space, always. * autohide: change only apparent height/width, * panel-configplugins: Adds tooltips * kbindicator: depend on xkbcommon & show lang flag * application: use standard liblxqt unix signal handling to quit * plugin-showdesktop: remove xcb dependency, use KF5 * Use KWindowSystem to set window type as Dock * plugin-taskbar: Enhances Configuration Ui layout * Updates the build system to use the Targets infrastructure * plugin-clock: static width based on characters count * Finish networkmonitor turkish translation * addplugindialog: prevent segfault on dialog opening * plugins: new flag to set the need for a flag * plugin-mainmenu: applying custom font size on the fly * Added missing german translation, updated template. * fixes in French and German translation * plugin-spacer: simplified configuration signal handling * plugin-mount: avoid realign-resize recursion * Remove trailing whitespaces * Replace LXDE-Qt with LXQt in desktop file * Fix naming and links * Delete faulty indonesian translation * Rename greek and french translation file to be country independent * Delete duplicate russian translation * Delete duplicate hungary translation * Delete duplicate danks files * Delete czech country specific files * Add polish translation * Moved croatian translations to the correct directories. * Updated german translations for the taskbar plugin. * Added german translation for the spacer plugin. * Updated german translations for the showdesktop plugin. * Updated german translations for the sensors plugin. * Delete Venezuela specific translations * Correct dutch translations for networkmonitor desktop file * Improved network monitor Spanish translations * Provide esperanto translation for networkmonitor * Correct translation for esperanto desktop file * Add turkish translation * Fix lxde/lxqt#684: activate window on some options * plugins: unified handling for single instance plugins across all panels * plugins: flag to limit plugins to single instances * plugin-volume: handle maximum volume proportionally * plugin-clock: calculate min widget size * panel: retest conditions for autohide regularly after Leave event * Updated / unified german translation for taskbar plugin. * Added german translation for sysstat plugin. * Added german translation for statusnotifier. * Updated template by removing old file and trigger an update. * Updated german translation for the screensaver plugin. * Updated german translation for the quicklaunch plugin. * Updated german translation for the networkmonitor plugin. * Updated german translation for mainmenu plugin. * Updated template for mount plugin. * Updated german translation for mount plugin. * Added german translation for kbindicator plugin. * Added german translation for DOM. * Moved croatian translation to correct directory. * Updated german translation for directorymenu. * Updated german translation. * Updated german translation for cpuload plugin. * Updated german translation for colorpicker plugin. * Cleaned german desktop file for tray plugin. * Updated german translation for volume plugin. * Added german translation for worldclock plugin. * plugin-clock: adjust size only when needed * plugin-taskbar: show only particular desktop windows * panel: only for supported objects the iconSize qproperty styling is applied * plugin-sensors: (re)added warning timer frequency initialization * plugin-tray/statusnotifier: icon in .desktop file * plugin-desktopswitch: Check if the button exists dereferencing it. * plugin-volume: more obvious popup buttons * plugin-spacer: slovak translation * plugin-spacer: translatable type texts * Updated german translation for clock plugin. * Added new string to template and german translation. * plugin-clock: use Qt::PreciseTimer for better accuracy * panelconfig: default background opacity to 100 & compositing note * plugin-clock: content down-scaling & proper size adjustments after config change * Updated german translation, removed now obsolete _de_DE.ts. * Updated template, sorted line numbers and contexts - like created from scratch by 'lupdate'. * Better name for dialog window. * pluginsmodel: fix crash in QAbstractItemModel::endMoveRows for noop move * plugin-mainmenu: config: editable menu file & button icon * panel: improve multi-monitor support * Create networkmonitor_hr.ts * Create mount_hr.ts * Create mainmenu_hr.ts * Create kbindicator_hr.ts * Create directorymenu_hr.ts * Create desktopswitch_hr.ts * Create cpuload_hr.ts * Hungarian translations added, modified * plugin-mainmenu: fix crash on changing menu file * Fixes lxde/lxqt#647, FTBFS * Update networkmonitor_it.desktop * Update networkmonitor_it_IT.desktop * Update networkmonitor_it_IT.desktop * Update networkmonitor_it.desktop * Update networkmonitor_it_IT.desktop * Update networkmonitor_it.desktop * plugin-networkmonitor: fix faulty French translation * Fix German translation of panel context menu (addendum). * Fix German translation of panel context menu. * panelconfig: improve title and labels * Update lxqt-panel_es.ts * panelconfig: fixed type in "cannot reset" note * Make "spacer" a static plugin. * panelconfig: no margin for plugins configuration widget * plugin-mount: popup size handling upon show event * plugin-mount: startup speedup (potential long time operation is done after object construction) * plugin-mount: correct popup size handling * plugin-taskbar: reverting commit b0a1f3d007c2369fdf624f406aa36b883c72fd5f * panel: fix volume's type in the default config * panel: save settings after plugin move from config dialog * panel: plugins correct positioning * panelconfig: corrected usage of Plugin in button states logic * CMakeLists: re-enable default building state for plugins * panel: PanelPluginsModel signals handled directly by layout * Enable/disable buttons in Manage Plugins dialog * panel: subclass QAbstractListModel to handle plugins * panel: separate GUI of panel settings from plugin * CMakeLists: fix translation loader include (usage of lxqt_app_translation_loader) * plugin-taskbar: don't stretch along the panel in icon only * plugin-taskbar: raise minimized windows on current desktop * plugin-taskbar: show only minimized windows * plugin-taskbar: fix for show/hide of moved window if "show only panel's screen windows" active * plugin-taskbar: fix of crash after closing not showed window * Update Russian translation * Add QtCreator project file type to .gitignore * plugin-mainmenu: fixed panel autohide after menu closed * plugin-mount: remove of doubled signal connection * plugin-mount: fix error message construction * plugin-mount: add device actions back * Fix FTBFS with Qt 5.3 and memory leak * plugin-mount: typo for updating the status * plugin-mount: large refactoring and simplification * plugin-mount: improved state changes handling * plugin-taskbar: integrated "current screen only" commit into current master - grouping * Added show windows from current screen only * panel: layout elements centering fix * Refactoring of panel's main * panel: fixed creation of translation files * plugin-taskbar: left-aligned labels in case "Only Text" * plugin-taskbar: initial popup button style fix * plugin-taskbar: fix grouping popup follow icon/text style * CMAKE_AUTOMOC=ON and cleanup of all CMakeLists.txt * Improve panel's configuration dialog arrangement * plugin-taskbar: configurable maximum button height * panel: layout position optimization * plugin-desktopswitch: urgency handling improvements * plugin-desktopswitch: initial desktop renaming * plugin-desktopswitch: set urgency for desktops * plugin-taskbar: correct handling of SkipTaskbar state * plugin-taskbar: moved handling of KWindowSystem::windowChanged into LxQtTaskBar * plugin-taskbar: optimized window icon geometry handling * plugin-taskbar: enhanced "is on current desktop" handling * plugin-taskbar: fixed group vs. window class handling * plugin-taskbar: "regroup" every time when visibility is refreshed * plugin-statusnotifier: correctly place context menu * plugin-statusnotifier: fix showing menu/icon showing * plugin-taskbar: proprely handle window class name change * Fix NetBSD build * plugin-directorymenu: fixed directory choosing * plugin-worldclock: use Qt::WindowModal dialogs to not "inactivate" panel * panelconfig: correct dialog handling (avoid access to deleted object) * plugins config: use Qt::WindowModal dialogs to not "inactivate" panel * panelconfig: use Qt::WindowModal dialogs to not "inactivate" panel * panel: make config dialog top-level window * plugin-clock: removed unneeded adjusting size of widget to it's content * plugin-worldclock: removed unneeded adjusting size of widget to it's content * panel: show panel after launch if hidable * plugin-taskbar: optimized calculation of popup position * panel: widgets manageable from "add plugin dialog" * Updates translations sources * plugin-directorymenu: cleanup & icon * new plugin - directorymenu * Update mainmenu_it_IT.ts * Updates translations sources * panel: correct background of hidden panel * lxqtpanellayout: respecting contentsMargins() value * plugin-dom: enhanced properties output * plugin-screensaver: proper shortcut regstration * plugin-desktopswitch: proper shortcut regstration * plugin-volume: proper shortcut regstration * plugin-showdesktop: proper shortcut regstration * plugin-desktopswitch: delayed registering shortcuts * plugin-desktopswitch: refactoring & optimizations * plugin-desktopswitch: Option to display names instead of numbers * plugin-volume: avoid warning of hiding overloaded virtual function * Create kbindicator_it.ts * Update clock_it_IT.ts * Update taskbar_it_IT.ts * Update lxqt-panel_it_IT.ts * Update lxqt-panel_it.ts * Add required package xcb-util to plugin-tray * plugin-spacer: reordered type - default now lined * panel: auto-hide feature * plugin-dom: non-stretchable heading * plugins: static plugins initialization on one place * plugins: const for ILxQtPanelPluginLibrary::instance * plugin-mainmenu: if menu shown click on button closes menu * plugin-clock: configurable first day of week * panel: fix for multilplicating plugin counts when "Add Panel Widgets" shown and reactivated * panel: conditional statically linked plugins * plugin-volume: show perentage tooltip * plugin-statusnotifier: standardize context menus * plugin-taskbar: multiple fixes * plugin-taskbar: large refactoring and cleanup * plugin-taskbar: fixes for lxqttaskgroup and lxqtgrouppopup * plugin-taskbar: refactor how we handle settings * plugin-taskbar: removed eyecandy, re-sorted configuration item(s) and fixes * plugin-taskbar: initial implementation of window grouping * panel: added smart pointer guard to main (avoiding ad-hoc SEGFAULTs on application end) * plugin-statusnotifier: workaround for invalid items * plugin-statusnotifier: better icon handling * Require C++11 support * plugin-statusnotifier: added license to files headers * plugin-statusnotifier: fix registration of StatusNotifierHost and protocol version * plugin-statusnotifier: get some ideas from Plasma's * panel: fix warning in findStaticPlugin * plugin-statusnotifier: retrieve and cache the icons * plugin-statusnotifier: handle Status and display correct icon * plugin-statusnotifier: correctly handle mouse clicks * plugin-dom: added all widget's properties view * Added Status Notifier Plugin, from equim/lxqt-panel-plugin-snw * plugin-dom: added all widget's properties view * Adds a threshold which a user has to pass when scrolling on the desktopswitch plugin for the lxqt-panel. This makes scrolling less sensitive and more usable. * Quit gracefully on Unix kill signals * plugin-mount: Use drive-removable-media icon as fallback * plugin-spacer: support for stylable spaces * plugin-mount: Use only one icon instead a list of possible ones * added support for setting desktoplayout * plugin-desktopswitch: configurable number of rows * plugin-networkmonitor: fixed Czech translation * Fixes #473, mouse wheel on DesktopSwitch not functioning properly. * plugin-mainmenu: fix for not showing menu for next added widget * plugin-mainmenu: avoid menu loading if menu file not changed * panel: connected cleanup to signal aboutToQuit * Style/headers cleanups in Sensors plugin * Updated polish translations * Add support for "local" timezone. Fixes lxde/lxqt#519 * Simplify update timeout. Fixes lxde/lxqt#525 * plugin-mount: switch from liblxqt-mount to KF5Solid * Style cleanups in ColorPicker, DOM, Mount and QuickLaunch plugins * added separate list of configured plugins to not delete them from configuration in case plugin not found * Fixing drag and drop of running programs' icons when panel is vertical * plugin-spacer: suitable icon?! * new spacer plugin/widget * plugin-cpuload: configurable bar width * plugin-cpuload: indentation corrected to follow required coding style * Add some debug code to benchmark the loading time of each plugin during panel startup. * Make some frequently used plugins "statically-linked" to speed up loading. * The static plugins are: clock, desktopswitch, mainmenu, quicklaunch, showdesktop, taskbar, tray, and worldclock. * Add missing libxcb linkage to showdesktop and tray plugins since they still uses xcb. * remove KF5/ prefix from includes as done in lxde/liblxqt/pull/36 lxqt-panel-0.9.0 / 2015-02-05 ============================= * Change the delay of main menu popup from 500 ms to 250 ms. * Try to fix lxde/lxqt#459, lxde/lxqt##142, and lxde/lxqt#401 at the same time. * Delay showing the menu when it's activated by shortcut key to workaround keyboard focus related issues. * Code cleanup. Remove unnecessary keyboard event hacks. * Revert "Fix mainmenu's focus" * Add icons to the panel plugins * Add missing action icons to the panel popup menu * fix networkmonitor_de_DE.desktop for the time being * Fix mainmenu's focus * Update Russian translation * remove specialized leave-menu handling * Remove teatime plugin * Portuguese update * Update Japanese translation * Add #TRANSLATIONS_DIR to colorpicker.desktop. * Fix dom.desktop.in (LXDE-Qt to LXQt) * Update all translations * Make sure widgets in settings dialog have correct enabled state when settings are loaded * Remove a translation message that gotten mixed accidentally * Update spanish translation * worldclock: Fix Ui date settings load inconsistency * Removes ${PLUGIN_DIR} duplicate definition * Include the BuildPlugin one time only * Fixes CMake CMP0038 warnings * Makes the Show Desktop shortcut work again * Remove plugin settings from panel settings file when plugin is removed * Portuguese language update * Rename some text. See lxde/lxqt#416 * Cleanup of CMakes, using GNUInstallDirs now * Updates translations sources * Unify plugin files naming * Support custom time zone names (as per request in https://github.com/lxde/lxqt/issues/312#issuecomment-68588776 ) * Rewrite worldclock's configuration * - Reverse wrong placed translations. * - Update brazilian portuguese desktop translation * Toggle lock keys' state on click on keyboard indicator * Use xcb on Show Desktop plugin. This is related to lxde/lxqt#338 * Add QX11Extras to cmake include dir * - Unify naming for a unique lxqt. No more suffixes * Network Monitor plugin: fix faulty German translation * Use XdgDesktopFile::load() * Revert "Commit from LXDE Pootle server by user LStranger.: 391 of 391 strings translated (0 need review)." * Commit from LXDE Pootle server by user vgezer.: 320 of 320 strings translated (0 need review). * Update Russian translation * Commit from LXDE Pootle server by user LStranger.: 391 of 391 strings translated (0 need review). * Add keyboard navigation to main menu * Reorganization of mainmenu's configuration panel * Fixes lxde/lxqt#318 configurable font size in mainmenu * Commit from LXDE Pootle server by user flywheel.: 262 of 264 strings translated (2 need review). * Update taskbar buttons' icons on event * Add KDevelop project file type to .gitignore * Commit from LXDE Pootle server by user DanWin.: 305 of 305 strings translated (0 need review). * Commit from LXDE Pootle server by user DanWin.: 294 of 305 strings translated (0 need review). * Plugin name fixed. Fixes #382 * Update Russian translation * Sort plugins alphabetically, remove non-existing plugin-helloworld * Add time-only formats, improve popup in plugin-worldclock * Cancel widget move on panel with esc * Get rid of Xlib on the keyboard indicator * Fix draggind action from main menu * Fixes translations generation * Moves translations from the local to the translations dir * Uses the new translations cmake modules * Renames the translations source files * Reorganize panel configuration dialog * Make the lxqtmount-qt5 required only when building the mount plugin. * Custom font color handling. Fixes #101. * Panel background configuration * Commit from LXDE Pootle server by user H.Humpel.: 124 of 305 strings translated (0 need review). * Reset statistics widget only when size changes. Fixes lxde/lxde-qt#353 * Relax limits on size and update frequency * Set the systray plugin free form liblxqt's XfitMan * Fix segfault on i3 when changing workspaces. Fixes lxde/lxde-qt#240 * Commit from LXDE Pootle server by user rago1975.: 65 of 65 strings translated (0 need review). * Fixes an FTBFS on openSuse * Commit from LXDE Pootle server by user JSonic.: 391 of 391 strings translated (0 need review). * Commit from LXDE Pootle server by user rago1975.: 10 of 10 strings translated (0 need review). * Commit from LXDE Pootle server by user rago1975.: 24 of 24 strings translated (0 need review). * Commit from LXDE Pootle server by user rago1975.: 21 of 25 strings translated (0 need review). * Commit from LXDE Pootle server by user rago1975.: 57 of 57 strings translated (0 need review). * Commit from LXDE Pootle server by user rago1975.: 39 of 39 strings translated (0 need review). * Commit from LXDE Pootle server by user KlemenKosir.: 360 of 356 strings translated (0 need review). * Fixes translations not being loaded. * Fixes lxde/lxde-qt#325. Drop .desktop files on quicklaunch * Update Russian translation * Fix taskbar window filter * Reset calendar's selected date when showing. Fixes lxde/lxde-qt#322 * worldclock: get rid of ICU * CMakeLists.txt cleanup * Commented line that was causing high CPU and memory usage * Port to KWindowSystem. Purges Qt4. * Commit from LXDE Pootle server by user H.Humpel.: 78 of 305 strings translated (0 need review). * Popup the configuration dialog when the user adds a panel * Commit from LXDE Pootle server by user Pjotr.: 356 of 356 strings translated (0 need review). * Commit from LXDE Pootle server by user KlemenKosir.: 285 of 356 strings translated (0 need review). lxqt-panel-0.8.0 / 2014-10-09 ============================= * Load the plugins translations * Adapt to the translation infrastructure * Fix plugin title in context menu * Allow opening more than one plugin configuration panel. Fixes lxde/lxde-qt#60 * Make Removable Media's panel be closable with ESC. Fixes lxde/lxde-qt#126 * Needed for lxde/lxde-qt#140 and #54 * Make version detection work with Qt4 * Fixes bug that resets panel configuration on panel deletion * Make calendar dialog hide when it loses focus * Fix scroll order after drag and drop * Use Qt5.2+ for WorldClock plugin instead of ICU4.2+ if possible * Prevent infinite repainting * Keep layout direction linked to rotation * Update copyright info * Fix lxde/lxde-qt#61 * Fix iterator type * Fix lxde/lxde-qt#279 * Avoid using XdgDesktopFileCache which loads the whole cache just to get info for several files. This can speed up startup of lxqt-panel. * Adapts to the new libqtxdg XdgMimeType class * Removes "Set from theme" panel size button * Commit from LXDE Pootle server by user dforsi.: 57 of 57 strings translated (0 need review). * Commit from LXDE Pootle server by user psokol.: 16 of 32 strings translated (0 need review). * Fix incorrect handling of work area and WM_STRUT which cause incorrect popup menu places. * Workaround for Qt 5 bug #40681 by monitoring QScreen::destroyed() and re-create affected panels manually. * This closes lxde/lxde-qt bug #204, #205, and #206 at the same time. * Store the result of QX11Info::display() and avoid repeated calls to the methods. (When called during the primary screen being destroyed, QX11Info::display() crashes.) * Force re-creation of the panel window when screen count is changed to workaround Qt bug 40681. * Fix lxde/lxde-qt bug #204, #205, and fix incorrect WM_STRUT & WM_STRUT_PARTIAL X window properties. * Use the edge of the whole screen instead of that of individual monitors when setting strut as specified in the xdg EWMH spec. * Fix incorrect _NET_WM_STRUT settings under multi-head environment. * Do not activate the panel on mouse click. This closes lxde/lxde-qt bug # 161. * Replace Qt5 only API QWidget::grab() with QWidget::render() when compiled with Qt4. * Always use percentage (0-100) for the volume of audio devices. * Delete invalid slot. * Taskbar buttons manual ordering * Refactor lxqt taskbar plugin and made using more than 1 taskbar possible. * Set proper default value for sysstat plugin to turn on cpu monitoring by default. * Fix the bug that 100% volume cannot be used. * Make AudioDevice::setVolume() accept real volume rather than percent and make all backends consistent. * Set the maximal volume of the alsa devices to 100. * Fix dropping an action from menu * Remove repeated find_package() from CMakeLists.txt * Return 0 for QStyle::SH_MenuBar_AltKeyNavigation style hint of mainmenu. With this, the menu won't be closed when the user press Alt key. * Avoid duplicated ElidedButtonStyle instances to save some resources. Update the ElidedButtonStyle proxy style when its base style is changed. * Implements Urgency Hint handling * Apply the new QStyles correctly to the main menu when the style is changed. * Fix bug #14: ilxqtpanel.h misses its dependency on lxqtpanelglobals.h. * Add missing xcb packages to CMakeLists.txt. * Try to fix lxde-qt bug #208: Volume applet slider closes immediately after touching. * Do not hide the volume popup when realign(). * Activate the popup window, and hide the popup when it's deactivated. * Fix the timeout handling in VolumeButton. * Update the sink list in the config dialog of volume control plugin when changing audio engine. * Fix the incorrect default value of audio backend of volume control plugin. * Properly include sysstat directories * Use portable SysStat headers * Use portable LXQt header in .ui files too * Look for the Qt5 version of SysStat when appropriate * Set _NET_WM_WINDOW_TYPE_DOCK to the panel to workaround a bug in Qt5. * Fix incorrect handling of xcb event, fixing tray plugin. * Fix building kbindicator plugin with Qt5 and XCB (not fully working). * Try to fix tray plugin. * Fix taskbar plugin for Qt5. * Add missing plugin metadata to make them loadable in Qt5. * Qt5 fixes * Prepare for Qt5 * Prepare the CMakeLists.txt files for building with Qt5. * Make the "Mixer" link in volume plugin be themeable * emit realigned () is now called always AFTER LxQtPanel::realign() * Update quicklaunchaction.cpp * Use the libqtxdg portable headers * Make it work for vertical panels too * Panel height handling * Adapt to the new liblxqtmount portable headers * Adds the liblxqtmount include dirs to the build system. * Call for realign() when position is changed and a name fix for positionChanged() * Remove unused btnClicked slot * Use new LXQt header files. * Update clock_pl_PL.ts * Update lxqt-panel_pl_PL.ts * Apply again patch for special meaning of negative size for panel * Improve OSS backend of volume plugin and fix its configuration dialog. * Add initial OSS support for the volume plugin * Use the new libqtxdg environment neutral API * Fix instantiation order * Plugin wording fixes * fixed version output and make it less verbose * cmake option to build without menu-cache even if it is installed * RGBA support for panel lxqt-panel-0.7.0 / 2014-04-30 ============================= * Avoid mnemonics in the main application menu caused by & symbol in the name of the desktop apps. lxqt-panel-0.6.99 / 2014-04-29 ============================== * Update AUTHORS and COPYING * Add CPack rules for creating tarball * Support libstatgrab 0.90 * Trivial fix * Fix zh_TW translation for networkmonitor. * Little fix for the previous commit * Delay loading of menu icons when they are about to be shown. * Delay the initiation of mount manager to speed up the startup of the mount plugin * Fix incorrect signal/slot connections. * Add a dirty hack to workaround bug #23 - Status icon for GTK3 applications present but not visible. * Improve handling of app menu tooltips. * Removed CMAKE_SOURCE_DIR usage from CMakeLists.txt * Fix bug #11 - moc generation error * Add missing lib linking for plugins. * Properly export symbols needed by plugins. * Include libsysstat cmake package correctly. * Use gcc visibility to reduce unnecessary symbol exports * Set NETWM icon geometry for task buttons while the panel is being resized or moved. * Removed unneeded variable in realign * Update NETWM icon geometry for task buttons. * Fix incorrect signal connection of ConfigPanelDialog::accept(). * Fix renaming bugs, replacing lxqt-qt with lxde-qt * Finish the crazy razor=>lxqt renaming tasks. * Create default panel on startup if panel/panels list in the config is empty. * Fix #5 Wrong panel size sometimes (happens randomly) * Fixed #6. Panel size fluctuated due to change in task buttons. * Fix drag and drop of application menu items. * Build main menu with libmenu-cache optionally to speed up loading greatly. * Replace razormount with lxqtmount and close bug #4. * Fix issue #1 by replacing razor includes with lxqt ones and use proper namespace. * Replace links to librazorqt with ${LXQT_LIBRARIES}. * Explicit namespace added to RotatedWidget class name * ICU can be found by cmake now * Fix incorrect header inclusion for lxqt-globalkeys-ui. * Rename razor-panel to lxqt-panel and fix broken build. * Use the latest liblxqt and liblxqt-globalkeys. * Empty taskbar collapses to zero size again - fixed * New resizing algorithm, now we set iconSize. * Delay when saving settings decreased to 3 seconds. * Add COPYING and AUTHORS * Fix for Issue #571 [try plugin] * Fixed issue #645 "Panel plugins settings cleanup" * QuckLaunch plugin. Placeholder takes all the available space, regardless of the number of rows of columns. * Fix for Issue #571 [quicklaunch plugin] * Add options for the razor-panel. Missing file * Add options for the razor-panel -h, --help Show help about options --version Show version information -c, --configfile=CONFIGFILE Use alternate configuration file * razor-desktop and razor-panel: Adds missing tr() to setWindowTitle() * razorqt-panel/panel: Replace "Delete Panel" by "Remove Panel" * razorqt-panel/panel: Use capitals for in menus and window titles * razorqt-panel/panel: Renames "Add plugins ..." to "Add Panel Widgets" * Removes hardcoded "Add plugin" window title * razorqt-panel/panel: Save settings right after the close button clicked * All spinboxes for panel config have step of 1 * Taskbar does not collapse when empty * Some plugin alignments fixed * Include polished * Panel plugin popups unified and are QDialog based now * Object renamed for easier theming * KBIndicator plugin initialization delayed * Correct tab set as default * Typo fixed * More verbose constants * C includes fixed * X11 Bool declaration conflict fixed * No dependencies on STL * Fix for issue #618 * Fix for issue #413 * Fix for Issue #531 This work for me in the OpenBox and KWin * fixed #455 Panel->automatic height setting (sensors layouting) * panel: add/remove panel in context menu. And it works. * Simplified global key shortcut action names since all panels share the same config file. * panel: single file config is used * Better text (issue #583) * Some improvements and optimizations in worldclock plugin * Main menu has "reset shortcut" feature * Unique panel & plugin identification * Global shortcuts client library added and all support for it refactored and fixed. * Crash on plugin removal fixed * Memory leak fixed * World clock has auto-rotation * Rotated widget requires content * Standard clock can be autorotated * A better name for config variable * Theme change makes properties update (issue #553 fix) * potential solution for #553 - Cpuload: adjust text color with theme * hotfix for hardcoded path in init - it's work in progress... * Add pcmanfm-qt to quicklaunch (when it's installed) * fixed #578: Please clarify/fix license in razorqt-panel/plugin-mount/mountbutton.* and menudiskitem.* * panel: more panels in one executable. It allows to start more panels in a time * initial implementation for #473 Highlight installed plugins. Now it needs to be "designed" * fixed #561: Feature: drag and drop of local file (URL) in panel taskbar * fix "shorcut" typo * panel: set panel position when screen resizes (used eg. in virtualization) * Fix typos * Fix Issue #564 for the mainmenu plugin #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Rename Maximum button width to Prefer button width in the taskbar * Fix Issue #564 for the mainmenu plugin #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix Issue #564 for non separate plugins #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix Issue #564 for the colorpicker #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix Issue #564 for the quicklaunch, set correct size for the placeHolder message #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix Issue #564 for the quicklaunch #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix Issues for the tray #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" * Fix for Issues #564 "new panel: cfg "Line size" can be set to 10px but the value is not accepted" #563 "new panel: vertical mode makes panel too lerge (width)" * optimized panel calculations for icons only mode * fix for taskbar's icon only view - autoreduce size expanding * Don't use separate Layout for Placeholder in the QuickLaunch. * Use separate Layout for Placeholder in the QuickLaunch. * Show placeholder if QuickLaunch is empty. * The DesktopSwitch buttons is strachable. * Use RazorGridLayout in the DesktopSwitch plugin. * Incorrect height for plugins on vert panel. * Disable TeaTime plugin * Improving the appearance of the mount popup - 2. * Improving the appearance of the mount popup. * The WorldClock plugin is separated * New plugin Dom tree, usable for theme writers. * Fix for "Set correct event_mask in the RazorTaskButton" breaks the button titles. https://github.com/Razor-qt/razor-qt/commit/c955007b951c7f4e35206a2f6e9d1911649bae10#commitcomment-2774274 * Kb indicator plugin simplified * Fix: If you add several plugins at once, RazorPanel::findNewPluginSettingsGroup allocated one name at all new plugins. * Removed panel HelloWorld plugin, you can use TeaTime as example plugin. Removed from razorqt-panel/CMakeLists.txt * Removed panel HelloWorld plugin, you can use TeaTime as example plugin. * The WorldClock plugin was ported * The KbIndicator plugin was ported * The SysStat plugin was ported * The Sensors plugin: settings().value to mPlugin->settings()->value * The Sensors plugin was ported * The NetworkMonitor plugin was ported * The CpuLoad plugin was ported * The ColorPicker plugin was ported * Remove garbage include directivies * The ShowDesktop plugin was ported * The ScreenSaver plugin was ported * Set correct event_mask in the RazorTaskButton * Refactored rezor-mount plugin, added DeviceAction classes. * The RazorPanel::calculatePopupWindowPos function handles the situation when the window is out of the screen. * The Mount plugin was ported * The QuckLaunch plugin was ported * Fixed #538 razor-panel: Restore (a minimized window) is not working while using Fluxb * Network Monitor plugin: provide interface list in configuration * Removed debug item from plugin menu * The DesktopSwitch plugin was ported * Now panel does not take ownership of the config dialog. * The Volume plugin was ported * Typo fixed * Mainmenu: Use xfitman to force focus when menu raised via shortcut * The Tray plugin was ported * Fix plugins list was saved incorrectly * Trivial fix for "sysstat/cpustat.hpp not found" * Style follows the Coding Standard * Main menu focus fixed if activated by hotkey * Sysstat panel plugin: collapse when vertical panel is autosizing prevented * RazorSysStat: fix build on ARM * Update layout when plugin shows. * Improved razorpanellayout and new razorgridlayout. * Fix for division by zero exception. * Layout for TaskBar * Create a rows on panel only if it's necessary (exists some plugin on this row). * New panel layout and many changes * Improve icons handling. * Clock panel plugin: update time once a minute if no seconds displayed * SysStat: license updated & unused files removed * Add strings to translate in volume plugin * Quicklaunch: Don't stack buttons on small panels * Panel WorldClock plugin: restart timer only if update interval is long * Panel WorldClock plugin: Smarter timer interval handling * plugin-clock: Don't try to get the firstDayofWeek from saved settings * fixed #484 Ugly mount plugin appearance without any mountpoints present * Panel Worldclock plugin: proper version dependency (issue #500) * Fix various build falures * Debug included back * Panel: Duplicated line removed * Remove ifdef nesting * Panel Clock plugin: epic failure fixed * Panel Clock plugin: comment with explanation added * Panel Clock plugin: C++-style casting used, multilevel if/else changed to switch/case, conversion formula simplified. * Panel Clock plugin: variable declarations moved to their usage places. * Panel Clock plugin: C locale initialised only once * Panel Clock plugin: Implementations reordered * plugin-mount: Don't add devices that are not usable * plugin-clock: Get locale LC_TIME from the environment * plugin-clock: Add missing word to a comment * plugin-clock: Check if _NL_TIME_WEEK_1STDAY exists * plugin-clock: Add documentation to firstDayOfWeek() * plugin-clock: Initialize variable at declaration. * plugin-clock: Declare one variable per line * plugin-clock: Use camelCase style for variables * Add myself to the authors list * plugin-clock: Fix first day of week auto-detection. Closes #489. * plugin-clock: Use nl_langinfo() only if available * WorldClock plugin: all timezones shown on middle click, styles updated * WorldClock plugin: local timezone used if no timezones selected * WorldClock plugin: Good default custom format set, synchroTimer removed, main timer sped up, popup calendar added with current day in a region supported * WorldClock plugin: mouse wheel supported * WorldClock plugin: main functionality works * Active timezone support improved * Time zones can be added to the main list * Time zone list built from ICU * Settings loaded and saved * Config added * Initial WorldClock plugin skeleton * SysStat plugin: Custom colours are in separate dialog * SysStat plugin: Colours and font are read from theme * potential solution for #484 - to display text placeholder when there is no item connected * Icon in the TeaTime plugin. * Plugin emit SettingsChanged only if really changes present * Fix build on older Qt * Trtanslations * Graph uses all available space * Class variables renamed * History preserved when possible in Sysstat plugin * Painting refactored in sysstat plugin * forced y-position clamping * Transparent background & theme-able container added * sysstat: a better fix for older Qt * panel systat plugin: a potential fix for older Qts * Handle QSS position property * panel-volume: add compile time switch for ALSA/Pulseaudio support * ClockPlugin was ported * Added IRazorPanelPlugin::calculatePopupWindowPos(), improvements. * Re-enable kbindicator plugin * More natural logarithmic scale * Control over logarithmic scale added * Dependency on internal library fixed * SysStat library and plugin * Separator between the screens in the select panel position combobox * Razor-panel: New plugin API * preliminary manpages primary for razorqt and usefully in venenux * Simplify code in the PowerManager * Do not display non-urgent notifications in fallback mode * Issue #460 fixed * Style polishing * Removed unnecessary copied code * unused member removed, code style is up to Coding Standards * mainmenu: position menu based on actual width of panel * Simpler configuration dialogue * Issue #426 addressed * Clock plugin simplified: no more custom fonts * More clear code * Translations updated * Translations updated * first part of fixes based on Coverity Scan (code static analysis) * Fixes notification in volume * Font set correctly on theme change * Custom font for clock plugin applied correctly * Typos found during translation * Panel Keyboard indicator plugin - Done * Panel Keyboard indicator plugin - skeleton * Translations * Delete bad en_GB translations * Update translations * Fix various typos * Fix menu for plugins with an ampersand * Translations updated * Removed line num from TS files. * panel-volume: remove unused translation file * panel-volume: Fix compilation issue when one of the AudioEngines not found * panel-volume: Fix runtime AudioEngine if multiple are available * panel-volume: Add logistics to change AudioEngine on runtime * Translations * Deleted old translation methods. * Translations for librazorqt * panel volume: show some icon when there is no device * panel-audio: do not crash audio plugin if there is no sound configured in the system * Fix middle-click config * convert annoying QMessageBox to RazorNotification * Make close-on-middle-click optional * Update panel plugin names and descriptions. Closes issue #361 * Lazy start and additional nullpoiter check in the razor-tray plugin. * variable fix for cmake * fixed #257 razor-panel segfaults - when there is no DBUS server running. The RzMountProvider's RazorMountDeviceList is not handled over pointer/casting anymore because QList is always implicitly shared. * New translation infrastructure * First day of week removed from UI * The first day of week autodetection * The first day of week autodetection * Closed Issue #382 * Updated .ts.src files * panel-volume: fix issue #362 about max volume - honor device max volume in pulseaudio as a default - add setting to ignore device max volume on pulseaudio * panel-volume: fix usage of volume adjust step when using scrollwheel * panel-volume: fix deadlock when sinkinfo retrieval failed * panel-volume: Use same icon in panel as well as in popup for mute toggle * Fix for Issue #290 Fails to build on BSD * panel-volume: Change mixer QPushButton to a QLabel The label includes a link-style text instead of the flat pushbutton, which lacks some indication on some QStyles like Cleanlooks * panel-volume: visual improvements - add mixer button with label instead of icon - add checkable pushbutton to mute on the popup * razor-panel/plugin-volume: Use center alignment * razor-panel: Sets the limits to the panel size (Ui) * razor-panel: Add panel config size limits (Ui) * razor-panel: Use PANEL_DEFAULT_SIZE instead of obscure 32s * razor-panel: Remove minimum size definition from the config ui * razor-panel: Refactor minimum panel size definition * New translations for razor-panel plugins * New translations for razor-panel * detect soub backends by proper cmake modules because of cmake variable errors on some systems; allow to be built with no pulse (ifdefs) * panel-volume: add settings defines - Use defines rather than strings for the setting names - Change settings default for mixer to 'qasmixer' for alsa - Change settings default for volume adjust step to 5 * panel-volume: Add volume adjust step - settings has now an item to adjust volume step - inc/dec volume on AudioDevice is remove as it depends on the settings step * panel-volume: Finally make members in AudioDevice private * panel-volume: - Receive updates on external volume changes for alsa - Fix alsa mute setter * panel-volume: Add alsa event handling, no usage yet * panel-volume: Try to get proper card name instead of card index * panel-volume: - Fix mute handling - Add mute setting for alsa backend * panel-volume: - Add initial alsa channel listing - Volume on selected alsa channel can now be set - No external volume changes are handled in alsa backend - No mute ability in alsa backend * panel-volume: - fix logic around mute and setVolume - Unmute is volume is reset from eg. inc/dec volume * panel-volume: add missing files * panel-volume: Add initial Alsa support, only detects devices so far for a start * panel-volume: qBound is much nicer, thanks for the hint from Alexander Sokolov * panel-volume: set proper fallback icon for mixer launcher * panel-volume: Fix global shortcuts. * panel-volume: fix bug in setVolume on device, stupid me * panel-volume: apply utf8 patch from Alexander Sokolov, thanks * panel-volume: add global shortcuts, yet not configurable * panel-volume: build fixes - add missing QMetaType include - add define for PA_VOLUME_UI_MAX, which is only defined since pulseaudio 0.9.23 * panel-volume: - make volumepopup member private - make volumeslider member private * panel-volume: - Rename slots to proper names - Remove unused destructor * panel-volume: Set slider value for initial volume value whenever the managed device changes * panel-volume: Rework pulseaudio state tracking to recover pulseaudio daemon shutdowns and/or restarts. * panel-volume: Expose ready state from pulseaudioengine * panel-volume: Rename method to what it actually does * panel-volume: Add guard when context is not ready * panel-volume: Improve internal context state tracking * panel-volume: Finally fix the default behavior to show popup * panel-volume: Fix creating instances in a different thread * panel-volume: No need to set the layout explicitly * panel-volume: Fix margin on popup layout * panel-volume: Click to show the volume popup is now the default * panel-volume: Fix settings dialog title * panel-volume: Make change wheel behavior on volume slider * panel-volume: Rename to 'Volume Control' * panel-volume: Fix configuration and add external mixer settings * panel-volume: use full volume range, even over 100% * panel-volume: Make device type private * panel-volume: Add mute toggle on middleclick * panel-volume: Launch pavucontrol as a default mixer * panel-volume: Fix segfault * panel-volume: Add middleclick option * panel-volume: Change icon accordingly to volume * panel-volume: Reflect external volume changes in slider * panel-volume: Start volume plugin * panel-volume: add settings defines - Use defines rather than strings for the setting names - Change settings default for mixer to 'qasmixer' for alsa - Change settings default for volume adjust step to 5 * razoor-panel: Adds Orientation property * razor-panel: Refactors useTheme variables names * razor-panel: Renames "Use theme size" to "Use automatic sizing" * panel-volume: Add volume adjust step - settings has now an item to adjust volume step - inc/dec volume on AudioDevice is remove as it depends on the settings step * panel-volume: Finally make members in AudioDevice private * panel-volume: - Receive updates on external volume changes for alsa - Fix alsa mute setter * panel-volume: Add alsa event handling, no usage yet * panel-volume: Try to get proper card name instead of card index * panel-volume: - Fix mute handling - Add mute setting for alsa backend * panel-volume: - Add initial alsa channel listing - Volume on selected alsa channel can now be set - No external volume changes are handled in alsa backend - No mute ability in alsa backend * panel-volume: - fix logic around mute and setVolume - Unmute is volume is reset from eg. inc/dec volume * panel-volume: add missing files * panel-volume: Add initial Alsa support, only detects devices so far for a start * panel-volume: qBound is much nicer, thanks for the hint from Alexander Sokolov * panel-volume: set proper fallback icon for mixer launcher * panel-volume: Fix global shortcuts. * panel-volume: fix bug in setVolume on device, stupid me * panel-volume: apply utf8 patch from Alexander Sokolov, thanks * panel-volume: add global shortcuts, yet not configurable * panel-volume: build fixes - add missing QMetaType include - add define for PA_VOLUME_UI_MAX, which is only defined since pulseaudio 0.9.23 * panel-volume: - make volumepopup member private - make volumeslider member private * panel-volume: - Rename slots to proper names - Remove unused destructor * panel-volume: Set slider value for initial volume value whenever the managed device changes * panel-volume: Rework pulseaudio state tracking to recover pulseaudio daemon shutdowns and/or restarts. * panel-volume: Expose ready state from pulseaudioengine * panel-volume: Rename method to what it actually does * panel-volume: Add guard when context is not ready * panel-volume: Improve internal context state tracking * panel-volume: Finally fix the default behavior to show popup * panel-volume: Fix creating instances in a different thread * panel-volume: No need to set the layout explicitly * panel-volume: Fix margin on popup layout * panel-volume: Click to show the volume popup is now the default * panel-volume: Fix settings dialog title * panel-volume: Make change wheel behavior on volume slider * panel-volume: Rename to 'Volume Control' * panel-volume: Fix configuration and add external mixer settings * panel-volume: use full volume range, even over 100% * panel-volume: Make device type private * panel-volume: Add mute toggle on middleclick * panel-volume: Launch pavucontrol as a default mixer * panel-volume: Fix segfault * panel-volume: Add middleclick option * panel-volume: Change icon accordingly to volume * panel-volume: Reflect external volume changes in slider * panel-volume: Start volume plugin * razor-panel: Adjust panel size on plugin load/remove * RazorCpuLoad bar has configurable orientation * Updated ts.src files * Panel clock plugin: first day of week is configurable in popup calendar * Panel clock plugin: tooltip returned back * networkmonitor: reformat (tabs to spaces) * networkmonitor: Use appropriate units * razor-panel: Replace 'Delete' by 'Remove'. Closes #339 * razor-panel: Read the panel size value when not using the theme size * part of #329: on-click on notification launces default action or it tries to find appropariate window to raise; xfitman method renamed + one new * colorpicker: get rid of all the hairy X11 code * Fix indent * Color picker as panel plugin, it doesn't change cursor icon yet. * Syntax fixed * Prevented potential index overflow problem * Reordering with context menus fixed * Showdesktop: display notification instead of a popup * removed complaining invalid signal-slot connection * Themes supported * Second line visibility fixed * Labels renamed * Better layout * configure clock font size (issue #213) * Show calendar only on left-click * [297] Sensors panel plugin - blink progress bar when the temperature is too high * issue #276: annoying sub-menu removed * razor-panel: Adds mount to the default plugin list * Fix comma * razor-panel: Setup Configure Panel>Panel size Ui properly * Implement Actions and add some more functions * Implement new RazorNotification class * Ts.src files updated. * Language name zh_CN.GB2312 braked cmake process. * Translations updated * [193] lm-sensors applet for panel [missing Qt parent assignment to the widgets] * [193] lm-sensors applet for panel [sensors_cleanup fix] * Fix a problem with colors * Issue # 276 Panel context menus redesign * [193] lm-sensors applet for panel [feature index out of bounds fixed] * [193] lm-sensors applet for panel [more debug info added] * [193] lm-sensors applet for panel [more debug info added] * qt<4.7 compilation fix * fix compilation for qt4.6.x * [193] lm-sensors applet for panel * quicklaunch: fixed layouting (matrix, horiz/vert. panel) broken by previous commit * fixed #252 [quicklaunch] issue dragging from qtfm * Move panel position into the configuration dialog * Convert Panel config dialog to use RazorConfigDialog * Environments should be "Razor", not "RAZOR" Thanks Alec Moskvin * Fixed for Preloading menu * panel cpu plugin: allow user to setup update interval (1sec is default now instead of 0.5). It can drastically reduce CPU load caused bu this plugin * Move lock screen back in root menu, per amoskvin * tooltip workaround uses notification system * Move Lock Screen to the Leave submenu (#210) * GUI for change razor theme. * Close application by middle click. * Set window titles for use with WM's like fvwm * Typos in code. Thanks Aaron Lewis. * In razor-runner , providers item: title() was typed as tile() * For RazorSettings class , settingsChanged() was typed as settigsChanged() * Network monitor: don't needlessly set the tooltip * install fix for panel's network monitor * Improve size of cpu monitor on change of panel orientation. * Fixed error on network interface down. * Nemo is renamed to NetworkMonitor * Fixed init settings of panel-plugin network monitor. * Added Netwok Monitor plugin for razor-panel. * Added configuration. * Fixed text cropping (when 100% cpu usage). * fix default value for custom panel size * /etc/xdg can vary on some system. Autodetected using qmake in cmake run. * Properly show &'s in taskbar * fix for cpuload plugin installation. cmake re-run needed. * Preloading menu in the main menu plugin. * Revert "Global shortcuts now based on PSI code." * Revert "The panel did not receive the focus." * The panel did not receive the focus. * Global shortcuts now based on PSI code * warning if there is no libstatgrab found * Hide main menu when it's visible. Thanks Aaron Lewis. * Closes #224: Application menu button don't show full text/icon when text is selected * Config corresponds XDG directory specification * Transifex desktop: sr_BA.ts should be a local * Transifex desktop: local translations * Transifex desktop: cmake files * Transifex desktop: Translations pulled * Transifex desktop: Reomove translations from desktop.in * Transifex desktop: desktop->desktop.in * Update Tradidtional Chinese Translations * CpuLoad plugin required libstatgrab. * Committer:stuarch modified: razorqt-desktop/config/razor-config-desktop.desktop modified: razorqt-desktop/desktop-razor/plugin-analogclock/resources/analogclock.desktop new file: razorqt-desktop/desktop-razor/plugin-analogclock/translations/analogclock_zh_TW.ts modified: razorqt-desktop/desktop-razor/plugin-helloworld/resources/helloworld.desktop modified: razorqt-desktop/desktop-razor/plugin-iconview/resources/iconview.desktop modified: razorqt-desktop/desktop-razor/plugin-notepad/resources/notepad.desktop new file: razorqt-panel/panel/translations/razor-panel_zh_TW.ts modified: razorqt-panel/plugin-clock/resources/clock.desktop new file: razorqt-panel/plugin-clock/translations/clock_zh_TW.ts modified: razorqt-panel/plugin-desktopswitch/resources/desktopswitch.desktop new file: razorqt-panel/plugin-desktopswitch/translations/desktopswitch_zh_TW.ts modified: razorqt-panel/plugin-helloworld/resources/panelhelloworld.desktop modified: razorqt-panel/plugin-mainmenu/resources/mainmenu.desktop new file: razorqt-panel/plugin-mainmenu/translations/mainmenu_zh_TW.ts modified: razorqt-panel/plugin-mount/resources/mount.desktop new file: razorqt-panel/plugin-mount/translations/mount_zh_TW.ts modified: razorqt-panel/plugin-quicklaunch/resources/quicklaunch.desktop new file: razorqt-panel/plugin-quicklaunch/translations/quicklaunch_zh_TW.ts new file: razorqt-panel/plugin-screensaver/translations/screensaver_zh_TW.ts * Changing box layout to grid layout in quick launch plugin * Translations update * Added support for the online translation service. www.transifex.net * RazorApplication class implemented; all modules ported to this class * Update razorqt-panel/panel/translations/razor-panel_it_IT.ts * A lot of renames. * CpuLoad depends on Linux. It doesn't work on BSD (using /proc). * CpuLoad-plugin height fixed on changing of panel position. * Serbian translation files * Serbian translations (2 variants) * Removed dead slots declarations. * Added simple cpu monitor. * Greek translation by iosifidis * Improved searching for devices in the mount plugin. * Fix desktopswitch shrinking on panel resize * Ensure Desktopswitch buttons are all the same size * Plugins alignments depends on the panel positions. * Added danish translations * Russian translation * Panel plugins not found .ts files * Save quicklaunch button position after moving * Grey out "All Desktops" when window is on all desktops * Grey out "All Desktops" when window is on all desktops * Change Height/Width to Size/Length in panel dialog * The razormount library now based on the providers. * Set a default panel height * The razormount library now based on the providers. * Make remaining plugins expand * Fix - icons are clickable on all button area. * Closes #131 Closes #181 Vertical panel fixed. All plugins should look good. * Fix a typo * edit my email address * fix #169: italian translation * Finish the code for clock's popup calendar * Put Move and Delete into plugins' context menus * Vertical panel. Improved layouting in plugins * Env variables for plugins dirs RAZORQT_DESKTOP_PLUGINS_DIR & RAZORQT_DESKTOP_PLUGINS_SO_DIR RAZORQT_PANEL_PLUGINS_DIR & RAZORQT_PANEL_PLUGINS_SO_DIR * Relicense panel & runner * Relicense panel * The panel is not correctly positioned in the dual-monitor configurations. * cmake fix * razormount rewritten (lgpl2+) * Fix gmail.ru -> gmail.com * Hello World plugin for panel * original and our code compared - it seems 99% rewritem so it's relicensed to lgpl2+ * Clean up configure panel dialog * close panel/desktop in the debug builds - for development * Czech translations (cs_CZ) Desktop files * SVK translation finalized * Replaces return"" by return QString() * Closes #128 * More translation to german * more work done * Initial german release, only a tiny part * Add "Configure" to plugins' context menus * Fix crash due to null pointer * Fix issue #116 * License audit * implemented #49: keyboard shortcut for main menu * Add Chinese(simplified) translation files. * Switch scroll direction for the pager * Switch windows when scrolling over taskbar * Hide moved window (properly this time) * Apply previous typo fix to newly-added translations * HU translation by Kristóf Kiszel * Fix another typo * Fix typo * Fix Taskbar in "Show windows from current desktop" mode * added ability to change panel height/width/alignment * Initial spanish translation * razorqt-panel: use MODULE type for plugin libraries * Add Slovak (sk) translation * Adds newline to the end of .desktop files * initial. added ability to change panel height * Set tooltip only when the tooltip is shown * Czech translations (cs_CZ) * Fix a few typos * XdgDesktopFile is implicitly shared * huge refactoring of the libraries build organization * Initialize order fixed * Init values in tray plugin * Mem leak in mount plugin & lib * showdesktop: a bettre fix * fixed memleak for panel/showdesktop (X11 deallocation) * handle actions and its parents correctly * only for debug builds: enable "exit" action in the context menu (for valgrind checking) * Fix russian translation * Fix russian translation * fixed crash in the quicklaunch on the new suse 12.1 * Fix: segfaults when panel orientation is changed * Fix: In Fedora 16 tray icons are invisible. * quicklaunch: do not change button order when you drag'n'drop different mimetype * quicklaunch: "title" action in the context menu too * QuickLauncher: Programs do not run, fixed. * QuickLauncher: Added: * Removing the buttons by dragging. * The menu items "move left" and "move right". * forgotten files. Sorry. * quicklaunch: editable icons - delete and move (ctrl+drag) * Mount: Mount/unmount hide popup dialog * Panel screensaver: Fix in RU translation. * refresh desktop switch names on change too * XfitMan: fix for XfitMan::getDesktopNames() * XfitMan: fix for XfitMan::getDesktopNames() * potential fix for "one desktop in openbox" panel crash * RazorPanel: New icon theme handler for razor-panel plugins. * RazorPanel: IconThemeChanged handler for razor-panel. * New icon theme handler. * iconThemeChanged handler for plugin-showdesktop * iconThemeChanged handler for plugin-mount * iconThemeChanged handler for plugin-quicklaunch * iconThemeChanged handler for taskbar * iconThemeChanged handler for mainmenu * Razor-panel: iconThemeChanged & razorThemeChanged functions for plugins. * Fix for wrong translations of the panel plugins. * GPL->LGPL where I'm the author * GPL->LGPL where I'm the author * Issue #50 razor-mount: Filemanager can open dirs with whitespace in mount points. * Plugins translations * Translation for session * Polish translation part X * Fix: Desktop Menu Specification category must be X-RAZOR. * Russian translations * Russian translations. * Fixes in polish translation * Polish translation. Closes #46 * Closes #43 * first part of fix for #48 * fix for "remove/add device" in virtualbox * Mount plugin: Workaround about duplication of items. * Mount plugin: Debug messages for "Except that newly inserted CD/DVD is shown twice in the menu widget (using virtualbox)" * Mount plugin: If the dialog is visible, the button is depressed. * Mount plugin: A popup window is hidden when the panel changes position. * Mount plugin: Fix, on dual monitor configurations, popup window always showed on a first monitor. * New popup window in mount plugin. * potential fix (workaround) from #40: XdgMenu does not display environment related items * udev configuration handling; minimal version requirements * qt4.6 fix for application default icon name * Translation for mount plugin * Configure dialog for mount plugin * In the menu use the ToolButton instead of diskIcon and diskLabel. This looks nicer. * Fixed: Click on the mount button, doing nothing. * Fixed: At first start the names already mounted devices are not visible. * better icon for #39 The appearance of the mount plugin.; tooltip too * fixed (workaround before real event notifications) #42 mount plugin: display notifications when connected * Don't use bool typed member to check _NET_SHOWING_DESKTOP property, use Xlib API instead * Add Ctrl+F(1|2|3|4...) to switch virtual desktops * Shortcut for showing desktop, also restore windows on another hit * issue #39 - fix the unmount icon/button drawing * homepage updated + auto replacement script * mounting: initial status (mounted/unmounted) when starting * icons logic for removable media * initial revision of "removable media" support. Still lots to do but it's functional * Potential fix2 for issue #18: Panel clock plugin changes your size * XDG-files are split into qtxdg library. * new panel plugin: "show desktop" * Polish translation * Panel plugins can use translation now * Panel plugins: clock, mainmenu and taskbar translate.h fix. * fix for build (includes) * Dialog name changed. Menu file path fix. * MainMenu plugin configuration window. Closes #16 * potential fix for issue #18: Panel clock plugin changes your size * fix for #4 BadWindow when a window is closed * removed unneeded call * directories dupport for quicklaunch * support for regular files in the quicklaunch * initial support for drop events in the quicklaunch panel plugin * Closes #1 * RazorTaskButton: Don't accept the drag event * Small RazorClockConfiguration fixes. RazorTaskbarConfiguration use RazorSettingsCache now. * RazorClockConfiguration small fixes and improvements proposed by Alex. RazorClockConfiguration use RazorSettingsCache. Testing new HIG - Reset/Close. Signed-off-by: Maciej Płaza * Task manager configuration window. Task button with only Icon isn't so big now. User can decide about task button max width. * Removed accepChanges() declaration * Clock configuration * global key shortcut is a new library for razor; plugins updated * RazorTaskButton with D'n'D support * Animates the mouse movement to the position of the panel plugin that will be moved * final port to new settings class; desktopbackgrounddialog improved with initial loading values * Add: MainMenu tracks changes in the installed programs. * The project uses RazorTheme. All except the desktop, switched to RazorSettings. * Remuved garbage from help. * initial support for screensaver/screen locking * Added RazorTheme class. * Fixed multithreaded building. Thanks Gustavo. * Plugin config dialogs infrastructure. Instead, RazorPanelPlugin::preferredAlignment() introduced RazorPanelPlugin::flags method. * New RazorSettings class. Now ReadSettings is deprecated. Use RazorSettings instead. * Separate dir for XdgMenu. Fixed includes. * Feature 3316330: Tasks from one desktop. Task Manager should have option to show tasks only from one (active) desktop. Now it shows all tasks. Without config GUI. * Feature 3316331: Task Manager - only icon/text. Task Manager should have ability to show only name or icon (or both) of task. Without config GUI. * Bug 3314795: The panel is not in the bottom of screen. * Tracker 3314481: Elided text in the taskbar buttons * Segfault in MainMenu if xdg-menu file not found. * Copyright * Copyright * Fixed segfault in tray plugin. * set default razor icon for all apps * The settings are saved immediately after the change. * lib_suffix location improved * Logout dialog in main menu. * Removed "Exit" item on panel menu. * Fix: Missing cmake checks 2. * Fix: Missing cmake checks. * Fix: Segmetation fault on desktopswitch. * Fix: Removed saveSettings method from plugins. * Plugin-clock: added tooltip. * From XdgIcon deleted parameter "size". * move addplugindialog into shared lib for panel and desktop * New /usr/share & ~/razor directory structure. * Added: Add plugin dialog. * initial horizontal panels * Translations. * In the thene you can specify the tray icon size. * RazorPanel2 now is main panel. * Legacy panel * Mainmrnu plugin added * battery icon names fixed * fixed build cmake warnings * XfitMan.setStrut allowed to reserve a place only from bottom. * better XDG handling * initial support for desktop files in quicklaunch * Changed config param style to "param_style". Added well known menu files. * fixed crash when there is only one desktop available * forgotten refactored getClientList * clocks are placed without additional unrequired space again * clocks are correct in vertical panels too * make quicklaunch vertically friendly, part II (final hopefully) * make quicklaunch vertically friendly * MainMenu plugin: Added log out menu * Added XdgDesktopFile::icon method * New version of main menu plugin * allow to specify quicklaunch button size (like on netbooks) * removed unused files * better fix for tasks layout * include fix; kdm/gdm/*dm session file; fix for taskbar resizing * panel alignment works now (top/left, center, bottom/right) * typos fixed in battery plugin; icon auto-size * You can enable and disable plugins using cmake options. * The new realization of librasorqt * XdgEnv * XdgDesktopFile * XdgMenu * experimental: battery plugin for laptops * better sizing in systray * forgotten paths * vertical panels work basically * configuration reworked (may require to drop ~/.razor); plugins code split; new plugin: spacer * panel plugins are modularized now; simplified plugin loading * minor layouting changes * patch from alex to load relative qss url * fixed clock behavior for sizing. Using sizeHint now. * panel plugins share API layout; don't freeze trying to load non-existing theme; experimental value placeholders in QSS * initial refactoring for common plugin handling. Work in progress. Done: * all plugins are using the same base class * all plugins can handle dynamic resizing (eg. systray can be smaller after embed app close, taskbar occupies all available space...) * all is fully scriptable with QSS - some layout glitches have to be fixed * initial API for plugins. No other changes in functionality yet * Made RazorHal mounting/unmounting work and added a new function to Xfitman for checking if a window wants attention _NET_WM_WINDOW_DEMANDS_ATTENTION - tried to get the buttons at the taskmanager to glow when this is true but it didnt work.. * do not set layout too many times * avoid huge moving of widgets after 1st clocks update * src formatted with astyle -A1 * settings refactored a bit: SHARE_DIR dependen on th CMAKE_INSTALL_PREFIX is defined for the compilation phase (it allows to have more razors installed eg. for development); SHARE_DIR is searched in the startup too; optimized cfg file access (1x vs. 4x as before for every file); redundant conversions merged into Razorsettings; usage of QSettings to read the settings (it does the error handling for us). * implementation of the 'quicklaunch icons' (Razorspinbutton like widget); disabled some debug outputs; tooltips enabled for panel widgets * fixed cmake stuff (debug,lib location,do not install .svn,make uninstall,etc.); fixes for qss skinning ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.18.0 FATAL_ERROR) # CMP0000: Call the cmake_minimum_required() command at the beginning of the top-level # CMakeLists.txt file even before calling the project() command. # The cmake_minimum_required(VERSION) command implicitly invokes the cmake_policy(VERSION) # command to specify that the current project code is written for the given range of CMake # versions. project(lxqt-panel) option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF) option(WITH_SCREENSAVER_FALLBACK "Include support for converting the deprecated 'screensaver' plugin to 'quicklaunch'. This requires the lxqt-leave (lxqt-session) to be installed in runtime." ON) # additional cmake files set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) macro(setByDefault VAR_NAME VAR_VALUE) if(NOT DEFINED ${VAR_NAME}) set (${VAR_NAME} ${VAR_VALUE}) endif(NOT DEFINED ${VAR_NAME}) endmacro() include(GNUInstallDirs) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(REQUIRED_QT_VERSION "6.6.0") set(KF6_MINIMUM_VERSION "6.0.0") set(LXQT_GLOBALKEYS_MINIMUM_VERSION "2.4.0") set(LXQT_MINIMUM_VERSION "2.4.0") find_package(Qt6DBus ${REQUIRED_QT_VERSION} REQUIRED) find_package(Qt6LinguistTools ${REQUIRED_QT_VERSION} REQUIRED) find_package(Qt6Widgets ${REQUIRED_QT_VERSION} REQUIRED) find_package(Qt6Xml ${REQUIRED_QT_VERSION} REQUIRED) find_package(KF6WindowSystem ${KF6_MINIMUM_VERSION} REQUIRED) find_package(lxqt ${LXQT_MINIMUM_VERSION} REQUIRED) find_package(lxqt-globalkeys-ui ${LXQT_GLOBALKEYS_MINIMUM_VERSION} REQUIRED) find_package(lxqt-menu-data ${LXQT_MINIMUM_VERSION} REQUIRED) find_package(LayerShellQt REQUIRED) if (Qt6Gui_VERSION VERSION_GREATER_EQUAL "6.10.0") find_package(Qt6GuiPrivate REQUIRED) find_package(Qt6WaylandClientPrivate REQUIRED) endif() # Patch Version set(LXQT_PANEL_PATCH_VERSION 0) set(LXQT_PANEL_VERSION ${LXQT_MAJOR_VERSION}.${LXQT_MINOR_VERSION}.${LXQT_PANEL_PATCH_VERSION}) add_definitions("-DLXQT_PANEL_VERSION=\"${LXQT_PANEL_VERSION}\"") include(LXQtPreventInSourceBuilds) include(LXQtTranslate) # All LXQtCompilerSettings except CMAKE_MODULE_LINKER_FLAGS work just fine # So we reset only these Flags after loading LXQtCompilerSettings # lxqt-build-tools: # set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--no-undefined ${SYMBOLIC_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}") message(STATUS "==OLD== CMAKE_MODULE_LINKER_FLAGS: ${CMAKE_MODULE_LINKER_FLAGS}") set( OLD_CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") include(LXQtCompilerSettings NO_POLICY_SCOPE) set(CMAKE_MODULE_LINKER_FLAGS "${OLD_CMAKE_MODULE_LINKER_FLAGS} ${SYMBOLIC_FLAGS}") # Warning: This must be before add_subdirectory(panel). Move with caution. set(PLUGIN_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/lxqt-panel") add_definitions( -DPLUGIN_DIR=\"${PLUGIN_DIR}\" ) message(STATUS "CMAKE Module linker flags: ${CMAKE_MODULE_LINKER_FLAGS}") message(STATUS "Panel plugins location: ${PLUGIN_DIR}") ######################################################################### # Plugin system # You can enable/disable building of the plugin using cmake options. # cmake -DWORLDCLOCK_PLUGIN=Yes .. # Enable worldclock plugin # cmake -DWORLDCLOCK_PLUGIN=No .. # Disable worldclock plugin include("cmake/BuildPlugin.cmake") set(ENABLED_PLUGINS) # list of enabled plugins set(STATIC_PLUGINS) # list of statically linked plugins setByDefault(COLORPICKER_PLUGIN Yes) if(COLORPICKER_PLUGIN) list(APPEND ENABLED_PLUGINS "Color Picker") add_subdirectory(plugin-colorpicker) endif() setByDefault(CPULOAD_PLUGIN Yes) if(CPULOAD_PLUGIN) find_library(STATGRAB_LIB statgrab) if(NOT STATGRAB_LIB) message(FATAL_ERROR "CPU Load plugin requires libstatgrab") endif() list(APPEND ENABLED_PLUGINS "Cpu Load") add_subdirectory(plugin-cpuload) endif() setByDefault(CUSTOMCOMMAND_PLUGIN Yes) if(CUSTOMCOMMAND_PLUGIN) list(APPEND ENABLED_PLUGINS "Custom Command") add_subdirectory(plugin-customcommand) endif() setByDefault(DIRECTORYMENU_PLUGIN Yes) if(DIRECTORYMENU_PLUGIN) list(APPEND ENABLED_PLUGINS "Directory menu") add_subdirectory(plugin-directorymenu) endif() setByDefault(DOM_PLUGIN Yes) if(DOM_PLUGIN) list(APPEND ENABLED_PLUGINS "DOM") add_subdirectory(plugin-dom) endif(DOM_PLUGIN) setByDefault(DESKTOPSWITCH_PLUGIN Yes) if(DESKTOPSWITCH_PLUGIN) list(APPEND STATIC_PLUGINS "desktopswitch") add_definitions(-DWITH_DESKTOPSWITCH_PLUGIN) list(APPEND ENABLED_PLUGINS "Desktop Switcher") add_subdirectory(plugin-desktopswitch) endif() setByDefault(FANCYMENU_PLUGIN Yes) if(FANCYMENU_PLUGIN) list(APPEND STATIC_PLUGINS "fancymenu") add_definitions(-DWITH_FANCYMENU_PLUGIN) list(APPEND ENABLED_PLUGINS "Application fancy menu") add_subdirectory(plugin-fancymenu) endif() setByDefault(KBINDICATOR_PLUGIN Yes) if(KBINDICATOR_PLUGIN) list(APPEND ENABLED_PLUGINS "Keyboard Indicator") add_subdirectory(plugin-kbindicator) endif(KBINDICATOR_PLUGIN) setByDefault(MAINMENU_PLUGIN Yes) if(MAINMENU_PLUGIN) list(APPEND STATIC_PLUGINS "mainmenu") add_definitions(-DWITH_MAINMENU_PLUGIN) list(APPEND ENABLED_PLUGINS "Application menu") add_subdirectory(plugin-mainmenu) endif() setByDefault(MOUNT_PLUGIN Yes) if(MOUNT_PLUGIN) list(APPEND ENABLED_PLUGINS "Mount") add_subdirectory(plugin-mount) endif(MOUNT_PLUGIN) setByDefault(QUICKLAUNCH_PLUGIN Yes) if(QUICKLAUNCH_PLUGIN) list(APPEND STATIC_PLUGINS "quicklaunch") add_definitions(-DWITH_QUICKLAUNCH_PLUGIN) list(APPEND ENABLED_PLUGINS "Quicklaunch") add_subdirectory(plugin-quicklaunch) endif() setByDefault(SENSORS_PLUGIN Yes) if(SENSORS_PLUGIN) find_library(SENSORS_LIB sensors) if(NOT SENSORS_LIB) message(FATAL_ERROR "Sensors plugin requires libsensors") endif() list(APPEND ENABLED_PLUGINS "Sensors") add_subdirectory(plugin-sensors) endif() setByDefault(SHOWDESKTOP_PLUGIN Yes) if(SHOWDESKTOP_PLUGIN) list(APPEND STATIC_PLUGINS "showdesktop") add_definitions(-DWITH_SHOWDESKTOP_PLUGIN) list(APPEND ENABLED_PLUGINS "Show Desktop") add_subdirectory(plugin-showdesktop) endif() setByDefault(QEYES_PLUGIN Yes) if(QEYES_PLUGIN) list(APPEND ENABLED_PLUGINS "QEyes") add_subdirectory(plugin-qeyes) endif() setByDefault(NETWORKMONITOR_PLUGIN Yes) if(NETWORKMONITOR_PLUGIN) find_library(STATGRAB_LIB statgrab) if(NOT STATGRAB_LIB) message(FATAL_ERROR "Network Monitor plugin requires libstatgrab") endif() list(APPEND ENABLED_PLUGINS "Network Monitor") add_subdirectory(plugin-networkmonitor) endif() setByDefault(SYSSTAT_PLUGIN Yes) if(SYSSTAT_PLUGIN) list(APPEND ENABLED_PLUGINS "System Stats") add_subdirectory(plugin-sysstat) endif(SYSSTAT_PLUGIN) setByDefault(TASKBAR_PLUGIN Yes) if(TASKBAR_PLUGIN) list(APPEND STATIC_PLUGINS "taskbar") add_definitions(-DWITH_TASKBAR_PLUGIN) list(APPEND ENABLED_PLUGINS "Taskbar") add_subdirectory(plugin-taskbar) endif() setByDefault(STATUSNOTIFIER_PLUGIN Yes) if(STATUSNOTIFIER_PLUGIN) list(APPEND STATIC_PLUGINS "statusnotifier") add_definitions(-DWITH_STATUSNOTIFIER_PLUGIN) list(APPEND ENABLED_PLUGINS "Status Notifier") add_subdirectory(plugin-statusnotifier) endif() setByDefault(TRAY_PLUGIN Yes) if(TRAY_PLUGIN) list(APPEND STATIC_PLUGINS "tray") add_definitions(-DWITH_TRAY_PLUGIN) list(APPEND ENABLED_PLUGINS "System Tray") add_subdirectory(plugin-tray) endif() setByDefault(VOLUME_PLUGIN Yes) setByDefault(VOLUME_USE_PULSEAUDIO Yes) setByDefault(VOLUME_USE_ALSA Yes) if(VOLUME_PLUGIN) if (VOLUME_USE_PULSEAUDIO) find_package(PulseAudio) if (NOT PULSEAUDIO_FOUND) message(FATAL_ERROR "PulseAudio not found, but required (VOLUME_USE_PULSEAUDIO) for Volume plugin!") endif () endif(VOLUME_USE_PULSEAUDIO) if(VOLUME_USE_ALSA) find_package(ALSA) if (NOT ALSA_FOUND) message(FATAL_ERROR "ALSA not found, but required (VOLUME_USE_ALSA) for Volume plugin!") endif () endif() list(APPEND ENABLED_PLUGINS "Volume") message(STATUS "") message(STATUS "Volume plugin will be built") message(STATUS " ALSA: ${ALSA_FOUND}") message(STATUS " PulseAudio: ${PULSEAUDIO_FOUND}") message(STATUS "") add_subdirectory(plugin-volume) endif() setByDefault(WORLDCLOCK_PLUGIN Yes) if(WORLDCLOCK_PLUGIN) list(APPEND STATIC_PLUGINS "worldclock") add_definitions(-DWITH_WORLDCLOCK_PLUGIN) list(APPEND ENABLED_PLUGINS "World Clock") add_subdirectory(plugin-worldclock) endif(WORLDCLOCK_PLUGIN) setByDefault(SPACER_PLUGIN Yes) if(SPACER_PLUGIN) list(APPEND STATIC_PLUGINS "spacer") add_definitions(-DWITH_SPACER_PLUGIN) list(APPEND ENABLED_PLUGINS "Spacer") add_subdirectory(plugin-spacer) endif() setByDefault(BACKLIGHT_PLUGIN Yes) if(BACKLIGHT_PLUGIN) list(APPEND ENABLED_PLUGINS "Backlight") add_subdirectory(plugin-backlight) endif() ######################################################################### message(STATUS "**************** The following plugins will be built ****************") foreach (PLUGIN_STR ${ENABLED_PLUGINS}) message(STATUS " ${PLUGIN_STR}") endforeach() message(STATUS "*********************************************************************") add_subdirectory(panel) # merged from lxqt-common add_subdirectory(autostart) ================================================ FILE: LICENSE ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ================================================ FILE: README.md ================================================ # lxqt-panel ## Overview `lxqt-panel` represents the taskbar of LXQt. The elements available in lxqt-panel are called "plugin" technically. This applies e. g. to the source code where they reside in directories `./plugin-` like `plugin-mainmenu`. In contrast to this they are called "widgets" by the configuration GUI so far. Also, a more descriptive term is used to refer to distinct plugins within the GUI. E. g. the aforementioned `plugin-mainmenu` is called "Application menu" that way. Configuration dialogue "Add Plugins", see [below](https://github.com/lxqt/lxqt-panel#customizing), is listing all available plugins plus a short description and hence provides an overview of the available ones. Notes on some of the plugins, sorted by terms used within the GUI in alphabetical order, technical term in parenthesis: #### Custom Command (plugin-customcommand) Allows showing the output of commands or scripts on the panel, as text or images, and executing commands on click and/or wheel up/down. ![Custom command plugin settings](customcommand.png) #### Date & time / World clock (plugin-worldclock) Provides clock and calendar functionality and can display various time zones in addition. #### Quick launch (plugin-quicklaunch) A plugin to launch applications from the panel. By default it is empty and displays a message "Drop application icons here". Applications need to be available in fancy menu or main menu and can be included into plugin-quicklaunch by drag & drop. #### Status Notifier Plugin (plugin-statusnotifier) / System Tray (plugin-tray) Status notifier plugin provides a notification area within the panel, that is an area where arbitrary applications can place informational icons. This is frequently used e. g. by chat or mail clients to inform about incoming messages or tools configuring the network to inform about connections. (So it's some kind of counterpart to the desktop notifications displayed by [lxqt-notificationd](https://github.com/lxqt/lxqt-notificationd)). The difference between the two plugins is a technical one: * **plugin-tray** is implementing the so-called [System Tray Protocol](https://www.freedesktop.org/wiki/Specifications/systemtray-spec). It's a specification that has been around for years but has some serious technical limitations and in particular won't work under Wayland. This plugin only translates "System Tray Protocol" entities into SNI ones, so it does not provide any visible area in panel. * **plugin-statusnotifier** is implementing the so-called [StatusNotifierItem (SNI)](https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem) specification which can be considered a successor of the System Tray Protocol. Both plugins are maintained in parallel as not all relevant applications are compatible with SNI so far. In particular both Qt 4 and all GTK applications need some kind of wrapper to deal with it. Both plugins can be used in parallel without any issue, applications supporting both specifications will normally chose to display their icons in plugin-statusnotifier. #### Volume control (plugin-volume) As indicated by the name, a volume control. Technically Alsa, OSS and PulseAudio can be used as backend. The plugin itself is providing a control to adjust the main volume only but it allows for launching specific UIs of the backend in use like e. g. [pavucontrol-qt](https://github.com/lxqt/pavucontrol-qt) to adjust PulseAudio. ### Wayland Backends Wayland backends enable some functionalities related to task-bar as well as desktop switching and showing desktop. Three Wayland backends are available: kwin_wayland, Wayfire and one for wlroots-compatible compositors. They are automatically detected for all seven compositors that are currently supported. In addition, the backend to load can be forced manually for any desktop specified in XDG_CURRENT_DESKTOP by a comma-separated list in ~/.config/lxqt/panel.conf: ``` [General] … preferred_backend=labwc:wlroots, niri:wlroots, xyz:my_own_backend … ``` ## Installation ### Compiling source code The runtime dependencies are libxtst, layershell-qt, KGuiAddons, KWindowSystem, Solid, [lxqt-menu-data](https://github.com/lxqt/lxqt-menu-data), [liblxqt](https://github.com/lxqt/liblxqt), [libdbusmenu-lxqt](https://github.com/lxqt/libdbusmenu-lxqt) and [lxqt-globalkeys](https://github.com/lxqt/lxqt-globalkeys). Several plugins or features thereof are optional and need additional runtime dependencies. Namely these are (plugin / feature in parenthesis) Alsa library (Alsa support in plugin-volume), PulseAudio client library (PulseAudio support in plugin-volume), lm-sensors (plugin-sensors), libstatgrab (plugin-cpuload, plugin-networkmonitor), [libsysstat](https://github.com/lxqt/libsysstat) (plugin-sysstat). All of them are enabled by default and have to be disabled by CMake variables as required, see below. In addition CMake and [lxqt-build-tools](https://github.com/lxqt/lxqt-build-tools) are mandatory build dependencies. Git is optionally needed to pull latest VCS checkouts. Code configuration is handled by CMake. CMake variable `CMAKE_INSTALL_PREFIX` has to be set to `/usr` on most operating systems, depending on the way library paths are dealt with on 64bit systems variables like CMAKE_INSTALL_LIBDIR may have to be set as well. By default all available plugins and features thereof are built and CMake fails when dependencies aren't met. Building particular plugins can be disabled by boolean CMake variables `_PLUGIN` where the plugin is referred by its technical term like e. g. in `SYSSTAT_PLUGIN`. Alsa and PulseAudio support in plugin-volume can be disabled by boolean CMake variables `VOLUME_USE_ALSA` and `VOLUME_USE_PULSEAUDIO`. To build run `make`, to install `make install` which accepts variable `DESTDIR` as usual. ### Binary packages Official binary packages are provided by all major Linux and BSD distributions. Just use your package manager to search for string `lxqt-panel`. ## Configuration, Usage ### Launching The panel is run as a daemon-like [LXQt Module](https://github.com/lxqt/lxqt-session#lxqt-modules) the launch of which can be adjusted in section "Basic Settings" of configuration dialogue [LXQt Session Settings](https://github.com/lx/lxqt-session#lxqt-session-settings) of [lxqt-session](https://github.com/lxqt/lxqt-session). ### Customizing To customize the panel itself there's a context menu, that is a menu opened by right-clicking the pointer device. It is comprising sections "\" and "Panel" which allow for configuring the plugin the pointer is currently over and the panel as a whole respectively. In section "Panel" topics "Configure Panel" and "Manage Widgets" open different panes of a dialogue "Configure Panel" which allow for configuring the panel as a whole and the various plugins respectively. Pane "Widgets" allows for configuring and removing all plugins currently included in lxqt-panel. The plus sign opens another dialogue "Add plugins" which is used to add plugins. It comes with a list of all plugins plus some short descriptions and can hence serve as overview what plugins are available. Sometimes right-clicking over particular plugins may bring up a context menu dealing with the respective plugin's functionality *only* which means the plugin in question cannot be configured the usual way. This affects e. g. plugin-quicklaunch as soon as items were added (the context menu is limited to topics dealing with the items included in plugin-quicklaunch). Currently there are two ways to deal with this. Some themes like e. g. `Frost` come with handles at the plugins' left end providing the regular context menu. Also, it can be assumed at least one plugin is included in the panel that's always featuring the regular context menu like e. g. plugin-mainmenu. Either way pane "Widgets" of "Configure Panel" can be accessed and used to configure and move the particpaneular plugin by DND or using the arrows. See also [LXQt Wiki: LXQt-Panel](https://lxqt-project.org/wiki/LXQt-Panel). ### Translation Translations can be done in [LXQt-Weblate](https://translate.lxqt-project.org/projects/lxqt-panel/) Translation status ================================================ FILE: autostart/CMakeLists.txt ================================================ set(AUTOSTART_DESKTOP_FILES_IN lxqt-panel.desktop.in) # Translations ********************************** lxqt_translate_desktop(DESKTOP_FILES SOURCES ${AUTOSTART_DESKTOP_FILES_IN} USE_YAML ) add_custom_target(lxqt_panel_autostart_desktop_files ALL DEPENDS ${DESKTOP_FILES}) #************************************************ install(FILES ${DESKTOP_FILES} DESTINATION "${LXQT_ETC_XDG_DIR}/autostart" COMPONENT Runtime ) configure_file(lxqt-panel_wayland.desktop.in lxqt-panel_wayland.desktop @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lxqt-panel_wayland.desktop" DESTINATION "${LXQT_DATA_DIR}/applications" RENAME "lxqt-panel.desktop" COMPONENT Runtime ) ================================================ FILE: autostart/lxqt-panel.desktop.in ================================================ [Desktop Entry] Type=Application TryExec=lxqt-panel Exec=lxqt-panel OnlyShowIn=LXQt; X-LXQt-Module=true #TRANSLATIONS_DIR=translations ================================================ FILE: autostart/lxqt-panel_wayland.desktop.in ================================================ [Desktop Entry] Type=Application TryExec=lxqt-panel NoDisplay=true # NOTE: KWin wants absolute path here, get it from CMake install path Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/lxqt-panel # NOTE: adding KDE to make it work under Plasma Wayland session OnlyShowIn=LXQt;KDE X-LXQt-Module=true # Make KWin recognize us as priviledged client X-KDE-Wayland-Interfaces=org_kde_plasma_window_management ================================================ FILE: autostart/translations/lxqt-panel.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_ar.desktop.yaml ================================================ Desktop Entry/Name: "اللوحة" ================================================ FILE: autostart/translations/lxqt-panel_bg.desktop.yaml ================================================ Desktop Entry/Name: "Панел" ================================================ FILE: autostart/translations/lxqt-panel_ca.desktop.yaml ================================================ Desktop Entry/Name: "Tauler" ================================================ FILE: autostart/translations/lxqt-panel_cs.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_da.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_de.desktop.yaml ================================================ Desktop Entry/Name: "Bedienfeld" ================================================ FILE: autostart/translations/lxqt-panel_el.desktop.yaml ================================================ Desktop Entry/Name: "Πίνακας" ================================================ FILE: autostart/translations/lxqt-panel_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_eo.desktop.yaml ================================================ Desktop Entry/Name: "Panelo" ================================================ FILE: autostart/translations/lxqt-panel_es.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_et.desktop.yaml ================================================ Desktop Entry/Name: "Paneel" ================================================ FILE: autostart/translations/lxqt-panel_eu.desktop.yaml ================================================ Desktop Entry/Name: "Panela" ================================================ FILE: autostart/translations/lxqt-panel_fi.desktop.yaml ================================================ Desktop Entry/Name: "Paneeli" ================================================ FILE: autostart/translations/lxqt-panel_fr.desktop.yaml ================================================ Desktop Entry/Name: "Tableau de bord" ================================================ FILE: autostart/translations/lxqt-panel_gl.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_he.desktop.yaml ================================================ Desktop Entry/Name: "לוח" ================================================ FILE: autostart/translations/lxqt-panel_hr.desktop.yaml ================================================ Desktop Entry/Name: "Ploča" ================================================ FILE: autostart/translations/lxqt-panel_hu.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_ia.desktop.yaml ================================================ Desktop Entry/Name: "Panello" ================================================ FILE: autostart/translations/lxqt-panel_id.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_it.desktop.yaml ================================================ Desktop Entry/Name: "Pannello" ================================================ FILE: autostart/translations/lxqt-panel_ja.desktop.yaml ================================================ Desktop Entry/Name: "パネル" ================================================ FILE: autostart/translations/lxqt-panel_ka.desktop.yaml ================================================ Desktop Entry/Name: "პანელი" ================================================ FILE: autostart/translations/lxqt-panel_kab.desktop.yaml ================================================ Desktop Entry/Name: "" ================================================ FILE: autostart/translations/lxqt-panel_kk.desktop.yaml ================================================ Desktop Entry/Name: "Панель" ================================================ FILE: autostart/translations/lxqt-panel_ko.desktop.yaml ================================================ Desktop Entry/Name: "패널" ================================================ FILE: autostart/translations/lxqt-panel_lg.desktop.yaml ================================================ Desktop Entry/Name: "Lubaawo" ================================================ FILE: autostart/translations/lxqt-panel_lt.desktop.yaml ================================================ Desktop Entry/Name: "Skydelis" ================================================ FILE: autostart/translations/lxqt-panel_lv.desktop.yaml ================================================ Desktop Entry/Name: "Panelis" ================================================ FILE: autostart/translations/lxqt-panel_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_nl.desktop.yaml ================================================ Desktop Entry/Name: "Paneel" ================================================ FILE: autostart/translations/lxqt-panel_oc.desktop.yaml ================================================ Desktop Entry/Name: "Tablèu de bòrd" ================================================ FILE: autostart/translations/lxqt-panel_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਪੈਨਲ" ================================================ FILE: autostart/translations/lxqt-panel_pl.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_pt.desktop.yaml ================================================ Desktop Entry/Name: "Painel" ================================================ FILE: autostart/translations/lxqt-panel_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Painel" ================================================ FILE: autostart/translations/lxqt-panel_ro.desktop.yaml ================================================ Desktop Entry/Name: "Panou" ================================================ FILE: autostart/translations/lxqt-panel_ru.desktop.yaml ================================================ Desktop Entry/Name: "Панель" ================================================ FILE: autostart/translations/lxqt-panel_si.desktop.yaml ================================================ Desktop Entry/Name: "පාලන" ================================================ FILE: autostart/translations/lxqt-panel_sk.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_sl.desktop.yaml ================================================ Desktop Entry/Name: "Pult" ================================================ FILE: autostart/translations/lxqt-panel_sr.desktop.yaml ================================================ Desktop Entry/Name: "Панел" ================================================ FILE: autostart/translations/lxqt-panel_sv.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_th.desktop.yaml ================================================ Desktop Entry/Name: "พาเนล" ================================================ FILE: autostart/translations/lxqt-panel_tr.desktop.yaml ================================================ Desktop Entry/Name: "Panel" ================================================ FILE: autostart/translations/lxqt-panel_uk.desktop.yaml ================================================ Desktop Entry/Name: "Панель" ================================================ FILE: autostart/translations/lxqt-panel_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "面板" ================================================ FILE: autostart/translations/lxqt-panel_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "面板" ================================================ FILE: cmake/BuildPlugin.cmake ================================================ MACRO (BUILD_LXQT_PLUGIN NAME) set(PROGRAM "lxqt-panel") project(${PROGRAM}_${NAME}) set(PROG_SHARE_DIR ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}) set(PLUGIN_SHARE_DIR ${PROG_SHARE_DIR}/${NAME}) # Translations ********************************** lxqt_translate_ts(${PROJECT_NAME}_QM_FILES UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS} SOURCES ${HEADERS} ${SOURCES} ${MOCS} ${UIS} TEMPLATE ${NAME} INSTALL_DIR ${LXQT_TRANSLATIONS_DIR}/${PROGRAM}/${NAME} ) #lxqt_translate_to(QM_FILES ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}/${PROJECT_NAME}) file (GLOB ${PROJECT_NAME}_DESKTOP_FILES_IN resources/*.desktop.in) lxqt_translate_desktop(DESKTOP_FILES SOURCES ${${PROJECT_NAME}_DESKTOP_FILES_IN} USE_YAML ) lxqt_plugin_translation_loader(QM_LOADER ${NAME} "lxqt-panel") #************************************************ file (GLOB CONFIG_FILES resources/*.conf) if (NOT DEFINED PLUGIN_DIR) set (PLUGIN_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROGRAM}) endif (NOT DEFINED PLUGIN_DIR) list(FIND STATIC_PLUGINS ${NAME} IS_STATIC) set(SRC ${HEADERS} ${SOURCES} ${QM_LOADER} ${MOC_SOURCES} ${${PROJECT_NAME}_QM_FILES} ${RESOURCES} ${UIS} ${DESKTOP_FILES} ) if (${IS_STATIC} EQUAL -1) # not static add_library(${NAME} MODULE ${SRC}) # build dynamically loadable modules install(TARGETS ${NAME} DESTINATION ${PLUGIN_DIR}) # install the *.so file else() # static add_library(${NAME} STATIC ${SRC}) # build statically linked lib endif() target_link_libraries(${NAME} Qt6::Widgets lxqt ${LIBRARIES} KF6::WindowSystem ) install(FILES ${CONFIG_FILES} DESTINATION ${PLUGIN_SHARE_DIR}) install(FILES ${DESKTOP_FILES} DESTINATION ${PROG_SHARE_DIR}) ENDMACRO(BUILD_LXQT_PLUGIN) ================================================ FILE: panel/CMakeLists.txt ================================================ set(PROJECT lxqt-panel) # Window Manager backends add_subdirectory(backends) set(PRIV_HEADERS panelpluginsmodel.h windownotifier.h lxqtpanel.h lxqtpanelapplication.h lxqtpanelapplication_p.h lxqtpanellayout.h plugin.h pluginsettings_p.h lxqtpanellimits.h popupmenu.h pluginmoveprocessor.h lxqtpanelpluginconfigdialog.h config/configpaneldialog.h config/configplacement.h config/configstyling.h config/configpluginswidget.h config/addplugindialog.h ) # using LXQt namespace in the public headers. set(PUB_HEADERS lxqtpanelglobals.h pluginsettings.h ilxqtpanelplugin.h ilxqtpanel.h ) set(SOURCES main.cpp panelpluginsmodel.cpp windownotifier.cpp lxqtpanel.cpp lxqtpanelapplication.cpp lxqtpanellayout.cpp plugin.cpp pluginsettings.cpp popupmenu.cpp pluginmoveprocessor.cpp lxqtpanelpluginconfigdialog.cpp config/configpaneldialog.cpp config/configplacement.cpp config/configstyling.cpp config/configpluginswidget.cpp config/addplugindialog.cpp ) set(UI config/configplacement.ui config/configstyling.ui config/configpluginswidget.ui config/addplugindialog.ui ) set(LIBRARIES lxqt ) file(GLOB CONFIG_FILES resources/*.conf) ############################################ add_definitions(-DCOMPILE_LXQT_PANEL) set(PLUGIN_DESKTOPS_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROJECT}") add_definitions(-DPLUGIN_DESKTOPS_DIR=\"${PLUGIN_DESKTOPS_DIR}\") if (WITH_SCREENSAVER_FALLBACK) message(STATUS "Building with conversion of deprecated 'screensaver' plugin") add_definitions(-DWITH_SCREENSAVER_FALLBACK "-DLXQT_LOCK_DESKTOP=\"${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications/lxqt-lockscreen.desktop\"") endif () project(${PROJECT}) set(QTX_LIBRARIES Qt6::Widgets Qt6::Xml Qt6::DBus) # Translations lxqt_translate_ts(QM_FILES SOURCES UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS} SOURCES ${PUB_HEADERS} ${PRIV_HEADERS} ${SOURCES} ${UI} INSTALL_DIR "${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}" ) lxqt_app_translation_loader(SOURCES ${PROJECT_NAME}) add_executable(${PROJECT} ${PUB_HEADERS} ${PRIV_HEADERS} ${QM_FILES} ${SOURCES} ${UI} ) target_link_libraries(${PROJECT} ${LIBRARIES} ${QTX_LIBRARIES} KF6::WindowSystem LayerShellQt::Interface ${STATIC_PLUGINS} lxqt-panel-backend-common ) set_property(TARGET ${PROJECT} PROPERTY ENABLE_EXPORTS TRUE) install(TARGETS ${PROJECT} RUNTIME DESTINATION bin) install(FILES ${CONFIG_FILES} DESTINATION "${LXQT_ETC_XDG_DIR}/lxqt") install(FILES ${PUB_HEADERS} DESTINATION include/lxqt) install(FILES man/lxqt-panel.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" COMPONENT Runtime ) ================================================ FILE: panel/backends/CMakeLists.txt ================================================ # Common interface for Window Manager abstraction backend # This also contains dummy backend add_library(lxqt-panel-backend-common STATIC lxqttaskbartypes.h ilxqtabstractwmiface.h ilxqtabstractwmiface.cpp lxqtdummywmbackend.h lxqtdummywmbackend.cpp ) target_link_libraries(lxqt-panel-backend-common Qt6::Gui ) add_subdirectory(wayland) add_subdirectory(xcb) ================================================ FILE: panel/backends/ilxqtabstractwmiface.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "ilxqtabstractwmiface.h" ILXQtAbstractWMInterface::ILXQtAbstractWMInterface(QObject *parent) : QObject(parent) { } void ILXQtAbstractWMInterface::moveApplicationToPrevNextDesktop(WId windowId, bool next) { int count = getWorkspacesCount(); if (count <= 1) return; int targetWorkspace = getWindowWorkspace(windowId) + (next ? 1 : -1); // Wrap around if (targetWorkspace > count) targetWorkspace = 1; //Ids are 1-based else if (targetWorkspace < 1) targetWorkspace = count; setWindowOnWorkspace(windowId, targetWorkspace); } int ILXQtAbstractWMInterface::onAllWorkspacesEnum() const { // Virtual destops have 1-based indexes. // NOTE: The real value of this enum may be negative (as in X11). return 0; } ================================================ FILE: panel/backends/ilxqtabstractwmiface.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef ILXQT_ABSTRACT_WM_INTERFACE_H #define ILXQT_ABSTRACT_WM_INTERFACE_H #include #include "../lxqtpanelglobals.h" #include "lxqttaskbartypes.h" class QIcon; class QScreen; class LXQT_PANEL_API ILXQtAbstractWMInterface : public QObject { Q_OBJECT public: explicit ILXQtAbstractWMInterface(QObject *parent = nullptr); // Backend virtual bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const = 0; // Windows virtual bool reloadWindows() = 0; virtual QVector getCurrentWindows() const = 0; virtual QString getWindowTitle(WId windowId) const = 0; virtual bool applicationDemandsAttention(WId windowId) const = 0; virtual QIcon getApplicationIcon(WId windowId, int fallbackDevicePixels) const = 0; virtual QString getWindowClass(WId windowId) const = 0; virtual LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const = 0; virtual bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) = 0; virtual LXQtTaskBarWindowState getWindowState(WId windowId) const = 0; virtual bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set = true) = 0; virtual bool isWindowActive(WId windowId) const = 0; virtual bool raiseWindow(WId windowId, bool onCurrentWorkSpace) = 0; virtual bool closeWindow(WId windowId) = 0; virtual WId getActiveWindow() const = 0; // Workspaces // NOTE: indexes are 1-based, 0 means "Show on All desktops" virtual int getWorkspacesCount(QScreen *screen = nullptr) const = 0; virtual QString getWorkspaceName(int idx, QString outputName = QString()) const = 0; virtual int getCurrentWorkspace(QScreen *screen = nullptr) const = 0; virtual bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) = 0; virtual int getWindowWorkspace(WId windowId) const = 0; virtual bool setWindowOnWorkspace(WId windowId, int idx) = 0; virtual void moveApplicationToPrevNextDesktop(WId windowId, bool next); // Default implementation virtual void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) = 0; virtual int onAllWorkspacesEnum() const; virtual bool isWindowOnScreen(QScreen *screen, WId windowId) const = 0; virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) = 0; // X11 Specific virtual void moveApplication(WId windowId) = 0; virtual void resizeApplication(WId windowId) = 0; virtual void refreshIconGeometry(WId windowId, const QRect &geom) = 0; // Panel internal virtual bool isAreaOverlapped(const QRect& area) const = 0; // Show Destop TODO: split in multiple interfeces, this is becoming big // NOTE: KWindowSystem already has these functions // However on Wayland they are only compatible with KWin // because internally it uses org_kde_plasma_window_management protocol // We make this virtual so it can be implemented also for other compositors virtual bool isShowingDesktop() const = 0; virtual bool showDesktop(bool value) = 0; signals: void reloaded(); // Windows void windowAdded(WId windowId); void windowRemoved(WId windowId); void windowPropertyChanged(WId windowId, int prop); // Workspaces void workspacesCountChanged(); void workspaceNameChanged(int idx); void currentWorkspaceChanged(int idx, QString outputName = QString()); // TODO: needed? void activeWindowChanged(WId windowId); }; class LXQT_PANEL_API ILXQtWMBackendLibrary { public: /** Destroys the ILXQtWMBackendLibrary object. **/ virtual ~ILXQtWMBackendLibrary() {} /** Returns the score of this backend for current detected environment. This is used to select correct backend at runtime **/ virtual int getBackendScore(const QString& key) const = 0; /** Returns the root component object of the backend. When the library is finally unloaded, the root component will automatically be deleted. **/ virtual ILXQtAbstractWMInterface* instance() const = 0; }; Q_DECLARE_INTERFACE(ILXQtWMBackendLibrary, "lxqt.org/Panel/WMInterface/1.0") #endif // ILXQT_ABSTRACT_WM_INTERFACE_H ================================================ FILE: panel/backends/lxqtdummywmbackend.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtdummywmbackend.h" #include LXQtDummyWMBackend::LXQtDummyWMBackend(QObject *parent) : ILXQtAbstractWMInterface(parent) { } /************************************************ * Windows function ************************************************/ bool LXQtDummyWMBackend::supportsAction(WId, LXQtTaskBarBackendAction) const { return false; } bool LXQtDummyWMBackend::reloadWindows() { return false; } QVector LXQtDummyWMBackend::getCurrentWindows() const { return {}; } QString LXQtDummyWMBackend::getWindowTitle(WId) const { return QString(); } bool LXQtDummyWMBackend::applicationDemandsAttention(WId) const { return false; } QIcon LXQtDummyWMBackend::getApplicationIcon(WId, int) const { return QIcon(); } QString LXQtDummyWMBackend::getWindowClass(WId) const { return QString(); } LXQtTaskBarWindowLayer LXQtDummyWMBackend::getWindowLayer(WId) const { return LXQtTaskBarWindowLayer::Normal; } bool LXQtDummyWMBackend::setWindowLayer(WId, LXQtTaskBarWindowLayer) { return false; } LXQtTaskBarWindowState LXQtDummyWMBackend::getWindowState(WId) const { return LXQtTaskBarWindowState::Normal; } bool LXQtDummyWMBackend::setWindowState(WId, LXQtTaskBarWindowState, bool) { return false; } bool LXQtDummyWMBackend::isWindowActive(WId) const { return false; } bool LXQtDummyWMBackend::raiseWindow(WId, bool) { return false; } bool LXQtDummyWMBackend::closeWindow(WId) { return false; } WId LXQtDummyWMBackend::getActiveWindow() const { return 0; } /************************************************ * Workspaces ************************************************/ int LXQtDummyWMBackend::getWorkspacesCount(QScreen*) const { return 1; // Fake 1 workspace } QString LXQtDummyWMBackend::getWorkspaceName(int, QString) const { return QString(); } int LXQtDummyWMBackend::getCurrentWorkspace(QScreen*) const { return 0; } bool LXQtDummyWMBackend::setCurrentWorkspace(int, QScreen*) { return false; } int LXQtDummyWMBackend::getWindowWorkspace(WId) const { return 0; } bool LXQtDummyWMBackend::setWindowOnWorkspace(WId, int) { return false; } void LXQtDummyWMBackend::moveApplicationToPrevNextMonitor(WId, bool, bool) { //No-op } int LXQtDummyWMBackend::onAllWorkspacesEnum() const { return 0; } bool LXQtDummyWMBackend::isWindowOnScreen(QScreen *, WId) const { return false; } bool LXQtDummyWMBackend::setDesktopLayout(Qt::Orientation, int, int, bool) { return false; } /************************************************ * X11 Specific ************************************************/ void LXQtDummyWMBackend::moveApplication(WId) { //No-op } void LXQtDummyWMBackend::resizeApplication(WId) { //No-op } void LXQtDummyWMBackend::refreshIconGeometry(WId, QRect const &) { //No-op } bool LXQtDummyWMBackend::isAreaOverlapped(const QRect &) const { return false; } bool LXQtDummyWMBackend::isShowingDesktop() const { return false; } bool LXQtDummyWMBackend::showDesktop(bool) { return false; } ================================================ FILE: panel/backends/lxqtdummywmbackend.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_DUMMY_WM_BACKEND_H #define LXQT_DUMMY_WM_BACKEND_H #include "ilxqtabstractwmiface.h" class LXQtDummyWMBackend : public ILXQtAbstractWMInterface { Q_OBJECT public: explicit LXQtDummyWMBackend(QObject *parent = nullptr); // Backend bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const override; // Windows bool reloadWindows() override; QVector getCurrentWindows() const override; QString getWindowTitle(WId windowId) const override; bool applicationDemandsAttention(WId windowId) const override; QIcon getApplicationIcon(WId windowId, int fallbackDevicePixels) const override; QString getWindowClass(WId windowId) const override; LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const override; bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) override; LXQtTaskBarWindowState getWindowState(WId windowId) const override; bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set = true) override; bool isWindowActive(WId windowId) const override; bool raiseWindow(WId windowId, bool onCurrentWorkSpace) override; bool closeWindow(WId windowId) override; WId getActiveWindow() const override; // Workspaces int getWorkspacesCount(QScreen *screen = nullptr) const override; QString getWorkspaceName(int idx, QString outputName = QString()) const override; int getCurrentWorkspace(QScreen *screen = nullptr) const override; bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) override; int getWindowWorkspace(WId windowId) const override; bool setWindowOnWorkspace(WId windowId, int idx) override; void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) override; int onAllWorkspacesEnum() const override; bool isWindowOnScreen(QScreen *screen, WId windowId) const override; virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) override; // X11 Specific void moveApplication(WId windowId) override; void resizeApplication(WId windowId) override; void refreshIconGeometry(WId windowId, const QRect &geom) override; // Panel internal bool isAreaOverlapped(const QRect& area) const override; // Show Destop bool isShowingDesktop() const override; bool showDesktop(bool value) override; signals: void reloaded(); // Windows void windowAdded(WId windowId); void windowRemoved(WId windowId); void windowPropertyChanged(WId windowId, int prop); // Workspaces void workspacesCountChanged(); void workspaceNameChanged(int idx); void currentWorkspaceChanged(int idx); // TODO: needed? void activeWindowChanged(WId windowId); }; #endif // LXQT_DUMMY_WM_BACKEND_H ================================================ FILE: panel/backends/lxqttaskbartypes.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKBARTYPES_H #define LXQTTASKBARTYPES_H #include typedef quintptr WId; enum class LXQtTaskBarBackendAction { Move = 0, Resize, Maximize, MaximizeVertically, MaximizeHorizontally, Minimize, RollUp, FullScreen, DesktopSwitch, MoveToDesktop, MoveToLayer, MoveToOutput }; enum class LXQtTaskBarWindowProperty { Title = 0, Icon, State, Geometry, Urgency, WindowClass, Workspace }; enum class LXQtTaskBarWindowState { Hidden = 0, FullScreen, Minimized, Maximized, MaximizedVertically, MaximizedHorizontally, Normal, RolledUp //Shaded }; enum class LXQtTaskBarWindowLayer { KeepBelow = 0, Normal, KeepAbove }; #endif // LXQTTASKBARTYPES_H ================================================ FILE: panel/backends/wayland/CMakeLists.txt ================================================ add_subdirectory(kwin_wayland) add_subdirectory(wlroots) add_subdirectory(wayfire) ================================================ FILE: panel/backends/wayland/kwin_wayland/CMakeLists.txt ================================================ set(PLATFORM_NAME kwin_wayland) set(PREFIX_NAME wmbackend) set(PROGRAM "lxqt-panel") set(BACKEND "backend") set(NAME ${PREFIX_NAME}_${PLATFORM_NAME}) project(${PROGRAM}_${BACKEND}_${NAME}) find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS WaylandClient Concurrent) set(PROG_SHARE_DIR ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}/${BACKEND}) set(PLUGIN_SHARE_DIR ${PROG_SHARE_DIR}/${BACKEND}/${NAME}) #************************************************ if (NOT DEFINED PLUGIN_DIR) set (PLUGIN_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROGRAM}) endif (NOT DEFINED PLUGIN_DIR) set(QTX_LIBRARIES Qt6::Gui) set(SRC lxqtwmbackend_kwinwayland.h lxqtwmbackend_kwinwayland.cpp lxqtplasmavirtualdesktop.h lxqtplasmavirtualdesktop.cpp lxqttaskbarplasmawindowmanagment.h lxqttaskbarplasmawindowmanagment.cpp ) add_library(${NAME} MODULE ${SRC}) # build dynamically loadable modules install(TARGETS ${NAME} DESTINATION ${PLUGIN_DIR}/${BACKEND}) # install the *.so file target_link_libraries(${NAME} ${QTX_LIBRARIES} Qt6::Concurrent Qt6::WaylandClient) qt6_generate_wayland_protocol_client_sources(${NAME} FILES ${CMAKE_CURRENT_SOURCE_DIR}/protocols/plasma-window-management.xml ) qt6_generate_wayland_protocol_client_sources(${NAME} FILES ${CMAKE_CURRENT_SOURCE_DIR}/protocols/org-kde-plasma-virtual-desktop.xml ) ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqtplasmavirtualdesktop.cpp ================================================ /* SPDX-FileCopyrightText: 2016 Eike Hein SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL Adapted from KDE Plasma Workspace: plasma-workspace/libtaskmanager/waylandtasksmodel.cpp */ #include "lxqtplasmavirtualdesktop.h" #include LXQtPlasmaVirtualDesktop::LXQtPlasmaVirtualDesktop(::org_kde_plasma_virtual_desktop *object, const QString &id) : org_kde_plasma_virtual_desktop(object) , id(id) { } LXQtPlasmaVirtualDesktop::~LXQtPlasmaVirtualDesktop() { wl_proxy_destroy(reinterpret_cast(object())); } void LXQtPlasmaVirtualDesktop::org_kde_plasma_virtual_desktop_name(const QString &name) { this->name = name; Q_EMIT nameChanged(); } void LXQtPlasmaVirtualDesktop::org_kde_plasma_virtual_desktop_done() { Q_EMIT done(); } void LXQtPlasmaVirtualDesktop::org_kde_plasma_virtual_desktop_activated() { Q_EMIT activated(); } LXQtPlasmaVirtualDesktopManagment::LXQtPlasmaVirtualDesktopManagment() : QWaylandClientExtensionTemplate(version) { connect(this, &QWaylandClientExtension::activeChanged, this, [this] { if (!isActive()) { org_kde_plasma_virtual_desktop_management_destroy(object()); } }); } LXQtPlasmaVirtualDesktopManagment::~LXQtPlasmaVirtualDesktopManagment() { if (isActive()) { org_kde_plasma_virtual_desktop_management_destroy(object()); } } void LXQtPlasmaVirtualDesktopManagment::org_kde_plasma_virtual_desktop_management_desktop_created(const QString &desktop_id, uint32_t position) { emit desktopCreated(desktop_id, position); } void LXQtPlasmaVirtualDesktopManagment::org_kde_plasma_virtual_desktop_management_desktop_removed(const QString &desktop_id) { emit desktopRemoved(desktop_id); } void LXQtPlasmaVirtualDesktopManagment::org_kde_plasma_virtual_desktop_management_rows(uint32_t rows) { emit rowsChanged(rows); } LXQtPlasmaWaylandWorkspaceInfo::LXQtPlasmaWaylandWorkspaceInfo() { init(); } LXQtPlasmaWaylandWorkspaceInfo::VirtualDesktopsIterator LXQtPlasmaWaylandWorkspaceInfo::findDesktop(const QString &id) const { return std::find_if(virtualDesktops.begin(), virtualDesktops.end(), [&id](const std::unique_ptr &desktop) { return desktop->id == id; }); } QString LXQtPlasmaWaylandWorkspaceInfo::getDesktopName(int pos) const { if(pos < 0 || size_t(pos) >= virtualDesktops.size()) return QString(); return virtualDesktops[pos]->name; } QString LXQtPlasmaWaylandWorkspaceInfo::getDesktopId(int pos) const { if(pos < 0 || size_t(pos) >= virtualDesktops.size()) return QString(); return virtualDesktops[pos]->id; } void LXQtPlasmaWaylandWorkspaceInfo::init() { virtualDesktopManagement = std::make_unique(); connect(virtualDesktopManagement.get(), &LXQtPlasmaVirtualDesktopManagment::activeChanged, this, [this] { if (!virtualDesktopManagement->isActive()) { rows = 0; virtualDesktops.clear(); currentVirtualDesktop.clear(); Q_EMIT currentDesktopChanged(); Q_EMIT numberOfDesktopsChanged(); Q_EMIT navigationWrappingAroundChanged(); Q_EMIT desktopIdsChanged(); Q_EMIT desktopLayoutRowsChanged(); } }); connect(virtualDesktopManagement.get(), &LXQtPlasmaVirtualDesktopManagment::desktopCreated, this, &LXQtPlasmaWaylandWorkspaceInfo::addDesktop); connect(virtualDesktopManagement.get(), &LXQtPlasmaVirtualDesktopManagment::desktopRemoved, this, [this](const QString &id) { virtualDesktops.erase(std::remove_if(virtualDesktops.begin(), virtualDesktops.end(), [id](const std::unique_ptr &desktop) { return desktop->id == id; }), virtualDesktops.end()); Q_EMIT numberOfDesktopsChanged(); Q_EMIT desktopIdsChanged(); if (currentVirtualDesktop == id) { currentVirtualDesktop.clear(); Q_EMIT currentDesktopChanged(); } }); connect(virtualDesktopManagement.get(), &LXQtPlasmaVirtualDesktopManagment::rowsChanged, this, [this](quint32 rows) { this->rows = rows; Q_EMIT desktopLayoutRowsChanged(); }); } void LXQtPlasmaWaylandWorkspaceInfo::addDesktop(const QString &id, quint32 pos) { if (findDesktop(id) != virtualDesktops.end()) { return; } auto desktop = std::make_unique(virtualDesktopManagement->get_virtual_desktop(id), id); connect(desktop.get(), &LXQtPlasmaVirtualDesktop::activated, this, [id, this]() { currentVirtualDesktop = id; Q_EMIT currentDesktopChanged(); }); connect(desktop.get(), &LXQtPlasmaVirtualDesktop::nameChanged, this, [id, this]() { Q_EMIT desktopNameChanged(position(id)); }); connect(desktop.get(), &LXQtPlasmaVirtualDesktop::done, this, [id, this]() { Q_EMIT desktopNameChanged(position(id)); }); virtualDesktops.insert(std::next(virtualDesktops.begin(), pos), std::move(desktop)); Q_EMIT numberOfDesktopsChanged(); Q_EMIT desktopIdsChanged(); Q_EMIT desktopNameChanged(position(id)); } QVariant LXQtPlasmaWaylandWorkspaceInfo::currentDesktop() const { return currentVirtualDesktop; } int LXQtPlasmaWaylandWorkspaceInfo::numberOfDesktops() const { return virtualDesktops.size(); } quint32 LXQtPlasmaWaylandWorkspaceInfo::position(const QVariant &desktop) const { return std::distance(virtualDesktops.begin(), findDesktop(desktop.toString())); } QVariantList LXQtPlasmaWaylandWorkspaceInfo::desktopIds() const { QVariantList ids; ids.reserve(virtualDesktops.size()); std::transform(virtualDesktops.cbegin(), virtualDesktops.cend(), std::back_inserter(ids), [](const std::unique_ptr &desktop) { return desktop->id; }); return ids; } QStringList LXQtPlasmaWaylandWorkspaceInfo::desktopNames() const { if (!virtualDesktopManagement->isActive()) { return QStringList(); } QStringList names; names.reserve(virtualDesktops.size()); std::transform(virtualDesktops.cbegin(), virtualDesktops.cend(), std::back_inserter(names), [](const std::unique_ptr &desktop) { return desktop->name; }); return names; } int LXQtPlasmaWaylandWorkspaceInfo::desktopLayoutRows() const { if (!virtualDesktopManagement->isActive()) { return 0; } return rows; } void LXQtPlasmaWaylandWorkspaceInfo::requestActivate(const QVariant &desktop) { if (!virtualDesktopManagement->isActive()) { return; } if (auto it = findDesktop(desktop.toString()); it != virtualDesktops.end()) { (*it)->request_activate(); } } void LXQtPlasmaWaylandWorkspaceInfo::requestCreateDesktop(quint32 position) { if (!virtualDesktopManagement->isActive()) { return; } //TODO: translatestd virtualDesktopManagement->request_create_virtual_desktop(QLatin1String("New Desktop"), position); } void LXQtPlasmaWaylandWorkspaceInfo::requestRemoveDesktop(quint32 position) { if (!virtualDesktopManagement->isActive()) { return; } if (virtualDesktops.size() == 1) { return; } if (position > (virtualDesktops.size() - 1)) { return; } virtualDesktopManagement->request_remove_virtual_desktop(virtualDesktops.at(position)->id); } ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqtplasmavirtualdesktop.h ================================================ /* SPDX-FileCopyrightText: 2016 Eike Hein SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL Adapted from KDE Plasma Workspace: plasma-workspace/libtaskmanager/waylandtasksmodel.cpp */ #ifndef LXQTPLASMAVIRTUALDESKTOP_H #define LXQTPLASMAVIRTUALDESKTOP_H #include #include #include #include "qwayland-org-kde-plasma-virtual-desktop.h" class LXQtPlasmaVirtualDesktop : public QObject, public QtWayland::org_kde_plasma_virtual_desktop { Q_OBJECT public: LXQtPlasmaVirtualDesktop(::org_kde_plasma_virtual_desktop *object, const QString &id); ~LXQtPlasmaVirtualDesktop(); const QString id; QString name; Q_SIGNALS: void done(); void activated(); void nameChanged(); protected: void org_kde_plasma_virtual_desktop_name(const QString &name) override; void org_kde_plasma_virtual_desktop_done() override; void org_kde_plasma_virtual_desktop_activated() override; }; class LXQtPlasmaVirtualDesktopManagment : public QWaylandClientExtensionTemplate, public QtWayland::org_kde_plasma_virtual_desktop_management { Q_OBJECT public: static constexpr int version = 2; LXQtPlasmaVirtualDesktopManagment(); ~LXQtPlasmaVirtualDesktopManagment(); signals: void desktopCreated(const QString &id, quint32 position); void desktopRemoved(const QString &id); void rowsChanged(const quint32 rows); protected: virtual void org_kde_plasma_virtual_desktop_management_desktop_created(const QString &desktop_id, uint32_t position) override; virtual void org_kde_plasma_virtual_desktop_management_desktop_removed(const QString &desktop_id) override; virtual void org_kde_plasma_virtual_desktop_management_rows(uint32_t rows) override; }; class Q_DECL_HIDDEN LXQtPlasmaWaylandWorkspaceInfo : public QObject { Q_OBJECT public: LXQtPlasmaWaylandWorkspaceInfo(); QVariant currentVirtualDesktop; std::vector> virtualDesktops; std::unique_ptr virtualDesktopManagement; quint32 rows; typedef std::vector>::const_iterator VirtualDesktopsIterator; VirtualDesktopsIterator findDesktop(const QString &id) const; QString getDesktopName(int pos) const; QString getDesktopId(int pos) const; void init(); void addDesktop(const QString &id, quint32 pos); QVariant currentDesktop() const; int numberOfDesktops() const; QVariantList desktopIds() const; QStringList desktopNames() const; quint32 position(const QVariant &desktop) const; int desktopLayoutRows() const; void requestActivate(const QVariant &desktop); void requestCreateDesktop(quint32 position); void requestRemoveDesktop(quint32 position); signals: void currentDesktopChanged(); void numberOfDesktopsChanged(); void navigationWrappingAroundChanged(); void desktopIdsChanged(); void desktopNameChanged(quint32 position); void desktopLayoutRowsChanged(); }; #endif // LXQTPLASMAVIRTUALDESKTOP_H ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqttaskbarplasmawindowmanagment.cpp ================================================ /* SPDX-FileCopyrightText: 2016 Eike Hein SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL Adapted from KDE Plasma Workspace: plasma-workspace/libtaskmanager/waylandtasksmodel.cpp */ #include "lxqttaskbarplasmawindowmanagment.h" #include #include #include #include #include #include #include #include #include #include #include #include /* * LXQtTaskBarPlasmaWindow */ LXQtTaskBarPlasmaWindow::LXQtTaskBarPlasmaWindow(const QString &uuid, ::org_kde_plasma_window *id) : org_kde_plasma_window(id) , uuid(uuid) { } LXQtTaskBarPlasmaWindow::~LXQtTaskBarPlasmaWindow() { destroy(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_unmapped() { wasUnmapped = true; Q_EMIT unmapped(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_title_changed(const QString &title) { if(this->title == title) return; this->title = title; Q_EMIT titleChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_app_id_changed(const QString &app_id) { if(appId == app_id) return; appId = app_id; Q_EMIT appIdChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_icon_changed() { int pipeFds[2]; if (pipe2(pipeFds, O_CLOEXEC) != 0) { qWarning() << "TaskManager: failed creating pipe"; return; } get_icon(pipeFds[1]); ::close(pipeFds[1]); auto readIcon = [uuid = uuid](int fd) { auto closeGuard = qScopeGuard([fd]() { ::close(fd); }); pollfd pollFd; pollFd.fd = fd; pollFd.events = POLLIN; QByteArray data; while (true) { int ready = poll(&pollFd, 1, 1000); if (ready < 0 && errno != EINTR) { qWarning() << "TaskManager: polling for icon of window" << uuid << "failed"; return QIcon(); } else if (ready == 0) { qWarning() << "TaskManager: time out polling for icon of window" << uuid; return QIcon(); } else { char buffer[4096]; int n = read(fd, buffer, sizeof(buffer)); if (n < 0) { qWarning() << "TaskManager: error reading icon of window" << uuid; return QIcon(); } else if (n > 0) { data.append(buffer, n); } else { QIcon icon; QDataStream ds(data); ds >> icon; return icon; } } } }; QFuture future = QtConcurrent::run(readIcon, pipeFds[0]); auto watcher = new QFutureWatcher(); watcher->setFuture(future); connect(watcher, &QFutureWatcher::finished, this, [this, watcher] { icon = watcher->future().result(); Q_EMIT iconChanged(); }); connect(watcher, &QFutureWatcher::finished, watcher, &QObject::deleteLater); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_themed_icon_name_changed(const QString &name) { icon = QIcon::fromTheme(name); Q_EMIT iconChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_state_changed(uint32_t flags) { auto diff = windowState ^ flags; if (diff & state::state_active) { windowState.setFlag(state::state_active, flags & state::state_active); Q_EMIT activeChanged(); } if (diff & state::state_minimized) { windowState.setFlag(state::state_minimized, flags & state::state_minimized); Q_EMIT minimizedChanged(); } if (diff & state::state_maximized) { windowState.setFlag(state::state_maximized, flags & state::state_maximized); Q_EMIT maximizedChanged(); } if (diff & state::state_fullscreen) { windowState.setFlag(state::state_fullscreen, flags & state::state_fullscreen); Q_EMIT fullscreenChanged(); } if (diff & state::state_keep_above) { windowState.setFlag(state::state_keep_above, flags & state::state_keep_above); Q_EMIT keepAboveChanged(); } if (diff & state::state_keep_below) { windowState.setFlag(state::state_keep_below, flags & state::state_keep_below); Q_EMIT keepBelowChanged(); } if (diff & state::state_on_all_desktops) { windowState.setFlag(state::state_on_all_desktops, flags & state::state_on_all_desktops); Q_EMIT onAllDesktopsChanged(); } if (diff & state::state_demands_attention) { windowState.setFlag(state::state_demands_attention, flags & state::state_demands_attention); Q_EMIT demandsAttentionChanged(); } if (diff & state::state_closeable) { windowState.setFlag(state::state_closeable, flags & state::state_closeable); Q_EMIT closeableChanged(); } if (diff & state::state_minimizable) { windowState.setFlag(state::state_minimizable, flags & state::state_minimizable); Q_EMIT minimizeableChanged(); } if (diff & state::state_maximizable) { windowState.setFlag(state::state_maximizable, flags & state::state_maximizable); Q_EMIT maximizeableChanged(); } if (diff & state::state_fullscreenable) { windowState.setFlag(state::state_fullscreenable, flags & state::state_fullscreenable); Q_EMIT fullscreenableChanged(); } if (diff & state::state_skiptaskbar) { windowState.setFlag(state::state_skiptaskbar, flags & state::state_skiptaskbar); Q_EMIT skipTaskbarChanged(); } if (diff & state::state_shadeable) { windowState.setFlag(state::state_shadeable, flags & state::state_shadeable); Q_EMIT shadeableChanged(); } if (diff & state::state_shaded) { windowState.setFlag(state::state_shaded, flags & state::state_shaded); Q_EMIT shadedChanged(); } if (diff & state::state_movable) { windowState.setFlag(state::state_movable, flags & state::state_movable); Q_EMIT movableChanged(); } if (diff & state::state_resizable) { windowState.setFlag(state::state_resizable, flags & state::state_resizable); Q_EMIT resizableChanged(); } if (diff & state::state_virtual_desktop_changeable) { windowState.setFlag(state::state_virtual_desktop_changeable, flags & state::state_virtual_desktop_changeable); Q_EMIT virtualDesktopChangeableChanged(); } if (diff & state::state_skipswitcher) { windowState.setFlag(state::state_skipswitcher, flags & state::state_skipswitcher); Q_EMIT skipSwitcherChanged(); } } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_virtual_desktop_entered(const QString &id) { virtualDesktops.push_back(id); Q_EMIT virtualDesktopEntered(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_virtual_desktop_left(const QString &id) { virtualDesktops.removeAll(id); Q_EMIT virtualDesktopLeft(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_geometry(int32_t x, int32_t y, uint32_t width, uint32_t height) { geometry = QRect(x, y, width, height); Q_EMIT geometryChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_application_menu(const QString &service_name, const QString &object_path) { applicationMenuService = service_name; applicationMenuObjectPath = object_path; Q_EMIT applicationMenuChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_activity_entered(const QString &id) { activities.push_back(id); Q_EMIT activitiesChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_activity_left(const QString &id) { activities.removeAll(id); Q_EMIT activitiesChanged(); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_pid_changed(uint32_t pid) { this->pid = pid; } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_resource_name_changed(const QString &resource_name) { resourceName = resource_name; } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_parent_window(::org_kde_plasma_window *parent) { LXQtTaskBarPlasmaWindow *parentWindow = nullptr; if (parent) { parentWindow = dynamic_cast(LXQtTaskBarPlasmaWindow::fromObject(parent)); } setParentWindow(parentWindow); } void LXQtTaskBarPlasmaWindow::org_kde_plasma_window_initial_state() { Q_EMIT initialStateDone(); } void LXQtTaskBarPlasmaWindow::setParentWindow(LXQtTaskBarPlasmaWindow *parent) { const auto old = parentWindow; QObject::disconnect(parentWindowUnmappedConnection); if (parent && !parent->wasUnmapped) { parentWindow = QPointer(parent); parentWindowUnmappedConnection = QObject::connect(parent, &LXQtTaskBarPlasmaWindow::unmapped, this, [this] { setParentWindow(nullptr); }); } else { parentWindow = QPointer(); parentWindowUnmappedConnection = QMetaObject::Connection(); } if (parentWindow.data() != old.data()) { Q_EMIT parentWindowChanged(); } } /* * LXQtTaskBarPlasmaWindowManagment */ LXQtTaskBarPlasmaWindowManagment::LXQtTaskBarPlasmaWindowManagment() : QWaylandClientExtensionTemplate(version) { connect(this, &QWaylandClientExtension::activeChanged, this, [this] { if (!isActive()) { org_kde_plasma_window_management_destroy(object()); } }); } LXQtTaskBarPlasmaWindowManagment::~LXQtTaskBarPlasmaWindowManagment() { if (isActive()) { org_kde_plasma_window_management_destroy(object()); } } void LXQtTaskBarPlasmaWindowManagment::org_kde_plasma_window_management_show_desktop_changed(uint32_t state) { m_isShowingDesktop = (state == show_desktop::show_desktop_enabled); } void LXQtTaskBarPlasmaWindowManagment::org_kde_plasma_window_management_window_with_uuid(uint32_t id, const QString &uuid) { Q_UNUSED(id) Q_EMIT windowCreated(new LXQtTaskBarPlasmaWindow(uuid, get_window_by_uuid(uuid))); } void LXQtTaskBarPlasmaWindowManagment::org_kde_plasma_window_management_stacking_order_uuid_changed(const QString &uuids) { Q_EMIT stackingOrderChanged(uuids); } ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqttaskbarplasmawindowmanagment.h ================================================ /* SPDX-FileCopyrightText: 2016 Eike Hein SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL Adapted from KDE Plasma Workspace: plasma-workspace/libtaskmanager/waylandtasksmodel.cpp */ #ifndef LXQTTASKBARPLASMAWINDOWMANAGMENT_H #define LXQTTASKBARPLASMAWINDOWMANAGMENT_H #include #include #include #include "qwayland-plasma-window-management.h" typedef quintptr WId; class LXQtTaskBarPlasmaWindowManagment; class LXQtTaskBarPlasmaWindow : public QObject, public QtWayland::org_kde_plasma_window { Q_OBJECT public: LXQtTaskBarPlasmaWindow(const QString &uuid, ::org_kde_plasma_window *id); ~LXQtTaskBarPlasmaWindow(); inline WId getWindowId() const { return reinterpret_cast(this); } using state = QtWayland::org_kde_plasma_window_management::state; const QString uuid; QString title; QString appId; QIcon icon; QFlags windowState; QList virtualDesktops; QRect geometry; QString applicationMenuService; QString applicationMenuObjectPath; QList activities; quint32 pid; QString resourceName; QPointer parentWindow; bool wasUnmapped = false; bool acceptedInTaskBar = false; Q_SIGNALS: void unmapped(); void titleChanged(); void appIdChanged(); void iconChanged(); void activeChanged(); void minimizedChanged(); void maximizedChanged(); void fullscreenChanged(); void keepAboveChanged(); void keepBelowChanged(); void onAllDesktopsChanged(); void demandsAttentionChanged(); void closeableChanged(); void minimizeableChanged(); void maximizeableChanged(); void fullscreenableChanged(); void skiptaskbarChanged(); void shadeableChanged(); void shadedChanged(); void movableChanged(); void resizableChanged(); void virtualDesktopChangeableChanged(); void skipSwitcherChanged(); void virtualDesktopEntered(); void virtualDesktopLeft(); void geometryChanged(); void skipTaskbarChanged(); void applicationMenuChanged(); void activitiesChanged(); void parentWindowChanged(); void initialStateDone(); protected: void org_kde_plasma_window_unmapped() override; void org_kde_plasma_window_title_changed(const QString &title) override; void org_kde_plasma_window_app_id_changed(const QString &app_id) override; void org_kde_plasma_window_icon_changed() override; void org_kde_plasma_window_themed_icon_name_changed(const QString &name) override; void org_kde_plasma_window_state_changed(uint32_t flags) override; void org_kde_plasma_window_virtual_desktop_entered(const QString &id) override; void org_kde_plasma_window_virtual_desktop_left(const QString &id) override; void org_kde_plasma_window_geometry(int32_t x, int32_t y, uint32_t width, uint32_t height) override; void org_kde_plasma_window_application_menu(const QString &service_name, const QString &object_path) override; void org_kde_plasma_window_activity_entered(const QString &id) override; void org_kde_plasma_window_activity_left(const QString &id) override; void org_kde_plasma_window_pid_changed(uint32_t pid) override; void org_kde_plasma_window_resource_name_changed(const QString &resource_name) override; void org_kde_plasma_window_parent_window(::org_kde_plasma_window *parent) override; void org_kde_plasma_window_initial_state() override; private: void setParentWindow(LXQtTaskBarPlasmaWindow *parent); QMetaObject::Connection parentWindowUnmappedConnection; }; class LXQtTaskBarPlasmaWindowManagment : public QWaylandClientExtensionTemplate, public QtWayland::org_kde_plasma_window_management { Q_OBJECT public: static constexpr int version = 16; LXQtTaskBarPlasmaWindowManagment(); ~LXQtTaskBarPlasmaWindowManagment(); inline bool isShowingDesktop() const { return m_isShowingDesktop; } inline void setShowingDesktop(bool show) { m_isShowingDesktop = show; } protected: void org_kde_plasma_window_management_show_desktop_changed(uint32_t state) override; void org_kde_plasma_window_management_window_with_uuid(uint32_t id, const QString &uuid) override; void org_kde_plasma_window_management_stacking_order_uuid_changed(const QString &uuids) override; Q_SIGNALS: void windowCreated(LXQtTaskBarPlasmaWindow *window); void stackingOrderChanged(const QString &uuids); private: bool m_isShowingDesktop = false; }; // class Q_DECL_HIDDEN WaylandTasksModel::Private // { // public: // Private(WaylandTasksModel *q); // QHash appDataCache; // QHash lastActivated; // PlasmaWindow *activeWindow = nullptr; // std::vector> windows; // // key=transient child, value=leader // QHash transients; // // key=leader, values=transient children // QMultiHash transientsDemandingAttention; // std::unique_ptr windowManagement; // KSharedConfig::Ptr rulesConfig; // KDirWatch *configWatcher = nullptr; // VirtualDesktopInfo *virtualDesktopInfo = nullptr; // static QUuid uuid; // QList stackingOrder; // void init(); // void initWayland(); // auto findWindow(PlasmaWindow *window) const; // void addWindow(PlasmaWindow *window); // const AppData &appData(PlasmaWindow *window); // QIcon icon(PlasmaWindow *window); // static QString mimeType(); // static QString groupMimeType(); // void dataChanged(PlasmaWindow *window, int role); // void dataChanged(PlasmaWindow *window, const QList &roles); // private: // WaylandTasksModel *q; // }; #endif // LXQTTASKBARPLASMAWINDOWMANAGMENT_H ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqtwmbackend_kwinwayland.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtwmbackend_kwinwayland.h" #include "lxqttaskbarplasmawindowmanagment.h" #include "lxqtplasmavirtualdesktop.h" #include #include #include #include auto findWindow(const std::vector>& windows, LXQtTaskBarPlasmaWindow *window) { //TODO: use algorithms auto end = windows.end(); for(auto it = windows.begin(); it != end; it++) { if((*it).get() == window) { return it; } } return windows.end(); } LXQtWMBackend_KWinWayland::LXQtWMBackend_KWinWayland(QObject *parent) : ILXQtAbstractWMInterface(parent) { m_managment.reset(new LXQtTaskBarPlasmaWindowManagment); m_workspaceInfo.reset(new LXQtPlasmaWaylandWorkspaceInfo); connect(m_managment.get(), &LXQtTaskBarPlasmaWindowManagment::windowCreated, this, [this](LXQtTaskBarPlasmaWindow *window) { connect(window, &LXQtTaskBarPlasmaWindow::initialStateDone, this, [this, window] { addWindow(window); }); }); // connect(m_managment.get(), &LXQtTaskBarPlasmaWindowManagment::stackingOrderChanged, // this, [this](const QString &order) { // // stackingOrder = order.split(QLatin1Char(';')); // // for (const auto &window : std::as_const(windows)) { // // this->dataChanged(window.get(), StackingOrder); // // } // }); connect(m_workspaceInfo.get(), &LXQtPlasmaWaylandWorkspaceInfo::currentDesktopChanged, this, [this](){ int idx = m_workspaceInfo->position(m_workspaceInfo->currentDesktop()); idx += 1; // Make 1-based emit currentWorkspaceChanged(idx); }); connect(m_workspaceInfo.get(), &LXQtPlasmaWaylandWorkspaceInfo::numberOfDesktopsChanged, this, &ILXQtAbstractWMInterface::workspacesCountChanged); connect(m_workspaceInfo.get(), &LXQtPlasmaWaylandWorkspaceInfo::desktopNameChanged, this, [this](int idx) { emit workspaceNameChanged(idx + 1); // Make 1-based }); } bool LXQtWMBackend_KWinWayland::supportsAction(WId windowId, LXQtTaskBarBackendAction action) const { if(action == LXQtTaskBarBackendAction::DesktopSwitch) return true; LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; LXQtTaskBarPlasmaWindow::state state; switch (action) { case LXQtTaskBarBackendAction::Move: state = LXQtTaskBarPlasmaWindow::state::state_movable; break; case LXQtTaskBarBackendAction::Resize: state = LXQtTaskBarPlasmaWindow::state::state_resizable; break; case LXQtTaskBarBackendAction::Maximize: state = LXQtTaskBarPlasmaWindow::state::state_maximizable; break; case LXQtTaskBarBackendAction::Minimize: state = LXQtTaskBarPlasmaWindow::state::state_minimizable; break; case LXQtTaskBarBackendAction::RollUp: state = LXQtTaskBarPlasmaWindow::state::state_shadeable; break; case LXQtTaskBarBackendAction::FullScreen: state = LXQtTaskBarPlasmaWindow::state::state_fullscreenable; break; case LXQtTaskBarBackendAction::DesktopSwitch: return true; case LXQtTaskBarBackendAction::MoveToDesktop: return true; case LXQtTaskBarBackendAction::MoveToLayer: return true; case LXQtTaskBarBackendAction::MoveToOutput: return true; default: return false; } return window->windowState.testFlag(state); } bool LXQtWMBackend_KWinWayland::reloadWindows() { const QVector wids = getCurrentWindows(); // Force removal and re-adding for(WId windowId : wids) { emit windowRemoved(windowId); } for(WId windowId : wids) { emit windowAdded(windowId); } return true; } QVector LXQtWMBackend_KWinWayland::getCurrentWindows() const { QVector wids; wids.reserve(wids.size()); for(const std::unique_ptr& window : std::as_const(windows)) { if(window->acceptedInTaskBar) wids << window->getWindowId(); } return wids; } QString LXQtWMBackend_KWinWayland::getWindowTitle(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return QString(); return window->title; } bool LXQtWMBackend_KWinWayland::applicationDemandsAttention(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; return window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_demands_attention) || transientsDemandingAttention.contains(window); } QIcon LXQtWMBackend_KWinWayland::getApplicationIcon(WId windowId, int devicePixels) const { Q_UNUSED(devicePixels) LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return QIcon(); return window->icon; } QString LXQtWMBackend_KWinWayland::getWindowClass(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return QString(); return window->appId; } LXQtTaskBarWindowLayer LXQtWMBackend_KWinWayland::getWindowLayer(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return LXQtTaskBarWindowLayer::Normal; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_keep_above)) return LXQtTaskBarWindowLayer::KeepAbove; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_keep_below)) return LXQtTaskBarWindowLayer::KeepBelow; return LXQtTaskBarWindowLayer::Normal; } bool LXQtWMBackend_KWinWayland::setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; if(getWindowLayer(windowId) == layer) return true; //TODO: make more efficient LXQtTaskBarPlasmaWindow::state above = LXQtTaskBarPlasmaWindow::state::state_keep_above; LXQtTaskBarPlasmaWindow::state below = LXQtTaskBarPlasmaWindow::state::state_keep_below; switch (layer) { case LXQtTaskBarWindowLayer::Normal: window->set_state(above, 0); window->set_state(below, 0); break; case LXQtTaskBarWindowLayer::KeepAbove: window->set_state(above, above); break; case LXQtTaskBarWindowLayer::KeepBelow: window->set_state(below, below); break; default: return false; } return false; } LXQtTaskBarWindowState LXQtWMBackend_KWinWayland::getWindowState(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return LXQtTaskBarWindowState::Normal; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_minimized)) return LXQtTaskBarWindowState::Minimized; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_maximized)) return LXQtTaskBarWindowState::Maximized; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_shaded)) return LXQtTaskBarWindowState::RolledUp; if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_fullscreen)) return LXQtTaskBarWindowState::FullScreen; return LXQtTaskBarWindowState::Normal; } bool LXQtWMBackend_KWinWayland::setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; LXQtTaskBarPlasmaWindow::state plasmaState; switch (state) { case LXQtTaskBarWindowState::Minimized: { plasmaState = LXQtTaskBarPlasmaWindow::state::state_minimized; // KWin minimizes/restores the parent when it minimizes/restores its child // but not conversely. Therefore, all children are also minimized/restored here. window->set_state(plasmaState, set ? plasmaState : 0); auto win = window; while (auto child = transients.key(win)) { win = child; win->set_state(plasmaState, set ? plasmaState : 0); } return true; } case LXQtTaskBarWindowState::Maximized: case LXQtTaskBarWindowState::MaximizedVertically: case LXQtTaskBarWindowState::MaximizedHorizontally: { plasmaState = LXQtTaskBarPlasmaWindow::state::state_maximized; break; } case LXQtTaskBarWindowState::Normal: { plasmaState = LXQtTaskBarPlasmaWindow::state::state_maximized; set = !set; //TODO: correct break; } case LXQtTaskBarWindowState::RolledUp: { plasmaState = LXQtTaskBarPlasmaWindow::state::state_shaded; break; } default: return false; } window->set_state(plasmaState, set ? plasmaState : 0); return true; } bool LXQtWMBackend_KWinWayland::isWindowActive(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; return activeWindow == window || window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active); } bool LXQtWMBackend_KWinWayland::raiseWindow(WId windowId, bool onCurrentWorkSpace) { Q_UNUSED(onCurrentWorkSpace) //TODO LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; LXQtTaskBarPlasmaWindow *child = window; // Pull forward any transient demanding attention. if (auto *transientDemandingAttention = transientsDemandingAttention.value(window)) { window = transientDemandingAttention; } else { // TODO Shouldn't KWin take care of that? // Bringing a transient to the front usually brings its parent with it // but focus is not handled properly. while (transients.key(child)) { child = transients.key(child); } } window->set_state(LXQtTaskBarPlasmaWindow::state::state_active, LXQtTaskBarPlasmaWindow::state::state_active); if (child != window) { child->set_state(LXQtTaskBarPlasmaWindow::state::state_active, LXQtTaskBarPlasmaWindow::state::state_active); } return true; } bool LXQtWMBackend_KWinWayland::closeWindow(WId windowId) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; window->close(); return true; } WId LXQtWMBackend_KWinWayland::getActiveWindow() const { if(activeWindow) return activeWindow->getWindowId(); return 0; } int LXQtWMBackend_KWinWayland::getWorkspacesCount(QScreen*) const { return m_workspaceInfo->numberOfDesktops(); } QString LXQtWMBackend_KWinWayland::getWorkspaceName(int idx, QString) const { return m_workspaceInfo->getDesktopName(idx - 1); //Return to 0-based } int LXQtWMBackend_KWinWayland::getCurrentWorkspace(QScreen*) const { if(!m_workspaceInfo->currentDesktop().isValid()) return 0; return m_workspaceInfo->position(m_workspaceInfo->currentDesktop()) + 1; // 1-based } bool LXQtWMBackend_KWinWayland::setCurrentWorkspace(int idx, QScreen*) { QString id = m_workspaceInfo->getDesktopId(idx - 1); //Return to 0-based if(id.isEmpty()) return false; m_workspaceInfo->requestActivate(id); return true; } int LXQtWMBackend_KWinWayland::getWindowWorkspace(WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return 0; // TODO: this protocol seems to allow multiple desktop for each window // We do not support that yet // Also from KDE Plasma task switch it's not clear how to actually put // a window on multiple desktops (which is different from "All desktops") QString id = window->virtualDesktops.value(0, QString()); if(id.isEmpty()) return 0; return m_workspaceInfo->position(id) + 1; //Make 1-based } bool LXQtWMBackend_KWinWayland::setWindowOnWorkspace(WId windowId, int idx) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; // Prepare for future multiple virtual desktops per window QList newDesktops; // Fill the list newDesktops.append(m_workspaceInfo->getDesktopId(idx - 1)); //Return to 0-based // Keep only valid IDs newDesktops.erase(std::remove_if(newDesktops.begin(), newDesktops.end(), [](const QString& id) { return id.isEmpty(); }), newDesktops.end()); // Add to new requested desktops for(const QString& id : std::as_const(newDesktops)) { if(!window->virtualDesktops.contains(id)) window->request_enter_virtual_desktop(id); } // Remove from non-requested destops const QList currentDesktops = window->virtualDesktops; for(const QString& id : std::as_const(currentDesktops)) { if(!newDesktops.contains(id)) window->request_leave_virtual_desktop(id); } return true; } void LXQtWMBackend_KWinWayland::moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) { Q_UNUSED(windowId) Q_UNUSED(next) Q_UNUSED(raiseOnCurrentDesktop) } bool LXQtWMBackend_KWinWayland::isWindowOnScreen(QScreen *screen, WId windowId) const { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return false; return screen->geometry().intersects(window->geometry); } bool LXQtWMBackend_KWinWayland::setDesktopLayout(Qt::Orientation, int, int, bool) { //TODO: implement return false; } void LXQtWMBackend_KWinWayland::moveApplication(WId windowId) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return; window->set_state(LXQtTaskBarPlasmaWindow::state::state_active, LXQtTaskBarPlasmaWindow::state::state_active); window->request_move(); } void LXQtWMBackend_KWinWayland::resizeApplication(WId windowId) { LXQtTaskBarPlasmaWindow *window = getWindow(windowId); if(!window) return; window->set_state(LXQtTaskBarPlasmaWindow::state::state_active, LXQtTaskBarPlasmaWindow::state::state_active); window->request_resize(); } void LXQtWMBackend_KWinWayland::refreshIconGeometry(WId windowId, const QRect &geom) { Q_UNUSED(windowId) Q_UNUSED(geom) } bool LXQtWMBackend_KWinWayland::isAreaOverlapped(const QRect &area) const { int d; for(auto &window : std::as_const(windows)) { if(!window->wasUnmapped && ((d = getWindowWorkspace(window->getWindowId())) == getCurrentWorkspace() || d == onAllWorkspacesEnum()) && !window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_minimized) && window->geometry.intersects(area)) { return true; } } return false; } bool LXQtWMBackend_KWinWayland::isShowingDesktop() const { return m_managment->isActive() ? m_managment->isShowingDesktop() : false; } bool LXQtWMBackend_KWinWayland::showDesktop(bool value) { if(!m_managment->isActive()) return false; // NOTE: Kwin's way of showing desktop is buggy. So, we do it ourself. /*enum LXQtTaskBarPlasmaWindowManagment::show_desktop flag_; if(value) flag_ = LXQtTaskBarPlasmaWindowManagment::show_desktop::show_desktop_enabled; else flag_ = LXQtTaskBarPlasmaWindowManagment::show_desktop::show_desktop_disabled; m_managment->show_desktop(flag_);*/ if (isShowingDesktop() == value) return false; // If the windows are going to be restored but all of them are already restored, // removed or closed (e.g., by the user), show the desktop instead. if (!value) { bool hasMinimized = false; for (auto windowId : std::as_const(showDesktopWins)) { if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized && findWindow(windows, getWindow(windowId)) != windows.end()) { hasMinimized = true; break; } } if (!hasMinimized) value = true; } if (value) { showDesktopWins.clear(); QVector wids = getCurrentWindows(); std::sort(wids.begin(), wids.end(), [this](WId id1, WId id2) { // sort the list by activation time to keep the z-order on restoring return (lastActivated.value(id1) < lastActivated.value(id2)); }); for (auto windowId : std::as_const(wids)) { if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) { // was minimized before showing the desktop and so, should not be restored later continue; } setWindowState(windowId, LXQtTaskBarWindowState::Minimized, true); showDesktopWins.push_back(windowId); } } else { for (auto windowId : std::as_const(showDesktopWins)) setWindowState(windowId, LXQtTaskBarWindowState::Minimized, false); if (!showDesktopWins.empty()) { // raise the last window raiseWindow(showDesktopWins.back(), false); } showDesktopWins.clear(); } m_managment->setShowingDesktop(!showDesktopWins.empty()); return true; } void LXQtWMBackend_KWinWayland::addWindow(LXQtTaskBarPlasmaWindow *window) { if (findWindow(windows, window) != windows.end() || transients.contains(window)) { return; } auto removeWindow = [window, this] { auto it = findWindow(windows, window); if (it != windows.end()) { if(window->acceptedInTaskBar) emit windowRemoved(window->getWindowId()); windows.erase(it); transientsDemandingAttention.remove(window); lastActivated.remove(window->getWindowId()); } else { // Could be a transient. // Removing a transient might change the demands attention state of the leader. if (transients.remove(window)) { if (LXQtTaskBarPlasmaWindow *leader = transientsDemandingAttention.key(window)) { transientsDemandingAttention.remove(leader, window); emit windowPropertyChanged(leader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } } } if (activeWindow == window) { activeWindow = nullptr; emit activeWindowChanged(0); } }; connect(window, &LXQtTaskBarPlasmaWindow::unmapped, this, removeWindow); connect(window, &LXQtTaskBarPlasmaWindow::titleChanged, this, [window, this] { updateWindowAcceptance(window); if(window->acceptedInTaskBar) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Title)); }); connect(window, &LXQtTaskBarPlasmaWindow::iconChanged, this, [window, this] { updateWindowAcceptance(window); if(window->acceptedInTaskBar) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Icon)); }); connect(window, &LXQtTaskBarPlasmaWindow::geometryChanged, this, [window, this] { updateWindowAcceptance(window); if(window->acceptedInTaskBar) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Geometry)); }); connect(window, &LXQtTaskBarPlasmaWindow::appIdChanged, this, [window, this] { emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::WindowClass)); }); if (window->windowState & LXQtTaskBarPlasmaWindow::state::state_active) { LXQtTaskBarPlasmaWindow *effectiveActive = window; while (effectiveActive->parentWindow) { effectiveActive = effectiveActive->parentWindow; } setLastActivated(effectiveActive->getWindowId()); activeWindow = effectiveActive; } connect(window, &LXQtTaskBarPlasmaWindow::activeChanged, this, [window, this] { const bool active = window->windowState & LXQtTaskBarPlasmaWindow::state::state_active; LXQtTaskBarPlasmaWindow *effectiveWindow = window; while (effectiveWindow->parentWindow) { effectiveWindow = effectiveWindow->parentWindow; } if (active) { setLastActivated(effectiveWindow->getWindowId()); if (activeWindow != effectiveWindow) { activeWindow = effectiveWindow; emit activeWindowChanged(activeWindow->getWindowId()); } } #if (QT_VERSION >= QT_VERSION_CHECK(6,8,0)) else if (activeWindow == effectiveWindow) { activeWindow = nullptr; emit activeWindowChanged(0); } #endif }); connect(window, &LXQtTaskBarPlasmaWindow::parentWindowChanged, this, [window, this] { LXQtTaskBarPlasmaWindow *leader = window->parentWindow.data(); // Migrate demanding attention to new leader. if (window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_demands_attention)) { if (auto *oldLeader = transientsDemandingAttention.key(window)) { if (window->parentWindow != oldLeader) { transientsDemandingAttention.remove(oldLeader, window); emit windowPropertyChanged(oldLeader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); if (!window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active) && !leader->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active)) { transientsDemandingAttention.insert(leader, window); emit windowPropertyChanged(leader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } } } } if (transients.remove(window)) { if (leader) { // leader change. transients.insert(window, leader); } else { // lost a leader, add to regular windows list. Q_ASSERT(findWindow(windows, window) == windows.end()); windows.emplace_back(window); } } else if (leader) { // gained a leader, remove from regular windows list. auto it = findWindow(windows, window); Q_ASSERT(it != windows.end()); if(window->acceptedInTaskBar) emit windowRemoved(window->getWindowId()); windows.erase(it); lastActivated.remove(window->getWindowId()); } }); auto stateChanged = [window, this] { updateWindowAcceptance(window); if(window->acceptedInTaskBar) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::State)); // make sure that a minimized window isn't considered active if (window == activeWindow && window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_minimized)) { activeWindow = nullptr; emit activeWindowChanged(0); } }; connect(window, &LXQtTaskBarPlasmaWindow::fullscreenChanged, this, stateChanged); connect(window, &LXQtTaskBarPlasmaWindow::maximizedChanged, this, stateChanged); connect(window, &LXQtTaskBarPlasmaWindow::minimizedChanged, this, stateChanged); connect(window, &LXQtTaskBarPlasmaWindow::shadedChanged, this, stateChanged); auto workspaceChanged = [window, this] { updateWindowAcceptance(window); if(window->acceptedInTaskBar) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Workspace)); }; connect(window, &LXQtTaskBarPlasmaWindow::virtualDesktopEntered, this, workspaceChanged); connect(window, &LXQtTaskBarPlasmaWindow::virtualDesktopLeft, this, workspaceChanged); connect(window, &LXQtTaskBarPlasmaWindow::demandsAttentionChanged, this, [window, this] { // Changes to a transient's state might change demands attention state for leader. if (auto *leader = transients.value(window)) { if (window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_demands_attention)) { if (!window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active) && !leader->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active) && !transientsDemandingAttention.values(leader).contains(window)) { transientsDemandingAttention.insert(leader, window); emit windowPropertyChanged(leader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } } else if (transientsDemandingAttention.remove(window)) { emit windowPropertyChanged(leader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } } else { emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } }); connect(window, &LXQtTaskBarPlasmaWindow::skipTaskbarChanged, this, [window, this] { updateWindowAcceptance(window); }); // QObject::connect(window, &PlasmaWindow::applicationMenuChanged, q, [window, this] { // this->dataChanged(window, QList{ApplicationMenuServiceName, ApplicationMenuObjectPath}); // }); // Handle transient. if (LXQtTaskBarPlasmaWindow *leader = window->parentWindow.data()) { transients.insert(window, leader); // Update demands attention state for leader. if (window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_demands_attention) && !window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active) && !leader->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_active)) { transientsDemandingAttention.insert(leader, window); if (leader->acceptedInTaskBar) emit windowPropertyChanged(leader->getWindowId(), int(LXQtTaskBarWindowProperty::Urgency)); } } else { windows.emplace_back(window); updateWindowAcceptance(window); } } bool LXQtWMBackend_KWinWayland::acceptWindow(LXQtTaskBarPlasmaWindow *window) const { if(window->windowState.testFlag(LXQtTaskBarPlasmaWindow::state::state_skiptaskbar)) return false; if(transients.contains(window)) return false; return true; } void LXQtWMBackend_KWinWayland::updateWindowAcceptance(LXQtTaskBarPlasmaWindow *window) { if(!window->acceptedInTaskBar && acceptWindow(window)) { window->acceptedInTaskBar = true; emit windowAdded(window->getWindowId()); } else if(window->acceptedInTaskBar && !acceptWindow(window)) { window->acceptedInTaskBar = false; emit windowRemoved(window->getWindowId()); } } LXQtTaskBarPlasmaWindow *LXQtWMBackend_KWinWayland::getWindow(WId windowId) const { for(auto &window : std::as_const(windows)) { if(window->getWindowId() == windowId) return window.get(); } return nullptr; } void LXQtWMBackend_KWinWayland::setLastActivated(WId id) { auto t = QDateTime::currentMSecsSinceEpoch(); while (lastActivated.key(t) != 0) ++t; // make sure the times are not equal lastActivated[id] = t; } int LXQtWMBackendKWinWaylandLibrary::getBackendScore(const QString &key) const { auto waylandApplication = qGuiApp->nativeInterface(); if(waylandApplication == nullptr) return 0; static const QStringList supportedList = {QStringLiteral("KDE"), QStringLiteral("KWIN"), QStringLiteral("kwin_wayland")}; if (supportedList.contains(key, Qt::CaseInsensitive)) { return 100; } // It's not useful for other wayland compositors return 0; } ILXQtAbstractWMInterface *LXQtWMBackendKWinWaylandLibrary::instance() const { return new LXQtWMBackend_KWinWayland; } ================================================ FILE: panel/backends/wayland/kwin_wayland/lxqtwmbackend_kwinwayland.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_WM_BACKEND_KWIN_WAYLAND_H #define LXQT_WM_BACKEND_KWIN_WAYLAND_H #include "../../ilxqtabstractwmiface.h" #include #include #include class LXQtTaskBarPlasmaWindow; class LXQtTaskBarPlasmaWindowManagment; class LXQtPlasmaWaylandWorkspaceInfo; class LXQtWMBackend_KWinWayland : public ILXQtAbstractWMInterface { Q_OBJECT public: explicit LXQtWMBackend_KWinWayland(QObject *parent = nullptr); // Backend virtual bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const override; // Windows virtual bool reloadWindows() override; virtual QVector getCurrentWindows() const override; virtual QString getWindowTitle(WId windowId) const override; virtual bool applicationDemandsAttention(WId windowId) const override; virtual QIcon getApplicationIcon(WId windowId, int devicePixels) const override; virtual QString getWindowClass(WId windowId) const override; virtual LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const override; virtual bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) override; virtual LXQtTaskBarWindowState getWindowState(WId windowId) const override; virtual bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) override; virtual bool isWindowActive(WId windowId) const override; virtual bool raiseWindow(WId windowId, bool onCurrentWorkSpace) override; virtual bool closeWindow(WId windowId) override; virtual WId getActiveWindow() const override; // Workspaces virtual int getWorkspacesCount(QScreen *screen = nullptr) const override; virtual QString getWorkspaceName(int idx, QString sceenName = QString()) const override; virtual int getCurrentWorkspace(QScreen *screen = nullptr) const override; virtual bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) override; virtual int getWindowWorkspace(WId windowId) const override; virtual bool setWindowOnWorkspace(WId windowId, int idx) override; virtual void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) override; virtual bool isWindowOnScreen(QScreen *screen, WId windowId) const override; virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) override; // X11 Specific virtual void moveApplication(WId windowId) override; virtual void resizeApplication(WId windowId) override; virtual void refreshIconGeometry(WId windowId, const QRect &geom) override; // Panel internal virtual bool isAreaOverlapped(const QRect& area) const override; // Show Destop virtual bool isShowingDesktop() const override; virtual bool showDesktop(bool value) override; private: void addWindow(LXQtTaskBarPlasmaWindow *window); bool acceptWindow(LXQtTaskBarPlasmaWindow *window) const; void updateWindowAcceptance(LXQtTaskBarPlasmaWindow *window); void setLastActivated(WId id); private: LXQtTaskBarPlasmaWindow *getWindow(WId windowId) const; std::unique_ptr m_workspaceInfo; std::unique_ptr m_managment; QHash lastActivated; LXQtTaskBarPlasmaWindow *activeWindow = nullptr; std::vector> windows; // key=transient child, value=leader QHash transients; // key=leader, values=transient children QMultiHash transientsDemandingAttention; // for showing desktop std::vector showDesktopWins; }; class LXQtWMBackendKWinWaylandLibrary: public QObject, public ILXQtWMBackendLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/WMInterface/1.0") Q_INTERFACES(ILXQtWMBackendLibrary) public: int getBackendScore(const QString& key) const override; ILXQtAbstractWMInterface* instance() const override; }; #endif // LXQT_WM_BACKEND_KWIN_WAYLAND_H ================================================ FILE: panel/backends/wayland/kwin_wayland/protocols/org-kde-plasma-virtual-desktop.xml ================================================ Given the id of a particular virtual desktop, get the corresponding org_kde_plasma_virtual_desktop which represents only the desktop with that id. Ask the server to create a new virtual desktop, and position it at a specified position. If the position is zero or less, it will be positioned at the beginning, if the position is the count or more, it will be positioned at the end. Ask the server to get rid of a virtual desktop, the server may or may not acconsent to the request. This event is sent after all other properties has been sent after binding to the desktop manager object and after any other property changes done after that. This allows changes to the org_kde_plasma_virtual_desktop_management properties to be seen as atomic, even if they happen via multiple events. Request the server to set the status of this desktop to active: The server is free to consent or deny the request. This will be the new "current" virtual desktop of the system. The format of the id is decided by the compositor implementation. A desktop id univocally identifies a virtual desktop and must be guaranteed to never exist two desktops with the same id. The format of the string id is up to the server implementation. The desktop will be the new "current" desktop of the system. The server may support either one virtual desktop active at a time, or other combinations such as one virtual desktop active per screen. Windows associated to this virtual desktop will be shown. Windows that were associated only to this desktop will be hidden. This event is sent after all other properties has been sent after binding to the desktop object and after any other property changes done after that. This allows changes to the org_kde_plasma_virtual_desktop properties to be seen as atomic, even if they happen via multiple events. This virtual desktop has just been removed by the server: All windows will lose the association to this desktop. ================================================ FILE: panel/backends/wayland/kwin_wayland/protocols/plasma-window-management.xml ================================================ This interface manages application windows. It provides requests to show and hide the desktop and emits an event every time a window is created so that the client can use it to manage the window. Only one client can bind this interface at a time. Tell the compositor to show/hide the desktop. Deprecated: use get_window_by_uuid This event will be sent whenever the show desktop mode changes. E.g. when it is entered or left. On binding the interface the current state is sent. This event will be sent immediately after a window is mapped. This event will be sent when stacking order changed and on bind This event will be sent when stacking order changed and on bind This event will be sent immediately after a window is mapped. Manages and control an application window. Only one client can bind this interface at a time. Set window state. Values for state argument are described by org_kde_plasma_window_management.state and can be used together in a bitfield. The flags bitfield describes which flags are supposed to be set, the state bitfield the value for the set flags Deprecated: use enter_virtual_desktop Maps the window to a different virtual desktop. To show the window on all virtual desktops, call the org_kde_plasma_window.set_state request and specify a on_all_desktops state in the bitfield. Sets the geometry of the taskbar entry for this window. The geometry is relative to a panel in particular. Remove the task geometry information for a particular panel. Close this window. Request an interactive move for this window. Request an interactive resize for this window. Removes the resource bound for this org_kde_plasma_window. The compositor will write the window icon into the provided file descriptor. The data is a serialized QIcon with QDataStream. This event will be sent as soon as the window title is changed. This event will be sent as soon as the application identifier is changed. This event will be sent as soon as the window state changes. Values for state argument are described by org_kde_plasma_window_management.state. DEPRECATED: use virtual_desktop_entered and virtual_desktop_left instead This event will be sent when a window is moved to another virtual desktop. It is not sent if it becomes visible on all virtual desktops though. This event will be sent whenever the themed icon name changes. May be null. This event will be sent immediately after the window is closed and its surface is unmapped. This event will be sent immediately after all initial state been sent to the client. If the Plasma window is already unmapped, the unmapped event will be sent before the initial_state event. This event will be sent whenever the parent window of this org_kde_plasma_window changes. The passed parent is another org_kde_plasma_window and this org_kde_plasma_window is a transient window to the parent window. If the parent argument is null, this org_kde_plasma_window does not have a parent window. This event will be sent whenever the window geometry of this org_kde_plasma_window changes. The coordinates are in absolute coordinates of the windowing system. This event will be sent whenever the icon of the window changes, but there is no themed icon name. Common examples are Xwayland windows which have a pixmap based icon. The client can request the icon using get_icon. This event will be sent when the compositor has set the process id this window belongs to. This should be set once before the initial_state is sent. Make the window enter a virtual desktop. A window can enter more than one virtual desktop. if the id is empty or invalid, no action will be performed. RFC: do this with an empty id to request_enter_virtual_desktop? Make the window enter a new virtual desktop. If the server consents the request, it will create a new virtual desktop and assign the window to it. Make the window exit a virtual desktop. If it exits all desktops it will be considered on all of them. This event will be sent when the window has entered a new virtual desktop. The window can be on more than one desktop, or none: then is considered on all of them. This event will be sent when the window left a virtual desktop. If the window leaves all desktops, it can be considered on all. If the window gets manually added on all desktops, the server has to send virtual_desktop_left for every previous desktop it was in for the window to be really considered on all desktops. This event will be sent after the application menu for the window has changed. Make the window enter an activity. A window can enter more activity. If the id is empty or invalid, no action will be performed. Make the window exit a an activity. If it exits all activities it will be considered on all of them. This event will be sent when the window has entered an activity. The window can be on more than one activity, or none: then is considered on all of them. This event will be sent when the window left an activity. If the window leaves all activities, it will be considered on all. If the window gets manually added on all activities, the server has to send activity_left for every previous activity it was in for the window to be really considered on all activities. Requests this window to be displayed in a specific output. This event will be sent when the X11 resource name of the window has changed. This is only set for XWayland windows. The activation manager interface provides a way to get notified when an application is about to be activated. Destroy the activation manager object. The activation objects introduced by this manager object will be unaffected. Will be issued when an app is set to be activated. It offers an instance of org_kde_plasma_activation that will tell us the app_id and the extent of the activation. Notify the compositor that the org_kde_plasma_activation object will no longer be used. ================================================ FILE: panel/backends/wayland/protocols/org-kde-plasma-virtual-desktop.xml ================================================ Given the id of a particular virtual desktop, get the corresponding org_kde_plasma_virtual_desktop which represents only the desktop with that id. Ask the server to create a new virtual desktop, and position it at a specified position. If the position is zero or less, it will be positioned at the beginning, if the position is the count or more, it will be positioned at the end. Ask the server to get rid of a virtual desktop, the server may or may not acconsent to the request. This event is sent after all other properties has been sent after binding to the desktop manager object and after any other property changes done after that. This allows changes to the org_kde_plasma_virtual_desktop_management properties to be seen as atomic, even if they happen via multiple events. Request the server to set the status of this desktop to active: The server is free to consent or deny the request. This will be the new "current" virtual desktop of the system. The format of the id is decided by the compositor implementation. A desktop id univocally identifies a virtual desktop and must be guaranteed to never exist two desktops with the same id. The format of the string id is up to the server implementation. The desktop will be the new "current" desktop of the system. The server may support either one virtual desktop active at a time, or other combinations such as one virtual desktop active per screen. Windows associated to this virtual desktop will be shown. Windows that were associated only to this desktop will be hidden. This event is sent after all other properties has been sent after binding to the desktop object and after any other property changes done after that. This allows changes to the org_kde_plasma_virtual_desktop properties to be seen as atomic, even if they happen via multiple events. This virtual desktop has just been removed by the server: All windows will lose the association to this desktop. ================================================ FILE: panel/backends/wayland/protocols/plasma-window-management.xml ================================================ This interface manages application windows. It provides requests to show and hide the desktop and emits an event every time a window is created so that the client can use it to manage the window. Only one client can bind this interface at a time. Tell the compositor to show/hide the desktop. Deprecated: use get_window_by_uuid This event will be sent whenever the show desktop mode changes. E.g. when it is entered or left. On binding the interface the current state is sent. This event will be sent immediately after a window is mapped. This event will be sent when stacking order changed and on bind This event will be sent when stacking order changed and on bind This event will be sent immediately after a window is mapped. Manages and control an application window. Only one client can bind this interface at a time. Set window state. Values for state argument are described by org_kde_plasma_window_management.state and can be used together in a bitfield. The flags bitfield describes which flags are supposed to be set, the state bitfield the value for the set flags Deprecated: use enter_virtual_desktop Maps the window to a different virtual desktop. To show the window on all virtual desktops, call the org_kde_plasma_window.set_state request and specify a on_all_desktops state in the bitfield. Sets the geometry of the taskbar entry for this window. The geometry is relative to a panel in particular. Remove the task geometry information for a particular panel. Close this window. Request an interactive move for this window. Request an interactive resize for this window. Removes the resource bound for this org_kde_plasma_window. The compositor will write the window icon into the provided file descriptor. The data is a serialized QIcon with QDataStream. This event will be sent as soon as the window title is changed. This event will be sent as soon as the application identifier is changed. This event will be sent as soon as the window state changes. Values for state argument are described by org_kde_plasma_window_management.state. DEPRECATED: use virtual_desktop_entered and virtual_desktop_left instead This event will be sent when a window is moved to another virtual desktop. It is not sent if it becomes visible on all virtual desktops though. This event will be sent whenever the themed icon name changes. May be null. This event will be sent immediately after the window is closed and its surface is unmapped. This event will be sent immediately after all initial state been sent to the client. If the Plasma window is already unmapped, the unmapped event will be sent before the initial_state event. This event will be sent whenever the parent window of this org_kde_plasma_window changes. The passed parent is another org_kde_plasma_window and this org_kde_plasma_window is a transient window to the parent window. If the parent argument is null, this org_kde_plasma_window does not have a parent window. This event will be sent whenever the window geometry of this org_kde_plasma_window changes. The coordinates are in absolute coordinates of the windowing system. This event will be sent whenever the icon of the window changes, but there is no themed icon name. Common examples are Xwayland windows which have a pixmap based icon. The client can request the icon using get_icon. This event will be sent when the compositor has set the process id this window belongs to. This should be set once before the initial_state is sent. Make the window enter a virtual desktop. A window can enter more than one virtual desktop. if the id is empty or invalid, no action will be performed. RFC: do this with an empty id to request_enter_virtual_desktop? Make the window enter a new virtual desktop. If the server consents the request, it will create a new virtual desktop and assign the window to it. Make the window exit a virtual desktop. If it exits all desktops it will be considered on all of them. This event will be sent when the window has entered a new virtual desktop. The window can be on more than one desktop, or none: then is considered on all of them. This event will be sent when the window left a virtual desktop. If the window leaves all desktops, it can be considered on all. If the window gets manually added on all desktops, the server has to send virtual_desktop_left for every previous desktop it was in for the window to be really considered on all desktops. This event will be sent after the application menu for the window has changed. Make the window enter an activity. A window can enter more activity. If the id is empty or invalid, no action will be performed. Make the window exit a an activity. If it exits all activities it will be considered on all of them. This event will be sent when the window has entered an activity. The window can be on more than one activity, or none: then is considered on all of them. This event will be sent when the window left an activity. If the window leaves all activities, it will be considered on all. If the window gets manually added on all activities, the server has to send activity_left for every previous activity it was in for the window to be really considered on all activities. Requests this window to be displayed in a specific output. This event will be sent when the X11 resource name of the window has changed. This is only set for XWayland windows. The activation manager interface provides a way to get notified when an application is about to be activated. Destroy the activation manager object. The activation objects introduced by this manager object will be unaffected. Will be issued when an app is set to be activated. It offers an instance of org_kde_plasma_activation that will tell us the app_id and the extent of the activation. Notify the compositor that the org_kde_plasma_activation object will no longer be used. ================================================ FILE: panel/backends/wayland/wayfire/CMakeLists.txt ================================================ set(PLATFORM_NAME wayfire) set(PREFIX_NAME wmbackend) set(PROGRAM "lxqt-panel") set(BACKEND "backend") set(NAME ${PREFIX_NAME}_${PLATFORM_NAME}) project(${PROGRAM}_${BACKEND}_${NAME}) find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS WaylandClient Concurrent) find_package(Qt6Xdg) set(PROG_SHARE_DIR ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}/${BACKEND}) set(PLUGIN_SHARE_DIR ${PROG_SHARE_DIR}/${BACKEND}/${NAME}) #************************************************ if (NOT DEFINED PLUGIN_DIR) set (PLUGIN_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROGRAM}) endif (NOT DEFINED PLUGIN_DIR) set(QTX_LIBRARIES Qt6::Gui Qt6::GuiPrivate) set( SRC wayfire-common.cpp wayfire-common.h lxqtwmbackend_wf.cpp lxqtwmbackend_wf.h ) add_library(${NAME} MODULE ${SRC}) # build dynamically loadable modules install(TARGETS ${NAME} DESTINATION ${PLUGIN_DIR}/${BACKEND}) # install the *.so file target_link_libraries(${NAME} ${QTX_LIBRARIES} Qt6::Concurrent Qt6::WaylandClient Qt6Xdg) ================================================ FILE: panel/backends/wayland/wayfire/lxqtwmbackend_wf.cpp ================================================ #include "wayfire-common.h" #include "lxqtwmbackend_wf.h" #include #include #include #include #include // Shortforms #define QSL QStringLiteral #define U8Str QString::fromUtf8 static inline QJsonObject updateJsonObject(QJsonObject source, QJsonObject other) { /** Overwrite all (key,value) pairs of @osurce from @other */ for ( QString key : other.keys()) { source[key] = other[key]; } return source; } static inline bool isValidToplevel(QJsonObject view) { if (view.isEmpty()) { return false; } /** Ghost view: these are unmapped xwayland views */ if (view[QSL("pid")].toInt() <= 1) { return false; } /** We want only the "toplevel" views */ if (view[QSL("role")].toString() != QSL("toplevel")) { return false; } /** We want only the mapped views */ if (view[QSL("mapped")].toBool() == false) { return false; } return true; } static inline QString getPixmapIcon(QString name) { QStringList paths{ QSL("/usr/local/share/pixmaps/"), QSL("/usr/share/pixmaps/"), }; QStringList sfxs{ QSL(".svg"), QSL(".png"), QSL(".xpm") }; for (QString path : paths) { for (QString sfx : sfxs) { if (QFile::exists(path + name + sfx)) { return path + name + sfx; } } } return QString(); } QIcon getIconForAppId(QString mAppId) { if (mAppId.isEmpty() or (mAppId == QSL("Unknown"))) { return QIcon(); } /** Wine apps */ if (mAppId.endsWith(QSL(".exe"))) { return QIcon::fromTheme(QSL("wine")); } /** Check if a theme icon exists called @mAppId */ if (QIcon::hasThemeIcon(mAppId)) { return QIcon::fromTheme(mAppId); } /** Check if the theme icon is @mAppId, but all lower-case letters */ else if (QIcon::hasThemeIcon(mAppId.toLower())) { return QIcon::fromTheme(mAppId.toLower()); } const QStringList appDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation); /** * Assume mAppId == desktop-file-name (ideal situation) or mAppId.toLower() == desktop-file-name (cheap * fallback) */ QString iconName; for (const QString &path : appDirs) { /** Get the icon name from desktop (mAppId: as it is) */ if (QFile::exists(path + mAppId + QSL(".desktop"))) { QSettings desktop(path + mAppId + QSL(".desktop"), QSettings::IniFormat); iconName = desktop.value(QSL("Desktop Entry/Icon")).toString(); } /** Get the icon name from desktop (mAppId: all lower-case letters) */ else if (QFile::exists(path + mAppId.toLower() + QSL(".desktop"))) { QSettings desktop(path + mAppId.toLower() + QSL(".desktop"), QSettings::IniFormat); iconName = desktop.value(QSL("Desktop Entry/Icon")).toString(); } /** No icon specified: try else-where */ if (iconName.isEmpty()) { continue; } /** We got an iconName, and it's in the current theme */ if (QIcon::hasThemeIcon(iconName)) { return QIcon::fromTheme(iconName); } /** Not a theme icon, but an absolute path */ else if (QFile::exists(iconName)) { return QIcon(iconName); } /** Not theme icon or absolute path. So check /usr/share/pixmaps/ */ else { iconName = getPixmapIcon(iconName); if (not iconName.isEmpty()) { return QIcon(iconName); } } } /* Check all desktop files for @mAppId */ for (const QString &path : appDirs) { QStringList desktops = QDir(path).entryList({QSL("*.desktop")}); for (QString dskf : desktops) { QSettings desktop(path + dskf, QSettings::IniFormat); QString exec = desktop.value(QSL("Desktop Entry/Exec"), QSL("abcd1234/-")).toString(); QString name = desktop.value(QSL("Desktop Entry/Name"), QSL("abcd1234/-")).toString(); QString cls = desktop.value(QSL("Desktop Entry/StartupWMClass"), QSL("abcd1234/-")).toString(); QString execPath = U8Str(std::filesystem::path(exec.toStdString()).filename().c_str()); if (mAppId.compare(execPath, Qt::CaseInsensitive) == 0) { iconName = desktop.value(QSL("Desktop Entry/Icon")).toString(); } else if (mAppId.compare(name, Qt::CaseInsensitive) == 0) { iconName = desktop.value(QSL("Desktop Entry/Icon")).toString(); } else if (mAppId.compare(cls, Qt::CaseInsensitive) == 0) { iconName = desktop.value(QSL("Desktop Entry/Icon")).toString(); } if (!iconName.isEmpty()) { if (QIcon::hasThemeIcon(iconName)) { return QIcon::fromTheme(iconName); } else if (QFile::exists(iconName)) { return QIcon(iconName); } else { iconName = getPixmapIcon(iconName); if (!iconName.isEmpty()) { return QIcon(iconName); } } } } } iconName = getPixmapIcon(iconName); if (not iconName.isEmpty()) { return QIcon(iconName); } return QIcon(); } LXQtTaskbarWayfireBackend::LXQtTaskbarWayfireBackend(QObject *parent) : ILXQtAbstractWMInterface(parent) { mWayfire.reset(new LXQt::Panel::Wayfire); connect(mWayfire.get(), &LXQt::Panel::Wayfire::workspaceSetChanged, [] ( QJsonDocument ) { // no-op }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::workspaceChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject output = response[QSL("output-data")].toObject(); QString outputName = output[QSL("name")].toString(); QJsonObject outputInfo = mWayfire->getOutputInfo(mWayfire->getActiveOutput()); QJsonObject outputWS = outputInfo[QSL("workspace")].toObject(); int nCols = outputWS[QSL("grid_width")].toInt(); // Total columns in workspace grid int curRow = outputWS[QSL("y")].toInt(); // Current workspace row (0-based) int curCol = outputWS[QSL("x")].toInt(); // Current workspace column (0-based) emit currentWorkspaceChanged(curRow * nCols + curCol + 1, outputName); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewMapped, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); if (mViews.contains(viewId)) { emit windowRemoved(viewId); } /** Filter non-toplevel views */ if (!isValidToplevel(view)) { mViews.remove(viewId); return; } mViews[viewId] = view; emit windowAdded(viewId); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewTitleChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::Title); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewAppIdChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::WindowClass); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::Icon); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewFocused, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit activeWindowChanged(viewId); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewMinimized, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::State); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewTiled, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::State); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewGeometryChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::Geometry); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewOutputChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } //QString oldOp; if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); }/* else { oldOp = mViews[viewId][QSL("output-name")].toString(); } QString newOp = view[QSL("output-name")].toString();*/ mViews[viewId] = updateJsonObject(mViews[viewId], view); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::Geometry); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewWorkspaceChanged, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); /** Filter non-toplevel views */ if (!isValidToplevel(view)) { if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } return; } if (!mViews.contains(viewId)) { mViews[viewId] = view; emit windowAdded(viewId); } mViews[viewId] = updateJsonObject(mViews[viewId], view); mViews[viewId][QSL("workspace")] = QJsonObject({ {QSL("x"), response[QSL("to")][QSL("x")]}, {QSL("y"), response[QSL("to")][QSL("y")]} }); emit windowPropertyChanged(viewId, (int)LXQtTaskBarWindowProperty::Workspace); }); connect(mWayfire.get(), &LXQt::Panel::Wayfire::viewUnmapped, [this] ( QJsonDocument respJson ) { QJsonObject response = respJson.object(); QJsonObject view = response[QSL("view")].toObject(); WaylandId viewId(view[QSL("id")].toInt()); if (mViews.contains(viewId)) { mViews.remove(viewId); emit windowRemoved(viewId); } }); mWayfire->connectToServer(); } bool LXQtTaskbarWayfireBackend::supportsAction(WId, LXQtTaskBarBackendAction action) const { switch (action) { case LXQtTaskBarBackendAction::Move: return false; case LXQtTaskBarBackendAction::Resize: return false; case LXQtTaskBarBackendAction::Maximize: return true; /** To be implemented in wayfire ipc */ case LXQtTaskBarBackendAction::MaximizeVertically: return false; /** To be implemented in wayfire ipc */ case LXQtTaskBarBackendAction::MaximizeHorizontally: return false; case LXQtTaskBarBackendAction::Minimize: return true; /** Not implemented */ case LXQtTaskBarBackendAction::RollUp: return false; case LXQtTaskBarBackendAction::FullScreen: return true; case LXQtTaskBarBackendAction::DesktopSwitch: return true; /** Available via wsets plugin */ case LXQtTaskBarBackendAction::MoveToDesktop: return true; /** Not implemented yet */ case LXQtTaskBarBackendAction::MoveToLayer: return false; /** Available via wsets plugin */ case LXQtTaskBarBackendAction::MoveToOutput: return true; default: return false; } return false; } bool LXQtTaskbarWayfireBackend::reloadWindows() { // Force removal and re-adding for (WaylandId viewId : mViews.keys()) { mViews.remove(viewId); emit windowRemoved(viewId); } QJsonArray views = mWayfire->listViews(); while (views.count()) { QJsonObject view = views.takeAt(0).toObject(); WaylandId id(view[QSL("id")].toInt()); mViews[id] = view; emit windowAdded(id); } return true; } QVector LXQtTaskbarWayfireBackend::getCurrentWindows() const { QVector ids; for ( WaylandId viewId : mViews.keys()) { ids << viewId; } return ids; } QString LXQtTaskbarWayfireBackend::getWindowTitle(WId windowId) const { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return QString(); } return mViews[viewId][QSL("title")].toString(); } bool LXQtTaskbarWayfireBackend::applicationDemandsAttention(WId) const { return false; } QIcon LXQtTaskbarWayfireBackend::getApplicationIcon(WId windowId, int devicePixels) const { Q_UNUSED(devicePixels) WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return QIcon(); } return getIconForAppId(mViews[viewId][QSL("app-id")].toString()); } QString LXQtTaskbarWayfireBackend::getWindowClass(WId windowId) const { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return QString(); } return mViews[viewId][QSL("app-id")].toString(); } LXQtTaskBarWindowLayer LXQtTaskbarWayfireBackend::getWindowLayer(WId) const { return LXQtTaskBarWindowLayer::Normal; } bool LXQtTaskbarWayfireBackend::setWindowLayer(WId, LXQtTaskBarWindowLayer) { return false; } LXQtTaskBarWindowState LXQtTaskbarWayfireBackend::getWindowState(WId windowId) const { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return LXQtTaskBarWindowState::Hidden; } if (!mViews[viewId][QSL("mapped")].toBool()) { return LXQtTaskBarWindowState::Hidden; } if (mViews[viewId][QSL("minimized")].toBool()) { return LXQtTaskBarWindowState::Minimized; } if (mViews[viewId][QSL("fullscreen")].toBool()) { return LXQtTaskBarWindowState::FullScreen; } // WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT == 1 | 2 | 4 | 8 == 15 if (mViews[viewId][QSL("tiled-edges")].toInt() > 0) { return LXQtTaskBarWindowState::Maximized; } // // WLR_EDGE_TOP | WLR_EDGE_BOTTOM == 1 | 2 == 3 // if (mViews[viewId][QSL("tiled-edges")].toInt() == 3) // { // return LXQtTaskBarWindowState::MaximizedVertically; // } // // WLR_EDGE_LEFT | WLR_EDGE_RIGHT == 4 | 8 == 12 // if (mViews[viewId][QSL("tiled-edges")].toInt() == 12) // { // return LXQtTaskBarWindowState::MaximizedHorizontally; // } return LXQtTaskBarWindowState::Normal; } bool LXQtTaskbarWayfireBackend::setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return false; } switch (state) { case LXQtTaskBarWindowState::Minimized: { mWayfire->minimizeView(viewId, set); break; } case LXQtTaskBarWindowState::Maximized: { mWayfire->maximizeView(viewId, (set ? 15 : 0)); break; } case LXQtTaskBarWindowState::MaximizedVertically: { mWayfire->maximizeView(viewId, (set ? 3 : 0)); break; } case LXQtTaskBarWindowState::MaximizedHorizontally: { mWayfire->maximizeView(viewId, (set ? 12 : 0)); break; } case LXQtTaskBarWindowState::Normal: { mWayfire->restoreView(viewId); break; } case LXQtTaskBarWindowState::FullScreen: { mWayfire->fullscreenView(viewId, set); break; } default: return false; } return true; } bool LXQtTaskbarWayfireBackend::isWindowActive(WId windowId) const { WaylandId viewId(windowId); return (mWayfire->getActiveView() == viewId); } bool LXQtTaskbarWayfireBackend::raiseWindow(WId windowId, bool onCurrentWorkSpace) { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return false; } if (getWindowState(windowId)==LXQtTaskBarWindowState::Minimized) { mWayfire->minimizeView(WaylandId(windowId), false); // Wayfire::focusView() does not switch the workspace if the window was minimized, // although it reports that the window is focused. This is a workaround: if (!onCurrentWorkSpace) setCurrentWorkspace(getWindowWorkspace(windowId)); } bool raised = mWayfire->focusView(viewId); if (onCurrentWorkSpace) mWayfire->sendViewToWorkspace(viewId, getCurrentWorkspace()); return raised; } bool LXQtTaskbarWayfireBackend::closeWindow(WId windowId) { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return false; } return mWayfire->closeView(viewId); } WId LXQtTaskbarWayfireBackend::getActiveWindow() const { return mWayfire->getActiveView(); } int LXQtTaskbarWayfireBackend::getWorkspacesCount(QScreen*) const { QJsonObject wsetsInfo = mWayfire->getWorkspaceSetsInfo().at(0).toObject(); QJsonObject workspace = wsetsInfo[QSL("workspace")].toObject(); int64_t nRows = workspace[QSL("grid_height")].toInt(); int64_t nCols = workspace[QSL("grid_width")].toInt(); return (nRows * nCols); } QString LXQtTaskbarWayfireBackend::getWorkspaceName(int x, QString outputName) const { return mWayfire->getWorkspaceName(x, outputName); } int LXQtTaskbarWayfireBackend::getCurrentWorkspace(QScreen*) const { QJsonObject outputInfo = mWayfire->getOutputInfo(mWayfire->getActiveOutput()); QJsonObject outputWS = outputInfo[QSL("workspace")].toObject(); int nCols = outputWS[QSL("grid_width")].toInt(); // Total columns in workspace grid int curRow = outputWS[QSL("y")].toInt(); // Current workspace row (0-based) int curCol = outputWS[QSL("x")].toInt(); // Current workspace column (0-based) return curRow * nCols + curCol + 1; } bool LXQtTaskbarWayfireBackend::setCurrentWorkspace(int x, QScreen*) { return mWayfire->switchToWorkspace(mWayfire->getActiveOutput(), x); } int LXQtTaskbarWayfireBackend::getWindowWorkspace(WId windowId) const { WaylandId viewId(windowId); QJsonObject viewInfo = mWayfire->getViewInfo(viewId); QJsonObject outputInfo = mWayfire->getOutputInfo(WaylandId(viewInfo[QSL("output-id")].toInt())); QJsonObject outputWS = outputInfo[QSL("workspace")].toObject(); int nRows = outputWS[QSL("grid_height")].toInt(); // Total rows in workspace grid int nCols = outputWS[QSL("grid_width")].toInt(); // Total columns in workspace grid if (viewInfo.contains(QSL("workspace"))) { int currentRow = viewInfo[QSL("workspace")][QSL("y")].toInt(); // Current workspace row (0-based) int currentCol = viewInfo[QSL("workspace")][QSL("x")].toInt(); // Current workspace column (0-based) return currentRow * nCols + currentCol + 1; } QJsonObject viewGeom = viewInfo[QSL("geometry")].toObject(); QJsonObject outputGeom = outputInfo[QSL("geometry")].toObject(); // Calculate the center of the window QPoint viewCenter( outputGeom[QSL("x")].toInt() + viewGeom[QSL("x")].toInt() + viewGeom[QSL("width")].toInt() / 2, outputGeom[QSL("y")].toInt() + viewGeom[QSL("y")].toInt() + viewGeom[QSL("height")].toInt() / 2 ); QRect opGeom( outputGeom[QSL("x")].toInt(), outputGeom[QSL("y")].toInt(), outputGeom[QSL("width")].toInt(), outputGeom[QSL("height")].toInt() ); int currentRow = outputWS[QSL("y")].toInt(); // Current workspace row (0-based) int currentCol = outputWS[QSL("x")].toInt(); // Current workspace column (0-based) // Calculate the geometries of all workspaces relative to the current workspace QHash wsGeomHash; for (int row = 0; row < nRows; ++row) { for (int col = 0; col < nCols; ++col) { // Workspace index (0-based) int wsIndex = row * nCols + col; // Workspace geometry (relative to the current workspace) QRect wsGeom( opGeom.x() + (col - currentCol) * opGeom.width(), opGeom.y() + (row - currentRow) * opGeom.height(), opGeom.width(), opGeom.height() ); wsGeomHash[wsIndex] = wsGeom; } } // Find which workspace contains the view's center for (auto it = wsGeomHash.constBegin(); it != wsGeomHash.constEnd(); ++it) { if (it.value().contains(viewCenter)) { return it.key() + 1; } } // Fallback: If not found, assume current workspace return currentRow * nCols + currentCol + 1; } bool LXQtTaskbarWayfireBackend::setWindowOnWorkspace(WId windowId, int idx) { WaylandId viewId(windowId); return mWayfire->sendViewToWorkspace(viewId, idx); } void LXQtTaskbarWayfireBackend::moveApplicationToPrevNextMonitor(WId viewId, bool nextOp, bool raiseWindow) { // 1. Get the current output id and its active wset-id // Get view info to find which output it's currently on QJsonObject viewInfo = mWayfire->getViewInfo(WaylandId(viewId)); if (viewInfo.isEmpty()) { qWarning() << "Failed to get view info for view" << viewId; return; } WaylandId currentOutputId(viewInfo[QSL("output-id")].toInt()); // Get all outputs QJsonArray outputs = mWayfire->listOutputs(); if (outputs.isEmpty()) { qWarning() << "No outputs available"; return; } // 2. Find the previous/next output int currentIndex = -1; for (int i = 0; i < outputs.size(); i++) { QJsonObject output = outputs[i].toObject(); if (output[QSL("id")].toInt() == (int)currentOutputId.id) { currentIndex = i; break; } } if (currentIndex == -1) { qWarning() << "Current output not found in outputs list"; return; } // Calculate target output index with wrap-around int targetIndex; if (nextOp) { targetIndex = (currentIndex + 1) % outputs.size(); } else { targetIndex = (currentIndex - 1 + outputs.size()) % outputs.size(); } QJsonObject targetOutput = outputs[targetIndex].toObject(); WaylandId targetOutputId(targetOutput[QSL("id")].toInt()); // 3. Move the view to target output's workspace set // Get workspace sets info QJsonArray wsets = mWayfire->getWorkspaceSetsInfo(); if (wsets.isEmpty()) { qWarning() << "No workspace sets available"; return; } // Find the target output's active workspace set WaylandId targetWsetId(0); for (const QJsonValue & wsVal : wsets) { QJsonObject ws = wsVal.toObject(); if (ws[QSL("output-id")].toInt() == (int)targetOutputId.id) { targetWsetId = WaylandId(ws[QSL("index")].toInt()); break; } } if (targetWsetId == 0) { qWarning() << "Failed to find workspace set for target output"; return; } // Move the view to target workspace set QJsonObject moveRequest; moveRequest[QSL("method")] = QSL("wsets/send-view-to-wset"); moveRequest[QSL("data")] = QJsonObject{ {QSL("view-id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("wset-index"), QJsonValue::fromVariant((quint64)targetWsetId.id)} }; QJsonDocument reply = mWayfire->genericRequest(QJsonDocument(moveRequest)); if (reply[QSL("result")].toString() != QSL("ok")) { qWarning() << "Failed to move view to target workspace set:" << reply.toJson(); return; } // 4. Focus the window if requested if (raiseWindow) { mWayfire->focusView(WaylandId(viewId)); } } bool LXQtTaskbarWayfireBackend::isWindowOnScreen(QScreen *scrn, WId windowId) const { WaylandId viewId(windowId); if (!mViews.contains(viewId)) { return false; } return mViews[viewId][QSL("output-name")] == scrn->name(); } bool LXQtTaskbarWayfireBackend::setDesktopLayout(Qt::Orientation, int, int, bool) { // Wayfire does not support dynamic setting of desktops. return false; } void LXQtTaskbarWayfireBackend::moveApplication(WId) { // no-op } void LXQtTaskbarWayfireBackend::resizeApplication(WId) { // no-op } void LXQtTaskbarWayfireBackend::refreshIconGeometry(WId, const QRect &) { // no-op } bool LXQtTaskbarWayfireBackend::isAreaOverlapped(const QRect &area) const { int d; const auto keys = mViews.keys(); for (const WaylandId viewId : keys) { auto id = WaylandId(viewId); if (((d = getWindowWorkspace(id) == getCurrentWorkspace()) || d == onAllWorkspacesEnum()) && getWindowState(id) != LXQtTaskBarWindowState::Minimized) { QJsonObject viewInfo = mWayfire->getViewInfo(viewId); QJsonObject viewGeom = viewInfo[QSL("geometry")].toObject(); QJsonObject outputInfo = mWayfire->getOutputInfo(WaylandId(viewInfo[QSL("output-id")].toInt())); QJsonObject outputGeom = outputInfo[QSL("geometry")].toObject(); QRect viewRect(outputGeom[QSL("x")].toInt() + viewGeom[QSL("x")].toInt(), outputGeom[QSL("y")].toInt() + viewGeom[QSL("y")].toInt(), viewGeom[QSL("width")].toInt(), viewGeom[QSL("height")].toInt()); if (viewRect.intersects(area)) return true; } } return false; } bool LXQtTaskbarWayfireBackend::isShowingDesktop() const { return mIsDesktopShowing; } bool LXQtTaskbarWayfireBackend::showDesktop(bool yes) { if (mIsDesktopShowing == yes) { return true; } mIsDesktopShowing = yes; return mWayfire->showDesktop(mWayfire->getActiveOutput()); } int LXQtWMBackendWayfireLibrary::getBackendScore(const QString& key) const { // Only wayfire is supported if (key.compare(QSL("wayfire"), Qt::CaseInsensitive) == 0) { return 100; } // Unsupported return 0; } ILXQtAbstractWMInterface *LXQtWMBackendWayfireLibrary::instance() const { return new LXQtTaskbarWayfireBackend(nullptr); } ================================================ FILE: panel/backends/wayland/wayfire/lxqtwmbackend_wf.h ================================================ #pragma once #include "../../ilxqtabstractwmiface.h" #include "wayfire-common.h" #include #include #include class LXQtTaskbarWayfireWindow; class LXQtTaskbarWayfireWindowManagment; class LXQtWayfireWaylandWorkspaceInfo; class LXQtTaskbarWayfireBackend : public ILXQtAbstractWMInterface { Q_OBJECT public: explicit LXQtTaskbarWayfireBackend(QObject *parent = nullptr); // Backend virtual bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const override; // Windows virtual bool reloadWindows() override; // Get the current windows virtual QVector getCurrentWindows() const override; // Get the window title virtual QString getWindowTitle(WId windowId) const override; // We do not support this virtual bool applicationDemandsAttention(WId windowId) const override; // Support for this is based on app-id (handled by LXQt) virtual QIcon getApplicationIcon(WId windowId, int devicePixels) const override; // Same as app-id virtual QString getWindowClass(WId windowId) const override; // Allways-on-Bottom, Normal or Always-on-top. // Always-on-bottom is not available on wayfire virtual LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const override; virtual bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) override; // Hidden, FullScreen, Minimized, Maximized, MaximizedVertical, MaximizedHorizontally, Normal, RolledUp virtual LXQtTaskBarWindowState getWindowState(WId windowId) const override; virtual bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) override; // Is window active virtual bool isWindowActive(WId windowId) const override; // Set window as active virtual bool raiseWindow(WId windowId, bool onCurrentWorkSpace) override; // Close window virtual bool closeWindow(WId windowId) override; // Get active window virtual WId getActiveWindow() const override; // Workspaces virtual int getWorkspacesCount(QScreen *screen = nullptr) const override; virtual QString getWorkspaceName(int idx, QString outputName = QString()) const override; // Get/Set the current workspace virtual int getCurrentWorkspace(QScreen *screen = nullptr) const override; virtual bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) override; // Get/Set the workspace of a window virtual int getWindowWorkspace(WId windowId) const override; virtual bool setWindowOnWorkspace(WId windowId, int idx) override; // Move window to previous/next desktop virtual void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) override; virtual bool isWindowOnScreen(QScreen *screen, WId windowId) const override; // Not supported on wayfire at the moment virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) override; // X11 Specific virtual void moveApplication(WId windowId) override; virtual void resizeApplication(WId windowId) override; // ??? virtual void refreshIconGeometry(WId windowId, const QRect & geom) override; // Panel internal - not supported virtual bool isAreaOverlapped(const QRect& area) const override; // Show Desktop virtual bool isShowingDesktop() const override; virtual bool showDesktop(bool value) override; private: std::unique_ptr mWayfire; // Hash-map of view ids, vs their properties QHash mViews; // key=transient child, value=leader QHash transients; // Is Desktop Shown bool mIsDesktopShowing = false; }; class LXQtWMBackendWayfireLibrary : public QObject, public ILXQtWMBackendLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/WMInterface/1.0") Q_INTERFACES(ILXQtWMBackendLibrary) public: int getBackendScore(const QString& key) const override; ILXQtAbstractWMInterface * instance() const override; }; ================================================ FILE: panel/backends/wayland/wayfire/wayfire-common.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset https://lxqt.org * * Copyright: 2023 LXQt team Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "wayfire-common.h" // Socket related #include #include // Other headers #include #include #define QSL QStringLiteral LXQt::Panel::WayfireImpl::WayfireImpl(QObject *parent) : QThread(parent) { wfSock.fd = -1; } LXQt::Panel::WayfireImpl::~WayfireImpl() { stop(); wait(1000); } void LXQt::Panel::WayfireImpl::stop() { mTerminate = true; if (wfSock.fd != -1) { close(wfSock.fd); wfSock.fd = -1; } } uint32_t LXQt::Panel::WayfireImpl::request(QJsonDocument req) { QMutexLocker locker(&mutex); if (!mConnected) { return 0; } writeJson(req); // Generate a unique request ID static std::atomic requestCounter(0); uint32_t reqId = ++requestCounter; if (requestCounter == UINT32_MAX) { requestCounter = 1; } mPendingRequests << reqId; return reqId; } void LXQt::Panel::WayfireImpl::run() { emit started(); while (true) { int nready = poll(&wfSock, 1, 10); /** Something went wrong while polling */ if (nready < 0) { qWarning() << "[Error]:" << strerror(errno); } /** Bye bye..! */ if (mTerminate) { return; } /** Nothing to read */ if (nready == 0) { continue; } /** We have something to read. Let's see what it is. */ if (wfSock.revents & (POLLRDNORM | POLLERR)) { QJsonDocument resp = readJson(); /** This is an event */ if (resp.isObject() && resp.object().contains(QSL("event"))) { emit wayfireEvent(resp); } /** This is the response to a request */ else { // Lock the mutex QMutexLocker locker(&mutex); uint32_t reqId = mPendingRequests.takeFirst(); // Emit signal asynchronously QMetaObject::invokeMethod(this, [this, reqId, resp] () { emit response(reqId, resp); }, Qt::QueuedConnection); emit response(reqId, resp); } } } } bool LXQt::Panel::WayfireImpl::writeJson(QJsonDocument j) { QByteArray str = j.toJson(QJsonDocument::Compact); uint32_t size = str.size(); // Write the size of the JSON data ssize_t ret = write(wfSock.fd, &size, sizeof(size)); if (ret == -1) { // Handle write error qWarning() << "Failed to write size to socket:" << strerror(errno); // throw std::runtime_error("Failed to write size to socket"); } else if (ret != sizeof(size)) { // Handle partial write qWarning() << "Partial write of size to socket:" << ret << "bytes written, expected" << sizeof(size); // throw std::runtime_error("Partial write of size to socket"); } // Write the JSON data const char *data = str.constData(); ssize_t bytesWritten = 0; while (bytesWritten < str.size()) { ret = write(wfSock.fd, data + bytesWritten, str.size() - bytesWritten); if (ret == -1) { // Handle write error qWarning() << "Failed to write JSON data to socket:" << strerror(errno); return false; } else if (ret == 0) { // Handle socket closed by peer qWarning() << "Socket closed by peer while writing JSON data"; return false; } bytesWritten += ret; } /** We succeeded in writing the JSON data successfully */ return true; } QJsonDocument LXQt::Panel::WayfireImpl::readJson() { uint32_t msgSize; if (!readExact(reinterpret_cast(&msgSize), sizeof(msgSize))) { return QJsonDocument(); } QByteArray buffer(msgSize, Qt::Uninitialized); if (!readExact(buffer.data(), msgSize)) { return QJsonDocument(); } return QJsonDocument::fromJson(buffer); } bool LXQt::Panel::WayfireImpl::readExact(char *buf, uint size) { while (size > 0) { int ret = read(wfSock.fd, buf, size); if (ret == -1) { qCritical() << "Failed to read from socket: " << strerror(errno); return false; } buf += ret; size -= ret; } return true; } // Helper function to create a QJsonDocument from an initializer list QJsonDocument createJsonObject(std::initializer_list> initList) { QJsonObject obj; for (const auto& pair : initList) { obj.insert(pair.first, pair.second); } return QJsonDocument(obj); } LXQt::Panel::Wayfire::Wayfire(const QString &wfSock) : QObject() { impl = new WayfireImpl(this); connect(impl, &QThread::finished, impl, &QObject::deleteLater); impl->wfSockPath = (wfSock.isEmpty() ? qEnvironmentVariable("WAYFIRE_SOCKET") : wfSock); /** Always emit this for any wayfire event */ connect(impl, &LXQt::Panel::WayfireImpl::wayfireEvent, this, &LXQt::Panel::Wayfire::genericEvent); /** Parse the events and emit the correct signal */ connect(impl, &LXQt::Panel::WayfireImpl::wayfireEvent, this, &LXQt::Panel::Wayfire::parseEvents); } bool LXQt::Panel::Wayfire::connectToServer() const { if (!impl) return false; impl->wfSock.fd = socket(AF_UNIX, SOCK_STREAM, 0); impl->wfSock.events = POLLRDNORM; if (impl->wfSock.fd == -1) { qCritical() << "Failed to create socket: " << strerror(errno); return false; } struct sockaddr_un addr; addr.sun_family = AF_UNIX, strncpy(addr.sun_path, impl->wfSockPath.toUtf8().data(), sizeof(addr.sun_path) - 1); addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; if (::connect(impl->wfSock.fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { qCritical() << "Failed to connect to socket: " << strerror(errno); qCritical() << "Ensure that ipc and ipc-rules plugins are enabled."; qCritical() << "If these plugins were enabled after starting this session, please restart the session."; close(impl->wfSock.fd); return false; } impl->mConnected = true; /** Run the impl in a separate thread */ impl->start(); /** Make a request and forget about it. */ QJsonObject request; request[QSL("method")] = QSL("window-rules/events/watch"); genericRequest(QJsonDocument(request)); return true; } QJsonArray LXQt::Panel::Wayfire::listOutputs() const { QJsonObject request; request[QSL("method")] = QSL("window-rules/list-outputs"); QJsonDocument response = genericRequest(QJsonDocument(request)); if (response.isArray()) { return response.array(); } return QJsonArray(); } QJsonObject LXQt::Panel::Wayfire::getOutputInfo(WaylandId opId) const { QJsonObject request; request[QSL("method")] = QSL("window-rules/output-info"); request[QSL("data")] = QJsonObject({ {QSL("id"), QJsonValue::fromVariant((quint64)opId)}, }); return genericRequest(QJsonDocument(request)).object(); } WaylandId LXQt::Panel::Wayfire::getActiveOutput() const { QJsonObject request; request[QSL("method")] = QSL("window-rules/get-focused-output"); QJsonObject reply = genericRequest(QJsonDocument(request)).object(); if (reply[QSL("result")].toString() == QSL("ok")) { QJsonObject opInfo = reply[QSL("info")].toObject(); uint32_t opId = opInfo[QSL("id")].toInt(); return WaylandId(opId); } return WaylandId(); } bool LXQt::Panel::Wayfire::focusOutput(WaylandId opId) const { QJsonObject request; request[QSL("method")] = QSL("oswitch/switch-output"); request[QSL("data")] = QJsonObject({ {QSL("output-id"), QJsonValue::fromVariant((quint64)opId)}, }); QJsonDocument reply = genericRequest(QJsonDocument(request)); if (reply[QSL("result")].toString() == QSL("ok")) { return true; } return false; } bool LXQt::Panel::Wayfire::showDesktop(WaylandId opId) const { QJsonObject request; request[QSL("method")] = QSL("wm-actions/toggle_showdesktop"); request[QSL("data")] = QJsonObject({ {QSL("output_id"), QJsonValue::fromVariant((quint64)opId)}, }); QJsonDocument reply = genericRequest(QJsonDocument(request)); return (reply[QSL("result")].toString() == QSL("ok")); } QJsonArray LXQt::Panel::Wayfire::getWorkspaceSetsInfo() const { QJsonObject request; request[QSL("method")] = QSL("window-rules/list-wsets"); return genericRequest(QJsonDocument(request)).array(); } QString LXQt::Panel::Wayfire::getWorkspaceName(int x, const QString &outputName) const { QString targetKey = QString::fromUtf8("%1_workspace_%2").arg(outputName).arg(x); QJsonObject request; request[QSL("method")] = QSL("wayfire/get-config-option"); request[QSL("data")] = QJsonObject({ {QSL("option"), QSL("workspace-names/names")}, }); QJsonObject wsNamesObj = genericRequest(QJsonDocument(request)).object(); QJsonArray wsNameList = wsNamesObj[QSL("value")].toArray(); for ( int i = 0; i < wsNameList.size(); i++ ) { QJsonArray wsNamePair = wsNameList[i].toArray(); if (wsNamePair.size() != 2) { continue; } QString key = wsNamePair[0].toString(); if (key == targetKey) { QString name = wsNamePair[1].toString(); return name; } } return QString(); // the front-end sets the name } bool LXQt::Panel::Wayfire::setWorkspaceName(int, const QString&) const { return false; } bool LXQt::Panel::Wayfire::switchToWorkspace(WaylandId opId, int64_t nth, WaylandId viewId) const { QJsonObject wsetsInfo = getWorkspaceSetsInfo().at(0).toObject(); QJsonObject workspace = wsetsInfo[QSL("workspace")].toObject(); int64_t nCols = workspace[QSL("grid_width")].toInt(); int64_t row = floor((nth - 1) / nCols); int64_t col = (nth - 1) % nCols; QJsonObject request; request[QSL("method")] = QSL("vswitch/set-workspace"); if (viewId) { request[QSL("data")] = QJsonObject({ {QSL("output-id"), QJsonValue::fromVariant((quint64)opId)}, {QSL("x"), QJsonValue::fromVariant((quint64)col)}, {QSL("y"), QJsonValue::fromVariant((quint64)row)}, {QSL("view-id"), QJsonValue::fromVariant((quint64)viewId)}, }); } else { request[QSL("data")] = QJsonObject({ {QSL("output-id"), QJsonValue::fromVariant((quint64)opId)}, {QSL("x"), QJsonValue::fromVariant((quint64)col)}, {QSL("y"), QJsonValue::fromVariant((quint64)row)}, }); } QJsonDocument reply = genericRequest(QJsonDocument(request)); return (reply[QSL("result")].toString() == QSL("ok")); } QJsonArray LXQt::Panel::Wayfire::listViews() const { QJsonObject request; request[QSL("method")] = QSL("window-rules/list-views"); QJsonArray response = genericRequest(QJsonDocument(request)).array(); QJsonArray views; for ( QJsonValue viewVal : response ) { if (viewVal.isObject()) { QJsonObject view = viewVal.toObject(); // Ghost windows of Xwayland if (view[QSL("pid")].toInt() == -1) { continue; } // Proper toplevel and mapped views if (view[QSL("role")].toString() == QSL("toplevel") && view[QSL("mapped")].toBool()) { views << view; } } } return views; } WaylandId LXQt::Panel::Wayfire::getActiveView() const { QJsonObject request; request[QSL("method")] = QSL("window-rules/get-focused-view"); QJsonObject reply = genericRequest(QJsonDocument(request)).object(); if (reply[QSL("result")].toString() == QSL("ok")) { QJsonObject viewInfo = reply[QSL("info")].toObject(); uint32_t viewId = viewInfo[QSL("id")].toInt(); return WaylandId(viewId); } return WaylandId(); } QJsonObject LXQt::Panel::Wayfire::getViewInfo(WaylandId viewId) const { QJsonObject request; request[QSL("method")] = QSL("window-rules/view-info"); request[QSL("data")] = QJsonObject({ {QSL("id"), QJsonValue::fromVariant((quint64)viewId)} }); QJsonObject reply = genericRequest(QJsonDocument(request)).object(); if (reply[QSL("result")].toString() == QSL("ok")) { return reply[QSL("info")].toObject(); } return QJsonObject(); } bool LXQt::Panel::Wayfire::focusView(WaylandId viewId) const { QJsonObject viewInfo = getViewInfo(viewId); if ((viewInfo.isEmpty() == false) && (viewInfo[QSL("minimized")].toBool() == true)) { minimizeView(viewId, false); } QJsonObject request; request[QSL("method")] = QSL("window-rules/focus-view"); request[QSL("data")] = QJsonObject({ {QSL("id"), QJsonValue::fromVariant((quint64)viewId)} }); QJsonObject reply = genericRequest(QJsonDocument(request)).object(); return (reply[QSL("result")].toString() == QSL("ok")); } bool LXQt::Panel::Wayfire::minimizeView(WaylandId viewId, bool yes) const { QJsonObject request; request[QSL("method")] = QSL("wm-actions/set-minimized"); request[QSL("data")] = QJsonObject({ {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("state"), yes} }); QJsonDocument reply = genericRequest(QJsonDocument(request)); if (reply[QSL("result")] != QSL("ok")) { qWarning() << QJsonDocument(reply).toJson().data() << "\n"; } return (reply[QSL("result")].toString() == QSL("ok")); } bool LXQt::Panel::Wayfire::maximizeView(WaylandId viewId, int edges) const { QJsonObject request; /** * Support for this does not yet exist in Wayfire. Pending PR from Marcus Britanicus. */ // request[QSL("method")] = QSL("wm-actions/set-tiled"); // request[QSL("data")] = QJsonObject({ // {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, // {QSL("view-id"), QJsonValue::fromVariant((quint64)viewId)}, // {QSL("id"), QJsonValue::fromVariant((quint64)viewId)}, // {QSL("edges"), edges} // }); request[QSL("method")] = (edges ? QSL("grid/slot_c") : QSL("grid/restore")); request[QSL("data")] = QJsonObject({ {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, }); QJsonDocument reply = genericRequest(QJsonDocument(request)); if (reply[QSL("result")] != QSL("ok")) { qWarning() << QJsonDocument(reply).toJson().data() << "\n"; } return (reply[QSL("result")].toString() == QSL("ok")); } bool LXQt::Panel::Wayfire::fullscreenView(WaylandId viewId, bool yes) const { QJsonObject request; request[QSL("method")] = QSL("wm-actions/set-fullscreen"); request[QSL("data")] = QJsonObject({ {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("state"), yes} }); QJsonDocument reply = genericRequest(QJsonDocument(request)); return (reply[QSL("result")].toString() == QSL("ok")); } bool LXQt::Panel::Wayfire::restoreView(WaylandId viewId) const { QJsonObject viewInfo = getViewInfo(viewId); if (viewInfo.isEmpty()) { return false; } /** If it's minimized, unminimize it */ if (viewInfo[QSL("minimized")] == true) { return minimizeView(viewId, false); } /** The view is fullscreened, un-fullscreen it */ else if (viewInfo[QSL("fullscreen")] == true) { return fullscreenView(viewId, false); } /** The view is maximized, unmaximize it */ else if (viewInfo[QSL("tiled-edges")] != 0) { return maximizeView(viewId, false); } return false; } bool LXQt::Panel::Wayfire::sendViewToWorkspace(WaylandId viewId, int nth) const { QJsonObject request; /** Set view sticky */ if ( nth == 0 ) { QJsonObject viewInfo = getViewInfo( viewId ); request[QSL("method")] = QSL("wm-actions/set-sticky"); request[QSL("data")] = QJsonObject({ {QSL("view-id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("state"), !viewInfo[QSL("sticky")].toBool()}, }); } /** Send view to a specific desktop */ else { QJsonObject wsetsInfo = getWorkspaceSetsInfo().at(0).toObject(); QJsonObject workspace = wsetsInfo[QSL("workspace")].toObject(); QJsonObject viewInfo = getViewInfo(viewId); int64_t nCols = workspace[QSL("grid_width")].toInt(); int64_t row = floor((nth - 1) / nCols); int64_t col = (nth - 1) % nCols; quint64 opId = viewInfo[QSL("output-id")].toInt(); request[QSL("method")] = QSL("vswitch/send-view"); request[QSL("data")] = QJsonObject({ {QSL("output-id"), QJsonValue::fromVariant((quint64)opId)}, {QSL("x"), QJsonValue::fromVariant((quint64)col)}, {QSL("y"), QJsonValue::fromVariant((quint64)row)}, {QSL("view-id"), QJsonValue::fromVariant((quint64)viewId)}, {QSL("view_id"), QJsonValue::fromVariant((quint64)viewId)}, }); } QJsonDocument reply = genericRequest(QJsonDocument(request)); return (reply[QSL("result")].toString() == QSL("ok")); } bool LXQt::Panel::Wayfire::closeView(WaylandId viewId) const { QJsonObject request; request[QSL("method")] = QSL("window-rules/close-view"); request[QSL("data")] = QJsonObject({ {QSL("id"), QJsonValue::fromVariant((quint64)viewId)} }); QJsonDocument reply = genericRequest(QJsonDocument(request)); return (reply[QSL("result")].toString() == QSL("ok")); } QJsonDocument LXQt::Panel::Wayfire::genericRequest(QJsonDocument request) const { if (!impl || !impl->mConnected) { QJsonDocument reply{ {QSL("result"), QSL("failed")} }; return reply; } uint32_t reqId = impl->request(request); std::shared_ptr reply = std::make_shared(); QEventLoop loop; auto connection = connect( impl, &LXQt::Panel::WayfireImpl::response, &loop, [&reply, reqId, &loop] (uint32_t id, QJsonDocument response) { if (id == reqId) { *reply = response; // Update the content of the shared_ptr loop.quit(); } }); loop.exec(); // Disconnect the signal-slot connection to avoid any potential issues disconnect(connection); // Return the QJsonDocument, not the shared_ptr return *reply; } void LXQt::Panel::Wayfire::parseEvents(QJsonDocument response) { QString event = response[QSL("event")].toString(); if (event == QSL("view-mapped")) { emit viewMapped(response); } else if (event == QSL("view-focused")) { emit viewFocused(response); } else if (event == QSL("view-title-changed")) { emit viewTitleChanged(response); } else if (event == QSL("view-app-id-changed")) { emit viewAppIdChanged(response); } else if (event == QSL("view-geometry-changed")) { emit viewGeometryChanged(response); } else if (event == QSL("view-tiled")) { emit viewTiled(response); } else if (event == QSL("view-minimized")) { emit viewMinimized(response); } else if (event == QSL("view-set-output")) { emit viewOutputChanged(response); } else if (event == QSL("view-workspace-changed")) { emit viewWorkspaceChanged(response); } else if (event == QSL("view-unmapped")) { emit viewUnmapped(response); } else if (event == QSL("output-added")) { emit outputAdded(response); } else if (event == QSL("output-removed")) { emit outputRemoved(response); } else if (event == QSL("output-gain-focus")) { emit outputFocused(response); } else if (event == QSL("output-wset-changed")) { emit workspaceSetChanged(response); } else if (event == QSL("wset-workspace-changed")) { emit workspaceChanged(response); } else { emit genericEvent(response); } } ================================================ FILE: panel/backends/wayland/wayfire/wayfire-common.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset https://lxqt.org * * Copyright: 2023 LXQt team Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the * License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once /** For struct pollfd */ #include /* For QString, QThread, QTimer, etc.. */ #include #include "../../lxqttaskbartypes.h" namespace LXQt { namespace Panel { class Wayfire; class WayfireImpl; } } // Strongly-typed wrapper for Wayland IDs struct WaylandId { uint32_t id; explicit WaylandId(uint32_t id_ = 0) : id(id_) {} operator WId() const { return static_cast(id); } }; class LXQt::Panel::WayfireImpl : public QThread { Q_OBJECT public: WayfireImpl(QObject *parent = nullptr); ~WayfireImpl(); /** Stop polling This will terminate the thread and delete this object */ void stop(); /** Request the compositor something */ uint32_t request(QJsonDocument req); /** One FD for reading, one for writing */ struct pollfd wfSock; /** The socket address */ QString wfSockPath; /** Stop the loop flag */ volatile bool mTerminate = false; /** Flag to check if we're connected or not */ volatile bool mConnected = false; /** Function to write the json to wayfire socket. */ bool writeJson(QJsonDocument j); /** Function to read the data from wayfire socket and parse it into json */ QJsonDocument readJson(); private: QList mPendingRequests; QMutex mutex; // Add a mutex for thread safety /** Function to read the json from wayfire socket into a buffer. */ bool readExact(char *buf, uint size); protected: void run() override; Q_SIGNALS: /** We recieved an event from Wayfire */ void wayfireEvent(QJsonDocument); /** Relay the message received from the server */ void response(uint32_t, QJsonDocument); /** Inform the rest that polling has started */ void started(); }; class LXQt::Panel::Wayfire : public QObject { Q_OBJECT public: Wayfire(const QString &wfSock = QString()); /** Connect to Wayfire */ bool connectToServer() const; /* ========== Specific requests ========== */ /** Request the compositor to send us the outputs information */ QJsonArray listOutputs() const; /** Request the compositor to send us the outputs information */ WaylandId getActiveOutput() const; /** Request the compositor to send us information of a given output */ QJsonObject getOutputInfo(WaylandId opId) const; /** Request the compositor to focus a given output */ bool focusOutput(WaylandId opId) const; /** Request the compositor to trigger show-desktop a given output */ bool showDesktop(WaylandId opId) const; /** Request the compositor to send us the wsets information */ QJsonArray getWorkspaceSetsInfo() const; /** Request the compositor to send us the wsets information */ QString getWorkspaceName(int, const QString &outputName = QString()) const; bool setWorkspaceName(int, const QString&) const; /** Request the compositor to change the current workspace */ bool switchToWorkspace(WaylandId opId, int64_t nth, WaylandId viewId = WaylandId()) const; /** Request the compositor to send us the list of views */ QJsonArray listViews() const; /** Request the compositor to send us the info of the given view */ WaylandId getActiveView() const; /** Request the compositor to send us the info of the given view */ QJsonObject getViewInfo(WaylandId viewId) const; /** Request the compositor to focus a given view */ bool focusView(WaylandId viewId) const; /** Request the compositor to minimize/restore a given view */ bool minimizeView(WaylandId viewId, bool) const; /** Request the compositor to maximize/restore a given view */ bool maximizeView(WaylandId viewId, int edges) const; /** Request the compositor to fullscreen a given view */ bool fullscreenView(WaylandId viewId, bool) const; /** Request the compositor to focus a given view */ bool restoreView(WaylandId viewId) const; /** Request the compositor to focus a given view */ bool sendViewToWorkspace(WaylandId viewId, int nth) const; /** Request the compositor to focus a given view */ bool closeView(WaylandId viewId) const; /** This is a generic request */ QJsonDocument genericRequest(QJsonDocument) const; /* ========== WAYFIRE EVENTS ========== */ /** * A new output was added. */ Q_SIGNAL void outputAdded(QJsonDocument); /** * An existing output was removed. */ Q_SIGNAL void outputRemoved(QJsonDocument); /** * A particular output has gained focus. Only one output can have focus at any given time. This outupt can * be used to calculate the focused view. */ Q_SIGNAL void outputFocused(QJsonDocument); /** * Current workspace set of a given output was changed When the wset of an output changes, always query * the workspace */ Q_SIGNAL void workspaceSetChanged(QJsonDocument); /** * The active workspace of a given wset changed. Because wsets of different outputs are independent, * workspace change on one output will not affect the other. */ Q_SIGNAL void workspaceChanged(QJsonDocument); /** * A view was just mapped. This view does not have an output nor a wset. Even the title and app-id will be * unset. Only the view id is valid. */ Q_SIGNAL void viewMapped(QJsonDocument); /** * A view on a particular outupt gained focus Since wayfire supports independent outputs, each output can * have a view with focus. The focused view of the active outupt will be the one with keyboard focus. */ Q_SIGNAL void viewFocused(QJsonDocument); /** * The title of a view changed. The title can be "nil" or null. In such cases, the user can safely ignore * it. */ Q_SIGNAL void viewTitleChanged(QJsonDocument); /** * The app-id of a view changed. The app-id can be "nil" or null. In such cases, the user can safely * ignore it. */ Q_SIGNAL void viewAppIdChanged(QJsonDocument); /** * The geometry of a view changed. */ Q_SIGNAL void viewGeometryChanged(QJsonDocument); /** * The tiled status of a view has changed. */ Q_SIGNAL void viewTiled(QJsonDocument); /** * A view was minimized. */ Q_SIGNAL void viewMinimized(QJsonDocument); /** * The output of a view changed. When the view gets mapped, the output will be null. */ Q_SIGNAL void viewOutputChanged(QJsonDocument); /** * The workspace of a view changed. */ Q_SIGNAL void viewWorkspaceChanged(QJsonDocument); /** * An existing view was unmapped. The output, wset etc of this view are invalid as of now. */ Q_SIGNAL void viewUnmapped(QJsonDocument); /** * A generic wayfire event. This signal is always emitted for all events. Specific signals are emitted by * parsing this event. */ Q_SIGNAL void genericEvent(QJsonDocument); /** * Inform the user tha there was an error. Currently used to indicate failure in watching for wayfire * events. */ Q_SIGNAL void error(); private: /** Implementation class pointer */ QPointer impl; /** Partially parse the events to emit the correct signals */ void parseEvents(QJsonDocument); }; ================================================ FILE: panel/backends/wayland/wlroots/CMakeLists.txt ================================================ set(PLATFORM_NAME wlroots) set(PREFIX_NAME wmbackend) set(PROGRAM "lxqt-panel") set(BACKEND "backend") set(NAME ${PREFIX_NAME}_${PLATFORM_NAME}) project(${PROGRAM}_${BACKEND}_${NAME}) find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS WaylandClient Concurrent) find_package(Qt6Xdg) set(PROG_SHARE_DIR ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}/${BACKEND}) set(PLUGIN_SHARE_DIR ${PROG_SHARE_DIR}/${BACKEND}/${NAME}) #************************************************ if (NOT DEFINED PLUGIN_DIR) set (PLUGIN_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROGRAM}) endif (NOT DEFINED PLUGIN_DIR) set(QTX_LIBRARIES Qt6::Gui Qt6::GuiPrivate Qt6::WaylandClient Qt6::WaylandClientPrivate) set( SRC lxqtwmbackend_wlr.cpp lxqtwmbackend_wlr.h lxqttaskbarwlrwm.cpp lxqttaskbarwlrwm.h workspace.cpp workspace.hpp ) add_library(${NAME} MODULE ${SRC}) # build dynamically loadable modules install(TARGETS ${NAME} DESTINATION ${PLUGIN_DIR}/${BACKEND}) # install the *.so file target_link_libraries(${NAME} ${QTX_LIBRARIES} Qt6::Concurrent Qt6Xdg) qt6_generate_wayland_protocol_client_sources(${NAME} FILES ${CMAKE_CURRENT_SOURCE_DIR}/wlr-foreign-toplevel-management-unstable-v1.xml ${CMAKE_CURRENT_SOURCE_DIR}/ext-workspace-v1.xml ) ================================================ FILE: panel/backends/wayland/wlroots/ext-workspace-v1.xml ================================================ Copyright © 2019 Christopher Billington Copyright © 2020 Ilia Bozhinov Copyright © 2022 Victoria Brekenfeld Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of the copyright holders not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The copyright holders make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Workspaces, also called virtual desktops, are groups of surfaces. A compositor with a concept of workspaces may only show some such groups of surfaces (those of 'active' workspaces) at a time. 'Activating' a workspace is a request for the compositor to display that workspace's surfaces as normal, whereas the compositor may hide or otherwise de-emphasise surfaces that are associated only with 'inactive' workspaces. Workspaces are grouped by which sets of outputs they correspond to, and may contain surfaces only from those outputs. In this way, it is possible for each output to have its own set of workspaces, or for all outputs (or any other arbitrary grouping) to share workspaces. Compositors may optionally conceptually arrange each group of workspaces in an N-dimensional grid. The purpose of this protocol is to enable the creation of taskbars and docks by providing them with a list of workspaces and their properties, and allowing them to activate and deactivate workspaces. After a client binds the ext_workspace_manager_v1, each workspace will be sent via the workspace event. This event is emitted whenever a new workspace group has been created. All initial details of the workspace group (outputs) will be sent immediately after this event via the corresponding events in ext_workspace_group_handle_v1 and ext_workspace_handle_v1. This event is emitted whenever a new workspace has been created. All initial details of the workspace (name, coordinates, state) will be sent immediately after this event via the corresponding events in ext_workspace_handle_v1. Workspaces start off unassigned to any workspace group. The client must send this request after it has finished sending other requests. The compositor must process a series of requests preceding a commit request atomically. This allows changes to the workspace properties to be seen as atomic, even if they happen via multiple events, and even if they involve multiple ext_workspace_handle_v1 objects, for example, deactivating one workspace and activating another. This event is sent after all changes in all workspaces and workspace groups have been sent. This allows changes to one or more ext_workspace_group_handle_v1 properties and ext_workspace_handle_v1 properties to be seen as atomic, even if they happen via multiple events. In particular, an output moving from one workspace group to another sends an output_enter event and an output_leave event to the two ext_workspace_group_handle_v1 objects in question. The compositor sends the done event only after updating the output information in both workspace groups. This event indicates that the compositor is done sending events to the ext_workspace_manager_v1. The server will destroy the object immediately after sending this request. Indicates the client no longer wishes to receive events for new workspace groups. However the compositor may emit further workspace events, until the finished event is emitted. The compositor is expected to send the finished event eventually once the stop request has been processed. The client must not send any requests after this one, doing so will raise a wl_display invalid_object error. A ext_workspace_group_handle_v1 object represents a workspace group that is assigned a set of outputs and contains a number of workspaces. The set of outputs assigned to the workspace group is conveyed to the client via output_enter and output_leave events, and its workspaces are conveyed with workspace events. For example, a compositor which has a set of workspaces for each output may advertise a workspace group (and its workspaces) per output, whereas a compositor where a workspace spans all outputs may advertise a single workspace group for all outputs. This event advertises the capabilities supported by the compositor. If a capability isn't supported, clients should hide or disable the UI elements that expose this functionality. For instance, if the compositor doesn't advertise support for creating workspaces, a button triggering the create_workspace request should not be displayed. The compositor will ignore requests it doesn't support. For instance, a compositor which doesn't advertise support for creating workspaces will ignore create_workspace requests. Compositors must send this event once after creation of an ext_workspace_group_handle_v1. When the capabilities change, compositors must send this event again. This event is emitted whenever an output is assigned to the workspace group or a new `wl_output` object is bound by the client, which was already assigned to this workspace_group. This event is emitted whenever an output is removed from the workspace group. This event is emitted whenever a workspace is assigned to this group. A workspace may only ever be assigned to a single group at a single point in time, but can be re-assigned during it's lifetime. This event is emitted whenever a workspace is removed from this group. This event is send when the group associated with the ext_workspace_group_handle_v1 has been removed. After sending this request the compositor will immediately consider the object inert. Any requests will be ignored except the destroy request. It is guaranteed there won't be any more events referencing this ext_workspace_group_handle_v1. The compositor must remove all workspaces belonging to a workspace group via a workspace_leave event before removing the workspace group. Request that the compositor create a new workspace with the given name and assign it to this group. There is no guarantee that the compositor will create a new workspace, or that the created workspace will have the provided name. Destroys the ext_workspace_group_handle_v1 object. This request should be send either when the client does not want to use the workspace group object any more or after the removed event to finalize the destruction of the object. A ext_workspace_handle_v1 object represents a workspace that handles a group of surfaces. Each workspace has: - a name, conveyed to the client with the name event - potentially an id conveyed with the id event - a list of states, conveyed to the client with the state event - and optionally a set of coordinates, conveyed to the client with the coordinates event The client may request that the compositor activate or deactivate the workspace. Each workspace can belong to only a single workspace group. Depending on the compositor policy, there might be workspaces with the same name in different workspace groups, but these workspaces are still separate (e.g. one of them might be active while the other is not). If this event is emitted, it will be send immediately after the ext_workspace_handle_v1 is created or when an id is assigned to a workspace (at most once during it's lifetime). An id will never change during the lifetime of the `ext_workspace_handle_v1` and is guaranteed to be unique during it's lifetime. Ids are not human-readable and shouldn't be displayed, use `name` for that purpose. Compositors are expected to only send ids for workspaces likely stable across multiple sessions and can be used by clients to store preferences for workspaces. Workspaces without ids should be considered temporary and any data associated with them should be deleted once the respective object is lost. This event is emitted immediately after the ext_workspace_handle_v1 is created and whenever the name of the workspace changes. A name is meant to be human-readable and can be displayed to a user. Unlike the id it is neither stable nor unique. This event is used to organize workspaces into an N-dimensional grid within a workspace group, and if supported, is emitted immediately after the ext_workspace_handle_v1 is created and whenever the coordinates of the workspace change. Compositors may not send this event if they do not conceptually arrange workspaces in this way. If compositors simply number workspaces, without any geometric interpretation, they may send 1D coordinates, which clients should not interpret as implying any geometry. Sending an empty array means that the compositor no longer orders the workspace geometrically. Coordinates have an arbitrary number of dimensions N with an uint32 position along each dimension. By convention if N > 1, the first dimension is X, the second Y, the third Z, and so on. The compositor may chose to utilize these events for a more novel workspace layout convention, however. No guarantee is made about the grid being filled or bounded; there may be a workspace at coordinate 1 and another at coordinate 1000 and none in between. Within a workspace group, however, workspaces must have unique coordinates of equal dimensionality. The different states that a workspace can have. The workspace is not visible in its workspace group, and clients attempting to visualize the compositor workspace state should not display such workspaces. This event is emitted immediately after the ext_workspace_handle_v1 is created and each time the workspace state changes, either because of a compositor action or because of a request in this protocol. Missing states convey the opposite meaning, e.g. an unset active bit means the workspace is currently inactive. This event advertises the capabilities supported by the compositor. If a capability isn't supported, clients should hide or disable the UI elements that expose this functionality. For instance, if the compositor doesn't advertise support for removing workspaces, a button triggering the remove request should not be displayed. The compositor will ignore requests it doesn't support. For instance, a compositor which doesn't advertise support for remove will ignore remove requests. Compositors must send this event once after creation of an ext_workspace_handle_v1 . When the capabilities change, compositors must send this event again. This event is send when the workspace associated with the ext_workspace_handle_v1 has been removed. After sending this request, the compositor will immediately consider the object inert. Any requests will be ignored except the destroy request. It is guaranteed there won't be any more events referencing this ext_workspace_handle_v1. The compositor must only remove a workspaces not currently belonging to any workspace_group. Destroys the ext_workspace_handle_v1 object. This request should be made either when the client does not want to use the workspace object any more or after the remove event to finalize the destruction of the object. Request that this workspace be activated. There is no guarantee the workspace will be actually activated, and behaviour may be compositor-dependent. For example, activating a workspace may or may not deactivate all other workspaces in the same group. Request that this workspace be deactivated. There is no guarantee the workspace will be actually deactivated. Requests that this workspace is assigned to the given workspace group. There is no guarantee the workspace will be assigned. Request that this workspace be removed. There is no guarantee the workspace will be actually removed. ================================================ FILE: panel/backends/wayland/wlroots/lxqttaskbarwlrwm.cpp ================================================ #include "lxqttaskbarwlrwm.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QString U8Str( const char *str ) { return QString::fromUtf8( str ); } static inline QString getPixmapIcon(QString name) { QStringList paths{ U8Str("/usr/local/share/pixmaps/"), U8Str("/usr/share/pixmaps/"), }; QStringList sfxs{ U8Str( ".svg" ), U8Str( ".png" ), U8Str( ".xpm" ) }; for (QString path: paths) { for (QString sfx: sfxs) { if (QFile::exists(path + name + sfx)) { return path + name + sfx; } } } return QString(); } QIcon getIconForAppId(QString mAppId) { if (mAppId.isEmpty() or (mAppId == U8Str("Unknown"))) { return QIcon(); } /** Wine apps */ if (mAppId.endsWith(U8Str(".exe"))) { return QIcon::fromTheme(U8Str("wine")); } /** Check if a theme icon exists called @mAppId */ if (QIcon::hasThemeIcon(mAppId)) { return QIcon::fromTheme(mAppId); } /** Check if the theme icon is @mAppId, but all lower-case letters */ else if (QIcon::hasThemeIcon(mAppId.toLower())) { return QIcon::fromTheme(mAppId.toLower()); } QStringList appDirs = { QDir::home().filePath(U8Str(".local/share/applications/")), U8Str("/usr/local/share/applications/"), U8Str("/usr/share/applications/"), }; /** * Assume mAppId == desktop-file-name (ideal situation) * or mAppId.toLower() == desktop-file-name (cheap fallback) */ QString iconName; for (QString path: appDirs) { /** Get the icon name from desktop (mAppId: as it is) */ if (QFile::exists(path + mAppId + U8Str(".desktop"))) { QSettings desktop(path + mAppId + U8Str(".desktop"), QSettings::IniFormat); iconName = desktop.value(U8Str("Desktop Entry/Icon")).toString(); } /** Get the icon name from desktop (mAppId: all lower-case letters) */ else if (QFile::exists(path + mAppId.toLower() + U8Str(".desktop"))) { QSettings desktop(path + mAppId.toLower() + U8Str(".desktop"), QSettings::IniFormat); iconName = desktop.value(U8Str("Desktop Entry/Icon")).toString(); } /** No icon specified: try else-where */ if (iconName.isEmpty()) { continue; } /** We got an iconName, and it's in the current theme */ if (QIcon::hasThemeIcon(iconName)) { return QIcon::fromTheme(iconName); } /** Not a theme icon, but an absolute path */ else if (QFile::exists(iconName)) { return QIcon(iconName); } /** Not theme icon or absolute path. So check /usr/share/pixmaps/ */ else { iconName = getPixmapIcon(iconName); if (not iconName.isEmpty()) { return QIcon(iconName); } } } /* Check all desktop files for @mAppId */ for (QString path: appDirs) { QStringList desktops = QDir(path).entryList({ U8Str("*.desktop") }); for (QString dskf: desktops) { QSettings desktop(path + dskf, QSettings::IniFormat); QString exec = desktop.value(U8Str("Desktop Entry/Exec"), U8Str("abcd1234/-")).toString(); QString name = desktop.value(U8Str("Desktop Entry/Name"), U8Str("abcd1234/-")).toString(); QString cls = desktop.value(U8Str("Desktop Entry/StartupWMClass"), U8Str("abcd1234/-")).toString(); QString execPath = U8Str(std::filesystem::path(exec.toStdString()).filename().c_str()); if (mAppId.compare(execPath, Qt::CaseInsensitive) == 0) { iconName = desktop.value(U8Str("Desktop Entry/Icon")).toString(); } else if (mAppId.compare(name, Qt::CaseInsensitive) == 0) { iconName = desktop.value(U8Str("Desktop Entry/Icon")).toString(); } else if (mAppId.compare(cls, Qt::CaseInsensitive) == 0) { iconName = desktop.value(U8Str("Desktop Entry/Icon")).toString(); } if (not iconName.isEmpty()) { if (QIcon::hasThemeIcon(iconName)) { return QIcon::fromTheme(iconName); } else if (QFile::exists(iconName)) { return QIcon(iconName); } else { iconName = getPixmapIcon(iconName); if (not iconName.isEmpty()) { return QIcon(iconName); } } } } } iconName = getPixmapIcon(iconName); if (not iconName.isEmpty()) { return QIcon(iconName); } return QIcon(); } static inline wl_seat *get_seat() { QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); if (!native) { return nullptr; } struct wl_seat *seat = reinterpret_cast(native->nativeResourceForIntegration("wl_seat")); return seat; } /* * LXQtTaskbarWlrootsWindowManagment */ LXQtTaskbarWlrootsWindowManagment::LXQtTaskbarWlrootsWindowManagment() : QWaylandClientExtensionTemplate(version) { /** Automatically destroy thie object */ connect( this, &QWaylandClientExtension::activeChanged, this, [ this ] { if (!isActive()) { zwlr_foreign_toplevel_manager_v1_destroy(object()); } }); } LXQtTaskbarWlrootsWindowManagment::~LXQtTaskbarWlrootsWindowManagment() { if (isActive()) { zwlr_foreign_toplevel_manager_v1_destroy(object()); } } void LXQtTaskbarWlrootsWindowManagment::zwlr_foreign_toplevel_manager_v1_toplevel(struct ::zwlr_foreign_toplevel_handle_v1 *toplevel) { /** * A window was created. * Wait for the window to become ready, i.e. wait for done() event to be sent by the compositor. * Once we recieve done(), emit the windowReady() signal. */ auto w = new LXQtTaskbarWlrootsWindow(toplevel); connect(w, &LXQtTaskbarWlrootsWindow::windowReady, [w, this] () { emit windowCreated(w->getWindowId()); }); } /* * LXQtTaskbarWlrootsWindow */ LXQtTaskbarWlrootsWindow::LXQtTaskbarWlrootsWindow(::zwlr_foreign_toplevel_handle_v1 *id) : zwlr_foreign_toplevel_handle_v1(id) { ID = id; } LXQtTaskbarWlrootsWindow::~LXQtTaskbarWlrootsWindow() { destroy(); } void LXQtTaskbarWlrootsWindow::activate() { /** * Activate on default seat. * TODO: Worry about multi-seat setups, when we have no other worries :P */ zwlr_foreign_toplevel_handle_v1::activate(get_seat()); } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_title(const QString& title) { /** Store the incoming title in pending */ m_pendingState.title = title; m_pendingState.titleChanged = true; } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_app_id(const QString& app_id) { /** Store the incoming appId in pending */ m_pendingState.appId = app_id; m_pendingState.appIdChanged = true; /** Update the icon */ this->icon = getIconForAppId(app_id); /** We did not get any icon from app-id. Let's use application-x-executable */ if (this->icon.pixmap(64).width() == 0) { this->icon = XdgIcon::fromTheme(QString::fromUtf8("application-x-executable")); } } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_output_enter(struct ::wl_output *output) { /** This view was added to an output */ m_pendingState.outputs << output; m_pendingState.outputsChanged = true; } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_output_leave(struct ::wl_output *output) { /** This view was removed from an output; store it in pending. */ m_pendingState.outputsLeft << output; if (m_pendingState.outputs.contains(output)) { m_pendingState.outputs.removeAll(output); } m_pendingState.outputsChanged = true; } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_state(wl_array *state) { /** State of this window was changed; store it in pending. */ auto *states = static_cast(state->data); int numStates = static_cast(state->size / sizeof(uint32_t)); for (int i = 0; i < numStates; i++) { switch ((uint32_t)states[ i ]) { case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MAXIMIZED: { m_pendingState.maximized = true; break; } case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MINIMIZED: { m_pendingState.minimized = true; m_pendingState.activated = false; // a minimized window isn't active break; } case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_ACTIVATED: { m_pendingState.activated = true; m_pendingState.minimized = false; // an active window isn't minimized break; } case ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN: { m_pendingState.fullscreen = true; break; } } } /* WARNING: These are needed with all states, also when "numStates" is zero. Without them, states might be incorrect under some circumstances, e.g., an active task button might be deactivated if an overlay window is shown. */ m_pendingState.activatedChanged = true; m_pendingState.maximizedChanged = (windowState.maximized != m_pendingState.maximized); m_pendingState.minimizedChanged = (windowState.minimized != m_pendingState.minimized); m_pendingState.fullscreenChanged = (windowState.fullscreen != m_pendingState.fullscreen); } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_done() { /** * All the states/properties have been sent. * We can now emit the signals and clear the pending state: * 1. Update all the variables first. * 2. Then clear the m_pendingState. * 3. Emit the changed signals. * 4. Finally, clean the m_pendingState.Changed flags. */ // (1) title, if it changed if (m_pendingState.titleChanged) { windowState.title = m_pendingState.title; } // (2) appId, if it changed if (m_pendingState.appIdChanged) { windowState.appId = m_pendingState.appId; } // (3) outputs, if they changed if (m_pendingState.outputsChanged) { for (::wl_output *op: m_pendingState.outputsLeft) { if (windowState.outputs.contains(op)) { windowState.outputs.removeAll(op); } } for (::wl_output *op: m_pendingState.outputs) { if (!windowState.outputs.contains(op)) { windowState.outputs << op; } } } // (4) states, if they changed. if (m_pendingState.maximizedChanged) { windowState.maximized = m_pendingState.maximized; } if (m_pendingState.minimizedChanged) { windowState.minimized = m_pendingState.minimized; } if (m_pendingState.activatedChanged) { windowState.activated = m_pendingState.activated; } if (m_pendingState.fullscreenChanged) { windowState.fullscreen = m_pendingState.fullscreen; } // (5) parent, if it changed. if (m_pendingState.parentChanged) { if (m_pendingState.parent) { setParentWindow(new LXQtTaskbarWlrootsWindow(m_pendingState.parent)); } else { setParentWindow(nullptr); } } /** 2. Clear all m_pendingState. for next run */ m_pendingState.title = QString(); m_pendingState.appId = QString(); m_pendingState.outputs.clear(); m_pendingState.outputsLeft.clear(); m_pendingState.maximized = false; m_pendingState.minimized = false; m_pendingState.activated = false; m_pendingState.fullscreen = false; m_pendingState.parent = nullptr; /** * 3. Emit signals * (a) First time done was emitted after the window was created. * (b) Other times. */ /** (a) First time done was emitted */ if (initDone == false) { /** * All the states/properties are already set. * Any query will give valid results. */ initDone = true; emit windowReady(); } /** (b) All the subsequent times */ else { if (m_pendingState.titleChanged) emit titleChanged(); if (m_pendingState.appIdChanged) emit appIdChanged(); if (m_pendingState.outputsChanged) emit outputsChanged(); if (m_pendingState.maximizedChanged) emit maximizedChanged(); if (m_pendingState.minimizedChanged) emit minimizedChanged(); if (m_pendingState.fullscreenChanged) emit fullscreenChanged(); // NOTE: parentChanged is emitted before activatedChanged // to guarantee correct activation states of child windows later if (m_pendingState.parentChanged) emit parentChanged(); if (m_pendingState.activatedChanged) emit activatedChanged(); emit stateChanged(); } /** 4. Clear m+m_pendingState.Changed flags */ m_pendingState.titleChanged = false; m_pendingState.appIdChanged = false; m_pendingState.outputsChanged = false; m_pendingState.maximizedChanged = false; m_pendingState.minimizedChanged = false; m_pendingState.activatedChanged = false; m_pendingState.fullscreenChanged = false; m_pendingState.parentChanged = false; } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_closed() { /** This window was closed */ emit closed(); } void LXQtTaskbarWlrootsWindow::zwlr_foreign_toplevel_handle_v1_parent(struct ::zwlr_foreign_toplevel_handle_v1 *parent) { /** Parent of this window changed; store it in pending. */ m_pendingState.parent = parent; m_pendingState.parentChanged = true; } void LXQtTaskbarWlrootsWindow::setParentWindow(LXQtTaskbarWlrootsWindow *parent) { QObject::disconnect(parentWindowUnmappedConnection); if (parent) { parentWindow = parent->getWindowId(); parentWindowUnmappedConnection = QObject::connect( parent, &LXQtTaskbarWlrootsWindow::closed, this, [ this ] { setParentWindow(nullptr); }); } else { parentWindow = 0; parentWindowUnmappedConnection = QMetaObject::Connection(); } } ================================================ FILE: panel/backends/wayland/wlroots/lxqttaskbarwlrwm.h ================================================ #pragma once #include #include #include #include "qwayland-wlr-foreign-toplevel-management-unstable-v1.h" #include "wayland-wlr-foreign-toplevel-management-unstable-v1-client-protocol.h" typedef quintptr WId; class LXQtTaskbarWlrootsWindow; class LXQtTaskbarWlrootsWindowManagment : public QWaylandClientExtensionTemplate, public QtWayland::zwlr_foreign_toplevel_manager_v1 { Q_OBJECT public: static constexpr int version = 16; LXQtTaskbarWlrootsWindowManagment(); ~LXQtTaskbarWlrootsWindowManagment(); inline bool isShowingDesktop() const { return m_isShowingDesktop; } inline void setShowingDesktop(bool show) { m_isShowingDesktop = show; } protected: void zwlr_foreign_toplevel_manager_v1_toplevel(struct ::zwlr_foreign_toplevel_handle_v1 *toplevel); void zwlr_foreign_toplevel_manager_v1_finished() {}; Q_SIGNALS: void windowCreated(WId wid); private: bool m_isShowingDesktop = false; }; using WindowState = QtWayland::zwlr_foreign_toplevel_handle_v1::state; class WindowProperties { public: /** Title of the window */ QString title = QString::fromUtf8( "untitled" ); bool titleChanged = false; /** appId of the window */ QString appId = QString::fromUtf8( "unidentified" ); bool appIdChanged = false; /** List of outputs which the window is currently on */ QList<::wl_output *> outputs; bool outputsChanged = false; /** Is maximized */ bool maximized = false; bool maximizedChanged = false; /** Is minimized */ bool minimized = false; bool minimizedChanged = false; /** Is active */ bool activated = false; bool activatedChanged = false; /** Is fullscreen */ bool fullscreen = false; bool fullscreenChanged = false; /** Parent of this view, can be null */ ::zwlr_foreign_toplevel_handle_v1 * parent = nullptr; bool parentChanged = false; /** List of outputs from which window has left */ QList<::wl_output *> outputsLeft; }; class LXQtTaskbarWlrootsWindow : public QObject, public QtWayland::zwlr_foreign_toplevel_handle_v1 { Q_OBJECT public: LXQtTaskbarWlrootsWindow(::zwlr_foreign_toplevel_handle_v1 *id); ~LXQtTaskbarWlrootsWindow(); inline WId getWindowId() const { return reinterpret_cast(this); } void activate(); QIcon icon; WindowProperties windowState; WId parentWindow = 0; ::zwlr_foreign_toplevel_handle_v1 *ID = nullptr; Q_SIGNALS: void titleChanged(); void appIdChanged(); void outputsChanged(); /** Individual state change signals */ void maximizedChanged(); void minimizedChanged(); void activatedChanged(); void fullscreenChanged(); void parentChanged(); /** Bulk state change signal */ void stateChanged(); /** First state change signal: Before this, the window did not have a valid state */ void windowReady(); /** All state changes have been sent. */ void done(); /** Window closed signal */ void closed(); protected: void zwlr_foreign_toplevel_handle_v1_title(const QString &title); void zwlr_foreign_toplevel_handle_v1_app_id(const QString &app_id); void zwlr_foreign_toplevel_handle_v1_output_enter(struct ::wl_output *output); void zwlr_foreign_toplevel_handle_v1_output_leave(struct ::wl_output *output); void zwlr_foreign_toplevel_handle_v1_state(wl_array *state); void zwlr_foreign_toplevel_handle_v1_done(); void zwlr_foreign_toplevel_handle_v1_closed(); void zwlr_foreign_toplevel_handle_v1_parent(struct ::zwlr_foreign_toplevel_handle_v1 *parent); private: void setParentWindow(LXQtTaskbarWlrootsWindow *parent); QMetaObject::Connection parentWindowUnmappedConnection; WindowProperties m_pendingState; bool initDone = false; }; ================================================ FILE: panel/backends/wayland/wlroots/lxqtwmbackend_wlr.cpp ================================================ #include "lxqttaskbarwlrwm.h" #include "lxqtwmbackend_wlr.h" #include "workspace.hpp" #include #include #include #include #include // Function to erase a window from the vector void eraseWindow(std::vector& windows, WId tgt) { // Use std::vector::iterator to find the window auto it = std::find(windows.begin(), windows.end(), tgt); // Check if the window was found if (it != windows.end()) { // If found, erase the element pointed to by the iterator windows.erase(it); } } LXQtTaskbarWlrootsBackend::LXQtTaskbarWlrootsBackend(QObject *parent) : ILXQtAbstractWMInterface(parent) { m_managment.reset(new LXQtTaskbarWlrootsWindowManagment); m_wsmgr.reset(new LXQt::Taskbar::WorkspaceManagerV1); connect(m_managment.get(), &LXQtTaskbarWlrootsWindowManagment::windowCreated, this, &LXQtTaskbarWlrootsBackend::addWindow); connect(m_wsmgr.get(), &LXQt::Taskbar::WorkspaceManagerV1::workspaceAdded, this, &LXQtTaskbarWlrootsBackend::workspacesCountChanged); connect(m_wsmgr.get(), &LXQt::Taskbar::WorkspaceManagerV1::workspaceRemoved, this, &LXQtTaskbarWlrootsBackend::workspacesCountChanged); connect(m_wsmgr.get(), &LXQt::Taskbar::WorkspaceManagerV1::currentWorkspaceChanged, this, [this] (const QList &screens) { for (auto scrn : screens) { emit currentWorkspaceChanged(m_wsmgr->currentWorkspaceIndex(scrn), scrn->name()); } }); connect(m_wsmgr.get(), &LXQt::Taskbar::WorkspaceManagerV1::nameChanged, this, [this]() { emit workspaceNameChanged(-1); // without specifying an index }); } bool LXQtTaskbarWlrootsBackend::supportsAction(WId, LXQtTaskBarBackendAction action) const { switch (action) { case LXQtTaskBarBackendAction::Maximize: return true; case LXQtTaskBarBackendAction::Minimize: return true; case LXQtTaskBarBackendAction::FullScreen: return true; case LXQtTaskBarBackendAction::DesktopSwitch: return true; default: return false; } return false; } bool LXQtTaskbarWlrootsBackend::reloadWindows() { const QVector wids = getCurrentWindows(); // Force removal and re-adding for(WId windowId : wids) { emit windowRemoved(windowId); } for(WId windowId : wids) { emit windowAdded(windowId); } return true; } QVector LXQtTaskbarWlrootsBackend::getCurrentWindows() const { QVector wids; for( WId wid: windows ){ wids << wid; } return wids; } QString LXQtTaskbarWlrootsBackend::getWindowTitle(WId windowId) const { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return QString(); return window->windowState.title; } bool LXQtTaskbarWlrootsBackend::applicationDemandsAttention(WId) const { return false; } QIcon LXQtTaskbarWlrootsBackend::getApplicationIcon(WId windowId, int devicePixels) const { Q_UNUSED(devicePixels) LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return QIcon(); return window->icon; } QString LXQtTaskbarWlrootsBackend::getWindowClass(WId windowId) const { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return QString(); return window->windowState.appId; } LXQtTaskBarWindowLayer LXQtTaskbarWlrootsBackend::getWindowLayer(WId) const { return LXQtTaskBarWindowLayer::Normal; } bool LXQtTaskbarWlrootsBackend::setWindowLayer(WId, LXQtTaskBarWindowLayer) { return false; } LXQtTaskBarWindowState LXQtTaskbarWlrootsBackend::getWindowState(WId windowId) const { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return LXQtTaskBarWindowState::Normal; if(window->windowState.minimized) return LXQtTaskBarWindowState::Minimized; if(window->windowState.maximized) return LXQtTaskBarWindowState::Maximized; if(window->windowState.fullscreen) return LXQtTaskBarWindowState::FullScreen; return LXQtTaskBarWindowState::Normal; } bool LXQtTaskbarWlrootsBackend::setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return false; switch (state) { case LXQtTaskBarWindowState::Minimized: { if ( set ) { window->set_minimized(); } else { window->unset_minimized(); } break; } case LXQtTaskBarWindowState::Maximized: case LXQtTaskBarWindowState::MaximizedVertically: case LXQtTaskBarWindowState::MaximizedHorizontally: { if ( set ) { window->set_maximized(); } else { window->unset_maximized(); } break; } case LXQtTaskBarWindowState::Normal: { if (set) { if ( window->windowState.maximized) { window->unset_maximized(); } } break; } case LXQtTaskBarWindowState::FullScreen: { if ( set ) { window->set_fullscreen(nullptr); } else { window->unset_fullscreen(); } break; } default: return false; } return true; } bool LXQtTaskbarWlrootsBackend::isWindowActive(WId windowId) const { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return false; return activeWindow == windowId || window->windowState.activated; } bool LXQtTaskbarWlrootsBackend::raiseWindow(WId windowId, bool onCurrentWorkSpace) { Q_UNUSED(onCurrentWorkSpace) // Cannot be done on a generic wlroots-based compositor! LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return false; window->activate(); return true; } bool LXQtTaskbarWlrootsBackend::closeWindow(WId windowId) { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(!window) return false; window->close(); return true; } WId LXQtTaskbarWlrootsBackend::getActiveWindow() const { return activeWindow; } int LXQtTaskbarWlrootsBackend::getWorkspacesCount(QScreen *screen) const { return m_wsmgr->workspaceCount(screen); } QString LXQtTaskbarWlrootsBackend::getWorkspaceName(int idx, QString sceenName) const { return m_wsmgr->workspaceName(idx, sceenName); } int LXQtTaskbarWlrootsBackend::getCurrentWorkspace(QScreen *screen) const { return m_wsmgr->currentWorkspaceIndex(screen); } bool LXQtTaskbarWlrootsBackend::setCurrentWorkspace(int idx, QScreen *screen) { m_wsmgr->setCurrentWorkspaceIndex(idx, screen); m_wsmgr->commit(); /** Currently we always assume that this is true */ return true; } int LXQtTaskbarWlrootsBackend::getWindowWorkspace(WId) const { // Until this works, get the current workspace to not affect the taskbar return getCurrentWorkspace(); } bool LXQtTaskbarWlrootsBackend::setWindowOnWorkspace(WId, int) { return true; } void LXQtTaskbarWlrootsBackend::moveApplicationToPrevNextMonitor(WId, bool, bool) { } bool LXQtTaskbarWlrootsBackend::isWindowOnScreen(QScreen *screen, WId windowId) const { LXQtTaskbarWlrootsWindow *window = getWindow(windowId); if(window) { QtWaylandClient::QWaylandScreen *waylandScreen = dynamic_cast(screen->handle()); if (waylandScreen) { wl_output *output = waylandScreen->output(); return window->windowState.outputs.contains(output); } } return false; } bool LXQtTaskbarWlrootsBackend::setDesktopLayout(Qt::Orientation, int, int, bool) { // Wlroots has no support for workspace as of 2024-August-20 return false; } void LXQtTaskbarWlrootsBackend::moveApplication(WId) { } void LXQtTaskbarWlrootsBackend::resizeApplication(WId) { } void LXQtTaskbarWlrootsBackend::refreshIconGeometry(WId, const QRect &) { } bool LXQtTaskbarWlrootsBackend::isAreaOverlapped(const QRect &) const { return false; } bool LXQtTaskbarWlrootsBackend::isShowingDesktop() const { return m_managment->isShowingDesktop(); } bool LXQtTaskbarWlrootsBackend::showDesktop(bool value) { if (isShowingDesktop() == value) return false; // If the windows are going to be restored but all of them are already restored, // removed or closed (e.g., by the user), show the desktop instead. if (!value) { bool hasMinimized = false; for (auto windowId : std::as_const(showDesktopWins)) { if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized && std::find(windows.begin(), windows.end(), windowId) != windows.end()) { hasMinimized = true; break; } } if (!hasMinimized) value = true; } if (value) { showDesktopWins.clear(); QVector wids = getCurrentWindows(); std::sort(wids.begin(), wids.end(), [this](WId id1, WId id2) { // sort the list by activation time to keep the z-order on restoring return (lastActivated.value(id1) < lastActivated.value(id2)); }); for (auto windowId : std::as_const(wids)) { if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) { // was minimized before showing the desktop and so, should not be restored later continue; } setWindowState(windowId, LXQtTaskBarWindowState::Minimized, true); showDesktopWins.push_back(windowId); } } else { for (auto windowId : std::as_const(showDesktopWins)) setWindowState(windowId, LXQtTaskBarWindowState::Minimized, false); showDesktopWins.clear(); } m_managment->setShowingDesktop(!showDesktopWins.empty()); return true; } WId LXQtTaskbarWlrootsBackend::findWindow(WId tgt) const { for (auto id : std::as_const(windows)) { if (equalIds(id, tgt)) { return id; } } return 0; } WId LXQtTaskbarWlrootsBackend::findTopParent(WId winId) const { while (getWindow(winId)->parentWindow) { winId = getWindow(winId)->parentWindow; // first search in transients because this may be a child window of another one WId window = 0; for (auto i = transients.cbegin(), end = transients.cend(); i != end; ++i) { if (equalIds(i.key(), winId)) { window = i.key(); break; } } if (window) winId = window; else { window = findWindow(winId); if (window) winId = window; } } return winId; } void LXQtTaskbarWlrootsBackend::addWindow(WId winId) { for (auto id : std::as_const(windows)) { if (id == winId) { return; } } if (transients.contains(winId)) { return; } LXQtTaskbarWlrootsWindow *window = getWindow(winId); if (window == nullptr) { return; } if (window->windowState.activated) { WId pId = findTopParent(winId); setLastActivated(pId); activeWindow = pId; emit activeWindowChanged(activeWindow); } connect(window, &LXQtTaskbarWlrootsWindow::activatedChanged, this, &LXQtTaskbarWlrootsBackend::onActivatedChanged); connect(window, &LXQtTaskbarWlrootsWindow::parentChanged, this, &LXQtTaskbarWlrootsBackend::onParentChanged); // add it either to transients or windows if (WId leader = window->parentWindow) { transients.insert(winId, leader); connect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeTransient); } else { addToWindows(winId); } } void LXQtTaskbarWlrootsBackend::addToWindows(WId winId) { LXQtTaskbarWlrootsWindow *window = getWindow(winId); if (window == nullptr) { return; } windows.push_back(winId); connect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeWindow); connect(window, &LXQtTaskbarWlrootsWindow::titleChanged, this, &LXQtTaskbarWlrootsBackend::onTitleChanged); connect(window, &LXQtTaskbarWlrootsWindow::appIdChanged, this, &LXQtTaskbarWlrootsBackend::onAppIdChanged); connect(window, &LXQtTaskbarWlrootsWindow::fullscreenChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); connect(window, &LXQtTaskbarWlrootsWindow::maximizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); connect(window, &LXQtTaskbarWlrootsWindow::minimizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); connect(window, &LXQtTaskbarWlrootsWindow::outputsChanged, this, &LXQtTaskbarWlrootsBackend::onOutputsChanged); emit windowAdded( winId ); emit windowPropertyChanged(winId, int(LXQtTaskBarWindowProperty::WindowClass)); emit windowPropertyChanged(winId, int(LXQtTaskBarWindowProperty::Title)); emit windowPropertyChanged(winId, int(LXQtTaskBarWindowProperty::Icon)); emit windowPropertyChanged(winId, int(LXQtTaskBarWindowProperty::State)); } void LXQtTaskbarWlrootsBackend::removeWindow() { if (auto window = qobject_cast(QObject::sender())) { disconnect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeWindow); disconnect(window, &LXQtTaskbarWlrootsWindow::parentChanged, this, &LXQtTaskbarWlrootsBackend::onParentChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::activatedChanged, this, &LXQtTaskbarWlrootsBackend::onActivatedChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::titleChanged, this, &LXQtTaskbarWlrootsBackend::onTitleChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::appIdChanged, this, &LXQtTaskbarWlrootsBackend::onAppIdChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::fullscreenChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::maximizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::minimizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::outputsChanged, this, &LXQtTaskbarWlrootsBackend::onOutputsChanged); WId winId = window->getWindowId(); eraseWindow(windows, winId); lastActivated.remove(winId); if (activeWindow == winId) { activeWindow = 0; emit activeWindowChanged(0); } emit windowRemoved(winId); } } void LXQtTaskbarWlrootsBackend::removeTransient() { if (auto window = qobject_cast(QObject::sender())) { disconnect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeTransient); disconnect(window, &LXQtTaskbarWlrootsWindow::parentChanged, this, &LXQtTaskbarWlrootsBackend::onParentChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::activatedChanged, this, &LXQtTaskbarWlrootsBackend::onActivatedChanged); transients.remove(window->getWindowId()); } } void LXQtTaskbarWlrootsBackend::onActivatedChanged() { if (auto window = qobject_cast(QObject::sender())) { WId effectiveWindow = findTopParent(window->getWindowId()); if (window->windowState.activated) { setLastActivated(effectiveWindow); if (activeWindow != effectiveWindow) { activeWindow = effectiveWindow; emit activeWindowChanged(activeWindow); } } else { // First check if it has an active child (transient) window. for (auto i = transients.cbegin(), end = transients.cend(); i != end; ++i) { if (window->getWindowId() != i.key() && equalIds(findTopParent(i.key()), effectiveWindow)) { if (auto win = getWindow(i.key())) { if (win->windowState.activated) return; } } } if (activeWindow == effectiveWindow) { activeWindow = 0; emit activeWindowChanged(0); } } } } void LXQtTaskbarWlrootsBackend::onParentChanged() { if (auto window = qobject_cast(QObject::sender())) { WId leader = window->parentWindow; /** Basically, check if this window is a transient */ if (transients.remove(window->getWindowId())) { if (leader) { // leader change. transients.insert(window->getWindowId(), leader); } else { // lost a leader, add to regular windows list. Q_ASSERT(findWindow(leader) == 0); disconnect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeTransient); addToWindows(window->getWindowId()); // Correct the activation state if an active window that has lost its leader was active before, // because "LXQtTaskbarWlrootsWindow::activatedChanged" might not be emitted for it. if (window->windowState.activated) { setLastActivated(window->getWindowId()); activeWindow = window->getWindowId(); emit activeWindowChanged(activeWindow); } } } else if (leader) { // remove it from regular windows list disconnect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeWindow); disconnect(window, &LXQtTaskbarWlrootsWindow::titleChanged, this, &LXQtTaskbarWlrootsBackend::onTitleChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::appIdChanged, this, &LXQtTaskbarWlrootsBackend::onAppIdChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::fullscreenChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::maximizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::minimizedChanged, this, &LXQtTaskbarWlrootsBackend::onStateChanged); disconnect(window, &LXQtTaskbarWlrootsWindow::outputsChanged, this, &LXQtTaskbarWlrootsBackend::onOutputsChanged); eraseWindow(windows, window->getWindowId()); lastActivated.remove(window->getWindowId()); // announce that it's removed emit windowRemoved(window->getWindowId()); // add it to transients transients.insert(window->getWindowId(), leader); connect(window, &LXQtTaskbarWlrootsWindow::closed, this, &LXQtTaskbarWlrootsBackend::removeTransient); // Correct the activation state if a window that has got a leader was active before. if (activeWindow == window->getWindowId()) { WId pId = findTopParent(window->getWindowId()); setLastActivated(pId); activeWindow = pId; emit activeWindowChanged(activeWindow); } } } } void LXQtTaskbarWlrootsBackend::onTitleChanged() { if (auto window = qobject_cast(QObject::sender())) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Title)); } void LXQtTaskbarWlrootsBackend::onAppIdChanged() { if (auto window = qobject_cast(QObject::sender())) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::WindowClass)); } void LXQtTaskbarWlrootsBackend::onStateChanged() { if (auto window = qobject_cast(QObject::sender())) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::State)); } void LXQtTaskbarWlrootsBackend::onOutputsChanged() { if (auto window = qobject_cast(QObject::sender())) emit windowPropertyChanged(window->getWindowId(), int(LXQtTaskBarWindowProperty::Geometry)); } bool LXQtTaskbarWlrootsBackend::acceptWindow(WId window) const { if(transients.contains(window)) return false; return true; } LXQtTaskbarWlrootsWindow *LXQtTaskbarWlrootsBackend::getWindow(WId windowId) const { /** Easiest way is to convert the quintptr to the actual pointer */ LXQtTaskbarWlrootsWindow *win = reinterpret_cast( windowId ); if ( win ) { return win; } return nullptr; } bool LXQtTaskbarWlrootsBackend::equalIds(WId windowId1, WId windowId2) const { if (windowId1 == windowId2) { return true; } LXQtTaskbarWlrootsWindow *win1 = reinterpret_cast( windowId1 ); LXQtTaskbarWlrootsWindow *win2 = reinterpret_cast( windowId2 ); if (win1 == nullptr && win2 == nullptr) { return true; } if (win1 != nullptr && win2 != nullptr) { return win1->ID == win2->ID; } return false; } void LXQtTaskbarWlrootsBackend::setLastActivated(WId id) { auto t = QDateTime::currentMSecsSinceEpoch(); while (lastActivated.key(t) != 0) ++t; // make sure the times are not equal lastActivated[id] = t; } int LXQtWMBackendWlrootsLibrary::getBackendScore(const QString& key) const { if (key.compare(QStringLiteral("wlroots"), Qt::CaseInsensitive) == 0) { return 50; } static const QStringList supportedList = {QStringLiteral("labwc"), QStringLiteral("sway"), QStringLiteral("wayfire"), // The following compositors are also supported, // although they are not based on wlroots. QStringLiteral("hyprland"), QStringLiteral("river"), QStringLiteral("niri")}; if (supportedList.contains(key, Qt::CaseInsensitive)) { return 30; } // Unsupported return 0; } ILXQtAbstractWMInterface *LXQtWMBackendWlrootsLibrary::instance() const { return new LXQtTaskbarWlrootsBackend(nullptr); } ================================================ FILE: panel/backends/wayland/wlroots/lxqtwmbackend_wlr.h ================================================ #pragma once #include "../../ilxqtabstractwmiface.h" #include #include #include class LXQtTaskbarWlrootsWindow; class LXQtTaskbarWlrootsWindowManagment; class LXQtWlrootsWaylandWorkspaceInfo; namespace LXQt { namespace Taskbar { class WorkspaceManagerV1; class WorkspaceGroupHandleV1; class WorkspaceHandleV1; } } class LXQtTaskbarWlrootsBackend : public ILXQtAbstractWMInterface { Q_OBJECT public: explicit LXQtTaskbarWlrootsBackend(QObject *parent = nullptr); // Backend virtual bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const override; // Windows virtual bool reloadWindows() override; virtual QVector getCurrentWindows() const override; virtual QString getWindowTitle(WId windowId) const override; virtual bool applicationDemandsAttention(WId windowId) const override; virtual QIcon getApplicationIcon(WId windowId, int devicePixels) const override; virtual QString getWindowClass(WId windowId) const override; virtual LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const override; virtual bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) override; virtual LXQtTaskBarWindowState getWindowState(WId windowId) const override; virtual bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) override; virtual bool isWindowActive(WId windowId) const override; virtual bool raiseWindow(WId windowId, bool onCurrentWorkSpace) override; virtual bool closeWindow(WId windowId) override; virtual WId getActiveWindow() const override; // Workspaces virtual int getWorkspacesCount(QScreen *screen = nullptr) const override; virtual QString getWorkspaceName(int idx, QString sceenName = QString()) const override; virtual int getCurrentWorkspace(QScreen *screen = nullptr) const override; virtual bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) override; virtual int getWindowWorkspace(WId windowId) const override; virtual bool setWindowOnWorkspace(WId windowId, int idx) override; virtual void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) override; virtual bool isWindowOnScreen(QScreen *screen, WId windowId) const override; virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) override; // X11 Specific virtual void moveApplication(WId windowId) override; virtual void resizeApplication(WId windowId) override; virtual void refreshIconGeometry(WId windowId, const QRect &geom) override; // Panel internal virtual bool isAreaOverlapped(const QRect& area) const override; // Show Destop virtual bool isShowingDesktop() const override; virtual bool showDesktop(bool value) override; private slots: void addWindow(WId wid); void removeWindow(); void removeTransient(); void onActivatedChanged(); void onParentChanged(); void onTitleChanged(); void onAppIdChanged(); void onStateChanged(); void onOutputsChanged(); private: void addToWindows(WId winId); bool acceptWindow(WId wid) const; WId findWindow(WId tgt) const; WId findTopParent(WId winId) const; bool equalIds(WId windowId1, WId windowId2) const; void setLastActivated(WId id); /** Convert WId (i.e. quintptr into LXQtTaskbarWlrootsWindow*) */ LXQtTaskbarWlrootsWindow *getWindow(WId windowId) const; std::unique_ptr m_managment; std::unique_ptr m_wsmgr; QHash lastActivated; WId activeWindow = 0; std::vector windows; // for showing desktop std::vector showDesktopWins; // key=transient child, value=leader QHash transients; }; class LXQtWMBackendWlrootsLibrary: public QObject, public ILXQtWMBackendLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/WMInterface/1.0") Q_INTERFACES(ILXQtWMBackendLibrary) public: int getBackendScore(const QString& key) const override; ILXQtAbstractWMInterface* instance() const override; }; ================================================ FILE: panel/backends/wayland/wlroots/wlr-foreign-toplevel-management-unstable-v1.xml ================================================ Copyright © 2018 Ilia Bozhinov Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of the copyright holders not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. The copyright holders make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. The purpose of this protocol is to enable the creation of taskbars and docks by providing them with a list of opened applications and letting them request certain actions on them, like maximizing, etc. After a client binds the zwlr_foreign_toplevel_manager_v1, each opened toplevel window will be sent via the toplevel event This event is emitted whenever a new toplevel window is created. It is emitted for all toplevels, regardless of the app that has created them. All initial details of the toplevel(title, app_id, states, etc.) will be sent immediately after this event via the corresponding events in zwlr_foreign_toplevel_handle_v1. Indicates the client no longer wishes to receive events for new toplevels. However the compositor may emit further toplevel_created events, until the finished event is emitted. The client must not send any more requests after this one. This event indicates that the compositor is done sending events to the zwlr_foreign_toplevel_manager_v1. The server will destroy the object immediately after sending this request, so it will become invalid and the client should free any resources associated with it. A zwlr_foreign_toplevel_handle_v1 object represents an opened toplevel window. Each app may have multiple opened toplevels. Each toplevel has a list of outputs it is visible on, conveyed to the client with the output_enter and output_leave events. This event is emitted whenever the title of the toplevel changes. This event is emitted whenever the app-id of the toplevel changes. This event is emitted whenever the toplevel becomes visible on the given output. A toplevel may be visible on multiple outputs. This event is emitted whenever the toplevel stops being visible on the given output. It is guaranteed that an entered-output event with the same output has been emitted before this event. Requests that the toplevel be maximized. If the maximized state actually changes, this will be indicated by the state event. Requests that the toplevel be unmaximized. If the maximized state actually changes, this will be indicated by the state event. Requests that the toplevel be minimized. If the minimized state actually changes, this will be indicated by the state event. Requests that the toplevel be unminimized. If the minimized state actually changes, this will be indicated by the state event. Request that this toplevel be activated on the given seat. There is no guarantee the toplevel will be actually activated. The different states that a toplevel can have. These have the same meaning as the states with the same names defined in xdg-toplevel This event is emitted immediately after the zlw_foreign_toplevel_handle_v1 is created and each time the toplevel state changes, either because of a compositor action or because of a request in this protocol. This event is sent after all changes in the toplevel state have been sent. This allows changes to the zwlr_foreign_toplevel_handle_v1 properties to be seen as atomic, even if they happen via multiple events. Send a request to the toplevel to close itself. The compositor would typically use a shell-specific method to carry out this request, for example by sending the xdg_toplevel.close event. However, this gives no guarantees the toplevel will actually be destroyed. If and when this happens, the zwlr_foreign_toplevel_handle_v1.closed event will be emitted. The rectangle of the surface specified in this request corresponds to the place where the app using this protocol represents the given toplevel. It can be used by the compositor as a hint for some operations, e.g minimizing. The client is however not required to set this, in which case the compositor is free to decide some default value. If the client specifies more than one rectangle, only the last one is considered. The dimensions are given in surface-local coordinates. Setting width=height=0 removes the already-set rectangle. This event means the toplevel has been destroyed. It is guaranteed there won't be any more events for this zwlr_foreign_toplevel_handle_v1. The toplevel itself becomes inert so any requests will be ignored except the destroy request. Destroys the zwlr_foreign_toplevel_handle_v1 object. This request should be called either when the client does not want to use the toplevel anymore or after the closed event to finalize the destruction of the object. Requests that the toplevel be fullscreened on the given output. If the fullscreen state and/or the outputs the toplevel is visible on actually change, this will be indicated by the state and output_enter/leave events. The output parameter is only a hint to the compositor. Also, if output is NULL, the compositor should decide which output the toplevel will be fullscreened on, if at all. Requests that the toplevel be unfullscreened. If the fullscreen state actually changes, this will be indicated by the state event. This event is emitted whenever the parent of the toplevel changes. No event is emitted when the parent handle is destroyed by the client. ================================================ FILE: panel/backends/wayland/wlroots/workspace.cpp ================================================ #include "workspace.hpp" #include #include #include /** ext_workspace_handle_v1 <-> WorkspaceHandleV1 map */ QMap> workspaceMap; QList workspaceGroups; /** * Implementation of the LXQt::TaskBar::WorkspaceManagerV1 class */ LXQt::Taskbar::WorkspaceManagerV1::WorkspaceManagerV1() : QWaylandClientExtensionTemplate( version) { /** Automatically destroy thie object */ connect( this, &QWaylandClientExtension::activeChanged, this, [this] { if (!isActive()) { ext_workspace_manager_v1_destroy(object()); } }); } LXQt::Taskbar::WorkspaceManagerV1::~WorkspaceManagerV1() { if (!isActive()) { ext_workspace_manager_v1_destroy(object()); } } int LXQt::Taskbar::WorkspaceManagerV1::workspaceCount(QScreen *screen) { if (screen) { if (auto waylandScreen = dynamic_cast(screen->handle())) { wl_output *output = waylandScreen->output(); for (auto *wg : std::as_const(workspaceGroups)) { if (wg->outputs().contains(output)) return wg->workspaces().count(); } } } return workspaceMap.count(); } int LXQt::Taskbar::WorkspaceManagerV1::currentWorkspaceIndex(QScreen *screen) { QMap, WorkspaceHandleV1*> map; // sorted by key if (screen) { if (auto waylandScreen = dynamic_cast(screen->handle())) { wl_output *output = waylandScreen->output(); for (auto *wg : std::as_const(workspaceGroups)) { if (wg->outputs().contains(output)) { const auto workspaces = wg->workspaces(); for (const auto& ws : workspaces) { if (ws) map[ws->coordinates()] = ws; } break; } } } } if (!map.isEmpty()) { int index = 0; for (WorkspaceHandleV1 *ws : std::as_const(map)) { ++index; if (ws->state() & WorkspaceHandleV1::state_active) { return index; } } } return -1; } QString LXQt::Taskbar::WorkspaceManagerV1::workspaceName(int idx, const QString &sceenName) { QMap, WorkspaceHandleV1*> map; const auto screens = QGuiApplication::screens(); for (const auto& scr : screens) { if (scr->name() == sceenName) { if (auto waylandScreen = dynamic_cast(scr->handle())) { wl_output *output = waylandScreen->output(); for (auto *wg : std::as_const(workspaceGroups)) { if (wg->outputs().contains(output)) { const auto workspaces = wg->workspaces(); for (const auto& ws : workspaces) { if (ws) map[ws->coordinates()] = ws; } break; } } } break; } } if (idx <= map.size()) { int index = 0; for (WorkspaceHandleV1 *ws : std::as_const(map)) { ++index; if (index == idx) { return ws->name(); } } } return QString(); } void LXQt::Taskbar::WorkspaceManagerV1::setCurrentWorkspaceIndex(int idx, QScreen *screen) { if (idx <= 0) return; QMap, WorkspaceHandleV1*> map; // sorted by key if (screen) { if (auto waylandScreen = dynamic_cast(screen->handle())) { wl_output *output = waylandScreen->output(); for (auto *wg : std::as_const(workspaceGroups)) { if (wg->outputs().contains(output)) { const auto workspaces = wg->workspaces(); for (const auto& ws : workspaces) { if (ws) map[ws->coordinates()] = ws; } break; } } } } if (idx <= map.size()) { int index = 0; for (WorkspaceHandleV1 *ws : std::as_const(map)) { ++index; if (index == idx) { //qDebug() << ws->name() << "Activating"; ws->activate(); return; } } } } void LXQt::Taskbar::WorkspaceManagerV1::ext_workspace_manager_v1_workspace_group( struct ::ext_workspace_group_handle_v1 *workspace_group) { auto wg = new WorkspaceGroupHandleV1(workspace_group); if (!workspaceGroups.contains(wg)) { workspaceGroups << wg; emit workspaceGroupAdded(wg); connect(wg, &WorkspaceGroupHandleV1::workspaceAdded, this, &WorkspaceManagerV1::workspaceAdded); connect(wg, &WorkspaceGroupHandleV1::workspaceRemoved, this, &WorkspaceManagerV1::workspaceRemoved); connect(this, &WorkspaceManagerV1::activation, wg, [this, wg]() { QList scrns; const auto screens = QGuiApplication::screens(); for (const auto& scr : screens) { if (auto waylandScreen = dynamic_cast(scr->handle())) { if (wg->outputs().contains(waylandScreen->output())) { scrns << scr; } } } emit currentWorkspaceChanged(scrns); }); /* NOTE: This is a workaround for a Qt/QtWayland issue, because of which, the QScreen corresponding to a new output may be created with a delay and mess with the desktop switcher on the new screen. The issue usually happened on re-plugging an external monitor or resuming from suspension. */ connect(qGuiApp, &QGuiApplication::screenAdded, wg, [this, wg]() { QList scrns; const auto screens = QGuiApplication::screens(); for (const auto& scr : screens) { if (auto waylandScreen = dynamic_cast(scr->handle())) { if (wg->outputs().contains(waylandScreen->output())) { scrns << scr; } } } emit workspaceAdded(nullptr); emit currentWorkspaceChanged(scrns); emit nameChanged(); }); } } void LXQt::Taskbar::WorkspaceManagerV1::ext_workspace_manager_v1_workspace( struct ::ext_workspace_handle_v1 *workspace_) { workspaceMap[workspace_] = new WorkspaceHandleV1(workspace_, workspaceMap.count() + 1); connect(workspaceMap[workspace_], &WorkspaceHandleV1::activated, this, &WorkspaceManagerV1::activation, Qt::QueuedConnection); connect(workspaceMap[workspace_], &WorkspaceHandleV1::deactivated, this, &WorkspaceManagerV1::activation, Qt::QueuedConnection); connect(workspaceMap[workspace_], &WorkspaceHandleV1::nameChanged, this, &WorkspaceManagerV1::nameChanged, Qt::QueuedConnection); // handle coordinates change as renaming plus activation connect(workspaceMap[workspace_], &WorkspaceHandleV1::coordinatesChanged, this, &WorkspaceManagerV1::nameChanged, Qt::QueuedConnection); connect(workspaceMap[workspace_], &WorkspaceHandleV1::coordinatesChanged, this, &WorkspaceManagerV1::activation, Qt::QueuedConnection); } void LXQt::Taskbar::WorkspaceManagerV1::ext_workspace_manager_v1_done() { emit done(); } void LXQt::Taskbar::WorkspaceManagerV1::ext_workspace_manager_v1_finished() { emit finished(); } /** * Implementation of the LXQt::TaskBar::WorkspaceGroupHandleV1 class */ LXQt::Taskbar::WorkspaceGroupHandleV1::WorkspaceGroupHandleV1( struct ::ext_workspace_group_handle_v1 *object) : QObject(), QtWayland::ext_workspace_group_handle_v1(object) {} LXQt::Taskbar::WorkspaceGroupHandleV1::~WorkspaceGroupHandleV1() { destroy(); } bool LXQt::Taskbar::WorkspaceGroupHandleV1::canCreateWorkspace() const { return (m_supported_capabilities & group_capabilities_create_workspace); } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_capabilities(uint32_t caps) { m_supported_capabilities = caps; emit capabilities(caps); } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_output_enter( struct ::wl_output *output) { if (!m_outputs.contains(output)) m_outputs << output; emit outputEnter(output); } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_output_leave( struct ::wl_output *output) { m_outputs.removeAll(output); emit outputLeave(output); } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_workspace_enter( struct ::ext_workspace_handle_v1 *workspace) { if (!workspaceGroups.contains(this)) { workspaceGroups << this; } if (workspaceMap.contains(workspace) && !m_workspaces.contains(workspaceMap[workspace])) { m_workspaces << workspaceMap[workspace]; emit workspaceAdded(workspaceMap[workspace]); //qDebug() << "Workspace added"; } } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_workspace_leave( struct ::ext_workspace_handle_v1 *workspace) { if (workspaceMap.contains(workspace) && m_workspaces.contains(workspaceMap[workspace])) { m_workspaces.removeAll(workspaceMap[workspace]); emit workspaceRemoved(workspaceMap[workspace]); } } void LXQt::Taskbar::WorkspaceGroupHandleV1::ext_workspace_group_handle_v1_removed() { workspaceGroups.removeAll(this); deleteLater(); emit removed(); } /** * Implementation of the LXQt::TaskBar::WorkspaceHandleV1 class */ LXQt::Taskbar::WorkspaceHandleV1::WorkspaceHandleV1(struct ::ext_workspace_handle_v1 *object, int index) : QObject(), QtWayland::ext_workspace_handle_v1(object) { m_coordinates << index; } LXQt::Taskbar::WorkspaceHandleV1::~WorkspaceHandleV1() { destroy(); } QString LXQt::Taskbar::WorkspaceHandleV1::id() const { return m_id; } QString LXQt::Taskbar::WorkspaceHandleV1::name() const { return m_name; } QList LXQt::Taskbar::WorkspaceHandleV1::coordinates() const { return m_coordinates; } uint32_t LXQt::Taskbar::WorkspaceHandleV1::state() const { return m_state; } uint32_t LXQt::Taskbar::WorkspaceHandleV1::capabilities() const { return m_capabilities; } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_id(const QString& id_) { m_id = id_; //qDebug() << "ID:" << m_id; emit idChanged(m_id); } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_name(const QString& name_) { m_name = name_; //qDebug() << "Name:" << m_name; emit nameChanged(m_name); } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_coordinates(wl_array *coordinates_) { m_coordinates.clear(); int32_t *data = static_cast(coordinates_->data); size_t count = coordinates_->size / sizeof(int32_t); for (size_t i = 0; i < count; ++i) { m_coordinates.append(data[i]); } //qDebug() << "Coords:" << m_name << m_coordinates; emit coordinatesChanged(m_coordinates); } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_state(uint32_t state_) { auto old_state = m_state; m_state = state_; /** Check if this workspace was activated */ if (!(old_state & state_active) && (state_ & state_active)) { emit activated(); } /** Check if this workspace was deactivated */ else if ((old_state & state_active) && !(state_ & state_active)) { emit deactivated(); } //qDebug() << "State:" << m_name << m_state; emit stateChanged(m_state); } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_capabilities(uint32_t capabilities_) { m_capabilities = capabilities_; //qDebug() << "Caps:" << m_name << m_capabilities; emit capabilitiesChanged(m_capabilities); } void LXQt::Taskbar::WorkspaceHandleV1::ext_workspace_handle_v1_removed() { if (auto key = workspaceMap.key(this)) { workspaceMap.remove(key); } deleteLater(); emit removed(); } ================================================ FILE: panel/backends/wayland/wlroots/workspace.hpp ================================================ #pragma once #include #include #include #include #include #include #include "wayland-ext-workspace-v1-client-protocol.h" #include "qwayland-ext-workspace-v1.h" #include struct wl_registry; namespace LXQt { namespace Taskbar { class WorkspaceManagerV1; class WorkspaceGroupHandleV1; class WorkspaceHandleV1; } } class LXQt::Taskbar::WorkspaceManagerV1 : public QWaylandClientExtensionTemplate, public QtWayland::ext_workspace_manager_v1 { Q_OBJECT public: static constexpr int version = 16; WorkspaceManagerV1(); virtual ~WorkspaceManagerV1(); int workspaceCount(QScreen *screen = nullptr); int currentWorkspaceIndex(QScreen *screen = nullptr); QString workspaceName(int idx, const QString &sceenName); void setCurrentWorkspaceIndex(int idx = 0, QScreen *screen = nullptr); Q_SIGNAL void workspaceGroupAdded(WorkspaceGroupHandleV1 *workspace_group); Q_SIGNAL void workspaceAdded(WorkspaceHandleV1 *workspace); Q_SIGNAL void workspaceRemoved(WorkspaceHandleV1 *workspace); Q_SIGNAL void nameChanged(); /** A workspace became active or inactive. */ Q_SIGNAL void currentWorkspaceChanged(const QList &screens); Q_SIGNAL void activation(); Q_SIGNAL void done(); Q_SIGNAL void finished(); protected: virtual void ext_workspace_manager_v1_workspace_group( struct ::ext_workspace_group_handle_v1 *workspace_group); virtual void ext_workspace_manager_v1_workspace(struct ::ext_workspace_handle_v1 *workspace); virtual void ext_workspace_manager_v1_done(); virtual void ext_workspace_manager_v1_finished(); }; class LXQt::Taskbar::WorkspaceGroupHandleV1 : public QObject, public QtWayland::ext_workspace_group_handle_v1 { Q_OBJECT public: WorkspaceGroupHandleV1(struct ::ext_workspace_group_handle_v1 *object); virtual ~WorkspaceGroupHandleV1(); bool canCreateWorkspace() const; QList outputs() const { return m_outputs; } QList> workspaces() const { return m_workspaces; } /** * Note: QtWayland::ext_workspace_group_handle_v1 has following member functions: * - create_workspace( QString ) * - destroy() * - object() -> struct ::ext_workspace_group_handle_v1 * * These functions are complete, and we do not have to re-implement them here. */ Q_SIGNAL void capabilities(uint32_t capabilities); Q_SIGNAL void outputEnter(struct ::wl_output *output); Q_SIGNAL void outputLeave(struct ::wl_output *output); Q_SIGNAL void workspaceAdded(WorkspaceHandleV1 *workspace); Q_SIGNAL void workspaceRemoved(WorkspaceHandleV1 *workspace); Q_SIGNAL void removed(); protected: virtual void ext_workspace_group_handle_v1_capabilities(uint32_t capabilities); virtual void ext_workspace_group_handle_v1_output_enter(struct ::wl_output *output); virtual void ext_workspace_group_handle_v1_output_leave(struct ::wl_output *output); virtual void ext_workspace_group_handle_v1_workspace_enter(struct ::ext_workspace_handle_v1 *workspace); virtual void ext_workspace_group_handle_v1_workspace_leave(struct ::ext_workspace_handle_v1 *workspace); virtual void ext_workspace_group_handle_v1_removed(); private: /** Track on which outputs this workspace group is visible */ QList m_outputs; /** Store the capabilities */ uint32_t m_supported_capabilities; /** Track workspaces that are a part of this workspace group */ QList> m_workspaces; }; class LXQt::Taskbar::WorkspaceHandleV1 : public QObject, public QtWayland::ext_workspace_handle_v1 { Q_OBJECT public: WorkspaceHandleV1(struct ::ext_workspace_handle_v1 *object, int index); virtual ~WorkspaceHandleV1(); /** * Note: QtWayland::ext_workspace_group_handle_v1 has following member functions: * - object() -> struct ::ext_workspace_group_handle_v1 * * - destroy(); * - activate(); * - deactivate(); * - assign(struct ::ext_workspace_group_handle_v1 *workspace_group); * - remove(); * These functions are complete, and we do not have to re-implement them here. */ QString id() const; QString name() const; QList coordinates() const; uint32_t state() const; uint32_t capabilities() const; Q_SIGNAL void idChanged(const QString& id); Q_SIGNAL void nameChanged(const QString& name); Q_SIGNAL void coordinatesChanged(QList coordinates); Q_SIGNAL void stateChanged(uint32_t state); Q_SIGNAL void capabilitiesChanged(uint32_t capabilities); Q_SIGNAL void removed(); /** This workspace just became active */ Q_SIGNAL void activated(); /** This workspace was just deactived */ Q_SIGNAL void deactivated(); protected: virtual void ext_workspace_handle_v1_id(const QString& id); virtual void ext_workspace_handle_v1_name(const QString& name); virtual void ext_workspace_handle_v1_coordinates(wl_array *coordinates); virtual void ext_workspace_handle_v1_state(uint32_t state); virtual void ext_workspace_handle_v1_capabilities(uint32_t capabilities); virtual void ext_workspace_handle_v1_removed(); private: QString m_id; QString m_name; QList m_coordinates; uint32_t m_state = 0; uint32_t m_capabilities; }; ================================================ FILE: panel/backends/xcb/CMakeLists.txt ================================================ set(PLATFORM_NAME xcb) set(PREFIX_NAME wmbackend) set(PROGRAM "lxqt-panel") set(BACKEND "backend") set(NAME ${PREFIX_NAME}_${PLATFORM_NAME}) project(${PROGRAM}_${BACKEND}_${NAME}) set(PROG_SHARE_DIR ${CMAKE_INSTALL_FULL_DATAROOTDIR}/lxqt/${PROGRAM}/${BACKEND}) set(PLUGIN_SHARE_DIR ${PROG_SHARE_DIR}/${BACKEND}/${NAME}) #************************************************ if (NOT DEFINED PLUGIN_DIR) set (PLUGIN_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROGRAM}) endif (NOT DEFINED PLUGIN_DIR) set(QTX_LIBRARIES Qt6::Gui) set(SRC lxqtwmbackend_x11.h lxqtwmbackend_x11.cpp) add_library(${NAME} MODULE ${SRC}) # build dynamically loadable modules install(TARGETS ${NAME} DESTINATION ${PLUGIN_DIR}/${BACKEND}) # install the *.so file target_link_libraries(${NAME} ${QTX_LIBRARIES} KF6::WindowSystem) ================================================ FILE: panel/backends/xcb/lxqtwmbackend_x11.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtwmbackend_x11.h" #include #include #include // Necessary for closeApplication() #include #include #include #include //NOTE: Xlib.h defines Bool which conflicts with QJsonValue::Type enum #include #undef Bool LXQtWMBackendX11::LXQtWMBackendX11(QObject *parent) : ILXQtAbstractWMInterface(parent) { auto *x11Application = qGuiApp->nativeInterface(); Q_ASSERT_X(x11Application, "LXQtWMBackendX11", "Constructed without X11 connection"); m_X11Display = x11Application->display(); m_xcbConnection = x11Application->connection(); connect(KX11Extras::self(), &KX11Extras::windowChanged, this, &LXQtWMBackendX11::onWindowChanged); connect(KX11Extras::self(), &KX11Extras::windowAdded, this, &LXQtWMBackendX11::onWindowAdded); connect(KX11Extras::self(), &KX11Extras::windowRemoved, this, &LXQtWMBackendX11::onWindowRemoved); connect(KX11Extras::self(), &KX11Extras::numberOfDesktopsChanged, this, &ILXQtAbstractWMInterface::workspacesCountChanged); connect(KX11Extras::self(), &KX11Extras::currentDesktopChanged, this, [this](int x) { emit currentWorkspaceChanged(x, QString()); // without specifying an output name }); connect(KX11Extras::self(), &KX11Extras::desktopNamesChanged, this, [this]() { emit workspaceNameChanged(-1); // without specifying an index }); connect(KX11Extras::self(), &KX11Extras::activeWindowChanged, this, &ILXQtAbstractWMInterface::activeWindowChanged); } /************************************************ * Model slots ************************************************/ void LXQtWMBackendX11::onWindowChanged(WId windowId, NET::Properties prop, NET::Properties2 prop2) { if(!m_windows.contains(windowId)) { // If already known window changes its property in a way // it's now acceptable, add it again to taskbar if(acceptWindow(windowId)) onWindowAdded(windowId); return; } if(!acceptWindow(windowId)) { // If already known window changes its property in a way // it's not anymore accepted, remove it from taskbar onWindowRemoved(windowId); return; } if (prop.testFlag(NET::WMGeometry)) { emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Geometry)); } if (prop2.testFlag(NET::WM2WindowClass)) { emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::WindowClass)); } // window changed virtual desktop if (prop.testFlag(NET::WMDesktop)) { emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Workspace)); } if (prop.testFlag(NET::WMVisibleName) || prop.testFlag(NET::WMName)) emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Title)); // XXX: we are setting window icon geometry -> don't need to handle NET::WMIconGeometry // Icon of the button can be based on windowClass if (prop.testFlag(NET::WMIcon) || prop2.testFlag(NET::WM2WindowClass)) emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Icon)); bool update_urgency = false; if (prop2.testFlag(NET::WM2Urgency)) { update_urgency = true; } if (prop.testFlag(NET::WMState)) { update_urgency = true; emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::State)); } if (update_urgency) emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Urgency)); } void LXQtWMBackendX11::onWindowAdded(WId windowId) { if(m_windows.contains(windowId)) return; if (!acceptWindow(windowId)) return; addWindow_internal(windowId); } void LXQtWMBackendX11::onWindowRemoved(WId windowId) { const int row = m_windows.indexOf(windowId); if(row == -1) return; m_windows.removeAt(row); emit windowRemoved(windowId); } /************************************************ * Model private functions ************************************************/ bool LXQtWMBackendX11::acceptWindow(WId windowId) const { QFlags ignoreList; ignoreList |= NET::DesktopMask; ignoreList |= NET::DockMask; ignoreList |= NET::SplashMask; ignoreList |= NET::ToolbarMask; ignoreList |= NET::MenuMask; ignoreList |= NET::PopupMenuMask; ignoreList |= NET::NotificationMask; KWindowInfo info(windowId, NET::WMWindowType | NET::WMState, NET::WM2TransientFor); if (!info.valid()) return false; if (NET::typeMatchesMask(info.windowType(NET::AllTypesMask), ignoreList)) return false; if (info.state() & NET::SkipTaskbar) return false; // WM_TRANSIENT_FOR hint not set - normal window WId transFor = info.transientFor(); WId appRootWindow = XDefaultRootWindow(m_X11Display); if (transFor == 0 || transFor == windowId || transFor == appRootWindow) return true; info = KWindowInfo(transFor, NET::WMWindowType); QFlags normalFlag; normalFlag |= NET::NormalMask; normalFlag |= NET::DialogMask; normalFlag |= NET::UtilityMask; return !NET::typeMatchesMask(info.windowType(NET::AllTypesMask), normalFlag); } void LXQtWMBackendX11::addWindow_internal(WId windowId) { m_windows.append(windowId); emit windowAdded(windowId); } /************************************************ * Windows function ************************************************/ bool LXQtWMBackendX11::supportsAction(WId windowId, LXQtTaskBarBackendAction action) const { NET::Action x11Action; switch (action) { case LXQtTaskBarBackendAction::Move: x11Action = NET::ActionMove; break; case LXQtTaskBarBackendAction::Resize: x11Action = NET::ActionResize; break; case LXQtTaskBarBackendAction::Maximize: x11Action = NET::ActionMax; break; case LXQtTaskBarBackendAction::MaximizeVertically: x11Action = NET::ActionMaxVert; break; case LXQtTaskBarBackendAction::MaximizeHorizontally: x11Action = NET::ActionMaxHoriz; break; case LXQtTaskBarBackendAction::Minimize: x11Action = NET::ActionMinimize; break; case LXQtTaskBarBackendAction::RollUp: x11Action = NET::ActionShade; break; case LXQtTaskBarBackendAction::FullScreen: x11Action = NET::ActionFullScreen; break; case LXQtTaskBarBackendAction::DesktopSwitch: return true; case LXQtTaskBarBackendAction::MoveToDesktop: return true; case LXQtTaskBarBackendAction::MoveToLayer: return true; case LXQtTaskBarBackendAction::MoveToOutput: return true; default: return false; } KWindowInfo info(windowId, NET::Properties(), NET::WM2AllowedActions); return info.actionSupported(x11Action); } bool LXQtWMBackendX11::reloadWindows() { QVector knownWindows; qSwap(knownWindows, m_windows); QList new_list; // Just add new windows to groups, deleting is up to the groups const auto wnds = KX11Extras::stackingOrder(); for (auto const wnd: wnds) { if (acceptWindow(wnd)) { new_list << wnd; addWindow_internal(wnd); } } //emulate windowRemoved if known window not reported by KWindowSystem for (auto i = knownWindows.begin(), i_e = knownWindows.end(); i != i_e; i++) { WId wnd = *i; if (!new_list.contains(wnd)) { emit windowRemoved(wnd); } } emit reloaded(); return true; } QVector LXQtWMBackendX11::getCurrentWindows() const { return m_windows; } QString LXQtWMBackendX11::getWindowTitle(WId windowId) const { KWindowInfo info(windowId, NET::WMVisibleName | NET::WMName); QString title = info.visibleName().isEmpty() ? info.name() : info.visibleName(); return title; } bool LXQtWMBackendX11::applicationDemandsAttention(WId windowId) const { WId appRootWindow = XDefaultRootWindow(m_X11Display); return NETWinInfo(m_xcbConnection, windowId, appRootWindow, NET::Properties{}, NET::WM2Urgency).urgency() || KWindowInfo{windowId, NET::WMState}.hasState(NET::DemandsAttention); } QIcon LXQtWMBackendX11::getApplicationIcon(WId windowId, int devicePixels) const { return KX11Extras::icon(windowId, devicePixels, devicePixels); } QString LXQtWMBackendX11::getWindowClass(WId windowId) const { KWindowInfo info(windowId, NET::Properties(), NET::WM2WindowClass); return QString::fromUtf8(info.windowClassClass()); } LXQtTaskBarWindowLayer LXQtWMBackendX11::getWindowLayer(WId windowId) const { NET::States state = KWindowInfo(windowId, NET::WMState).state(); if(state.testFlag(NET::KeepAbove)) return LXQtTaskBarWindowLayer::KeepAbove; else if(state.testFlag(NET::KeepBelow)) return LXQtTaskBarWindowLayer::KeepBelow; return LXQtTaskBarWindowLayer::Normal; } bool LXQtWMBackendX11::setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) { switch(layer) { case LXQtTaskBarWindowLayer::KeepAbove: KX11Extras::clearState(windowId, NET::KeepBelow); KX11Extras::setState(windowId, NET::KeepAbove); break; case LXQtTaskBarWindowLayer::KeepBelow: KX11Extras::clearState(windowId, NET::KeepAbove); KX11Extras::setState(windowId, NET::KeepBelow); break; default: KX11Extras::clearState(windowId, NET::KeepBelow); KX11Extras::clearState(windowId, NET::KeepAbove); break; } return true; } LXQtTaskBarWindowState LXQtWMBackendX11::getWindowState(WId windowId) const { KWindowInfo info(windowId, NET::WMState | NET::XAWMState); if(info.isMinimized()) return LXQtTaskBarWindowState::Minimized; NET::States state = info.state(); if(state.testFlag(NET::Hidden)) return LXQtTaskBarWindowState::Hidden; if(state.testFlag(NET::Max)) return LXQtTaskBarWindowState::Maximized; if(state.testFlag(NET::MaxHoriz)) return LXQtTaskBarWindowState::MaximizedHorizontally; if(state.testFlag(NET::MaxVert)) return LXQtTaskBarWindowState::MaximizedVertically; if(state.testFlag(NET::Shaded)) return LXQtTaskBarWindowState::RolledUp; if(state.testFlag(NET::FullScreen)) return LXQtTaskBarWindowState::FullScreen; return LXQtTaskBarWindowState::Normal; } bool LXQtWMBackendX11::setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) { // NOTE: window activation is left to the caller NET::State x11State; switch (state) { case LXQtTaskBarWindowState::Minimized: { if(set) KX11Extras::minimizeWindow(windowId); else KX11Extras::unminimizeWindow(windowId); return true; } case LXQtTaskBarWindowState::Maximized: { x11State = NET::Max; break; } case LXQtTaskBarWindowState::MaximizedVertically: { x11State = NET::MaxVert; break; } case LXQtTaskBarWindowState::MaximizedHorizontally: { x11State = NET::MaxHoriz; break; } case LXQtTaskBarWindowState::Normal: { x11State = NET::Max; //TODO: correct? break; } case LXQtTaskBarWindowState::RolledUp: { x11State = NET::Shaded; break; } default: return false; } if(set) KX11Extras::setState(windowId, x11State); else KX11Extras::clearState(windowId, x11State); return true; } bool LXQtWMBackendX11::isWindowActive(WId windowId) const { return KX11Extras::activeWindow() == windowId; } bool LXQtWMBackendX11::raiseWindow(WId windowId, bool onCurrentWorkSpace) { if (onCurrentWorkSpace && getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) { setWindowOnWorkspace(windowId, getCurrentWorkspace()); } else { setCurrentWorkspace(getWindowWorkspace(windowId)); } // bypass focus stealing prevention KX11Extras::forceActiveWindow(windowId); // Clear urgency flag emit windowPropertyChanged(windowId, int(LXQtTaskBarWindowProperty::Urgency)); return true; } bool LXQtWMBackendX11::closeWindow(WId windowId) { // FIXME: Why there is no such thing in KWindowSystem?? NETRootInfo(m_xcbConnection, NET::CloseWindow).closeWindowRequest(windowId); return true; } WId LXQtWMBackendX11::getActiveWindow() const { return KX11Extras::activeWindow(); } /************************************************ * Workspaces ************************************************/ int LXQtWMBackendX11::getWorkspacesCount(QScreen*) const { return KX11Extras::numberOfDesktops(); } QString LXQtWMBackendX11::getWorkspaceName(int idx, QString) const { return KX11Extras::desktopName(idx); } int LXQtWMBackendX11::getCurrentWorkspace(QScreen*) const { return KX11Extras::currentDesktop(); } bool LXQtWMBackendX11::setCurrentWorkspace(int idx, QScreen*) { if(KX11Extras::currentDesktop() == idx) return true; KX11Extras::setCurrentDesktop(idx); return true; } int LXQtWMBackendX11::getWindowWorkspace(WId windowId) const { KWindowInfo info(windowId, NET::WMDesktop); return info.desktop(); } bool LXQtWMBackendX11::setWindowOnWorkspace(WId windowId, int idx) { KX11Extras::setOnDesktop(windowId, idx); return true; } void LXQtWMBackendX11::moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) { KWindowInfo info(windowId, NET::WMDesktop); if (!info.isOnCurrentDesktop()) KX11Extras::setCurrentDesktop(info.desktop()); if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) KX11Extras::unminimizeWindow(windowId); KX11Extras::forceActiveWindow(windowId); const QRect& windowGeometry = KWindowInfo(windowId, NET::WMFrameExtents).frameGeometry(); QList screens = QGuiApplication::screens(); if (screens.size() > 1) { for (int i = 0; i < screens.size(); ++i) { QRect screenGeometry = screens[i]->geometry(); if (screenGeometry.intersects(windowGeometry)) { int targetScreen = i + (next ? 1 : -1); if (targetScreen < 0) targetScreen += screens.size(); else if (targetScreen >= screens.size()) targetScreen -= screens.size(); QRect targetScreenGeometry = screens[targetScreen]->geometry(); int X = windowGeometry.x() - screenGeometry.x() + targetScreenGeometry.x(); int Y = windowGeometry.y() - screenGeometry.y() + targetScreenGeometry.y(); NET::States state = KWindowInfo(windowId, NET::WMState).state(); // NW geometry | y/x | from panel const int flags = 1 | (0b011 << 8) | (0b010 << 12); KX11Extras::clearState(windowId, NET::MaxHoriz | NET::MaxVert | NET::Max | NET::FullScreen); NETRootInfo(m_xcbConnection, NET::Properties(), NET::WM2MoveResizeWindow).moveResizeWindowRequest(windowId, flags, X, Y, 0, 0); QTimer::singleShot(200, this, [this, windowId, state, raiseOnCurrentDesktop] { KX11Extras::setState(windowId, state); raiseWindow(windowId, raiseOnCurrentDesktop); }); break; } } } } int LXQtWMBackendX11::onAllWorkspacesEnum() const { return NET::OnAllDesktops; } bool LXQtWMBackendX11::isWindowOnScreen(QScreen *screen, WId windowId) const { //TODO: old code was: //return QApplication::desktop()->screenGeometry(parentTaskBar()).intersects(KWindowInfo(mWindow, NET::WMFrameExtents).frameGeometry()); if(!screen) return true; QRect r = KWindowInfo(windowId, NET::WMFrameExtents).frameGeometry(); return screen->geometry().intersects(r); } bool LXQtWMBackendX11::setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) { NETRootInfo mDesktops(m_xcbConnection, NET::NumberOfDesktops | NET::CurrentDesktop | NET::DesktopNames, NET::WM2DesktopLayout); if (orientation == Qt::Horizontal) { mDesktops.setDesktopLayout(NET::OrientationHorizontal, columns, rows, rightToLeft ? NET::DesktopLayoutCornerTopRight : NET::DesktopLayoutCornerTopLeft); } else { mDesktops.setDesktopLayout(NET::OrientationHorizontal, rows, columns, rightToLeft ? NET::DesktopLayoutCornerTopRight : NET::DesktopLayoutCornerTopLeft); } return true; } /************************************************ * X11 Specific ************************************************/ void LXQtWMBackendX11::moveApplication(WId windowId) { KWindowInfo info(windowId, NET::WMDesktop); if (!info.isOnCurrentDesktop()) KX11Extras::setCurrentDesktop(info.desktop()); if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) KX11Extras::unminimizeWindow(windowId); KX11Extras::forceActiveWindow(windowId); const QRect& g = KWindowInfo(windowId, NET::WMGeometry).geometry(); int X = g.center().x(); int Y = g.center().y(); QCursor::setPos(X, Y); NETRootInfo(m_xcbConnection, NET::WMMoveResize).moveResizeRequest(windowId, X, Y, NET::Move); } void LXQtWMBackendX11::resizeApplication(WId windowId) { KWindowInfo info(windowId, NET::WMDesktop); if (!info.isOnCurrentDesktop()) KX11Extras::setCurrentDesktop(info.desktop()); if (getWindowState(windowId) == LXQtTaskBarWindowState::Minimized) KX11Extras::unminimizeWindow(windowId); KX11Extras::forceActiveWindow(windowId); const QRect& g = KWindowInfo(windowId, NET::WMGeometry).geometry(); int X = g.bottomRight().x(); int Y = g.bottomRight().y(); QCursor::setPos(X, Y); NETRootInfo(m_xcbConnection, NET::WMMoveResize).moveResizeRequest(windowId, X, Y, NET::BottomRight); } void LXQtWMBackendX11::refreshIconGeometry(WId windowId, QRect const & geom) { // NOTE: This function announces where the task icon is, // such that X11 WMs can perform their related animations correctly. WId appRootWindow = XDefaultRootWindow(m_X11Display); NETWinInfo info(m_xcbConnection, windowId, appRootWindow, NET::WMIconGeometry, NET::Properties2()); NETRect const curr = info.iconGeometry(); // see kwindowsystem -> NETWinInfo::setIconGeometry for the scale factor const qreal scaleFactor = qApp->devicePixelRatio(); int xPos = geom.x() * scaleFactor; int yPos = geom.y() * scaleFactor; int w = geom.width() * scaleFactor; int h = geom.height() * scaleFactor; if (xPos == curr.pos.x && yPos == curr.pos.y && w == curr.size.width && h == curr.size.height) return; NETRect nrect; nrect.pos.x = geom.x(); nrect.pos.y = geom.y(); nrect.size.height = geom.height(); nrect.size.width = geom.width(); info.setIconGeometry(nrect); } bool LXQtWMBackendX11::isAreaOverlapped(const QRect &area) const { //TODO: reuse our m_windows cache? QFlags ignoreList; ignoreList |= NET::DesktopMask; ignoreList |= NET::DockMask; ignoreList |= NET::SplashMask; ignoreList |= NET::MenuMask; ignoreList |= NET::PopupMenuMask; ignoreList |= NET::DropdownMenuMask; ignoreList |= NET::TopMenuMask; ignoreList |= NET::NotificationMask; const auto wIds = KX11Extras::stackingOrder(); for (auto const wId : wIds) { KWindowInfo info(wId, NET::WMWindowType | NET::WMState | NET::WMFrameExtents | NET::WMDesktop); if (info.valid() // skip windows that are on other desktops && info.isOnCurrentDesktop() // skip shaded, minimized or hidden windows && !(info.state() & (NET::Shaded | NET::Hidden)) // check against the list of ignored types && !NET::typeMatchesMask(info.windowType(NET::AllTypesMask), ignoreList)) { if (info.frameGeometry().intersects(area)) return true; } } return false; } bool LXQtWMBackendX11::isShowingDesktop() const { return KWindowSystem::showingDesktop(); } bool LXQtWMBackendX11::showDesktop(bool value) { KWindowSystem::setShowingDesktop(value); return true; } int LXQtWMBackendX11Library::getBackendScore(const QString &key) const { Q_UNUSED(key) auto *x11Application = qGuiApp->nativeInterface(); if(!x11Application) return 0; // Generic X11 backend return 80; } ILXQtAbstractWMInterface *LXQtWMBackendX11Library::instance() const { return new LXQtWMBackendX11; } ================================================ FILE: panel/backends/xcb/lxqtwmbackend_x11.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_WM_BACKEND_X11_H #define LXQT_WM_BACKEND_X11_H #include "../ilxqtabstractwmiface.h" #include typedef struct _XDisplay Display; struct xcb_connection_t; class LXQtWMBackendX11 : public ILXQtAbstractWMInterface { Q_OBJECT public: explicit LXQtWMBackendX11(QObject *parent = nullptr); // Backend virtual bool supportsAction(WId windowId, LXQtTaskBarBackendAction action) const override; // Windows virtual bool reloadWindows() override; virtual QVector getCurrentWindows() const override; virtual QString getWindowTitle(WId windowId) const override; virtual bool applicationDemandsAttention(WId windowId) const override; virtual QIcon getApplicationIcon(WId windowId, int devicePixels) const override; virtual QString getWindowClass(WId windowId) const override; virtual LXQtTaskBarWindowLayer getWindowLayer(WId windowId) const override; virtual bool setWindowLayer(WId windowId, LXQtTaskBarWindowLayer layer) override; virtual LXQtTaskBarWindowState getWindowState(WId windowId) const override; virtual bool setWindowState(WId windowId, LXQtTaskBarWindowState state, bool set) override; virtual bool isWindowActive(WId windowId) const override; virtual bool raiseWindow(WId windowId, bool onCurrentWorkSpace) override; virtual bool closeWindow(WId windowId) override; virtual WId getActiveWindow() const override; // Workspaces virtual int getWorkspacesCount(QScreen *screen = nullptr) const override; virtual QString getWorkspaceName(int idx, QString screenName = QString()) const override; virtual int getCurrentWorkspace(QScreen *screen = nullptr) const override; virtual bool setCurrentWorkspace(int idx, QScreen *screen = nullptr) override; virtual int getWindowWorkspace(WId windowId) const override; virtual bool setWindowOnWorkspace(WId windowId, int idx) override; virtual void moveApplicationToPrevNextMonitor(WId windowId, bool next, bool raiseOnCurrentDesktop) override; virtual int onAllWorkspacesEnum() const override; virtual bool isWindowOnScreen(QScreen *screen, WId windowId) const override; virtual bool setDesktopLayout(Qt::Orientation orientation, int rows, int columns, bool rightToLeft) override; // X11 Specific virtual void moveApplication(WId windowId) override; virtual void resizeApplication(WId windowId) override; virtual void refreshIconGeometry(WId windowId, const QRect &geom) override; // Panel internal virtual bool isAreaOverlapped(const QRect& area) const override; // Show Destop virtual bool isShowingDesktop() const override; virtual bool showDesktop(bool value) override; private slots: void onWindowChanged(WId windowId, NET::Properties prop, NET::Properties2 prop2); void onWindowAdded(WId windowId); void onWindowRemoved(WId windowId); private: bool acceptWindow(WId windowId) const; void addWindow_internal(WId windowId); private: Display *m_X11Display; xcb_connection_t *m_xcbConnection; QVector m_windows; }; class LXQtWMBackendX11Library: public QObject, public ILXQtWMBackendLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/WMInterface/1.0") Q_INTERFACES(ILXQtWMBackendLibrary) public: int getBackendScore(const QString& key) const override; ILXQtAbstractWMInterface* instance() const override; }; #endif // LXQT_WM_BACKEND_X11_H ================================================ FILE: panel/config/addplugindialog.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "ui_addplugindialog.h" #include "addplugindialog.h" #include "plugin.h" #include "../lxqtpanelapplication.h" #include #include #include #include #include #include #include #define SEARCH_ROLE Qt::UserRole #define INDEX_ROLE SEARCH_ROLE+1 AddPluginDialog::AddPluginDialog(QWidget *parent): QDialog(parent), ui(new Ui::AddPluginDialog) { ui->setupUi(this); QStringList desktopFilesDirs; desktopFilesDirs << QString::fromLocal8Bit(qgetenv("LXQT_PANEL_PLUGINS_DIR")).split(QLatin1Char(':'), Qt::SkipEmptyParts); desktopFilesDirs << QStringLiteral("%1/%2").arg(XdgDirs::dataHome(), QStringLiteral("/lxqt/lxqt-panel")); desktopFilesDirs << QStringLiteral(PLUGIN_DESKTOPS_DIR); mPlugins = LXQt::PluginInfo::search(desktopFilesDirs, QLatin1String("LXQtPanel/Plugin"), QLatin1String("*")); std::sort(mPlugins.begin(), mPlugins.end(), [](const LXQt::PluginInfo &p1, const LXQt::PluginInfo &p2) { return p1.name() < p2.name() || (p1.name() == p2.name() && p1.comment() < p2.comment()); }); ui->pluginList->setItemDelegate(new LXQt::HtmlDelegate(QSize(32, 32), ui->pluginList)); ui->pluginList->setContextMenuPolicy(Qt::CustomContextMenu); filter(); // search mSearchTimer.setInterval(300); mSearchTimer.setSingleShot(true); connect(ui->searchEdit, &QLineEdit::textEdited, &mSearchTimer, static_cast(&QTimer::start)); connect(&mSearchTimer, &QTimer::timeout, this, &AddPluginDialog::filter); connect(ui->pluginList, &QListWidget::doubleClicked, this, &AddPluginDialog::emitPluginSelected); connect(ui->addButton, &QPushButton::clicked, this, &AddPluginDialog::emitPluginSelected); connect(dynamic_cast(qApp), &LXQtPanelApplication::pluginAdded , this, &AddPluginDialog::filter); connect(dynamic_cast(qApp), &LXQtPanelApplication::pluginRemoved , this, &AddPluginDialog::filter); } AddPluginDialog::~AddPluginDialog() { delete ui; } void AddPluginDialog::filter() { QListWidget* pluginList = ui->pluginList; const int curr_item = 0 < pluginList->count() ? pluginList->currentRow() : 0; pluginList->clear(); static QIcon fallIco = XdgIcon::fromTheme(QStringLiteral("preferences-plugin")); int pluginCount = mPlugins.length(); for (int i = 0; i < pluginCount; ++i) { const LXQt::PluginInfo &plugin = mPlugins.at(i); QString s = QStringLiteral("%1 %2 %3 %4 %5").arg(plugin.name(), plugin.comment(), plugin.value(QStringLiteral("Name")).toString(), plugin.value(QStringLiteral("Comment")).toString(), plugin.id()); if (!s.contains(ui->searchEdit->text(), Qt::CaseInsensitive)) continue; QListWidgetItem* item = new QListWidgetItem(ui->pluginList); // disable single-instances plugins already in use if (dynamic_cast(qApp)->isPluginSingletonAndRunning(plugin.id())) { item->setFlags(item->flags() & ~Qt::ItemIsEnabled); item->setBackground(palette().brush(QPalette::Disabled, QPalette::Text)); item->setText(QStringLiteral("%1 (%2)
%3
%4") .arg(plugin.name(), plugin.id(), plugin.comment(), tr("(only one instance can run at a time)"))); } else item->setText(QStringLiteral("%1 (%2)
%3").arg(plugin.name(), plugin.id(), plugin.comment())); item->setIcon(plugin.icon(fallIco)); item->setData(INDEX_ROLE, i); } if (pluginCount > 0) ui->pluginList->setCurrentRow(curr_item < pluginCount ? curr_item : pluginCount - 1); } void AddPluginDialog::emitPluginSelected() { QListWidget* pluginList = ui->pluginList; if (pluginList->currentItem() && pluginList->currentItem()->isSelected()) { LXQt::PluginInfo plugin = mPlugins.at(pluginList->currentItem()->data(INDEX_ROLE).toInt()); emit pluginSelected(plugin); } } ================================================ FILE: panel/config/addplugindialog.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * http://razor-qt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_ADDPLUGINDIALOG_H #define LXQT_ADDPLUGINDIALOG_H #include #include #include #define SEARCH_DELAY 125 namespace Ui { class AddPluginDialog; } class AddPluginDialog : public QDialog { Q_OBJECT public: AddPluginDialog(QWidget *parent = nullptr); ~AddPluginDialog(); signals: void pluginSelected(const LXQt::PluginInfo &plugin); private: Ui::AddPluginDialog *ui; LXQt::PluginInfoList mPlugins; QTimer mSearchTimer; private slots: void filter(); void emitPluginSelected(); }; #endif // LXQT_ADDPLUGINDIALOG_H ================================================ FILE: panel/config/addplugindialog.ui ================================================ AddPluginDialog 0 0 400 359 Add Plugins Search: true QAbstractScrollArea::AdjustToContents true true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QListView::Static QListView::TopToBottom QListView::Adjust 0 0 false true -1 false Qt::Horizontal 40 20 Add Widget true Close false pluginList addButton closeButton searchEdit closeButton clicked() AddPluginDialog close() ================================================ FILE: panel/config/configpaneldialog.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "configpaneldialog.h" ConfigPanelDialog::ConfigPanelDialog(LXQtPanel *panel, QWidget *parent): LXQt::ConfigDialog(tr("Configure Panel"), panel->settings(), parent), mPlacementPage(nullptr), mStylingPage(nullptr), mPluginsPage(nullptr) { setAttribute(Qt::WA_DeleteOnClose); mPlacementPage = new ConfigPlacement(panel, this); addPage(mPlacementPage, tr("Placement"), QLatin1String("configure-toolbars")); connect(this, &ConfigPanelDialog::reset, mPlacementPage, &ConfigPlacement::reset); mStylingPage = new ConfigStyling(panel, this); addPage(mStylingPage, tr("Styling"), QLatin1String("colormanagement")); connect(this, &ConfigPanelDialog::reset, mStylingPage, &ConfigStyling::reset); mPluginsPage = new ConfigPluginsWidget(panel, this); addPage(mPluginsPage, tr("Widgets"), QLatin1String("preferences-plugin")); connect(this, &ConfigPanelDialog::reset, mPluginsPage, &ConfigPluginsWidget::reset); connect(this, &ConfigPanelDialog::accepted, panel, [panel] { panel->saveSettings(); }); } void ConfigPanelDialog::showConfigPlacementPage() { showPage(mPlacementPage); } void ConfigPanelDialog::showConfigStylingPage() { showPage(mStylingPage); } void ConfigPanelDialog::showConfigPluginsPage() { showPage(mPluginsPage); } void ConfigPanelDialog::updateIconThemeSettings() { mStylingPage->updateIconThemeSettings(); } ================================================ FILE: panel/config/configpaneldialog.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CONFIGPANELDIALOG_H #define CONFIGPANELDIALOG_H #include "configplacement.h" #include "configstyling.h" #include "configpluginswidget.h" #include "../lxqtpanel.h" #include class ConfigPanelDialog : public LXQt::ConfigDialog { Q_OBJECT public: ConfigPanelDialog(LXQtPanel *panel, QWidget *parent = nullptr); void showConfigPlacementPage(); void showConfigStylingPage(); void showConfigPluginsPage(); void updateIconThemeSettings(); private: ConfigPlacement *mPlacementPage; ConfigStyling *mStylingPage; ConfigPluginsWidget *mPluginsPage; }; #endif // CONFIGPANELDIALOG_H ================================================ FILE: panel/config/configplacement.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "configplacement.h" #include "ui_configplacement.h" #include "../lxqtpanellimits.h" #include #include #include #include #include #include #include #include using namespace LXQt; struct ScreenPosition { int screen; ILXQtPanel::Position position; }; Q_DECLARE_METATYPE(ScreenPosition) ConfigPlacement::ConfigPlacement(LXQtPanel *panel, QWidget *parent) : QWidget(parent), ui(new Ui::ConfigPlacement), mPanel(panel) { ui->setupUi(this); fillComboBox_position(); fillComboBox_alignment(); mOldPanelSize = mPanel->panelSize(); mOldIconSize = mPanel->iconSize(); mOldLineCount = mPanel->lineCount(); mOldLength = mPanel->length(); mOldLengthInPercents = mPanel->lengthInPercents(); mOldAlignment = mPanel->alignment(); mOldScreenNum = mPanel->screenNum(); mScreenNum = mOldScreenNum; mOldPosition = mPanel->position(); mPosition = mOldPosition; mOldHidable = mPanel->hidable(); mOldVisibleMargin = mPanel->visibleMargin(); mOldHideOnOverlap = mPanel->hideOnOverlap(); mOldAnimation = mPanel->animationTime(); mOldShowDelay = mPanel->showDelay(); ui->spinBox_panelSize->setMinimum(PANEL_MINIMUM_SIZE); ui->spinBox_panelSize->setMaximum(PANEL_MAXIMUM_SIZE); mOldReserveSpace = mPanel->reserveSpace(); // reset configurations from file reset(); connect(ui->spinBox_panelSize, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->spinBox_iconSize, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->spinBox_lineCount, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->spinBox_length, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->comboBox_lengthType, &QComboBox::currentIndexChanged, this, &ConfigPlacement::widthTypeChanged); connect(ui->comboBox_alignment, &QComboBox::activated, this, &ConfigPlacement::editChanged); connect(ui->comboBox_position, &QComboBox::activated, this, &ConfigPlacement::positionChanged); connect(ui->groupBox_hidable, &QGroupBox::toggled, this, &ConfigPlacement::editChanged); connect(ui->checkBox_visibleMargin, &QCheckBox::toggled, this, &ConfigPlacement::editChanged); connect(ui->checkBox_overlap, &QAbstractButton::toggled, this, &ConfigPlacement::editChanged); connect(ui->spinBox_animation, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->spinBox_delay, &QSpinBox::valueChanged, this, &ConfigPlacement::editChanged); connect(ui->checkBox_reserveSpace, &QAbstractButton::toggled, this, [this](bool checked) { mPanel->setReserveSpace(checked, true); }); } /************************************************ * ************************************************/ void ConfigPlacement::reset() { ui->spinBox_panelSize->setValue(mOldPanelSize); ui->spinBox_iconSize->setValue(mOldIconSize); ui->spinBox_lineCount->setValue(mOldLineCount); ui->comboBox_position->setCurrentIndex(indexForPosition(mOldScreenNum, mOldPosition)); ui->groupBox_hidable->setChecked(mOldHidable); ui->checkBox_visibleMargin->setChecked(mOldVisibleMargin); ui->checkBox_overlap->setChecked(mOldHideOnOverlap); ui->spinBox_animation->setValue(mOldAnimation); ui->spinBox_delay->setValue(mOldShowDelay); fillComboBox_alignment(); ui->comboBox_alignment->setCurrentIndex(mOldAlignment + 1); ui->comboBox_lengthType->setCurrentIndex(mOldLengthInPercents ? 0 : 1); widthTypeChanged(); ui->spinBox_length->setValue(mOldLength); ui->checkBox_reserveSpace->setChecked(mOldReserveSpace); // update position positionChanged(); } /************************************************ * ************************************************/ void ConfigPlacement::fillComboBox_position() { int screenCount = QApplication::screens().size(); if (screenCount == 1) { addPosition(tr("Top of screen"), 0, LXQtPanel::PositionTop); addPosition(tr("Left of screen"), 0, LXQtPanel::PositionLeft); addPosition(tr("Right of screen"), 0, LXQtPanel::PositionRight); addPosition(tr("Bottom of screen"), 0, LXQtPanel::PositionBottom); } else { for (int screenNum = 0; screenNum < screenCount; screenNum++) { if (screenNum) ui->comboBox_position->insertSeparator(9999); addPosition(tr("Top of screen %1").arg(screenNum +1), screenNum, LXQtPanel::PositionTop); addPosition(tr("Left of screen %1").arg(screenNum +1), screenNum, LXQtPanel::PositionLeft); addPosition(tr("Right of screen %1").arg(screenNum +1), screenNum, LXQtPanel::PositionRight); addPosition(tr("Bottom of screen %1").arg(screenNum +1), screenNum, LXQtPanel::PositionBottom); } } } /************************************************ * ************************************************/ void ConfigPlacement::fillComboBox_alignment() { ui->comboBox_alignment->setItemData(0, QVariant(LXQtPanel::AlignmentLeft)); ui->comboBox_alignment->setItemData(1, QVariant(LXQtPanel::AlignmentCenter)); ui->comboBox_alignment->setItemData(2, QVariant(LXQtPanel::AlignmentRight)); if (mPosition == ILXQtPanel::PositionTop || mPosition == ILXQtPanel::PositionBottom) { ui->comboBox_alignment->setItemText(0, tr("Left")); ui->comboBox_alignment->setItemText(1, tr("Center")); ui->comboBox_alignment->setItemText(2, tr("Right")); } else { ui->comboBox_alignment->setItemText(0, tr("Top")); ui->comboBox_alignment->setItemText(1, tr("Center")); ui->comboBox_alignment->setItemText(2, tr("Bottom")); }; } /************************************************ * ************************************************/ void ConfigPlacement::addPosition(const QString& name, int screen, LXQtPanel::Position position) { if (LXQtPanel::canPlacedOn(screen, position)) ui->comboBox_position->addItem(name, QVariant::fromValue(ScreenPosition{screen, position})); } /************************************************ * ************************************************/ int ConfigPlacement::indexForPosition(int screen, ILXQtPanel::Position position) { for (int i = 0; i < ui->comboBox_position->count(); i++) { ScreenPosition sp = ui->comboBox_position->itemData(i).value(); if (screen == sp.screen && position == sp.position) return i; } return -1; } /************************************************ * ************************************************/ ConfigPlacement::~ConfigPlacement() { delete ui; } /************************************************ * ************************************************/ void ConfigPlacement::editChanged() { mPanel->setPanelSize(ui->spinBox_panelSize->value(), true); mPanel->setIconSize(ui->spinBox_iconSize->value(), true); mPanel->setLineCount(ui->spinBox_lineCount->value(), true); mPanel->setLength(ui->spinBox_length->value(), ui->comboBox_lengthType->currentIndex() == 0, true); LXQtPanel::Alignment align = LXQtPanel::Alignment( ui->comboBox_alignment->itemData( ui->comboBox_alignment->currentIndex() ).toInt()); mPanel->setAlignment(align, true); mPanel->setPosition(mScreenNum, mPosition, true); mPanel->setHidable(ui->groupBox_hidable->isChecked(), true); mPanel->setVisibleMargin(ui->checkBox_visibleMargin->isChecked(), true); mPanel->setHideOnOverlap(ui->checkBox_overlap->isChecked(), true); mPanel->setAnimationTime(ui->spinBox_animation->value(), true); mPanel->setShowDelay(ui->spinBox_delay->value(), true); } /************************************************ * ************************************************/ void ConfigPlacement::widthTypeChanged() { int max = getMaxLength(); if (ui->comboBox_lengthType->currentIndex() == 0) { // Percents ............................. int v = ui->spinBox_length->value() * 100.0 / max; ui->spinBox_length->setRange(1, 100); ui->spinBox_length->setValue(v); } else { // Pixels ............................... int v = max / 100.0 * ui->spinBox_length->value(); ui->spinBox_length->setRange(-max, max); ui->spinBox_length->setValue(v); } } /************************************************ * ************************************************/ int ConfigPlacement::getMaxLength() { auto screens = QApplication::screens(); if (screens.size() > mScreenNum) { if (mPosition == ILXQtPanel::PositionTop || mPosition == ILXQtPanel::PositionBottom) return screens.at(mScreenNum)->geometry().width(); else return screens.at(mScreenNum)->geometry().height(); } return 0; } /************************************************ * ************************************************/ void ConfigPlacement::positionChanged() { ScreenPosition sp = ui->comboBox_position->itemData( ui->comboBox_position->currentIndex()).value(); bool updateAlig = (sp.position == ILXQtPanel::PositionTop || sp.position == ILXQtPanel::PositionBottom) != (mPosition == ILXQtPanel::PositionTop || mPosition == ILXQtPanel::PositionBottom); int oldMax = getMaxLength(); mPosition = sp.position; mScreenNum = sp.screen; int newMax = getMaxLength(); if (ui->comboBox_lengthType->currentIndex() == 1 && oldMax != newMax) { // Pixels ............................... int v = ui->spinBox_length->value() * 1.0 * newMax / oldMax; ui->spinBox_length->setMaximum(newMax); ui->spinBox_length->setValue(v); } if (updateAlig) fillComboBox_alignment(); editChanged(); } ================================================ FILE: panel/config/configplacement.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CONFIGPLACEMENT_H #define CONFIGPLACEMENT_H #include "../lxqtpanel.h" #include #include #include class LXQtPanel; namespace Ui { class ConfigPlacement; } class ConfigPlacement : public QWidget { Q_OBJECT public: explicit ConfigPlacement(LXQtPanel *panel, QWidget *parent = nullptr); ~ConfigPlacement(); int screenNum() const { return mScreenNum; } ILXQtPanel::Position position() const { return mPosition; } signals: void changed(); public slots: void reset(); private slots: void editChanged(); void widthTypeChanged(); void positionChanged(); private: Ui::ConfigPlacement *ui; LXQtPanel *mPanel; int mScreenNum; ILXQtPanel::Position mPosition; void addPosition(const QString& name, int screen, LXQtPanel::Position position); void fillComboBox_position(); void fillComboBox_alignment(); int indexForPosition(int screen, ILXQtPanel::Position position); int getMaxLength(); // old values for reset int mOldPanelSize; int mOldIconSize; int mOldLineCount; int mOldLength; bool mOldLengthInPercents; LXQtPanel::Alignment mOldAlignment; ILXQtPanel::Position mOldPosition; bool mOldHidable; bool mOldVisibleMargin; bool mOldHideOnOverlap; int mOldAnimation; int mOldShowDelay; int mOldScreenNum; bool mOldReserveSpace; }; #endif ================================================ FILE: panel/config/configplacement.ui ================================================ ConfigPlacement 0 0 382 359 0 0 Configure Placement 0 0 0 1 0 0 Size false 0 0 0 0 <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> 1 100 Size: Length: % px px 24 Qt::Horizontal QSizePolicy::MinimumExpanding 5 20 0 0 0 0 px 10 128 Icon size: Rows: 1 20 0 0 Alignment && position Alignment: 1 Left Center Right Position: true A&uto-hide true false Zero means no animation Animation duration: Qt::Horizontal 102 5 Zero means no animation ms 500 50 Zero means no delay Show with delay: Zero means no delay ms 2000 50 Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Qt::Vertical 20 0 ================================================ FILE: panel/config/configpluginswidget.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "configpluginswidget.h" #include "ui_configpluginswidget.h" #include "addplugindialog.h" #include "panelpluginsmodel.h" #include "../plugin.h" #include "../ilxqtpanelplugin.h" #include #include #include ConfigPluginsWidget::ConfigPluginsWidget(LXQtPanel *panel, QWidget* parent) : QWidget(parent), ui(new Ui::ConfigPluginsWidget), mPanel(panel) { ui->setupUi(this); PanelPluginsModel * plugins = mPanel->mPlugins.get(); { std::unique_ptr m(ui->listView_plugins->selectionModel()); ui->listView_plugins->setModel(plugins); } { std::unique_ptr d(ui->listView_plugins->itemDelegate()); ui->listView_plugins->setItemDelegate(new LXQt::HtmlDelegate(QSize(16, 16), ui->listView_plugins)); } ui->listView_plugins->setSelectionMode(QAbstractItemView::SingleSelection); ui->listView_plugins->setDragEnabled(true); ui->listView_plugins->viewport()->setAcceptDrops(true); ui->listView_plugins->setDragDropMode(QAbstractItemView::InternalMove); ui->listView_plugins->setDropIndicatorShown(true); resetButtons(); connect(ui->listView_plugins->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ConfigPluginsWidget::resetButtons); connect(ui->pushButton_moveUp, &QToolButton::clicked, this, [this, plugins] { plugins->onMovePluginUp(ui->listView_plugins->currentIndex()); }); connect(ui->pushButton_moveDown, &QToolButton::clicked, this, [this, plugins] { plugins->onMovePluginDown(ui->listView_plugins->currentIndex()); }); connect(ui->pushButton_addPlugin, &QPushButton::clicked, this, &ConfigPluginsWidget::showAddPluginDialog); connect(ui->pushButton_removePlugin, &QToolButton::clicked, this, [this, plugins] { plugins->onRemovePlugin(ui->listView_plugins->currentIndex()); }); connect(ui->pushButton_pluginConfig, &QToolButton::clicked, this, [this, plugins] { plugins->onConfigurePlugin(ui->listView_plugins->currentIndex()); }); connect(ui->listView_plugins, &QAbstractItemView::doubleClicked, plugins, &PanelPluginsModel::onConfigurePlugin); connect(plugins, &PanelPluginsModel::pluginAdded, this, &ConfigPluginsWidget::resetButtons); connect(plugins, &PanelPluginsModel::pluginRemoved, this, &ConfigPluginsWidget::resetButtons); connect(plugins, &PanelPluginsModel::pluginMoved, this, &ConfigPluginsWidget::resetButtons); } ConfigPluginsWidget::~ConfigPluginsWidget() { delete ui; } void ConfigPluginsWidget::reset() { } void ConfigPluginsWidget::showAddPluginDialog() { if (!mAddPluginDialog) { mAddPluginDialog.reset(new AddPluginDialog); connect(mAddPluginDialog.get(), &AddPluginDialog::pluginSelected, this, [this](const LXQt::PluginInfo & desktopFile) { mPanel->mPlugins->addPlugin(mPanel, desktopFile); }); } mAddPluginDialog->show(); mAddPluginDialog->raise(); mAddPluginDialog->activateWindow(); } void ConfigPluginsWidget::resetButtons() { PanelPluginsModel *model = mPanel->mPlugins.get(); QItemSelectionModel *selectionModel = ui->listView_plugins->selectionModel(); bool hasSelection = selectionModel->hasSelection(); bool isFirstSelected = selectionModel->isSelected(model->index(0)); bool isLastSelected = selectionModel->isSelected(model->index(model->rowCount() - 1)); bool hasConfigDialog = false; if (hasSelection) { Plugin const * plugin = ui->listView_plugins->model()->data(selectionModel->currentIndex(), Qt::UserRole).value(); if (nullptr != plugin) hasConfigDialog = plugin->iPlugin()->flags().testFlag(ILXQtPanelPlugin::HaveConfigDialog); } ui->pushButton_removePlugin->setEnabled(hasSelection); ui->pushButton_moveUp->setEnabled(hasSelection && !isFirstSelected); ui->pushButton_moveDown->setEnabled(hasSelection && !isLastSelected); ui->pushButton_pluginConfig->setEnabled(hasSelection && hasConfigDialog); } ================================================ FILE: panel/config/configpluginswidget.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CONFIGPLUGINSWIDGET_H #define CONFIGPLUGINSWIDGET_H #include "../lxqtpanel.h" #include namespace Ui { class ConfigPluginsWidget; } class AddPluginDialog; class ConfigPluginsWidget : public QWidget { Q_OBJECT public: ConfigPluginsWidget(LXQtPanel *panel, QWidget* parent = nullptr); ~ConfigPluginsWidget(); signals: void changed(); public slots: void reset(); private slots: void showAddPluginDialog(); void resetButtons(); private: Ui::ConfigPluginsWidget *ui; std::unique_ptr mAddPluginDialog; LXQtPanel *mPanel; }; #endif ================================================ FILE: panel/config/configpluginswidget.ui ================================================ ConfigPluginsWidget 0 0 339 220 Configure Plugins 0 0 0 0 6 0 0 0 0 QAbstractScrollArea::AdjustToContents true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QListView::TopToBottom QListView::Adjust 0 false true Note: changes made in this page cannot be reset. true 0 0 0 0 Move up ... ../../../../../.designer/backup../../../../../.designer/backup Move down ... ../../../../../.designer/backup../../../../../.designer/backup Qt::Horizontal Add ... ../../../../../.designer/backup../../../../../.designer/backup Remove ... ../../../../../.designer/backup../../../../../.designer/backup Qt::Horizontal Configure ... ../../../../../.designer/backup../../../../../.designer/backup Qt::Vertical 20 40 ================================================ FILE: panel/config/configstyling.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "configstyling.h" #include "ui_configstyling.h" #include "../lxqtpanellimits.h" #include #include #include #include #include #include #include #include using namespace LXQt; ConfigStyling::ConfigStyling(LXQtPanel *panel, QWidget *parent) : QWidget(parent), ui(new Ui::ConfigStyling), mPanel(panel) { ui->setupUi(this); fillComboBox_icon(); mOldFontColor = mPanel->fontColor(); mFontColor = mOldFontColor; mOldBackgroundColor = mPanel->backgroundColor(); mBackgroundColor = mOldBackgroundColor; mOldBackgroundImage = mPanel->backgroundImage(); mOldOpacity = mPanel->opacity(); // reset configurations from file reset(); ui->slider_opacity->setToolTip(QString::number(mOldOpacity) + QStringLiteral("%")); connect(ui->checkBox_customFontColor, &QCheckBox::toggled, this, &ConfigStyling::editChanged); connect(ui->pushButton_customFontColor, &QPushButton::clicked, this, &ConfigStyling::pickFontColor); connect(ui->checkBox_customBgColor, &QCheckBox::toggled, this, &ConfigStyling::editChanged); connect(ui->pushButton_customBgColor, &QPushButton::clicked, this, &ConfigStyling::pickBackgroundColor); connect(ui->checkBox_customBgImage, &QCheckBox::toggled, this, &ConfigStyling::editChanged); connect(ui->lineEdit_customBgImage, &QLineEdit::textChanged, this, &ConfigStyling::editChanged); connect(ui->pushButton_customBgImage, &QPushButton::clicked, this, &ConfigStyling::pickBackgroundImage); connect(ui->slider_opacity, &QSlider::valueChanged, this, &ConfigStyling::editChanged); connect(ui->groupBox_icon, &QGroupBox::clicked, this, &ConfigStyling::editChanged); connect(ui->comboBox_icon, &QComboBox::activated, this, &ConfigStyling::editChanged); } /************************************************ * ************************************************/ void ConfigStyling::reset() { mFontColor = QColor::fromString(mOldFontColor.name()); ui->pushButton_customFontColor->setStyleSheet(QStringLiteral("background: %1").arg(mOldFontColor.name())); mBackgroundColor = QColor::fromString(mOldBackgroundColor.name()); ui->pushButton_customBgColor->setStyleSheet(QStringLiteral("background: %1").arg(mOldBackgroundColor.name())); ui->lineEdit_customBgImage->setText(mOldBackgroundImage); ui->slider_opacity->setValue(mOldOpacity); ui->checkBox_customFontColor->setChecked(mOldFontColor.isValid()); ui->checkBox_customBgColor->setChecked(mOldBackgroundColor.isValid()); ui->checkBox_customBgImage->setChecked(QFileInfo::exists(mOldBackgroundImage)); } /************************************************ * ************************************************/ void ConfigStyling::fillComboBox_icon() { ui->groupBox_icon->setChecked(!mPanel->iconTheme().isEmpty()); QStringList themeList; QStringList processed; const QStringList baseDirs = QIcon::themeSearchPaths(); for (const QString &baseDirName : baseDirs) { QDir baseDir(baseDirName); if (!baseDir.exists()) continue; const QFileInfoList dirs = baseDir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); for (const QFileInfo &dir : dirs) { if (!processed.contains(dir.canonicalFilePath())) { processed << dir.canonicalFilePath(); QDir Dir(dir.canonicalFilePath()); QSettings file(Dir.absoluteFilePath(QStringLiteral("index.theme")), QSettings::IniFormat); #if QT_VERSION >= QT_VERSION_CHECK(6, 11, 0) // Qt 6.11+ status check skipped #else if (file.status() != QSettings::NoError) continue; #endif if (!file.value(QStringLiteral("Icon Theme/Directories")).toStringList().join(QLatin1Char(' ')).isEmpty() && !file.value(QStringLiteral("Icon Theme/Hidden"), false).toBool()) { themeList << Dir.dirName(); } } } } if (!themeList.isEmpty()) { themeList.sort(); ui->comboBox_icon->insertItems(0, themeList); QString curTheme = QIcon::themeName(); if (!curTheme.isEmpty()) ui->comboBox_icon->setCurrentText(curTheme); } } /************************************************ * ************************************************/ void ConfigStyling::updateIconThemeSettings() { ui->groupBox_icon->setChecked(!mPanel->iconTheme().isEmpty()); QString curTheme = QIcon::themeName(); if (!curTheme.isEmpty()) ui->comboBox_icon->setCurrentText(curTheme); } /************************************************ * ************************************************/ ConfigStyling::~ConfigStyling() { delete ui; } /************************************************ * ************************************************/ void ConfigStyling::editChanged() { mPanel->setFontColor(ui->checkBox_customFontColor->isChecked() ? mFontColor : QColor(), true); if (ui->checkBox_customBgColor->isChecked()) { mPanel->setBackgroundColor(mBackgroundColor, true); mPanel->setOpacity(ui->slider_opacity->value(), true); } else { mPanel->setBackgroundColor(QColor(), true); mPanel->setOpacity(100, true); } QString image = ui->checkBox_customBgImage->isChecked() ? ui->lineEdit_customBgImage->text() : QString(); mPanel->setBackgroundImage(image, true); if (!ui->groupBox_icon->isChecked()) mPanel->setIconTheme(QString()); else if (!ui->comboBox_icon->currentText().isEmpty()) mPanel->setIconTheme(ui->comboBox_icon->currentText()); ui->slider_opacity->setToolTip(QString::number(ui->slider_opacity->value()) + QStringLiteral("%")); } /************************************************ * ************************************************/ void ConfigStyling::pickFontColor() { QColorDialog d(QColor(mFontColor.name()), this); d.setWindowTitle(tr("Pick color")); d.setWindowModality(Qt::WindowModal); if (d.exec() && d.currentColor().isValid()) { mFontColor = QColor::fromString(d.currentColor().name()); ui->pushButton_customFontColor->setStyleSheet(QStringLiteral("background: %1").arg(mFontColor.name())); editChanged(); } } /************************************************ * ************************************************/ void ConfigStyling::pickBackgroundColor() { QColorDialog d(QColor(mBackgroundColor.name()), this); d.setWindowTitle(tr("Pick color")); d.setWindowModality(Qt::WindowModal); if (d.exec() && d.currentColor().isValid()) { mBackgroundColor = QColor::fromString(d.currentColor().name()); ui->pushButton_customBgColor->setStyleSheet(QStringLiteral("background: %1").arg(mBackgroundColor.name())); editChanged(); } } /************************************************ * ************************************************/ void ConfigStyling::pickBackgroundImage() { QString picturesLocation; picturesLocation = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); QFileDialog* d = new QFileDialog(this, tr("Pick image"), picturesLocation, tr("Images (*.png *.gif *.jpg *.svg)")); d->setAttribute(Qt::WA_DeleteOnClose); d->setWindowModality(Qt::WindowModal); connect(d, &QFileDialog::fileSelected, ui->lineEdit_customBgImage, &QLineEdit::setText); d->show(); } ================================================ FILE: panel/config/configstyling.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Marat "Morion" Talipov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CONFIGSTYLING_H #define CONFIGSTYLING_H #include "../lxqtpanel.h" #include #include #include class LXQtPanel; namespace Ui { class ConfigStyling; } class ConfigStyling : public QWidget { Q_OBJECT public: explicit ConfigStyling(LXQtPanel *panel, QWidget *parent = nullptr); ~ConfigStyling(); void updateIconThemeSettings(); signals: void changed(); public slots: void reset(); private slots: void editChanged(); void pickFontColor(); void pickBackgroundColor(); void pickBackgroundImage(); private: Ui::ConfigStyling *ui; LXQtPanel *mPanel; void fillComboBox_icon(); // new values QColor mFontColor; QColor mBackgroundColor; // old values for reset QColor mOldFontColor; QColor mOldBackgroundColor; QString mOldBackgroundImage; int mOldOpacity; }; #endif ================================================ FILE: panel/config/configstyling.ui ================================================ ConfigStyling 0 0 382 225 0 0 Configure Styling 0 0 0 0 0 0 Custom styling 0 0 0 0 Font color: false ../../../../../.designer/backup../../../../../.designer/backup Qt::Horizontal QSizePolicy::MinimumExpanding 5 20 Background color: false ../../../../../.designer/backup../../../../../.designer/backup 6 6 false Background opacity: false 100 5 100 Qt::Horizontal false <small>Compositing is required for panel transparency.</small> Qt::AlignCenter 0 0 0 0 Background image: 0 0 0 0 false false ../../../../../.designer/backup../../../../../.designer/backup A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme true false Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Icon theme for panels: Qt::Vertical 20 0 checkBox_customBgColor toggled(bool) pushButton_customBgColor setEnabled(bool) checkBox_customBgImage toggled(bool) lineEdit_customBgImage setEnabled(bool) checkBox_customBgImage toggled(bool) pushButton_customBgImage setEnabled(bool) checkBox_customFontColor toggled(bool) pushButton_customFontColor setEnabled(bool) checkBox_customBgColor toggled(bool) slider_opacity setEnabled(bool) checkBox_customBgColor toggled(bool) label_2 setEnabled(bool) checkBox_customBgColor toggled(bool) compositingL setEnabled(bool) ================================================ FILE: panel/ilxqtpanel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . * * END_COMMON_COPYRIGHT_HEADER */ #ifndef ILXQTPANEL_H #define ILXQTPANEL_H #include #include "lxqtpanelglobals.h" class ILXQtPanelPlugin; class QWidget; /** **/ class LXQT_PANEL_API ILXQtPanel { public: /** * @brief Specifies the position of the panel on screen. */ enum Position{ PositionBottom, //!< The bottom side of the screen. PositionTop, //!< The top side of the screen. PositionLeft, //!< The left side of the screen. PositionRight //!< The right side of the screen. }; virtual ~ILXQtPanel() { } /** * @brief Returns the position of the panel. Possible values for the * return value are described by the Position enum. */ virtual Position position() const = 0; /** * @brief Returns the edge length of the icons that are shown on the panel * in pixels. The icons are square. */ virtual int iconSize() const = 0; /** * @brief Returns the number of lines/rows of this panel. */ virtual int lineCount() const = 0; /** * @brief Helper function for convenient direction/alignment checking. * @return True if the panel is on the top or the bottom of the * screen; otherwise returns false. */ bool isHorizontal() const { return position() == PositionBottom || position() == PositionTop; } /** * @brief Helper method that returns the global screen coordinates of the * panel, so you do not need to use QWidget::mapToGlobal() by yourself. * @return The QRect where the panel is located in global screen * coordinates. */ virtual QRect globalGeometry() const = 0; /** * @brief Helper method for calculating the global screen position of a * popup window with size windowSize. * @param absolutePos Contains the global screen coordinates where the * popup should be appear, i.e. the point where the user has clicked. * @param windowSize The size that the window will occupy. * @return The global screen position where the popup window can be shown. */ virtual QRect calculatePopupWindowPos(const QPoint &absolutePos, const QSize &windowSize) const = 0; /** * @brief Helper method for calculating the global screen position of a * popup window with size windowSize. The parameter plugin should be a * plugin * @param plugin Plugin that the popup window will belong to. The position * will be calculated according to the position of the plugin in the panel. * @param windowSize The size that the window will occupy. * @return The global screen position where the popup window can be shown. */ virtual QRect calculatePopupWindowPos(const ILXQtPanelPlugin *plugin, const QSize &windowSize) const = 0; /*! * \brief By calling this function, a plugin (or any other object) notifies the panel * about showing a (standalone) window/menu -> the panel needs this to avoid "hiding" in case any * standalone window is shown. The widget/window must be shown later than this notification call because * the panel needs to observe its show/hide/close events. * * \param w the window that will be shown * */ virtual void willShowWindow(QWidget * w) = 0; /*! * \brief By calling this function, a plugin notifies the panel about change of it's "static" * configuration * * \param plugin the changed plugin * * \sa ILXQtPanelPlugin::isSeparate(), ILXQtPanelPlugin::isExpandable */ virtual void pluginFlagsChanged(const ILXQtPanelPlugin * plugin) = 0; /*! * \brief Checks if the panel is locked. */ virtual bool isLocked() const = 0; /*! * \brief Gets the name of the Wayland screen of this panel. */ virtual QString screenName() const = 0; }; #endif // ILXQTPANEL_H ================================================ FILE: panel/ilxqtpanelplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . * * END_COMMON_COPYRIGHT_HEADER */ #ifndef ILXQTPANELPLUGIN_H #define ILXQTPANELPLUGIN_H #include #include "ilxqtpanel.h" #include "lxqtpanelglobals.h" /** LXQt panel plugins are standalone sharedlibraries (*.so) located in PLUGIN_DIR (define provided by CMakeLists.txt). Plugin for the panel is a library written in C++. One more necessary thing is a .desktop file describing this plugin. The same may be additional files, like translations. Themselves plugins will be installed to /usr/local/lib/lxqt-panel or /usr/lib/lxqt-panel (dependent on cmake option -DCMAKE_INSTALL_PREFIX). Desktop files are installed to /usr/local/share/lxqt/lxqt-panel, translations to /usr/local/share/lxqt/lxqt-panel/PLUGIN_NAME. **/ class QDialog; class PluginSettings; namespace LXQt { class PluginInfo; } struct LXQT_PANEL_API ILXQtPanelPluginStartupInfo { ILXQtPanel *lxqtPanel; PluginSettings *settings; const LXQt::PluginInfo *desktopFile; }; /** \brief Base abstract class for LXQt panel widgets/plugins. All plugins *must* be inherited from this one. This class provides some basic API and inherited/implemented plugins GUIs will be responsible on the functionality itself. **/ class LXQT_PANEL_API ILXQtPanelPlugin { public: /** This enum describes the properties of a plugin. **/ enum Flag { NoFlags = 0, ///< It does not have any properties set. PreferRightAlignment = 1, /**< The plugin prefers right alignment (for example the clock plugin); otherwise the plugin prefers left alignment (like main menu). This flag is used only at the first start, later positions of all plugins are saved in a config, and this saved information is used. */ HaveConfigDialog = 2, ///< The plugin have a configuration dialog. SingleInstance = 4, ///< The plugin allows only one instance to run. NeedsHandle = 8 ///< The plugin needs a handle for the context menu }; Q_DECLARE_FLAGS(Flags, Flag) /** This enum describes the reason the plugin was activated. **/ enum ActivationReason { Unknown = 0, ///< Unknown reason DoubleClick = 2, ///< The plugin entry was double clicked Trigger = 3, ///< The plugin was clicked MiddleClick = 4 ///< The plugin was clicked with the middle mouse button }; /** Constructs an ILXQtPanelPlugin object with the given startupInfo. You do not have to worry about the startupInfo parameters, ILXQtPanelPlugin processes the parameters itself. **/ ILXQtPanelPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): mSettings(startupInfo.settings), mPanel(startupInfo.lxqtPanel), mDesktopFile(startupInfo.desktopFile) {} /** Destroys the object. **/ virtual ~ILXQtPanelPlugin() {} /** Returns the plugin flags. The base class implementation returns a NoFlags. **/ virtual Flags flags() const { return NoFlags; } /** Returns the string that is used in the theme QSS file. If you return "WorldClock" string, theme author may write something like `#WorldClock { border: 1px solid red; }` to set a custom border for your plugin. **/ virtual QString themeId() const = 0; /** From the user's point of view, your plugin is some visual widget on the panel. This function returns a pointer to it. This method is called only once, so you are free to return the pointer on a class member, or create the widget on the fly. **/ virtual QWidget *widget() = 0; /** Returns the plugin settings dialog. Reimplement this function if your plugin has it. The panel does not take ownership of the dialog, it is probably a good idea to set Qt::WA_DeleteOnClose attribute for the dialog. The default implementation returns 0, no dialog; Note that the flags method has to return HaveConfigDialog flag. To save the settings you should use a ready-to-use ILXQtPanelPlugin::settings() object. **/ virtual QDialog *configureDialog() { return 0; } /** This function is called when values are changed in the plugin settings. Reimplement this function to your plugin corresponded the new settings. The default implementation do nothing. **/ virtual void settingsChanged() {} /** This function is called when the user activates the plugin. reason specifies the reason for activation. ILXQtPanelPlugin::ActivationReason enumerates the various reasons. The default implementation do nothing. **/ virtual void activated(ActivationReason /*reason*/) {} /** This function is called when the panel geometry or lines count are changed. The default implementation do nothing. **/ virtual void realign() {} /** Returns the panel object. **/ ILXQtPanel *panel() const { return mPanel; } PluginSettings *settings() const { return mSettings; } const LXQt::PluginInfo *desktopFile() const { return mDesktopFile; } /** Helper functions for calculating global screen position of some popup window with windowSize size. If you need to show some popup window, you can use it, to get global screen position for the new window. **/ virtual QRect calculatePopupWindowPos(const QSize &windowSize) { return mPanel->calculatePopupWindowPos(this, windowSize); } /*! * \brief By calling this function plugin notifies the panel about showing a (standalone) window/menu. * * \param w the shown window * */ inline void willShowWindow(QWidget * w) { mPanel->willShowWindow(w); } /*! * \brief By calling this function, a plugin notifies the panel about change of it's "static" * configuration * * \sa isSeparate(), isExpandable */ inline void pluginFlagsChanged() { mPanel->pluginFlagsChanged(this); } virtual bool isSeparate() const { return false; } virtual bool isExpandable() const { return false; } private: PluginSettings *mSettings; ILXQtPanel *mPanel; const LXQt::PluginInfo *mDesktopFile; }; Q_DECLARE_OPERATORS_FOR_FLAGS(ILXQtPanelPlugin::Flags) /** Every plugin must have the ILXQtPanelPluginLibrary loader. You should only reimplement the instance() method which should return your plugin. Example: @code class LXQtClockPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) { return new LXQtClock(startupInfo);} }; @endcode **/ class LXQT_PANEL_API ILXQtPanelPluginLibrary { public: /** Destroys the ILXQtPanelPluginLibrary object. **/ virtual ~ILXQtPanelPluginLibrary() {} /** Returns the root component object of the plugin. When the library is finally unloaded, the root component will automatically be deleted. **/ virtual ILXQtPanelPlugin* instance(const ILXQtPanelPluginStartupInfo &startupInfo) const = 0; }; Q_DECLARE_INTERFACE(ILXQtPanelPluginLibrary, "lxqt.org/Panel/PluginInterface/3.0") #endif // ILXQTPANELPLUGIN_H ================================================ FILE: panel/lxqtpanel.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtpanel.h" #include "lxqtpanellimits.h" #include "ilxqtpanelplugin.h" #include "lxqtpanelapplication.h" #include "lxqtpanellayout.h" #include "config/configpaneldialog.h" #include "popupmenu.h" #include "plugin.h" #include "panelpluginsmodel.h" #include "windownotifier.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "backends/ilxqtabstractwmiface.h" #include // Turn on this to show the time required to load each plugin during startup // #define DEBUG_PLUGIN_LOADTIME #ifdef DEBUG_PLUGIN_LOADTIME #include #endif // Config keys and groups #define CFG_KEY_SCREENNUM "desktop" #define CFG_KEY_POSITION "position" #define CFG_KEY_PANELSIZE "panelSize" #define CFG_KEY_ICONSIZE "iconSize" #define CFG_KEY_LINECNT "lineCount" #define CFG_KEY_LENGTH "width" #define CFG_KEY_PERCENT "width-percent" #define CFG_KEY_ALIGNMENT "alignment" #define CFG_KEY_FONTCOLOR "font-color" #define CFG_KEY_BACKGROUNDCOLOR "background-color" #define CFG_KEY_BACKGROUNDIMAGE "background-image" #define CFG_KEY_OPACITY "opacity" #define CFG_KEY_RESERVESPACE "reserve-space" #define CFG_KEY_PLUGINS "plugins" #define CFG_KEY_HIDABLE "hidable" #define CFG_KEY_VISIBLE_MARGIN "visible-margin" #define CFG_KEY_HIDE_ON_OVERLAP "hide-on-overlap" #define CFG_KEY_ANIMATION "animation-duration" #define CFG_KEY_SHOW_DELAY "show-delay" #define CFG_KEY_LOCKPANEL "lockPanel" /************************************************ Returns the Position by the string. String is one of "Top", "Left", "Bottom", "Right", string is not case sensitive. If the string is not correct, returns defaultValue. ************************************************/ ILXQtPanel::Position LXQtPanel::strToPosition(const QString& str, ILXQtPanel::Position defaultValue) { if (str.toUpper() == QLatin1String("TOP")) return LXQtPanel::PositionTop; if (str.toUpper() == QLatin1String("LEFT")) return LXQtPanel::PositionLeft; if (str.toUpper() == QLatin1String("RIGHT")) return LXQtPanel::PositionRight; if (str.toUpper() == QLatin1String("BOTTOM")) return LXQtPanel::PositionBottom; return defaultValue; } /************************************************ Return string representation of the position ************************************************/ QString LXQtPanel::positionToStr(ILXQtPanel::Position position) { switch (position) { case LXQtPanel::PositionTop: return QStringLiteral("Top"); case LXQtPanel::PositionLeft: return QStringLiteral("Left"); case LXQtPanel::PositionRight: return QStringLiteral("Right"); case LXQtPanel::PositionBottom: return QStringLiteral("Bottom"); } return QString(); } /************************************************ ************************************************/ LXQtPanel::LXQtPanel(const QString &configGroup, LXQt::Settings *settings, QWidget *parent) : QFrame(parent), mSettings(settings), mConfigGroup(configGroup), mPlugins{nullptr}, mStandaloneWindows{new WindowNotifier}, mPanelSize(0), mIconSize(0), mLineCount(0), mLength(0), mAlignment(AlignmentLeft), mPosition(ILXQtPanel::PositionBottom), mScreenNum(0), //whatever (avoid conditional on uninitialized value) mActualScreenNum(0), mWaylandScreenNum(-1), // not set yet (on Wayland) mHidable(false), mVisibleMargin(true), mHideOnOverlap(false), mHidden(false), mAnimationTime(0), mReserveSpace(true), mAnimation(nullptr), mWAnimation(nullptr), mLayerWindow(nullptr), mLockPanel(false) { //You can find information about the flags and widget attributes in your //Qt documentation or at https://doc.qt.io/qt-5/qt.html //Qt::FramelessWindowHint = Produces a borderless window. The user cannot //move or resize a borderless window via the window system. On X11, ... Qt::WindowFlags flags = Qt::FramelessWindowHint; // NOTE: by PCMan: // In Qt 4, the window is not activated if it has Qt::WA_X11NetWmWindowTypeDock. // Since Qt 5, the default behaviour is changed. A window is always activated on mouse click. // Please see the source code of Qt5: src/plugins/platforms/xcb/qxcbwindow.cpp. // void QXcbWindow::handleButtonPressEvent(const xcb_button_press_event_t *event) // This new behaviour caused lxqt bug #161 - Cannot minimize windows from panel 1 when two task managers are open // Besides, this breaks minimizing or restoring windows when clicking on the taskbar buttons. // To workaround this regression bug, we need to add this window flag here. // However, since the panel gets no keyboard focus, this may decrease accessibility since // it's not possible to use the panel with keyboards. We need to find a better solution later. flags |= Qt::WindowDoesNotAcceptFocus; setWindowFlags(flags); //Adds _NET_WM_WINDOW_TYPE_DOCK to the window's _NET_WM_WINDOW_TYPE X11 window property. See https://standards.freedesktop.org/wm-spec/ for more details. setAttribute(Qt::WA_X11NetWmWindowTypeDock); //Enables tooltips for inactive windows. setAttribute(Qt::WA_AlwaysShowToolTips); //Indicates that the widget should have a translucent background, i.e., any non-opaque regions of the widgets will be translucent because the widget will have an alpha channel. Setting this ... setAttribute(Qt::WA_TranslucentBackground); //Allows data from drag and drop operations to be dropped onto the widget (see QWidget::setAcceptDrops()). setAttribute(Qt::WA_AcceptDrops); setWindowTitle(QStringLiteral("LXQt Panel")); setObjectName(QStringLiteral("LXQtPanel %1").arg(configGroup)); //LXQtPanel (inherits QFrame) -> lav (QGridLayout) -> LXQtPanelWidget (QFrame) -> LXQtPanelLayout LXQtPanelWidget = new QFrame(this); LXQtPanelWidget->setObjectName(QStringLiteral("BackgroundWidget")); QGridLayout* lav = new QGridLayout(); lav->setContentsMargins(0, 0, 0, 0); setLayout(lav); this->layout()->addWidget(LXQtPanelWidget); mLayout = new LXQtPanelLayout(LXQtPanelWidget); connect(mLayout, &LXQtPanelLayout::pluginMoved, this, &LXQtPanel::pluginMoved); LXQtPanelWidget->setLayout(mLayout); mLayout->setLineCount(mLineCount); mDelaySave.setSingleShot(true); mDelaySave.setInterval(SETTINGS_SAVE_DELAY); connect(&mDelaySave, &QTimer::timeout, this, [this] { saveSettings(); } ); mHideTimer.setSingleShot(true); mHideTimer.setInterval(PANEL_HIDE_DELAY); connect(&mHideTimer, &QTimer::timeout, this, &LXQtPanel::hidePanelWork); mShowDelayTimer.setSingleShot(true); mShowDelayTimer.setInterval(PANEL_SHOW_DELAY); connect(&mShowDelayTimer, &QTimer::timeout, this, [this] { showPanel(mAnimationTime > 0); }); // screen updates connect(qApp, &QApplication::screenAdded, this, [this] (QScreen* newScreen) { connect(newScreen, &QScreen::virtualGeometryChanged, this, &LXQtPanel::ensureVisible); connect(newScreen, &QScreen::geometryChanged, this, &LXQtPanel::ensureVisible); ensureVisible(); }); connect(qApp, &QApplication::screenRemoved, this, [this] (QScreen* oldScreen) { disconnect(oldScreen, &QScreen::virtualGeometryChanged, this, &LXQtPanel::ensureVisible); disconnect(oldScreen, &QScreen::geometryChanged, this, &LXQtPanel::ensureVisible); if (QGuiApplication::platformName() != QStringLiteral("wayland")) { // wait until the screen is really removed because it may contain the panel QTimer::singleShot(0, this, &LXQtPanel::ensureVisible); } }); const auto screens = QApplication::screens(); for(const auto& screen : screens) { connect(screen, &QScreen::virtualGeometryChanged, this, &LXQtPanel::ensureVisible); connect(screen, &QScreen::geometryChanged, this, &LXQtPanel::ensureVisible); } connect(LXQt::Settings::globalSettings(), &LXQt::GlobalSettings::settingsChanged, this, [this] { update(); } ); connect(lxqtApp, &LXQt::Application::themeChanged, this, &LXQtPanel::realign); connect(mStandaloneWindows.get(), &WindowNotifier::firstShown, this, [this] { showPanel(true); }); connect(mStandaloneWindows.get(), &WindowNotifier::lastHidden, this, &LXQtPanel::hidePanel); readSettings(); ensureVisible(); loadPlugins(); if(qGuiApp->nativeInterface()) { // Create backing QWindow for LayerShellQt integration create(); if(!windowHandle()) { qWarning() << "LXQtPanel: could not create QWindow for LayerShellQt integration."; } else { // Init Layer Shell (Must be done before showing widget) mLayerWindow = LayerShellQt::Window::get(windowHandle()); mLayerWindow->setLayer(LayerShellQt::Window::LayerTop); mLayerWindow->setScope(QStringLiteral("dock")); LayerShellQt::Window::Anchors anchors; anchors.setFlag(LayerShellQt::Window::AnchorLeft); anchors.setFlag(LayerShellQt::Window::AnchorBottom); anchors.setFlag(LayerShellQt::Window::AnchorRight); mLayerWindow->setAnchors(anchors); #if (QT_VERSION >= QT_VERSION_CHECK(6,8,0)) // WARNING: Only the following desktops are known to give the focus to child popups // when the panel does not accept focus. const QRegularExpression desktops(QStringLiteral("(?i)(kde|kwin|labwc|wayfire|hyprland)")); if (desktops.match(qEnvironmentVariable("XDG_CURRENT_DESKTOP")).hasMatch()) mLayerWindow->setKeyboardInteractivity(LayerShellQt::Window::KeyboardInteractivityNone); else #endif mLayerWindow->setKeyboardInteractivity(LayerShellQt::Window::KeyboardInteractivityOnDemand); mLayerWindow->setCloseOnDismissed(false); mLayerWindow->setExclusiveEdge(LayerShellQt::Window::AnchorBottom); mLayerWindow->setExclusiveZone(height()); } } // NOTE: Some (X11) WMs may need the geometry to be set before QWidget::show(). setPanelGeometry(); show(); // show it the first time, despite setting if (mHidable) { showPanel(false); QTimer::singleShot(PANEL_HIDE_FIRST_TIME, this, SLOT(hidePanel())); } LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a->getWMBackend(); connect(wmBackend, &ILXQtAbstractWMInterface::windowAdded, this, [this] { if (mHidable && mHideOnOverlap && !mHidden) { mShowDelayTimer.stop(); hidePanel(); } }); connect(wmBackend, &ILXQtAbstractWMInterface::windowRemoved, this, [this] { if (mHidable && mHideOnOverlap && mHidden && !isPanelOverlapped()) mShowDelayTimer.start(); }); connect(wmBackend, &ILXQtAbstractWMInterface::currentWorkspaceChanged, this, [this] { if (mHidable && mHideOnOverlap) { if (!mHidden) { mShowDelayTimer.stop(); hidePanel(); } else if (!isPanelOverlapped()) mShowDelayTimer.start(); else mShowDelayTimer.stop(); // workspace may be changed and restored quickly } }); connect(wmBackend, &ILXQtAbstractWMInterface::windowPropertyChanged, this, [this] (WId /* id */, int prop) { if (mHidable && mHideOnOverlap // when a window is moved, resized, shaded, or minimized && (prop == int(LXQtTaskBarWindowProperty::Geometry) || prop == int(LXQtTaskBarWindowProperty::State) // on Wayland, workspace change is not seen as geometry change || (mLayerWindow && prop == int(LXQtTaskBarWindowProperty::Workspace)))) { if (!mHidden) { mShowDelayTimer.stop(); hidePanel(); } else if (!isPanelOverlapped()) mShowDelayTimer.start(); else mShowDelayTimer.stop(); // geometry or state may be changed and restored quickly } }); } /************************************************ ************************************************/ void LXQtPanel::readSettings() { // Read settings ...................................... mSettings->beginGroup(mConfigGroup); // Let Hidability be the first thing we read // so that every call to realign() is without side-effect mHidable = mSettings->value(QStringLiteral(CFG_KEY_HIDABLE), mHidable).toBool(); mHidden = mHidable; mVisibleMargin = mSettings->value(QStringLiteral(CFG_KEY_VISIBLE_MARGIN), mVisibleMargin).toBool(); mHideOnOverlap = mSettings->value(QStringLiteral(CFG_KEY_HIDE_ON_OVERLAP), mHideOnOverlap).toBool(); mAnimationTime = mSettings->value(QStringLiteral(CFG_KEY_ANIMATION), mAnimationTime).toInt(); mShowDelayTimer.setInterval(mSettings->value(QStringLiteral(CFG_KEY_SHOW_DELAY), mShowDelayTimer.interval()).toInt()); // By default we are using size & count from theme. setPanelSize(mSettings->value(QStringLiteral(CFG_KEY_PANELSIZE), PANEL_DEFAULT_SIZE).toInt(), false); setIconSize(mSettings->value(QStringLiteral(CFG_KEY_ICONSIZE), PANEL_DEFAULT_ICON_SIZE).toInt(), false); setLineCount(mSettings->value(QStringLiteral(CFG_KEY_LINECNT), PANEL_DEFAULT_LINE_COUNT).toInt(), false); setLength(mSettings->value(QStringLiteral(CFG_KEY_LENGTH), 100).toInt(), mSettings->value(QStringLiteral(CFG_KEY_PERCENT), true).toBool(), false); const auto screens = QApplication::screens(); mScreenNum = std::clamp(mSettings->value(QStringLiteral(CFG_KEY_SCREENNUM), 0).toInt(), 0, screens.size() - 1); if (QGuiApplication::platformName() == QStringLiteral("wayland")) { // On Wayland, first check the screen name, and if it does not exist, add it. mScreenName = mSettings->value(QStringLiteral(CFG_KEY_SCREENNAME)).toString(); mWaylandScreenNum = mScreenNum; if (mScreenName.isEmpty()) { mScreenName = screens.at(mWaylandScreenNum)->name(); QTimer::singleShot(0, this, [this] { saveSettings(true); }); // save the found name } else { for (int i = 0; i < screens.size(); ++i) { if (screens.at(i)->name() == mScreenName) { mWaylandScreenNum = i; break; } } } setPosition(mWaylandScreenNum, strToPosition(mSettings->value(QStringLiteral(CFG_KEY_POSITION)).toString(), PositionBottom), false); } else { setPosition(mScreenNum, strToPosition(mSettings->value(QStringLiteral(CFG_KEY_POSITION)).toString(), PositionBottom), false); } setAlignment(Alignment(mSettings->value(QStringLiteral(CFG_KEY_ALIGNMENT), mAlignment).toInt()), false); QColor color = mSettings->value(QStringLiteral(CFG_KEY_FONTCOLOR), QString()).value(); if (color.isValid()) setFontColor(color, false); setOpacity(mSettings->value(QStringLiteral(CFG_KEY_OPACITY), 100).toInt(), false); mReserveSpace = mSettings->value(QStringLiteral(CFG_KEY_RESERVESPACE), true).toBool(); color = mSettings->value(QStringLiteral(CFG_KEY_BACKGROUNDCOLOR), QString()).value(); if (color.isValid()) setBackgroundColor(color, false); QString image = mSettings->value(QStringLiteral(CFG_KEY_BACKGROUNDIMAGE), QString()).toString(); if (!image.isEmpty()) setBackgroundImage(image, false); mLockPanel = mSettings->value(QStringLiteral(CFG_KEY_LOCKPANEL), false).toBool(); mSettings->endGroup(); } /************************************************ ************************************************/ void LXQtPanel::saveSettings(bool later) { mDelaySave.stop(); if (later) { mDelaySave.start(); return; } mSettings->beginGroup(mConfigGroup); //Note: save/load of plugin names is completely handled by mPlugins object //mSettings->setValue(CFG_KEY_PLUGINS, mPlugins->pluginNames()); mSettings->setValue(QStringLiteral(CFG_KEY_PANELSIZE), mPanelSize); mSettings->setValue(QStringLiteral(CFG_KEY_ICONSIZE), mIconSize); mSettings->setValue(QStringLiteral(CFG_KEY_LINECNT), mLineCount); mSettings->setValue(QStringLiteral(CFG_KEY_LENGTH), mLength); mSettings->setValue(QStringLiteral(CFG_KEY_PERCENT), mLengthInPercents); mSettings->setValue(QStringLiteral(CFG_KEY_SCREENNUM), mScreenNum); if (mWaylandScreenNum >= 0) // on Wayland { if (mScreenName.isEmpty()) { const auto screens = QApplication::screens(); if (mWaylandScreenNum < screens.size()) mScreenName = screens.at(mWaylandScreenNum)->name(); } mSettings->setValue(QStringLiteral(CFG_KEY_SCREENNAME), mScreenName); } mSettings->setValue(QStringLiteral(CFG_KEY_POSITION), positionToStr(mPosition)); mSettings->setValue(QStringLiteral(CFG_KEY_ALIGNMENT), mAlignment); mSettings->setValue(QStringLiteral(CFG_KEY_FONTCOLOR), mFontColor.isValid() ? mFontColor : QColor()); mSettings->setValue(QStringLiteral(CFG_KEY_BACKGROUNDCOLOR), mBackgroundColor.isValid() ? mBackgroundColor : QColor()); mSettings->setValue(QStringLiteral(CFG_KEY_BACKGROUNDIMAGE), QFileInfo::exists(mBackgroundImage) ? mBackgroundImage : QString()); mSettings->setValue(QStringLiteral(CFG_KEY_OPACITY), mOpacity); mSettings->setValue(QStringLiteral(CFG_KEY_RESERVESPACE), mReserveSpace); mSettings->setValue(QStringLiteral(CFG_KEY_HIDABLE), mHidable); mSettings->setValue(QStringLiteral(CFG_KEY_VISIBLE_MARGIN), mVisibleMargin); mSettings->setValue(QStringLiteral(CFG_KEY_HIDE_ON_OVERLAP), mHideOnOverlap); mSettings->setValue(QStringLiteral(CFG_KEY_ANIMATION), mAnimationTime); mSettings->setValue(QStringLiteral(CFG_KEY_SHOW_DELAY), mShowDelayTimer.interval()); mSettings->setValue(QStringLiteral(CFG_KEY_LOCKPANEL), mLockPanel); mSettings->endGroup(); } /************************************************ ************************************************/ void LXQtPanel::ensureVisible() { if (!mScreenName.isEmpty() && QGuiApplication::platformName() == QStringLiteral("wayland")) { // Find the Wayland screen number based on the screen name. mWaylandScreenNum = -1; // first unset it const auto screens = QApplication::screens(); for (int i = 0; i < screens.size(); ++i) { if (screens.at(i)->name() == mScreenName) { mWaylandScreenNum = i; break; } } if (mWaylandScreenNum < 0) return; if (!canPlacedOn(mWaylandScreenNum, mPosition)) setPosition(findAvailableScreen(mPosition), mPosition, false); else mActualScreenNum = mWaylandScreenNum; } else { if (!canPlacedOn(mScreenNum, mPosition)) setPosition(findAvailableScreen(mPosition), mPosition, false); else mActualScreenNum = mScreenNum; } // the screen size might be changed realign(); } /************************************************ ************************************************/ LXQtPanel::~LXQtPanel() { mLayout->setEnabled(false); delete mAnimation; delete mWAnimation; delete mConfigDialog.data(); // do not save settings because of "user deleted panel" functionality saveSettings(); } /************************************************ ************************************************/ void LXQtPanel::show() { QWidget::show(); if(qGuiApp->nativeInterface()) //TODO: cache in bool isPlatformX11 KX11Extras::setOnDesktop(effectiveWinId(), NET::OnAllDesktops); } /************************************************ ************************************************/ QStringList pluginDesktopDirs() { QStringList dirs; dirs << QString::fromLocal8Bit(qgetenv("LXQT_PANEL_PLUGINS_DIR")).split(QLatin1Char(':'), Qt::SkipEmptyParts); dirs << QStringLiteral("%1/%2").arg(XdgDirs::dataHome(), QStringLiteral("/lxqt/lxqt-panel")); dirs << QStringLiteral(PLUGIN_DESKTOPS_DIR); return dirs; } /************************************************ ************************************************/ void LXQtPanel::loadPlugins() { QString names_key(mConfigGroup); names_key += QLatin1Char('/'); names_key += QLatin1String(CFG_KEY_PLUGINS); mPlugins.reset(new PanelPluginsModel(this, settings(), names_key, pluginDesktopDirs())); connect(mPlugins.get(), &PanelPluginsModel::pluginAdded, mLayout, &LXQtPanelLayout::addPlugin); connect(mPlugins.get(), &PanelPluginsModel::pluginMovedUp, mLayout, &LXQtPanelLayout::moveUpPlugin); //reemit signals connect(mPlugins.get(), &PanelPluginsModel::pluginAdded, this, &LXQtPanel::pluginAdded); connect(mPlugins.get(), &PanelPluginsModel::pluginRemoved, this, &LXQtPanel::pluginRemoved); const auto plugins = mPlugins->plugins(); for (auto const & plugin : plugins) { mLayout->addPlugin(plugin); connect(plugin, &Plugin::dragLeft, this, [this] { mShowDelayTimer.stop(); hidePanel(); }); } } /************************************************ ************************************************/ int LXQtPanel::getReserveDimension() { return mHidable ? PANEL_HIDE_SIZE : std::max(PANEL_MINIMUM_SIZE, mPanelSize); } QMargins LXQtPanel::layerWindowMargins() { QMargins margins; if (!mHidden) return margins; int offset = PANEL_HIDE_SIZE - std::max(PANEL_MINIMUM_SIZE, mPanelSize); // negative if (isHorizontal()) { if (mPosition == ILXQtPanel::PositionTop) margins = QMargins(0, offset, 0, 0); else margins = QMargins(0, 0, 0, offset); } else { if (mPosition == ILXQtPanel::PositionLeft) margins = QMargins(offset, 0, 0, 0); else margins = QMargins(0, 0, offset, 0); } return margins; } void LXQtPanel::setPanelGeometry(bool animate) { const auto screens = QApplication::screens(); if (mActualScreenNum >= screens.size()) return; const QRect currentScreen = screens.at(mActualScreenNum)->geometry(); QRect rect; LayerShellQt::Window::Anchors anchors; if (isHorizontal()) { // Horiz panel *************************** rect.setHeight(std::max(PANEL_MINIMUM_SIZE, mPanelSize)); if (mLengthInPercents) rect.setWidth(currentScreen.width() * mLength / 100.0); else { if (mLength <= 0) rect.setWidth(currentScreen.width() + mLength); else rect.setWidth(mLength); } rect.setWidth(std::max(rect.size().width(), mLayout->minimumSize().width())); // Horiz ...................... switch (mAlignment) { case LXQtPanel::AlignmentLeft: anchors.setFlag(LayerShellQt::Window::AnchorLeft); rect.moveLeft(currentScreen.left()); break; case LXQtPanel::AlignmentCenter: rect.moveCenter(currentScreen.center()); break; case LXQtPanel::AlignmentRight: anchors.setFlag(LayerShellQt::Window::AnchorRight); rect.moveRight(currentScreen.right()); break; } if(lengthInPercents() && mLength == 100) { //Fill all available width anchors.setFlag(LayerShellQt::Window::AnchorLeft); anchors.setFlag(LayerShellQt::Window::AnchorRight); } // Vert ....................... if (mPosition == ILXQtPanel::PositionTop) { anchors.setFlag(LayerShellQt::Window::AnchorTop); if (mHidden) rect.moveBottom(currentScreen.top() + PANEL_HIDE_SIZE - 1); else rect.moveTop(currentScreen.top()); } else { anchors.setFlag(LayerShellQt::Window::AnchorBottom); if (mHidden) rect.moveTop(currentScreen.bottom() - PANEL_HIDE_SIZE + 1); else rect.moveBottom(currentScreen.bottom()); } } else { // Vert panel *************************** rect.setWidth(std::max(PANEL_MINIMUM_SIZE, mPanelSize)); if (mLengthInPercents) rect.setHeight(currentScreen.height() * mLength / 100.0); else { if (mLength <= 0) rect.setHeight(currentScreen.height() + mLength); else rect.setHeight(mLength); } rect.setHeight(std::max(rect.size().height(), mLayout->minimumSize().height())); // Vert ....................... switch (mAlignment) { case LXQtPanel::AlignmentLeft: anchors.setFlag(LayerShellQt::Window::AnchorTop); rect.moveTop(currentScreen.top()); break; case LXQtPanel::AlignmentCenter: rect.moveCenter(currentScreen.center()); break; case LXQtPanel::AlignmentRight: anchors.setFlag(LayerShellQt::Window::AnchorBottom); rect.moveBottom(currentScreen.bottom()); break; } if(lengthInPercents() && mLength == 100) { //Fill all available width anchors.setFlag(LayerShellQt::Window::AnchorTop); anchors.setFlag(LayerShellQt::Window::AnchorBottom); } // Horiz ...................... if (mPosition == ILXQtPanel::PositionLeft) { anchors.setFlag(LayerShellQt::Window::AnchorLeft); if (mHidden) rect.moveRight(currentScreen.left() + PANEL_HIDE_SIZE - 1); else rect.moveLeft(currentScreen.left()); } else { anchors.setFlag(LayerShellQt::Window::AnchorRight); if (mHidden) rect.moveLeft(currentScreen.right() - PANEL_HIDE_SIZE + 1); else rect.moveRight(currentScreen.right()); } } if (!mHidden || !mGeometry.isValid()) mGeometry = rect; if (mLayerWindow) { // NOTE: On Wayland, QVariantAnimation is used to set appropriate negative margins. auto screen = screens.at(mActualScreenNum); if (screen != windowHandle()->screen()) { // WARNING: An already visible window is not shown on a new screen under Wayland. if (isVisible()) { hide(); QTimer::singleShot(0, this, &QWidget::show); } windowHandle()->setScreen(screen); } mLayerWindow->setAnchors(anchors); setFixedSize(rect.size()); if (animate) { if (mWAnimation == nullptr) { mWAnimation = new QVariantAnimation(this); mWAnimation->setEasingCurve(QEasingCurve::Linear); mWAnimation->setStartValue(static_cast(0)); mWAnimation->setEndValue(static_cast(1)); connect(mWAnimation, &QVariantAnimation::finished, this, [this] { if (mHidden) { setMargins(); // "setWindowOpacity()" does not work on Wayland if (!mVisibleMargin) LXQtPanelWidget->setVisible(false); } }); connect(mWAnimation, &QVariantAnimation::valueChanged, this, [this] (const QVariant &value) { QMargins margins = layerWindowMargins(); QMarginsF m((mWAnimation->endValue().toReal() - value.toReal()) * mLayerWindow->margins().toMarginsF() + value.toReal() * margins.toMarginsF()); mLayerWindow->setMargins(m.toMargins()); windowHandle()->requestUpdate(); }); } mWAnimation->setDuration(mAnimationTime); if (!mHidden) { setMargins(); if (!mVisibleMargin) LXQtPanelWidget->setVisible(true); } mWAnimation->start(); } else { if (!mVisibleMargin) LXQtPanelWidget->setVisible(!mHidden); setMargins(); mLayerWindow->setMargins(layerWindowMargins()); windowHandle()->requestUpdate(); } } else if (rect != geometry()) { setFixedSize(rect.size()); if (animate) { if (mAnimation == nullptr) { mAnimation = new QPropertyAnimation(this, "geometry"); mAnimation->setEasingCurve(QEasingCurve::Linear); //Note: for hiding, the margins are set after animation is finished connect(mAnimation, &QAbstractAnimation::finished, this, [this] { if (mHidden) setMargins(); }); } mAnimation->setDuration(mAnimationTime); mAnimation->setStartValue(geometry()); mAnimation->setEndValue(rect); //Note: for showing-up, the margins are removed instantly if (!mHidden) setMargins(); mAnimation->start(); } else { setMargins(); setGeometry(rect); } } } void LXQtPanel::setMargins() { if (mHidden) { if (isHorizontal()) { if (mPosition == ILXQtPanel::PositionTop) mLayout->setContentsMargins(0, 0, 0, PANEL_HIDE_SIZE); else mLayout->setContentsMargins(0, PANEL_HIDE_SIZE, 0, 0); } else { if (mPosition == ILXQtPanel::PositionLeft) mLayout->setContentsMargins(0, 0, PANEL_HIDE_SIZE, 0); else mLayout->setContentsMargins(PANEL_HIDE_SIZE, 0, 0, 0); } if (!mVisibleMargin) setWindowOpacity(0.0); } else { mLayout->setContentsMargins(0, 0, 0, 0); if (!mVisibleMargin) setWindowOpacity(1.0); } } void LXQtPanel::realign() { if (!isVisible()) return; #if 0 qDebug() << "** Realign *********************"; qDebug() << "PanelSize: " << mPanelSize; qDebug() << "IconSize: " << mIconSize; qDebug() << "LineCount: " << mLineCount; qDebug() << "Length: " << mLength << (mLengthInPercents ? "%" : "px"); qDebug() << "Alignment: " << (mAlignment == 0 ? "center" : (mAlignment < 0 ? "left" : "right")); qDebug() << "Position: " << positionToStr(mPosition) << "on" << mScreenNum; qDebug() << "Plugins count: " << mPlugins.count(); #endif setPanelGeometry(); // Reserve our space on the screen .......... // It's possible that our geometry is not changed, but screen resolution is changed, // so resetting WM_STRUT is still needed. To make it simple, we always do it. updateWmStrut(); } // Update the _NET_WM_PARTIAL_STRUT and _NET_WM_STRUT properties for the window void LXQtPanel::updateWmStrut() { WId wid = effectiveWinId(); if(wid == 0 || !isVisible()) return; if(qGuiApp->nativeInterface()) { if (mReserveSpace && QApplication::primaryScreen()) { const QRect wholeScreen = QApplication::primaryScreen()->virtualGeometry(); const QRect rect = geometry(); // NOTE: https://standards.freedesktop.org/wm-spec/wm-spec-latest.html // Quote from the EWMH spec: " Note that the strut is relative to the screen edge, and not the edge of the xinerama monitor." // So, we use the geometry of the whole screen to calculate the strut rather than using the geometry of individual monitors. // Though the spec only mention Xinerama and did not mention XRandR, the rule should still be applied. // At least openbox is implemented like this. switch (mPosition) { case LXQtPanel::PositionTop: KX11Extras::setExtendedStrut(wid, /* Left */ 0, 0, 0, /* Right */ 0, 0, 0, /* Top */ rect.top() + getReserveDimension(), rect.left(), rect.right(), /* Bottom */ 0, 0, 0 ); break; case LXQtPanel::PositionBottom: KX11Extras::setExtendedStrut(wid, /* Left */ 0, 0, 0, /* Right */ 0, 0, 0, /* Top */ 0, 0, 0, /* Bottom */ wholeScreen.bottom() - rect.bottom() + getReserveDimension(), rect.left(), rect.right() ); break; case LXQtPanel::PositionLeft: KX11Extras::setExtendedStrut(wid, /* Left */ rect.left() + getReserveDimension(), rect.top(), rect.bottom(), /* Right */ 0, 0, 0, /* Top */ 0, 0, 0, /* Bottom */ 0, 0, 0 ); break; case LXQtPanel::PositionRight: KX11Extras::setExtendedStrut(wid, /* Left */ 0, 0, 0, /* Right */ wholeScreen.right() - rect.right() + getReserveDimension(), rect.top(), rect.bottom(), /* Top */ 0, 0, 0, /* Bottom */ 0, 0, 0 ); break; } } else { KX11Extras::setExtendedStrut(wid, /* Left */ 0, 0, 0, /* Right */ 0, 0, 0, /* Top */ 0, 0, 0, /* Bottom */ 0, 0, 0 ); } } else if(mLayerWindow && qGuiApp->nativeInterface()) { if (mReserveSpace // NOTE: For some reason, no space is reserved with a negative layer margin. // However, there is no reason to reserve space for a hiding panel on Wayland. && !mHidable) { LayerShellQt::Window::Anchor edge = LayerShellQt::Window::AnchorBottom; switch (mPosition) { case LXQtPanel::PositionTop: edge = LayerShellQt::Window::AnchorTop; break; case LXQtPanel::PositionBottom: edge = LayerShellQt::Window::AnchorBottom; break; case LXQtPanel::PositionLeft: edge = LayerShellQt::Window::AnchorLeft; break; case LXQtPanel::PositionRight: edge = LayerShellQt::Window::AnchorRight; break; } mLayerWindow->setExclusiveEdge(edge); mLayerWindow->setExclusiveZone(getReserveDimension()); } else { mLayerWindow->setExclusiveEdge(LayerShellQt::Window::AnchorNone); mLayerWindow->setExclusiveZone(0); } // Make LayerShellQt apply changes immediatly windowHandle()->requestUpdate(); } } /************************************************ This function checks if the panel can be placed on the display @screenNum at @position. NOTE: The panel can be placed only at screen edges but no part of it should be between two screens. ************************************************/ bool LXQtPanel::canPlacedOn(int screenNum, LXQtPanel::Position position) { const auto screens = QApplication::screens(); if (screens.size() > screenNum) { const QRect screenGeometry = screens.at(screenNum)->geometry(); switch (position) { case LXQtPanel::PositionTop: for (const auto& screen : screens) { if (screen->geometry().top() < screenGeometry.top()) { QRect r = screenGeometry.adjusted(0, screen->geometry().top() - screenGeometry.top(), 0, 0); if (screen->geometry().intersects(r)) return false; } } return true; case LXQtPanel::PositionBottom: for (const auto& screen : screens) { if (screen->geometry().bottom() > screenGeometry.bottom()) { QRect r = screenGeometry.adjusted(0, 0, 0, screen->geometry().bottom() - screenGeometry.bottom()); if (screen->geometry().intersects(r)) return false; } } return true; case LXQtPanel::PositionLeft: for (const auto& screen : screens) { if (screen->geometry().left() < screenGeometry.left()) { QRect r = screenGeometry.adjusted(screen->geometry().left() - screenGeometry.left(), 0, 0, 0); if (screen->geometry().intersects(r)) return false; } } return true; case LXQtPanel::PositionRight: for (const auto& screen : screens) { if (screen->geometry().right() > screenGeometry.right()) { QRect r = screenGeometry.adjusted(0, 0, screen->geometry().right() - screenGeometry.right(), 0); if (screen->geometry().intersects(r)) return false; } } return true; } } return false; } /************************************************ ************************************************/ int LXQtPanel::findAvailableScreen(LXQtPanel::Position position) { int current = (mWaylandScreenNum >= 0 ? mWaylandScreenNum // on Wayland : mScreenNum); for (int i = current; i < QApplication::screens().size(); ++i) if (canPlacedOn(i, position)) return i; for (int i = 0; i < current; ++i) if (canPlacedOn(i, position)) return i; return 0; } /************************************************ ************************************************/ void LXQtPanel::showConfigDialog() { if (mConfigDialog.isNull()) mConfigDialog = new ConfigPanelDialog(this, nullptr /*make it top level window*/); mConfigDialog->showConfigPlacementPage(); mStandaloneWindows->observeWindow(mConfigDialog.data()); mConfigDialog->show(); mConfigDialog->raise(); mConfigDialog->activateWindow(); WId wid = mConfigDialog->windowHandle()->winId(); KX11Extras::activateWindow(wid); KX11Extras::setOnDesktop(wid, KX11Extras::currentDesktop()); } /************************************************ ************************************************/ void LXQtPanel::showAddPluginDialog() { if (mConfigDialog.isNull()) mConfigDialog = new ConfigPanelDialog(this, nullptr /*make it top level window*/); mConfigDialog->showConfigPluginsPage(); mStandaloneWindows->observeWindow(mConfigDialog.data()); mConfigDialog->show(); mConfigDialog->raise(); mConfigDialog->activateWindow(); WId wid = mConfigDialog->windowHandle()->winId(); KX11Extras::activateWindow(wid); KX11Extras::setOnDesktop(wid, KX11Extras::currentDesktop()); } /************************************************ ************************************************/ void LXQtPanel::updateStyleSheet() { // NOTE: This is a workaround for Qt >= 5.13, which might not completely // update the style sheet (especially positioned backgrounds of plugins // with NeedsHandle="true") if it is not reset first. setStyleSheet(QString()); QStringList sheet; sheet << QStringLiteral("Plugin > QAbstractButton, LXQtTray { qproperty-iconSize: %1px %1px; }").arg(mIconSize); sheet << QStringLiteral("Plugin > * > QAbstractButton, TrayIcon { qproperty-iconSize: %1px %1px; }").arg(mIconSize); if (mFontColor.isValid()) sheet << QString(QStringLiteral("Plugin * { color: ") + mFontColor.name() + QStringLiteral("; }")); if (mBackgroundColor.isValid()) { QString color = QStringLiteral("%1, %2, %3, %4") .arg(mBackgroundColor.red()) .arg(mBackgroundColor.green()) .arg(mBackgroundColor.blue()) .arg((float) mOpacity / 100); sheet << QString(QStringLiteral("LXQtPanel #BackgroundWidget { background-color: rgba(") + color + QStringLiteral("); }")); } if (QFileInfo::exists(mBackgroundImage)) sheet << QString(QStringLiteral("LXQtPanel #BackgroundWidget { background-image: url('") + mBackgroundImage + QStringLiteral("');}")); setStyleSheet(sheet.join(QStringLiteral("\n"))); } /************************************************ ************************************************/ void LXQtPanel::setPanelSize(int value, bool save) { if (mPanelSize != value) { mPanelSize = value; realign(); if (save) saveSettings(true); } } /************************************************ ************************************************/ void LXQtPanel::setIconSize(int value, bool save) { if (mIconSize != value) { mIconSize = value; updateStyleSheet(); mLayout->setLineSize(mIconSize); if (save) saveSettings(true); realign(); } } /************************************************ ************************************************/ void LXQtPanel::setLineCount(int value, bool save) { if (mLineCount != value) { mLineCount = value; mLayout->setEnabled(false); mLayout->setLineCount(mLineCount); mLayout->setEnabled(true); if (save) saveSettings(true); realign(); } } /************************************************ ************************************************/ void LXQtPanel::setLength(int length, bool inPercents, bool save) { if (mLength == length && mLengthInPercents == inPercents) return; mLength = length; mLengthInPercents = inPercents; if (save) saveSettings(true); realign(); } /************************************************ ************************************************/ void LXQtPanel::setPosition(int screen, ILXQtPanel::Position position, bool save) { if ((mWaylandScreenNum >= 0 ? mWaylandScreenNum // on Wayland : mScreenNum) == screen && mPosition == position) return; mActualScreenNum = screen; mPosition = position; mLayout->setPosition(mPosition); if (save) { if (mWaylandScreenNum >= 0) { mWaylandScreenNum = screen; mScreenName = qApp->screens().at(screen)->name(); } else mScreenNum = screen; saveSettings(true); } // Qt 5 adds a new class QScreen and add API for setting the screen of a QWindow. // so we had better use it. However, without this, our program should still work // as long as XRandR is used. Since XRandR combined all screens into a large virtual desktop // every screen and their virtual siblings are actually on the same virtual desktop. // So things still work if we don't set the screen correctly, but this is not the case // for other backends, such as the upcoming wayland support. Hence it's better to set it. if(windowHandle()) { // QScreen* newScreen = qApp->screens().at(screen); // QScreen* oldScreen = windowHandle()->screen(); // const bool shouldRecreate = windowHandle()->handle() && !(oldScreen && oldScreen->virtualSiblings().contains(newScreen)); // Q_ASSERT(shouldRecreate == false); // NOTE: When you move a window to another screen, Qt 5 might recreate the window as needed // But luckily, this never happen in XRandR, so Qt bug #40681 is not triggered here. // (The only exception is when the old screen is destroyed, Qt always re-create the window and // this corner case triggers #40681.) // When using other kind of multihead settings, such as Xinerama, this might be different and // unless Qt developers can fix their bug, we have no way to workaround that. if (mLayerWindow) { // WARNING: An already visible window is not shown on a new screen under Wayland. if (isVisible()) { hide(); QTimer::singleShot(0, this, &QWidget::show); } } windowHandle()->setScreen(qApp->screens().at(screen)); } realign(); } /************************************************ * ************************************************/ void LXQtPanel::setAlignment(Alignment value, bool save) { if (mAlignment == value) return; mAlignment = value; if (save) saveSettings(true); realign(); } /************************************************ * ************************************************/ void LXQtPanel::setFontColor(QColor color, bool save) { mFontColor = color; updateStyleSheet(); if (save) saveSettings(true); } /************************************************ ************************************************/ void LXQtPanel::setBackgroundColor(QColor color, bool save) { mBackgroundColor = color; updateStyleSheet(); if (save) saveSettings(true); } /************************************************ ************************************************/ void LXQtPanel::setBackgroundImage(QString path, bool save) { mBackgroundImage = path; updateStyleSheet(); if (save) saveSettings(true); } /************************************************ * ************************************************/ void LXQtPanel::setOpacity(int opacity, bool save) { mOpacity = std::clamp(opacity, 0, 100); updateStyleSheet(); if (save) saveSettings(true); } /************************************************ * ************************************************/ void LXQtPanel::setReserveSpace(bool reserveSpace, bool save) { if (mReserveSpace == reserveSpace) return; mReserveSpace = reserveSpace; if (save) saveSettings(true); updateWmStrut(); } /************************************************ ************************************************/ QRect LXQtPanel::globalGeometry() const { // panel is the the top-most widget/window, no calculation needed return geometry(); } /************************************************ ************************************************/ bool LXQtPanel::event(QEvent *event) { switch (event->type()) { case QEvent::ContextMenu: showPopupMenu(static_cast(event)->globalPos()); break; case QEvent::LayoutRequest: emit realigned(); break; case QEvent::WinIdChange: { if(qGuiApp->nativeInterface()) { // qDebug() << "WinIdChange" << hex << effectiveWinId(); if(effectiveWinId() == 0) break; // Sometimes Qt needs to re-create the underlying window of the widget and // the winId() may be changed at runtime. So we need to reset all X11 properties // when this happens. qDebug() << "WinIdChange" << Qt::hex << effectiveWinId() << "handle" << windowHandle() << windowHandle()->screen(); // Qt::WA_X11NetWmWindowTypeDock becomes ineffective in Qt 5 // See QTBUG-39887: https://bugreports.qt-project.org/browse/QTBUG-39887 // Let's use KWindowSystem for that KX11Extras::setType(effectiveWinId(), NET::Dock); updateWmStrut(); // reserve screen space for the panel KX11Extras::setOnAllDesktops(effectiveWinId(), true); } break; } case QEvent::DragEnter: dynamic_cast(event)->setDropAction(Qt::IgnoreAction); event->accept(); #if __cplusplus >= 201703L [[fallthrough]]; #endif // fall through case QEvent::Enter: mShowDelayTimer.start(); break; case QEvent::Leave: case QEvent::DragLeave: mShowDelayTimer.stop(); hidePanel(); break; #if (QT_VERSION >= QT_VERSION_CHECK(6,8,0)) case QEvent::Paint: // NOTE: Starting from Qt 6.8.0, random artifacts are possible in // translucent windows under Wayland. This a workaround. if (QGuiApplication::platformName() == QStringLiteral("wayland")) { QPainter p(this); p.setClipRegion(static_cast(event)->region()); auto origMode = p.compositionMode(); p.setCompositionMode(QPainter::CompositionMode_Clear); p.fillRect(rect(), Qt::transparent); p.setCompositionMode(origMode); } break; #endif default: break; } return QFrame::event(event); } /************************************************ ************************************************/ void LXQtPanel::showEvent(QShowEvent *event) { QFrame::showEvent(event); realign(); } /************************************************ ************************************************/ void LXQtPanel::showPopupMenu(const QPoint& cursorPos, Plugin *plugin) { PopupMenu * menu = new PopupMenu(tr("Panel"), this); menu->setAttribute(Qt::WA_DeleteOnClose); menu->setIcon(XdgIcon::fromTheme(QStringLiteral("configure-toolbars"))); // Plugin Menu .............................. if (plugin) { QMenu *m = plugin->popupMenu(); if (m) { menu->addTitle(plugin->windowTitle()); const auto actions = m->actions(); for (auto const & action : actions) { action->setParent(menu); action->setDisabled(mLockPanel); menu->addAction(action); } delete m; } } // Panel menu ............................... menu->addTitle(QIcon(), tr("Panel")); menu->addAction(XdgIcon::fromTheme(QLatin1String("configure")), tr("Configure Panel"), this, &LXQtPanel::showConfigDialog )->setDisabled(mLockPanel); menu->addAction(XdgIcon::fromTheme(QStringLiteral("preferences-plugin")), tr("Manage Widgets"), this, &LXQtPanel::showAddPluginDialog )->setDisabled(mLockPanel); LXQtPanelApplication *a = reinterpret_cast(qApp); menu->addAction(XdgIcon::fromTheme(QLatin1String("list-add")), tr("Add New Panel"), a, &LXQtPanelApplication::addNewPanel ); if (a->count() > 1) { menu->addAction(XdgIcon::fromTheme(QLatin1String("list-remove")), tr("Remove Panel", "Menu Item"), this, &LXQtPanel::userRequestForDeletion )->setDisabled(mLockPanel); } QAction * act_lock = menu->addAction(tr("Lock This Panel")); act_lock->setCheckable(true); act_lock->setChecked(mLockPanel); connect(act_lock, &QAction::triggered, this, [this] { mLockPanel = !mLockPanel; saveSettings(false); }); #ifdef DEBUG menu->addSeparator(); menu->addAction("Exit (debug only)", qApp, &QApplication::quit); #endif /* Note: in multihead & multipanel setup the QMenu::popup/exec places the window * sometimes wrongly (it seems that this bug is somehow connected to misinterpretation * of QDesktopWidget::availableGeometry) */ menu->setGeometry(calculatePopupWindowPos(cursorPos, menu->sizeHint())); willShowWindow(menu); menu->show(); } Plugin* LXQtPanel::findPlugin(const ILXQtPanelPlugin* iPlugin) const { const auto plugins = mPlugins->plugins(); for (auto const & plug : plugins) if (plug->iPlugin() == iPlugin) return plug; return nullptr; } /************************************************ ************************************************/ QRect LXQtPanel::calculatePopupWindowPos(QPoint const & absolutePos, QSize const & windowSize) const { // Using of anchors makes coordinates be absolute under some Wayland compositors. // Therefore, to cover both X11 and Wayland, we first use the local coordinates // and then map them to the global coordinates. QPoint localPos = mapFromGlobal(absolutePos); int x = localPos.x(), y = localPos.y(); switch (position()) { case ILXQtPanel::PositionTop: y = mGeometry.height(); break; case ILXQtPanel::PositionBottom: y = -windowSize.height(); break; case ILXQtPanel::PositionLeft: x = mGeometry.width(); break; case ILXQtPanel::PositionRight: x = -windowSize.width(); break; } QRect res(mapToGlobal(QPoint(x, y)), windowSize); if (qGuiApp->nativeInterface()) return res; QRect panelScreen; const auto screens = QApplication::screens(); if (mActualScreenNum < screens.size()) panelScreen = screens.at(mActualScreenNum)->geometry(); // NOTE: We cannot use AvailableGeometry() which returns the work area here because when in a // multihead setup with different resolutions. In this case, the size of the work area is limited // by the smallest monitor and may be much smaller than the current screen and we will place the // menu at the wrong place. This is very bad for UX. So let's use the full size of the screen. if (res.right() > panelScreen.right()) res.moveRight(panelScreen.right()); if (res.bottom() > panelScreen.bottom()) res.moveBottom(panelScreen.bottom()); if (res.left() < panelScreen.left()) res.moveLeft(panelScreen.left()); if (res.top() < panelScreen.top()) res.moveTop(panelScreen.top()); return res; } /************************************************ ************************************************/ QRect LXQtPanel::calculatePopupWindowPos(const ILXQtPanelPlugin *plugin, const QSize &windowSize) const { Plugin *panel_plugin = findPlugin(plugin); if (nullptr == panel_plugin) { qWarning() << Q_FUNC_INFO << "Wrong logic? Unable to find Plugin* for" << plugin << "known plugins follow..."; const auto plugins = mPlugins->plugins(); for (auto const & plug : plugins) qWarning() << plug->iPlugin() << plug; return QRect(); } // Note: assuming there are not contentMargins around the "BackgroundWidget" (LXQtPanelWidget) return calculatePopupWindowPos(mapToGlobal(panel_plugin->geometry().topLeft()), windowSize); } /************************************************ ************************************************/ void LXQtPanel::willShowWindow(QWidget * w) { mStandaloneWindows->observeWindow(w); } /************************************************ ************************************************/ void LXQtPanel::pluginFlagsChanged(const ILXQtPanelPlugin * /*plugin*/) { mLayout->rebuild(); } /************************************************ ************************************************/ QString LXQtPanel::qssPosition() const { return positionToStr(position()); } /************************************************ ************************************************/ void LXQtPanel::pluginMoved(Plugin * plug) { //get new position of the moved plugin bool found{false}; QString plug_is_before; for (int i=0; icount(); ++i) { Plugin *plugin = qobject_cast(mLayout->itemAt(i)->widget()); if (plugin) { if (found) { //we found our plugin in previous cycle -> is before this (or empty as last) plug_is_before = plugin->settingsGroup(); break; } else found = (plug == plugin); } } mPlugins->movePlugin(plug, plug_is_before); } /************************************************ ************************************************/ void LXQtPanel::userRequestForDeletion() { const QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Remove Panel", "Dialog Title") , tr("Removing a panel can not be undone.\nDo you want to remove this panel?"), QMessageBox::Yes | QMessageBox::No); if (ret != QMessageBox::Yes) { return; } mSettings->beginGroup(mConfigGroup); const QStringList plugins = mSettings->value(QStringLiteral("plugins")).toStringList(); mSettings->endGroup(); for(const QString& i : plugins) if (!i.isEmpty()) mSettings->remove(i); mSettings->remove(mConfigGroup); emit deletedByUser(this); } bool LXQtPanel::isPanelOverlapped() const { LXQtPanelApplication *a = reinterpret_cast(qApp); //TODO: calculate geometry on wayland QRect area = mGeometry; return a->getWMBackend()->isAreaOverlapped(area); } void LXQtPanel::showPanel(bool animate) { if (mHidable) { mHideTimer.stop(); if (mHidden) { mHidden = false; setPanelGeometry(mAnimationTime > 0 && animate); } } } void LXQtPanel::hidePanel() { if (mHidable && !mHidden && !mStandaloneWindows->isAnyWindowShown()) { mHideTimer.start(); } } void LXQtPanel::hidePanelWork() { if (!testAttribute(Qt::WA_UnderMouse)) { if (!mStandaloneWindows->isAnyWindowShown()) { if (!mHideOnOverlap || isPanelOverlapped()) { mHidden = true; setPanelGeometry(mAnimationTime > 0); } } else { mHideTimer.start(); } } } void LXQtPanel::setHidable(bool hidable, bool save) { if (mHidable == hidable) return; mHidable = hidable; if (save) saveSettings(true); realign(); } void LXQtPanel::setVisibleMargin(bool visibleMargin, bool save) { if (mVisibleMargin == visibleMargin) return; mVisibleMargin = visibleMargin; if (save) saveSettings(true); realign(); } void LXQtPanel::setHideOnOverlap(bool hideOnOverlap, bool save) { if (mHideOnOverlap == hideOnOverlap) return; mHideOnOverlap = hideOnOverlap; if (save) saveSettings(true); realign(); } void LXQtPanel::setAnimationTime(int animationTime, bool save) { if (mAnimationTime == animationTime) return; mAnimationTime = animationTime; if (save) saveSettings(true); } void LXQtPanel::setShowDelay(int showDelay, bool save) { if (mShowDelayTimer.interval() == showDelay) return; mShowDelayTimer.setInterval(showDelay); if (save) saveSettings(true); } QString LXQtPanel::iconTheme() const { return mSettings->value(QStringLiteral("iconTheme")).toString(); } void LXQtPanel::setIconTheme(const QString& iconTheme) { LXQtPanelApplication *a = reinterpret_cast(qApp); a->setIconTheme(iconTheme); } void LXQtPanel::updateConfigDialog() const { if (!mConfigDialog.isNull() && mConfigDialog->isVisible()) { mConfigDialog->updateIconThemeSettings(); const QList widgets = mConfigDialog->findChildren(); for (QWidget *widget : widgets) widget->update(); } } bool LXQtPanel::isPluginSingletonAndRunning(QString const & pluginId) const { Plugin const * plugin = mPlugins->pluginByID(pluginId); if (nullptr == plugin) return false; else return plugin->iPlugin()->flags().testFlag(ILXQtPanelPlugin::SingleInstance); } ================================================ FILE: panel/lxqtpanel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANEL_H #define LXQTPANEL_H #include #include #include #include #include #include #include "ilxqtpanel.h" #include "lxqtpanelglobals.h" #define CFG_KEY_SCREENNAME "screen-name" // also used by LXQtPanelApplication (on Wayland) class QMenu; class Plugin; class QAbstractItemModel; namespace LayerShellQt { class Window; } namespace LXQt { class Settings; class PluginInfo; } class LXQtPanelLayout; class ConfigPanelDialog; class PanelPluginsModel; class WindowNotifier; /*! \brief The LXQtPanel class provides a single lxqt-panel. All LXQtPanel * instances should be created and handled by LXQtPanelApplication. In turn, * all Plugins should be created and handled by LXQtPanels. * * LXQtPanel is just the panel, it does not incorporate any functionality. * Each function of the panel is implemented by Plugins, even the mainmenu * (plugin-mainmenu) and the taskbar (plugin-taskbar). So the LXQtPanel is * just the container for several Plugins while the different Plugins * incorporate the functions of the panel. Without the Plugins, the panel * is quite useless because it is just a box occupying space on the screen. * * LXQtPanel itself is a window (QFrame/QWidget) and this class is mainly * responsible for handling the size and position of this window on the * screen(s) as well as the different settings. The handling of the plugins * is outsourced in PanelPluginsModel and LXQtPanelLayout. PanelPluginsModel * is responsible for loading/creating and handling the plugins. * LXQtPanelLayout is inherited from QLayout and set as layout to the * background of LXQtPanel, so LXQtPanelLayout is responsible for the * layout of all the Plugins. * * \sa LXQtPanelApplication, Plugin, PanelPluginsModel, LXQtPanelLayout. */ class LXQT_PANEL_API LXQtPanel : public QFrame, public ILXQtPanel { Q_OBJECT Q_PROPERTY(QString position READ qssPosition) // for configuration dialog friend class ConfigPanelWidget; friend class ConfigPluginsWidget; friend class ConfigPanelDialog; friend class PanelPluginsModel; public: /** * @brief Stores how the panel should be aligned. Obviously, this applies * only if the panel does not occupy 100 % of the available space. If the * panel is vertical, AlignmentLeft means align to the top border of the * screen, AlignmentRight means align to the bottom. */ enum Alignment { AlignmentLeft = -1, //!< Align the panel to the left or top AlignmentCenter = 0, //!< Center the panel AlignmentRight = 1 //!< Align the panel to the right or bottom }; /** * @brief Creates and initializes the LXQtPanel. Performs the following * steps: * 1. Sets Qt window title, flags, attributes. * 2. Creates the panel layout. * 3. Prepares the timers. * 4. Connects signals and slots. * 5. Reads the settings for this panel. * 6. Optionally moves the panel to a valid screen (position-dependent). * 7. Loads the Plugins. * 8. Shows the panel, even if it is hidable (but then, starts the timer). * @param configGroup The name of the panel which is used as identifier * in the config file. * @param settings The settings instance of this lxqt panel application. * @param parent Parent QWidget, can be omitted. */ LXQtPanel(const QString &configGroup, LXQt::Settings *settings, QWidget *parent = nullptr); virtual ~LXQtPanel(); /** * @brief Returns the name of this panel which is also used as identifier * in the config file. */ QString name() { return mConfigGroup; } /** * @brief Reads all the necessary settings from mSettings and stores them * in local variables. Additionally, calls necessary methods like realign() * or updateStyleSheet() which need to get called after changing settings. */ void readSettings(); /** * @brief Creates and shows the popup menu (right click menu). If a plugin * is given as parameter, the menu will be divided in two groups: * plugin-specific options and panel-related options. As these two are * shown together, this menu has to be created by LXQtPanel. * @param cursorPos The global cursor pos * @param plugin The plugin whose menu options will be included in the * context menu. */ void showPopupMenu(const QPoint &cursorPos, Plugin *plugin = nullptr); // ILXQtPanel overrides ........ ILXQtPanel::Position position() const override { return mPosition; } QRect globalGeometry() const override; QRect calculatePopupWindowPos(QPoint const & absolutePos, QSize const & windowSize) const override; QRect calculatePopupWindowPos(const ILXQtPanelPlugin *plugin, const QSize &windowSize) const override; void willShowWindow(QWidget * w) override; void pluginFlagsChanged(const ILXQtPanelPlugin * plugin) override; bool isLocked() const override { return mLockPanel; } QString screenName() const override { return mScreenName; } // ........ end of ILXQtPanel overrides /** * @brief Searches for a Plugin in the Plugins-list of this panel. Takes * an ILXQtPanelPlugin as parameter and returns the corresponding Plugin. * @param iPlugin ILXQtPanelPlugin that we are looking for. * @return The corresponding Plugin if it is loaded in this panel, nullptr * otherwise. */ Plugin *findPlugin(const ILXQtPanelPlugin *iPlugin) const; // For QSS properties .................. /** * @brief Returns the position as string * * \sa positionToStr(). */ QString qssPosition() const; /** * @brief Checks if this LXQtPanel can be placed at a given position * on the screen with the given screenNum. The condition for doing so * is that the panel is not located between two screens. * * For example, if position is PositionRight, there should be no screen to * the right of the given screen. That means that there should be no * screen whose left border has a higher x-coordinate than the x-coordinate * of the right border of the given screen. This method iterates over all * screens and checks these conditions. * @param screenNum screen index as it is used by QDesktopWidget methods * @param position position where the panel should be placed * @return true if this panel can be placed at the given position on the * given screen. * * \sa findAvailableScreen(), mScreenNum, mActualScreenNum. */ static bool canPlacedOn(int screenNum, LXQtPanel::Position position); /** * @brief Returns a string representation of the given position. This * string is human-readable and can be used in config files. * @param position position that should be converted to a string. * @return the string representation of the given position, i.e. * "Top", "Left", "Right" or "Bottom". * * \sa strToPosition() */ static QString positionToStr(ILXQtPanel::Position position); /** * @brief Returns an ILXQtPanel::Position from the given string. This can * be used to retrieve ILXQtPanel::Position values from the config files. * @param str string that should be converted to ILXQtPanel::Position * @param defaultValue value that will be returned if the string can not * be converted to an ILXQtPanel::Position. * @return ILXQtPanel::Position that was determined from str or * defaultValue if str could not be converted. * * \sa positionToStr() */ static ILXQtPanel::Position strToPosition(const QString &str, ILXQtPanel::Position defaultValue); // Settings int iconSize() const override { return mIconSize; } //!< Implement ILXQtPanel::iconSize(). int lineCount() const override { return mLineCount; } //!< Implement ILXQtPanel::lineCount(). int panelSize() const { return mPanelSize; } int length() const { return mLength; } bool lengthInPercents() const { return mLengthInPercents; } LXQtPanel::Alignment alignment() const { return mAlignment; } int screenNum() const { return (mWaylandScreenNum >= 0 ? mWaylandScreenNum : mScreenNum); } QColor fontColor() const { return mFontColor; } QColor backgroundColor() const { return mBackgroundColor; } QString backgroundImage() const { return mBackgroundImage; } int opacity() const { return mOpacity; } int reserveSpace() const { return mReserveSpace; } bool hidable() const { return mHidable; } bool visibleMargin() const { return mVisibleMargin; } bool hideOnOverlap() const { return mHideOnOverlap; } int animationTime() const { return mAnimationTime; } int showDelay() const { return mShowDelayTimer.interval(); } QString iconTheme() const; /*! * \brief Checks if a given Plugin is running and has the * ILXQtPanelPlugin::SingleInstance flag set. * \param pluginId Plugin Identifier which is the basename of the * .desktop file that specifies the plugin. * \return true if the Plugin is running and has the * ILXQtPanelPlugin::SingleInstance flag set, false otherwise. */ bool isPluginSingletonAndRunning(QString const & pluginId) const; /*! * \brief Updates the config dialog. Used for updating its icons * when the panel-specific icon theme changes. */ void updateConfigDialog() const; public slots: /** * @brief Shows the QWidget and makes it visible on all desktops. This * method is NOT related to showPanel(), hidePanel() and hidePanelWork() * which handle the LXQt hiding by resizing the panel. */ void show(); /** * @brief Shows the panel (immediately) after it had been hidden before. * Stops the QTimer mHideTimer. This it NOT the same as QWidget::show() * because hiding the panel in LXQt is done by making it very thin. So * this method in fact restores the original size of the panel. * \param animate flag for the panel show-up animation disabling (\sa mAnimationTime). * * \sa mHidable, mHidden, mHideTimer, hidePanel(), hidePanelWork() */ void showPanel(bool animate); /** * @brief Hides the panel (delayed) by starting the QTimer mHideTimer. * When this timer times out, hidePanelWork() will be called. So this * method is called when the cursor leaves the panel area but the panel * will be hidden later. * * \sa mHidable, mHidden, mHideTimer, showPanel(), hidePanelWork() */ void hidePanel(); /** * @brief Actually hides the panel. Will be invoked when the QTimer * mHideTimer times out. That timer will be started by showPanel(). This * is NOT the same as QWidget::hide() because hiding the panel in LXQt is * done by making the panel very thin. So this method in fact makes the * panel very thin while the QWidget stays visible. * * \sa mHidable, mHidden, mHideTimer, showPanel(), hidePanel() */ void hidePanelWork(); // Settings /** * @brief All the setter methods are designed similar: * 1. Check if the given value is different from the current value. If not, * do not do anything and return. * 2. Set the value. * 3. If parameter save is true, call saveSettings(true) to store the * new settings on the disk. * 4. If necessary, propagate the new value to child objects, e.g. to * mLayout. * 5. If necessary, call update methods like realign() or * updateStyleSheet(). * @param value The value that should be set. * @param save If true, saveSettings(true) will be called. */ void setPanelSize(int value, bool save); void setIconSize(int value, bool save); //!< \sa setPanelSize() void setLineCount(int value, bool save); //!< \sa setPanelSize() void setLength(int length, bool inPercents, bool save); //!< \sa setPanelSize() void setPosition(int screen, ILXQtPanel::Position position, bool save); //!< \sa setPanelSize() void setAlignment(LXQtPanel::Alignment value, bool save); //!< \sa setPanelSize() void setFontColor(QColor color, bool save); //!< \sa setPanelSize() void setBackgroundColor(QColor color, bool save); //!< \sa setPanelSize() void setBackgroundImage(QString path, bool save); //!< \sa setPanelSize() void setOpacity(int opacity, bool save); //!< \sa setPanelSize() void setReserveSpace(bool reserveSpace, bool save); //!< \sa setPanelSize() void setHidable(bool hidable, bool save); //!< \sa setPanelSize() void setVisibleMargin(bool visibleMargin, bool save); //!< \sa setPanelSize() void setHideOnOverlap(bool hideOnOverlap, bool save); void setAnimationTime(int animationTime, bool save); //!< \sa setPanelSize() void setShowDelay(int showDelay, bool save); //!< \sa setPanelSize() void setIconTheme(const QString& iconTheme); /** * @brief Saves the current configuration, i.e. writes the current * configuration variables to mSettings. * @param later Determines if the settings are written immediately or * after a short delay. If later==true, the QTimer mDelaySave is started. * As soon as this timer times out, saveSettings(false) will be called. If * later==false, settings will be written. */ void saveSettings(bool later=false); /** * @brief Checks if the panel can be placed on the current screen at the * current position. If it can not, it will be moved on another screen * where the desired position is possible. */ void ensureVisible(); signals: /** * @brief This signal gets emitted whenever this panel receives a * QEvent::LayoutRequest, i.e. "Widget layout needs to be redone.". * The PanelPluginsModel will connect this signal to the individual * plugins so they can realign, too. */ void realigned(); /** * @brief This signal gets emitted at the end of * userRequestForDeletion() which in turn gets called when the user * decides to remove a panel. This signal is used by * LXQtPanelApplication to get notified whenever an LXQtPanel should * be removed. * @param self This LXQtPanel. LXQtPanelApplication will use this * parameter to identify the LXQtPanel that should be removed. */ void deletedByUser(LXQtPanel *self); /** * @brief This signal is just a relay signal. The pluginAdded signal * of the PanelPluginsModel (mPlugins) will be connected to this * signal. Thereby, we can make this signal of a private member * available as a public signal. * Currently, this signal is used by LXQtPanelApplication which * will further re-emit this signal. */ void pluginAdded(); /** * @brief This signal is just a relay signal. The pluginRemoved signal * of the PanelPluginsModel (mPlugins) will be connected to this * signal. Thereby, we can make this signal of a private member * available as a public signal. * Currently, this signal is used by LXQtPanelApplication which * will further re-emit this signal. */ void pluginRemoved(); protected: /** * @brief Overrides QObject::event(QEvent * e). Some functions of * the panel will be triggered by these events, e.g. showing/hiding * the panel or showing the context menu. * @param event The event that was received. * @return "QObject::event(QEvent *e) should return true if the event e * was recognized and processed." This is done by passing the event to * QFrame::event(QEvent *e) at the end. */ bool event(QEvent *event) override; /** * @brief Overrides QWidget::showEvent(QShowEvent * event). This * method is called when a widget (in this case: the LXQtPanel) is * shown. The call could happen before and after the widget is shown. * This method is just overridden to get notified when the LXQtPanel * will be shown. Then, LXQtPanel will call realign(). * @param event The QShowEvent sent by Qt. */ void showEvent(QShowEvent *event) override; public slots: /** * @brief Shows the ConfigPanelDialog and shows the "Config Panel" * page, i.e. calls showConfigPanelPage(). If the dialog does not * exist yet, it will be created before. * * The "Configure Panel" button in the context menu of the panel will * be connected to this slot so this method gets called whenever the * user clicks that button. * * Furthermore, this method will be called by LXQtPanelApplication * when a new plugin gets added (the LXQtPanel instances are handled * by LXQtPanelApplication). That is why this method/slot has to be * public. */ void showConfigDialog(); private slots: /** * @brief Shows the ConfigPanelDialog and shows the "Config Plugins" * page, i.e. calls showConfigPluginsPage(). If the dialog does not * exist yet, it will be created before. * * The "Manage Widgets" button in the context menu of the panel will * be connected to this slot so this method gets called whenever the * user clicks that button. */ void showAddPluginDialog(); /** * @brief Recalculates the geometry of the panel and reserves the * window manager strut, i.e. it calls setPanelGeometry() and * updateWmStrut(). * Two signals will be connected to this slot: * 1. QDesktopWidget::workAreaResized(int screen) which will be emitted * when the work area available (on screen) changes. * 2. LXQt::Application::themeChanged(), i.e. when the user changes * the theme. */ void realign(); /** * @brief Moves a plugin in PanelPluginsModel, i.e. calls * PanelPluginsModel::movePlugin(Plugin * plugin, QString const & nameAfter). * LXQtPanelLayout::pluginMoved() will be connected to this slot so * it gets called whenever a plugin was moved in the layout by the user. * @param plug */ void pluginMoved(Plugin * plug); /** * @brief Removes this panel's entries from the config file and emits * the deletedByUser signal. * The "Remove Panel" button in the panel's context menu will * be connected to this slot, so this method will be called whenever * the user clicks "Remove Panel". */ void userRequestForDeletion(); private: /** * @brief The LXQtPanelLayout of this panel. All the Plugins will be added * to the UI via this layout. */ LXQtPanelLayout* mLayout; /** * @brief The LXQt::Settings instance as retrieved from * LXQtPanelApplication. */ LXQt::Settings *mSettings; /** * @brief The background widget for the panel. This background widget will * have the background color or the background image if any of these is * set. This background widget will have the LXQtPanelLayout mLayout which * will in turn contain all the Plugins. */ QFrame *LXQtPanelWidget; /** * @brief The name of the panel which will also be used as an identifier * for config files. */ QString mConfigGroup; /** * @brief Pointer to the PanelPluginsModel which will store all the Plugins * that are loaded. */ std::unique_ptr mPlugins; /** * @brief object for storing info if some standalone window is shown * (for preventing hide) */ std::unique_ptr mStandaloneWindows; /** * @brief Returns the screen index of a screen on which this panel could * be placed at the given position. If possible, the current screen index * is preserved. So, if the panel can be placed on the current screen, the * index of that screen will be returned. * @param position position at which the panel should be placed. * @return The current screen index if the panel can be placed on the * current screen or the screen index of a screen that it can be placed on. * * \sa canPlacedOn(), mScreenNum, mActualScreenNum. */ int findAvailableScreen(LXQtPanel::Position position); /** * @brief Update the window manager struts _NET_WM_PARTIAL_STRUT and * _NET_WM_STRUT for this widget. "The purpose of struts is to reserve * space at the borders of the desktop. This is very useful for a * docking area, a taskbar or a panel, for instance. The Window Manager * should take this reserved area into account when constraining window * positions - maximized windows, for example, should not cover that * area." * \sa http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#NETWMSTRUT */ void updateWmStrut(); /** * @brief Loads the plugins, i.e. creates a new PanelPluginsModel. * Connects the signals and slots and adds all the plugins to the * layout. */ void loadPlugins(); /** * @brief Calculates and sets the geometry (i.e. the position and the size * on the screen) of the panel. Considers alignment, position, if the panel * is hidden and if its geometry should be set with animation. * \param animate flag if showing/hiding the panel should be animated. */ void setPanelGeometry(bool animate = false); /** * @brief Sets the contents margins of the panel according to its position * and hiddenness. All margins are zero for visible panels. */ void setMargins(); /** * @brief Calculates the height of the panel if it is horizontal or the * width if the panel is vertical. Considers if the panel is hidden and * ensures that the result is at least PANEL_MINIMUM_SIZE. * @return The height/width of the panel. */ int getReserveDimension(); /** * @brief Calculates the margins of the layer window under Wayland * by considering the hidden state of the panel. * @return The margins of the layer window. */ QMargins layerWindowMargins(); /** * @brief Stores the geometry of the non-hidden panel, for use in * calculatePopupWindowPos() */ QRect mGeometry; /** * @brief Stores the size of the panel, i.e. the height of a horizontal * panel or the width of a vertical panel in pixels. If the panel is * hidden (which is achieved by making the panel very thin), this value * is unchanged. So this value stores the size of the non-hidden panel. * * \sa panelSize(), setPanelSize(). */ int mPanelSize; /** * @brief Stores the edge length of the panel icons in pixels. * * \sa ILXQtPanel::iconSize(), setIconSize(). */ int mIconSize; /** * @brief Stores the number of lines/rows of the panel. * * \sa ILXQtPanel::lineCount(), setLineCount(). */ int mLineCount; /** * @brief Stores the length of the panel, i.e. the width of a horizontal * panel or the height of a vertical panel. The unit of this value is * determined by mLengthInPercents. * * \sa mLengthInPercents */ int mLength; /** * @brief Stores if mLength is stored in pixels or relative to the * screen size in percents. If true, the length is stored in percents, * otherwise in pixels. * * \sa mLength */ bool mLengthInPercents; /** * @brief Stores how this panel is aligned. The meaning of this value * differs for horizontal and vertical panels. * * \sa Alignment. */ Alignment mAlignment; /** * @brief Stores the position where the panel is shown */ ILXQtPanel::Position mPosition; /** * @brief Returns the index of the screen on which this panel should be * shown. This is the user configured value which can differ from the * screen that the panel is actually shown on. If the panel can not be * shown on the configured screen, LXQtPanel will determine another * screen. The screen that the panel is actually shown on is stored in * mActualScreenNum. * * @return The index of the screen on which this panel should be shown. * * \sa mActualScreenNum, canPlacedOn(), findAvailableScreen(). */ int mScreenNum; /** * @brief screen that the panel is currently shown at (this could * differ from mScreenNum). * * \sa mScreenNum, canPlacedOn(), findAvailableScreen(). */ int mActualScreenNum; /** * @brief The Wayland screen number, which is found based on the screen name. * It can be different from mScreenNum and is not saved to the config file. * Its initial value is -1, meaning that it is not set yet. * * \sa mScreenNum, canPlacedOn(), findAvailableScreen(). */ int mWaylandScreenNum; /** * @brief The name of the Wayland screen, on which this panel should be * shown. If the panel cannot be shown on that screen, LXQtPanel will * determine another screen. The screen that the panel is actually * shown on is stored in mActualScreenNum. * * \sa mScreenNum, mActualScreenNum. */ QString mScreenName; /** * @brief QTimer for delayed saving of changed settings. In many cases, * instead of storing changes to disk immediately we start this timer. * If this timer times out, we store the changes to disk. This has the * advantage that we can store a couple of changes with only one write to * disk. * * \sa saveSettings() */ QTimer mDelaySave; /** * @brief Stores if the panel is hidable, i.e. if the panel will be * hidden after the cursor has left the panel area. * * \sa mVisibleMargin, mHidden, mHideTimer, showPanel(), hidePanel(), hidePanelWork() */ bool mHidable; /** * @brief Stores if the hidable panel should have a visible margin. * * \sa mHidable, mHidden, mHideTimer, showPanel(), hidePanel(), hidePanelWork() */ bool mVisibleMargin; /** * @brief Stores if the panel should hide on overlapping a window. * * \sa mHidable, mHidden, mHideTimer, showPanel(), hidePanel(), hidePanelWork() */ bool mHideOnOverlap; /** * @brief Stores if the panel is currently hidden. * * \sa mHidable, mVisibleMargin, mHideTimer, showPanel(), hidePanel(), hidePanelWork() */ bool mHidden; /** * @brief QTimer for hiding the panel. When the cursor leaves the panel * area, this timer will be started. After this timer has timed out, the * panel will actually be hidden. * * \sa mHidable, mVisibleMargin, mHidden, showPanel(), hidePanel(), hidePanelWork() */ QTimer mHideTimer; /** * @brief Stores the duration of auto-hide animation. * * \sa mHidden, mHideTimer, showPanel(), hidePanel(), hidePanelWork() */ int mAnimationTime; /** * @brief The timer used for showing an auto-hiding panel with delay. * * \sa showPanel() */ QTimer mShowDelayTimer; QColor mFontColor; //!< Font color that is used in the style sheet. QColor mBackgroundColor; //!< Background color that is used in the style sheet. QString mBackgroundImage; //!< Background image that is used in the style sheet. /** * @brief Determines the opacity of the background color. The value * should be in the range from 0 to 100. This will not affect the opacity * of a background image. */ int mOpacity; /*! * \brief Flag if the panel should reserve the space under it as not usable * for "normal" windows. Usable for not 100% wide/hight or hiddable panels, * if user wants maximized windows go under the panel. * * \sa updateWmStrut() */ bool mReserveSpace; /** * @brief Pointer to the current ConfigPanelDialog if there is any. Make * sure to test this pointer for validity because it is lazily loaded. */ QPointer mConfigDialog; /** * @brief The animation used for showing/hiding an auto-hiding panel. */ QPropertyAnimation *mAnimation; // on X11 QVariantAnimation *mWAnimation; // on Wayland LayerShellQt::Window *mLayerWindow; /** * @brief Flag for providing the configuration options in panel's context menu */ bool mLockPanel; /** * @brief Updates the style sheet for the panel. First, the stylesheet is * created from the preferences. Then, it is set via * QWidget::setStyleSheet(). */ void updateStyleSheet(); /** * @brief Checks if the panel overlaps a window. */ bool isPanelOverlapped() const; // settings should be kept private for security LXQt::Settings *settings() const { return mSettings; } }; #endif // LXQTPANEL_H ================================================ FILE: panel/lxqtpanelapplication.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtpanelapplication.h" #include "lxqtpanelapplication_p.h" #include "config/configpaneldialog.h" #include "lxqtpanel.h" #include #include #include #include #include #include #include #include #include #include "backends/lxqtdummywmbackend.h" static inline QMap getBackendScoreMap( QString compositor ) { QStringList dirs; dirs << QProcessEnvironment::systemEnvironment().value(QStringLiteral("LXQTPANEL_PLUGIN_PATH")).split(QStringLiteral(":")); dirs << QStringLiteral(PLUGIN_DIR); QMap backendScoreMap; for(const QString& dir : std::as_const(dirs)) { QDir backendsDir(dir); if ( QFile::exists( dir + QStringLiteral("/backend") ) ) { backendsDir.cd(QLatin1String("backend")); } const auto entryList = backendsDir.entryInfoList(QStringList() << QStringLiteral("*.so"), QDir::Files|QDir::System|QDir::Readable); for(QFileInfo info: entryList) { QPluginLoader loader(info.absoluteFilePath()); if(!loader.load()) { QString err = loader.errorString(); qWarning() << "Backend error:" << err; } QObject *plugin = loader.instance(); if(!plugin) continue; ILXQtWMBackendLibrary *backend = qobject_cast(plugin); if(backend) { backendScoreMap[ info.fileName() ] = backend->getBackendScore( compositor ); } loader.unload(); } } return backendScoreMap; } static inline QString getBackendFilePath( QString name ) { // If we do not have a full library name, line lib_labwc_backend.so, // then build a name based on default heuristic: libwmbackend_.so if (!name.startsWith(QStringLiteral("lib")) || !name.endsWith(QStringLiteral(".so"))) { if ( !name.startsWith( QStringLiteral("libwmbackend_") ) ) { name = QString( QStringLiteral("libwmbackend_%1") ).arg( name ); } if ( !name.endsWith( QStringLiteral(".so") ) ) { name = QString( QStringLiteral("%1.so") ).arg( name ); } } QStringList dirs; dirs << QProcessEnvironment::systemEnvironment().value(QStringLiteral("LXQTPANEL_PLUGIN_PATH")).split(QStringLiteral(":")); dirs << QStringLiteral(PLUGIN_DIR); QMap backendScoreMap; for(const QString& dir : std::as_const(dirs)) { QDir backendsDir(dir); if ( QFile::exists( dir + QStringLiteral("/backend") ) ) { backendsDir.cd(QLatin1String("backend")); } if ( backendsDir.exists( name ) ) { return backendsDir.absoluteFilePath( name ); } } return QString(); } static inline bool testBackend( QString backendName ) { QString backendPath = getBackendFilePath( backendName ); QPluginLoader loader(backendPath); if(!loader.load()) { qWarning() << "Backend error:" << loader.errorString(); return false; } QObject *plugin = loader.instance(); if(!plugin) { qWarning() << "Failed to create the plugin instance"; return false; } ILXQtWMBackendLibrary *backend = qobject_cast(plugin); bool okay = false; if(backend) { okay = true; } loader.unload(); return okay; } LXQtPanelApplicationPrivate::LXQtPanelApplicationPrivate(LXQtPanelApplication *q) : mSettings(nullptr) , mWMBackend(nullptr) , q_ptr(q) { } ILXQtPanel::Position LXQtPanelApplicationPrivate::computeNewPanelPosition(const LXQtPanel *p, const int screenNum) { Q_Q(LXQtPanelApplication); QList screenPositions(4, false); // false means not occupied for (int i = 0; i < q->mPanels.size(); ++i) { if (p != q->mPanels.at(i)) { // We are not the newly added one if (screenNum == q->mPanels.at(i)->screenNum()) { // Panels on the same screen int p = static_cast (q->mPanels.at(i)->position()); screenPositions[p] = true; // occupied } } } int availablePosition = 0; for (int i = 0; i < 4; ++i) { // Bottom, Top, Left, Right if (!screenPositions[i]) { availablePosition = i; break; } } return static_cast (availablePosition); } void LXQtPanelApplicationPrivate::loadBackend() { /** * 1. Get the XDG_CURRENT_DESKTOP. It's a colon separate list. * 2. Get the preferredBackend. It's a comma separated list. * 3. First attempt to match some value in XDG_CURRENT_DESKTOP with any value in preferredBackend. * 4. If it matches, end of story. Else, we attempt to deduce the backend based on XDG_CURRENT_DESKTOP: * a. X11 -> xcb * b. kwin_wayland -> plasma * c. wayfire -> wayfire * d. wayland -> wlroots * e. other -> dummy */ // Get and split XDG_CURRENT_DESKTOP. QStringList xdgCurrentDesktops = qEnvironmentVariable( "XDG_CURRENT_DESKTOP" ).split( QStringLiteral(":") ); // Get and split XDG_SESSION_TYPE. QString xdgSessionType = qEnvironmentVariable( "XDG_SESSION_TYPE" ); // Get the preferred backends QStringList preferredBackends = mSettings->value(QStringLiteral("preferred_backend")).toStringList(); // The preferred backend QString preferredBackend; for ( QString xdgCurrentDesktop: xdgCurrentDesktops ) { for ( QString backend: preferredBackends ) { QStringList parts = backend.split(QStringLiteral(":")); // Invalid format if (parts.count() != 2) { continue; } if (parts[0].compare(xdgCurrentDesktop, Qt::CaseInsensitive) == 0 && testBackend(parts[1])) { preferredBackend = parts[1]; break; } } } /** No special considerations. Attempt auto-detection of the platform */ if ( preferredBackend.isEmpty() ) { qDebug() << "No user preferences available. Attempting auto-detection."; // It's XCB/X11 if ( xdgSessionType == QStringLiteral("x11") ) { preferredBackend = QStringLiteral("xcb"); } // It's wayland else { int bestScore = 0; for ( QString xdgCurrentDesktop: xdgCurrentDesktops ) { QMap backendScoreMap = getBackendScoreMap( xdgCurrentDesktop ); for( QString backend: backendScoreMap.keys() ) { if ( backendScoreMap[ backend ] > bestScore ) { bestScore = backendScoreMap[ backend ]; // No need to call testBackend(). // We can be sure the plugin can be loaded. // Because we have a score. preferredBackend = backend; } } } } } if (preferredBackend.isEmpty() && xdgCurrentDesktops.contains(QStringLiteral("wlroots"), Qt::CaseInsensitive)) { qDebug() << "Specialized backend unavailable. Falling back to generic wlroots"; preferredBackend = QStringLiteral("wlroots"); } QPluginLoader loader; // We now have the preferred backend. // We have taken into consideration, the user's choice. // In case it was unavailable, a default one has been chosen. if(!preferredBackend.isEmpty()) { loader.setFileName(getBackendFilePath(preferredBackend)); if (loader.load()) { QObject *plugin = loader.instance(); ILXQtWMBackendLibrary *backend = qobject_cast(plugin); if(backend) { mWMBackend = backend->instance(); } else { // Plugin not valid loader.unload(); } } else { qWarning() << loader.errorString(); } } if(mWMBackend) { qDebug() << "\nPanel backend:" << preferredBackend << "\n"; } else { // If no backend can be found fall back to dummy backend loader.unload(); mWMBackend = new LXQtDummyWMBackend; qWarning() << "\n" << "ERROR: Could not create a backend for window managment operations.\n" << "Falling back to dummy backend. Some functions will not be available.\n" << "\n"; } mWMBackend->setParent(q_ptr); } LXQtPanelApplication::LXQtPanelApplication(int& argc, char** argv) : LXQt::Application(argc, argv, true), d_ptr(new LXQtPanelApplicationPrivate(this)) { Q_D(LXQtPanelApplication); QCoreApplication::setApplicationName(QLatin1String("lxqt-panel")); const QString VERINFO = QStringLiteral(LXQT_PANEL_VERSION "\nliblxqt " LXQT_VERSION "\nQt " QT_VERSION_STR); QCoreApplication::setApplicationVersion(VERINFO); QCommandLineParser parser; parser.setApplicationDescription(QLatin1String("LXQt Panel")); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption configFileOption(QStringList() << QLatin1String("c") << QLatin1String("config") << QLatin1String("configfile"), QCoreApplication::translate("main", "Use alternate configuration file."), QCoreApplication::translate("main", "Configuration file")); parser.addOption(configFileOption); parser.process(*this); const QString configFile = parser.value(configFileOption); if (configFile.isEmpty()) d->mSettings = new LXQt::Settings(QLatin1String("panel"), this); else d->mSettings = new LXQt::Settings(configFile, QSettings::IniFormat, this); d->loadBackend(); const auto allScreens = screens(); if (QGuiApplication::platformName() != QStringLiteral("wayland")) { // This is a workaround for Qt 5 bug #40681. for(QScreen* screen : allScreens) { connect(screen, &QScreen::destroyed, this, &LXQtPanelApplication::screenDestroyed); } connect(this, &QGuiApplication::screenAdded, this, &LXQtPanelApplication::handleScreenAdded); } else { connect(this, &QGuiApplication::screenAdded, this, &LXQtPanelApplication::handleWaylandScreenAdded); } connect(this, &QCoreApplication::aboutToQuit, this, &LXQtPanelApplication::cleanup); QStringList panels = d->mSettings->value(QStringLiteral("panels")).toStringList(); // WARNING: Giving a separate icon theme to the panel is wrong and has side effects. // However, it is optional and can be used as the last resort for avoiding a low // contrast in the case of symbolic SVG icons. (The correct way of doing that is // using a Qt widget style that can assign a separate theme/QPalette to the panel.) mGlobalIconTheme = QIcon::themeName(); const QString iconTheme = d->mSettings->value(QStringLiteral("iconTheme")).toString(); if (!iconTheme.isEmpty()) QIcon::setThemeName(iconTheme); if (panels.isEmpty()) { panels << QStringLiteral("panel1"); } for (const QString& i : std::as_const(panels)) { if (QGuiApplication::platformName() == QStringLiteral("wayland")) { // On Wayland, add a panel that has screen name only if its screen exists. bool found = false; d->mSettings->beginGroup(i); auto screenName = d->mSettings->value(QStringLiteral(CFG_KEY_SCREENNAME)).toString(); d->mSettings->endGroup(); if (screenName.isEmpty()) found = true; // add the panel, anyway else { for (const auto& screen : allScreens) { if (screen->name() == screenName) { found = true; break; } } } if (!found) continue; } addPanel(i); } // if no panel can be added on Wayland, forcefully add the first one if (mPanels.isEmpty()) addPanel(panels.at(0)); } LXQtPanelApplication::~LXQtPanelApplication() { delete d_ptr; } void LXQtPanelApplication::cleanup() { qDeleteAll(mPanels); } void LXQtPanelApplication::addNewPanel() { Q_D(LXQtPanelApplication); QString name(QStringLiteral("panel_") + QUuid::createUuid().toString()); LXQtPanel *p = addPanel(name); int screenNum = p->screenNum(); ILXQtPanel::Position newPanelPosition = d->computeNewPanelPosition(p, screenNum); p->setPosition(screenNum, newPanelPosition, true); QStringList panels = d->mSettings->value(QStringLiteral("panels")).toStringList(); panels << name; d->mSettings->setValue(QStringLiteral("panels"), panels); // Poupup the configuration dialog to allow user configuration right away p->showConfigDialog(); } LXQtPanel* LXQtPanelApplication::addPanel(const QString& name) { Q_D(LXQtPanelApplication); LXQtPanel *panel = new LXQtPanel(name, d->mSettings); mPanels << panel; // reemit signals connect(panel, &LXQtPanel::deletedByUser, this, &LXQtPanelApplication::removePanel); connect(panel, &LXQtPanel::pluginAdded, this, &LXQtPanelApplication::pluginAdded); connect(panel, &LXQtPanel::pluginRemoved, this, &LXQtPanelApplication::pluginRemoved); return panel; } void LXQtPanelApplication::handleScreenAdded(QScreen* newScreen) { // qDebug() << "LXQtPanelApplication::handleScreenAdded" << newScreen; connect(newScreen, &QScreen::destroyed, this, &LXQtPanelApplication::screenDestroyed); } void LXQtPanelApplication::handleWaylandScreenAdded(QScreen* newScreen) { Q_D(LXQtPanelApplication); const QStringList names = d->mSettings->value(QStringLiteral("panels")).toStringList(); for (const QString& name : names) { d->mSettings->beginGroup(name); auto screenName = d->mSettings->value(QStringLiteral(CFG_KEY_SCREENNAME)).toString(); d->mSettings->endGroup(); if (screenName == newScreen->name()) { bool alreadyExists = false; for (const auto& panel : std::as_const(mPanels)) { if (panel->name() == name) { // the panel already exists (and is hidden) alreadyExists = true; break; } } if (alreadyExists) continue; addPanel(name); } } } void LXQtPanelApplication::reloadPanelsAsNeeded() { Q_D(LXQtPanelApplication); // NOTE by PCMan: This is a workaround for Qt 5 bug #40681. // Here we try to re-create the missing panels which are deleted in // LXQtPanelApplication::screenDestroyed(). // qDebug() << "LXQtPanelApplication::reloadPanelsAsNeeded()"; const QStringList names = d->mSettings->value(QStringLiteral("panels")).toStringList(); for(const QString& name : names) { bool found = false; for(LXQtPanel* panel : std::as_const(mPanels)) { if(panel->name() == name) { found = true; break; } } if(!found) { // the panel is found in the config file but does not exist, create it. qDebug() << "Workaround Qt 5 bug #40681: re-create panel:" << name; addPanel(name); } } qApp->setQuitOnLastWindowClosed(true); } void LXQtPanelApplication::screenDestroyed(QObject* screenObj) { // NOTE by PCMan: This is a workaround for Qt 5 bug #40681. // With this very dirty workaround, we can fix lxqt/lxqt bug #204, #205, and #206. // Qt 5 has two new regression bugs which breaks lxqt-panel in a multihead environment. // #40681: Regression bug: QWidget::winId() returns old value and QEvent::WinIdChange event is not emitted sometimes. (multihead setup) // #40791: Regression: QPlatformWindow, QWindow, and QWidget::winId() are out of sync. // Explanations for the workaround: // Internally, Qt maintains a list of QScreens and update it when XRandR configuration changes. // When the user turn off an monitor with xrandr --output --off, this will destroy the QScreen // object which represent the output. If the QScreen being destroyed contains our panel widget, // Qt will call QWindow::setScreen(0) on the internal windowHandle() of our panel widget to move it // to the primary screen. However, moving a window to a different screen is more than just changing // its position. With XRandR, all screens are actually part of the same virtual desktop. However, // this is not the case in other setups, such as Xinerama and moving a window to another screen is // not possible unless you destroy the widget and create it again for a new screen. // Therefore, Qt destroy the widget and re-create it when moving our panel to a new screen. // Unfortunately, destroying the window also destroy the child windows embedded into it, // using XEMBED such as the tray icons. (#206) // Second, when the window is re-created, the winId of the QWidget is changed, but Qt failed to // generate QEvent::WinIdChange event so we have no way to know that. We have to set // some X11 window properties using the native winId() to make it a dock, but this stop working // because we cannot get the correct winId(), so this causes #204 and #205. // // The workaround is very simple. Just completely destroy the panel before Qt has a chance to do // QWindow::setScreen() for it. Later, we reload the panel ourselves. So this can bypassing the Qt bugs. QScreen* screen = static_cast(screenObj); bool reloadNeeded = false; qApp->setQuitOnLastWindowClosed(false); for(LXQtPanel* panel : std::as_const(mPanels)) { QWindow* panelWindow = panel->windowHandle(); if(panelWindow && panelWindow->screen() == screen) { // the screen containing the panel is destroyed // delete and then re-create the panel ourselves QString name = panel->name(); panel->saveSettings(false); mPanels.removeAll(panel); delete panel; // delete the panel, so Qt does not have a chance to set a new screen to it. reloadNeeded = true; qDebug() << "Workaround Qt 5 bug #40681: delete panel:" << name; } } if(reloadNeeded) QTimer::singleShot(1000, this, SLOT(reloadPanelsAsNeeded())); else qApp->setQuitOnLastWindowClosed(true); } void LXQtPanelApplication::removePanel(LXQtPanel* panel) { Q_D(LXQtPanelApplication); Q_ASSERT(mPanels.contains(panel)); mPanels.removeAll(panel); QStringList panels = d->mSettings->value(QStringLiteral("panels")).toStringList(); panels.removeAll(panel->name()); d->mSettings->setValue(QStringLiteral("panels"), panels); panel->deleteLater(); } bool LXQtPanelApplication::isPluginSingletonAndRunning(QString const & pluginId) const { for (auto const & panel : mPanels) if (panel->isPluginSingletonAndRunning(pluginId)) return true; return false; } ILXQtAbstractWMInterface *LXQtPanelApplication::getWMBackend() const { Q_D(const LXQtPanelApplication); return d->mWMBackend; } // See LXQtPanelApplication::LXQtPanelApplication for why this isn't good. void LXQtPanelApplication::setIconTheme(const QString &iconTheme) { Q_D(LXQtPanelApplication); d->mSettings->setValue(QStringLiteral("iconTheme"), iconTheme == mGlobalIconTheme ? QString() : iconTheme); QString newTheme = iconTheme.isEmpty() ? mGlobalIconTheme : iconTheme; if (newTheme != QIcon::themeName()) { QIcon::setThemeName(newTheme); for(LXQtPanel* panel : std::as_const(mPanels)) { panel->update(); panel->updateConfigDialog(); } } } ================================================ FILE: panel/lxqtpanelapplication.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANELAPPLICATION_H #define LXQTPANELAPPLICATION_H #include #include "ilxqtpanelplugin.h" class QScreen; class LXQtPanel; class LXQtPanelApplicationPrivate; class ILXQtAbstractWMInterface; /*! * \brief The LXQtPanelApplication class inherits from LXQt::Application and * is therefore the QApplication that we will create and execute in our * main()-function. * * LXQtPanelApplication itself is not a visible panel, rather it is only * the container which holds the visible panels. These visible panels are * LXQtPanel objects which are stored in mPanels. This approach enables us * to have more than one panel (for example one panel at the top and one * panel at the bottom of the screen) without additional effort. */ class LXQtPanelApplication : public LXQt::Application { Q_OBJECT public: /*! * \brief Creates a new LXQtPanelApplication with the given command line * arguments. Performs the following steps: * 1. Initializes the LXQt::Application, sets application name and version. * 2. Handles command line arguments. Currently, the only cmdline argument * is -c = -config = -configfile which chooses a different config file * for the LXQt::Settings. * 3. Creates the LXQt::Settings. * 4. Connects QCoreApplication::aboutToQuit to cleanup(). * 5. Calls addPanel() for each panel found in the config file. If there is * none, adds a new panel. * \param argc * \param argv */ explicit LXQtPanelApplication(int& argc, char** argv); ~LXQtPanelApplication(); void setIconTheme(const QString &iconTheme); /*! * \brief Determines the number of LXQtPanel objects * \return the current number of LXQtPanel objects */ int count() const { return mPanels.count(); } /*! * \brief Checks if a given Plugin is running and has the * ILXQtPanelPlugin::SingleInstance flag set. As Plugins are added to * LXQtPanel instances, this method only iterates over these LXQtPanel * instances and lets them check the conditions. * \param pluginId Plugin Identifier which is the basename of the .desktop * file that specifies the plugin. * \return true if the Plugin is running and has the * ILXQtPanelPlugin::SingleInstance flag set, false otherwise. */ bool isPluginSingletonAndRunning(QString const & pluginId) const; ILXQtAbstractWMInterface* getWMBackend() const; public slots: /*! * \brief Adds a new LXQtPanel which consists of the following steps: * 1. Create id/name. * 2. Create the LXQtPanel: call addPanel(name). * 3. Update the config file (add the new panel id to the list of panels). * 4. Show the panel configuration dialog so that the user can add plugins. * * This method will create a new LXQtPanel with a new name and add this * to the config file. So this should only be used while the application * is running and the user decides to add a new panel. At application * startup, addPanel() should be used instead. * * \note This slot will be used from the LXQtPanel right-click menu. As we * can only add new panels from a visible panel, we should never run * lxqt-panel without an LXQtPanel. Without a panel, we have just an * invisible application. */ void addNewPanel(); signals: /*! * \brief Signal that re-emits the signal pluginAdded() from LXQtPanel. */ void pluginAdded(); /*! * \brief Signal that re-emits the signal pluginRemoved() from LXQtPanel. */ void pluginRemoved(); private: /*! * \brief Holds all the instances of LXQtPanel. */ QList mPanels; /*! * \brief The global icon theme used by all apps (except for panels perhaps). */ QString mGlobalIconTheme; /*! * \brief Creates a new LXQtPanel with the given name and connects the * appropriate signals and slots. * This method can be used at application startup. * \param name Name of the LXQtPanel as it is used in the config file. * \return The newly created LXQtPanel. */ LXQtPanel* addPanel(const QString &name); private slots: /*! * \brief Removes the given LXQtPanel which consists of the following * steps: * 1. Remove the panel from mPanels. * 2. Remove the panel from the config file. * 3. Schedule the QObject for deletion: QObject::deleteLater(). * \param panel LXQtPanel instance that should be removed. */ void removePanel(LXQtPanel* panel); /*! * \brief Connects the QScreen::destroyed signal of a new screen to * the screenDestroyed() slot so that we can handle this screens' * destruction as soon as it happens. * \param newScreen The QScreen that was created and added. */ void handleScreenAdded(QScreen* newScreen); /*! * \brief Adds the panel whose screen name is that of the new screen * on Wayland if it does not exist. * \param newScreen The QScreen that was created and added. */ void handleWaylandScreenAdded(QScreen* newScreen); /*! * \brief Handles screen destruction. This is a workaround for a Qt bug. * For further information, see the implementation notes. * \param screenObj The QScreen that was destroyed. */ void screenDestroyed(QObject* screenObj); /*! * \brief Reloads the panels. This is the second part of the workaround * mentioned above. */ void reloadPanelsAsNeeded(); /*! * \brief Deletes all LXQtPanel instances that are stored in mPanels. */ void cleanup(); private: /*! * \brief mSettings is the LXQt::Settings object that is used for the * current instance of lxqt-panel. Normally, this refers to the config file * $HOME/.config/lxqt/panel.conf (on Unix systems). This behaviour can be * changed with the -c command line option. */ LXQtPanelApplicationPrivate *const d_ptr; Q_DECLARE_PRIVATE(LXQtPanelApplication) Q_DISABLE_COPY(LXQtPanelApplication) }; #endif // LXQTPANELAPPLICATION_H ================================================ FILE: panel/lxqtpanelapplication_p.h ================================================ /* * LXQt - a lightweight, Qt based, desktop toolset * Copyright (C) 2016 Luís Pereira * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA */ #ifndef LXQTPANELAPPLICATION_P_H #define LXQTPANELAPPLICATION_P_H #include "lxqtpanelapplication.h" namespace LXQt { class Settings; } class ILXQtAbstractWMInterface; class LXQtPanelApplicationPrivate { Q_DECLARE_PUBLIC(LXQtPanelApplication) public: LXQtPanelApplicationPrivate(LXQtPanelApplication *q); ~LXQtPanelApplicationPrivate() {}; LXQt::Settings *mSettings; ILXQtAbstractWMInterface *mWMBackend; ILXQtPanel::Position computeNewPanelPosition(const LXQtPanel *p, const int screenNum); void loadBackend(); private: LXQtPanelApplication *const q_ptr; }; #endif // LXQTPANELAPPLICATION_P_H ================================================ FILE: panel/lxqtpanelglobals.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org/ * * Copyright: 2013 LXQt team * Authors: * Hong Jen Yee (PCMan) * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . * * END_COMMON_COPYRIGHT_HEADER */ #ifndef __LXQT_PANEL_GLOBALS_H__ #define __LXQT_PANEL_GLOBALS_H__ #include #ifdef COMPILE_LXQT_PANEL #define LXQT_PANEL_API Q_DECL_EXPORT #else #define LXQT_PANEL_API Q_DECL_IMPORT #endif #endif // __LXQT_PANEL_GLOBALS_H__ ================================================ FILE: panel/lxqtpanellayout.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtpanellayout.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "plugin.h" #include "lxqtpanellimits.h" #include "ilxqtpanelplugin.h" #include "lxqtpanel.h" #include "pluginmoveprocessor.h" #include #include #include #define ANIMATION_DURATION 250 class ItemMoveAnimation : public QVariantAnimation { public: ItemMoveAnimation(QLayoutItem *item) : mItem(item) { setEasingCurve(QEasingCurve::OutBack); setDuration(ANIMATION_DURATION); } void updateCurrentValue(const QVariant ¤t) override { mItem->setGeometry(current.toRect()); } private: QLayoutItem* mItem; }; struct LayoutItemInfo { LayoutItemInfo(QLayoutItem *layoutItem=nullptr); QLayoutItem *item; QRect geometry; bool separate{false}; bool expandable{false}; }; LayoutItemInfo::LayoutItemInfo(QLayoutItem *layoutItem): item(layoutItem) { if (!item) return; Plugin *p = qobject_cast(item->widget()); if (p) { separate = p->isSeparate(); expandable = p->isExpandable(); return; } } /************************************************ This is logical plugins grid, it's same for horizontal and vertical panel. Plugins keeps as: <---LineCount--> + ---+----+----+ | P1 | P2 | P3 | +----+----+----+ | P4 | P5 | | +----+----+----+ ... +----+----+----+ | PN | | | +----+----+----+ ************************************************/ class LayoutItemGrid { public: explicit LayoutItemGrid(); ~LayoutItemGrid(); void addItem(QLayoutItem *item); int count() const { return mItems.count(); } QLayoutItem *itemAt(int index) const { return mItems[index]; } QLayoutItem *takeAt(int index); const LayoutItemInfo &itemInfo(int row, int col) const; LayoutItemInfo &itemInfo(int row, int col); void update(); int lineSize() const { return mLineSize; } void setLineSize(int value); int colCount() const { return mColCount; } void setColCount(int value); int usedColCount() const { return mUsedColCount; } int rowCount() const { return mRowCount; } void invalidate() { mValid = false; } bool isValid() const { return mValid; } QSize sizeHint() const { return mSizeHint; } bool horiz() const { return mHoriz; } void setHoriz(bool value); void clear(); void rebuild(); bool isExpandable() const { return mExpandable; } int expandableSize() const { return mExpandableSize; } void moveItem(int from, int to); private: QList mInfoItems; int mColCount; int mUsedColCount; int mRowCount; bool mValid; int mExpandableSize; int mLineSize; QSize mSizeHint; QSize mMinSize; bool mHoriz; int mNextRow; int mNextCol; bool mExpandable; QList mItems; void doAddToGrid(QLayoutItem *item); }; /************************************************ ************************************************/ LayoutItemGrid::LayoutItemGrid() : mColCount(0), mLineSize(0), mHoriz(true) { clear(); } LayoutItemGrid::~LayoutItemGrid() { qDeleteAll(mItems); } /************************************************ ************************************************/ void LayoutItemGrid::clear() { mRowCount = 0; mNextRow = 0; mNextCol = 0; mInfoItems.resize(0); mValid = false; mExpandable = false; mExpandableSize = 0; mUsedColCount = 0; mSizeHint = QSize(0, 0); mMinSize = QSize(0, 0); } /************************************************ ************************************************/ void LayoutItemGrid::rebuild() { clear(); for(QLayoutItem *item : std::as_const(mItems)) { doAddToGrid(item); } } /************************************************ ************************************************/ void LayoutItemGrid::addItem(QLayoutItem *item) { doAddToGrid(item); mItems.append(item); } /************************************************ ************************************************/ void LayoutItemGrid::doAddToGrid(QLayoutItem *item) { LayoutItemInfo info(item); if (info.separate && mNextCol > 0) { mNextCol = 0; mNextRow++; } int cnt = (mNextRow + 1 ) * mColCount; if (mInfoItems.count() <= cnt) mInfoItems.resize(cnt); int idx = mNextRow * mColCount + mNextCol; mInfoItems[idx] = info; mUsedColCount = std::max(mUsedColCount, mNextCol + 1); mExpandable = mExpandable || info.expandable; mRowCount = std::max(mRowCount, mNextRow+1); if (info.separate || mNextCol >= mColCount-1) { mNextRow++; mNextCol = 0; } else { mNextCol++; } invalidate(); } /************************************************ ************************************************/ QLayoutItem *LayoutItemGrid::takeAt(int index) { QLayoutItem *item = mItems.takeAt(index); rebuild(); return item; } /************************************************ ************************************************/ void LayoutItemGrid::moveItem(int from, int to) { mItems.move(from, to); rebuild(); } /************************************************ ************************************************/ const LayoutItemInfo &LayoutItemGrid::itemInfo(int row, int col) const { return mInfoItems[row * mColCount + col]; } /************************************************ ************************************************/ LayoutItemInfo &LayoutItemGrid::itemInfo(int row, int col) { return mInfoItems[row * mColCount + col]; } /************************************************ ************************************************/ void LayoutItemGrid::update() { mExpandableSize = 0; mSizeHint = QSize(0, 0); if (mHoriz) { mSizeHint.setHeight(mLineSize * mColCount); int x = 0; for (int r=0; rsizeHint(); info.geometry = QRect(QPoint(x, y), sz); y += sz.height(); rw = std::max(rw, sz.width()); } x += rw; if (itemInfo(r, 0).expandable) mExpandableSize += rw; mSizeHint.setWidth(x); mSizeHint.rheight() = std::max(mSizeHint.rheight(), y); } } else { mSizeHint.setWidth(mLineSize * mColCount); int y = 0; for (int r=0; rsizeHint(); info.geometry = QRect(QPoint(x, y), sz); x += sz.width(); rh = std::max(rh, sz.height()); } y += rh; if (itemInfo(r, 0).expandable) mExpandableSize += rh; mSizeHint.setHeight(y); mSizeHint.rwidth() = std::max(mSizeHint.rwidth(), x); } } mValid = true; } /************************************************ ************************************************/ void LayoutItemGrid::setLineSize(int value) { mLineSize = std::max(1, value); invalidate(); } /************************************************ ************************************************/ void LayoutItemGrid::setColCount(int value) { mColCount = std::max(1, value); rebuild(); } /************************************************ ************************************************/ void LayoutItemGrid::setHoriz(bool value) { mHoriz = value; invalidate(); } /************************************************ ************************************************/ LXQtPanelLayout::LXQtPanelLayout(QWidget *parent) : QLayout(parent), mLeftGrid(new LayoutItemGrid()), mRightGrid(new LayoutItemGrid()), mPosition(ILXQtPanel::PositionBottom), mAnimate(false) { setContentsMargins(0, 0, 0, 0); } /************************************************ ************************************************/ LXQtPanelLayout::~LXQtPanelLayout() { delete mLeftGrid; delete mRightGrid; } /************************************************ ************************************************/ void LXQtPanelLayout::addItem(QLayoutItem *item) { LayoutItemGrid *grid = mRightGrid; Plugin *p = qobject_cast(item->widget()); if (p && p->alignment() == Plugin::AlignLeft) grid = mLeftGrid; grid->addItem(item); } /************************************************ ************************************************/ void LXQtPanelLayout::globalIndexToLocal(int index, LayoutItemGrid **grid, int *gridIndex) { if (index < mLeftGrid->count()) { *grid = mLeftGrid; *gridIndex = index; return; } *grid = mRightGrid; *gridIndex = index - mLeftGrid->count(); } /************************************************ ************************************************/ void LXQtPanelLayout::globalIndexToLocal(int index, LayoutItemGrid **grid, int *gridIndex) const { if (index < mLeftGrid->count()) { *grid = mLeftGrid; *gridIndex = index; return; } *grid = mRightGrid; *gridIndex = index - mLeftGrid->count(); } /************************************************ ************************************************/ QLayoutItem *LXQtPanelLayout::itemAt(int index) const { if (index < 0 || index >= count()) return nullptr; LayoutItemGrid *grid=nullptr; int idx=0; globalIndexToLocal(index, &grid, &idx); return grid->itemAt(idx); } /************************************************ ************************************************/ QLayoutItem *LXQtPanelLayout::takeAt(int index) { if (index < 0 || index >= count()) return nullptr; LayoutItemGrid *grid=nullptr; int idx=0; globalIndexToLocal(index, &grid, &idx); return grid->takeAt(idx); } /************************************************ ************************************************/ int LXQtPanelLayout::count() const { return mLeftGrid->count() + mRightGrid->count(); } /************************************************ ************************************************/ void LXQtPanelLayout::moveItem(int from, int to, bool withAnimation) { if (from != to) { LayoutItemGrid *fromGrid=nullptr; int fromIdx=0; globalIndexToLocal(from, &fromGrid, &fromIdx); LayoutItemGrid *toGrid=nullptr; int toIdx=0; globalIndexToLocal(to, &toGrid, &toIdx); if (fromGrid == toGrid) { fromGrid->moveItem(fromIdx, toIdx); } else { QLayoutItem *item = fromGrid->takeAt(fromIdx); toGrid->addItem(item); //recalculate position because we removed from one and put to another grid LayoutItemGrid *toGridAux=nullptr; globalIndexToLocal(to, &toGridAux, &toIdx); Q_ASSERT(toGrid == toGridAux); //grid must be the same (if not something is wrong with our logic) toGrid->moveItem(toGridAux->count()-1, toIdx); } } mAnimate = withAnimation; invalidate(); } /************************************************ ************************************************/ QSize LXQtPanelLayout::sizeHint() const { if (!mLeftGrid->isValid()) mLeftGrid->update(); if (!mRightGrid->isValid()) mRightGrid->update(); QSize ls = mLeftGrid->sizeHint(); QSize rs = mRightGrid->sizeHint(); if (isHorizontal()) { return QSize(ls.width() + rs.width(), std::max(ls.height(), rs.height())); } else { return QSize(std::max(ls.width(), rs.width()), ls.height() + rs.height()); } } /************************************************ ************************************************/ void LXQtPanelLayout::setGeometry(const QRect &geometry) { if (!mLeftGrid->isValid()) mLeftGrid->update(); if (!mRightGrid->isValid()) mRightGrid->update(); QRect my_geometry{geometry}; my_geometry -= contentsMargins(); if (count()) { if (isHorizontal()) setGeometryHoriz(my_geometry); else setGeometryVert(my_geometry); } mAnimate = false; QLayout::setGeometry(my_geometry); } /************************************************ ************************************************/ void LXQtPanelLayout::setItemGeometry(QLayoutItem *item, const QRect &geometry, bool withAnimation) { Plugin *plugin = qobject_cast(item->widget()); if (withAnimation && plugin) { ItemMoveAnimation* animation = new ItemMoveAnimation(item); animation->setStartValue(item->geometry()); animation->setEndValue(geometry); animation->start(animation->DeleteWhenStopped); } else { item->setGeometry(geometry); } } /************************************************ ************************************************/ void LXQtPanelLayout::setGeometryHoriz(const QRect &geometry) { const bool visual_h_reversed = parentWidget() && parentWidget()->isRightToLeft(); // Calc expFactor for expandable plugins like TaskBar. double expFactor; { int expWidth = mLeftGrid->expandableSize() + mRightGrid->expandableSize(); int nonExpWidth = mLeftGrid->sizeHint().width() - mLeftGrid->expandableSize() + mRightGrid->sizeHint().width() - mRightGrid->expandableSize(); expFactor = expWidth ? ((1.0 * geometry.width() - nonExpWidth) / expWidth) : 1; } // Calc baselines for plugins like button. QList baseLines(std::max(mLeftGrid->colCount(), mRightGrid->colCount())); const int bh = geometry.height() / baseLines.count(); const int base_center = bh >> 1; const int height_remain = 0 < bh ? geometry.height() % baseLines.size() : 0; { int base = geometry.top(); for (auto i = baseLines.begin(), i_e = baseLines.end(); i_e != i; ++i, base += bh) { *i = base; } } #if 0 qDebug() << "** LXQtPanelLayout::setGeometryHoriz **************"; qDebug() << "geometry: " << geometry; qDebug() << "Left grid"; qDebug() << " cols:" << mLeftGrid->colCount() << " rows:" << mLeftGrid->rowCount(); qDebug() << " usedCols" << mLeftGrid->usedColCount(); qDebug() << "Right grid"; qDebug() << " cols:" << mRightGrid->colCount() << " rows:" << mRightGrid->rowCount(); qDebug() << " usedCols" << mRightGrid->usedColCount(); #endif // Left aligned plugins. int left=geometry.left(); for (int r=0; rrowCount(); ++r) { int rw = 0; int remain = height_remain; for (int c=0; cusedColCount(); ++c) { const LayoutItemInfo &info = mLeftGrid->itemInfo(r, c); if (info.item) { QRect rect; if (info.separate) { rect.setLeft(left); rect.setTop(geometry.top()); rect.setHeight(geometry.height()); if (info.expandable) rect.setWidth(info.geometry.width() * expFactor); else rect.setWidth(info.geometry.width()); } else { int height = bh + (0 < remain-- ? 1 : 0); if (!info.item->expandingDirections().testFlag(Qt::Orientation::Vertical)) height = std::min(info.geometry.height(), height); height = std::min(geometry.height(), height); rect.setHeight(height); rect.setWidth(std::min(info.geometry.width(), geometry.width())); if (height < bh) rect.moveCenter(QPoint(0, baseLines[c] + base_center)); else rect.moveTop(baseLines[c]); rect.moveLeft(left); } rw = std::max(rw, rect.width()); if (visual_h_reversed) rect.moveLeft(geometry.left() + geometry.right() - rect.x() - rect.width() + 1); setItemGeometry(info.item, rect, mAnimate); } } left += rw; } // Right aligned plugins. int right=geometry.right(); for (int r=mRightGrid->rowCount()-1; r>=0; --r) { int rw = 0; int remain = height_remain; for (int c=0; cusedColCount(); ++c) { const LayoutItemInfo &info = mRightGrid->itemInfo(r, c); if (info.item) { QRect rect; if (info.separate) { rect.setTop(geometry.top()); rect.setHeight(geometry.height()); if (info.expandable) rect.setWidth(info.geometry.width() * expFactor); else rect.setWidth(info.geometry.width()); rect.moveRight(right); } else { int height = bh + (0 < remain-- ? 1 : 0); if (!info.item->expandingDirections().testFlag(Qt::Orientation::Vertical)) height = std::min(info.geometry.height(), height); height = std::min(geometry.height(), height); rect.setHeight(height); rect.setWidth(std::min(info.geometry.width(), geometry.width())); if (height < bh) rect.moveCenter(QPoint(0, baseLines[c] + base_center)); else rect.moveTop(baseLines[c]); rect.moveRight(right); } rw = std::max(rw, rect.width()); if (visual_h_reversed) rect.moveLeft(geometry.left() + geometry.right() - rect.x() - rect.width() + 1); setItemGeometry(info.item, rect, mAnimate); } } right -= rw; } } /************************************************ ************************************************/ void LXQtPanelLayout::setGeometryVert(const QRect &geometry) { const bool visual_h_reversed = parentWidget() && parentWidget()->isRightToLeft(); // Calc expFactor for expandable plugins like TaskBar. double expFactor; { int expHeight = mLeftGrid->expandableSize() + mRightGrid->expandableSize(); int nonExpHeight = mLeftGrid->sizeHint().height() - mLeftGrid->expandableSize() + mRightGrid->sizeHint().height() - mRightGrid->expandableSize(); expFactor = expHeight ? ((1.0 * geometry.height() - nonExpHeight) / expHeight) : 1; } // Calc baselines for plugins like button. QList baseLines(std::max(mLeftGrid->colCount(), mRightGrid->colCount())); const int bw = geometry.width() / baseLines.count(); const int base_center = bw >> 1; const int width_remain = 0 < bw ? geometry.width() % baseLines.size() : 0; { int base = geometry.left(); for (auto i = baseLines.begin(), i_e = baseLines.end(); i_e != i; ++i, base += bw) { *i = base; } } #if 0 qDebug() << "** LXQtPanelLayout::setGeometryVert **************"; qDebug() << "geometry: " << geometry; qDebug() << "Left grid"; qDebug() << " cols:" << mLeftGrid->colCount() << " rows:" << mLeftGrid->rowCount(); qDebug() << " usedCols" << mLeftGrid->usedColCount(); qDebug() << "Right grid"; qDebug() << " cols:" << mRightGrid->colCount() << " rows:" << mRightGrid->rowCount(); qDebug() << " usedCols" << mRightGrid->usedColCount(); #endif // Top aligned plugins. int top=geometry.top(); for (int r=0; rrowCount(); ++r) { int rh = 0; int remain = width_remain; for (int c=0; cusedColCount(); ++c) { const LayoutItemInfo &info = mLeftGrid->itemInfo(r, c); if (info.item) { QRect rect; if (info.separate) { rect.moveTop(top); rect.setLeft(geometry.left()); rect.setWidth(geometry.width()); if (info.expandable) rect.setHeight(info.geometry.height() * expFactor); else rect.setHeight(info.geometry.height()); } else { rect.setHeight(std::min(info.geometry.height(), geometry.height())); int width = bw + (0 < remain-- ? 1 : 0); if (!info.item->expandingDirections().testFlag(Qt::Orientation::Horizontal)) width = std::min(info.geometry.width(), width); width = std::min(geometry.width(), width); rect.setWidth(width); if (width < bw) rect.moveCenter(QPoint(baseLines[c] + base_center, 0)); else rect.moveLeft(baseLines[c]); rect.moveTop(top); } rh = std::max(rh, rect.height()); if (visual_h_reversed) rect.moveLeft(geometry.left() + geometry.right() - rect.x() - rect.width() + 1); setItemGeometry(info.item, rect, mAnimate); } } top += rh; } // Bottom aligned plugins. int bottom=geometry.bottom(); for (int r=mRightGrid->rowCount()-1; r>=0; --r) { int rh = 0; int remain = width_remain; for (int c=0; cusedColCount(); ++c) { const LayoutItemInfo &info = mRightGrid->itemInfo(r, c); if (info.item) { QRect rect; if (info.separate) { rect.setLeft(geometry.left()); rect.setWidth(geometry.width()); if (info.expandable) rect.setHeight(info.geometry.height() * expFactor); else rect.setHeight(info.geometry.height()); rect.moveBottom(bottom); } else { rect.setHeight(std::min(info.geometry.height(), geometry.height())); int width = bw + (0 < remain-- ? 1 : 0); if (!info.item->expandingDirections().testFlag(Qt::Orientation::Horizontal)) width = std::min(info.geometry.width(), width); width = std::min(geometry.width(), width); rect.setWidth(width); if (width < bw) rect.moveCenter(QPoint(baseLines[c] + base_center, 0)); else rect.moveLeft(baseLines[c]); rect.moveBottom(bottom); } rh = std::max(rh, rect.height()); if (visual_h_reversed) rect.moveLeft(geometry.left() + geometry.right() - rect.x() - rect.width() + 1); setItemGeometry(info.item, rect, mAnimate); } } bottom -= rh; } } /************************************************ ************************************************/ void LXQtPanelLayout::invalidate() { mLeftGrid->invalidate(); mRightGrid->invalidate(); mMinPluginSize = QSize(); QLayout::invalidate(); } /************************************************ ************************************************/ int LXQtPanelLayout::lineCount() const { return mLeftGrid->colCount(); } /************************************************ ************************************************/ void LXQtPanelLayout::setLineCount(int value) { mLeftGrid->setColCount(value); mRightGrid->setColCount(value); invalidate(); } /************************************************ ************************************************/ void LXQtPanelLayout::rebuild() { mLeftGrid->rebuild(); mRightGrid->rebuild(); } /************************************************ ************************************************/ int LXQtPanelLayout::lineSize() const { return mLeftGrid->lineSize(); } /************************************************ ************************************************/ void LXQtPanelLayout::setLineSize(int value) { mLeftGrid->setLineSize(value); mRightGrid->setLineSize(value); invalidate(); } /************************************************ ************************************************/ void LXQtPanelLayout::setPosition(ILXQtPanel::Position value) { mPosition = value; mLeftGrid->setHoriz(isHorizontal()); mRightGrid->setHoriz(isHorizontal()); } /************************************************ ************************************************/ bool LXQtPanelLayout::isHorizontal() const { return mPosition == ILXQtPanel::PositionTop || mPosition == ILXQtPanel::PositionBottom; } /************************************************ ************************************************/ bool LXQtPanelLayout::itemIsSeparate(QLayoutItem *item) { if (!item) return true; Plugin *p = qobject_cast(item->widget()); if (!p) return true; return p->isSeparate(); } /************************************************ ************************************************/ void LXQtPanelLayout::startMovePlugin() { Plugin *plugin = qobject_cast(sender()); if (plugin) { // We have not memoryleaks there. // The processor will be automatically deleted when stopped. PluginMoveProcessor *moveProcessor = new PluginMoveProcessor(this, plugin); moveProcessor->start(); connect(moveProcessor, &PluginMoveProcessor::finished, this, &LXQtPanelLayout::finishMovePlugin); } } /************************************************ ************************************************/ void LXQtPanelLayout::finishMovePlugin() { PluginMoveProcessor *moveProcessor = qobject_cast(sender()); if (moveProcessor) { Plugin *plugin = moveProcessor->plugin(); int n = indexOf(plugin); plugin->setAlignment(ncount() ? Plugin::AlignLeft : Plugin::AlignRight); emit pluginMoved(plugin); } } /************************************************ ************************************************/ void LXQtPanelLayout::moveUpPlugin(Plugin * plugin) { const int i = indexOf(plugin); if (0 < i) moveItem(i, i - 1, true); } /************************************************ ************************************************/ void LXQtPanelLayout::addPlugin(Plugin * plugin) { connect(plugin, &Plugin::startMove, this, &LXQtPanelLayout::startMovePlugin); const int prev_count = count(); addWidget(plugin); //check actual position const int pos = indexOf(plugin); if (prev_count > pos) moveItem(pos, prev_count, false); } ================================================ FILE: panel/lxqtpanellayout.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANELLAYOUT_H #define LXQTPANELLAYOUT_H #include #include #include #include #include "ilxqtpanel.h" #include "lxqtpanelglobals.h" class MoveInfo; class QMouseEvent; class QEvent; class Plugin; class LayoutItemGrid; class LXQT_PANEL_API LXQtPanelLayout : public QLayout { Q_OBJECT public: explicit LXQtPanelLayout(QWidget *parent); ~LXQtPanelLayout(); void addItem(QLayoutItem *item); QLayoutItem *itemAt(int index) const; QLayoutItem *takeAt(int index); int count() const; void moveItem(int from, int to, bool withAnimation=false); QSize sizeHint() const; //QSize minimumSize() const; void setGeometry(const QRect &geometry); bool isHorizontal() const; void invalidate(); int lineCount() const; void setLineCount(int value); int lineSize() const; void setLineSize(int value); ILXQtPanel::Position position() const { return mPosition; } void setPosition(ILXQtPanel::Position value); /*! \brief Force the layout to re-read items/plugins "static" configuration */ void rebuild(); static bool itemIsSeparate(QLayoutItem *item); signals: void pluginMoved(Plugin * plugin); public slots: void startMovePlugin(); void finishMovePlugin(); void moveUpPlugin(Plugin * plugin); void addPlugin(Plugin * plugin); private: mutable QSize mMinPluginSize; LayoutItemGrid *mLeftGrid; LayoutItemGrid *mRightGrid; ILXQtPanel::Position mPosition; bool mAnimate; void setGeometryHoriz(const QRect &geometry); void setGeometryVert(const QRect &geometry); void globalIndexToLocal(int index, LayoutItemGrid **grid, int *gridIndex); void globalIndexToLocal(int index, LayoutItemGrid **grid, int *gridIndex) const; void setItemGeometry(QLayoutItem *item, const QRect &geometry, bool withAnimation); }; #endif // LXQTPANELLAYOUT_H ================================================ FILE: panel/lxqtpanellimits.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Luís Pereira * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANELLIMITS_H #define LXQTPANELLIMITS_H #define PANEL_DEFAULT_SIZE 32 #define PANEL_MINIMUM_SIZE 16 #define PANEL_MAXIMUM_SIZE 200 #define PANEL_HIDE_SIZE 4 #define PANEL_DEFAULT_ICON_SIZE 22 #define PANEL_DEFAULT_LINE_COUNT 1 #define PANEL_DEFAULT_BACKGROUND_COLOR "#CCCCCC" #define PANEL_HIDE_DELAY 500 #define PANEL_HIDE_FIRST_TIME (5000 - PANEL_HIDE_DELAY) #define PANEL_SHOW_DELAY 0 #define SETTINGS_SAVE_DELAY 3000 #endif // LXQTPANELLIMITS_H ================================================ FILE: panel/lxqtpanelpluginconfigdialog.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtpanelpluginconfigdialog.h" #include #include #include #include /************************************************ ************************************************/ LXQtPanelPluginConfigDialog::LXQtPanelPluginConfigDialog(PluginSettings &settings, QWidget *parent) : QDialog(parent), mSettings(settings) { } /************************************************ ************************************************/ LXQtPanelPluginConfigDialog::~LXQtPanelPluginConfigDialog() = default; /************************************************ ************************************************/ PluginSettings& LXQtPanelPluginConfigDialog::settings() const { return mSettings; } /************************************************ ************************************************/ void LXQtPanelPluginConfigDialog::closeEvent(QCloseEvent *event) { mSettings.storeToCache(); return QDialog::closeEvent(event); } /************************************************ ************************************************/ void LXQtPanelPluginConfigDialog::dialogButtonsAction(QAbstractButton *btn) { QDialogButtonBox *box = qobject_cast(btn->parent()); if (box && box->buttonRole(btn) == QDialogButtonBox::ResetRole) { mSettings.loadFromCache(); loadSettings(); } else { close(); } } /************************************************ ************************************************/ void LXQtPanelPluginConfigDialog::setComboboxIndexByData(QComboBox *comboBox, const QVariant &data, int defaultIndex) const { int index = comboBox ->findData(data); if (index < 0) index = defaultIndex; comboBox->setCurrentIndex(index); } ================================================ FILE: panel/lxqtpanelpluginconfigdialog.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANELPLUGINCONFIGDIALOG_H #define LXQTPANELPLUGINCONFIGDIALOG_H #include #include #include "lxqtpanelglobals.h" #include "pluginsettings.h" class QComboBox; class QCloseEvent; class LXQT_PANEL_API LXQtPanelPluginConfigDialog : public QDialog { Q_OBJECT public: explicit LXQtPanelPluginConfigDialog(PluginSettings &settings, QWidget *parent = nullptr); explicit LXQtPanelPluginConfigDialog(PluginSettings *settings, QWidget *parent = nullptr) : LXQtPanelPluginConfigDialog(*settings, parent) {} virtual ~LXQtPanelPluginConfigDialog(); PluginSettings &settings() const; protected: virtual void closeEvent(QCloseEvent *event) override; protected slots: /* Saves settings in conf file. */ virtual void loadSettings() = 0; virtual void dialogButtonsAction(QAbstractButton *btn); protected: void setComboboxIndexByData(QComboBox *comboBox, const QVariant &data, int defaultIndex = 0) const; private: PluginSettings &mSettings; }; #endif // LXQTPANELPLUGINCONFIGDIALOG_H ================================================ FILE: panel/main.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtpanelapplication.h" /*! The lxqt-panel is the panel of LXQt. Usage: lxqt-panel [CONFIG_ID] CONFIG_ID Section name in config file ~/.config/lxqt-panel/panel.conf (default main) */ int main(int argc, char *argv[]) { LXQtPanelApplication app(argc, argv); return app.exec(); } ================================================ FILE: panel/man/lxqt-panel.1 ================================================ .TH lxqt-panel "1" "August 2025" "LXQt 2.3.0" "LXQt Panel Module" .SH NAME lxqt-panel \- Desktop panel for \fBLXQt\fR: The Lightweight Qt Desktop Environment .SH SYNOPSIS .B lxqt-panel [OPTION] .br .SH OPTIONS -h, --help Displays help on commandline options. .br --help-all Displays help, including generic Qt options. .br -v, --version Displays version information. .br -c, --config, --configfile Use specific configuration file. .SH DESCRIPTION This module adds one or more panel(s) with optional plugins to the desktop. .SH BEHAVIOR Under LXQt the panel module is started automatically and by default a horizontal bottom panel is created on the desktop, containing several plugins: fancymenu, desktopswitch, quicklaunch, taskbar, statusnotifier, tray, mount, volume, worldclock, showdesktop. .P The panel can be run independently of \fBLXQt\fR, autostarted at logon. .SH CONFIGURATION Position, alignment, size, autohide, transparency (requires compositor), and other attributes are configurable by right click. .P The panel is comprised of plugins which provide a visual widget. They can be added, moved or removed in the panel widget settings and by right click menu on the widget itself. .SH "REPORTING BUGS" Report bugs to https://github.com/lxqt/lxqt-panel/issues .SH "SEE ALSO" .\" any module must refer to the session application, for module overview and initiation \fBlxqt-session.1\fR General LXQt overview .P \fBlxqt-config-session.1\fR Session Settings .P \fBlxqt-config.1\fR LXQt Configuration Center .P ================================================ FILE: panel/panelpluginsmodel.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "panelpluginsmodel.h" #include "plugin.h" #include "ilxqtpanelplugin.h" #include "lxqtpanelapplication.h" #include #include #include #include PanelPluginsModel::PanelPluginsModel(LXQtPanel * panel, LXQt::Settings * settings, QString const & namesKey, QStringList const & desktopDirs, QObject * parent/* = nullptr*/) : QAbstractListModel{parent}, mNamesKey(namesKey), mPanelSettings(settings) { loadPlugins(panel, desktopDirs); } PanelPluginsModel::~PanelPluginsModel() { qDeleteAll(plugins()); } int PanelPluginsModel::rowCount(const QModelIndex & parent/* = QModelIndex()*/) const { return QModelIndex() == parent ? mPlugins.size() : 0; } QVariant PanelPluginsModel::data(const QModelIndex & index, int role/* = Qt::DisplayRole*/) const { Q_ASSERT(QModelIndex() == index.parent() && 0 == index.column() && mPlugins.size() > index.row() ); pluginslist_t::const_reference plugin = mPlugins[index.row()]; QVariant ret; switch (role) { case Qt::DisplayRole: if (plugin.second.isNull()) ret = QStringLiteral("Unknown (%1)").arg(plugin.first); else ret = QStringLiteral("%1 (%2)").arg(plugin.second->name(), plugin.first); break; case Qt::DecorationRole: if (plugin.second.isNull()) ret = XdgIcon::fromTheme(QStringLiteral("preferences-plugin")); else ret = plugin.second->desktopFile().icon(XdgIcon::fromTheme(QStringLiteral("preferences-plugin"))); break; case Qt::UserRole: ret = QVariant::fromValue(const_cast(plugin.second.data())); break; } return ret; } Qt::ItemFlags PanelPluginsModel::flags(const QModelIndex & index) const { if (!index.isValid()) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemNeverHasChildren | Qt::ItemIsDropEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemNeverHasChildren | Qt::ItemIsDragEnabled; } QStringList PanelPluginsModel::pluginNames() const { QStringList names; for (auto const & p : mPlugins) names.append(p.first); return names; } QList PanelPluginsModel::plugins() const { QList plugins; for (auto const & p : mPlugins) if (!p.second.isNull()) plugins.append(p.second.data()); return plugins; } Plugin* PanelPluginsModel::pluginByName(QString name) const { for (auto const & p : mPlugins) if (p.first == name) return p.second.data(); return nullptr; } Plugin const * PanelPluginsModel::pluginByID(QString id) const { for (auto const & p : mPlugins) { Plugin *plugin = p.second.data(); if (plugin && plugin->desktopFile().id() == id) return plugin; } return nullptr; } void PanelPluginsModel::addPlugin(LXQtPanel * panel, const LXQt::PluginInfo &desktopFile) { if (dynamic_cast(qApp)->isPluginSingletonAndRunning(desktopFile.id())) return; QString name = findNewPluginSettingsGroup(desktopFile.id()); QPointer plugin = loadPlugin(panel, desktopFile, name); if (plugin.isNull()) return; beginInsertRows(QModelIndex(), mPlugins.size(), mPlugins.size()); mPlugins.append({name, plugin}); endInsertRows(); mPanelSettings->setValue(mNamesKey, pluginNames()); emit pluginAdded(plugin.data()); } void PanelPluginsModel::removePlugin(pluginslist_t::iterator plugin) { if (mPlugins.end() != plugin) { mPanelSettings->remove(plugin->first); Plugin * p = plugin->second.data(); const int row = plugin - mPlugins.begin(); beginRemoveRows(QModelIndex(), row, row); mPlugins.erase(plugin); endRemoveRows(); emit pluginRemoved(p); // p can be nullptr mPanelSettings->setValue(mNamesKey, pluginNames()); if (nullptr != p) p->deleteLater(); } } void PanelPluginsModel::removePlugin() { Plugin * p = qobject_cast(sender()); auto plugin = std::find_if(mPlugins.begin(), mPlugins.end(), [p] (pluginslist_t::const_reference obj) { return p == obj.second; }); removePlugin(std::move(plugin)); } void PanelPluginsModel::movePlugin(Plugin * plugin, QString const & nameAfter) { //merge list of plugins (try to preserve original position) //subtract mPlugin.begin() from the found Plugins to get the model index const int from = std::find_if(mPlugins.begin(), mPlugins.end(), [plugin] (pluginslist_t::const_reference obj) { return plugin == obj.second.data(); }) - mPlugins.begin(); const int to = std::find_if(mPlugins.begin(), mPlugins.end(), [nameAfter] (pluginslist_t::const_reference obj) { return nameAfter == obj.first; }) - mPlugins.begin(); if (from != movePlugin(from, to)) emit pluginMoved(plugin); } int PanelPluginsModel::movePlugin(const int from, int to) { if (to > mPlugins.size()) to = mPlugins.size(); /* 'from' is the current position of the Plugin to be moved ("moved Plugin"), * 'to' is the position of the Plugin behind the one that is being moved * ("behind Plugin"). There are several cases to distinguish: * 1. from > to: The moved Plugin had been behind the behind Plugin before * and is moved to the front of the behind Plugin. The moved Plugin will * be inserted at position 'to', the behind Plugin and all the following * Plugins (until the former position of the moved Plugin) will increment * their indexes. * 2. from < to: The moved Plugin had already been located before the * behind Plugin. In this case, the move operation only reorders the * Plugins before the behind Plugin. All the Plugins between the moved * Plugin and the behind Plugin will decrement their index. Therefore, the * movedPlugin will not be at position 'to' but rather on position 'to-1'. * 3. from == to: This does not make sense, we catch this case to prevent * errors. * 4. from == to-1: The moved Plugin has not moved because it had already * been located in front of the behind Plugin. */ const int to_plugins = from < to ? to - 1 : to; if (from != to && from != to_plugins) { /* Although the new position of the moved Plugin will be 'to-1' if * from < to, we insert 'to' here. This is exactly how it is done * in the Qt documentation. */ beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); // For the QList::move method, use the right position mPlugins.move(from, to_plugins); endMoveRows(); mPanelSettings->setValue(mNamesKey, pluginNames()); return to_plugins; } return from; } Qt::DropActions PanelPluginsModel::supportedDropActions() const { return Qt::MoveAction; } bool PanelPluginsModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) { const auto sourceIndex = index(sourceRow); if (sourceParent == destinationParent && count == 1 && sourceIndex.isValid() && destinationChild >= 0 && destinationChild <= mPlugins.size()) { const auto dest = movePlugin(sourceRow, destinationChild); if (sourceRow != dest) { pluginslist_t::const_reference moved_plugin = mPlugins[dest]; emit pluginMoved(moved_plugin.second); if (!moved_plugin.second.isNull()) { if (sourceRow < dest) { // moved downwards for (int row = sourceRow; row < dest; ++row) { pluginslist_t::const_reference after_plugin = mPlugins[row]; //emit signal for layout only in case plugin is loaded/displayed if (!after_plugin.second.isNull()) emit pluginMovedUp(after_plugin.second.data()); } } else { // moved upwards for (int row = sourceRow; row > dest; --row) { pluginslist_t::const_reference before_plugin = mPlugins[row]; //emit signal for layout only in case plugin is loaded/displayed if (!before_plugin.second.isNull()) emit pluginMovedUp(moved_plugin.second.data()); } } } return true; } } return false; } void PanelPluginsModel::loadPlugins(LXQtPanel * panel, QStringList const & desktopDirs) { QStringList plugin_names = mPanelSettings->value(mNamesKey).toStringList(); #ifdef DEBUG_PLUGIN_LOADTIME QElapsedTimer timer; timer.start(); qint64 lastTime = 0; #endif for (auto const & name : std::as_const(plugin_names)) { pluginslist_t::iterator i = mPlugins.insert(mPlugins.end(), {name, nullptr}); QString type = mPanelSettings->value(name + QStringLiteral("/type")).toString(); if (type.isEmpty()) { qWarning() << QStringLiteral("Section \"%1\" not found in %2.").arg(name, mPanelSettings->fileName()); continue; } #ifdef WITH_SCREENSAVER_FALLBACK if (QStringLiteral("screensaver") == type) { //plugin-screensaver was dropped //convert settings to plugin-quicklaunch const QString & lock_desktop = QStringLiteral(LXQT_LOCK_DESKTOP); qWarning().noquote() << "Found deprecated plugin of type 'screensaver', migrating to 'quicklaunch' with '" << lock_desktop << '\''; type = QStringLiteral("quicklaunch"); mPanelSettings->beginGroup(name); mPanelSettings->remove(QString{});//remove all existing keys mPanelSettings->setValue(QStringLiteral("type"), type); mPanelSettings->beginWriteArray(QStringLiteral("apps"), 1); mPanelSettings->setArrayIndex(0); mPanelSettings->setValue(QStringLiteral("desktop"), lock_desktop); mPanelSettings->endArray(); mPanelSettings->endGroup(); } #endif LXQt::PluginInfoList list = LXQt::PluginInfo::search(desktopDirs, QStringLiteral("LXQtPanel/Plugin"), QStringLiteral("%1.desktop").arg(type)); if( !list.count()) { qWarning() << QStringLiteral("Plugin \"%1\" not found.").arg(type); continue; } i->second = loadPlugin(panel, list.first(), name); #ifdef DEBUG_PLUGIN_LOADTIME qDebug() << "load plugin" << type << "takes" << (timer.elapsed() - lastTime) << "ms"; lastTime = timer.elapsed(); #endif } } QPointer PanelPluginsModel::loadPlugin(LXQtPanel * panel, LXQt::PluginInfo const & desktopFile, QString const & settingsGroup) { std::unique_ptr plugin(new Plugin(desktopFile, mPanelSettings, settingsGroup, panel)); if (plugin->isLoaded()) { connect(plugin.get(), &Plugin::remove, this, static_cast(&PanelPluginsModel::removePlugin)); return plugin.release(); } return nullptr; } QString PanelPluginsModel::findNewPluginSettingsGroup(const QString &pluginType) const { QStringList groups = mPanelSettings->childGroups(); groups.sort(); // Generate new section name QString pluginName = QStringLiteral("%1").arg(pluginType); if (!groups.contains(pluginName)) return pluginName; else { for (int i = 2; true; ++i) { pluginName = QStringLiteral("%1%2").arg(pluginType).arg(i); if (!groups.contains(pluginName)) return pluginName; } } } bool PanelPluginsModel::isIndexValid(QModelIndex const & index) const { return index.isValid() && QModelIndex() == index.parent() && 0 == index.column() && mPlugins.size() > index.row(); } void PanelPluginsModel::onMovePluginUp(QModelIndex const & index) { if (!isIndexValid(index)) return; const int row = index.row(); if (0 >= row) return; //can't move up beginMoveRows(QModelIndex(), row, row, QModelIndex(), row - 1); mPlugins.swapItemsAt(row - 1, row); endMoveRows(); pluginslist_t::const_reference moved_plugin = mPlugins[row - 1]; pluginslist_t::const_reference prev_plugin = mPlugins[row]; emit pluginMoved(moved_plugin.second.data()); //emit signal for layout only in case both plugins are loaded/displayed if (!moved_plugin.second.isNull() && !prev_plugin.second.isNull()) emit pluginMovedUp(moved_plugin.second.data()); mPanelSettings->setValue(mNamesKey, pluginNames()); } void PanelPluginsModel::onMovePluginDown(QModelIndex const & index) { if (!isIndexValid(index)) return; const int row = index.row(); if (mPlugins.size() <= row + 1) return; //can't move down beginMoveRows(QModelIndex(), row, row, QModelIndex(), row + 2); mPlugins.swapItemsAt(row, row + 1); endMoveRows(); pluginslist_t::const_reference moved_plugin = mPlugins[row + 1]; pluginslist_t::const_reference next_plugin = mPlugins[row]; emit pluginMoved(moved_plugin.second.data()); //emit signal for layout only in case both plugins are loaded/displayed if (!moved_plugin.second.isNull() && !next_plugin.second.isNull()) emit pluginMovedUp(next_plugin.second.data()); mPanelSettings->setValue(mNamesKey, pluginNames()); } void PanelPluginsModel::onConfigurePlugin(QModelIndex const & index) { if (!isIndexValid(index)) return; Plugin * const plugin = mPlugins[index.row()].second.data(); if (nullptr != plugin && (ILXQtPanelPlugin::HaveConfigDialog & plugin->iPlugin()->flags())) plugin->showConfigureDialog(); } void PanelPluginsModel::onRemovePlugin(QModelIndex const & index) { if (!isIndexValid(index)) return; auto plugin = mPlugins.begin() + index.row(); if (plugin->second.isNull()) removePlugin(std::move(plugin)); else plugin->second->requestRemove(); } ================================================ FILE: panel/panelpluginsmodel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PANELPLUGINSMODEL_H #define PANELPLUGINSMODEL_H #include namespace LXQt { class PluginInfo; struct PluginData; class Settings; } class LXQtPanel; class Plugin; /*! * \brief The PanelPluginsModel class implements the Model part of the * Qt Model/View architecture for the Plugins, i.e. it is the interface * to access the Plugin data associated with this Panel. The * PanelPluginsModel takes care for read-access as well as changes * like adding, removing or moving Plugins. */ class PanelPluginsModel : public QAbstractListModel { Q_OBJECT public: PanelPluginsModel(LXQtPanel * panel, LXQt::Settings * settings, QString const & namesKey, QStringList const & desktopDirs, QObject * parent = nullptr); ~PanelPluginsModel(); /*! * \brief rowCount returns the number of Plugins. It overrides/implements * QAbstractListModel::rowCount(). * \param parent The parameter parent should be omitted to get the number of * Plugins. If it is given and a valid model index, the method returns 0 * because PanelPluginsModel is not a hierarchical model. */ virtual int rowCount(const QModelIndex & parent = QModelIndex()) const override; /*! * \brief data returns the Plugin data as defined by the Model/View * architecture. The Plugins itself can be accessed with the role * Qt::UserRole but they can also be accessed by the methods plugins(), * pluginByName() and pluginByID(). This method overrides/implements * QAbstractListModel::data(). * \param index should be a valid model index to determine the Plugin * that should be read. * \param role The Qt::ItemDataRole to determine what kind of data should * be read, can be one of the following: * 1. Qt::DisplayRole to return a string that describes the Plugin. * 2. Qt::DecorationRole to return an icon for the Plugin. * 3. Qt::UserRole to return a Plugin*. * \return The data as determined by index and role. */ virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; /*! * \brief flags returns the item flags for the given model index. For * all Plugins, this is the same: * Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemNeverHasChildren. */ virtual Qt::ItemFlags flags(const QModelIndex & index) const override; /*! * \brief pluginNames returns a list of names for all the Plugins in * this panel. The names are not the human-readable names but the names * that are used to identify the Plugins, e.g. in the config files. These * names can be used in the method pluginByName() to get a corresponding * Plugin. * * The plugin names are normally chosen to be equal to the * filename of the corresponding *.desktop-file. If multiple instances * of a single plugin-type are created, their names are created by * appending increasing numbers, e.g. 'mainmenu' and 'mainmenu2'. * * \sa findNewPluginSettingsGroup */ QStringList pluginNames() const; /*! * \brief plugins returns a list of Plugins in this panel. */ QList plugins() const; /*! * \brief pluginByName gets a Plugin by its name. * \param name is the name of the plugin as it is used in the * config files. A list of names can be retrieved with the * method pluginNames(). * \return the Plugin with the given name. * * \sa pluginNames */ Plugin *pluginByName(QString name) const; /*! * \brief pluginByID gets a Plugin by its ID. * \param id is the *.desktop-file-ID of the plugin which in turn is the * QFileInfo::completeBaseName() of the desktop-file, e.g. "mainmenu". * * As these IDs are chosen according to the corresponding * desktop-file, these IDs are not unique. If multiple * instances of a single plugin-type are created, they share * the same ID in this sense. Then, this method will return * the first plugin of the given type. * \return the first Plugin found with the given ID. */ Plugin const *pluginByID(QString id) const; /*! * \brief movePlugin moves a Plugin in the underlying data. * * This method is useful whenever a Plugin should be moved several * positions at once. If a Plugin should only be moved one position * up or down, consider using onMovePluginUp or onMovePluginDown. * * \param plugin Plugin that has been moved * \param nameAfter name of the Plugin that should be located after * the moved Plugin after the move operation, so this parameter * determines the new position of plugin. If an empty string is * given, plugin will be moved to the end of the list. * * \note This method is especially useful for drag and drop reordering. * Therefore, it will be called whenever the user moves a Plugin in * the panel ("Move Plugin" in the context menu of the panel). * * \sa onMovePluginUp, onMovePluginDown */ void movePlugin(Plugin * plugin, QString const & nameAfter); Qt::DropActions supportedDropActions() const override; bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; signals: /*! * \brief pluginAdded gets emitted whenever a new Plugin is added * to the panel. */ void pluginAdded(Plugin * plugin); /*! * \brief pluginRemoved gets emitted whenever a Plugin is removed. * \param plugin The Plugin that was removed. This could be a nullptr. */ void pluginRemoved(Plugin * plugin); /*! * \brief pluginMoved gets emitted whenever a Plugin is moved. * * This signal gets emitted in movePlugin, onMovePluginUp and * onMovePluginDown. * * \param plugin The Plugin that was moved. This could be a nullptr. * * \sa pluginMovedUp */ void pluginMoved(Plugin * plugin); //plugin can be nullptr in case of move of not loaded plugin /*! * \brief pluginMovedUp gets emitted whenever a Plugin is moved a single * slot upwards. * * When a Plugin is moved a single slot upwards, this signal will be * emitted additionally to the pluginMoved signal so that two signals * get emitted. * * If a Plugin is moved downwards, that Plugin will swap places with * the following Plugin so that the result equals moving the following * Plugin a single slot upwards. So, whenever two adjacent Plugins * swap their places, this signal gets emitted with the Plugin that * moves upwards as parameter. * * For simplified use, only this signal is implemented. There is no * similar pluginMovedDown-signal. * * This signal gets emitted from onMovePluginUp and onMovePluginDown. * * \param plugin The Plugin that moved a slot upwards. * * \sa pluginMoved */ void pluginMovedUp(Plugin * plugin); public slots: /*! * \brief addPlugin Adds a new Plugin to the model. * * \param panel The parent panel of the plugin * \param desktopFile The PluginInfo (which inherits XdgDesktopFile) * for the Plugin that should be added. * * \note AddPluginDialog::pluginSelected is connected to this slot. */ void addPlugin(LXQtPanel * panel, const LXQt::PluginInfo &desktopFile); /*! * \brief removePlugin Removes a Plugin from the model. * * The Plugin to remove is identified by the QObject::sender() method * when the slot is called. Therefore, this method should only be called * by connecting a signal that a Plugin will emit to this slot. * Otherwise, nothing will happen. * * \note Plugin::remove is connected to this slot as soon as the * Plugin is loaded in the PanelPluginsModel. */ void removePlugin(); // slots for configuration dialog /*! * \brief onMovePluginUp Moves the Plugin corresponding to the given * model index a slot upwards. * * \note The 'Up' button in the configuration widget is connected to this * slot. */ void onMovePluginUp(QModelIndex const & index); /*! * \brief onMovePluginDown Moves the Plugin corresponding to the given * model index a slot downwards. * * \note The 'Down' button in the configuration widget is connected to this * slot. */ void onMovePluginDown(QModelIndex const & index); /*! * \brief onConfigurePlugin If the Plugin corresponding to the given * model index has a config dialog (checked via the flag * ILXQtPanelPlugin::HaveConfigDialog), this method shows * it by calling plugin->showConfigureDialog(). * * \note The 'Configure' button in the configuration widget is connected to * this slot. */ void onConfigurePlugin(QModelIndex const & index); /*! * \brief onRemovePlugin Removes the Plugin corresponding to the given * model index from the Model. * * \note The 'Remove' button in the configuration widget is connected to * this slot. */ void onRemovePlugin(QModelIndex const & index); private: /*! * \brief pluginslist_t is the data type used for mPlugins which stores * all the Plugins. * * \sa mPlugins */ typedef QList > > pluginslist_t; private: /*! * \brief loadPlugins Loads all the Plugins. * \param panel The parent panel of these plugins * \param desktopDirs These directories are scanned for corresponding * .desktop-files which are necessary to load the plugins. */ void loadPlugins(LXQtPanel * panel, QStringList const & desktopDirs); /*! * \brief loadPlugin Loads a Plugin and connects signals and slots. * \param panel The parent panel of the plugin * \param desktopFile The desktop file that specifies how to load the * Plugin. * \param settingsGroup QString which specifies the settings group. This * will only be redirected to the Plugin so that it knows how to read * its settings. * \return A QPointer to the Plugin that was loaded. */ QPointer loadPlugin(LXQtPanel * panel, LXQt::PluginInfo const & desktopFile, QString const & settingsGroup); /*! * \brief findNewPluginSettingsGroup Creates a name for a new Plugin * that is not yet present in the settings file. Whenever multiple * instances of a single Plugin type are created, they have to be * distinguished by this name. * * The first Plugin of a given type will be named like the type, e.g. * "mainmenu". If a name is already present, this method tries to * find a free name by appending increasing integers (starting with 2), * e.g. "mainmenu2". If, for example, only "mainmenu2" exists because * "mainmenu" was deleted, "mainmenu" would be returned. So, the method * always finds the first suitable name that is not yet present in the * settings file. * \param pluginType Type of the Plugin. * \return The created name for the Plugin. */ QString findNewPluginSettingsGroup(const QString &pluginType) const; /*! * \brief isIndexValid Checks if a given model index is valid for the * underlying data (column 0, row lower than number of Plugins and * so on). */ bool isIndexValid(QModelIndex const & index) const; /*! * \brief removePlugin Removes a given Plugin from the model. */ void removePlugin(pluginslist_t::iterator plugin); /*! * \brief movePlugin moves a Plugin in the underlying data. * * This method does the list reordering and calls all the needed * model methods to properly emit model signals etc. * * \param from index to move from * \param to index to move to (can be greater than the current last index) * \return index of the new position * * \note This method is the "real" implementation of the model's move * itself. Called by /sa movePlugin and /sa moveRows. */ int movePlugin(const int from, int to); /*! * \brief mNamesKey The key to the settings-entry that stores the * names of the Plugins in a panel. Set upon creation, passed as * a parameter by the panel. */ const QString mNamesKey; /*! * \brief mPlugins Stores all the Plugins. * * mPlugins is a QList of elements while each element corresponds to a * single Plugin. Each element is a std::pair of a QString and a QPointer * while the QPointer points to a Plugin. * * To access the elements, you can use indexing or an iterator on the * list. For each element p, p.first is the name of the Plugin as it * is used in the configuration files, p.second.data() is the Plugin. * * \sa pluginslist_t */ pluginslist_t mPlugins; /*! * \brief mPanelSettings Stores a reference to settings of LXQtPanel. */ LXQt::Settings * mPanelSettings; }; #endif // PANELPLUGINSMODEL_H ================================================ FILE: panel/plugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "plugin.h" #include "ilxqtpanelplugin.h" #include "pluginsettings_p.h" #include "lxqtpanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // statically linked built-in plugins #if defined(WITH_DESKTOPSWITCH_PLUGIN) #include "../plugin-desktopswitch/desktopswitch.h" // desktopswitch extern void * loadPluginTranslation_desktopswitch_helper; #endif #if defined(WITH_FANCYMENU_PLUGIN) #include "../plugin-fancymenu/lxqtfancymenu.h" // fancymenu extern void * loadPluginTranslation_fancymenu_helper; #endif #if defined(WITH_MAINMENU_PLUGIN) #include "../plugin-mainmenu/lxqtmainmenu.h" // mainmenu extern void * loadPluginTranslation_mainmenu_helper; #endif #if defined(WITH_QUICKLAUNCH_PLUGIN) #include "../plugin-quicklaunch/lxqtquicklaunchplugin.h" // quicklaunch extern void * loadPluginTranslation_quicklaunch_helper; #endif #if defined(WITH_SHOWDESKTOP_PLUGIN) #include "../plugin-showdesktop/showdesktop.h" // showdesktop extern void * loadPluginTranslation_showdesktop_helper; #endif #if defined(WITH_SPACER_PLUGIN) #include "../plugin-spacer/spacer.h" // spacer extern void * loadPluginTranslation_spacer_helper; #endif #if defined(WITH_STATUSNOTIFIER_PLUGIN) #include "../plugin-statusnotifier/statusnotifier.h" // statusnotifier extern void * loadPluginTranslation_statusnotifier_helper; #endif #if defined(WITH_TASKBAR_PLUGIN) #include "../plugin-taskbar/lxqttaskbarplugin.h" // taskbar extern void * loadPluginTranslation_taskbar_helper; #endif #if defined(WITH_TRAY_PLUGIN) #include "../plugin-tray/lxqttrayplugin.h" // tray extern void * loadPluginTranslation_tray_helper; #endif #if defined(WITH_WORLDCLOCK_PLUGIN) #include "../plugin-worldclock/lxqtworldclock.h" // worldclock extern void * loadPluginTranslation_worldclock_helper; #endif QColor Plugin::mMoveMarkerColor= QColor(255, 0, 0, 255); /************************************************ ************************************************/ Plugin::Plugin(const LXQt::PluginInfo &desktopFile, LXQt::Settings *settings, const QString &settingsGroup, LXQtPanel *panel) : QFrame(panel), mDesktopFile(desktopFile), mPluginLoader(nullptr), mPlugin(nullptr), mPluginWidget(nullptr), mAlignment(AlignLeft), mPanel(panel) { mSettings = PluginSettingsFactory::create(settings, settingsGroup); setWindowTitle(desktopFile.name()); mName = desktopFile.name(); QStringList dirs; dirs << QProcessEnvironment::systemEnvironment().value(QStringLiteral("LXQTPANEL_PLUGIN_PATH")).split(QStringLiteral(":")); dirs << QStringLiteral(PLUGIN_DIR); bool found = false; if(ILXQtPanelPluginLibrary const * pluginLib = findStaticPlugin(desktopFile.id())) { // this is a static plugin found = true; loadLib(pluginLib); } else { // this plugin is a dynamically loadable module QString baseName = QStringLiteral("lib%1.so").arg(desktopFile.id()); for(const QString &dirName : std::as_const(dirs)) { QFileInfo fi(QDir(dirName), baseName); if (fi.exists()) { found = true; if (loadModule(fi.absoluteFilePath())) break; } } } if (!isLoaded()) { if (!found) qWarning() << QStringLiteral("Plugin %1 not found in the").arg(desktopFile.id()) << dirs; return; } setObjectName(mPlugin->themeId() + QStringLiteral("Plugin")); // plugin handle for easy context menu setProperty("NeedsHandle", mPlugin->flags().testFlag(ILXQtPanelPlugin::NeedsHandle)); QString s = mSettings->value(QStringLiteral("alignment")).toString(); // Return default value if (s.isEmpty()) { mAlignment = (mPlugin->flags().testFlag(ILXQtPanelPlugin::PreferRightAlignment)) ? Plugin::AlignRight : Plugin::AlignLeft; } else { mAlignment = (s.toUpper() == QLatin1String("RIGHT")) ? Plugin::AlignRight : Plugin::AlignLeft; } if (mPluginWidget) { QGridLayout* layout = new QGridLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); layout->addWidget(mPluginWidget, 0, 0); } saveSettings(); // delay the connection to settingsChanged to avoid conflicts // while the plugin is still being initialized connect(mSettings, &PluginSettings::settingsChanged, this, &Plugin::settingsChanged); connect(mPanel, &LXQtPanel::realigned, this, &Plugin::realign); } /************************************************ ************************************************/ Plugin::~Plugin() { if (mConfigDialog) delete mConfigDialog.data(); delete mPlugin; delete mPluginLoader; delete mSettings; } void Plugin::setAlignment(Plugin::Alignment alignment) { mAlignment = alignment; saveSettings(); } /************************************************ ************************************************/ namespace { //helper types for static plugins storage & binary search typedef std::unique_ptr plugin_ptr_t; typedef std::tuple plugin_tuple_t; // NOTE: Please keep the plugins sorted by name while adding new plugins. // NOTE2: we need to reference some (dummy) symbol from (autogenerated) LXQtPluginTranslationLoader.cpp // to be not stripped (as unused/unreferenced) in static linking time static plugin_tuple_t const static_plugins[] = { #if defined(WITH_DESKTOPSWITCH_PLUGIN) std::make_tuple(QLatin1String("desktopswitch"), plugin_ptr_t{new DesktopSwitchPluginLibrary}, loadPluginTranslation_desktopswitch_helper), // desktopswitch #endif #if defined(WITH_FANCYMENU_PLUGIN) std::make_tuple(QLatin1String("fancymenu"), plugin_ptr_t{new LXQtFancyMenuPluginLibrary}, loadPluginTranslation_fancymenu_helper), // fancymenu #endif #if defined(WITH_MAINMENU_PLUGIN) std::make_tuple(QLatin1String("mainmenu"), plugin_ptr_t{new LXQtMainMenuPluginLibrary}, loadPluginTranslation_mainmenu_helper), // mainmenu #endif #if defined(WITH_QUICKLAUNCH_PLUGIN) std::make_tuple(QLatin1String("quicklaunch"), plugin_ptr_t{new LXQtQuickLaunchPluginLibrary}, loadPluginTranslation_quicklaunch_helper), // quicklaunch #endif #if defined(WITH_SHOWDESKTOP_PLUGIN) std::make_tuple(QLatin1String("showdesktop"), plugin_ptr_t{new ShowDesktopLibrary}, loadPluginTranslation_showdesktop_helper), // showdesktop #endif #if defined(WITH_SPACER_PLUGIN) std::make_tuple(QLatin1String("spacer"), plugin_ptr_t{new SpacerPluginLibrary}, loadPluginTranslation_spacer_helper), // spacer #endif #if defined(WITH_STATUSNOTIFIER_PLUGIN) std::make_tuple(QLatin1String("statusnotifier"), plugin_ptr_t{new StatusNotifierLibrary}, loadPluginTranslation_statusnotifier_helper), // statusnotifier #endif #if defined(WITH_TASKBAR_PLUGIN) std::make_tuple(QLatin1String("taskbar"), plugin_ptr_t{new LXQtTaskBarPluginLibrary}, loadPluginTranslation_taskbar_helper), // taskbar #endif #if defined(WITH_TRAY_PLUGIN) std::make_tuple(QLatin1String("tray"), plugin_ptr_t{new LXQtTrayPluginLibrary}, loadPluginTranslation_tray_helper), // tray #endif #if defined(WITH_WORLDCLOCK_PLUGIN) std::make_tuple(QLatin1String("worldclock"), plugin_ptr_t{new LXQtWorldClockLibrary}, loadPluginTranslation_worldclock_helper), // worldclock #endif }; static constexpr plugin_tuple_t const * const plugins_begin = static_plugins; static constexpr plugin_tuple_t const * const plugins_end = static_plugins + sizeof (static_plugins) / sizeof (static_plugins[0]); struct assert_helper { assert_helper() { Q_ASSERT(std::is_sorted(plugins_begin, plugins_end , [] (plugin_tuple_t const & p1, plugin_tuple_t const & p2) -> bool { return std::get<0>(p1) < std::get<0>(p2); })); } }; static assert_helper h; } ILXQtPanelPluginLibrary const * Plugin::findStaticPlugin(const QString &libraryName) { // find a static plugin library by name -> binary search plugin_tuple_t const * plugin = std::lower_bound(plugins_begin, plugins_end, libraryName , [] (plugin_tuple_t const & plugin, QString const & name) -> bool { return std::get<0>(plugin) < name; }); if (plugins_end != plugin && libraryName == std::get<0>(*plugin)) return std::get<1>(*plugin).get(); return nullptr; } // load a plugin from a library bool Plugin::loadLib(ILXQtPanelPluginLibrary const * pluginLib) { ILXQtPanelPluginStartupInfo startupInfo; startupInfo.settings = mSettings; startupInfo.desktopFile = &mDesktopFile; startupInfo.lxqtPanel = mPanel; mPlugin = pluginLib->instance(startupInfo); if (!mPlugin) { qWarning() << QStringLiteral("Can't load plugin \"%1\". Plugin can't build ILXQtPanelPlugin.").arg(mDesktopFile.id()); return false; } mPluginWidget = mPlugin->widget(); if (mPluginWidget) { mPluginWidget->setObjectName(mPlugin->themeId()); watchWidgets(mPluginWidget); } this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); return true; } // load dynamic plugin from a *.so module bool Plugin::loadModule(const QString &libraryName) { mPluginLoader = new QPluginLoader(libraryName); if (!mPluginLoader->load()) { qWarning() << mPluginLoader->errorString(); return false; } QObject *obj = mPluginLoader->instance(); if (!obj) { qWarning() << mPluginLoader->errorString(); return false; } ILXQtPanelPluginLibrary* pluginLib= qobject_cast(obj); if (!pluginLib) { qWarning() << QStringLiteral("Can't load plugin \"%1\". Plugin is not a ILXQtPanelPluginLibrary.").arg(mPluginLoader->fileName()); delete obj; return false; } return loadLib(pluginLib); } /************************************************ ************************************************/ void Plugin::watchWidgets(QObject * const widget) { // the QWidget might not be fully constructed yet, but we can rely on the isWidgetType() if (!widget->isWidgetType()) return; widget->installEventFilter(this); // watch also children (recursive) for (auto const & child : widget->children()) { watchWidgets(child); } } /************************************************ ************************************************/ void Plugin::unwatchWidgets(QObject * const widget) { widget->removeEventFilter(this); // unwatch also children (recursive) for (auto const & child : widget->children()) { unwatchWidgets(child); } } /************************************************ ************************************************/ void Plugin::settingsChanged() { mPlugin->settingsChanged(); } /************************************************ ************************************************/ void Plugin::saveSettings() { bool syncSettings = false; const QString alignment(mAlignment == AlignLeft ? QStringLiteral("Left") : QStringLiteral("Right")); if (mSettings->value(QStringLiteral("alignment")).toString() != alignment) { mSettings->setValue(QStringLiteral("alignment"), alignment); syncSettings = true; } if (mSettings->value(QStringLiteral("type")).toString() != mDesktopFile.id()) { mSettings->setValue(QStringLiteral("type"), mDesktopFile.id()); syncSettings = true; } if (syncSettings) mSettings->sync(); } /************************************************ ************************************************/ void Plugin::contextMenuEvent(QContextMenuEvent * event) { mPanel->showPopupMenu(event->globalPos(), this); } /************************************************ ************************************************/ void Plugin::mousePressEvent(QMouseEvent *event) { switch (event->button()) { case Qt::LeftButton: mPlugin->activated(ILXQtPanelPlugin::Trigger); break; case Qt::MiddleButton: mPlugin->activated(ILXQtPanelPlugin::MiddleClick); break; default: break; } } /************************************************ ************************************************/ void Plugin::mouseDoubleClickEvent(QMouseEvent*) { mPlugin->activated(ILXQtPanelPlugin::DoubleClick); } /************************************************ ************************************************/ void Plugin::showEvent(QShowEvent *) { // ensure that plugin widgets have correct sizes at startup if (mPluginWidget) { mPluginWidget->updateGeometry(); // needed for widgets with style sizes (like buttons) mPluginWidget->adjustSize(); } } /************************************************ ************************************************/ QMenu *Plugin::popupMenu() const { QString name = this->name().replace(QLatin1String("&"), QLatin1String("&&")); QMenu* menu = new QMenu(windowTitle()); if (mPlugin->flags().testFlag(ILXQtPanelPlugin::HaveConfigDialog)) { QAction* configAction = new QAction( XdgIcon::fromTheme(QLatin1String("preferences-other")), tr("Configure \"%1\"").arg(name), menu); menu->addAction(configAction); connect(configAction, &QAction::triggered, this, &Plugin::showConfigureDialog); } QAction* moveAction = new QAction(XdgIcon::fromTheme(QStringLiteral("transform-move")), tr("Move \"%1\"").arg(name), menu); menu->addAction(moveAction); connect(moveAction, &QAction::triggered, this, &Plugin::startMove); menu->addSeparator(); QAction* removeAction = new QAction( XdgIcon::fromTheme(QLatin1String("list-remove")), tr("Remove \"%1\"").arg(name), menu); menu->addAction(removeAction); connect(removeAction, &QAction::triggered, this, &Plugin::requestRemove); return menu; } /************************************************ ************************************************/ bool Plugin::isSeparate() const { return mPlugin->isSeparate(); } /************************************************ ************************************************/ bool Plugin::isExpandable() const { return mPlugin->isExpandable(); } /************************************************ ************************************************/ bool Plugin::eventFilter(QObject * /*watched*/, QEvent * event) { switch (event->type()) { case QEvent::DragLeave: emit dragLeft(); break; case QEvent::ChildAdded: watchWidgets(dynamic_cast(event)->child()); break; case QEvent::ChildRemoved: unwatchWidgets(dynamic_cast(event)->child()); break; default: break; } return false; } /************************************************ ************************************************/ void Plugin::realign() { if (mPlugin) mPlugin->realign(); } /************************************************ ************************************************/ void Plugin::showConfigureDialog() { if (!mConfigDialog) mConfigDialog = mPlugin->configureDialog(); if (!mConfigDialog) return; mPanel->willShowWindow(mConfigDialog); mConfigDialog->show(); mConfigDialog->raise(); mConfigDialog->activateWindow(); WId wid = mConfigDialog->windowHandle()->winId(); KX11Extras::activateWindow(wid); KX11Extras::setOnDesktop(wid, KX11Extras::currentDesktop()); } /************************************************ ************************************************/ void Plugin::requestRemove() { emit remove(); deleteLater(); } ================================================ FILE: panel/plugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PLUGIN_H #define PLUGIN_H #include #include #include #include #include #include "ilxqtpanel.h" #include "lxqtpanelglobals.h" #include "pluginsettings.h" class QPluginLoader; class QSettings; class ILXQtPanelPlugin; class ILXQtPanelPluginLibrary; class LXQtPanel; class QMenu; class LXQT_PANEL_API Plugin : public QFrame { Q_OBJECT Q_PROPERTY(QColor moveMarkerColor READ moveMarkerColor WRITE setMoveMarkerColor) public: enum Alignment { AlignLeft, AlignRight }; explicit Plugin(const LXQt::PluginInfo &desktopFile, LXQt::Settings *settings, const QString &settingsGroup, LXQtPanel *panel); ~Plugin(); bool isLoaded() const { return mPlugin != 0; } Alignment alignment() const { return mAlignment; } void setAlignment(Alignment alignment); QString settingsGroup() const { return mSettings->group(); } void saveSettings(); QMenu* popupMenu() const; const ILXQtPanelPlugin * iPlugin() const { return mPlugin; } const LXQt::PluginInfo desktopFile() const { return mDesktopFile; } bool isSeparate() const; bool isExpandable() const; QWidget *widget() { return mPluginWidget; } QString name() const { return mName; } virtual bool eventFilter(QObject * watched, QEvent * event); // For QSS properties .................. static QColor moveMarkerColor() { return mMoveMarkerColor; } static void setMoveMarkerColor(QColor color) { mMoveMarkerColor = color; } public slots: void realign(); void showConfigureDialog(); void requestRemove(); signals: void startMove(); void remove(); /*! * \brief Signal emitted when this widget or some of its children * get the DragLeave event delivered. */ void dragLeft(); protected: void contextMenuEvent(QContextMenuEvent *event); void mousePressEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void showEvent(QShowEvent *event); private: bool loadLib(ILXQtPanelPluginLibrary const * pluginLib); bool loadModule(const QString &libraryName); ILXQtPanelPluginLibrary const * findStaticPlugin(const QString &libraryName); void watchWidgets(QObject * const widget); void unwatchWidgets(QObject * const widget); const LXQt::PluginInfo mDesktopFile; QPluginLoader *mPluginLoader; ILXQtPanelPlugin *mPlugin; QWidget *mPluginWidget; Alignment mAlignment; PluginSettings *mSettings; LXQtPanel *mPanel; static QColor mMoveMarkerColor; QString mName; QPointer mConfigDialog; //!< plugin's config dialog (if any) private slots: void settingsChanged(); }; Q_DECLARE_METATYPE(Plugin const *) #endif // PLUGIN_H ================================================ FILE: panel/pluginmoveprocessor.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "pluginmoveprocessor.h" #include "plugin.h" #include "lxqtpanellayout.h" #include #include // just for a workaround with Qt >= 6.9 /************************************************ ************************************************/ PluginMoveProcessor::PluginMoveProcessor(LXQtPanelLayout *layout, Plugin *plugin): QWidget(plugin), mLayout(layout), mPlugin(plugin) { mDestIndex = mLayout->indexOf(plugin); grabKeyboard(); } /************************************************ ************************************************/ PluginMoveProcessor::~PluginMoveProcessor() = default; /************************************************ ************************************************/ void PluginMoveProcessor::start() { // We have not memoryleaks there. // The animation will be automatically deleted when stopped. CursorAnimation *cursorAnimation = new CursorAnimation(); connect(cursorAnimation, &CursorAnimation::finished, this, &PluginMoveProcessor::doStart); cursorAnimation->setEasingCurve(QEasingCurve::InOutQuad); cursorAnimation->setDuration(150); cursorAnimation->setStartValue(QCursor::pos()); cursorAnimation->setEndValue(mPlugin->mapToGlobal(mPlugin->rect().center())); cursorAnimation->start(QAbstractAnimation::DeleteWhenStopped); } /************************************************ ************************************************/ void PluginMoveProcessor::doStart() { setMouseTracking(true); show(); // Only visible widgets can grab mouse input. grabMouse(mLayout->isHorizontal() ? Qt::SizeHorCursor : Qt::SizeVerCursor); } /************************************************ ************************************************/ void PluginMoveProcessor::mouseMoveEvent(QMouseEvent *event) { QPoint mouse = mLayout->parentWidget()->mapFromGlobal(event->globalPosition()).toPoint(); MousePosInfo pos = itemByMousePos(mouse); QLayoutItem *prevItem = nullptr; QLayoutItem *nextItem = nullptr; if (pos.after) { mDestIndex = pos.index + 1; prevItem = pos.item; nextItem = mLayout->itemAt(pos.index + 1); } else { prevItem = mLayout->itemAt(pos.index - 1); nextItem = pos.item; mDestIndex = pos.index; } bool plugSep = mPlugin->isSeparate(); bool prevSep = LXQtPanelLayout::itemIsSeparate(prevItem); bool nextSep = LXQtPanelLayout::itemIsSeparate(nextItem); if (!nextItem) { if (mLayout->isHorizontal()) drawMark(prevItem, prevSep ? RightMark : BottomMark); else drawMark(prevItem, prevSep ? BottomMark : RightMark); return; } if (mLayout->lineCount() == 1) { if (mLayout->isHorizontal()) drawMark(nextItem, LeftMark); else drawMark(nextItem, TopMark); return; } if (!prevItem) { if (mLayout->isHorizontal()) drawMark(nextItem, nextSep ? LeftMark : TopMark); else drawMark(nextItem, nextSep ? TopMark : LeftMark); return; } // We prefer to draw line at the top/left of next item. // But if next item and moved plugin have different types (separate an not) and // previous item hase same type as moved plugin we draw line at the end of previous one. if (plugSep != nextSep && plugSep == prevSep) { if (mLayout->isHorizontal()) drawMark(prevItem, prevSep ? RightMark : BottomMark); else drawMark(prevItem, prevSep ? BottomMark : RightMark); } else { if (mLayout->isHorizontal()) drawMark(nextItem, nextSep ? LeftMark : TopMark); else drawMark(nextItem, nextSep ? TopMark : LeftMark); } } /************************************************ ************************************************/ PluginMoveProcessor::MousePosInfo PluginMoveProcessor::itemByMousePos(const QPoint mouse) const { MousePosInfo ret; for (int i = mLayout->count()-1; i > -1; --i) { QLayoutItem *item = mLayout->itemAt(i); QRect itemRect = item->geometry(); if (mouse.x() > itemRect.left() && mouse.y() > itemRect.top()) { ret.index = i; ret.item = item; if (mLayout->isHorizontal()) { ret.after = LXQtPanelLayout::itemIsSeparate(item) ? mouse.x() > itemRect.center().x() : mouse.y() > itemRect.center().y() ; } else { ret.after = LXQtPanelLayout::itemIsSeparate(item) ? mouse.y() > itemRect.center().y() : mouse.x() > itemRect.center().x() ; } return ret; } } ret.index = 0; ret.item = mLayout->itemAt(0); ret.after = false; return ret; } /************************************************ ************************************************/ void PluginMoveProcessor::drawMark(QLayoutItem *item, MarkType markType) { QWidget *widget = (item) ? item->widget() : nullptr; static QWidget *prevWidget = nullptr; if (prevWidget && prevWidget != widget) { prevWidget->setStyleSheet(QLatin1String("")); #if (QT_VERSION >= QT_VERSION_CHECK(6,9,0)) // NOTE: This is a workaround for a Qt regression, because of which, // the stylesheet remains visible. prevWidget->style()->unpolish(prevWidget); prevWidget->style()->polish(prevWidget); prevWidget->update(); #endif } prevWidget = widget; if (!widget) return; QString border1; QString border2; switch(markType) { case TopMark: border1 = QLatin1String("top"); border2 = QLatin1String("bottom"); break; case BottomMark: border1 = QLatin1String("bottom"); border2 = QLatin1String("top"); break; case LeftMark: border1 = QLatin1String("left"); border2 = QLatin1String("right"); break; case RightMark: border1 = QLatin1String("right"); border2 = QLatin1String("left"); break; } widget->setStyleSheet(QString::fromLatin1("#%1 {" "border-%2: 2px solid rgba(%4, %5, %6, %7); " "border-%3: -2px solid; " "background-color: transparent; }") .arg(widget->objectName(), border1, border2) .arg(Plugin::moveMarkerColor().red()) .arg(Plugin::moveMarkerColor().green()) .arg(Plugin::moveMarkerColor().blue()) .arg(Plugin::moveMarkerColor().alpha()) ); } /************************************************ ************************************************/ void PluginMoveProcessor::mousePressEvent(QMouseEvent *event) { event->accept(); } /************************************************ ************************************************/ void PluginMoveProcessor::mouseReleaseEvent(QMouseEvent *event) { event->accept(); releaseMouse(); setMouseTracking(false); doFinish(false); } /************************************************ ************************************************/ void PluginMoveProcessor::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) { doFinish(true); return; } QWidget::keyPressEvent(event); } /************************************************ ************************************************/ void PluginMoveProcessor::doFinish(bool cancel) { releaseKeyboard(); drawMark(nullptr, TopMark); if (!cancel) { int currentIdx = mLayout->indexOf(mPlugin); if (currentIdx == mDestIndex) return; if (mDestIndex > currentIdx) mDestIndex--; mLayout->moveItem(currentIdx, mDestIndex, true); } emit finished(); deleteLater(); } ================================================ FILE: panel/pluginmoveprocessor.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PLUGINMOVEPROCESSOR_H #define PLUGINMOVEPROCESSOR_H #include #include #include #include "plugin.h" #include "lxqtpanelglobals.h" class LXQtPanelLayout; class QLayoutItem; class LXQT_PANEL_API PluginMoveProcessor : public QWidget { Q_OBJECT public: explicit PluginMoveProcessor(LXQtPanelLayout *layout, Plugin *plugin); ~PluginMoveProcessor(); Plugin *plugin() const { return mPlugin; } signals: void finished(); public slots: void start(); protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void keyPressEvent(QKeyEvent *event); private slots: void doStart(); void doFinish(bool cancel); private: enum MarkType { TopMark, BottomMark, LeftMark, RightMark }; struct MousePosInfo { int index; QLayoutItem *item; bool after; }; LXQtPanelLayout *mLayout; Plugin *mPlugin; int mDestIndex; MousePosInfo itemByMousePos(const QPoint mouse) const; void drawMark(QLayoutItem *item, MarkType markType); }; class LXQT_PANEL_API CursorAnimation: public QVariantAnimation { Q_OBJECT public: void updateCurrentValue(const QVariant &value) { QCursor::setPos(value.toPoint()); } }; #endif // PLUGINMOVEPROCESSOR_H ================================================ FILE: panel/pluginsettings.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "pluginsettings.h" #include "pluginsettings_p.h" #include #include class PluginSettingsPrivate { public: PluginSettingsPrivate(LXQt::Settings* settings, const QString &group) : mSettings(settings) , mGroup(group) { mSettings->beginGroup(mGroup); mOldSettings = std::make_unique(mSettings); mSettings->endGroup(); } QString prefix() const; inline QString fullPrefix() const { return mGroup + QStringLiteral("/") + prefix(); } LXQt::Settings *mSettings; std::unique_ptr mOldSettings; QString mGroup; QStringList mSubGroups; }; QString PluginSettingsPrivate::prefix() const { if (!mSubGroups.empty()) return mSubGroups.join(QLatin1Char('/')); return QString(); } PluginSettings::PluginSettings(LXQt::Settings* settings, const QString &group, QObject *parent) : QObject(parent) , d_ptr(new PluginSettingsPrivate{settings, group}) { Q_D(PluginSettings); connect(d->mSettings, &LXQt::Settings::settingsChangedFromExternal, this, &PluginSettings::settingsChanged); } QString PluginSettings::group() const { Q_D(const PluginSettings); return d->mGroup; } PluginSettings::~PluginSettings() = default; QVariant PluginSettings::value(const QString &key, const QVariant &defaultValue) const { Q_D(const PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); QVariant value = d->mSettings->value(key, defaultValue); d->mSettings->endGroup(); return value; } void PluginSettings::setValue(const QString &key, const QVariant &value) { Q_D(PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); d->mSettings->setValue(key, value); d->mSettings->endGroup(); emit settingsChanged(); } void PluginSettings::remove(const QString &key) { Q_D(PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); d->mSettings->remove(key); d->mSettings->endGroup(); emit settingsChanged(); } bool PluginSettings::contains(const QString &key) const { Q_D(const PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); bool ret = d->mSettings->contains(key); d->mSettings->endGroup(); return ret; } QList > PluginSettings::readArray(const QString& prefix) { Q_D(PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); QList > array; int size = d->mSettings->beginReadArray(prefix); for (int i = 0; i < size; ++i) { d->mSettings->setArrayIndex(i); QMap hash; const auto keys = d->mSettings->childKeys(); for (const QString &key : keys) hash[key] = d->mSettings->value(key); array << hash; } d->mSettings->endArray(); d->mSettings->endGroup(); return array; } void PluginSettings::setArray(const QString &prefix, const QList > &hashList) { Q_D(PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); d->mSettings->beginWriteArray(prefix); int size = hashList.size(); for (int i = 0; i < size; ++i) { d->mSettings->setArrayIndex(i); QMapIterator it(hashList.at(i)); while (it.hasNext()) { it.next(); d->mSettings->setValue(it.key(), it.value()); } } d->mSettings->endArray(); d->mSettings->endGroup(); emit settingsChanged(); } void PluginSettings::clear() { Q_D(PluginSettings); d->mSettings->beginGroup(d->mGroup); d->mSettings->clear(); d->mSettings->endGroup(); emit settingsChanged(); } void PluginSettings::sync() { Q_D(PluginSettings); d->mSettings->sync(); storeToCache(); emit settingsChanged(); } QStringList PluginSettings::allKeys() const { Q_D(const PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); QStringList keys = d->mSettings->allKeys(); d->mSettings->endGroup(); return keys; } QStringList PluginSettings::childGroups() const { Q_D(const PluginSettings); d->mSettings->beginGroup(d->fullPrefix()); QStringList groups = d->mSettings->childGroups(); d->mSettings->endGroup(); return groups; } void PluginSettings::beginGroup(const QString &subGroup) { Q_D(PluginSettings); d->mSubGroups.append(subGroup); } void PluginSettings::endGroup() { Q_D(PluginSettings); if (!d->mSubGroups.empty()) d->mSubGroups.removeLast(); } void PluginSettings::loadFromCache() { Q_D(PluginSettings); d->mSettings->beginGroup(d->mGroup); d->mSettings->remove(QString{}); d->mOldSettings->loadToSettings(); d->mSettings->endGroup(); emit settingsChanged(); } void PluginSettings::storeToCache() { Q_D(PluginSettings); d->mSettings->beginGroup(d->mGroup); d->mOldSettings = std::make_unique(d->mSettings); d->mSettings->endGroup(); } PluginSettings* PluginSettingsFactory::create(LXQt::Settings *settings, const QString &group, QObject *parent/* = nullptr*/) { return new PluginSettings{settings, group, parent}; } ================================================ FILE: panel/pluginsettings.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, see * . * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PLUGIN_SETTINGS_H #define PLUGIN_SETTINGS_H #include #include #include #include "lxqtpanelglobals.h" namespace LXQt { class Settings; } class PluginSettingsFactory; class PluginSettingsPrivate; /*! * \brief * Settings for particular plugin. This object/class can be used similarly as \sa QSettings. * Object cannot be constructed directly (it is the panel's responsibility to construct it for each plugin). * * * \note * We are relying here on so called "back linking" (calling a function defined in executable * back from an external library)... */ class LXQT_PANEL_API PluginSettings : public QObject { Q_OBJECT //for instantiation friend class PluginSettingsFactory; public: ~PluginSettings(); QString group() const; QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; void setValue(const QString &key, const QVariant &value); void remove(const QString &key); bool contains(const QString &key) const; QList > readArray(const QString &prefix); void setArray(const QString &prefix, const QList > &hashList); void clear(); void sync(); QStringList allKeys() const; QStringList childGroups() const; void beginGroup(const QString &subGroup); void endGroup(); void loadFromCache(); void storeToCache(); signals: void settingsChanged(); private: explicit PluginSettings(LXQt::Settings *settings, const QString &group, QObject *parent = nullptr); private: std::unique_ptr d_ptr; Q_DECLARE_PRIVATE(PluginSettings) }; #endif ================================================ FILE: panel/pluginsettings_p.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PLUGIN_SETTINGS_P_H #define PLUGIN_SETTINGS_P_H #include "pluginsettings.h" class PluginSettingsFactory { public: static PluginSettings * create(LXQt::Settings *settings, const QString &group, QObject *parent = nullptr); }; #endif //PLUGIN_SETTINGS_P_H ================================================ FILE: panel/popupmenu.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "popupmenu.h" #include #include #include #include static const char POPUPMENU_TITLE[] = "POPUP_MENU_TITLE_OBJECT_NAME"; /************************************************ ************************************************/ QAction* PopupMenu::addTitle(const QIcon &icon, const QString &text) { QAction *buttonAction = new QAction(this); QFont font = buttonAction->font(); font.setBold(true); buttonAction->setText(QString(text).replace(QLatin1String("&"), QLatin1String("&&"))); buttonAction->setFont(font); buttonAction->setIcon(icon); QWidgetAction *action = new QWidgetAction(this); action->setObjectName(QLatin1String(POPUPMENU_TITLE)); QToolButton *titleButton = new QToolButton(this); titleButton->installEventFilter(this); // prevent clicks on the title of the menu titleButton->setDefaultAction(buttonAction); titleButton->setDown(true); // prevent hover style changes in some styles titleButton->setCheckable(true); titleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); action->setDefaultWidget(titleButton); addAction(action); return action; } /************************************************ ************************************************/ QAction* PopupMenu::addTitle(const QString &text) { return addTitle(QIcon(), text); } /************************************************ ************************************************/ bool PopupMenu::eventFilter(QObject *object, QEvent *event) { Q_UNUSED(object); if (event->type() == QEvent::Paint || event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease ) { return false; } event->accept(); return true; } /************************************************ ************************************************/ void PopupMenu::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Down) { QMenu::keyPressEvent(e); QWidgetAction *action = qobject_cast(this->activeAction()); QWidgetAction *firstAction = action; while (action && action->objectName() == QLatin1String(POPUPMENU_TITLE)) { this->keyPressEvent(e); action = qobject_cast(this->activeAction()); if (firstAction == action) // we looped and only found titles { this->setActiveAction(nullptr); break; } } return; } QMenu::keyPressEvent(e); } ================================================ FILE: panel/popupmenu.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef POPUPMENU_H #define POPUPMENU_H #include #include "lxqtpanelglobals.h" class LXQT_PANEL_API PopupMenu: public QMenu { public: explicit PopupMenu(QWidget *parent = nullptr): QMenu(parent) {} explicit PopupMenu(const QString &title, QWidget *parent = nullptr): QMenu(title, parent) {} QAction* addTitle(const QIcon &icon, const QString &text); QAction* addTitle(const QString &text); bool eventFilter(QObject *object, QEvent *event); protected: virtual void keyPressEvent(QKeyEvent* e); }; #endif // POPUPMENU_H ================================================ FILE: panel/resources/panel.conf ================================================ panels=panel1 [panel1] plugins=fancymenu,desktopswitch,quicklaunch,taskbar,statusnotifier,tray,mount,volume,worldclock,showdesktop position=Bottom desktop=0 [fancymenu] type=fancymenu alignment=Left filterClear=true autoSel=true autoSelDelay=150 [desktopswitch] type=desktopswitch [quicklaunch] type=quicklaunch alignment=Left [taskbar] type=taskbar buttonWidth=220 closeOnMiddleClick=true groupingEnabled=false [mount] type=mount [worldclock] type=worldclock [volume] device=0 type=volume [showdesktop] alignment=Right type=showdesktop [statusnotifier] alignment=Right type=statusnotifier [tray] type=tray ================================================ FILE: panel/translations/lxqt-panel.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_ar.ts ================================================ AddPluginDialog Add Plugins أضِف ملحقات Search: ابحث عن: Add Widget أضِف ودجة Close أغلِق (only one instance can run at a time) (يمكن تشغيل سيرورة واحدة من هذه الودجة فقط) ConfigPanelDialog Configure Panel اضبط اللوحة Placement وضع Styling التصميم Widgets الودجات ConfigPlacement Configure Placement إعداد الوضع Size المقاس <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>تضبط القيم السالبة طولَ اللوحة ليكون أقل من مساحة الشاشة المتوفرة بالعدد المحدّد.</p><p/><p><i>مثلا إن كان "الطول" هو -١٠٠ بكسل، ومقاس الشاشة هو ١٠٠٠ بكسل، فسيكون طول اللوحة الحقيقي ٩٠٠ بكسل.</i></p> Size: المقاس: Length: الطول: % ٪ px بكسل px بكسل Icon size: مقاس الأيقونات: Rows: الصفوف: Alignment && position المحاذاة والمكان Alignment: المحاذاة: Left اليسار Center الوسط Right اليمين Position: المكان: A&uto-hide أ&خفِ آليا Zero means no animation يعني الصفر لا تأثير حركة Animation duration: مدة تأثير الحركة: ms م‌ث Zero means no delay يعني الصفر لا مهلة Show with delay: اعرض بمهلة قدرها: Visible thin margin for hidden panel هامش رقيق مرئي للوحة المخفية Hide only on overlapping a window إخفاء فقط عند تداخل النافذة Don't allow maximized windows go under the panel window لا تسمح بأن تذهب النوافذ المكبّرة تحت نافذة اللوحة Reserve space on display احجز مساحة عند العرض Top of screen أعلى الشاشة Left of screen يسار الشاشة Right of screen يمين الشاشة Bottom of screen أسفل الشاشة Top of screen %1 أعلى الشاشة %1 Left of screen %1 يسار الشاشة %1 Right of screen %1 يمين الشاشة %1 Bottom of screen %1 أسفل الشاشة %1 Top الأعلى Bottom الأسفل ConfigPluginsWidget Configure Plugins اضبط الملحقات Note: changes made in this page cannot be reset. لاحظ: التعديلات على هذه الصفحة لا عودة فيها. Move up انقل لأعلى ... Move down انقل لأسفل Add أضِف Remove أزِل Configure اضبط ConfigStyling Configure Styling إعداد التصميم Custom styling نمط مخصّص Font color: لون الخط: Background color: لون الخلفية: Background opacity: شفافية الخلفية: <small>Compositing is required for panel transparency.</small> <small>التراكب مطلوب لشفافية اللوحة.</small> Background image: صورة الخلفية: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) حل جزئي لأنماط عنصر واجهة المستخدم التي لا يمكن إعطاء سمة منفصلة للوحة. قد ترغب أيضًا في تعطيل: تكوين مظهر LXQt → موضوع الأيقونات → تلوين الرموز بناءً على نمط القطعة (لوحة) Override icon &theme تجاوز الرمز والمظهر Icon theme for panels: سمة رمز للوحات: Pick color اختر لونا Pick image اختر صورة Images (*.png *.gif *.jpg *.svg) الصور (‎*.png *.gif *.jpg *.svg) LXQtPanel Panel اللوحة Configure Panel اضبط اللوحة Manage Widgets أدِر الودجات Add New Panel أضِف لوحة جديدة Remove Panel Menu Item أزِل اللوحة Lock This Panel اقفل هذه اللوحة Remove Panel Dialog Title أزِل اللوحة Removing a panel can not be undone. Do you want to remove this panel? إزالة اللوحة إجراء لا عودة فيه. أتريد إزالة هذه اللوحة؟ Plugin Configure "%1" اضبط ”%1“ Move "%1" انقل ”%1“ Remove "%1" أزِل ”%1“ main Use alternate configuration file. استخدم ملف ضبط بديل. Configuration file ملف الضبط ================================================ FILE: panel/translations/lxqt-panel_arn.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_ast.ts ================================================ AddPluginDialog Add Plugins Amiestu de complementos Search: Guetar: Add Widget Amestar el widget Close Zarrar (only one instance can run at a time) (namái pue executase una instancia al empar) ConfigPanelDialog Configure Panel Configuración del panel Panel Panel Widgets Widgets ConfigPanelWidget Configure panel Size Tamañu <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Un nivel negativu de píxeles afita'l llargor del panel a munchos píxelespembaxo del espaciu disponible na pantalla..</p><p/><p><i>Por exemplu, con«Llargor» afitáu a -100px, el tamañu de la pantalla va ser de 1000px,polo que'l llargor real del panel va ser de 900 px.</i></p> Size: Tamañu: Length: Llargor: % % px px px px Icon size: Tamañu d'iconos: Alignment && position Alliniación y posición A&uto-hide An&ubrir automáticamente Zero means no animation Con 0 nun hai animaciones ms ms Zero means no delay Con 0 nun hai retrasu Show with delay: Amosar con un retrasu de Visible thin margin for hidden panel Amosar un marxe delgáu al anubrir el panel Don't allow maximized windows go under the panel window Nun permite que les ventanes maximizaes vaigan embaxo de la ventana del panel Reserve space on display Acutar l'espaciu na pantalla A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Una igua parcial pa los estilos de widgets que nun apurran un estilu separtáu al panel. Quiciabes quieras desactivalo tamién: Configuración del aspeutu de LxQt → Estilu d'iconos → Pintar los iconos según l'estilu de widgets (paleta) Override icon &theme Anular l'&estilu d'iconos Icon theme for panels: Estilu d'iconos pa los paneles: Position: Posición: Animation duration: Duración de les animaciones Alignment: Alliniación: Rows: Fileres: Left Esquierda Center Centru Right Drecha Custom styling Font color: Color de la fonte: Background color: Color del fondu: Background opacity: Opacidá del fondu: <small>Compositing is required for panel transparency.</small> <small>Ríquese la composición pa la composición de los paneles.</small> Background image: Imaxe del fondu: Top of desktop No cimero del escritoriu Left of desktop A la esquierda del escritoriu Right of desktop A la drecha del escritoriu Bottom of desktop No baxero del escritoriu Top of desktop %1 No cimero del escritoriu %1 Left of desktop %1 A la esquierda del escritoriu %1 Right of desktop %1 A la drecha del escritoriu %1 Bottom of desktop %1 No baxero del escritoriu %1 Top Bottom Pick color Escoyeta d'un color Pick image Escoyeta d'una imaxe Images (*.png *.gif *.jpg *.svg) Imáxenes (*.png *.gif *.jpg *.svg) ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Nota: los cambeos fechos nesta páxina nun puen reafitase. Move up Xubir ... Move down Baxar Add Amestar Remove Desaniciar Configure Configurar LXQtPanel Panel Panel Configure Panel Configurar el panel Manage Widgets Xestionar widgets Add New Panel Amestar un panel nuevu Remove Panel Menu Item Desaniciar el panel Lock This Panel Bloquiar esti panel Remove Panel Dialog Title Desaniciu del panel Removing a panel can not be undone. Do you want to remove this panel? El desaniciu d'un panel nun pue desfacese. ¿Quies desaniciar esti panel? Plugin Configure "%1" Configurar «%1» Move "%1" Mover «%1» Remove "%1" Desaniciar «%1» main Use alternate configuration file. Usa un ficheru alternativu de configuración. Configuration file Ficheru de configuración ================================================ FILE: panel/translations/lxqt-panel_bg.ts ================================================ AddPluginDialog Add Plugins Добавяне на приставки Search: Търсене: Add Widget Добавяне Close Затваряне (only one instance can run at a time) (само един екземпляр може да се изпълнява едновременно) ConfigPanelDialog Configure Panel Конфигуриране на панела Placement Разположение Styling Стил Widgets Приставки ConfigPlacement Configure Placement Настройки на разположение Size Размер <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Отрицателна стойност на пикселите задава дължината на панела c толкова пиксели по-малко от целия размер на екрана.</p><p/><p><i> Например: “Дължина“ настроена на -100px при размер на екрана 1000px ще доведе до 900 px реален размер на панела.</i></p> Size: Размер: Length: Дължина: % % px px px px Icon size: Размер на иконите: Rows: Редове: Alignment && position Разположение Alignment: Подравняване: Left ляво Center центрирано Right дясно Position: Позиция: A&uto-hide Автоматично скриване Zero means no animation Нула - без анимация Animation duration: Продължителност на анимацията: ms ms Zero means no delay Нула - без забавяне Show with delay: Показване със забавяне: Visible thin margin for hidden panel Видим край на скрития панел Hide only on overlapping a window Скриване само при припокриване от прозорци Don't allow maximized windows go under the panel window Максимализираните прозорци не минават под областта на панела Reserve space on display Запазване на място от дисплея Top of screen в горния край на екрана Left of screen в левия край на екрана Right of screen В десния край на екрана Bottom of screen в долния край на екрана Top of screen %1 Горен край на екрана %1 Left of screen %1 Ляв край на екрана %1 Right of screen %1 Десен край на екрана %1 Bottom of screen %1 Долен край на екрана %1 Top горе Bottom отдолу ConfigPluginsWidget Configure Plugins Конфигуриране на приставки Note: changes made in this page cannot be reset. Забележка: промените, направени на тази страница, не могат да бъдат върнати обратно. Move up Преместване нагоре ... ... Move down Преместване надолу Add Добавяне Remove Премахване Configure Конфигуриране ConfigStyling Configure Styling Конфигуриране на стил Custom styling Потребителски стил Font color: Цвят на шрифта: Background color: Цвят на фона: Background opacity: Прозрачност на фона: <small>Compositing is required for panel transparency.</small> <small>Прозрачност на панела изисква програма за изобразяване на ефекти.</small> Background image: Изображение на фона: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Частично решение при приставки, които не могат да покажат отделна тема. Може също да отмените: Конфигурация на LXQt → Външен изглед → Икони → Оцвети иконите според стила на приставката Override icon &theme Смяна на иконите на панела Icon theme for panels: Икони: Pick color Избиране на цвят Pick image Избиране на изображение Images (*.png *.gif *.jpg *.svg) Изображения (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панел Configure Panel Конфигуриране на панела Manage Widgets Управление на приставки Add New Panel Добавяне на нов панел Remove Panel Menu Item Премахване на панел Lock This Panel Заключване на панела Remove Panel Dialog Title Премахване на панел Removing a panel can not be undone. Do you want to remove this panel? Премахването на панел е необратимо. Искате ли да премахнете този панел? Plugin Configure "%1" Конфигуриране "%1" Move "%1" Преместване "%1" Remove "%1" Премахване "%1" main Use alternate configuration file. Използване на алтернативен конфигурационен файл. Configuration file Конфигурационен файл ================================================ FILE: panel/translations/lxqt-panel_ca.ts ================================================ AddPluginDialog Add Plugins Afegiment de connectors Search: Cerca: Add Widget Afegeix l'estri Close Tanca (only one instance can run at a time) (tan sols es pot executar una instància al mateix temps) ConfigPanelDialog Configure Panel Configuració del tauler Placement Ubicació Styling Estil Widgets Estris ConfigPlacement Configure Placement Configura la ubicació Size Mida <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>El valor negatiu dels píxels estableix la llargada del tauler a alguns píxels menys dels disponibles a l'espai de la pantalla.</p><p/><p><i>P. ex. Amb la "Llargada" establerta a -100px, amb una mida de la pantalla de 1000px, aleshores la llargada real del tauler serà 900 px.</i></p> Size: Mida: Length: Llargada: % % px px px px Icon size: Mida de la icona: Rows: Files: Alignment && position Alineació && posició Alignment: Alineació: Left Esquerra Center Centre Right Dreta Position: Posició: A&uto-hide Oculta a&utomàticament Zero means no animation Zero significa sense animació Animation duration: Durada de l'animació: ms ms Zero means no delay Zero significa cap retard Show with delay: Mostra-ho amb un retard: Visible thin margin for hidden panel Marge lleuger visible per al plafó ocult Hide only on overlapping a window Amaga només en superposar una finestra Don't allow maximized windows go under the panel window No permetis que les finestres maximitzades vagin sota de la finestra del tauler Reserve space on display Reserva espai a la pantalla Top of screen Part superior de la pantalla Left of screen A l'esquerra de la pantalla Right of screen A la dreta de la pantalla Bottom of screen Part inferior de la pantalla Top of screen %1 Part superior de la pantalla %1 Left of screen %1 A l'esquerra de la pantalla %1 Right of screen %1 A la dreta de la pantalla %1 Bottom of screen %1 Part inferior de la pantalla %1 Top Part superior Bottom Part inferior ConfigPluginsWidget Configure Plugins Configuració dels connectors Note: changes made in this page cannot be reset. Nota: els canvis que es facin en aquesta pàgina no es poden restablir. Move up Mou amunt ... ... Move down Mou avall Add Afegeix Remove Suprimeix Configure Configura ConfigStyling Configure Styling Configura l'estil Custom styling Estil personalitzat Font color: Color de la lletra: Background color: Color del fons: Background opacity: Opacitat del fons: <small>Compositing is required for panel transparency.</small> <small>Es requereix composició per a la transparència del tauler.</small> Background image: Imatge de fons: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Una solució parcial per als estils dels estris que no poden donar un tema separat al tauler. Potser voleu inhabilitar-ho: Configuració de l'aparença de LXQt → Tema d'icones → Acoloreix les icones en funció de l'estil de l'estri (paleta) Override icon &theme Anul·la el &tema d'icones Icon theme for panels: Tema d'icones per als taulers: Pick color Tria un color Pick image Tria una imatge Images (*.png *.gif *.jpg *.svg) Imatges (*.png *.gif *.jpg *.svg) LXQtPanel Panel Tauler Configure Panel Configura el tauler Manage Widgets Gestiona els estris Add New Panel Afegeix un tauler nou Remove Panel Menu Item Suprimeix el tauler Lock This Panel Bloqueja aquest tauler Remove Panel Dialog Title Supressió del tauler Removing a panel can not be undone. Do you want to remove this panel? La supressió d'un tauler no es pot desfer. Voleu suprimir el tauler? Plugin Configure "%1" Configura "%1" Move "%1" Mou "%1" Remove "%1" Suprimeix "%1" main Use alternate configuration file. Utilitza un fitxer de configuració alternatiu. Configuration file Fitxer de configuració ================================================ FILE: panel/translations/lxqt-panel_cs.ts ================================================ AddPluginDialog Add Plugins Přidat zásuvné moduly Search: Hledat: Add Widget Přidat ovládací prvek Close Zavřít (only one instance can run at a time) (spuštěná může být pouze jedna instance naráz) ConfigPanelDialog Configure Panel Nastavit panel Placement Umístění Styling Styly Widgets Ovládací prvky ConfigPlacement Configure Placement Nastavit umístění Size Velikost <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Záporná hodnota obrazových bodů nastaví délku panelu na velikost dostupného místa na obrazovce mínus právě tato hodnota.</p><p/><p><i>Tedy např. při délce nastavené na -100 px a velikosti obrazovky 1000 px, bude skutečná délka panelu 900 px.</i></p> Size: Velikost: Length: Délka: % % px px px px Icon size: Velikost ikony: Rows: Řádků: Alignment && position Zarovnání &a pozice Alignment: Zarovnání: Left Vlevo Center Na střed Right Vpravo Position: Pozice: A&uto-hide A&utomaticky skrývat Zero means no animation Nula znamená bez animace Animation duration: Doba trvání animace: ms ms Zero means no delay Nula znamená bez prodlevy Show with delay: Zobrazit s prodlevou: Visible thin margin for hidden panel Viditelný tenký okraj pro skrytý panel Hide only on overlapping a window Skrýt jen pokud by překrýval okno Don't allow maximized windows go under the panel window Neumožnit aby se maximalizovaná okna dostala pod okno panelu Reserve space on display Vyhradit prostor na obrazovce Top of screen Horní část obrazovky Left of screen Levá část obrazovky Right of screen Pravá část obrazovky Bottom of screen Dolní část obrazovky Top of screen %1 Horní část obrazovky %1 Left of screen %1 Levá část obrazovky %1 Right of screen %1 Pravá část obrazovky %1 Bottom of screen %1 Dolní část obrazovky %1 Top Nahoře Bottom Dole ConfigPluginsWidget Configure Plugins Nastavit zásuvné moduly Note: changes made in this page cannot be reset. Pozn.: Změny, provedené na této stránce, nelze vrátit (zpět či do výchozího stavu). Move up Posunout nahoru ... Move down Posunout dolů Add Přidat Remove Odstranit Configure Nastavit ConfigStyling Configure Styling Nastavit styly Custom styling Uživatelsky určený styl Font color: Barva písma: Background color: Barva pozadí: Background opacity: (Ne)průhlednost pozadí: <small>Compositing is required for panel transparency.</small> <small>Panel může být průhledný pouze pokud je k vykreslování používán kompozitor.</small> Background image: Obrázek na pozadí: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Částečné obejití problému pro motivy vzhledu prvků které neposkytují oddělený motiv vzhledu na panel. Nejspíš také můžete chtít vypnout: Nastavení vzhledu LXQt → Motiv ikon → Obarvit ikony podle stylu prvku (paleta) Override icon &theme Přebít mo&tiv ikon Icon theme for panels: Motiv vzhledu ikon pro panely: Pick color Vybrat barvu Pick image Vybrat obrázek Images (*.png *.gif *.jpg *.svg) Obrázky (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Nastavit panel Manage Widgets Spravovat ovládací prvky Add New Panel Přidat nový panel Remove Panel Menu Item Odstranit panel Lock This Panel Zamknout tento panel Remove Panel Dialog Title Odstranit panel Removing a panel can not be undone. Do you want to remove this panel? Odstranění panelu nelze vrátit zpět. Opravdu chcete tento panel odstranit? Plugin Configure "%1" Nastavit „%1“ Move "%1" Přesunout „%1“ Remove "%1" Odstranit „%1“ main Use alternate configuration file. Použít jiný soubor s nastaveními. Configuration file Soubor s nastaveními ================================================ FILE: panel/translations/lxqt-panel_cy.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_da.ts ================================================ AddPluginDialog Add Plugins Tilføj udvidelsesmodul Search: Søg: Add Widget Tilføj udvidelsesmodul Close Luk (only one instance can run at a time) (kun én instans kan køre ad gangen) ConfigPanelDialog Configure Panel Indstil panel Placement Placering Styling Stil Widgets Udvidelsesmoduler ConfigPlacement Configure Placement Indstil placering Size Størrelse <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negative pixel-værdier sætter panelets længe til så mange pixel mindre end den tilgængelige skærmplads.</p><p/><p><i>F.eks. "Længde" sæt til -100px, skærmstørrelse er 1000px, så vil den rigtige panellængde blive 900 px.</i></p> Size: Størrelse: Length: Længde: % % px px px px Icon size: Ikonstørrelse: Rows: Rækker: Alignment && position Justering og placering Alignment: Justering: Left Venstre Center Centereret Right Højre Position: Placering: A&uto-hide Skjul &automatisk Zero means no animation Nul betyder ingen animation Animation duration: Animationens varighed: ms ms Zero means no delay Nul betyder ingen forsinkelse Show with delay: Vis med forsinkelse: Visible thin margin for hidden panel Synlig tynd margen til skjult panel Hide only on overlapping a window Skjul kun når et vindue overdækkes Don't allow maximized windows go under the panel window Tillad ikke maksimerede vinduer at gå under panel-vinduet Reserve space on display Reservér plads på skærm Top of screen Øverst på skærmen Left of screen Venstre side af skærmen Right of screen Højre side af skærmen Bottom of screen Nederst på skærmen Top of screen %1 Øverst på skærmen %1 Left of screen %1 Venstre side af skærmen %1 Right of screen %1 Højre side af skærneb %1 Bottom of screen %1 Nederst på skærmen %1 Top Øverst Bottom Nederst ConfigPluginsWidget Configure Plugins Indstil udvidelsesmoduler Note: changes made in this page cannot be reset. Bemærk: Ændringer foretaget på denne side kan ikke nulstilles. Move up Flyt op ... ... Move down Flyt ned Add Tilføj Remove Fjern Configure Indstil ConfigStyling Configure Styling Indstil stil Custom styling Brugerdefineret stil Font color: Skriftfarve: Background color: Baggrundsfarve: Background opacity: Baggrundens gennemsigtighed: <small>Compositing is required for panel transparency.</small> <small>Kompositing kræves for at panelet kan være gennemsigtigt.</small> Background image: Baggrundsbillede: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) En delvis løsning til widgetstil som ikke kan give et separat tema til panelet. Du ønsker måske også at deaktivere: Indstilling af LXQt udseende → Ikontema → Farvelæg ikoner baseret på widgetstil (palet) Override icon &theme Tilsidesæt ikon&tema Icon theme for panels: Ikontema for paneler: Pick color Vælg farve Pick image Vælg billede Images (*.png *.gif *.jpg *.svg) Billeder (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Indstil panel Manage Widgets Håndtér kontroller Add New Panel Tilføj nyt panel Remove Panel Menu Item Fjern panel Lock This Panel Lås panelet Remove Panel Dialog Title Fjern panel Removing a panel can not be undone. Do you want to remove this panel? Fjernelse af et panel kan ikke fortrydes. Vil du fjerne panelet? Plugin Configure "%1" Indstil "%1" Move "%1" Flyt "%1" Remove "%1" Fjern "%1" main Use alternate configuration file. Brug alternativ indstillingsfil. Configuration file Indstillingsfil ================================================ FILE: panel/translations/lxqt-panel_de.ts ================================================ AddPluginDialog Add Plugins Plugins hinzufügen Search: Suchen: Add Widget Widget hinzufügen Close Schließen (only one instance can run at a time) (es kann nur eine Instanz gleichzeitig ausgeführt werden) ConfigPanelDialog Configure Panel Leiste konfigurieren Placement Platzierung Styling Stil Widgets Bedienelemente ConfigPlacement Configure Placement Platzierung konfigurieren Size Größe <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negative Pixelwerte setzen die Leistenlänge auf den Wert verfügbare Größe minus angegebener Größe.</p><p/><p><i>Z.B. bei "Länge" gesetzt auf -100px und einer Bildschirmgröße von 1000px hat die Leiste eine Größe von 900 px.</i></p> Size: Größe: Length: Länge: % % px px px px Icon size: Symbolgröße: Rows: Zeilen: Alignment && position Ausrichtung && Position Alignment: Ausrichtung: Left Links Center Mitte Right Rechts Position: Position: A&uto-hide A&utomatisch ausblenden Zero means no animation Null bedeutet keine Animation Animation duration: Animationsdauer: ms ms Zero means no delay Null bedeutet keine Verzögerung Show with delay: Mit Verzögerung anzeigen: Visible thin margin for hidden panel Sichtbarer dünner Rand für verborgene Leiste Hide only on overlapping a window Verstecke nur bei überlappendem Fenster Don't allow maximized windows go under the panel window Nicht zulassen, dass maximierte Fenster unter das Leistenfenster gehen Reserve space on display Platz auf Bildschirm reservieren Top of screen Oben am Bildschirm Left of screen Links am Bildschirm Right of screen Rechts am Bildschirm Bottom of screen Unten am Bildschirm Top of screen %1 Oben am Bildschirm %1 Left of screen %1 Links am Bildschirm %1 Right of screen %1 Rechts am Bildschirm %1 Bottom of screen %1 Unten am Bildschirm %1 Top Oben Bottom Unten ConfigPluginsWidget Configure Plugins Plugins konfigurieren Note: changes made in this page cannot be reset. Hinweis: In dieser Seite vorgenommene Änderungen können nicht zurückgesetzt werden. Move up Nach oben verschieben ... ... Move down Nach unten verschieben Add Hinzufügen Remove Entfernen Configure Konfigurieren ConfigStyling Configure Styling Stil konfigurieren Custom styling Eigener Stil Font color: Schriftfarbe: Background color: Hintergrundfarbe: Background opacity: Hintergrunddeckkraft: <small>Compositing is required for panel transparency.</small> <small>Für Leistentransparenz ist Compositing erforderlich.</small> Background image: Hintergrundbild: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Teilweise Notlösung für Symbolthemen, die nicht ein spezielles Thema für die Leiste anbieten. Folgendes blockieren: LXQt Aussehen einstellen → Symbolthema → Symbolfarbe folgt Symbolthema (Farben) Override icon &theme Symbol&thema überschreiben Icon theme for panels: Symbolthema für Leisten: Pick color Farbe auswählen Pick image Bild auswählen Images (*.png *.gif *.jpg *.svg) Bilder (*.png *.gif *.jpg *.svg) LXQtPanel Panel Leiste Configure Panel Leiste konfigurieren Manage Widgets Bedienelemente verwalten Add New Panel Neue Leiste hinzufügen Remove Panel Menu Item Leiste entfernen Lock This Panel Diese Leiste sperren Remove Panel Dialog Title Leiste entfernen Removing a panel can not be undone. Do you want to remove this panel? Das Entfernen einer Leiste kann nicht rückgängig gemacht werden. Möchten Sie diese Leiste entfernen? Plugin Configure "%1" "%1" konfigurieren Move "%1" "%1" verschieben Remove "%1" "%1" entfernen main Use alternate configuration file. Alternative Konfigurationsdatei verwenden. Configuration file Konfigurationsdatei ================================================ FILE: panel/translations/lxqt-panel_el.ts ================================================ AddPluginDialog Add Plugins Προσθήκη πρόσθετων Search: Αναζήτηση: Add Widget Προσθήκη γραφικού συστατικού Close Κλείσιμο (only one instance can run at a time) (δεν επιτρέπονται περισσότερες από μια εκτελέσεις ταυτόχρονα) ConfigPanelDialog Configure Panel Διαμόρφωση του πίνακα Placement Τοποθεσία Styling Τεχνοτροπία Widgets Γραφικά συστατικά ConfigPlacement Configure Placement Διαμόρφωση της τοποθεσίας Size Μέγεθος <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Μια αρνητική τιμή εικονοστοιχείων θέτει το μήκος του πίνακα σε τόσα εικονοστοιχεία λιγότερο από τον διαθέσιμο χώρο της οθόνης.</p><p/><p><i>Π.χ. θέτοντας το «Μήκος» σε -100εικ, και με μέγεθος οθόνης 1000εικ, τότε το πραγματικό μήκος του πίνακα θα είναι 900 εικ.</i></p> Size: Μέγεθος: Length: Μήκος: % % px εικ px εικ Icon size: Μέγεθος εικονιδίων: Rows: Γραμμές: Alignment && position Στοίχιση && θέση Alignment: Στοίχιση: Left Αριστερά Center Κέντρο Right Δεξιά Position: Θέση: A&uto-hide Αυ&τόματη απόκρυψη Zero means no animation Μηδέν σημαίνει χωρίς τέχνασμα κίνησης Animation duration: Διάρκεια του τεχνάσματος κίνησης: ms ms Zero means no delay Μηδέν σημαίνει χωρίς καθυστέρηση Show with delay: Εμφάνιση με καθυστέρηση: Visible thin margin for hidden panel Ορατό λεπτό περιθώριο του καταχωνιασμένου πίνακα Hide only on overlapping a window Απόκρυψη μόνον κατά την επικάλυψη ενός παραθύρου Don't allow maximized windows go under the panel window Να μην επιτρέπεται στα μεγιστοποιημένα παράθυρα να καταλαμβάνουν τον χώρο κάτω από το πλαίσιο του πίνακα Reserve space on display Δέσμευση χώρου στην απεικόνιση Top of screen Κορυφή της οθόνης Left of screen Αριστερά της οθόνης Right of screen Δεξιά της οθόνης Bottom of screen Βάση της οθόνης Top of screen %1 Κορυφή της οθόνης %1 Left of screen %1 Αριστερά της οθόνης %1 Right of screen %1 Δεξιά της οθόνης %1 Bottom of screen %1 Βάση της οθόνης %1 Top Κορυφή Bottom Βάση ConfigPluginsWidget Configure Plugins Διαμόρφωση των πρόσθετων Note: changes made in this page cannot be reset. Σημείωση: δεν είναι δυνατή η επαναφορά των αλλαγών αυτής της σελίδας. Move up Μετακίνηση πάνω ... ... Move down Μετακίνηση κάτω Add Προσθήκη Remove Αφαίρεση Configure Διαμόρφωση ConfigStyling Configure Styling Διαμόρφωση της τεχνοτροπίας Custom styling Προσαρμοσμένη τεχνοτροπία Font color: Χρώμα γραμματοσειράς: Background color: Χρώμα παρασκηνίου: Background opacity: Αδιαφάνεια παρασκηνίου: <small>Compositing is required for panel transparency.</small> <small>Για την διαφάνεια του πίνακα απαιτείται το χαρακτηριστικό σύνθεσης γραφικών.</small> Background image: Εικόνα παρασκηνίου: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Μια μερική εναλλακτική λύση για το ύφος των γραφικών συστατικών που δεν προσφέρουν ένα ξεχωριστό θέμα στον πίνακα. Ίσως να επιθυμείτε επίσης την απενεργοποίηση του: LXQT Διαμόρφωση εμφάνισης→ Θέμα εικονιδίων → Χρωματισμός των εικονιδίων βάσει του ύφους του γραφικού συστατικού (χρωματοπυξίδα) Override icon &theme Αντικατάσταση του &θέματος εικονιδίων Icon theme for panels: Θέμα εικονιδίων για πίνακες: Pick color Επιλέξτε το χρώμα Pick image Επιλογή εικόνας Images (*.png *.gif *.jpg *.svg) Εικόνες (*.png *.gif *.jpg *.svg) LXQtPanel Panel Πίνακας Configure Panel Διαμόρφωση του πίνακα Manage Widgets Διαχείριση των γραφικών συστατικών Add New Panel Προσθήκη νέου πίνακα Remove Panel Menu Item Αφαίρεση πίνακα Lock This Panel Κλείδωμα του πίνακα Remove Panel Dialog Title Αφαίρεση πίνακα Removing a panel can not be undone. Do you want to remove this panel? Η αφαίρεση ενός πίνακα δεν μπορεί να αναιρεθεί. Θέλετε να αφαιρέσετε τον πίνακα; Plugin Configure "%1" Διαμόρφωση του «%1» Move "%1" Μετακίνηση του «%1» Remove "%1" Αφαίρεση του «%1» main Use alternate configuration file. Χρήση ενός εναλλακτικού αρχείου διαμόρφωσης. Configuration file Αρχείο διαμόρφωσης ================================================ FILE: panel/translations/lxqt-panel_en_GB.ts ================================================ AddPluginDialog Add Plugins Add Plugins Search: Search: Add Widget Add Widget Close Close (only one instance can run at a time) (only one instance can run at a time) ConfigPanelDialog Configure Panel Configure Panel Placement Placement Styling Styling Widgets Widgets ConfigPlacement Configure Placement Configure Placement Size Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Size: Length: Length: % % px px px px Icon size: Icon's size: Rows: Rows: Alignment && position Alignement and position Alignment: Alignment: Left Left Center Centre Right Right Position: Position: A&uto-hide Auto-Hide Zero means no animation Zero means no animation Animation duration: Animation's duration: ms ms Zero means no delay Zero means no delay Show with delay: Show with delay: Visible thin margin for hidden panel Visible thin margin for hidden panel Hide only on overlapping a window Hide only on overlapping a window Don't allow maximized windows go under the panel window Don't allow maximized windows go under the panel window Reserve space on display Reserve space on display Top of screen Top of screen Left of screen Left of screen Right of screen Right of screen Bottom of screen Bottom of screen Top of screen %1 Top of screen %1 Left of screen %1 Left of screen %1 Right of screen %1 Right of screen %1 Bottom of screen %1 Bottom of screen %1 Top Top Bottom Bottom ConfigPluginsWidget Configure Plugins Configure Plugins Note: changes made in this page cannot be reset. Note: changes made in this page cannot be reset. Move up Move up ... ... Move down Move down Add Add Remove Remove Configure Configure ConfigStyling Configure Styling Configure Styling Custom styling Custom styling Font color: Font colour: Background color: Background colour: Background opacity: Background opacity: <small>Compositing is required for panel transparency.</small> <small>Compositing is required for panel transparency.</small> Background image: Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colourise icons based on widget style (palette) Override icon &theme Override icon &theme Icon theme for panels: Icon theme for panels: Pick color Pick Colour Pick image Pick image Images (*.png *.gif *.jpg *.svg) Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Configure Panel Manage Widgets Manage Widgets Add New Panel Add New Panel Remove Panel Menu Item Remove Panel Lock This Panel Lock This Panel Remove Panel Dialog Title Remove Panel Removing a panel can not be undone. Do you want to remove this panel? Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Configure "%1" Move "%1" Move "%1" Remove "%1" Remove "%1" main Use alternate configuration file. Use alternate configuration file. Configuration file Configuration file ================================================ FILE: panel/translations/lxqt-panel_eo.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Grando: Length: Longo: % % px rastr px Icon size: Rows: Alignment && position Alignment: Loko: Left Maldekstre Center Centre Right Dekstre Position: Loko: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Forigi Configure Agordi ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Agordoj de muso por LXQto Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_es.ts ================================================ AddPluginDialog Add Plugins Añadir complementos Search: Buscar: Add Widget Añadir widget Close Cerrar (only one instance can run at a time) (Este widget ya se encuentra en el panel) ConfigPanelDialog Configure Panel Configuración del panel Placement Colocación Styling Estilo Widgets Widgets ConfigPlacement Configure Placement Configurar ubicación Size Dimensiones de los elementos del panel <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Un valor negativo en el tamaño cambia la longitud total del panel restandole esa cantidad al tamaño en la pantalla. </p><p/><p><i>Por ejemplo si el "Largo" configurado es -100px, y el tamaño de la pantalla es de 1000px, entonces el largo del panel será de 900 px.</i></p> Size: Tamaño: Length: Longitud: % % px px px px Icon size: Tamaño de los iconos: Rows: Filas del panel: Alignment && position Alineación, posición y características Alignment: Alineación: Left Izquierda Center Centro Right Derecha Position: Posición: A&uto-hide Ocultar el panel a&utomáticamente Zero means no animation Si elige "0 ms" se desactivarán las animaciones Animation duration: Duración de la animación: ms ms Zero means no delay Si elige "0 ms" se evitara cualquier retraso Show with delay: Retraso antes de aparecer: Visible thin margin for hidden panel Margen fino visible para el panel oculto Hide only on overlapping a window Ocultar solo cuando lo cubra una ventana Don't allow maximized windows go under the panel window Si se activa esta opción se evitará que las ventanas maximizadas queden bajo del panel y tengan un area inaccesible Reserve space on display Reservar el espacio del panel en la pantalla Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Arriba Bottom Abajo ConfigPluginsWidget Configure Plugins Configurar los complementos Note: changes made in this page cannot be reset. Nota: es posible que algunos de los cambios realizados no puedan deshacerse. Move up Mover hacia arriba ... ... Move down Mover hacia abajo Add Añadir un widget Remove Eliminar un widget Configure Abrir la ventana de configuración del widget seleccionado ConfigStyling Configure Styling Configurar el estilo Custom styling Personalización del estilo del panel Font color: Color de la fuente: Background color: Color del fondo: Background opacity: Opacidad del fondo: <small>Compositing is required for panel transparency.</small> <small>La composición debe estar activada para usar transparencias en el panel.</small> Background image: Imagen de fondo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Si tiene problemas para personalizar los widgets que no soportan usar un tema diferente al original del panel. Debe deshabilitar la siguiente casilla: Configuración de apariencia de LXQt → Tema de iconos → Colorear los iconos según la paleta de colores usada en los widgets Override icon &theme Elegir un &tema personalizado para los iconos Icon theme for panels: Tema de iconos de los paneles: Pick color Seleccione un color Pick image Seleccione una imagen Images (*.png *.gif *.jpg *.svg) Imágenes (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Configurar este panel Manage Widgets Gestionar los widgets Add New Panel Añadir otro panel Remove Panel Menu Item Eliminar este panel Lock This Panel Bloquear este panel Remove Panel Dialog Title Eliminar este panel Removing a panel can not be undone. Do you want to remove this panel? Una vez eliminado el panel no puede deshacerse. ¿Seguro que desea borrar este panel? Plugin Configure "%1" Configurar %1 Move "%1" Mover %1 Remove "%1" Eliminar %1 main Use alternate configuration file. Utilizar un archivo de configuración alternativo. Configuration file Archivo de configuración ================================================ FILE: panel/translations/lxqt-panel_es_UY.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: Tamaño: % % px px px Icon size: Rows: Filas: Alignment && position Alineación y posición Alignment: Alineación: Left Izquierda Center Centro Right Derecha Position: Posición: A&uto-hide Auto-esconder Zero means no animation Cero significa que no hay animación Animation duration: Duración de la animación: ms ms Zero means no delay Cero significa sin demora Show with delay: Mostrar con demora: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window No permita que las ventanas maximizadas vayan debajo de la ventana del panel Reserve space on display Reserva espacio en el monitor Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Parte superior Bottom Parte inferior ConfigPluginsWidget Configure Plugins Configurar Plugins(Complementos) Note: changes made in this page cannot be reset. Atención: los cambios realizados en la página no se pueden restablecer. Move up Mover hacia arriba ... ... Move down Mover hacia abajo Add Añadir Remove Retirar Configure Configurar ConfigStyling Configure Styling Custom styling Estilo personalizado Font color: Color de fuente: Background color: Color de fondo: Background opacity: Opacidad de fondo: <small>Compositing is required for panel transparency.</small> Background image: Imagen de fondo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Reemplazar tema de el icono Icon theme for panels: Pick color Elige un color Pick image Elige una imagen Images (*.png *.gif *.jpg *.svg) Imágenes (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Manage Widgets Administrar Widgets Add New Panel Añadir un nuevo panel Remove Panel Menu Item Retirar el panel Lock This Panel Bloquear el panel Remove Panel Dialog Title Retirar el panel Removing a panel can not be undone. Do you want to remove this panel? La retiración de un panel no se puede deshacer. ¿Quieres retirar el panel? Plugin Configure "%1" Configurar "%1" Move "%1" Mover "%1" Remove "%1" Retirar "%1" main Use alternate configuration file. Configuration file Archivo de configuración ================================================ FILE: panel/translations/lxqt-panel_es_VE.ts ================================================ AddPluginDialog Add Plugins Agregar Plugins Search: Buscar: Add Widget Agregar Widget Close Cerrar (only one instance can run at a time) (sólo una instancia a la vez) ConfigPanelDialog Configure Panel Configurar Panel Placement Styling Widgets Componentes ConfigPlacement Configure Placement Size Tamaño <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Tamaño: Length: Largo: % % px px px Icon size: Rows: Alignment && position Alignment: Alineacion: Left Izquierda Center Centrado Right Derecha Position: Posicion: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Remover Configure Configurar ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Configurar Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_et.ts ================================================ AddPluginDialog Add Plugins Lisa pistikprogramme Search: Otsi: Add Widget Lisa vidin Close Sulge (only one instance can run at a time) (rakendus võib töötada vaid ühes aknas korraga) ConfigPanelDialog Configure Panel Seadista paneeli Placement Asukoht Styling Kujundus Widgets Vidinad ConfigPlacement Configure Placement Seadista asukohta Size Suurus <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Määrates negatiivse pikslite väärtuse, saad seadistada mõõdu, mis on sellevõrra väiksem saadaval olevast ruumist ekraanil.</p><p/><p><i>Näiteks, kui pikkus on -100 pikslit ja ekraani laius 1000 pikslit, siis paneeli pikkus saab olema 900 pikslit.</i></p> Size: Suurus: Length: Pikkus: % % px pikslit px pikslit Icon size: Ikooni suurus: Rows: Ridu: Alignment && position Joondumine ja asukoht Alignment: Joondumine: Left Vasakule Center Keskele Right Paremale Position: Asukoht: A&uto-hide Peida a&utomaatselt Zero means no animation Null tähendab, et animatsiooni ei kasuta Animation duration: Animatsiooni kestus: ms ms Zero means no delay Null tähendab, et viivitus puudub Show with delay: Viivitus kuvamisel: Visible thin margin for hidden panel Peidetud paneelil on õhuke nähtav piirjoon Hide only on overlapping a window Peida vaid siis, kui aken katab paneeli Don't allow maximized windows go under the panel window Ära luba täisvaates aknaid paigutada paneeli alla Reserve space on display Varu ekraanile ruumi Top of screen Ekraani ülemises ääres Left of screen Ekraani vasakus ääres Right of screen Ekraani paremas ääres Bottom of screen Ekraani alumises ääres Top of screen %1 %1. monitori ülemises ääres Left of screen %1 %1. monitori vasakus ääres Right of screen %1 %1. monitori paremas ääres Bottom of screen %1 %1. monitori alumises ääres Top Ülemises ääres Bottom Alumises ääres ConfigPluginsWidget Configure Plugins Seadista pistikprogramme Note: changes made in this page cannot be reset. Märkus: siin vaates tehtud muudatusi ei saa lähtestada. Move up Liiguta üles ... ... Move down Liiguta alla Add Lisa Remove Eemalda Configure Seadista ConfigStyling Configure Styling Muuda kujundust Custom styling Kohandatud välimus Font color: Kirjatüübi värv: Background color: Taustavärv: Background opacity: Tausta läbipaistvus: <small>Compositing is required for panel transparency.</small> <small>Paneeli tausta läbipaistvus eeldab komposiitori kasutamist.</small> Background image: Taustapilt: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Ajutine lahendus vigastele vidinastiilidele, mis ei oska jagada eraldi teemat paneeli jaoks, Sul võib-olla on vaja ka välja lülitada: LXQt välimuse seadistused Ikooniteema Ikoonide värvimine vidinastiili alusel (värvipalett) Override icon &theme Asenda ikooni&teema Icon theme for panels: Ikooniteema paneeli jaoks: Pick color Vali värv Pick image Vali pilt Images (*.png *.gif *.jpg *.svg) Pildifailid (*.png *.gif *.jpg *.svg) LXQtPanel Panel Paneel Configure Panel Seadista paneeli Manage Widgets Halda vidinaid Add New Panel Lisa uus paneel Remove Panel Menu Item Kustuta paneel Lock This Panel Lukusta see paneel Remove Panel Dialog Title Kustuta paneel Removing a panel can not be undone. Do you want to remove this panel? Paneeli kustutamist ei saa tagasi pöörata. Kas sa kindlasti soovid seda paneeli kustutada? Plugin Configure "%1" Seadista „%1“ Move "%1" Liiguta „%1“ uude kohta Remove "%1" Kustuta „%1“ main Use alternate configuration file. Kasuta alternatiivset seadistusfaili. Configuration file Seadistuste fail ================================================ FILE: panel/translations/lxqt-panel_eu.ts ================================================ AddPluginDialog Add Plugins Gehitu pluginak Search: Bilatu: Add Widget Gehitu Widget Close Itxi (only one instance can run at a time) (instantzia bakarra exekutatu daiteke aldi berean) ConfigPanelDialog Configure Panel Konfiguratu panela Placement Kokapen Styling Estilizazioa Widgets Widgets ConfigPlacement Configure Placement Konfiguratu kokapena Size Tamaina <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Pixelen balio negatiboak panelaren luzera pantailan dagoen espazioa baino pixel gutxiagorekin ezartzen du.</p><p/><p><i>Adibidez. "Luzera" ezarrita dago -100 px-en, pantailaren tamaina 1000 px-koa da eta, ondoren, panelaren benetako luzera 900 px-koa izango da.</i></p> Size: Tamaina: Length: Luzera: % % px px px px Icon size: Ikonoaren tamaina: Rows: Ilarak: Alignment && position Lerrokatzea && posizioa Alignment: Lerrokatzea: Left Ezkerra Center Erdia Right Eskuina Position: Posizioa: A&uto-hide Auto-ezkutatu Zero means no animation Zero animaziorik ez dela esan nahi du Animation duration: Animazioaren iraupena: ms ms Zero means no delay Zero atzerapenik ez dela esan nahi du Show with delay: Erakutsi atzerapenarekin: Visible thin margin for hidden panel Ezkutuko panelerako marjina mehe ikusgaia Hide only on overlapping a window Ezkutatu leiho bat gainjartzean soilik Don't allow maximized windows go under the panel window Ez baimendu leiho maximizatuak paneleko leihoaren azpian joatea Reserve space on display Erreserbatu espazioa pantailan Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Goian Bottom Behean ConfigPluginsWidget Configure Plugins Pluginak Konfiguratu Note: changes made in this page cannot be reset. Oharra: ezin dira orrialde honetan egindako aldaketak berrezarri. Move up Mugitu gora ... ... Move down Mugitu behera Add Gehitu Remove Ezabatu Configure Konfiguratu ConfigStyling Configure Styling Konfiguratu estiloa Custom styling Diseinu pertsonalizatua Font color: Letraren kolorea: Background color: Atzeko planoaren kolorea: Background opacity: Atzeko planoaren opakutasuna: <small>Compositing is required for panel transparency.</small> <small>Konposaketa egitea beharrezkoa da panelaren gardentasunerako.</small> Background image: Atzeko planoaren irudia: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Widget estiloetarako konponbide partziala ezin dio gai bereizirik eman panelari. Baliteke ere desgaitu nahi izatea: LXQt Itxura konfigurazioa Ikonoak Gaia Koloreztatu ikonoak widget estiloaren arabera (paleta) Override icon &theme Baztertu ikonoa eta gaia Icon theme for panels: Paneletarako ikonoen gaia: Pick color Aukeratu kolorea Pick image Aukeratu irudia Images (*.png *.gif *.jpg *.svg) Irudiak (* .png * .gif * .jpg) LXQtPanel Panel Panela Configure Panel Konfiguratu panela Manage Widgets Widgetak Kudeatu Add New Panel Gehitu Panel Berria Remove Panel Menu Item Kendu Panela Lock This Panel Panel Hau Blokeatu Remove Panel Dialog Title Kendu Panela Removing a panel can not be undone. Do you want to remove this panel? Panela ezabatu ondoren, ezin da ekintza desegin. Ziur zaude panel hau ezabatu nahi duzula? Plugin Configure "%1" Konfiguratu "%1" Move "%1" Mugitu "%1" Remove "%1" Ezabatu "%1" main Use alternate configuration file. Erabili ordezko konfigurazio fitxategia. Configuration file Konfigurazio fitxategia ================================================ FILE: panel/translations/lxqt-panel_fa.ts ================================================ AddPluginDialog Add Plugins افزودن افزونه ها Search: جستجو: Add Widget افزودن ابزارک Close بستن (only one instance can run at a time) (تنها یک نسخه می‌تواند به طور همزمان اجرا شود) ConfigPanelDialog Configure Panel بخش تنظیمات Placement تعیین سطح Styling طراحی ظاهر Widgets ابزارک ها ConfigPlacement Configure Placement پیکربندی مکان Size اندازه <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>مقدار منفی برای پیکسل، طول پانل را به تعداد پیکسل‌هایی کمتر از فضای موجود روی صفحه تنظیم می‌کند.</p><p/><p><i>به عنوان مثال اگر "طول" -100px تنظیم شده باشد، وقتی که اندازه صفحه نمایش 1000 پیکسل باشد، درآنصورت طول پانل واقعی 900 پیکسل خواهد بود.</i></p> Size: اندازه: Length: طول: % ٪ px پیکسل px px Icon size: اندازه آیکون: Rows: سطر ها: Alignment && position هم ترازی && موقعیت Alignment: هم ترازی: Left چپ Center مرکز Right راست Position: موقعیت: A&uto-hide پنهان کردن&خودکار Zero means no animation صفر به معنای عدم اجرای انیمیشن است Animation duration: مدت زمان انیمیشن: ms ms Zero means no delay صفر به معنای بدون وقفه می‌باشد Show with delay: نمایش با وقفه: Visible thin margin for hidden panel حاشیه نازک قابل مشاهده برای پنل پنهان Hide only on overlapping a window فقط در صورت همپوشانی یک پنجره پنهان شود Don't allow maximized windows go under the panel window اجازه ندهید پنجره‌های حداکثری شده زیر پنجره پانل بروند Reserve space on display رزرو فضا بر روی صفحه نمایش Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top بالا Bottom پایین ConfigPluginsWidget Configure Plugins پیکربندی افزونه ها Note: changes made in this page cannot be reset. توجه: تغییرات ایجاد شده در این صفحه قابل تنظیم مجدد نیست. Move up حرکت به بالا ... Move down حرکت به پایین Add افزودن Remove حذف Configure پیکربندی ConfigStyling Configure Styling پیکربندی یک حالت دهنده Custom styling حالت دهنده سفارشی Font color: رنگ قلم: Background color: رنگ پس زمینه: Background opacity: شفافیت پس زمینه: <small>Compositing is required for panel transparency.</small> <small>ترکیب برای شفافیت پانل مورد نیاز است.</small> Background image: تصویر پس زمینه: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) یک راه حل جزئی برای سبک های ویجت که نمی توان موضوع جداگانه ای به پنل داد. همچنین ممکن است بخواهید غیرفعال کنید: پیکربندی ظاهر LXQt → تم نمادها → رنگ آمیزی نمادها بر اساس سبک ویجت (پالت) Override icon &theme لغو نماد و طرح زمینه Icon theme for panels: تم آیکون برای پنل‌ها: Pick color انتخاب رنگ Pick image انتخاب تصویر Images (*.png *.gif *.jpg *.svg) تصاویر (*.png *.gif *.jpg *.svg) LXQtPanel Panel پنل Configure Panel پیکربندی پنل Manage Widgets مدیریت ابزارک ها Add New Panel افزودن پنل جدید Remove Panel Menu Item حذف پنل Lock This Panel Remove Panel Dialog Title حذف پنل Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" انتقال "%1" Remove "%1" حذف "%1" main Use alternate configuration file. Configuration file پرونده پیکربندی ================================================ FILE: panel/translations/lxqt-panel_fi.ts ================================================ AddPluginDialog Add Plugins Lisää lisäosia Search: Etsi: Add Widget Lisää pienoisohjelma Close Sulje (only one instance can run at a time) (vain yksi voi olla kerrallaan käytössä) ConfigPanelDialog Configure Panel Muokkaa paneelia Placement Sijoittelu Styling Tyyli Widgets Vempaimet ConfigPlacement Configure Placement Määritä sijoittelu Size Koko <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negatiivinen pikseliarvo asettaa paneelin pituuden yhtä monta pikseliä käytettävissä olevaa näyttötilaa pienemmäksi.</p><p/><p><i>Esimerkiksi jos "Pituus" on asetettu arvoon -100px, ja näytön koko on 1000px, tulee paneelin pituudeksi 900px.</i></p> Size: Koko: Length: Pituus: % % px px px px Icon size: Kuvakkeiden koko: Rows: Rivejä: Alignment && position Kohdistus && sijainti Alignment: Kohdistus: Left Vasemmalla Center Keskellä Right Oikealla Position: Sijainti: A&uto-hide A&utomaattinen piilotus Zero means no animation Nolla = ei animaatiota Animation duration: Animaation kesto: ms ms Zero means no delay Nolla = ei viivettä Show with delay: Esiintulemisen viive: Visible thin margin for hidden panel Näytä ohut osa piiloitetusta paneelista Hide only on overlapping a window Piilota vain toisen ikkunan päälle mentäessä Don't allow maximized windows go under the panel window Älä salli suurennettujen ikkunoiden mennä paneelin alle Reserve space on display Varaa tilaa näytöltä Top of screen Näytön ylälaidassa Left of screen Näytön vasemmassa laidassa Right of screen Näytön oikeassa laidassa Bottom of screen Näytön alalaidassa Top of screen %1 %1. näytön yläreunassa Left of screen %1 %1. näytön vasemmassa reunassa Right of screen %1 %1. näytön oikeassa reunassa Bottom of screen %1 %1. näytön alareunassa Top Yläreunassa Bottom Alareunassa ConfigPluginsWidget Configure Plugins Säädä lisäosia Note: changes made in this page cannot be reset. Huomautus: tälle sivulle tehtyjä muutoksia ei voi resetoida. Move up Siirrä ylös ... ... Move down Siirrä alas Add Lisää Remove Poista Configure Asetukset ConfigStyling Configure Styling Määritä tyyli Custom styling Ulkoasun muokkaaminen Font color: Fontin väri: Background color: Taustaväri: Background opacity: Taustan läpinäkyvyys: <small>Compositing is required for panel transparency.</small> <small>Kompositointi tarvitaan läpinäkyvää paneelia varten</small> Background image: Taustakuva: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Osittainen kiertotapa pienoisohjelmatyyleille, jotka eivät voi antaa erillistä teemaa paneelille. Saatat myös haluta poistaa käytöstä: LXQt:n ulkoasun hallinta → Kuvaketeema → Väritä kuvakkeet pienoisohjelmatyylin (paletti) mukaan Override icon &theme Ohita &kuvaketeema Icon theme for panels: Kuvaketeema paneeleille: Pick color Valitse väri Pick image Valitse kuva Images (*.png *.gif *.jpg *.svg) Kuvat (*.png *.gif *.jpg *.svg) LXQtPanel Panel Paneeli Configure Panel Muokkaa paneelia Manage Widgets Hallitse pienoisohjelmia Add New Panel Luo uusi paneeli Remove Panel Menu Item Poista paneeli Lock This Panel Lukitse paneeli Remove Panel Dialog Title Poista paneeli Removing a panel can not be undone. Do you want to remove this panel? Paneelin poistoa ei voi peruuttaa. Haluatko varmasti poistaa tämän paneelin? Plugin Configure "%1" Säädä "%1" Move "%1" Siirrä "%1" Remove "%1" Poista "%1" main Use alternate configuration file. Käytä vaihtoehtoista asetustiedostoa. Configuration file Asetustiedosto ================================================ FILE: panel/translations/lxqt-panel_fr.ts ================================================ AddPluginDialog Add Plugins Ajout de greffons Search: Rechercher : Add Widget Ajouter le widget Close Fermer (only one instance can run at a time) (une seule instance peut être exécutée à la fois) ConfigPanelDialog Configure Panel Configurer le tableau de bord Placement Emplacement Styling Style Widgets Widgets ConfigPlacement Configure Placement Configurer l'emplacement Size Taille <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Une valeur négative définit la longueur du tableau de bord légèrement inférieure à l'espace disponible de l'écran.</p><p/><p><i>Ex. "Longueur" fixée à -100px avec une taille de l'écran 1000px donne une taille réelle du tableau de bord de 900 px.</i></p> Size: Taille : Length: Longueur : % % px px px px Icon size: Taille d'icône : Rows: Lignes : Alignment && position Alignement && position Alignment: Alignement : Left À gauche Center Centré Right À droite Position: Position : A&uto-hide Masquage a&utomatique Zero means no animation Zéro signifie aucune animation Animation duration: Durée de l'animation : ms ms Zero means no delay Zéro signifie sans délai Show with delay: Afficher avec délai : Visible thin margin for hidden panel Marge fine visible pour le panneau caché Hide only on overlapping a window Masquer uniquement lors du chevauchement d'une fenêtre Don't allow maximized windows go under the panel window Ne pas autoriser les fenêtres maximisées à aller sous le tableau de bord Reserve space on display Réserver de l'espace pour l'affichage Top of screen Haut de l’écran Left of screen Gauche de l’écran Right of screen Droite de l’écran Bottom of screen Bas de l’écran Top of screen %1 Haut de l’écran %1 Left of screen %1 Gauche de l’écran %1 Right of screen %1 Droite de l’écran %1 Bottom of screen %1 Bas de l’écran %1 Top Haut Bottom Bas ConfigPluginsWidget Configure Plugins Configurer les greffons Note: changes made in this page cannot be reset. Remarque : les modifications effectuées dans cette page ne peuvent pas être réinitialisées. Move up Déplacer vers le haut ... ... Move down Descendre Add Ajouter Remove Supprimer Configure Configurer ConfigStyling Configure Styling Configurer le style Custom styling Style personnalisé Font color: Couleur de la police : Background color: Couleur du fond : Background opacity: Opacité du fond : <small>Compositing is required for panel transparency.</small> <small>Un compositeur est nécessaire pour la transparence du tableau de bord.</small> Background image: Image de fond : A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Solution partielle de contournement pour les styles de widget qui ne peut pas donner un thème séparé au tableau de bord. Vous pourriez aussi vouloir désactiver : Configuration d'apparence LXQt → Thème des icônes → Colorier les icônes en fonction du style du widget (palette) Override icon &theme Ignorer le &thème d'icônes Icon theme for panels: Thème d'icônes pour les tableaux de bords : Pick color Choisir une couleur Pick image Choisir une image Images (*.png *.gif *.jpg *.svg) Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Tableau de bord Configure Panel Configurer le tableau de bord Manage Widgets Gérer les widgets Add New Panel Ajouter un nouveau tableau de bord Remove Panel Menu Item Supprimer le tableau de bord Lock This Panel Verrouiller ce tableau de bord Remove Panel Dialog Title Supprimer le tableau de bord Removing a panel can not be undone. Do you want to remove this panel? La suppression d'un tableau de bord ne peut pas être annulée. Voulez-vous supprimer ce tableau de bord ? Plugin Configure "%1" Configurer "%1" Move "%1" Déplacer "%1" Remove "%1" Supprimer "%1" main Use alternate configuration file. Utiliser un autre fichier de configuration. Configuration file Fichier de configuration ================================================ FILE: panel/translations/lxqt-panel_gl.ts ================================================ AddPluginDialog Add Plugins Engadir complementos Search: Buscar: Add Widget Engadir trebello Close Pechar (only one instance can run at a time) (só se permite unha instancia de vez) ConfigPanelDialog Configure Panel Configurar o panel Placement Colocación Styling Estilo Widgets Trebellos ConfigPlacement Configure Placement Configurar a colocación Size Tamaño <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Un valor negativo de píxeles estabelece a lonxitude do panel nesa mesma cantidade menos de píxeles que o espazo dispoñíbel de pantalla.</p><p/><p><i>P. ex. «Lonxitude» estabelecida a -100px, o tamaño da pantalla é de 1000px, entón a lonxitude real do panel será de 900 px.</i></p> Size: Tamaño: Length: Lonxitude: % % px px px px Icon size: Tamaño da icona: Rows: Filas: Alignment && position Aliñamento &e posición Alignment: Aliñamento: Left Esquerda Center Centro Right Dereita Position: Posición: A&uto-hide Agochar a&utomaticamente Zero means no animation Cero equivale a non usar animacións Animation duration: Duración da animación: ms ms Zero means no delay Cero equivale a sen atraso Show with delay: Amosar cun atraso de: Visible thin margin for hidden panel Marxe fina visible para o panel agochado Hide only on overlapping a window Ocultar só ao solapar unha xanela Don't allow maximized windows go under the panel window Non permitir que as xanelas maximizadas queden baixo a xanela do panel Reserve space on display Reservar espazo na pantalla Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Arriba Bottom Abaixo ConfigPluginsWidget Configure Plugins Configurar os complementos Note: changes made in this page cannot be reset. Nota: Os cambios feitos nesta páxina non é posíbel desfacelos. Move up Mover cara a arriba ... Move down Mover cara a abaixo Add Engadir Remove Retirar Configure Configurar ConfigStyling Configure Styling Configurar o estilo Custom styling Estilo personalizado Font color: Cor da letra: Background color: Cor do fondo: Background opacity: Opacidade do fondo: <small>Compositing is required for panel transparency.</small> <small>É necesaria a composición para ter transparencia no panel.</small> Background image: Imaxe de fondo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Unha solución parcial para estilos de compoñentes que non poden dar un tema separado ao panel. É posíbel que tamén queira desactivar: Configuración de aparencia de LXQt → Tema de icona → Colorar as iconas segundo o estilo dos trebellos (paleta) Override icon &theme Substituír o &tema de iconas Icon theme for panels: Tema de iconas para os paneis: Pick color Seleccione unha cor Pick image Seleccione unha imaxe Images (*.png *.gif *.jpg *.svg) Imaxes (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Configurar o panel Manage Widgets Administrar os trebellos Add New Panel Engadir un panel novo Remove Panel Menu Item Retirar o panel Lock This Panel Bloquear este panel Remove Panel Dialog Title Retirar o panel Removing a panel can not be undone. Do you want to remove this panel? A retirada dun panel non pode desfacerse. Confirma que quere retirar o panel? Plugin Configure "%1" Configurar «%1» Move "%1" Desprazar «%1» Remove "%1" Retirar «%1» main Use alternate configuration file. Usar un ficheiro alternativo de configuración. Configuration file Ficheiro de configuración ================================================ FILE: panel/translations/lxqt-panel_he.ts ================================================ AddPluginDialog Add Plugins הוספת תוספים Search: חיפוש: Add Widget הוספת וידג׳ט Close סגירה (only one instance can run at a time) (רק מופע אחד יכול לרוץ בכל פעם) ConfigPanelDialog Configure Panel הגדרת לוח Placement הצבה Styling סגנון Widgets וידג׳טים ConfigPlacement Configure Placement הגדרת הצבה Size גודל <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>ערך פיקסלים שלילי מגדיר את אורך הלוח לכמות כזאת של פיקסלים מתחת לשטח הזמין במסך.</p><p/><p>למשל: „אורך” שומגדר ל־‎-100 פיקסלים, אם גודל המסך הוא 1000 פיקסלים, אז אורך הלוח יהיה 900 פיקסלים.</p> Size: גודל: Length: אורך: % % px פיקסלים px פיקסלים Icon size: גודל סמלים: Rows: שורות: Alignment && position יישור ומיקום Alignment: יישור: Left שמאל Center מרכז Right ימין Position: מיקום: A&uto-hide הסתרה &אוטומטית Zero means no animation אפס משבית את ההנפשה Animation duration: משך הנפשה: ms מ״ש Zero means no delay אפס משבית את ההמתנה Show with delay: הצגה עם המתנה: Visible thin margin for hidden panel גבול דק גלוי ללוח נסתר Hide only on overlapping a window הסתרה רק אם יש חלון חופף Don't allow maximized windows go under the panel window לא לאפשר לחלונות מוגדלים לחתור תחת חלון הלוח Reserve space on display שמירת מקום בתצוגה Top of screen ראש המסך Left of screen שמאל המסך Right of screen ימין המסך Bottom of screen תחתית המסך Top of screen %1 ראש מסך %1 Left of screen %1 שמאל מסך %1 Right of screen %1 ימין מסך %1 Bottom of screen %1 תחתית מסך %1 Top למעלה Bottom תחתית ConfigPluginsWidget Configure Plugins הגדרת תוספים Note: changes made in this page cannot be reset. לתשומת לבך: אין אפשרות לאפס את ההגדרות שנערכו במסך הזה. Move up העברה מעלה ... Move down העברה מטה Add הוספה Remove הסרה Configure הגדרה ConfigStyling Configure Styling הגדרת סגנון Custom styling סגנון בהתאמה אישית Font color: צבע גופן: Background color: צבע רקע: Background opacity: אטימות רקע: <small>Compositing is required for panel transparency.</small> <small>נדרש ניהול חלונות להגדרת שקיפות לוח.</small> Background image: תמונת רקע: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) מעקף חלקי לסגנונות וידג׳טים שלא יכולים להשתמש בערכת עיצוב שונה ללוח. אולי עדיף גם להשבית את: הגדרות המראה של LXQt ← ערכות סמלים ← צביעת סמלים בסגנון וידג׳ט (ערכת צבעים) Override icon &theme שכתוב על &ערכת סמלים Icon theme for panels: ערכת סמלים ללוחות: Pick color בחירת צבע Pick image בחירת תמונה Images (*.png *.gif *.jpg *.svg) תמונות ‎(*.png *.gif *.jpg *.svg) LXQtPanel Panel לוח Configure Panel הגדרת לוח Manage Widgets ניהול וידג׳טים Add New Panel הוספת לוח חדש Remove Panel Menu Item הסרת לוח Lock This Panel נעילת הלוח הזה Remove Panel Dialog Title הסרת לוח Removing a panel can not be undone. Do you want to remove this panel? לא ניתן לבטל הסרת לוח. להסיר את הלוח? Plugin Configure "%1" הגדרת „%1” Move "%1" העברת „%1” Remove "%1" הסרת „%1” main Use alternate configuration file. שימוש בקובץ הגדרות חלופי. Configuration file קובץ הגדרות ================================================ FILE: panel/translations/lxqt-panel_hr.ts ================================================ AddPluginDialog Add Plugins Dodaj priključke Search: Traži: Add Widget Dodaj programčić Close Zatvori (only one instance can run at a time) (istovremeno se može pokrenuti samo jedan primjerak) ConfigPanelDialog Configure Panel Konfiguriraj ploču Placement Mjesto Styling Stiliziranje Widgets Programčići ConfigPlacement Configure Placement Konfiguriraj mjesto Size Veličina <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negativna vrijednost piksela postavlja duljinu ploče na toliki broj piksela minus dostupnog prostora na ekranu.</p><p/><p><i>Npr. „Duljina” postavljena na −100 px, s veličinom ekrana od 1000 px, tada će stvarna duljina ploče biti 900 px.</i></p> Size: Veličina: Length: Duljina: % % px px px px Icon size: Veličina ikone: Rows: Broj redaka: Alignment && position Poravnanje i položaj Alignment: Poravnanje: Left Lijevo Center Centrirano Right Desno Position: Položaj: A&uto-hide A&utomatsko skrivanje Zero means no animation Nula znači bez animacije Animation duration: Trajanje animacije: ms ms Zero means no delay Nula znači bez odgađanja Show with delay: Prikaži s odgađanjem: Visible thin margin for hidden panel Vidljiva tanka margina za skrivene ploče Hide only on overlapping a window Sakrij samo pri prekrivanju prozora Don't allow maximized windows go under the panel window Nemoj dopustiti da se maksimalno prošireni prozori povlače ispod prozora ploče Reserve space on display Rezerviraj prostor na ekranu Top of screen Gore na ekranu Left of screen Lijevo na ekranu Right of screen Desno na ekranu Bottom of screen Dolje na ekranu Top of screen %1 Gore na ekranu %1 Left of screen %1 Lijevo na ekranu %1 Right of screen %1 Desno na ekranu %1 Bottom of screen %1 Dolje na ekranu %1 Top Gore Bottom Dolje ConfigPluginsWidget Configure Plugins Konfiguriraj priključke Note: changes made in this page cannot be reset. Napomena: promjene na ovoj stranici ne mogu se poništiti. Move up Premjesti prema gore ... Move down Premjesti prema dolje Add Dodaj Remove Ukloni Configure Konfiguriraj ConfigStyling Configure Styling Konfiguriraj stiliziranje Custom styling Prilagođeno stiliziranje Font color: Boja fonta: Background color: Boja pozadine: Background opacity: Neprozirnost pozadine: <small>Compositing is required for panel transparency.</small> <small>Za prozirnost ploče, potrebno je sastavljanje slike i pozadine.</small> Background image: Slika pozadine: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Djelomična alternativa za stilove programčića koji ploči ne mogu dati zasebnu temu. Možda želiš deaktivirati i: Konfiguracija LXQt izgleda → Tema ikona → Oboji ikone na osnovi stila programčića (paleta) Override icon &theme Nadjačaj &temu ikona Icon theme for panels: Tema ikona za ploče: Pick color Odaberi boju Pick image Odaberi sliku Images (*.png *.gif *.jpg *.svg) Slike (*.png *.gif *.jpg *.svg) LXQtPanel Panel Ploča Configure Panel Konfiguriraj ploču Manage Widgets Upravljaj programčićima Add New Panel Dodaj novu ploču Remove Panel Menu Item Ukloni ploču Lock This Panel Zaključaj ovu ploču Remove Panel Dialog Title Ukloni ploču Removing a panel can not be undone. Do you want to remove this panel? Uklanjanje ploče se ne može poništiti. Svejedno ukloniti ovu ploču? Plugin Configure "%1" Konfiguriraj „%1” Move "%1" Premjesti „%1” Remove "%1" Ukloni „%1” main Use alternate configuration file. Koristi alternativnu konfiguracijsku datoteku. Configuration file Konfiguracijska datoteka ================================================ FILE: panel/translations/lxqt-panel_hu.ts ================================================ AddPluginDialog Add Plugins Bővítmény hozzáadása Search: Keresés: Add Widget Elem hozzáadása Close Bezárás (only one instance can run at a time) (egy időben csak egy futhat) ConfigPanelDialog Configure Panel Panel beállítása Placement Elhelyezés Styling Stílus Widgets Elemek ConfigPlacement Configure Placement Elhelyezés beállítása Size Méret <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negatív pixel érték azt jelöli, hogy mennyivel rövidebb a panel a képernyőnél.</p><p/><p><i>Például -100px érték esetén az 1000px széles képernyőnél a panel hossza 900px.</i></p Size: Méret: Length: Hossz: % % px px px px Icon size: Ikonméret: Rows: Sorok: Alignment && position Igazítás && helyzet Alignment: Igazítás: Left Balra Center Középre Right Jobbra Position: Helyzet: A&uto-hide A&utomatikus elrejtés Zero means no animation Nulla esetén nincs animáció Animation duration: Animáció időtartam: ms ms Zero means no delay Nulla esetén nincs késleltetés Show with delay: Megjelenítési késleltetés: Visible thin margin for hidden panel Vékony margó amikor rejtve van a panel Hide only on overlapping a window Elrejtés csak átfedő ablaknál Don't allow maximized windows go under the panel window A maximalizált ablakok nem lóghatnak a panel alá Reserve space on display A kijelzőn tartalékterület marad Top of screen Képernyő teteje Left of screen Képernyő bal oldala Right of screen Képernyő jobb oldala Bottom of screen Képernyő alja Top of screen %1 Képernyő teteje %1 Left of screen %1 Képernyő bal oldala %1 Right of screen %1 Képernyő jobb oldala %1 Bottom of screen %1 Képernyő alja %1 Top Fentre Bottom Lentre ConfigPluginsWidget Configure Plugins Bővítménybeállítások Note: changes made in this page cannot be reset. Megjegyzés: ezeket a változtatásokat nem lehet visszavonni. Move up Fel ... ... Move down Le Add Hozzáadás Remove Törlés Configure Beállítás ConfigStyling Configure Styling Stílus beállítása Custom styling Egyéni stílus Font color: Betűszín: Background color: Háttérszín: Background opacity: Háttér áttetszőség: <small>Compositing is required for panel transparency.</small> <small>A paneláttetszőséghez kompozitálás szükséges.</small> Background image: Háttérkép: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Egy részleges kerülőmegoldás azokhoz az elemstílusokhoz, amelyek nem adnak külön témát a panelnek. Lehet, hogy ki akarja kapcsolni: Megjelenés → Ikontéma → Színes ikonok az elemek stílusából (paletta) Override icon &theme Ikontéma &felülbírálása Icon theme for panels: Ikontéma a panelhez: Pick color Színválasztás Pick image Kép kiválasztása Images (*.png *.gif *.jpg *.svg) Képek (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Panel beállítása Manage Widgets Bővítmények kezelése Add New Panel Új panel Remove Panel Menu Item Panel törlése Lock This Panel Panel zárolása Remove Panel Dialog Title Panel törlése Removing a panel can not be undone. Do you want to remove this panel? A panel törlése végleges. Valóban törli? Plugin Configure "%1" "%1" beállítása Move "%1" "%1" áthelyezése Remove "%1" "%1" törlése main Use alternate configuration file. Egyéni beállítófájl használata. Configuration file Beállítófájl ================================================ FILE: panel/translations/lxqt-panel_ia.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Dimension Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_id.ts ================================================ AddPluginDialog Add Plugins Tambah Plugin Search: Cari: Add Widget Tambah Widget Close Tutup (only one instance can run at a time) (hanya satu instansi yang dapat berjalan pada satu waktu) ConfigPanelDialog Configure Panel Konfigurasi Panel Placement Penempatan Styling Gaya Widgets Widget ConfigPlacement Configure Placement Konfigurasi penempatan Size Ukuran <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Nilai piksel negatif menentukan berapa piksel yang kurang pada panjang panel dari yang tersedia pada ruang layar.</p><p/><p><i>Contoh "Panjang" diatur -100px, ukuran layar 1000px, maka panjang panel yang sebenarnya adalah 900 px.</i></p> Size: Ukuran: Length: Panjang: % % px px px px Icon size: Ukuran ikon: Rows: Baris: Alignment && position Penjajaran && posisi Alignment: Penjajaran: Left Kiri Center Tengah Right Kanan Position: Posisi: A&uto-hide Sembunyi-otomatis Zero means no animation Nol berarti tanpa animasi Animation duration: Durasi animasi: ms ms Zero means no delay Nol berarti tanpa jeda Show with delay: Tampilkan dengan jeda: Visible thin margin for hidden panel Tepi tipis yang nampak pada panel yang tersembunyi Hide only on overlapping a window Sembunyikan ketika tumpang tindih dengan sebuah jendela Don't allow maximized windows go under the panel window Jangan biarkan jendela yang dimaksimalkan masuk di bawah jendela panel Reserve space on display Cadangan ruang pada layar Top of screen Atas layar Left of screen Kiri layar Right of screen Kanan layar Bottom of screen Bawah layar Top of screen %1 Atas layar %1 Left of screen %1 Kiri layar %1 Right of screen %1 Kanan layar %1 Bottom of screen %1 Bawah layar %1 Top Atas Bottom Bawah ConfigPluginsWidget Configure Plugins Konfigurasi Panel Note: changes made in this page cannot be reset. Catatan: perubahan yang dibuat pada halaman ini tidak dapat dipulihkan. Move up Pindah keatas ... ... Move down Pindah kebawah Add Tambah Remove Hapus Configure Konfigurasi ConfigStyling Configure Styling Konfigurasi Gaya Custom styling Gaya kustom Font color: Warna fonta: Background color: Warna latar belakang: Background opacity: Opasitas latar belakang: <small>Compositing is required for panel transparency.</small> <small>Compositing dibutuhkan untuk transparasi panel.</small> Background image: Gambar latar belakang: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Solusi parsial untuk gaya widget yang tidak dapat memberikan tema terpisah pada panel. Anda mungkin juga ingin menonaktifkan: Konfigurasi Penampilan LXQt → Tema Ikon → Warnai ikon berdasarkan gaya widget (palette) Override icon &theme Ganti &tema ikon Icon theme for panels: Tema ikon untuk panel: Pick color Pilih warna Pick image Pilih gambar Images (*.png *.gif *.jpg *.svg) Gambar (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Konfigurasi Panel Manage Widgets Kelola Widget Add New Panel Tambah Panel Baru Remove Panel Menu Item Hapus Panel Lock This Panel Kunci Panel Ini Remove Panel Dialog Title Hapus Panel Removing a panel can not be undone. Do you want to remove this panel? Penghapusan panel tidak dapat dibatalkan. Apakah Anda ingin menghapus panel ini? Plugin Configure "%1" Konfigurasi "%1" Move "%1" Pindah "%1" Remove "%1" Hapus "%1" main Use alternate configuration file. Gunakan berkas konfigurasi alternatif. Configuration file Berkas konfigurasi ================================================ FILE: panel/translations/lxqt-panel_is.ts ================================================ AddPluginDialog Add Plugins Bæta við iíforriti Search: Leita: Add Widget Bæta við græju Close Loka (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_it.ts ================================================ AddPluginDialog Add Plugins Aggiungi elemento Search: Cerca: Add Widget Aggiungi Close Chiudi (only one instance can run at a time) (può essere in esecuzione una istanza sola) ConfigPanelDialog Configure Panel Configura pannello Placement Posizione Styling Stile Widgets Elementi ConfigPlacement Configure Placement Configura il posizionamento Size Dimensione <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Valori negativi impongano una lunghezza del pannello di quel numero di pixel meno dello spazio disponibile. </p><p/><p><i>Esempio: -100px e schermo di 1280px = 1180px</i></p> Size: Dimensione: Length: Lunghezza: % % px px px px Icon size: Dimensione icone: Rows: Righe: Alignment && position Allineamento e posizione Alignment: Allineamento: Left Sinistra Center Centro Right Destra Position: Posizione: A&uto-hide &Nascondi automaticamente Zero means no animation Zero significa nessuna animazione Animation duration: Durata animazione: ms ms Zero means no delay 0=nessun ritardo Show with delay: Mostra con ritardo: Visible thin margin for hidden panel Bordo fine visibile per panello nascosto Hide only on overlapping a window Nascondi solo quando una finestra lo copre Don't allow maximized windows go under the panel window Le finestre massimizzate non possono passare sotto il panello Reserve space on display Riserva lo spazio sullo schermo Top of screen In alto sullo schermo Left of screen A sinistra sullo schermo Right of screen A destra sullo schermo Bottom of screen In basso allo schermo Top of screen %1 Sullo schermo %1 in alto Left of screen %1 Sullo schermo %1 a sinistra Right of screen %1 Sullo schermo %1 a destra Bottom of screen %1 Sullo schermo %1 in basso Top In cima Bottom In fondo ConfigPluginsWidget Configure Plugins Configura elementi Note: changes made in this page cannot be reset. Nota: Modifiche fatte in questa finestra non possono essere annullate. Move up Sposta sù ... Move down Sposta giù Add Aggiungi Remove Rimuovi Configure Configura ConfigStyling Configure Styling Configura lo stile Custom styling Aspetto personalizzato Font color: Colore carattere: Background color: Colore sfondo: Background opacity: Trasparenza: <small>Compositing is required for panel transparency.</small> <small>E' necessario un compositor per la trasparenza</small> Background image: Immagine sfondo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Un parziale workaround per gli stili dei widget che non possono dare un tema separato al panel Potresti voler disabilitare anche: LXQt Configurazione Apparenza → Tema icone → Colora le icone in base allo stile del widget (palette) Override icon &theme Imponi icone alternative Icon theme for panels: Tema icone per i panelli: Pick color Scegli il colore Pick image Scegli immagine Images (*.png *.gif *.jpg *.svg) Immagini (*.png *.gif *.jpg *.svg) LXQtPanel Panel Pannello Configure Panel Configura pannello Manage Widgets Configura elementi Add New Panel Aggiungi nuovo pannello Remove Panel Menu Item Rimuovi pannello Lock This Panel Blocca questo pannello Remove Panel Dialog Title Rimuovi pannello Removing a panel can not be undone. Do you want to remove this panel? La rimozione di un pannello non può essere annullato. Vuoi veramente rimuovere questo pannello? Plugin Configure "%1" Configura "%1" Move "%1" Sposta "%1" Remove "%1" Rimuovi "%1" main Use alternate configuration file. Usa file di configurazione alternativo. Configuration file File di configurazione ================================================ FILE: panel/translations/lxqt-panel_ja.ts ================================================ AddPluginDialog Add Plugins プラグインの追加 Search: 検索: Add Widget ウィジェットへ追加 Close 閉じる (only one instance can run at a time) (一度に実行できるインスタンスは 1 つだけです) ConfigPanelDialog Configure Panel パネルの設定 Placement 配置 Styling スタイル Widgets ウィジェット ConfigPlacement Configure Placement 配置の設定 Size サイズ <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>負のピクセル値を設定すると、スクリーンの最大領域からその値を差し引いた長さになります。</p><p/><p><i>例: スクリーンのサイズが 1000 ピクセルである場合に -100 ピクセルを設定すると、パネルの長さは 900 ピクセルになります。</i></p> Size: 幅: Length: 長さ: % % px ピクセル px ピクセル Icon size: アイコンのサイズ: Rows: 行数: Alignment && position 位置寄せと場所 Alignment: 位置寄せ: Left 左寄せ Center 中央 Right 右寄せ Position: 場所: A&uto-hide 自動的に隠す(&U) Zero means no animation 0 はアニメーションしません Animation duration: アニメーションの長さ: ms ミリ秒 Zero means no delay 0 は遅延しません Show with delay: 表示の遅延: Visible thin margin for hidden panel 隠れたパネルの細い余白を見えるようにする Hide only on overlapping a window ウィンドウが重なっている場合のみ隠す Don't allow maximized windows go under the panel window 最大化したウィンドウをパネルの後ろに配置しません Reserve space on display 表示用スペースを確保する Top of screen 画面上部 Left of screen 画面左 Right of screen 画面右 Bottom of screen 画面下部 Top of screen %1 画面 %1 の上部 Left of screen %1 画面 %1 の左 Right of screen %1 画面 %1 の右 Bottom of screen %1 画面 %1 の下部 Top Bottom ConfigPluginsWidget Configure Plugins プラグインの設定 Note: changes made in this page cannot be reset. 注意: このページでの変更は[リセット]ボタンで初期化されません。 Move up 上へ移動 ... ... Move down 下へ移動 Add 追加 Remove 削除 Configure 設定 ConfigStyling Configure Styling スタイルの設定 Custom styling スタイルのカスタマイズ Font color: フォントの色: Background color: 背景色: Background opacity: 背景の不透明度: <small>Compositing is required for panel transparency.</small> <small>パネルの透明化にはコンポジターが必要です。</small> Background image: 背景の画像: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) パネルに個別のテーマを指定できない ウィジェットのスタイルのための部分的な回避策です。 次の設定を無効にすることもできます。 LXQt 設定 - 外観 → アイコンテーマ → ウィジェットのスタイル(パレット)に基づいてアイコンを色付けする Override icon &theme アイコンのテーマを上書きする(&T) Icon theme for panels: パネルのアイコンテーマ: Pick color 色の選択 Pick image 画像の選択 Images (*.png *.gif *.jpg *.svg) 画像 (*.png *.gif *.jpg *.svg) LXQtPanel Panel パネル Configure Panel パネルの設定 Manage Widgets ウィジェットの管理 Add New Panel 新しいパネルの追加 Remove Panel Menu Item パネルの削除 Lock This Panel パネルのロック Remove Panel Dialog Title パネルの削除 Removing a panel can not be undone. Do you want to remove this panel? パネルを削除すると、元に戻せません。 このパネルを削除しますか? Plugin Configure "%1" 【%1】の設定 Move "%1" 【%1】の移動 Remove "%1" 【%1】の削除 main Use alternate configuration file. 代替の設定ファイルを使用する。 Configuration file 設定ファイル ================================================ FILE: panel/translations/lxqt-panel_ka.ts ================================================ AddPluginDialog Add Plugins დამატებების დამატება Search: _ძებნა: Add Widget ვიჯეტის დამატება Close დახურვა (only one instance can run at a time) (დროის ერთ მომენტში შეიძლება, მხოლოდ, ერთი გაშვებული ასლი შეიძლება, გქონდეთ) ConfigPanelDialog Configure Panel პანელის მორგება Placement განლაგება Styling სტილი Widgets ვიჯეტები ConfigPlacement Configure Placement მოთავსების მორგება Size ზომა <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>უარყოფითი პიქსელის მნიშვნელობა აყენებს პანელის სიგრძეს იმდენ პიქსელზე, რამდენიც ხელმისაწვდომია ადგილი ეკრანის.</p><p/><p><i>მაგ "Length" აყენია -100პქს და ეკრანის ზომაა 10000პქს, მაშინ რეალური პანელის სიგრძე 900 პქს იქნება</i><p> Size: ზომა: Length: ხანგრძლივობა: % % px px px პქს Icon size: ხატულების ზომა: Rows: სტრიქონები: Alignment && position სწორება და მდებარეობა Alignment: სწორება: Left მარცხნივ Center ცენტრი Right მარჯვნივ Position: მდებარეობა: A&uto-hide ა&ვტოდამალვა Zero means no animation 0 ნიშნავს ანიმაციის გამორთვას Animation duration: ანიმაციის ხანგრძლივობა: ms მწმ Zero means no delay 0 ნიშნავს დაყოვნების არარსებობას Show with delay: ჩვენება დაყოვნებით: Visible thin margin for hidden panel ხილული თხელი საზღვარი დამალული პანელისთვის Hide only on overlapping a window დამალვა, მხოლოდ, ფანჯრით გადაფარვისას Don't allow maximized windows go under the panel window მთელ ეკრანზე გაშლილი ფანჯრები პანელის ფანჯრის ქვეშ ვერ შეძვრება Reserve space on display სივრცის რევერსი ეკრანზე Top of screen ეკრანის ზედა მხარეს Left of screen ეკრანის მარცხენა მხარეს Right of screen ეკრანის მარჯვენა მხარეს Bottom of screen ეკრანის ქვედა მხარეს Top of screen %1 ეკრანის %1 ზედა მხარეს Left of screen %1 ეკრანის %1 მარცხენა მხარეს Right of screen %1 ეკრანის %1 მარჯვენა მხარეს Bottom of screen %1 ეკრანის %1 ქვედა მხარეს Top ზემოთ Bottom ქვემოთ ConfigPluginsWidget Configure Plugins დამატებების მორგება Note: changes made in this page cannot be reset. შენიშვნა: ამ გვერდზე შეტანილი ცვლილებების ჩამოყრა შეუძლებელია. Move up აწევა ... ... Move down ქვემოთ ჩამოწევა Add დამატება Remove წაშლა Configure მორგება ConfigStyling Configure Styling სტილების მორგება Custom styling მორგებული სტილები Font color: ფონტის ფერი: Background color: ფონის ფერი: Background opacity: ფონის გაუმჭვირვალობა: <small>Compositing is required for panel transparency.</small> <small>პანელის გამჭვირვალობას კომპოზიტორი სჭირდება.</small> Background image: ფონის გამოსახულება: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) ნაწილობრივი გადაწყვეტა ვიჯეტის სტილებისთვის, რომლებსაც პანელისთვის ცალკე თემა არ აქვთ. შეიძლება, ასევე გნებავთ, გამორთოთ: LXQt-ის გარეგნობის მორგება -> ხატულების თემა -> ხატულების გაფერადება ვიჯეტის სტილის მიხედვით (პალიტრა) Override icon &theme ხატულების &თემის გადაფარვა Icon theme for panels: ხატულას თემა პანელებისთვის: Pick color აირჩიეთ ფერი Pick image აირჩიეთ გამოსახულება Images (*.png *.gif *.jpg *.svg) გამოსახულებები (*.png *.gif *.jpg *.svg) LXQtPanel Panel პანელი Configure Panel პანელის მორგება Manage Widgets ვიჯეტების მართვა Add New Panel ახალი პანელის დამატება Remove Panel Menu Item პანელის მოცილება Lock This Panel ამ პანელის ჩაკეტვა Remove Panel Dialog Title პანელის მოცილება Removing a panel can not be undone. Do you want to remove this panel? პანელის წაშლა შეუქცევადია. მართლა გნებავთ ამ პანელის წაშლა? Plugin Configure "%1" "%1"-ის მორგება Move "%1" "%1"-ის გადატანა Remove "%1" "%1"-ის წაშლა main Use alternate configuration file. სხვა კონფიგურაციის ფაილის გამოყენება. Configuration file კონფიგურაციის ფაილი ================================================ FILE: panel/translations/lxqt-panel_kab.ts ================================================ AddPluginDialog Add Plugins Rnu isiɣzaf Search: Nadi: Add Widget Close Mdel (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Aɣanib Widgets ConfigPlacement Configure Placement Size Tiddi <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Tiddi: Length: % % px px px px Icon size: Tiddi n tignit: Rows: Alignment && position Alignment: Left Azelmaḍ Center Talemmast Right Ayeffus Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of desktop Left of desktop Right of desktop Bottom of desktop Top of desktop %1 Left of desktop %1 Right of desktop %1 Bottom of desktop %1 Top Afella Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... ... Move down Add Rnu Remove Kkes Configure Swel ConfigStyling Configure Styling Swel aɣanib Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Afeggag Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_kk.ts ================================================ AddPluginDialog Add Plugins Плагиндерді қосу Search: Іздеу: Add Widget Виджетті қосу Close Жабу (only one instance can run at a time) (бір уақытта тек бір данасы ғана жұмыс істей алады) ConfigPanelDialog Configure Panel Панельді баптау Placement Орналасу Styling Стильдеу Widgets Виджеттер ConfigPlacement Configure Placement Орналасуды баптау Size Өлшемі <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Пиксельдің теріс мәні панель ұзындығын қолжетімді экран орнынан сонша пиксельге аз етіп орнатады.</p><p/><p><i>Мысалы: "Ұзындығы" -100px мәніне орнатылса, экран өлшемі 1000px болса, онда панельдің нақты ұзындығы 900 px болады.</i></p> Size: Өлшемі: Length: Ұзындығы: % % px gbrc px gbrc Icon size: Таңбаша өлшемі: Rows: Жолдар: Alignment && position Туралау және орны Alignment: Туралау: Left Сол жақ Center Ортасы Right Оң жақ Position: Орны: A&uto-hide &Автоматты түрде жасыру Zero means no animation Нөл анимацияның жоқтығын білдіреді Animation duration: Анимация ұзақтығы: ms мс Zero means no delay Нөл кідірістің жоқтығын білдіреді Show with delay: Кідіріспен көрсету: Visible thin margin for hidden panel Жасырын панель үшін көрінетін жұқа жиек Hide only on overlapping a window Тек терезе қабаттасқан кезде жасыру Don't allow maximized windows go under the panel window Жайылған терезелердің панель терезесінің астына өтуіне жол бермеу Reserve space on display Экранда орын қалдыру Top of screen Экранның жоғарғы жағы Left of screen Экранның сол жағы Right of screen Экранның оң жағы Bottom of screen Экранның төменгі жағы Top of screen %1 Экранның жоғарғы жағы %1 Left of screen %1 Экранның сол жағы %1 Right of screen %1 Экранның оң жағы %1 Bottom of screen %1 Экранның төменгі жағы %1 Top Жоғары Bottom Төмен ConfigPluginsWidget Configure Plugins Плагиндерді баптау Note: changes made in this page cannot be reset. Ескертпе: бұл бетте жасалған өзгерістерді қалпына келтіру мүмкін емес. Move up Жоғары жылжыту ... ... Move down Төмен жылжыту Add Қосу Remove Өшіру Configure Баптау ConfigStyling Configure Styling Стильді баптау Custom styling Өзгертілген стиль Font color: Қаріп түсі: Background color: Фон түсі: Background opacity: Фон мөлдірлігі: <small>Compositing is required for panel transparency.</small> <small>Панель мөлдірлігі үшін композитинг қажет.</small> Background image: Фон суреті: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Панельге бөлек теманы бере алмайтын виджет стильдері үшін жартылай шешім. Сондай-ақ мынаны сөндіруді қалауыңыз мүмкін: LXQt сыртқы түрін баптау → Таңбашалар темасы → Таңбашаларды виджет стиліне (палитра) негіздеп бояу Override icon &theme Таңбашалар &темасын алмастыру Icon theme for panels: Панельдерге арналған таңбашалар темасы: Pick color Түсті таңдау Pick image Суретті таңдау Images (*.png *.gif *.jpg *.svg) Суреттер (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панель Configure Panel Панельді баптау Manage Widgets Виджеттерді басқару Add New Panel Жаңа панельді қосу Remove Panel Menu Item Панельді өшіру Lock This Panel Бұл панельді бұғаттау Remove Panel Dialog Title Панельді өшіру Removing a panel can not be undone. Do you want to remove this panel? Панельді өшіру әрекетін кері қайтару мүмкін емес. Бұл панельді өшіруді қалайсыз ба? Plugin Configure "%1" "%1" баптау Move "%1" "%1" жылжыту Remove "%1" "%1" өшіру main Use alternate configuration file. Балама конфигурация файлын қолдану. Configuration file Конфигурация файлы ================================================ FILE: panel/translations/lxqt-panel_ko.ts ================================================ AddPluginDialog Add Plugins 플러그인 추가 Search: 검색: Add Widget 위젯 추가 Close 닫기 (only one instance can run at a time) (한 번에 하나의 인스턴스만 실행할 수 있음) ConfigPanelDialog Configure Panel 패널 구성하기 Placement 배치 Styling 스타일링 Widgets 위젯 ConfigPlacement Configure Placement 배치 구성하기 Size 크기 <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>네거티브 픽셀 값은 패널 길이를 사용 가능한 화면 공간보다 많은 픽셀로 설정합니다.</p><p/><p><i>예)"길이" 100 픽셀로 설정하고 화면 크기를 1000 픽셀로 설정하면 실제 패널 길이는 900 픽셀이 됩니다.</i></p> Size: 크기: Length: 길이: % % px px px px Icon size: 아이콘 크기: Rows: 줄: Alignment && position 정렬 && 위치 Alignment: 정렬: Left 왼쪽 Center 가운데 Right 오른쪽 Position: 위치: A&uto-hide 자동 숨김 Zero means no animation 0은 애니메이션이 없음을 의미함 Animation duration: 애니메이션 재생시간: ms ms Zero means no delay 0은 지연시간이 없음을 의미함 Show with delay: 지연 시간 표시: Visible thin margin for hidden panel 숨겨진 패널에 보이는 얇은 여백 Hide only on overlapping a window 창과 겹칠 때만 숨김 Don't allow maximized windows go under the panel window 패널 창 아래에 최대화한 창 허용하지 않기 Reserve space on display 화면을 위한 공간 예약 Top of screen 화면 상단 Left of screen 화면 왼쪽 Right of screen 화면 오른쪽 Bottom of screen 화면 하단 Top of screen %1 화면 %1의 상단 Left of screen %1 화면 %1의 왼쪽 Right of screen %1 화면 %1의 오른쪽 Bottom of screen %1 화면 %1의 하단 Top Bottom 아래 ConfigPluginsWidget Configure Plugins 플러그인 구성하기 Note: changes made in this page cannot be reset. 알림: 이 페이지의 변경 사항은 초기화할 수 없습니다. Move up 위로 이동 ... ... Move down 아래로 이동 Add 추가 Remove 제거 Configure 구성하기 ConfigStyling Configure Styling 스타일링 구성하기 Custom styling 사용자 설정 Font color: 글꼴 색: Background color: 배경 색: Background opacity: 배경 투명도: <small>Compositing is required for panel transparency.</small> <small>패널 투명화를 위해서 컴포지팅이 필요합니다.</small> Background image: 배경 이미지: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) 위젯 스타일에 대한 부분적인 해결 방법으로는 패널에 별도의 테마를 줄 수는 없습니다. 이것도 사용 안 함으로 하시겠나요: LXQt 모양새 구성 → 아이콘 테마 → 위젯 스타일 (팔레트) 기반 아이콘 색상 지정 Override icon &theme 아이콘 테마 덮어쓰기 Icon theme for panels: 패널용 아이콘 테마: Pick color 색상 선택 Pick image 이미지 선택 Images (*.png *.gif *.jpg *.svg) 이미지 (*.png *.gif *.jpg *.svg) LXQtPanel Panel 패널 Configure Panel 패널 구성하기 Manage Widgets 위젯 관리 Add New Panel 새 패널 추가 Remove Panel Menu Item 패널 제거 Lock This Panel 이 패널 잠그기 Remove Panel Dialog Title 패널 제거 Removing a panel can not be undone. Do you want to remove this panel? 패널 제거는 취소할 수 없습니다. 이 패널을 제거하시겠습니까? Plugin Configure "%1" "%1" 구성하기 Move "%1" 이동 "%1" Remove "%1" 제거 "%1" main Use alternate configuration file. 다른 설정 파일을 사용하세요. Configuration file 설정 파일 ================================================ FILE: panel/translations/lxqt-panel_lg.ts ================================================ AddPluginDialog Add Plugins Kuteekako ebyongerwako Search: Noonya: Add Widget Teekawo akatundu Close Mala (only one instance can run at a time) (akatundu kano ku lubaawo kukkirizibwako kamu kokka) ConfigPanelDialog Configure Panel Teekateeka lubaawo Placement Eby'obusangiro Styling Endabika Widgets Obutundu ConfigPlacement Configure Placement Tegeka obusangiro Size Obunene bw'olubaawo n'ebiruliko <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Bw'oteekawo omuwendo gwa pikiseli ogwa negatifu obugazi bw'olubaawo bujja okubeera obugazi bw'olutimbe mu pikiseli ng'otoddeko omuwendo ogwo.</p><p/><p><i>Okugeza "Bugazi" bwe bubeera -100px, obugazi bw'olutimbe nga buli 1000px, olubaawo lujja okubeera n'obugazi bwa 900px.</i></p> Size: Bugulumivu: Length: Bugazi: % % px px px px Icon size: Bunene bw'obufaananyi: Rows: Ennyiriri: Alignment && position Entereera n'obusangiro Alignment: Entereera: Left Ku kkono Center Mu makkati Right Ku ddyo Position: Obusangiro: A&uto-hide L&wezingengako Zero means no animation Bw'oteekawo zero lubulawo bubuzi Animation duration: Ebbanga lye lumala nga lukyezingako: ms ms Zero means no delay Bw'oteekawo zero lujjirawo Show with delay: Ebbanga eriyitawo lulabike ng'oluyise: Visible thin margin for hidden panel Wabeerewo akalaga olubaawo gye lwezingidde Hide only on overlapping a window Eddirisa lya puloguramu okulugwako kye kyokka ekiba kiluleetera okwezingako Don't allow maximized windows go under the panel window Amadirisa agagejjesedwa galemenga okuyingirira olubaawo Reserve space on display Ekifo ekibeeramu olubaawo kireme okugendangamu bintu birala Top of screen Waggulu ku lutimbe Left of screen Ku kkono w'olutimbe Right of screen Ku ddyo w'olutimbe Bottom of screen Ku lutimbe wansi Top of screen %1 Waggulu ku lutimbe namba %1 Left of screen %1 Ku kkono w'olutimbe namba %1 Right of screen %1 Ku ddyo w'olutimbe namba %1 Bottom of screen %1 Ku lutimbe namba %1 wansi Top Waggulu Bottom Wansi ConfigPluginsWidget Configure Plugins Teekateeka ebyongerwako Note: changes made in this page cannot be reset. Genderera: by'okyusa wano era gwe olina okubyejjululira. Move up Yambusa ... ... Move down Ssa Add Teekamu akatundu Remove Kano kagyemu Configure Kateekateeke ConfigStyling Configure Styling Teekateeka endabika Custom styling By'osobola okweteekateekera Font color: Langi y'ennukuta: Background color: Langi ey'obwaliriro: Background opacity: Okutangaalijja kw'obwaliriro: <small>Compositing is required for panel transparency.</small> <small>Olubaawo okutangaalijja kyetaagisa ne puloguramu<br>ekwanaganya ebirabikira awakolerwa etandikibwe.</small> Background image: Kifaananyi eky'okubwaliriro: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Kino kiyambako singa olulyo lw'endabika z'obutundu bw'awakolerwa terukkiriza ebiri ku olubaawo obutafaanana ebiri awalala. Kiyinza n'okwetaagisa n'okusirisa kino: Teekateeka ndabika ya LXQt → Lulyo lw'obufaananyi → Obufaananyi bukozese langi eza mu lulyo lw'obutundu bw'awakolerwa Override icon &theme &Kozesa olulyo lw'obufaananyi olwawukana n'olw'awakolerwa Icon theme for panels: Lulyo lw'obufaananyi obw'oku lubaawo: Pick color Londa langi Pick image Londa kifaananayi Images (*.png *.gif *.jpg *.svg) Bifaananayi (*.png *.gif *.jpg *.svg) LXQtPanel Panel Lubaawo Configure Panel Teekateeka lubaawo Manage Widgets Teekateeka Butundu Add New Panel Yongerwo olubaawo olulala Remove Panel Menu Item Gyawo olubaawo Lock This Panel Olubaawo luno lusibirewo Remove Panel Dialog Title Gyawo olubaawo Removing a panel can not be undone. Do you want to remove this panel? Olubaawo bw'olugyawo okuluzzawo olina okutandika lupya. Luno ddala oyagala okulugyawo? Plugin Configure "%1" Teekateka "%1" Move "%1" Simbuliza "%1" Remove "%1" Gyawo "%1" main Use alternate configuration file. Kozesa fayiro ey'enteekateeka ndala. Configuration file Fayiro ey'enteekateeka ================================================ FILE: panel/translations/lxqt-panel_lt.ts ================================================ AddPluginDialog Add Plugins Pridėti įskiepius Search: Ieškoti: Add Widget Pridėti valdiklį Close Užverti (only one instance can run at a time) (vienu metu gali būti vykdomas tik vienas egzempliorius) ConfigPanelDialog Configure Panel Konfigūruoti skydelį Placement Išdėstymas Styling Dizainas Widgets Valdikliai ConfigPlacement Configure Placement Konfigūruoti išdėstymą Size Dydis <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Neigiama pikselių reikšmė nustato skydelio ilgį tiek pikselių mažiau nei yra prieinama vietos ekrane.</p><p/><p><i>Pvz., Yra nustatytas „Ilgis“ -100 pikselių, ekrano dydis yra 1000 pikselių, tuomet tikrasis skydelio ilgis bus 900 pikselių.</i></p> Size: Dydis: Length: Ilgis: % % px piks px piks Icon size: Piktogramų dydis: Rows: Eilutės: Alignment && position Lygiavimas ir padėtis Alignment: Lygiavimas: Left Kairėje Center Centre Right Dešinėje Position: Padėtis: A&uto-hide A&utomatiškai slėpti Zero means no animation Nulis reiškia be jokios animacijos Animation duration: Animacijos trukmė: ms ms Zero means no delay Nulis reiškia be delsos Show with delay: Rodyti po delsos: Visible thin margin for hidden panel Matoma plona paslėpto skydelio paraštė Hide only on overlapping a window Slėpti tik tada, kai skydelį užkloja langas Don't allow maximized windows go under the panel window Neleisti išskleistiems langams palįsti po skydelio langu Reserve space on display Rezervuoti vietą ekrane Top of screen Ekrano viršus Left of screen Ekrano kairė Right of screen Ekrano dešinė Bottom of screen Ekrano apačia Top of screen %1 Ekrano %1 viršus Left of screen %1 Ekrano %1 kairė Right of screen %1 Ekrano %1 dešinė Bottom of screen %1 Ekrano %1 apačia Top Viršuje Bottom Apačioje ConfigPluginsWidget Configure Plugins Konfigūruoti įskiepius Note: changes made in this page cannot be reset. Pastaba: šiame puslapyje atlikti pakeitimai negali būti atstatyti. Move up Pakelti ... ... Move down Nuleisti Add Pridėti Remove Šalinti Configure Konfigūruoti ConfigStyling Configure Styling Konfigūruoti dizainą Custom styling Tinkintas stilius Font color: Šrifto spalva: Background color: Fono spalva: Background opacity: Fono nepermatomumas: <small>Compositing is required for panel transparency.</small> <small>Skydelio permatomumui reikalingas komponavimas.</small> Background image: Fono paveikslas: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Dalinis problemos apėjimas valdiklių stiliams, kurie negali suteikti atskiro apipavidalinimo skydeliui. Jūs taip pat galite pageidauti išjungti: LXQT išvaizdos konfigūravimas → Piktogramų apipavidalinimas → Spalvinti piktogramas valdiklių stiliaus (spalvų paletės) pagrindu Override icon &theme Nustelbti piktogramų apipavi&dalinimą Icon theme for panels: Skydelių piktogramų apipavidalinimas: Pick color Pasirinkite spalvą Pick image Pasirinkite paveikslą Images (*.png *.gif *.jpg *.svg) Paveikslai (*.png *.gif *.jpg *.svg) LXQtPanel Panel Skydelis Configure Panel Konfigūruoti skydelį Manage Widgets Tvarkyti valdiklius Add New Panel Pridėti naują skydelį Remove Panel Menu Item Šalinti skydelį Lock This Panel Užrakinti šį skydelį Remove Panel Dialog Title Šalinti skydelį Removing a panel can not be undone. Do you want to remove this panel? Skydelio šalinimas negali būti atšauktas. Ar norite pašalinti šį skydelį? Plugin Configure "%1" Konfigūruoti „%1“ Move "%1" Perkelti „%1“ Remove "%1" Šalinti „%1“ main Use alternate configuration file. Naudoti alternatyvų konfigūracijos failą. Configuration file Konfigūracijos failas ================================================ FILE: panel/translations/lxqt-panel_lv.ts ================================================ AddPluginDialog Add Plugins Pielikt spraudņus/plaginus Search: Meklēt: Add Widget Pielikt vidžetu Close Aizvērt (only one instance can run at a time) (vienlaicīgi var palaist/darbināt tikai vienu eksemplāru) ConfigPanelDialog Configure Panel Iestatīt paneli Placement Styling Widgets Vidžeti ConfigPlacement Configure Placement Size Izmērs <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negatīva pikseļa vērtība iestata paneļa garumu par tik daudz pikseļiem mazāku par pieejamo ekrāna izmēru.</p><p/><p><i> Piem. Ja "Garums" iestatīts -100px, ekrāna izmērs ir 1000px, tad reālais paneļa garums būs 900px.</i></p> Size: Izmērs: Length: Garums: % % px pikseļi px pikseļi Icon size: Ikonu izmērs: Rows: Rindas: Alignment && position Izlīdzinājums un novietojums Alignment: Izlīdzinājums: Left Pa kreisi Center Centrā Right Pa labi Position: Atrašanās: A&uto-hide &Automātiski paslēpt Zero means no animation Nulle nozīmē animācijas neesamību Animation duration: Animācijas ilgums: ms ms Zero means no delay Nulle nozīmē aizkaves neesamību Show with delay: Parādīt ar aizkavi/aizturi: Visible thin margin for hidden panel Slēptajam panelim rādīt tievu/plānu ietvaru Hide only on overlapping a window Paslēpt tikai uz pārklājošās loga Don't allow maximized windows go under the panel window Neļaut maksimizētajiem logiem paiet zem paneļa loga Reserve space on display Rezervēt vietu uz ekrāna Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Augšā Bottom Apakšā ConfigPluginsWidget Configure Plugins Iestatīt spraudņus/plaginus Note: changes made in this page cannot be reset. Piezīme: Šajā lapā veiktās izmaiņas nevar atstatīt. Move up Pārvietot augšup ... ... Move down Pārvietot lejup Add Pielikt/pievienot Remove Noņemt Configure Iestatīt ConfigStyling Configure Styling Custom styling Pielāgots stils Font color: Šrifta krāsa: Background color: Fona krāsa: Background opacity: Fona necaurspīdīgums: <small>Compositing is required for panel transparency.</small> <small>Paneļa caurspīdīgumam ir nepieciešama kompozīcija.</mazs> Background image: Fona attēls: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Daļējs apejas risinājums logrīku/vidžetu stiliem, kas panelim nevar piešķirt atsevišķu tēmu. Iespējams, vēlēsieties arī atspējot: LXQt Izskata konfigurācija → Ikonu tēma → Iekrāsot ikonas, balstoties uz logrīku stilu (palete) Override icon &theme Nomākt ikonu &tēmu Icon theme for panels: Ikonu tēma paneļiem: Pick color Izvēlēties krāsu Pick image Izvēlēties attēlu Images (*.png *.gif *.jpg *.svg) Attēli (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panelis Configure Panel Iestatīt paneli Manage Widgets Pārvaldīt logrīkus/vidžetus Add New Panel Pielikt jaunu paneli Remove Panel Menu Item Noņemt paneli Lock This Panel Nostiprināt paneli Remove Panel Dialog Title Noņemt paneli Removing a panel can not be undone. Do you want to remove this panel? Paneļa noņemšanu nevar atsaukt/atdarīt. Tomēr vēlaties noņemt šo paneli? Plugin Configure "%1" Iestatīt "%1" Move "%1" Pārvietot "%1" Remove "%1" Noņemt "%1" main Use alternate configuration file. Izmantot alternatīvu iestatījumu/konfigurācijas failu. Configuration file Iestatījumu/konfigurācijas fails ================================================ FILE: panel/translations/lxqt-panel_nb_NO.ts ================================================ AddPluginDialog Add Plugins Legg til tillegg Search: Søk: Add Widget Legg til modul Close Lukk (only one instance can run at a time) (et tillegg kan ikke kjøres mer enn en gang samtidig) ConfigPanelDialog Configure Panel Konfigurer panelet Placement Plassering Styling Stil Widgets Moduler ConfigPlacement Configure Placement Plasseringsvalg Size Størrelse <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>En negativ pikselverdi gjør panelet så mange piksler mindre enn skjermstørrelsen.</p><p/><p><i>Hvis f.eks. lengden settes til -100 piksler og skjermstørrelsen er 1000 piksler vil panelet bli 900 piksler langt.</i></p> Size: Størrelse: Length: Lengde: % % px px px px Icon size: Ikonstørrelse: Rows: Rader: Alignment && position Justering &og plassering Alignment: Justering: Left Venstre Center I midten Right Høyre Position: Plassering: A&uto-hide Skj&ul automatisk Zero means no animation Null betyr ingen animasjon Animation duration: Lengde på animasjon: ms ms Zero means no delay Null betyr ingen forsinkelse Show with delay: Vis med forsinkelse: Visible thin margin for hidden panel Synlig tynn marg for skjult panel Hide only on overlapping a window Skjul kun ved overlappende vindu Don't allow maximized windows go under the panel window Ikke tillat maksimerte vinduer å ligge under panelet Reserve space on display Reserver plass på skjermen Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Øverst Bottom Nederst ConfigPluginsWidget Configure Plugins Konfigurer tillegg Note: changes made in this page cannot be reset. Merk: Forandringer gjort på denne siden kan ikke tilbakestilles. Move up Flytt oppover ... Move down Flytt nedover Add Legg til Remove Fjern Configure Konfigurer ConfigStyling Configure Styling Tilpass stil Custom styling Selvvalgt stil Font color: Skriftfarge: Background color: Bakgrunnsfarge: Background opacity: Bakgrunnsugjennomsiktighet: <small>Compositing is required for panel transparency.</small> <small>Lagsammenføying (compositing) er nødvendig for panelets gjennomsiktighet.</small> Background image: Bakgrunnsbilde: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) En delvis løsning for widget-stiler som ikke kan gi et separat tema til panelet. Du ønsker kanskje også å slå av: LXQt Utseendeinnstillinger → Ikontema → Fargelegg ikoner basert på widget-stil (palett) Override icon &theme Overstyr ikon&tema Icon theme for panels: Ikontema for paneler: Pick color Velg farge Pick image Velg bilde Images (*.png *.gif *.jpg *.svg) Bilder (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panelet Configure Panel Konfigurer panelet Manage Widgets Håndter moduler Add New Panel Legg til nytt panel Remove Panel Menu Item Fjern panel Lock This Panel Lås dette panelet Remove Panel Dialog Title Fjern panel Removing a panel can not be undone. Do you want to remove this panel? Å fjerne panelet kan ikke omgjøres. Ønsker du likevel å fjerne panelet? Plugin Configure "%1" Konfigurer "%1" Move "%1" Flytt "%1" Remove "%1" Fjern "%1" main Use alternate configuration file. Bruk en alternativ konfigurasjonsfil. Configuration file Konfigurasjonsfil ================================================ FILE: panel/translations/lxqt-panel_nl.ts ================================================ AddPluginDialog Add Plugins Invoegtoepassingen Search: Zoeken: Add Widget Widget toevoegen Close Sluiten (only one instance can run at a time) (er kan slechts één exemplaar actief zijn) ConfigPanelDialog Configure Panel Paneel instellen Placement Positie Styling Stijl Widgets Widgets ConfigPlacement Configure Placement Positie instellen Size Grootte <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negatieve pixelwaarden stellen de paneellengte in op de beschikbare schermruimte, minus het opgegeven aantal pixels.</p><p/><p><i>Voorbeeld: bij een 'Lengte' van -100px en een schermgrootte van 1000px, heeft het paneel een lengte van 900 px.</i></p> Size: Grootte: Length: Lengte: % % px px px px Icon size: Pictogramgrootte: Rows: Rijen: Alignment && position Uitlijning en positie Alignment: Uitlijning: Left Links Center Midden Right Rechts Position: Positie: A&uto-hide Automatisch verbergen Zero means no animation Nul = geen animatie Animation duration: Animatieduur: ms ms Zero means no delay Nul = geen vertraging Show with delay: Vertraagd tonen: Visible thin margin for hidden panel Zichtbare dunne marge van verborgen paneel Hide only on overlapping a window Alleen verbergen bij vensteroverlapping Don't allow maximized windows go under the panel window Niet toestaan dat gemaximaliseerde vensters onder het paneelvenster kunnen duiken Reserve space on display Ruimte reserveren op scherm Top of screen Bovenkant Left of screen Linkerkant Right of screen Rechterkant Bottom of screen Onderkant Top of screen %1 Bovenkant van %1 Left of screen %1 Linkerkant van %1 Right of screen %1 Rechterkant van %1 Bottom of screen %1 Onderkant van %1 Top Bovenaan Bottom Onderaan ConfigPluginsWidget Configure Plugins Invoegtoepassingen instellen Note: changes made in this page cannot be reset. Let op: hier aangebrachte wijzigingen kunnen niet ongedaan worden gemaakt. Move up Omhoog verplaatsen ... Move down Omlaag verplaatsen Add Toevoegen Remove Verwijderen Configure Instellen ConfigStyling Configure Styling Stijl instellen Custom styling Eigen stijl Font color: Tekstkleur: Background color: Achtergrondkleur: Background opacity: Ondoorzichtigheid van achtergrond: <small>Compositing is required for panel transparency.</small> <small>Hardwareversnelling is vereist om het paneel doorzichtig te kunnen maken.</small> Background image: Achtergrondafbeelding: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Een gedeeltelijke noodoplossing voor widgetstijlen die het paneel niet van een afzonderlijk thema kunnen voorzien. U wilt wellicht ook het volgende uitschakelen: LXQt-vormgevingsinstellingen → Pictogramthema → Pictogrammen inkleuren op basis van elementstijl (palet) Override icon &theme Pictogram&thema omzeilen Icon theme for panels: Pictogramthema van panelen: Pick color Kies een kleur Pick image Kies een afbeelding Images (*.png *.gif *.jpg *.svg) Afbeeldingen (*.png *.gif *.jpg *.svg) LXQtPanel Panel Paneel Configure Panel Paneel instellen Manage Widgets Widgets beheren Add New Panel Paneel toevoegen Remove Panel Menu Item Paneel verwijderen Lock This Panel Paneel vergrendelen Remove Panel Dialog Title Paneel verwijderen Removing a panel can not be undone. Do you want to remove this panel? Het verwijderen van panelen kan niet ongedaan worden gemaakt. Weet u zeker dat u wilt doorgaan? Plugin Configure "%1" ‘%1’ instellen Move "%1" ‘%1’ verplaatsen Remove "%1" ‘%1’ verwijderen main Use alternate configuration file. Gebruik een alternatief instellingenbestand. Configuration file Instellingenbestand ================================================ FILE: panel/translations/lxqt-panel_oc.ts ================================================ AddPluginDialog Add Plugins Apondon d’empeutons Search: Recercar : Add Widget Apondre lo widget Close Tampar (only one instance can run at a time) ConfigPanelDialog Configure Panel Configurar lo tablèu de bòrd Placement Emplaçament Styling Estil Widgets Widgets ConfigPlacement Configure Placement Configurar l’emplaçament Size Talha <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Talha : Length: Largor : % % px px px px Icon size: Talha de l’icòna : Rows: Linhas : Alignment && position Alinhament && posicion Alignment: Alinhament : Left Esquèr Center Centre Right Drech Position: Posicion : A&uto-hide Am&agament automatic Zero means no animation Animation duration: Durada de l’animacion : ms ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Apondre Remove Suprimir Configure Configurar ConfigStyling Configure Styling Configurar l’estil Custom styling Estil personalizat Font color: Color de polissa : Background color: Color de fons : Background opacity: Opacitat del fons : <small>Compositing is required for panel transparency.</small> Background image: Imatge de fons : A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Subrecargar lo &tèma d’icònas Icon theme for panels: Pick color Causir una color Pick image Causir un imatge Images (*.png *.gif *.jpg *.svg) Imatges (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panèl Configure Panel Configurar lo tablèu de bòrd Manage Widgets Add New Panel Apondre un panèl novèl Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Configurar « %1 » Move "%1" Desplaçar « %1 » Remove "%1" Suprimir « %1 » main Use alternate configuration file. Utilizar un fichièr de configuracion alternatiu. Configuration file Fichièr de configuracion ================================================ FILE: panel/translations/lxqt-panel_pa.ts ================================================ AddPluginDialog Add Plugins ਪਲੱਗਇਨਾਂ ਜੋੜੋ Search: ਖੋਜੋ: Add Widget ਵਿਜੈੱਟ ਜੋੜੋ Close ਬੰਦ ਕਰੋ (only one instance can run at a time) (ਇੱਕ ਸਮੇਂ ਇੱਕ ਹੀ ਮੌਕਾ ਚੱਲ ਸਕਦਾ ਹੈ) ConfigPanelDialog Configure Panel ਪੈਨਲ ਦੀ ਸੰਰਚਨਾ Placement ਥਾਂ Styling ਸਟਾਈਲਿੰਗ Widgets ਵਿਜੈੱਟ ConfigPlacement Configure Placement ਥਾਂ ਦੀ ਸੰਰਚਨਾ Size ਆਕਾਰ <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: ਆਕਾਰ: Length: ਲੰਬਾਈ: % %1 px ਪਿਕਸਲ px ਪਿਕਸਲ Icon size: ਆਈਕਾਨ ਦਾ ਆਕਾਰ: Rows: ਕਤਾਰਾਂ: Alignment && position ਇਕਸਾਰ ਤੇ ਸਥਿਤੀ Alignment: ਇਕਸਾਰ: Left ਖੱਬੇ Center ਸੈਂਟਰ Right ਸੱਜੇ Position: ਸਥਿਤੀ: A&uto-hide ਆਪੇ-ਓਹਲੇ(&u) Zero means no animation ਸਿਫ਼ਰ ਦਾ ਮਤਲਬ ਕੋਈ ਐਨੀਮੇਸ਼ਨ ਨਹੀਂ Animation duration: ਐਨੀਮੇਸ਼ਨ ਦਾ ਅੰਤਰਾਲ: ms ਮਿ.ਸ. Zero means no delay ਸਿਫ਼ਰ ਦਾ ਮਤਲਬ ਕੋਈ ਦੇਰੀ ਨਹੀਂ Show with delay: ਦੇਰੀ ਨਾਲ ਵੇਖਾਓ: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen ਸਕਰੀਨ ਦੇ ਉੱਤੇ Left of screen Right of screen ਸਕਰੀਨ ਦੇ ਸੱਜੇ Bottom of screen ਸਕਰੀਨ ਦੇ ਹੇਠਾਂ Top of screen %1 ਸਕਰੀਨ %1 ਦੇ ਉੱਤੇ Left of screen %1 Right of screen %1 Bottom of screen %1 Top ਉੱਤੇ Bottom ਹੇਠਾਂ ConfigPluginsWidget Configure Plugins ਪਲੱਗਇਨਾਂ ਦੀ ਸੰਰਚਨਾ Note: changes made in this page cannot be reset. Move up ਉੱਤੇ ਭੇਜੋ ... ... Move down ਹੇਠਾਂ ਭੇਜੋ Add ਜੋੜੋ Remove ਹਟਾਓ Configure ਸੰਰਚਨਾ ConfigStyling Configure Styling Custom styling Font color: ਫ਼ੋਂਟ ਦਾ ਰੰਗ: Background color: ਬੈਕਗਰਾਊਂਡ ਦਾ ਰੰਗ: Background opacity: ਬੈਕਗਰਾਊਂਡ ਦਾ ਧੁੰਦਲਾਪਨ: <small>Compositing is required for panel transparency.</small> Background image: ਬੈਕਗਰਾਊਂਡ ਦਾ ਚਿੱਤਰ: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme ਆਈਕਾਨ ਥੀਮ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰੋ(&t) Icon theme for panels: ਪੈਨਲ ਲਈ ਆਈਕਾਨ ਥੀਮ: Pick color ਰੰਗ ਚੁਣੋ Pick image ਚਿੱਤਰ ਚੁਣੋ Images (*.png *.gif *.jpg *.svg) ਚਿੱਤਰ (*.png *.gif *.jpg *.svg) LXQtPanel Panel ਪੈਨਲ Configure Panel ਪੈਨਲ ਦੀ ਸੰਰਨਾ Manage Widgets ਵਿਜੈਟ ਦਾ ਇੰਤਜ਼ਾਮ Add New Panel ਨਵਾਂ ਪੈਨਲ ਜੋੜੋ Remove Panel Menu Item ਪੈਨਲ ਨੂੰ ਹਟਾਓ Lock This Panel ਇਹ ਪੈਨਲ ਨੂੰ ਲਾਕ ਕਰੋ Remove Panel Dialog Title ਪੈਨਲ ਨੂੰ ਹਟਾਓ Removing a panel can not be undone. Do you want to remove this panel? ਪੈਨਲ ਨੂੰ ਹਟਾਉਣ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਇਹ ਪੈਨਲ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? Plugin Configure "%1" "%1" ਦੀ ਸੰਰਚਨਾ Move "%1" "%1" ਨੂੰ ਹਿਲਾਓ Remove "%1" "%1" ਨੂੰ ਹਟਾਓ main Use alternate configuration file. ਬਦਲਵੀ ਸੰਰਚਨਾ ਫਾਇਲ ਨੂੰ ਵਰਤੋਂ। Configuration file ਫਾਇਲ ਦੀ ਸੰਰਚਨਾ ================================================ FILE: panel/translations/lxqt-panel_pl.ts ================================================ AddPluginDialog Add Plugins Dodaj pluginy Search: Szukaj: Add Widget Dodaj widżet Close Zamknij (only one instance can run at a time) (tylko jedna instancja może być uruchomiona) ConfigPanelDialog Configure Panel Konfiguruj panel Placement Umiejscowienie Styling Styl Widgets Widżety ConfigPlacement Configure Placement Konfiguruj umiejscowienie Size Rozmiar <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Ujemna ilość pikseli powoduje zmniejszenie panelu .</p><p/><p><i>Np. gdy „Długość” ustawiona na -100px a rozmiar ekranu wynosi 1000px, długość panelu wyniesie 900 px.</i></p> Size: Rozmiar: Length: Długość: % % px px px px Icon size: Rozmiar ikon: Rows: Rzędy: Alignment && position Wyrównanie i pozycja Alignment: Wyrównanie: Left Lewa Center Środek Right Prawa Position: Pozycja: A&uto-hide A&utomatyczne ukrywanie Zero means no animation Zero oznacza brak animacji Animation duration: Czas trwania animacji: ms ms Zero means no delay Zero oznacza brak oczekiwanai Show with delay: Pokaż z opóźnieniem: Visible thin margin for hidden panel Widoczny cienki odstęp, gdy pasek jest ukryty Hide only on overlapping a window Ukrywaj tylko przy zakrywaniu przez okno Don't allow maximized windows go under the panel window Nie pozwalaj na wyświetlanie zmaksymalizowanych okien pod oknem panelu Reserve space on display Rezerwuj przestrzeń na ekranie Top of screen Górna część ekranu Left of screen Lewa część ekranu Right of screen Prawa część ekranu Bottom of screen Dolna część ekranu Top of screen %1 Górna część ekranu %1 Left of screen %1 Lewa część ekranu %1 Right of screen %1 Prawa część ekranu %1 Bottom of screen %1 Dolna część ekranu %1 Top Góra Bottom Dół ConfigPluginsWidget Configure Plugins Konfiguruj wtyczki Note: changes made in this page cannot be reset. Uwaga: zmiany tu dokonane nie mogą zostać zresetowane. Move up Do góry ... Move down W dół Add Dodaj Remove Usuń Configure Konfiguruj ConfigStyling Configure Styling Konfiguruj styl Custom styling Własny styl Font color: Kolor czcionki: Background color: Kolor tła: Background opacity: Przezroczystość tła: <small>Compositing is required for panel transparency.</small> <small>Compositing jest wymagany aby uzyskać przeźroczystość.</small Background image: Obrazek tła: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Częściowe obejście problemu stylów widżetów, które nie nadają panelowi oddzielnego motywu. Możesz też chcieć to wyłączyć: Konfiguracja wyglądu → Motyw ikon → Koloruj ikony na podstawie stylu (palety) Override icon &theme Zas&tąp motyw ikon Icon theme for panels: Motyw ikon dla paneli: Pick color Wybierz kolor Pick image Wybierz obrazek Images (*.png *.gif *.jpg *.svg) Obrazki (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Konfiguruj panel Manage Widgets Zarządzaj widżetami Add New Panel Dodaj nowy panel Remove Panel Menu Item Usuń panel Lock This Panel Zablokuj ten panel Remove Panel Dialog Title Usuń panel Removing a panel can not be undone. Do you want to remove this panel? Usunięcie panelu nie może zostać cofnięte. Czy chcesz usunąć ten panel? Plugin Configure "%1" Konfiguruj „%1” Move "%1" Przesuń „%1” Remove "%1" Usuń „%1” main Use alternate configuration file. Użyj innego pliku konfiguracyjnego. Configuration file Plik konfiguracyjny ================================================ FILE: panel/translations/lxqt-panel_pt.ts ================================================ AddPluginDialog Add Plugins Adicionar plugins Search: Pesquisar: Add Widget Adicionar widget Close Fechar (only one instance can run at a time) (permitir apenas uma instância de cada vez) ConfigPanelDialog Configure Panel Configurar painel Placement Colocação Styling Estilo Widgets Widgets ConfigPlacement Configure Placement Configurar a colocação Size Tamanho <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Um valor negativo de pixel reduz esse valor ao valor máximo disponível do ecrã.</p><p/><p><i>Por exemplo, se definir "Comprimento" como -100px e o tamanho do ecrã for 1000px, o comprimento do painel será de 900px.</i></p> Size: Tamanho: Length: Comprimento: % % px px px px Icon size: Tamanho do ícone: Rows: Linhas: Alignment && position Alinhamento e posição Alignment: Alinhamento: Left Esquerda Center Centro Right Direita Position: Posição: A&uto-hide Oc&ultar automaticamente Zero means no animation Valor zero significa sem animação Animation duration: Duração da animação: ms ms Zero means no delay Valor zero significa sem atraso Show with delay: Mostrar com atraso: Visible thin margin for hidden panel Margem visível mínima para o painel oculto Hide only on overlapping a window Ocultar apenas ao sobrepor uma janela Don't allow maximized windows go under the panel window Não permitir janelas maximizadas por baixo da janela do painel Reserve space on display Reservar espaço no ecrã Top of screen Topo do ecrã Left of screen Esquerda do ecrã Right of screen Direita do ecrã Bottom of screen Fundo do ecrã Top of screen %1 Topo do ecrã %1 Left of screen %1 Esquerda do ecrã %1 Right of screen %1 Direita do ecrã %1 Bottom of screen %1 Fundo do ecrã %1 Top Cima Bottom Baixo ConfigPluginsWidget Configure Plugins Configurar plugins Note: changes made in this page cannot be reset. As alterações aqui efetuadas não podem ser revertidas. Move up Mover para cima ... ... Move down Mover para baixo Add Adicionar Remove Remover Configure Configurar ConfigStyling Configure Styling Configurar o estilo Custom styling Estilo personalizado Font color: Cor do tipo de letra: Background color: Cor de fundo: Background opacity: Opacidade do fundo: <small>Compositing is required for panel transparency.</small> <small>Requer gestão de composição para ativar a transparência.</small> Background image: Imagem de fundo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Um solução parcial para os estilos de widget que não permitem um tema distinto para o painel. Também pode desativar a opção em: Configuração de aparência do LXQt → Tema de icones → Colorir ícones tendo por base o estilo do widget (paleta) Override icon &theme Substituir &tema de ícones Icon theme for panels: Tema de ícones para os painéis: Pick color Escolher cor Pick image Escolher imagem Images (*.png *.gif *.jpg *.svg) Imagens (*.png *.gif *.jpg *.svg) LXQtPanel Panel Painel Configure Panel Configurar painel Manage Widgets Gerir widgets Add New Panel Adicionar novo painel Remove Panel Menu Item Remover painel Lock This Panel Bloquear este painel Remove Panel Dialog Title Remover painel Removing a panel can not be undone. Do you want to remove this panel? Não pode reverter a remoção de um painel. Deseja mesmo remover este painel? Plugin Configure "%1" Configurar "%1" Move "%1" Mover "%1" Remove "%1" Remover "%1" main Use alternate configuration file. Utilizar ficheiro alternativo de configuração. Configuration file Ficheiro de configuração ================================================ FILE: panel/translations/lxqt-panel_pt_BR.ts ================================================ AddPluginDialog Add Plugins Adicionar plugins Search: Pesquisar: Add Widget Adicionar widget Close Fechar (only one instance can run at a time) (apenas uma instância pode ser aberta de cada vez) ConfigPanelDialog Configure Panel Configurar Painel Placement Posicionamento Styling Estilo Widgets Widgets ConfigPlacement Configure Placement Configurar Posicionamento Size Tamanho <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Valores negativos de pixels configuram o comprimento do painel a partir da quantia de pixels especificados, menos o espaço disponível na tela.</p><p/><p><i>Por exemplo: "Comprimento" vale -100px, tamanho da tela vale 1000px, então o tamanho real do painel será de 900px.</i></p> Size: Tamanho: Length: Comprimento: % % px px px px Icon size: Tamanho dos ícones: Rows: Linhas: Alignment && position Alinhamento e posição Alignment: Alinhamento: Left Esquerda Center Centralizado Right Direita Position: Posição: A&uto-hide Ocultar a&utomaticamente Zero means no animation Zero desativa animações Animation duration: Duração da animação: ms ms Zero means no delay Zero desativa atraso Show with delay: Exibir com atraso: Visible thin margin for hidden panel Margem estreita visível para painel oculto Hide only on overlapping a window Ocultar apenas ao sobrepor uma janela Don't allow maximized windows go under the panel window Não permitir que janelas maximizadas fiquem abaixo da janela do painel Reserve space on display Reservar espaço na tela Top of screen Topo da tela Left of screen Esquerda da tela Right of screen Direita da tela Bottom of screen Fundo da tela Top of screen %1 Topo da tela %1 Left of screen %1 Esquerda da tela %1 Right of screen %1 Direita da tela %1 Bottom of screen %1 Fundo da tela %1 Top Topo Bottom Fundo ConfigPluginsWidget Configure Plugins Configurar Plugins Note: changes made in this page cannot be reset. Nota: mudanças feitas nesta página não poderão ser restauradas. Move up Mover para cima ... ... Move down Mover para baixo Add Adicionar Remove Remover Configure Configurar ConfigStyling Configure Styling Configurar Estilo Custom styling Estilo personalizado Font color: Cor da fonte: Background color: Cor de fundo: Background opacity: Opacidade do fundo: <small>Compositing is required for panel transparency.</small> <small>É necessária composição para a transparência do painel.</small> Background image: Imagem de fundo: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Uma solução parcial alternativa para estilos de widget que não conseguem dar ao painel um tema separado. Talvez você também queira desabilitar: Configurações de Aparência LXQt → Ícones do tema → Colorir ícones baseado no estilo widget (paleta) Override icon &theme Substituir ícone do &tema Icon theme for panels: Tema de ícones para painéis: Pick color Selecionar cor Pick image Selecionar imagem Images (*.png *.gif *.jpg *.svg) Imagens (*.png *.gif *.jpg *.svg) LXQtPanel Panel Painel Configure Panel Configurar painel Manage Widgets Gerenciar widgets Add New Panel Adicionar novo painel Remove Panel Menu Item Remover painel Lock This Panel Travar painel Remove Panel Dialog Title Remover painel Removing a panel can not be undone. Do you want to remove this panel? A remoção de um painel não pode ser desfeita. Deseja mesmo remover este painel? Plugin Configure "%1" Configurar "%1" Move "%1" Mover "%1" Remove "%1" Remover "%1" main Use alternate configuration file. Usar outro arquivo de configuração. Configuration file Arquivo de configuração ================================================ FILE: panel/translations/lxqt-panel_ro_RO.ts ================================================ AddPluginDialog Add Plugins Adaugare Plugin-uri Search: Cautare: Add Widget Adaugare Widget Close Inchidere (only one instance can run at a time) (o singura instanta poate rula in acelasi timp) ConfigPanelDialog Configure Panel Configurează panoul Placement Styling Widgets Widget-uri ConfigPlacement Configure Placement Size Dimensiune <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Pentru valori negative, dimensiunea panoului va fi calculată ca diferenta dintre marimea disponibilă a ecranului și valoarea introdusă.</p><p/><p><i>De ex. introducând o "lungime" de -100 px si o dimensiune a ecranului de 1000 px, dimensiunea reala a panoului va fi de 900 px.</i></p> Size: Dimensiune: Length: Lungime: % % px px px px Icon size: Dimensiune pictograme: Rows: Randuri: Alignment && position Aliniere și poziție Alignment: Aliniere: Left Stânga Center Centru Right Dreapta Position: Poziție: A&uto-hide Auto-ascundere Zero means no animation Zero inseamna Fara Animatie Animation duration: Durata animatiei: ms ms Zero means no delay Zero insemana Fara Decalaj Show with delay: Afiseaza cu Decalaj: Visible thin margin for hidden panel Bordură subțire vizibilă pentru panoul ascuns Hide only on overlapping a window Ascundeți numai dacă se suprapune o fereastră Don't allow maximized windows go under the panel window Nu permite ferestrelor maximizate sa intre sub fereastra panou Reserve space on display Rezervă spatiu pe ecran Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Sus Bottom Jos ConfigPluginsWidget Configure Plugins Configureaza plugin-urile Note: changes made in this page cannot be reset. Nota: modificarile efectuate in aceasta pagina nu pot fi resetate. Move up Muta in sus ... ... Move down Muta in jos Add Adauga Remove Șterge Configure Configurează ConfigStyling Configure Styling Custom styling Stil particularizat Font color: Culoare font: Background color: Culoare de fundal: Background opacity: Opacitatea fundalului: <small>Compositing is required for panel transparency.</small> <small>Este necesar un compozitor pentru transparența tabloului de bord.</ small> Background image: Imagine de fundal: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) O soluție parțială pentru stilurile de widget care nu pot da o temă separată panoului. Ați putea dori, de asemenea, să dezactivați: Configurarea aspectului LXQt → Tema pictograme → Colorează pictogramele pe baza stilului widgetului (paletei) Override icon &theme Inlocuieste pictograma &tema Icon theme for panels: Tema de pictograme pentru panouri: Pick color Alege culoare Pick image Alege imagine Images (*.png *.gif *.jpg *.svg) Imagini (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panou Configure Panel Configurează panoul Manage Widgets Gestionează Widget-uri Add New Panel Adauga Panou nou Remove Panel Menu Item Șterge Panou Lock This Panel Blocheaza acest Panou Remove Panel Dialog Title Șterge panou Removing a panel can not be undone. Do you want to remove this panel? Înlăturarea acestui panou nu poate fi anulata. Doriți sa înlăturați acest panou? Plugin Configure "%1" Configurează "%1" Move "%1" Mută "%1" Remove "%1" Îndepărtează "%1" main Use alternate configuration file. Utilizează fișierul de configurare alternativ. Configuration file Fisier de configurare ================================================ FILE: panel/translations/lxqt-panel_ru.ts ================================================ AddPluginDialog Add Plugins Добавить плагины Search: Найти: Add Widget Добавить виджет Close Закрыть (only one instance can run at a time) (только одна копия может быть запущена за раз) ConfigPanelDialog Configure Panel Настроить панель Placement Расположение Styling Оформление Widgets Виджеты ConfigPlacement Configure Placement Настроить расположение Size Размер <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Отрицательное число пикселей устанавливает длину панели на это количество пикселей меньше, чем доступное место экрана.</p><p/><p><i>Например, «Длина» выставлена на -100 пикс, размер экрана 1000 пикс, тогда реальная длина панели будет 900 пикс.</i></p> Size: Размер: Length: Длина: % % px пикс px пикс Icon size: Размер значков: Rows: Ряды: Alignment && position Выравнивание и расположение Alignment: Выравнивание: Left Слева Center По центру Right Справа Position: Расположение: A&uto-hide &Автоматически скрывать Zero means no animation Ноль означает отсутствие анимации Animation duration: Длительность анимации: ms мс Zero means no delay Ноль означает отсутствие задержки Show with delay: Показывать с задержкой: Visible thin margin for hidden panel Оставлять тонкую видимую полосу при скрытии панели Hide only on overlapping a window Скрывать только при перекрытии окном Don't allow maximized windows go under the panel window Не позволять развёрнутым окнам залезать под панель Reserve space on display Зарезервировать место на экране Top of screen Верхняя часть экрана Left of screen Левая часть экрана Right of screen Правая часть экрана Bottom of screen Нижняя часть экрана Top of screen %1 Верхняя часть экрана%1 Left of screen %1 Левая часть экрана%1 Right of screen %1 Правая часть экрана%1 Bottom of screen %1 Нижняя часть экрана%1 Top Вверху Bottom Внизу ConfigPluginsWidget Configure Plugins Настроить плагины Note: changes made in this page cannot be reset. Примечание: изменения, сделанные на этой вкладке, нельзя сбросить. Move up Переместить выше ... Move down Переместить ниже Add Добавить Remove Удалить Configure Настроить ConfigStyling Configure Styling Настроить оформление Custom styling Пользовательский стиль Font color: Цвет шрифта: Background color: Цвет фона: Background opacity: Непрозрачность фона: <small>Compositing is required for panel transparency.</small> <small>Композиция необходима для прозрачности панели.</small> Background image: Фоновое изображение: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Частичное обходное решение для стилей виджетов, которые не устанавливают отдельную тему для панели. Вы также возможно захотите отключить: Настройка внешнего вида LXQt → Тема значков → Цвет значков в соответствии с палитрой виджетов Override icon &theme Переопределить &тему значков Icon theme for panels: Тема значков панелей: Pick color Выбрать цвет Pick image Выберите изображение Images (*.png *.gif *.jpg *.svg) Изображения (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панель Configure Panel Настроить панель Manage Widgets Управление виджетами Add New Panel Добавить новую панель Remove Panel Menu Item Удалить панель Lock This Panel Закрепить панель Remove Panel Dialog Title Удалить панель Removing a panel can not be undone. Do you want to remove this panel? Удаление панели необратимо. Хотите удалить эту панель? Plugin Configure "%1" Настроить «%1» Move "%1" Переместить «%1» Remove "%1" Удалить «%1» main Use alternate configuration file. Использовать альтернативный файл настроек. Configuration file Файл настроек ================================================ FILE: panel/translations/lxqt-panel_si.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Length: % px px Icon size: Rows: Alignment && position Alignment: Left Center Right Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_sk_SK.ts ================================================ AddPluginDialog Add Plugins Pridať pluginy Search: Hľadať: Add Widget Pridať widget Close Zatvoriť (only one instance can run at a time) (v jednom čase môže bežať iba 1 inštancia) ConfigPanelDialog Configure Panel Nastaviť Panel Placement Umiestnenie Styling Štýl Widgets Widgety ConfigPlacement Configure Placement Nakonfigurovať umiestnenie Size Veľkosť <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Záporný počet pixelov nastaví dĺžku panelu na o toľko menej pixelov, než je dostupné miesto na obrazovke.</p><p/><p><i>Napr. pri dĺžke nastavenej na -100 px a pri veľkosti obrazovky 1000 px, bude skutočná dĺžka panela 900 px.</i></p> Size: Veľkosť: Length: Dĺžka: % % px px px px Icon size: Veľkosť ikon: Rows: Riadkov: Alignment && position Zarovnanie a poloha Alignment: Zarovnanie: Left Vľavo Center Na stred Right Vpravo Position: Poloha: A&uto-hide A&utomaticky skrývať Zero means no animation Nula znamená žiadnu animáciu Animation duration: Trvanie animácie: ms ms Zero means no delay Nula znamená žiadne oneskorenie Show with delay: Zobraziť s oneskorením: Visible thin margin for hidden panel Viditeľný tenký okraj pre skrytý panel Hide only on overlapping a window Skryť iba pri prekrytí okna Don't allow maximized windows go under the panel window Nedovoliť, aby sa maximalizované okná dostali pod panel Reserve space on display Rezervovať miesto na obrazovke Top of screen Horná časť obrazovky Left of screen Na ľavej strane obrazovky Right of screen Na pravej strane obrazovky Bottom of screen Spodná časť obrazovky Top of screen %1 Horná časť obrazovky %1 Left of screen %1 Vľavo na obrazovke %1 Right of screen %1 Vpravo na obrazovke %1 Bottom of screen %1 Dole na obrazovke %1 Top Hore Bottom Dolu ConfigPluginsWidget Configure Plugins Nastaviť pluginy Note: changes made in this page cannot be reset. Poznámka: Zmeny na tejto stránke sa nedajú vrátiť späť. Move up Posunúť hore ... ... Move down Posunúť dolu Add Pridať Remove Odstrániť Configure Nastaviť ConfigStyling Configure Styling Nakonfigurovať štýl Custom styling Vlastné štýly Font color: Farba písma: Background color: Farba pozadia: Background opacity: Priehľadnosť pozadia: <small>Compositing is required for panel transparency.</small> <small>Panel môže byť priehľadný len vtedy, keď používate "compositing window manager".</small> Background image: Obrázok pozadia: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Čiastočné riešenie pre štýly widgetov, ktorým nie je možné poskytnúť osobitnú tému panelu. Možno budete chcieť zakázať: Konfiguráciu vzhľadu LXQt → Tému ikon → Farbu ikon na základe štýlu widgetu (palety) Override icon &theme Použiť iný š&týl ikon Icon theme for panels: Štýl ikon pre panely: Pick color Vybrať farbu Pick image Vybrať obrázok Images (*.png *.gif *.jpg *.svg) Obrázky (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Nastaviť Panel Manage Widgets Spravovať widgety Add New Panel Pridať nový panel Remove Panel Menu Item Odstrániť panel Lock This Panel Zamknúť tento panel Remove Panel Dialog Title Odstrániť panel Removing a panel can not be undone. Do you want to remove this panel? Odstránenie panelu sa nedá odvolať. Skutočne si želáte tento panel odstrániť? Plugin Configure "%1" Nastaviť "%1" Move "%1" Presunúť "%1" Remove "%1" Odstrániť "%1" main Use alternate configuration file. Použiť iný súbor s nastaveniami. Configuration file Súbor s nastaveniami ================================================ FILE: panel/translations/lxqt-panel_sl.ts ================================================ AddPluginDialog Add Plugins Dodaj vtičnike Search: Išči: Add Widget Dodaj gradnik Close Zapri (only one instance can run at a time) (le en proces lahko deluje naenkrat) ConfigPanelDialog Configure Panel Konfiguriraj pult Placement Postavitev Styling Oblikovanje Widgets Gradniki ConfigPlacement Configure Placement Konfiguriraj postavitev Size Velikost <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negativna vrednost pikslov bo odšteta od dolžine zaslona.</p><p/><p><i>Primer: Nastavitev dolžine -100px bo pri velikosti zaslona 1000px skrajšala pult na 900px.</i></p> Size: Velikost: Length: Dolžina: % % px px px px Icon size: Velikost ikon: Rows: Št. vrstic: Alignment && position Poravnava in položaj Alignment: Poravnava: Left Levo Center Na sredini Right Desno Position: Položaj: A&uto-hide Samode&jno skrij Zero means no animation Ničla onemogoči animacijo Animation duration: Trajanje animacije: ms ms Zero means no delay Ničla onemogoči zakasnitev Show with delay: Prikaži z zamikom: Visible thin margin for hidden panel Viden tanek pas, če je pult skrit Hide only on overlapping a window Skrij samo ob prekrivanju okna Don't allow maximized windows go under the panel window Ne dovoli maksimiziranje oken pod pult Reserve space on display Rezerviraj prostor na zaslonu Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Vrh Bottom Dno ConfigPluginsWidget Configure Plugins Konfiguriraj vtičnike Note: changes made in this page cannot be reset. Opomba: nastavitev na tej strani ni možno ponastaviti. Move up Premakni gor ... ... Move down Premakni dol Add Dodaj Remove Odstrani Configure Konfiguriraj ConfigStyling Configure Styling Konfiguriraj oblikovanje Custom styling Oblikovanje po meri Font color: Barva pisave: Background color: Barva ozadja: Background opacity: Prosojnost ozadja: <small>Compositing is required for panel transparency.</small> <small>Za prosojnost pulta je zahtevano kompozitiranje (compositing)</small> Background image: Slika ozadja: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Delna rešitev za sloge gradnikov, ki ne delujejo pri pultu. Morda boste morali onemogočiti tudi: Nastavitev videza LXQt → Tema ikon → Obarvaj ikone glede na stil (paleto) gradnikov Override icon &theme Prezri &temo ikon Icon theme for panels: Tema ikon za pult: Pick color Izbor barve Pick image Izbor slike Images (*.png *.gif *.jpg *.svg) Slike (*.png *.gif *.jpg *.svg) LXQtPanel Panel Pult Configure Panel Konfiguriraj pult Manage Widgets Upravljaj gradnike Add New Panel Dodaj nov pult Remove Panel Menu Item Odstrani pult Lock This Panel Zakleni ta pult Remove Panel Dialog Title Odstrani pult Removing a panel can not be undone. Do you want to remove this panel? Odstranjenega pulta ni mogoče povrniti. Ste prepričani, da ga želite odstraniti? Plugin Configure "%1" Konfiguriraj "%1" Move "%1" Premakni "%1" Remove "%1" Odstrani "%1" main Use alternate configuration file. Uporabi drugo konfiguracijsko datoteko. Configuration file Konfiguracijska datoteka ================================================ FILE: panel/translations/lxqt-panel_sr@ijekavian.ts ================================================ AddPluginDialog Add Plugins Додај плагинове Search: Претражи: Add Widget Додај виџет Close Затвори (only one instance can run at a time) (само једна инстанца се може покренути истовремено) ConfigPanelDialog Configure Panel Подеси панел Placement Постављање Styling Стајлинг Widgets Виџети ConfigPlacement Configure Placement Подеси постављање Size Величина <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Негативна вриједност пиксела поставља дужину панела на толико пиксела мање од доступног простора на екрану.</p><p/><p><i>E.g. "Дужина" је постављена на -100px, величина екрана је 1000px, онда ће права дужина панела бити 900px.</i></p> Size: Величина: Length: Дужина: % % px px px px Icon size: Величина иконе: Rows: Редови: Alignment && position Поравнање && позиција Alignment: Поравнање: Left Лијево Center Центар Right Десно Position: Позиција: A&uto-hide А&уто-сакривање Zero means no animation Нула значи нема анимације Animation duration: Трајање анимације: ms ms Zero means no delay Нула значи нема кашњења Show with delay: Прикажи са кашњењем: Visible thin margin for hidden panel Видљива танка маргина за скривени панел Hide only on overlapping a window Сакриј само на преклапајућем прозору Don't allow maximized windows go under the panel window Не дозволи максимизираним прозорима да оду испод панела Reserve space on display Резервиши простор на дисплеју Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Врх Bottom Дно ConfigPluginsWidget Configure Plugins Подеси плагинове Note: changes made in this page cannot be reset. Напомена: промјене направљене на овој страници не могу се ресетовати. Move up Помјери горе ... ... Move down Помјери доље Add Додај Remove Уклони Configure Подеси ConfigStyling Configure Styling Подеси стајлинг Custom styling Font color: Боја фонта: Background color: Позадинска боја: Background opacity: Позаднинска непровидност: <small>Compositing is required for panel transparency.</small> <small>Копозиција је потребна за провидност панела.</small> Background image: Позадинска слика: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Дјелимично јрешење за стилове виџета који не може дати посебну тему панелу. Можда желиш да онемогућиш: LXQt подешавање приказа→ Тема икона → Колоризуј иконе засноване на стилу виџета (палети) Override icon &theme Icon theme for panels: Тема икона за панеле: Pick color Изабери боју Pick image Изабери слику Images (*.png *.gif *.jpg *.svg) Слике (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панел Configure Panel Подеси панел Manage Widgets Подеси виџете Add New Panel Додај нови панел Remove Panel Menu Item Уклони панел Lock This Panel Закључај овај панел Remove Panel Dialog Title Уколни панел Removing a panel can not be undone. Do you want to remove this panel? Уклањање панела не може бити поништено. Желиш ли да уклониш овај панел? Plugin Configure "%1" Move "%1" Помјери "%1" Remove "%1" Уклони "%1" main Use alternate configuration file. Користи наизмјенични конфигурациони фајл. Configuration file Конфигурациони фајл ================================================ FILE: panel/translations/lxqt-panel_sr@latin.ts ================================================ AddPluginDialog Add Plugins Dodaj Plagine Search: Pretraga: Add Widget Dodaj vidžet Close Zatvori (only one instance can run at a time) (istovremeno se može pokrenuti samo jedna instanca) ConfigPanelDialog Configure Panel Konfigurišite panel Placement Styling Widgets Vidžet ConfigPlacement Configure Placement Size Veličina <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negativna vrednost piksela postavlja dužinu panela na broj piksela manje od raspoloživog prostora ekrana.</p><p/><p><i>na primer "Dužina" postavljeno na -100px, veličina ekrana je 1000 px, tada će stvarna dužina panela biti 900 px.</i></p> Size: Veličina: Length: Dužina: % % px px px Icon size: Veličina ikone: Rows: Redovi: Alignment && position Poravnanje i položaj Alignment: Left Levo Center Centar Right Desno Position: A&uto-hide Zero means no animation Nula znači da nema animacije Animation duration: Trajanje animacije: ms Zero means no delay Nula znači bez zakašnjenja Show with delay: Prikaži sa zakašnjenjem: Visible thin margin for hidden panel Vidljiva tanka margina za skriveni panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Ne dozvolite da maksimizirani prozori idu ispod prozora panela Reserve space on display Rezervišite prostor na displeju Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Prilagođeni stil Font color: Boja fonta: Background color: Boja pozadine: Background opacity: Neprozirnost pozadine: <small>Compositing is required for panel transparency.</small> Background image: Pozadinska slika: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Delimično rešenje za stilove vidžeta koji ne može dati posebnu temu panelu. Takođe biste mogli da onemogućite: Konfiguracija izgleda LXQt → Tema ikona → Oboji ikone na osnovu stila vidžeta (paleta) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Automatsko suspendovanje Configure Panel Konfigurišite panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_sr_BA.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: Величина: Length: Дужина: % % px px px Icon size: Rows: Alignment && position Alignment: Поравнање: Left Лијево Center Центар Right Десно Position: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure Подеси ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панел Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_sr_RS.ts ================================================ AddPluginDialog Add Plugins Додај плагинове Search: Претражи: Add Widget Додај виџет Close Затвори (only one instance can run at a time) (само једна инстанца се може покренути истовремено) ConfigPanelDialog Configure Panel Конфигуриши панел Placement Постављање Styling Стајлинг Widgets Виџети ConfigPlacement Configure Placement Конфигуриши постављање Size Величина <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Негативна вредност пиксела поставља дужину панела на толико пиксела мање од доступног простора на екрану.</p><p/><p><i>Нпр. "Дужина" постављена на -100px, величина екрана је 1000px, онда ће права дужина панела бити 900 px.</i></p> Size: Величина: Length: Дужина: % % px px px px Icon size: Величина иконе: Rows: Редови: Alignment && position Поравнање и положај Alignment: Поравнање: Left Лево Center Центар Right Десно Position: Положај: A&uto-hide А&уто-сакриј Zero means no animation Нула значи нема анимације Animation duration: Трајање анимације: ms ms Zero means no delay Нула значи да нема кашњења Show with delay: Прикажи са кашњењем: Visible thin margin for hidden panel Видљива танка маргина за скривани панел Hide only on overlapping a window Сакриј само када се прозор преклапа Don't allow maximized windows go under the panel window Не дозовли да максимизовани прозори оду испод панела прозора Reserve space on display Резервиши простор на екрану Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Врх Bottom Дно ConfigPluginsWidget Configure Plugins Конфигуриши плагинове Note: changes made in this page cannot be reset. Напомена: промене направљене на овој страници се не могу ресетовати. Move up Помери горе ... ... Move down Помери доле Add Додај Remove Уклони Configure Подеси ConfigStyling Configure Styling Конфигуриши стајлинг Custom styling Обичан стајлинг Font color: Боја фонта: Background color: Позадинска боја: Background opacity: Позадинска непровидност: <small>Compositing is required for panel transparency.</small> <small>Композиција је потребна за транспарентност панела.</small> Background image: Позадинска слика: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Делимично решење за стилове виџета који не могу дати посебну тему панелу. Можда ћеш желети да онемогућиш. Конфигурација Рејзор изгледа Тема икона→ Обоји иконе на основу стила виџета (палета) Override icon &theme Обори икону &тему Icon theme for panels: Тема икона за панеле: Pick color Изабери боју Pick image Изабери слику Images (*.png *.gif *.jpg *.svg) Слике (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панел Configure Panel Конфигуриши панел Manage Widgets Управљање виџетима Add New Panel Додај нови панел Remove Panel Menu Item Уклони панел Lock This Panel Закључај ову панелу Remove Panel Dialog Title Уклони панел Removing a panel can not be undone. Do you want to remove this panel? Уклањање панела се не може опозвати. Да ли желиш да уклониш панел? Plugin Configure "%1" Конфигуриши "%1" Move "%1" Помери "%1" Remove "%1" Уклони "%1" main Use alternate configuration file. Користи наизменични конфигурациони фајл. Configuration file Конфигурациони фајл ================================================ FILE: panel/translations/lxqt-panel_sv.ts ================================================ AddPluginDialog Add Plugins Lägg till insticksmodul Search: Sök: Add Widget Lägg till grafiska komponenter Close Stäng (only one instance can run at a time) (endast en instans kan köras i taget) ConfigPanelDialog Configure Panel Konfigurera Placement Placering Styling Stil Widgets Grafiska komponenter ConfigPlacement Configure Placement Konfigurera placering Size Storlek <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p> Negativt pixelvärde ställer in panellängden på så många pixlar som är mindre än tillgängligt skärmutrymme. </p><p/><p> <i>T.ex Om "Längd" = -100px, och skärmbredd = 1000px, då kommer panelen uppta 900px</i></p> Size: Storlek: Length: Längd: % % px px px px Icon size: Ikonstorlek: Rows: Rader: Alignment && position Justering && position Alignment: Justering: Left Vänster Center Mitten Right Höger Position: Position: A&uto-hide A&uto göm Zero means no animation Noll betyder ingen animering Animation duration: Animationstid: ms ms Zero means no delay Noll betyder ingen fördröjning Show with delay: Visa med fördröjning: Visible thin margin for hidden panel Synlig tunn marginal för dold panel Hide only on overlapping a window Dölj bara när du överlappar ett fönster Don't allow maximized windows go under the panel window Låt inte maximerade fönster gå under panelfönstret Reserve space on display Reservera utrymme på displayen Top of screen Toppen av skärmen Left of screen Vänster av skärmen Right of screen Höger av skärmen Bottom of screen Längst ned på skärmen Top of screen %1 Toppen av skärmen %1 Left of screen %1 Vänster av skärmen %1 Right of screen %1 Höger av skärmen %1 Bottom of screen %1 Längst ner på skärmen %1 Top Högst upp Bottom Längst ner ConfigPluginsWidget Configure Plugins Konfigurera plugins Note: changes made in this page cannot be reset. Obs: ändringar som gjorts på den här sidan kan inte återställas. Move up Flytta upp ... ... Move down Flytta ner Add Lägg till Remove Ta bort Configure Konfigurera ConfigStyling Configure Styling Konfigurera stil Custom styling Anpassad styling Font color: Textfärg: Background color: Bakgrundsfärg: Background opacity: Bakgrunds genomskinlighet: <small>Compositing is required for panel transparency.</small> <small>Komposition är nödvändig för panelens transparens.</small> Background image: Bakgrundsbild: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) En partiell lösning för widgetstil som inte kan ge ett separat tema till panelen. Du kanske också vill ändra: LXQt Utseendeinställningar→ Ikontema→ Färgade ikoner baserad på widgetstil (palett) Override icon &theme Åsidosätt ikon &tema Icon theme for panels: Ikontema för paneler: Pick color Välj färg Pick image Välj bild Images (*.png *.gif *.jpg *.svg) Bilder (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Konfigurera Panel Manage Widgets Hantera widgets Add New Panel Lägg till ny Panel Remove Panel Menu Item Ta bort Panel Lock This Panel Lås denna panel Remove Panel Dialog Title Ta bort panel Removing a panel can not be undone. Do you want to remove this panel? Att ta bort en panel kan inte ångras. Vill du ta bort den här panelen? Plugin Configure "%1" Konfigurera "%1" Move "%1" Flytta "%1" Remove "%1" Ta bort "%1" main Use alternate configuration file. Använd alternativ konfigurationsfil. Configuration file Konfigurationsfil ================================================ FILE: panel/translations/lxqt-panel_th_TH.ts ================================================ AddPluginDialog Add Plugins Search: Add Widget Close (only one instance can run at a time) ConfigPanelDialog Configure Panel Placement Styling Widgets ConfigPlacement Configure Placement Size <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> Size: ขนาด: Length: ความยาว: % % px px px Icon size: Rows: Alignment && position Alignment: การจัดวาง: Left ทางซ้าย Center ตรงกลาง Right ทางขวา Position: ตำแหน่ง: A&uto-hide Zero means no animation Animation duration: ms Zero means no delay Show with delay: Visible thin margin for hidden panel Hide only on overlapping a window Don't allow maximized windows go under the panel window Reserve space on display Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove ลบทิ้ง Configure ปรับแต่ง ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel พาเนล Configure Panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_tr.ts ================================================ AddPluginDialog Add Plugins Eklentiler Ekle Search: Ara: Add Widget Gereç Ekle Close Kapat (only one instance can run at a time) (aynı anda yalnızca bir örnek çalışabilir) ConfigPanelDialog Configure Panel Paneli Yapılandır Placement Yerleştirme Styling Biçem Widgets Gereçler ConfigPlacement Configure Placement Yerleşimi yapılandır Size Boyut <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Negatif piksel değerleri, panel uzunluğunu kullanılabilir ekran genişliğinin piksel değerinden daha azına ayarlar.</p><p/><p><i>Örn: "Uzunluk" -100px'e ayarlanır, ekran boyutu 1000px'dir, bu durumda gerçek panel boyutu 900px olacaktır.</i></p> Size: Boyut: Length: Uzunluk: % % px px px px Icon size: Simge boyutu: Rows: Satır: Alignment && position Hizalama && konumu Alignment: Hizalama: Left Sol Center Orta Right Sağ Position: Konum: A&uto-hide &Otomatik Gizle Zero means no animation Sıfır, animasyon yok anlamına gelir Animation duration: Animasyon süresi: ms ms Zero means no delay Sıfır, gecikme yok demektir Show with delay: Gecikmeli göster: Visible thin margin for hidden panel Gizli panel için görünür ince kenar boşluğu Hide only on overlapping a window Yalnızca bir pencerenin üst üste binmesini gizle Don't allow maximized windows go under the panel window Büyütülmüş pencerelerin panel penceresinin altına girmesine izin verme Reserve space on display Ekranda yer ayır Top of screen Ekranın üstünde Left of screen Ekranın solunda Right of screen Ekranın sağında Bottom of screen Ekranın altında Top of screen %1 Ekran %1 yukarısı Left of screen %1 Ekran %1 solu Right of screen %1 Ekran %1 sağı Bottom of screen %1 Ekran %1 aşağısı Top Üst Bottom Alt ConfigPluginsWidget Configure Plugins Eklentileri Yapılandır Note: changes made in this page cannot be reset. Not: Bu sayfada yapılan değişiklikler geri alınamaz. Move up Yukarı taşı ... ... Move down Aşağı taşı Add Ekle Remove Sil Configure Yapılandır ConfigStyling Configure Styling Biçemi Yapılandır Custom styling Özel biçimlendirme Font color: Yazı tipi rengi: Background color: Arka plan rengi: Background opacity: Arka plan matlığı: <small>Compositing is required for panel transparency.</small> <small>Karışım, panel şeffaflığı için gereklidir.</small> Background image: Arka plan resmi: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Panele ayrı bir tema veremeyen gereç biçimleri için kısmi bir geçici çözüm. Ayrıca etkisiz bırakmak isteyebilirsiniz: LXQt Görünüm Yapılandırması → Simge Teması → Gereç biçimine (palet) göre simgeleri renklendir Override icon &theme Simge &temasını geçersiz kıl Icon theme for panels: Panel için simge teması: Pick color Renk seç Pick image Resim seç Images (*.png *.gif *.jpg *.svg) Resimler (*.png *.gif *.jpg *.svg) LXQtPanel Panel Panel Configure Panel Paneli Yapılandır Manage Widgets Gereçleri Yönet Add New Panel Yeni Panel Ekle Remove Panel Menu Item Paneli Sil Lock This Panel Bu Paneli Kilitle Remove Panel Dialog Title Paneli Kaldır Removing a panel can not be undone. Do you want to remove this panel? Paneli kaldırma eylemi geri alınamaz. Paneli kaldırmak istiyor musunuz? Plugin Configure "%1" "%1"'i yapılandır Move "%1" "%1"'i taşı Remove "%1" "%1" kaldır main Use alternate configuration file. Diğer yapılandırma dosyasını kullanınız. Configuration file Yapılandırma dosyası ================================================ FILE: panel/translations/lxqt-panel_uk.ts ================================================ AddPluginDialog Add Plugins Додати плаґіни Search: Пошук: Add Widget Додати віджет Close Закрити (only one instance can run at a time) (лише один екземпляр може бути запущений за раз) ConfigPanelDialog Configure Panel Налаштування панелі Placement Розміщення Styling Оформлення Widgets Віджет ConfigPlacement Configure Placement Налаштувати розміщення Size Розмір <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Від'ємне значення встановить довжину панелі зменшену на вказану кількість пікселів від доступної довжини екрана.</p><p/><p><i>Наприклад "Довжиною" встановлено 100 пікселів, розмір екрана — 1000 пікселів, тоді дійсний розмір панелі буде 900 пікселів.</i></p Size: Розмір: Length: Довжина: % % px пікселів px пікселів Icon size: Розмір піктограм: Rows: Рядів: Alignment && position Вирівнювання && позиція Alignment: Вирівнювання: Left Зліва Center Посередині Right Справа Position: Позиція: A&uto-hide Автоматично ховати Zero means no animation Нуль означає без анімації Animation duration: Тривалість анімації: ms мс Zero means no delay Якщо вказати нуль, затримки не буде Show with delay: Показувати із затримкою: Visible thin margin for hidden panel Лишати тонкий край прихованої панелі видимим Hide only on overlapping a window Ховати лише коли перекривається вікном Don't allow maximized windows go under the panel window Не дозволяти максимізованим вікнам розташовуватися під панеллю Reserve space on display Резервувати простір на екрані Top of screen Верх екрана Left of screen Ліва частина екрана Right of screen Права частина екрана Bottom of screen Низ екрана Top of screen %1 Верх екрана %1 Left of screen %1 Ліва частина екрана %1 Right of screen %1 Права частина екрана %1 Bottom of screen %1 Низ екрана %1 Top Вгорі Bottom Внизу ConfigPluginsWidget Configure Plugins Налаштувати плаґіни Note: changes made in this page cannot be reset. Зауваження: зміни, зроблені на цій сторінці, не можна скинути. Move up Перемістити вгору ... ... Move down Перемістити вниз Add Додати Remove Вилучити Configure Налаштувати ConfigStyling Configure Styling Налаштувати оформлення Custom styling Власний стиль Font color: Колір шрифта: Background color: Колір тла: Background opacity: Прозорість тла: <small>Compositing is required for panel transparency.</small> <small>Композит вимагається для прозорості панелі.</small> Background image: Зображення тла: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Часткове рішення для стилів віджетів, які не надають окрему тему панелі. Ви також можете вимкнути: Налаштування вигляду LXQt → Тема піктограм → Забарвлювати піктограми на основі стилю віджета (палітра) Override icon &theme Замінити тему піктограм Icon theme for panels: Тема піктограм для панелей: Pick color Взяти колір Pick image Взяти малюнок Images (*.png *.gif *.jpg *.svg) Зображення (*.png *.gif *.jpg *.svg) LXQtPanel Panel Панель Configure Panel Налаштувати панель Manage Widgets Керувати віджетами Add New Panel Додати нову панель Remove Panel Menu Item Вилучити панель Lock This Panel Закріпити цю панель Remove Panel Dialog Title Вилучити панель Removing a panel can not be undone. Do you want to remove this panel? Вилучення панелі невідворотне. Ви бажаєте вилучити цю панель? Plugin Configure "%1" Налаштування "%1" Move "%1" Перемістити "%1" Remove "%1" Вилучити "%1" main Use alternate configuration file. Використати альтернативний файл налаштувань. Configuration file Файл налаштувань ================================================ FILE: panel/translations/lxqt-panel_vi.ts ================================================ AddPluginDialog Add Plugins Thêm plugin Search: Tìm: Add Widget Thêm tiện ích Close Đóng (only one instance can run at a time) (chỉ một phiên bản có thể chạy cùng lúc) ConfigPanelDialog Configure Panel Cấu hình thanh panel Placement Vị trí hiển thị Styling Kiểu dáng Widgets Tiện ích ConfigPlacement Configure Placement Cấu hình vị trí hiển thị Size Kích thước <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>Giá trị pixel âm sẽ thiết lập chiều dài của thanh panel ngắn hơn số pixel tương ứng so với không gian màn hình khả dụng.</p><p/><p><i>Ví dụ: Nếu “Chiều dài” được đặt là -100px, và kích thước màn hình là 1000px, thì chiều dài thực tế của thanh panel sẽ là 900px.</i></p> Size: Kích thước: Length: Chiều dài: % % px px px px Icon size: Kích thước biểu tượng: Rows: Dòng: Alignment && position Căn chỉnh & Vị trí Alignment: Căn chỉnh: Left Trái Center Giữa Right Phải Position: Vị trí: A&uto-hide T&ự động ẩn Zero means no animation Giá trị 0 nghĩa là không có hiệu ứng chuyển động Animation duration: Thời gian hiệu ứng: ms giây Zero means no delay Giá trị 0 nghĩa là không có độ trễ Show with delay: Hiển thị với độ trễ: Visible thin margin for hidden panel Lề mỏng hiển thị cho thanh panel ẩn Hide only on overlapping a window Chỉ ẩn khi cửa sổ bị che Don't allow maximized windows go under the panel window Không cho phép cửa sổ phóng to đi xuống dưới thanh panel Reserve space on display Dành không gian trên màn hình Top of screen Đỉnh màn hình Left of screen Trái màn hình Right of screen Phải màn hình Bottom of screen Đáy màn hình Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top Bottom ConfigPluginsWidget Configure Plugins Note: changes made in this page cannot be reset. Move up ... Move down Add Remove Configure ConfigStyling Configure Styling Custom styling Font color: Background color: Background opacity: <small>Compositing is required for panel transparency.</small> Background image: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) Override icon &theme Icon theme for panels: Pick color Pick image Images (*.png *.gif *.jpg *.svg) LXQtPanel Panel Configure Panel Cấu hình thanh panel Manage Widgets Add New Panel Remove Panel Menu Item Lock This Panel Remove Panel Dialog Title Removing a panel can not be undone. Do you want to remove this panel? Plugin Configure "%1" Move "%1" Remove "%1" main Use alternate configuration file. Configuration file ================================================ FILE: panel/translations/lxqt-panel_zh_CN.ts ================================================ AddPluginDialog Add Plugins 添加插件 Search: 搜索: Add Widget 添加小部件 Close 关闭 (only one instance can run at a time) (一次只能运行一个实例) ConfigPanelDialog Configure Panel 配置面板 Placement 放置 Styling 样式 Widgets 小部件 ConfigPlacement Configure Placement 配置位置 Size 大小 <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>如设置长度为负数,则面板长度会等于可用空间减去输入值</p><p/><p><i>例:如“长度”设置为-100px,且最大长度为1000px,则实际显示长度为900px。</i></p> Size: 大小: Length: 长度: % % px px px px Icon size: 图标大小: Rows: 列: Alignment && position 对齐与位置 Alignment: 对齐: Left 居左 Center 居中 Right 居右 Position: 位置: A&uto-hide 自动隐藏(&u) Zero means no animation 0表示无动画 Animation duration: 动画时长: ms ms Zero means no delay 如设置为0,则无延迟 Show with delay: 动画延迟: Visible thin margin for hidden panel 为隐藏面板保留可见细边距 Hide only on overlapping a window 仅在重叠窗口时隐藏 Don't allow maximized windows go under the panel window 不允许最大化窗口显示在面板窗口之下 Reserve space on display 在显示器上保留空间 Top of screen Left of screen Right of screen Bottom of screen Top of screen %1 Left of screen %1 Right of screen %1 Bottom of screen %1 Top 顶部 Bottom 底部 ConfigPluginsWidget Configure Plugins 配置插件 Note: changes made in this page cannot be reset. 注:此页的改动无法被重置。 Move up 上移 ... Move down 下移 Add 添加 Remove 删除 Configure 配置 ConfigStyling Configure Styling 配置样式 Custom styling 自定义样式 Font color: 字体颜色: Background color: 背景颜色: Background opacity: 背景不透明度: <small>Compositing is required for panel transparency.</small> <small>必须要启用合成特效才可以使面板透明</small> Background image: 背景图像: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) 部分解决窗口小部件样式的方法, 无法为面板提供单独的主题。 你可能还想禁用: LXQt 外观配置→ 图标主题→ 根据小部件样式(调色板)着色图标 Override icon &theme 覆盖图标主题(T) Icon theme for panels: 面板的图标主题: Pick color 选择颜色 Pick image 选择图像 Images (*.png *.gif *.jpg *.svg) 图像 (*.png *.gif *.jpg *.svg) LXQtPanel Panel 面板 Configure Panel 配置面板 Manage Widgets 管理小部件 Add New Panel 新增面板 Remove Panel Menu Item 删除面板 Lock This Panel 锁定此面板 Remove Panel Dialog Title 删除面板 Removing a panel can not be undone. Do you want to remove this panel? 删除面板不可撤销。 是否确认要删除此面板? Plugin Configure "%1" 配置“%1” Move "%1" 移动“%1” Remove "%1" 删除“%1” main Use alternate configuration file. 使用另一个配置文件。 Configuration file 配置文件 ================================================ FILE: panel/translations/lxqt-panel_zh_TW.ts ================================================ AddPluginDialog Add Plugins 新增外掛 Search: 搜尋: Add Widget 新增小工具 Close 關閉 (only one instance can run at a time) (一次只能執行一個項目) ConfigPanelDialog Configure Panel 設定面板 Placement 位置 Styling 樣式 Widgets 小工具 ConfigPlacement Configure Placement 設定位置 Size 大小 <p>Negative pixel value sets the panel length to that many pixels less than available screen space.</p><p/><p><i>E.g. "Length" set to -100px, screen size is 1000px, then real panel length will be 900 px.</i></p> <p>設定面板長度為負數像素值代表少於螢幕長度多少像素。</p><p/><p><i>例如:設定長度為-100像素,螢幕長度為1000像素,實際面板長度將為900像素。</i></p> Size: 大小: Length: 長度: % % px 像素 px 像素 Icon size: 圖示大小: Rows: 列數: Alignment && position 對齊與位置 Alignment: 對齊: Left 靠左 Center 置中 Right 靠右 Position: 位置 : A&uto-hide 自動隱藏(&U) Zero means no animation 零代表無動畫 Animation duration: 動畫長度: ms ms Zero means no delay 零代表無延遲 Show with delay: 顯示有延遲: Visible thin margin for hidden panel 為隱藏的面板保留細邊界 Hide only on overlapping a window 只在與視窗重疊時隱藏 Don't allow maximized windows go under the panel window 不允許最大化視窗在面板視窗的下面 Reserve space on display 在顯示上保留空間 Top of screen 螢幕上方 Left of screen 螢幕左方 Right of screen 螢幕右方 Bottom of screen 螢幕下方 Top of screen %1 螢幕上方 %1 Left of screen %1 螢幕左方 %1 Right of screen %1 螢幕右方 %1 Bottom of screen %1 螢幕下方 %1 Top 頂端 Bottom 底端 ConfigPluginsWidget Configure Plugins 設定外掛 Note: changes made in this page cannot be reset. 註解:此頁的更動無法被重置。 Move up 向上移動 ... ... Move down 向下移動 Add 新增 Remove 移除 Configure 設定 ConfigStyling Configure Styling 設定樣式 Custom styling 自訂樣式 Font color: 字型顏色: Background color: 背景顏色: Background opacity: 背景不透明度: <small>Compositing is required for panel transparency.</small> <small>面板透明度需要進行合成。</small> Background image: 背景圖片: A partial workaround for widget styles that cannot give a separate theme to the panel. You might also want to disable: LXQt Appearance Configuration → Icons Theme → Colorize icons based on widget style (palette) 有些用於小工具樣式 無法提供個別的主題予面板。 您可能也想停用: LXQt 外觀設定→ 圖示主題→ 配色圖示依據小工具樣式(調色盤) Override icon &theme 覆蓋圖示主題(&T) Icon theme for panels: 面板的圖示主題: Pick color 選用顏色 Pick image 選用圖片 Images (*.png *.gif *.jpg *.svg) 圖片 (*.png *.gif *.jpg *.svg) LXQtPanel Panel 面板 Configure Panel 設定面板 Manage Widgets 管理小工具 Add New Panel 新增面板 Remove Panel Menu Item 移除面板 Lock This Panel 鎖定此面板 Remove Panel Dialog Title 移除面板 Removing a panel can not be undone. Do you want to remove this panel? 移除面板是不可撤銷動作的。 確定移除此面板嗎? Plugin Configure "%1" 設定 "%1" Move "%1" 移動 "%1" Remove "%1" 移除 "%1" main Use alternate configuration file. 使用替用的設定檔案。 Configuration file 設定檔案 ================================================ FILE: panel/windownotifier.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "windownotifier.h" #include #include void WindowNotifier::observeWindow(QWidget * w) { //installing the same filter object multiple times doesn't harm w->installEventFilter(this); } bool WindowNotifier::eventFilter(QObject * watched, QEvent * event) { QWidget * widget = qobject_cast(watched); //we're observing only QWidgetw auto it = std::lower_bound(mShownWindows.begin(), mShownWindows.end(), widget); switch (event->type()) { case QEvent::Close: watched->removeEventFilter(this); #if __cplusplus >= 201703L [[fallthrough]]; #endif // fall through case QEvent::Hide: if (mShownWindows.end() != it) mShownWindows.erase(it); if (mShownWindows.isEmpty()) emit lastHidden(); break; case QEvent::Show: { const bool first_shown = mShownWindows.isEmpty(); mShownWindows.insert(it, widget); //we keep the mShownWindows sorted if (first_shown) emit firstShown(); } default: break; } return false; } ================================================ FILE: panel/windownotifier.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #if !defined(WINDOWNOTIFIER_H) #define WINDOWNOTIFIER_H #include class QWidget; class WindowNotifier : public QObject { Q_OBJECT public: using QObject::QObject; void observeWindow(QWidget * w); inline bool isAnyWindowShown() const { return !mShownWindows.isEmpty(); } virtual bool eventFilter(QObject * watched, QEvent * event) override; signals: void lastHidden(); void firstShown(); private: QList mShownWindows; //!< known shown windows (sorted) }; #endif ================================================ FILE: plugin-backlight/CMakeLists.txt ================================================ set(PLUGIN "backlight") set(HEADERS backlight.h sliderdialog.h ) set(SOURCES backlight.cpp sliderdialog.cpp ) set(LIBRARIES ${LIBRARIES} ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-backlight/backlight.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "backlight.h" #include #include BacklightButton::BacklightButton(QWidget *parent): QToolButton(parent), m_mouseWheelThresholdCounter(0) {} void BacklightButton::wheelEvent(QWheelEvent *e) { e->accept(); QPoint angleDelta = e->angleDelta(); Qt::Orientation orient = (std::abs(angleDelta.x()) > std::abs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int rotationSteps = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); m_mouseWheelThresholdCounter += rotationSteps; if(std::abs(m_mouseWheelThresholdCounter) < 100) return; emit wheel(rotationSteps > 0 ? true : false); m_mouseWheelThresholdCounter = 0; } LXQtBacklight::LXQtBacklight(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo) { m_backlightButton = new BacklightButton(); // use our own icon m_backlightButton->setIcon(QIcon::fromTheme(QStringLiteral("brightnesssettings"))); m_backlightButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_updateTimer.setSingleShot(true); m_updateTimer.setInterval(2000); m_backlightSlider = new SliderDialog(m_backlightButton); connect(m_backlightButton, &BacklightButton::wheel, m_backlightSlider, [this](bool up) { // Using a timer is only a safeguard against returning the slider to its previous value // on updating it, although that should not happen with the code of SliderDialog. if (!m_updateTimer.isActive()) m_backlightSlider->updateBacklight(); m_updateTimer.start(); if (up) m_backlightSlider->upButtonClicked(true); else m_backlightSlider->downButtonClicked(true); }); connect(m_backlightButton, &QToolButton::clicked, this, &LXQtBacklight::toggleSlider); } LXQtBacklight::~LXQtBacklight() { delete m_backlightButton; } QWidget *LXQtBacklight::widget() { return m_backlightButton; } void LXQtBacklight::toggleSlider() { if (m_backlightSlider->isVisible()) m_backlightSlider->hide(); else { QSize size = m_backlightSlider->sizeHint(); QRect rect = calculatePopupWindowPos(size); m_backlightSlider->setGeometry(rect); m_backlightSlider->updateBacklight(); m_backlightSlider->show(); m_backlightSlider->setFocus(); } } ================================================ FILE: plugin-backlight/backlight.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTBACKLIGHT_H #define LXQTBACKLIGHT_H #include #include #include #include "../panel/ilxqtpanelplugin.h" #include "sliderdialog.h" namespace LXQt { class Notification; } namespace GlobalKeyShortcut { class Action; } class BacklightButton : public QToolButton { Q_OBJECT public: BacklightButton(QWidget *parent = nullptr); ~BacklightButton() {}; signals: void wheel(bool up); protected: void wheelEvent(QWheelEvent *e) override; private: int m_mouseWheelThresholdCounter; }; class LXQtBacklight : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtBacklight(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtBacklight(); virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("Backlight"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment ; } protected Q_SLOTS: void toggleSlider(); private: BacklightButton *m_backlightButton; SliderDialog *m_backlightSlider; QTimer m_updateTimer; }; class LXQtBacklightPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtBacklight(startupInfo); } }; #endif // LXQTBACKLIGHT_H ================================================ FILE: plugin-backlight/resources/backlight.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=brightnesssettings #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-backlight/sliderdialog.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include "sliderdialog.h" #include #include SliderDialog::SliderDialog(QWidget *parent) : QDialog(parent, Qt::Dialog | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint) { setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint); m_backlight = new LXQt::Backlight(this); QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(2, 2, 2, 2); m_upButton = new QToolButton(); m_upButton->setText(QStringLiteral("☀")); m_upButton->setAutoRepeat(true); layout->addWidget(m_upButton, 0, Qt::AlignHCenter); m_slider = new QSlider(this); layout->addWidget(m_slider, 0, Qt::AlignHCenter); m_downButton = new QToolButton(); m_downButton->setText(QStringLiteral("☼")); m_downButton->setAutoRepeat(true); layout->addWidget(m_downButton, 0, Qt::AlignHCenter); if(m_backlight->isBacklightAvailable() || m_backlight->isBacklightOff()) { // Set the minimum to 5% of the maximum to prevent a black screen int minBacklight = std::max(std::round(static_cast(m_backlight->getMaxBacklight())*0.05), 1.0); int maxBacklight = m_backlight->getMaxBacklight(); int interval = maxBacklight - minBacklight; if(interval <= 100) { m_slider->setMaximum(maxBacklight); m_slider->setMinimum(minBacklight); m_slider->setValue(m_backlight->getBacklight()); } else { m_slider->setMaximum(100); // Set the minimum to 5% of the maximum to prevent a black screen m_slider->setMinimum(5); m_slider->setValue(std::round(static_cast(m_backlight->getBacklight() * 100) / maxBacklight)); } } else { m_slider->setValue(0); m_slider->setEnabled(false); m_upButton->setEnabled(false); m_downButton->setEnabled(false); } connect(m_slider, &QSlider::valueChanged, this, &SliderDialog::sliderValueChanged); connect(m_upButton, &QToolButton::clicked, this, &SliderDialog::upButtonClicked); connect(m_downButton, &QToolButton::clicked, this, &SliderDialog::downButtonClicked); } void SliderDialog::sliderValueChanged(int value) { // Set the minimum to 5% of the maximum to prevent a black screen int minBacklight = std::max(std::round(static_cast(m_backlight->getMaxBacklight())*0.05), 1.0); int maxBacklight = m_backlight->getMaxBacklight(); int interval = maxBacklight - minBacklight; if(interval > 100) value = (value * maxBacklight) / 100; m_backlight->setBacklight(value); } void SliderDialog::updateBacklight() { // Set the minimum to 5% of the maximum to prevent a black screen int minBacklight = std::max(std::round(static_cast(m_backlight->getMaxBacklight())*0.05), 1.0); int maxBacklight = m_backlight->getMaxBacklight(); int interval = maxBacklight - minBacklight; disconnect(m_slider, &QSlider::valueChanged, this, &SliderDialog::sliderValueChanged); if(interval <= 100) m_slider->setValue(m_backlight->getBacklight()); else m_slider->setValue(std::round(static_cast(m_backlight->getBacklight() * 100) / maxBacklight)); connect(m_slider, &QSlider::valueChanged, this, &SliderDialog::sliderValueChanged); } void SliderDialog::downButtonClicked(bool) { if (m_slider->isEnabled()) // also called by LXQtBacklight m_slider->setValue(m_slider->value() - 1); } void SliderDialog::upButtonClicked(bool) { if (m_slider->isEnabled()) // also called by LXQtBacklight m_slider->setValue(m_slider->value() + 1); } bool SliderDialog::event(QEvent * event) { if(event->type() == QEvent::WindowDeactivate || event->type() == QEvent::Hide) { hide(); //printf("emit dialogClosed()\n"); emit dialogClosed(); } return QDialog::event(event); } ================================================ FILE: plugin-backlight/sliderdialog.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SLIDERDIALOG_H #define SLIDERDIALOG_H #include #include #include #include class SliderDialog: public QDialog { Q_OBJECT public: SliderDialog(QWidget *parent); void updateBacklight(); public Q_SLOTS: void downButtonClicked(bool); void upButtonClicked(bool); Q_SIGNALS: void dialogClosed(); protected: bool event(QEvent *event) override; private: QSlider *m_slider; QToolButton *m_upButton, *m_downButton; LXQt::Backlight *m_backlight; private Q_SLOTS: void sliderValueChanged(int value); }; #endif // SLIDERDIALOG_H ================================================ FILE: plugin-backlight/translations/backlight.desktop.yaml ================================================ Desktop Entry/Name: "Backlight" Desktop Entry/Comment: "Sets display backlight" ================================================ FILE: plugin-backlight/translations/backlight_ar.desktop.yaml ================================================ Desktop Entry/Name: "الإضاءة الخلفية" Desktop Entry/Comment: "يضبط الإضاءة الخلفية للشاشة" ================================================ FILE: plugin-backlight/translations/backlight_bg.desktop.yaml ================================================ Desktop Entry/Name: "Осветеност на екрана" Desktop Entry/Comment: "Настройки осветеност на екрана LXQt" ================================================ FILE: plugin-backlight/translations/backlight_ca.desktop.yaml ================================================ Desktop Entry/Name: "Retroil·luminació" Desktop Entry/Comment: "Estableix la retroil·luminació" ================================================ FILE: plugin-backlight/translations/backlight_cs.desktop.yaml ================================================ Desktop Entry/Name: "Podsvícení" Desktop Entry/Comment: "Nastavuje podsvícení obrazovky" ================================================ FILE: plugin-backlight/translations/backlight_da.desktop.yaml ================================================ Desktop Entry/Name: "Baggrundsbelysning" Desktop Entry/Comment: "Indstiller skærmens baggrundsbelysning" ================================================ FILE: plugin-backlight/translations/backlight_de.desktop.yaml ================================================ Desktop Entry/Name: "Hintergrundbeleuchtung" Desktop Entry/Comment: "Legt die Hintergrundbeleuchtung des Bildschirms fest" ================================================ FILE: plugin-backlight/translations/backlight_el.desktop.yaml ================================================ Desktop Entry/Name: "Οπίσθιος φωτισμός" Desktop Entry/Comment: "Ρυθμίζει τον οπίσθιο φωτισμό της οθόνης" ================================================ FILE: plugin-backlight/translations/backlight_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Backlight" Desktop Entry/Comment: "Sets display backlight" ================================================ FILE: plugin-backlight/translations/backlight_es.desktop.yaml ================================================ Desktop Entry/Name: "Brillo de la pantalla" Desktop Entry/Comment: "Cambia el brillo de la pantalla" ================================================ FILE: plugin-backlight/translations/backlight_et.desktop.yaml ================================================ Desktop Entry/Name: "Taustavalgus" Desktop Entry/Comment: "Seadista ekraani taustavalgust" ================================================ FILE: plugin-backlight/translations/backlight_fi.desktop.yaml ================================================ Desktop Entry/Name: "Taustavalo" Desktop Entry/Comment: "Asettaa näytön taustavalaistuksen" ================================================ FILE: plugin-backlight/translations/backlight_fr.desktop.yaml ================================================ Desktop Entry/Name: "Rétroéclairage" Desktop Entry/Comment: "Définit le rétroéclairage de l'écran" ================================================ FILE: plugin-backlight/translations/backlight_he.desktop.yaml ================================================ Desktop Entry/Name: "תאורה אחורית" Desktop Entry/Comment: "הגדרת התאורה האחורית של התצוגה" ================================================ FILE: plugin-backlight/translations/backlight_hr.desktop.yaml ================================================ Desktop Entry/Name: "Svjetlina ekrana" Desktop Entry/Comment: "Postavlja svjetlinu ekrana" ================================================ FILE: plugin-backlight/translations/backlight_hu.desktop.yaml ================================================ Desktop Entry/Name: "Háttérvilágítás" Desktop Entry/Comment: "A képernyő háttérvilágítását állítja be" ================================================ FILE: plugin-backlight/translations/backlight_it.desktop.yaml ================================================ Desktop Entry/Name: "Retroilluminazione" Desktop Entry/Comment: "Regola luminosità dello schermo" ================================================ FILE: plugin-backlight/translations/backlight_ja.desktop.yaml ================================================ Desktop Entry/Name: "バックライト" Desktop Entry/Comment: "ディスプレイのバックライトを設定します" ================================================ FILE: plugin-backlight/translations/backlight_ka.desktop.yaml ================================================ Desktop Entry/Name: "უკუნათება" Desktop Entry/Comment: "აყენებს ეკრანის უკუნათებას" ================================================ FILE: plugin-backlight/translations/backlight_kk.desktop.yaml ================================================ Desktop Entry/Name: "Артқы жарықтандыру" Desktop Entry/Comment: "Экранның артқы жарықтандыруын басқару" ================================================ FILE: plugin-backlight/translations/backlight_ko.desktop.yaml ================================================ Desktop Entry/Name: "백라이트" Desktop Entry/Comment: "디스플레이 백라이트 설정" ================================================ FILE: plugin-backlight/translations/backlight_lg.desktop.yaml ================================================ Desktop Entry/Name: "Emmulisa y'olutimbe" Desktop Entry/Comment: "Kano kakyusa okwaka kw'ettaala ez'entimbe z'ekika ekimulisibwa" ================================================ FILE: plugin-backlight/translations/backlight_lt.desktop.yaml ================================================ Desktop Entry/Name: "Foninis apšvietimas" Desktop Entry/Comment: "Nustato ekrano foninį apšvietimą" ================================================ FILE: plugin-backlight/translations/backlight_lv.desktop.yaml ================================================ Desktop Entry/Name: "Fona izgaismojums" Desktop Entry/Comment: "Ekrāna izgaismojuma spilgtuma iestatīšana" ================================================ FILE: plugin-backlight/translations/backlight_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Baklys" Desktop Entry/Comment: "Setter skjermens baklysnivå" ================================================ FILE: plugin-backlight/translations/backlight_nl.desktop.yaml ================================================ Desktop Entry/Name: "Achtergrondverlichting" Desktop Entry/Comment: "Stel de achtergrondverlichting in" ================================================ FILE: plugin-backlight/translations/backlight_oc.desktop.yaml ================================================ Desktop Entry/Name: "Retroesclairatge" Desktop Entry/Comment: "Definís lo retroesclairatge de l’ecran" ================================================ FILE: plugin-backlight/translations/backlight_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਬੈਕਲਾਈਟ" Desktop Entry/Comment: "ਡਿਸਪਲੇਅ ਦੀ ਬੈਕਲਾਈਟ ਸੈੱਟ ਕਰੋ" ================================================ FILE: plugin-backlight/translations/backlight_pl.desktop.yaml ================================================ Desktop Entry/Name: "Podświetlenie" Desktop Entry/Comment: "Ustawia podświetlenie wyświetlacza" ================================================ FILE: plugin-backlight/translations/backlight_pt.desktop.yaml ================================================ Desktop Entry/Name: "Retro-iluminação" Desktop Entry/Comment: "Define a retro-iluminação do visor" ================================================ FILE: plugin-backlight/translations/backlight_ru.desktop.yaml ================================================ Desktop Entry/Name: "Подсветка" Desktop Entry/Comment: "Регулировка яркости подсветки экрана" ================================================ FILE: plugin-backlight/translations/backlight_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-backlight/translations/backlight_sk.desktop.yaml ================================================ Desktop Entry/Name: "Podsvietenie" Desktop Entry/Comment: "Nastaviť podsvietenie obrazovky" ================================================ FILE: plugin-backlight/translations/backlight_sr.desktop.yaml ================================================ Desktop Entry/Name: "Позадинско светло" Desktop Entry/Comment: "Подешава позадинско светло" ================================================ FILE: plugin-backlight/translations/backlight_sv.desktop.yaml ================================================ Desktop Entry/Name: "Bakgrundsbelysning" Desktop Entry/Comment: "Justera skärmens bakgrundsbelysning" ================================================ FILE: plugin-backlight/translations/backlight_tr.desktop.yaml ================================================ Desktop Entry/Name: "Arka ışık" Desktop Entry/Comment: "Görüntünün arka ışığını ayarlar" ================================================ FILE: plugin-backlight/translations/backlight_uk.desktop.yaml ================================================ Desktop Entry/Name: "Яскравість екрана" Desktop Entry/Comment: "Налаштування яскравості екрана" ================================================ FILE: plugin-backlight/translations/backlight_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "背光" Desktop Entry/Comment: "设置显示屏背光" ================================================ FILE: plugin-backlight/translations/backlight_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "背光" Desktop Entry/Comment: "設定顯示背光" ================================================ FILE: plugin-colorpicker/CMakeLists.txt ================================================ set(PLUGIN "colorpicker") set(HEADERS colorpicker.h colorbutton.h ) set(SOURCES colorpicker.cpp colorbutton.cpp ) set(UIS "") set(LIBRARIES lxqt ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-colorpicker/colorbutton.cpp ================================================ #include "colorbutton.h" #include #include void ColorButton::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QToolButton::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); qreal minDimension = std::min(size().width(), size().height()) / 2; qreal minIconSize = std::min(iconSize().width(), iconSize().height()) / 2; qreal radio = std::min(minDimension, minIconSize) - 3; QPainterPath path; path.addEllipse(QRectF(rect()).center(), radio, radio); painter.fillPath(path, color); painter.drawPath(path); } void ColorButton::setColor(QColor color) { this->color = color; repaint(); } ================================================ FILE: plugin-colorpicker/colorbutton.h ================================================ #ifndef COLORBUTTON_H #define COLORBUTTON_H #include class QColor; class QPaintEvent; class ColorButton : public QToolButton { public: void paintEvent(QPaintEvent* event); void setColor(QColor color); private: QColor color; }; #endif // COLORBUTTON_H ================================================ FILE: plugin-colorpicker/colorpicker.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2019 LXQt team * Authors: * micrococo * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "colorbutton.h" #include "colorpicker.h" #include #include #include #include #include #include #include #include //NOTE: Xlib.h defines Bool which conflicts with QJsonValue::Type enum #include #undef Bool const QString ColorPickerWidget::svgIcon = QStringLiteral( "" " " " " "" ); ColorPicker::ColorPicker(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo) { connect(&mWidget, &ColorPickerWidget::showMenuRequested, this, [&](QMenu *menu) { willShowWindow(menu); menu->popup(calculatePopupWindowPos(menu->sizeHint()).topLeft()); }); realign(); } ColorPicker::~ColorPicker() = default; void ColorPicker::realign() { mWidget.update(panel()->lineCount() <= 1 ? panel()->isHorizontal() : !panel()->isHorizontal()); } ColorPickerWidget::ColorPickerWidget(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mSeparator = new QFrame(); mSeparator->setFrameShape(QFrame::VLine); mSeparator->setFrameShadow(QFrame::Sunken); mSeparator->setLineWidth(1); mSeparator->setFixedHeight(16); mPickerButton = new QToolButton(); mPickerButton->setObjectName(QStringLiteral("ColorPickerPickerButton")); mPickerButton->setAccessibleName(mPickerButton->objectName()); mPickerButton->setAutoRaise(true); mPickerButton->setIcon(QIcon::fromTheme(QLatin1String("color-picker"), QIcon::fromTheme(QLatin1String("color-select-symbolic")))); mPickerButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mColorButton = new ColorButton(); mColorButton->setObjectName(QStringLiteral("ColorPickerColorButton")); mColorButton->setAccessibleName(mColorButton->objectName()); mColorButton->setAutoRaise(true); mColorButton->setStyleSheet(QStringLiteral("::menu-indicator{ image: none; }")); mColorButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(mPickerButton); layout->addWidget(mSeparator); layout->addWidget(mColorButton); setLayout(layout); connect(mPickerButton, &QToolButton::clicked, this, &ColorPickerWidget::captureMouse); connect(mColorButton, &QToolButton::clicked, this, [&]() { buildMenu(); emit showMenuRequested(mColorsMenu); }); } ColorPickerWidget::~ColorPickerWidget() = default; void ColorPickerWidget::update(bool isHorizontal) { QLayout *layout = this->layout(); if (isHorizontal) { qobject_cast(layout)->setDirection(QBoxLayout::LeftToRight); mSeparator->setFrameShape(QFrame::VLine); } else { qobject_cast(layout)->setDirection(QBoxLayout::TopToBottom); mSeparator->setFrameShape(QFrame::HLine); } mColorButton->setColor(mColorsList.isEmpty() ? palette().color(QPalette::Window) : mColorsList.at(0)); } void ColorPickerWidget::mouseReleaseEvent(QMouseEvent *event) { if (!mCapturing) return; QColor col; if (auto *x11Application = qGuiApp->nativeInterface()) { WId id = XDefaultRootWindow(x11Application->display()); QPoint point = event->globalPosition().toPoint(); QPixmap pixmap = qApp->primaryScreen()->grabWindow(id, point.x(), point.y(), 1, 1); QImage img = pixmap.toImage(); col = QColor(img.pixel(0, 0)); } else { qWarning() << "WAYLAND does not support grabbing windows"; } mColorButton->setColor(col); paste(col.name()); if (mColorsList.contains(col)) { mColorsList.move(mColorsList.indexOf(col), 0); } else { mColorsList.prepend(col); } if (mColorsList.size() > 10) { mColorsList.removeLast(); } mCapturing = false; releaseMouse(); if (!mPickerButton->contentsRect().contains(mapFromGlobal(QCursor::pos()))) { QApplication::sendEvent(mPickerButton, new QEvent(QEvent::Leave)); } } void ColorPickerWidget::captureMouse() { grabMouse(Qt::CrossCursor); mCapturing = true; } QIcon ColorPickerWidget::colorIcon(QColor color) { QString data = svgIcon.arg(palette().color(QPalette::Text).name(), color.name()); QPixmap pixmap(mColorButton->iconSize()); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHint(QPainter::Antialiasing, true); QSvgRenderer renderer { data.toLocal8Bit() }; renderer.render(&painter); QIcon icon(pixmap); return icon; } void ColorPickerWidget::buildMenu() { if (mColorsMenu == nullptr) { mColorsMenu = new QMenu(this); mColorsMenu->setObjectName(QStringLiteral("ColorPickerMenu")); mColorsMenu->setAccessibleName(mColorsMenu->objectName()); mColorButton->setMenu(mColorsMenu); mClearListAction = new QAction(QIcon::fromTheme(QLatin1String("edit-clear-all")), tr("Clear list")); mClearListAction->setObjectName(QStringLiteral("ColorPickerClearAction")); connect(mColorsMenu, &QMenu::triggered, this, [&](QAction *action) { if (action == mClearListAction) { return; } paste(action->text()); QColor color(action->text()); mColorsList.move(mColorsList.indexOf(color), 0); mColorButton->setColor(color); }); } for (QAction *action : mColorsMenu->actions()) { mColorsMenu->removeAction(action); if (action != mClearListAction) { delete action; } } if (mColorsList.isEmpty()) { QAction* empty = new QAction(tr("empty"), mColorsMenu); empty->setEnabled(false); mColorsMenu->addAction(empty); mColorButton->setColor(palette().color(QPalette::Window)); } else { for (QColor color : mColorsList) { mColorsMenu->addAction(new QAction(colorIcon(color), color.name(), mColorsMenu)); } mColorsMenu->addAction(mClearListAction); connect(mClearListAction, &QAction::triggered, this, [&]() { mColorsList.clear(); mColorButton->setColor(palette().color(QPalette::Window)); }); } } void ColorPickerWidget::paste(const QString color) const { QClipboard *clip = QApplication::clipboard(); if (clip) { clip->setText(color); } } ================================================ FILE: plugin-colorpicker/colorpicker.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2019 LXQt team * Authors: * micrococo * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_COLORPICKER_H #define LXQT_COLORPICKER_H #include "../panel/ilxqtpanelplugin.h" #include #include class QMenu; class ColorButton; class ColorPickerWidget : public QWidget { Q_OBJECT public: ColorPickerWidget(QWidget* parent = nullptr); ~ColorPickerWidget(); QMenu* popupMenu() { return mColorsMenu; } QToolButton* pickerButton() { return mPickerButton; } ColorButton* colorButton() { return mColorButton; } void update(bool isHorizontal); signals: void showMenuRequested(QMenu* menu); protected: void mouseReleaseEvent(QMouseEvent *event); private slots: void captureMouse(); private: static const QString svgIcon; QMenu *mColorsMenu { nullptr }; QToolButton *mPickerButton { nullptr }; ColorButton *mColorButton { nullptr }; QAction *mClearListAction { nullptr }; QFrame *mSeparator { nullptr }; bool mCapturing { false }; QList mColorsList {}; QIcon colorIcon(QColor color); void buildMenu(); void paste(const QString color) const; }; class ColorPicker : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: ColorPicker(const ILXQtPanelPluginStartupInfo &startupInfo); ~ColorPicker(); virtual QWidget *widget() override { return &mWidget; } virtual QString themeId() const override { return QStringLiteral("ColorPicker"); } virtual bool isSeparate() const override { return true; } virtual void realign() override; private: ColorPickerWidget mWidget; }; class ColorPickerLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new ColorPicker(startupInfo); } }; #endif ================================================ FILE: plugin-colorpicker/resources/colorpicker.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=color-picker #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-colorpicker/translations/colorpicker.desktop.yaml ================================================ Desktop Entry/Name: "Color Picker" Desktop Entry/Comment: "Get the color under the cursor and maintains a list of recently selected colors" ================================================ FILE: plugin-colorpicker/translations/colorpicker.ts ================================================ ColorPickerWidget Clear list empty ================================================ FILE: plugin-colorpicker/translations/colorpicker_ar.desktop.yaml ================================================ Desktop Entry/Name: "لاقط الألوان" Desktop Entry/Comment: "احصل على اللون أسفل المؤشر واحتفظ بقائمة من الألوان المحددة مؤخرًا" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ar.ts ================================================ ColorPickerWidget Clear list امسح القائمة empty فارغ ================================================ FILE: plugin-colorpicker/translations/colorpicker_bg.desktop.yaml ================================================ Desktop Entry/Name: "Избиране на цветове" Desktop Entry/Comment: "Избира цвета под курсора и показва последните избрани цветове" ================================================ FILE: plugin-colorpicker/translations/colorpicker_bg.ts ================================================ ColorPickerWidget Clear list Изчистване на списъка empty празно ================================================ FILE: plugin-colorpicker/translations/colorpicker_ca.desktop.yaml ================================================ Desktop Entry/Name: "Selector de color" Desktop Entry/Comment: "Obteniu el color a sota del cursor; amb un historial dels colors recents" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ca.ts ================================================ ColorPickerWidget Clear list Neteja la llista empty buit ================================================ FILE: plugin-colorpicker/translations/colorpicker_cs.desktop.yaml ================================================ Desktop Entry/Name: "Výběr barvy" Desktop Entry/Comment: "Získá barvu pod ukazatelem a udržuje seznam nedávno vybraných barev" ================================================ FILE: plugin-colorpicker/translations/colorpicker_cs.ts ================================================ ColorPickerWidget Clear list Vyčistit seznam empty prázdné ================================================ FILE: plugin-colorpicker/translations/colorpicker_da.desktop.yaml ================================================ Desktop Entry/Name: "Farvevælger" Desktop Entry/Comment: "Få farven under markøren og vedligehold en liste over nyligt valgte farver" ================================================ FILE: plugin-colorpicker/translations/colorpicker_da.ts ================================================ ColorPickerWidget Clear list Ryd liste empty tom ================================================ FILE: plugin-colorpicker/translations/colorpicker_de.desktop.yaml ================================================ Desktop Entry/Name: "Farbwähler" Desktop Entry/Comment: "Ermittelt die Farbe unter dem Zeiger und verwaltet eine Liste der zuletzt ausgewählten Farben" ================================================ FILE: plugin-colorpicker/translations/colorpicker_de.ts ================================================ ColorPickerWidget Clear list Liste leeren empty leer ================================================ FILE: plugin-colorpicker/translations/colorpicker_el.desktop.yaml ================================================ Desktop Entry/Name: "Επιλογέας χρωμάτων" Desktop Entry/Comment: "Λήψη του χρώματος κάτω από τον δρομέα και διατήρηση ενός κατάστιχου των πρόσφατα επιλεγμένων χρωμάτων" ================================================ FILE: plugin-colorpicker/translations/colorpicker_el.ts ================================================ ColorPickerWidget Clear list Εκκαθάριση λίστας empty κενό ================================================ FILE: plugin-colorpicker/translations/colorpicker_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Colour Picker" Desktop Entry/Comment: "Get the colour under the cursor and maintain a list of recently selected colours" ================================================ FILE: plugin-colorpicker/translations/colorpicker_en_GB.ts ================================================ ColorPickerWidget Clear list Clear list empty empty ================================================ FILE: plugin-colorpicker/translations/colorpicker_es.desktop.yaml ================================================ Desktop Entry/Name: "Selector de color" Desktop Entry/Comment: "Selecciona el color bajo el cursor y mantiene un historial de los colores" ================================================ FILE: plugin-colorpicker/translations/colorpicker_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Recoge colores" Desktop Entry/Comment: "Toma un color de la pantalla con el cursor, para desarrolladores web" ================================================ FILE: plugin-colorpicker/translations/colorpicker_et.desktop.yaml ================================================ Desktop Entry/Name: "Värvivalija" Desktop Entry/Comment: "Näita kursorialust värvitooni ja salvesta viimatikasutatud värvitoonid" ================================================ FILE: plugin-colorpicker/translations/colorpicker_et.ts ================================================ ColorPickerWidget Clear list Kustuta loend empty tühi ================================================ FILE: plugin-colorpicker/translations/colorpicker_eu.desktop.yaml ================================================ Desktop Entry/Name: "Kolore-hautatzailea" Desktop Entry/Comment: "Lortu kolorea kurtsorearen azpian eta duela gutxi hautatutako koloreen zerrenda mantentzen du" ================================================ FILE: plugin-colorpicker/translations/colorpicker_fi.desktop.yaml ================================================ Desktop Entry/Name: "Värivalitsin" Desktop Entry/Comment: "Näyttää hiiren osoittimen alla olevan värin ja ylläpitää luetteloa viimeksi valituista väreistä" ================================================ FILE: plugin-colorpicker/translations/colorpicker_fi.ts ================================================ ColorPickerWidget Clear list Tyhjennä luettelo empty tyhjä ================================================ FILE: plugin-colorpicker/translations/colorpicker_fr.desktop.yaml ================================================ Desktop Entry/Name: "Sélecteur de couleur" Desktop Entry/Comment: "Obtient la couleur sous le curseur et maintient une liste des couleurs récemment sélectionnées" ================================================ FILE: plugin-colorpicker/translations/colorpicker_fr.ts ================================================ ColorPickerWidget Clear list Effacer la liste empty vide ================================================ FILE: plugin-colorpicker/translations/colorpicker_he.desktop.yaml ================================================ Desktop Entry/Name: "בוחר צבעים" Desktop Entry/Comment: "קבלת הצבע שתחת סמן העכבר ושמירת רשימה של הצבעים שנבחרו לאחרונה" ================================================ FILE: plugin-colorpicker/translations/colorpicker_he.ts ================================================ ColorPickerWidget Clear list פינוי הרשימה empty ריקה ================================================ FILE: plugin-colorpicker/translations/colorpicker_hr.desktop.yaml ================================================ Desktop Entry/Name: "Kapaljka" Desktop Entry/Comment: "Dobij boju ispod pokazivača i održava popis nedavno odabranih boja" ================================================ FILE: plugin-colorpicker/translations/colorpicker_hr.ts ================================================ ColorPickerWidget Clear list Izbriši popis empty prazno ================================================ FILE: plugin-colorpicker/translations/colorpicker_hu.desktop.yaml ================================================ Desktop Entry/Name: "Színválasztó" Desktop Entry/Comment: "Szín kiválasztása a képernyőről. Fejlesztőknek" ================================================ FILE: plugin-colorpicker/translations/colorpicker_hu.ts ================================================ ColorPickerWidget Clear list Lista törlése empty üres ================================================ FILE: plugin-colorpicker/translations/colorpicker_it.desktop.yaml ================================================ Desktop Entry/Name: "Selettore di colore" Desktop Entry/Comment: "Rileva il colore sotto il cursore e mantiene una lista degli ultimi colori selezionati" ================================================ FILE: plugin-colorpicker/translations/colorpicker_it.ts ================================================ ColorPickerWidget Clear list Svuota lista empty vuoto ================================================ FILE: plugin-colorpicker/translations/colorpicker_ja.desktop.yaml ================================================ Desktop Entry/Name: "カラーピッカー" Desktop Entry/Comment: "マウスカーソルの下の色を取得し、最近選択した色のリストを保持します" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ka.desktop.yaml ================================================ Desktop Entry/Name: "ფერის ამრჩევი" Desktop Entry/Comment: "იღებს ფერს კურსორის ქვეშ და ინახავს ახლახან არჩეულ ფერებს" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ka.ts ================================================ ColorPickerWidget Clear list სიის გასუფთავება empty ცარიელი ================================================ FILE: plugin-colorpicker/translations/colorpicker_kab.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-colorpicker/translations/colorpicker_kab.ts ================================================ ColorPickerWidget Clear list Sfeḍ tabdart empty D tilemt ================================================ FILE: plugin-colorpicker/translations/colorpicker_kk.desktop.yaml ================================================ Desktop Entry/Name: "Түстер таңдаушысы" Desktop Entry/Comment: "Курсор тұрған жердегі түсті алу және жақында пайдаланылған түстер тізімін жүргізу" ================================================ FILE: plugin-colorpicker/translations/colorpicker_kk.ts ================================================ ColorPickerWidget Clear list Тізімді тазарту empty бос ================================================ FILE: plugin-colorpicker/translations/colorpicker_ko.desktop.yaml ================================================ Desktop Entry/Name: "색상 선택기" Desktop Entry/Comment: "커서 아래에 있는 색상을 가져오고 최근에 선택한 색상 목록을 유지합니다" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ko.ts ================================================ ColorPickerWidget Clear list 목록 지우기 empty 비어있음 ================================================ FILE: plugin-colorpicker/translations/colorpicker_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kalonda langi" Desktop Entry/Comment: "Kakwata langi akasonga ka ko we kali ne kazimba olukalala lwa langi ezirondedwa" ================================================ FILE: plugin-colorpicker/translations/colorpicker_lg.ts ================================================ ColorPickerWidget Clear list Ebiri ku lukalala byonna bigyeko empty Lwereere ================================================ FILE: plugin-colorpicker/translations/colorpicker_lt.desktop.yaml ================================================ Desktop Entry/Name: "Spalvos parinkiklis" Desktop Entry/Comment: "Gauna po žymekliu esančią spalvą ir sudaro paskiausiai pasirinktų spalvų sąrašą" ================================================ FILE: plugin-colorpicker/translations/colorpicker_lt.ts ================================================ ColorPickerWidget Clear list Išvalyti sąrašą empty tuščia ================================================ FILE: plugin-colorpicker/translations/colorpicker_lv.desktop.yaml ================================================ Desktop Entry/Name: "Krāsas noteicējs (krāsu gamma)" Desktop Entry/Comment: "Nosakiet krāsu zem kursora. Tīmekļa developeriem" ================================================ FILE: plugin-colorpicker/translations/colorpicker_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Fargevelger" Desktop Entry/Comment: "Henter fargen under pekeren og opprettholder en liste over nylig valgte farger" ================================================ FILE: plugin-colorpicker/translations/colorpicker_nl.desktop.yaml ================================================ Desktop Entry/Name: "Kleurkiezer" Desktop Entry/Comment: "Selecteer de kleur onder de cursor en houd een lijst bij met onlangs gekozen kleuren" ================================================ FILE: plugin-colorpicker/translations/colorpicker_nl.ts ================================================ ColorPickerWidget Clear list Lijst wissen empty leeg ================================================ FILE: plugin-colorpicker/translations/colorpicker_oc.desktop.yaml ================================================ Desktop Entry/Name: "Selector de color" Desktop Entry/Comment: "Obténer la color jos cursor amb un istoric de las colors recentas" ================================================ FILE: plugin-colorpicker/translations/colorpicker_oc.ts ================================================ ColorPickerWidget Clear list Escafar la lista empty voida ================================================ FILE: plugin-colorpicker/translations/colorpicker_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਰੰਗ ਚੋਣਕਾਰ" Desktop Entry/Comment: "ਕਰਸਰ ਦੇ ਹੇਠਾਂ ਰੰਗ ਲਵੋ ਅਤੇ ਸੱਜਰੇ ਚੁਣੇ ਗਏ ਰੰਗਾਂ ਦੀ ਸੂਚੀ ਬਣਾਈ ਰੱਖੋ" ================================================ FILE: plugin-colorpicker/translations/colorpicker_pl.desktop.yaml ================================================ Desktop Entry/Name: "Wybieracz kolorów" Desktop Entry/Comment: "Sprawdza kolor wskazany kursorem i przechowuje listę ostatnio wybranych kolorów" ================================================ FILE: plugin-colorpicker/translations/colorpicker_pl.ts ================================================ ColorPickerWidget Clear list Wyczyść listę empty puste ================================================ FILE: plugin-colorpicker/translations/colorpicker_pt.desktop.yaml ================================================ Desktop Entry/Name: "Seletor de cores" Desktop Entry/Comment: "Obtém a cor sob o cursor e mantém uma lista de cores selecionadas recentemente" ================================================ FILE: plugin-colorpicker/translations/colorpicker_pt.ts ================================================ ColorPickerWidget Clear list Limpar lista empty vazia ================================================ FILE: plugin-colorpicker/translations/colorpicker_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Seletor de cores" Desktop Entry/Comment: "Obtém a cor sob o cursor e mantém uma lista de cores recentemente selecionadas" ================================================ FILE: plugin-colorpicker/translations/colorpicker_pt_BR.ts ================================================ ColorPickerWidget Clear list Limpar lista empty vazio ================================================ FILE: plugin-colorpicker/translations/colorpicker_ro.desktop.yaml ================================================ Desktop Entry/Name: "Color picker" Desktop Entry/Comment: "Obține culoarea de sub cursor. Pentru dezvoltatori web" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ru.desktop.yaml ================================================ Desktop Entry/Name: "Цветовая палитра" Desktop Entry/Comment: "Получить цвет под курсором мыши и управлять списком недавно выбранных цветов" ================================================ FILE: plugin-colorpicker/translations/colorpicker_ru.ts ================================================ ColorPickerWidget Clear list Очистить список empty пусто ================================================ FILE: plugin-colorpicker/translations/colorpicker_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-colorpicker/translations/colorpicker_sk.desktop.yaml ================================================ Desktop Entry/Name: "Výber farby" Desktop Entry/Comment: "Získať farbu pod kurzorom a udržiavať zoznam naposledy vybratých farieb" ================================================ FILE: plugin-colorpicker/translations/colorpicker_sk.ts ================================================ ColorPickerWidget Clear list Zmazať zoznam empty Prázdny ================================================ FILE: plugin-colorpicker/translations/colorpicker_sr.desktop.yaml ================================================ Desktop Entry/Name: "Бирач боја" Desktop Entry/Comment: "Добијте боју испод курсора и одржава листу недавно изабраних боја" ================================================ FILE: plugin-colorpicker/translations/colorpicker_sr.ts ================================================ ColorPickerWidget Clear list Очисти листу empty празно ================================================ FILE: plugin-colorpicker/translations/colorpicker_sv.desktop.yaml ================================================ Desktop Entry/Name: "Färgväljare" Desktop Entry/Comment: "Hämta färg med muspekaren och underhåll en lista med hämtade färger" ================================================ FILE: plugin-colorpicker/translations/colorpicker_sv.ts ================================================ ColorPickerWidget Clear list Rensa lista empty tom ================================================ FILE: plugin-colorpicker/translations/colorpicker_th.desktop.yaml ================================================ Desktop Entry/Name: "ตัวเลือกค่าสี" Desktop Entry/Comment: "นำค่าสีที่อยู่ใต้เคอร์เซอร์ขึ้นมา สำหรับนักพัฒนาเว็บ" ================================================ FILE: plugin-colorpicker/translations/colorpicker_tr.desktop.yaml ================================================ Desktop Entry/Name: "Renk seçici" Desktop Entry/Comment: "İmlecin altındaki rengi alır ve en son seçilen renklerin bir listesini tutar" ================================================ FILE: plugin-colorpicker/translations/colorpicker_tr.ts ================================================ ColorPickerWidget Clear list Listeyi temizle empty boş ================================================ FILE: plugin-colorpicker/translations/colorpicker_uk.desktop.yaml ================================================ Desktop Entry/Name: "Селектор кольору" Desktop Entry/Comment: "Бере колір під курсором і підтримує список нещодавно вибраних кольорів" ================================================ FILE: plugin-colorpicker/translations/colorpicker_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "颜色拾取器" Desktop Entry/Comment: "为web开发者获取鼠标下的颜色" ================================================ FILE: plugin-colorpicker/translations/colorpicker_zh_CN.ts ================================================ ColorPickerWidget Clear list 清除列表 empty ================================================ FILE: plugin-colorpicker/translations/colorpicker_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "取得顏色" Desktop Entry/Comment: "取得游標指處顏色並列入最近選取顏色清單" ================================================ FILE: plugin-colorpicker/translations/colorpicker_zh_TW.ts ================================================ ColorPickerWidget Clear list 清除表列 empty 空白 ================================================ FILE: plugin-cpuload/CMakeLists.txt ================================================ set(PLUGIN "cpuload") set(HEADERS lxqtcpuloadplugin.h lxqtcpuload.h lxqtcpuloadconfiguration.h ) set(SOURCES lxqtcpuloadplugin.cpp lxqtcpuload.cpp lxqtcpuloadconfiguration.cpp ) set(UIS lxqtcpuloadconfiguration.ui ) set(LIBRARIES ${STATGRAB_LIB}) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-cpuload/lxqtcpuload.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtcpuload.h" #include "../panel/ilxqtpanelplugin.h" #include "../panel/pluginsettings.h" #include #include #include extern "C" { #include } #ifdef __sg_public // since libstatgrab 0.90 this macro is defined, so we use it for version check #define STATGRAB_NEWER_THAN_0_90 1 #endif #define BAR_ORIENT_BOTTOMUP "bottomUp" #define BAR_ORIENT_TOPDOWN "topDown" #define BAR_ORIENT_LEFTRIGHT "leftRight" #define BAR_ORIENT_RIGHTLEFT "rightLeft" LXQtCpuLoad::LXQtCpuLoad(ILXQtPanelPlugin* plugin, QWidget* parent): QFrame(parent), mPlugin(plugin), m_avg(0), m_showText(false), m_barWidth(20), m_barOrientation(TopDownBar), m_timerID(-1) { setObjectName(QStringLiteral("LXQtCpuLoad")); QHBoxLayout *layout = new QHBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(&m_stuff); /* Initialise statgrab */ #ifdef STATGRAB_NEWER_THAN_0_90 sg_init(0); #else sg_init(); #endif /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != 0) { perror("Error. Failed to drop privileges"); } m_font.setPointSizeF(8); settingsChanged(); } LXQtCpuLoad::~LXQtCpuLoad() { sg_shutdown(); } void LXQtCpuLoad::setSizes() { if (m_barOrientation == RightToLeftBar || m_barOrientation == LeftToRightBar) { m_stuff.setFixedHeight(m_barWidth); m_stuff.setMinimumWidth(24); } else { m_stuff.setFixedWidth(m_barWidth); m_stuff.setMinimumHeight(24); } } void LXQtCpuLoad::resizeEvent(QResizeEvent *) { setSizes(); update(); } double LXQtCpuLoad::getLoadCpu() const { #ifdef STATGRAB_NEWER_THAN_0_90 size_t count; sg_cpu_percents* cur = sg_get_cpu_percents(&count); #else sg_cpu_percents* cur = sg_get_cpu_percents(); #endif return (cur->user + cur->kernel + cur->nice); } void LXQtCpuLoad::timerEvent(QTimerEvent * /*event*/) { double avg = getLoadCpu(); if ( qAbs(m_avg-avg)>1 ) { m_avg = avg; setToolTip(tr("CPU load %1%").arg(m_avg)); update(); } } void LXQtCpuLoad::paintEvent ( QPaintEvent * ) { QPainter p(this); QPen pen; pen.setWidth(2); p.setPen(pen); p.setRenderHint(QPainter::Antialiasing, true); p.setFont(m_font); QRectF r = rect(); QRectF r1; QLinearGradient shade(0, 0, 1, 1); if (m_barOrientation == RightToLeftBar || m_barOrientation == LeftToRightBar) { float vo = (r.height() - static_cast(m_barWidth))/2.0; float ho = r.width()*(1-m_avg*0.01); if (m_barOrientation == RightToLeftBar) { r1.setRect(r.left()+ho, r.top()+vo, r.width()-ho, r.height()-2*vo ); } else // LeftToRightBar { r1.setRect(r.left(), r.top()+vo, r.width()-ho, r.height()-2*vo ); } shade.setFinalStop(0, r1.height()); } else // BottomUpBar || TopDownBar { float vo = r.height()*(1-m_avg*0.01); float ho = (r.width() - static_cast(m_barWidth) )/2.0; if (m_barOrientation == TopDownBar) { r1.setRect(r.left()+ho, r.top(), r.width()-2*ho, r.height()-vo ); } else // BottomUpBar { r1.setRect(r.left()+ho, r.top()+vo, r.width()-2*ho, r.height()-vo ); } shade.setFinalStop(r1.width(), 0); } shade.setSpread(QLinearGradient::ReflectSpread); shade.setColorAt(0, QColor(0, 196, 0, 128)); shade.setColorAt(0.5, QColor(0, 128, 0, 255) ); shade.setColorAt(1, QColor(0, 196, 0 , 128)); p.fillRect(r1, shade); if (m_showText) { p.setPen(fontColor); p.drawText(rect(), Qt::AlignCenter, QString::number(m_avg)); } } void LXQtCpuLoad::settingsChanged() { if (m_timerID != -1) killTimer(m_timerID); m_showText = mPlugin->settings()->value(QStringLiteral("showText"), false).toBool(); m_barWidth = mPlugin->settings()->value(QStringLiteral("barWidth"), 20).toInt(); m_updateInterval = mPlugin->settings()->value(QStringLiteral("updateInterval"), 1000).toInt(); QString barOrientation = mPlugin->settings()->value(QStringLiteral("barOrientation"), QStringLiteral(BAR_ORIENT_BOTTOMUP)).toString(); if (barOrientation == QLatin1String(BAR_ORIENT_RIGHTLEFT)) m_barOrientation = RightToLeftBar; else if (barOrientation == QLatin1String(BAR_ORIENT_LEFTRIGHT)) m_barOrientation = LeftToRightBar; else if (barOrientation == QLatin1String(BAR_ORIENT_TOPDOWN)) m_barOrientation = TopDownBar; else m_barOrientation = BottomUpBar; m_timerID = startTimer(m_updateInterval); setSizes(); update(); } ================================================ FILE: plugin-cpuload/lxqtcpuload.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTCPULOAD_H #define LXQTCPULOAD_H #include class ILXQtPanelPlugin; class LXQtCpuLoad: public QFrame { Q_OBJECT Q_PROPERTY(QColor fontColor READ getFontColor WRITE setFontColor) public: /** Describes orientation of cpu load bar **/ enum BarOrientation { BottomUpBar, //! Bar begins at bottom and grows up TopDownBar, //! Bar begins at top and grows down RightToLeftBar, //! Bar begins at right edge and grows to the left LeftToRightBar //! Bar begins at left edge and grows to the right }; LXQtCpuLoad(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~LXQtCpuLoad(); void settingsChanged(); void setFontColor(QColor value) { fontColor = value; } QColor getFontColor() const { return fontColor; } protected: void virtual timerEvent(QTimerEvent *event); void virtual paintEvent ( QPaintEvent * event ); void virtual resizeEvent(QResizeEvent *); private: double getLoadCpu() const; void setSizes(); ILXQtPanelPlugin *mPlugin; QWidget m_stuff; //! average load int m_avg; bool m_showText; int m_barWidth; BarOrientation m_barOrientation; int m_updateInterval; int m_timerID; QFont m_font; QColor fontColor; }; #endif // LXQTCPULOAD_H ================================================ FILE: plugin-cpuload/lxqtcpuloadconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtcpuloadconfiguration.h" #include "ui_lxqtcpuloadconfiguration.h" #define BAR_ORIENT_BOTTOMUP "bottomUp" #define BAR_ORIENT_TOPDOWN "topDown" #define BAR_ORIENT_LEFTRIGHT "leftRight" #define BAR_ORIENT_RIGHTLEFT "rightLeft" LXQtCpuLoadConfiguration::LXQtCpuLoadConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtCpuLoadConfiguration), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("CpuLoadConfigurationWindow")); ui->setupUi(this); fillBarOrientations(); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtCpuLoadConfiguration::dialogButtonsAction); loadSettings(); connect(ui->showTextCB, &QCheckBox::toggled, this, &LXQtCpuLoadConfiguration::showTextChanged); connect(ui->barWidthSB, &QSpinBox::valueChanged, this, &LXQtCpuLoadConfiguration::barWidthChanged); connect(ui->updateIntervalSpinBox, &QDoubleSpinBox::valueChanged, this, &LXQtCpuLoadConfiguration::updateIntervalChanged); connect(ui->barOrientationCOB, &QComboBox::currentIndexChanged, this, &LXQtCpuLoadConfiguration::barOrientationChanged); } LXQtCpuLoadConfiguration::~LXQtCpuLoadConfiguration() { delete ui; } void LXQtCpuLoadConfiguration::fillBarOrientations() { ui->barOrientationCOB->addItem(tr("Bottom up"), QStringLiteral(BAR_ORIENT_BOTTOMUP)); ui->barOrientationCOB->addItem(tr("Top down"), QStringLiteral(BAR_ORIENT_TOPDOWN)); ui->barOrientationCOB->addItem(tr("Left to right"), QStringLiteral(BAR_ORIENT_LEFTRIGHT)); ui->barOrientationCOB->addItem(tr("Right to left"), QStringLiteral(BAR_ORIENT_RIGHTLEFT)); } void LXQtCpuLoadConfiguration::loadSettings() { mLockSettingChanges = true; ui->showTextCB->setChecked(settings().value(QStringLiteral("showText"), false).toBool()); ui->barWidthSB->setValue(settings().value(QStringLiteral("barWidth"), 20).toInt()); ui->updateIntervalSpinBox->setValue(settings().value(QStringLiteral("updateInterval"), 1000).toInt() / 1000.0); int boIndex = ui->barOrientationCOB->findData( settings().value(QStringLiteral("barOrientation"), QStringLiteral(BAR_ORIENT_BOTTOMUP))); boIndex = (boIndex < 0) ? 1 : boIndex; ui->barOrientationCOB->setCurrentIndex(boIndex); // QString menuFile = settings().value("menu_file", "").toString(); // if (menuFile.isEmpty()) // { // menuFile = XdgMenu::getMenuFileName(); // } // ui->menuFilePathLE->setText(menuFile); // ui->shortcutEd->setKeySequence(settings().value("shortcut", "Alt+F1").toString()); mLockSettingChanges = false; } void LXQtCpuLoadConfiguration::showTextChanged(bool value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("showText"), value); } void LXQtCpuLoadConfiguration::barWidthChanged(int value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("barWidth"), value); } void LXQtCpuLoadConfiguration::updateIntervalChanged(double value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("updateInterval"), value*1000); } void LXQtCpuLoadConfiguration::barOrientationChanged(int index) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("barOrientation"), ui->barOrientationCOB->itemData(index).toString()); } ================================================ FILE: plugin-cpuload/lxqtcpuloadconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTCPULOADCONFIGURATION_H #define LXQTCPULOADCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" class QSettings; class QAbstractButton; namespace Ui { class LXQtCpuLoadConfiguration; } class LXQtCpuLoadConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtCpuLoadConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtCpuLoadConfiguration(); private: Ui::LXQtCpuLoadConfiguration *ui; bool mLockSettingChanges; /* Fills Bar orientation combobox */ void fillBarOrientations(); private slots: /* Saves settings in conf file. */ void loadSettings(); void showTextChanged(bool value); void barWidthChanged(int value); void updateIntervalChanged(double value); void barOrientationChanged(int index); }; #endif // LXQTCPULOADCONFIGURATION_H ================================================ FILE: plugin-cpuload/lxqtcpuloadconfiguration.ui ================================================ LXQtCpuLoadConfiguration 0 0 285 191 CPU Load Settings General Show text Update interval: sec 1 0.500000000000000 10000.000000000000000 0.500000000000000 1.000000000000000 Bar orientation: Bar width: 4 2048 20 Qt::Vertical 20 41 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset ================================================ FILE: plugin-cpuload/lxqtcpuloadplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtcpuloadplugin.h" #include "lxqtcpuload.h" #include "lxqtcpuloadconfiguration.h" #include LXQtCpuLoadPlugin::LXQtCpuLoadPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo) { mWidget = new QWidget(); mContent = new LXQtCpuLoad(this, mWidget); QVBoxLayout *layout = new QVBoxLayout(mWidget); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(mContent); layout->setStretchFactor(mContent, 1); } LXQtCpuLoadPlugin::~LXQtCpuLoadPlugin() { delete mWidget; } QWidget *LXQtCpuLoadPlugin::widget() { return mWidget; } QDialog *LXQtCpuLoadPlugin::configureDialog() { return new LXQtCpuLoadConfiguration(settings()); } void LXQtCpuLoadPlugin::settingsChanged() { mContent->settingsChanged(); } ================================================ FILE: plugin-cpuload/lxqtcpuloadplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTCPULOADPLUGIN_H #define LXQTCPULOADPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include class LXQtCpuLoad; class LXQtCpuLoadPlugin: public QObject, public ILXQtPanelPlugin { Q_OBJECT public: explicit LXQtCpuLoadPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtCpuLoadPlugin(); virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("CpuLoad"); } bool isSeparate() const { return true; } QDialog *configureDialog(); protected: virtual void settingsChanged(); private: QWidget *mWidget; LXQtCpuLoad *mContent; }; class LXQtCpuLoadPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtCpuLoadPlugin(startupInfo); } }; #endif // LXQTCPULOADPLUGIN_H ================================================ FILE: plugin-cpuload/resources/cpuload.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=cpu #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-cpuload/translations/cpuload.desktop.yaml ================================================ Desktop Entry/Name: "CPU Monitor" Desktop Entry/Comment: "Displays the current CPU load" ================================================ FILE: plugin-cpuload/translations/cpuload.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General Show text Update interval: sec Bar orientation: Bar width: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_ar.desktop.yaml ================================================ Desktop Entry/Name: "مرقاب المعالج" Desktop Entry/Comment: "تعرض حمل المعالج الحاليّ" ================================================ FILE: plugin-cpuload/translations/cpuload_ar.ts ================================================ LXQtCpuLoad CPU load %1% الحمل على المعالج %1% LXQtCpuLoadConfiguration CPU Load Settings إعدادات الحمل على المعالج General عام Show text اعرض النص Update interval: فترة التحديث: sec ثا Bar orientation: اتجاه الشريط: Bar width: عرض الشريط: Bottom up أسفل لأعلى Top down أعلى لأسفل Left to right يسار إلى يمين Right to left يمين إلى يسار ================================================ FILE: plugin-cpuload/translations/cpuload_arn.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General Show text Update interval: sec Bar orientation: Bar width: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_ast.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General Xenerales Show text Amosar testu Update interval: Intervalu d’anovamientu: sec s Bar orientation: Bar width: Anchor de la barra: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_bg.desktop.yaml ================================================ Desktop Entry/Name: "CPU Монитор" Desktop Entry/Comment: "Показва натоварването на CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_bg.ts ================================================ LXQtCpuLoad CPU load %1% CPU натоварване %1% LXQtCpuLoadConfiguration CPU Load Settings Настройки на CPU монитор General Общи Show text Показване на текст Update interval: Интервал на опресняване: sec s Bar orientation: Ориентация на индикатора: Bar width: Широчина на индикатора: Bottom up Отдолу нагоре Top down Отгоре надолу Left to right Отляво надясно Right to left Отдясно наляво ================================================ FILE: plugin-cpuload/translations/cpuload_ca.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de CPU" Desktop Entry/Comment: "Mostra la càrrega actual de la CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_ca.ts ================================================ LXQtCpuLoad CPU load %1% %1% de càrrega de la CPU LXQtCpuLoadConfiguration CPU Load Settings Ajusts de la càrrega de la CPU General General Show text Mostra el text Update interval: Interval d'actualització: sec s Bar orientation: Orientació de la barra: Bar width: Amplada de la barra: Bottom up De baix a dalt Top down De dalt a baix Left to right De dreta a esquerra Right to left D'esquerra a dreta ================================================ FILE: plugin-cpuload/translations/cpuload_cs.desktop.yaml ================================================ Desktop Entry/Name: "Vytížení procesoru" Desktop Entry/Comment: "Zobrazuje momentální vytížení procesoru" ================================================ FILE: plugin-cpuload/translations/cpuload_cs.ts ================================================ LXQtCpuLoad CPU load %1% Vytížení procesoru %1% LXQtCpuLoadConfiguration CPU Load Settings Nastavení zobrazování vytížení procesoru General Obecné Show text Zobrazovat text Update interval: Interval aktualizace stavu: sec s Bar orientation: Směr pruhu ukazatele: Bar width: Šířka pruhu: Bottom up Zdola nahoru Top down Shora dolů Left to right Zleva doprava Right to left Zprava doleva ================================================ FILE: plugin-cpuload/translations/cpuload_cy.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General Show text Update interval: sec Bar orientation: Bar width: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_da.desktop.yaml ================================================ Desktop Entry/Name: "CPU-overvågning" Desktop Entry/Comment: "Viser det aktuelle CPU-forbrug" ================================================ FILE: plugin-cpuload/translations/cpuload_da.ts ================================================ LXQtCpuLoad CPU load %1% CPU-belastning %1% LXQtCpuLoadConfiguration CPU Load Settings CPU belastningsindstillinger General Generelt Show text Vis tekst Update interval: Opdateringsinterval: sec sek. Bar orientation: Bjælkens orientering: Bar width: Bjælkens bredde: Bottom up Nedefra Top down Oppefra Left to right Venstre mod højre Right to left Højre mod venstre ================================================ FILE: plugin-cpuload/translations/cpuload_de.desktop.yaml ================================================ Desktop Entry/Name: "Prozessorauslastung" Desktop Entry/Comment: "Prozessorlast-Monitor" ================================================ FILE: plugin-cpuload/translations/cpuload_de.ts ================================================ LXQtCpuLoad CPU load %1% CPU-Auslastung %1% LXQtCpuLoadConfiguration CPU Load Settings Einstellungen zur CPU-Auslastung General Allgemein Show text Text anzeigen Update interval: Aktualisierungsintervall: sec s Bar orientation: Balkenausrichtung: Bar width: Balkenbreite: Bottom up von unten nach oben Top down von oben nach unten Left to right von links nach rechts Right to left von rechts nach links ================================================ FILE: plugin-cpuload/translations/cpuload_el.desktop.yaml ================================================ Desktop Entry/Name: "Επόπτης του επεξεργαστή" Desktop Entry/Comment: "Εμφανίζει το φορτίο του επεξεργαστή" ================================================ FILE: plugin-cpuload/translations/cpuload_el.ts ================================================ LXQtCpuLoad CPU load %1% Φόρτος επεξεργαστή %1% LXQtCpuLoadConfiguration CPU Load Settings Ρυθμίσεις του φόρτου του επεξεργαστή General Γενικά Show text Εμφάνιση κειμένου Update interval: Διάστημα ενημέρωσης: sec δευτ Bar orientation: Προσανατολισμός ράβδου: Bar width: Πλάτος ράβδου: Bottom up Κάτω προς τα πάνω Top down Πάνω προς τα κάτω Left to right Αριστερά προς δεξιά Right to left Δεξιά προς αριστερά ================================================ FILE: plugin-cpuload/translations/cpuload_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "CPU Monitor" Desktop Entry/Comment: "Displays the current CPU load" ================================================ FILE: plugin-cpuload/translations/cpuload_en_GB.ts ================================================ LXQtCpuLoad CPU load %1% CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings CPU Load Settings General General Show text Show text Update interval: Update interval: sec sec Bar orientation: Bar orientation: Bar width: Bar width: Bottom up Bottom up Top down Top down Left to right Left to right Right to left Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_eo.desktop.yaml ================================================ Desktop Entry/Name: "CPU-ŝarĝo" Desktop Entry/Comment: "Monitorado de CPU-ŝarĝo" ================================================ FILE: plugin-cpuload/translations/cpuload_eo.ts ================================================ LXQtCpuLoad CPU load %1% CPU-ŝarĝo %1% LXQtCpuLoadConfiguration CPU Load Settings CPU-Ŝarĝo-Agordoj General Ĝenerala Show text Montri tekston Update interval: sec Bar orientation: Bar width: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_es.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de CPU" Desktop Entry/Comment: "Muestra la carga actual de la CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_es.ts ================================================ LXQtCpuLoad CPU load %1% Carga de la CPU %1% LXQtCpuLoadConfiguration CPU Load Settings Configuración de la carga de CPU General General Show text Mostrar texto Update interval: Intervalo de actualización: sec s Bar orientation: Orientación de la barra: Bar width: Ancho de la barra: Bottom up De abajo hacia arriba Top down De arriba hacia abajo Left to right De izquierda a derecha Right to left De derecha a izquierda ================================================ FILE: plugin-cpuload/translations/cpuload_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Carga del CPU" Desktop Entry/Comment: "Monitor de carga del CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_es_VE.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General General Show text Mostrar etiqueta Update interval: Intervalo actualizacion sec seg Bar orientation: Orientacion barra Bar width: Bottom up Abajo a Arriba Top down Arriba a abajo Left to right Izquierda a derecha Right to left Derecha a izquierda ================================================ FILE: plugin-cpuload/translations/cpuload_et.desktop.yaml ================================================ Desktop Entry/Name: "Protsessori koormus" Desktop Entry/Comment: "Jälgi protsessori koormust" ================================================ FILE: plugin-cpuload/translations/cpuload_et.ts ================================================ LXQtCpuLoad CPU load %1% Protsessori koormus %1% LXQtCpuLoadConfiguration CPU Load Settings Protsessori koormusenäitaja seadistused General Põhiseadistused Show text Näita infoteksti Update interval: Uuendamise välp: sec sek Bar orientation: Infograafiku paigutus: Bar width: Infograafiku laius: Bottom up Alt üles Top down Ülevalt alla Left to right Vasakult paremale Right to left Paremalt vasakule ================================================ FILE: plugin-cpuload/translations/cpuload_eu.desktop.yaml ================================================ Desktop Entry/Name: "PUZaren monitorea" Desktop Entry/Comment: "PUZaren uneko karga bistaratzen du" ================================================ FILE: plugin-cpuload/translations/cpuload_eu.ts ================================================ LXQtCpuLoad CPU load %1% CPU karga %1% LXQtCpuLoadConfiguration CPU Load Settings CPUaren kargaren ezarpenak General Orokorra Show text Erakutsi testua Update interval: Eguneratze-tartea: sec seg Bar orientation: Barraren orientazioa: Bar width: Barraren zabalera: Bottom up Behetik gora Top down Goitik behera Left to right Ezkerretik eskuinera Right to left Eskuinetik ezkerrera ================================================ FILE: plugin-cpuload/translations/cpuload_fi.desktop.yaml ================================================ Desktop Entry/Name: "Suorittimen kuormitus" Desktop Entry/Comment: "Suorittimen kuormituksen seuranta" ================================================ FILE: plugin-cpuload/translations/cpuload_fi.ts ================================================ LXQtCpuLoad CPU load %1% CPU-kuorma %1% LXQtCpuLoadConfiguration CPU Load Settings CPU-mittarin asetukset General Perusasetukset Show text Näytä teksti Update interval: Päivitysväli: sec s Bar orientation: Palkin suunta: Bar width: Palkin koko: Bottom up Alhaalta ylös Top down Ylhäältä alas Left to right Vasemmalta oikealle Right to left Oikealta vasemmalle ================================================ FILE: plugin-cpuload/translations/cpuload_fr.desktop.yaml ================================================ Desktop Entry/Name: "Charge du processeur" Desktop Entry/Comment: "Affichage de la charge du processeur" ================================================ FILE: plugin-cpuload/translations/cpuload_fr.ts ================================================ LXQtCpuLoad CPU load %1% Charge du CPU %1% LXQtCpuLoadConfiguration CPU Load Settings Paramétrage de 'Charge du processeur' General Général Show text Afficher le texte Update interval: Intervalle de mise à jour : sec sec Bar orientation: Orientation de la barre : Bar width: Largeur de la barre : Bottom up De bas en haut Top down De haut en bas Left to right De gauche à droite Right to left De droite à gauche ================================================ FILE: plugin-cpuload/translations/cpuload_gl.ts ================================================ LXQtCpuLoad CPU load %1% Carga da CPU %1% LXQtCpuLoadConfiguration CPU Load Settings Axustes da carga da CPU General Xeral Show text Amosar o texto Update interval: Intervalo de actualización: sec seg Bar orientation: Orientación da barra: Bar width: Largura da barra: Bottom up De abaixo cara a arriba Top down De arriba cara a abaixo Left to right Da esquerda cara á dereita Right to left Da dereita cara á esquerda ================================================ FILE: plugin-cpuload/translations/cpuload_he.desktop.yaml ================================================ Desktop Entry/Name: "צג מעבד" Desktop Entry/Comment: "מציג את העומס הנוכחי על המעבד" ================================================ FILE: plugin-cpuload/translations/cpuload_he.ts ================================================ LXQtCpuLoad CPU load %1% עומס על המעבד %1% LXQtCpuLoadConfiguration CPU Load Settings הגדרות עומס מעבד General כללי Show text הצגת טקסט Update interval: הפרש בין עדכונים: sec שניות Bar orientation: כיוון סרגל: Bar width: רוחב סרגל: Bottom up מלמטה למעלה Top down מלמעלה למטה Left to right שמאל לימין Right to left ימין לשמאל ================================================ FILE: plugin-cpuload/translations/cpuload_hr.desktop.yaml ================================================ Desktop Entry/Name: "Praćenje procesora" Desktop Entry/Comment: "Prikazuje trenutačno opterećenje procesora" ================================================ FILE: plugin-cpuload/translations/cpuload_hr.ts ================================================ LXQtCpuLoad CPU load %1% Opterećenje procesora %1 % LXQtCpuLoadConfiguration CPU Load Settings Opterećenje procesora – Postavke General Opće Show text Prikaži tekst Update interval: Interval aktualiziranja: sec s Bar orientation: Smjer trake: Bar width: Širina trake: Bottom up Odozdo prema gore Top down Odozgo prema dolje Left to right S lijeva na desno Right to left S desna na lijevo ================================================ FILE: plugin-cpuload/translations/cpuload_hu.desktop.yaml ================================================ Desktop Entry/Name: "CPU-figyelő" Desktop Entry/Comment: "Megjeleníti a processzorterhelést" ================================================ FILE: plugin-cpuload/translations/cpuload_hu.ts ================================================ LXQtCpuLoad CPU load %1% CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings CPU-figyelő beállítások General Általános Show text Szöveg megjelenítése Update interval: Frissítési időköz: sec mp Bar orientation: Sáv iránya: Bar width: Sáv szélessége: Bottom up Lentről fel Top down Fentről le Left to right Balról jobbra Right to left Jobbról balra ================================================ FILE: plugin-cpuload/translations/cpuload_id.ts ================================================ LXQtCpuLoad CPU load %1% Beban CPU %1% LXQtCpuLoadConfiguration CPU Load Settings Pengaturan Beban CPU General Umum Show text Tampilkan teks Update interval: Interval pembaruan: sec dtk Bar orientation: Orientasi batang: Bar width: Panjang batang: Bottom up Bawah ke atas Top down Atas ke bawah Left to right Kiri ke kanan Right to left Kanan ke kiri ================================================ FILE: plugin-cpuload/translations/cpuload_it.desktop.yaml ================================================ Desktop Entry/Name: "Carico del processore" Desktop Entry/Comment: "Monitor del carico del processore" ================================================ FILE: plugin-cpuload/translations/cpuload_it.ts ================================================ LXQtCpuLoad CPU load %1% Carico del processore %1% LXQtCpuLoadConfiguration CPU Load Settings Impostazioni del carico del processore General Generale Show text Mostra testo Update interval: Intervallo di aggiornamento: sec sec Bar orientation: Orientamento della barra: Bar width: Larghezza barra: Bottom up Dal basso all'alto Top down Dall'alto al basso Left to right Da sinistra a destra Right to left Da destra a sinistra ================================================ FILE: plugin-cpuload/translations/cpuload_ja.desktop.yaml ================================================ Desktop Entry/Name: "CPU モニター" Desktop Entry/Comment: "現在の CPU の負荷を表示します" ================================================ FILE: plugin-cpuload/translations/cpuload_ja.ts ================================================ LXQtCpuLoad CPU load %1% CPU 負荷 %1% LXQtCpuLoadConfiguration CPU Load Settings CPU モニターの設定 General 全般 Show text テキストを表示する Update interval: 更新間隔: sec Bar orientation: バーの向き: Bar width: バーの幅: Bottom up 下から上へ Top down 上から下へ Left to right 左から右へ Right to left 右から左へ ================================================ FILE: plugin-cpuload/translations/cpuload_ka.desktop.yaml ================================================ Desktop Entry/Name: "CPU-ი მონიტორინგი" Desktop Entry/Comment: "აჩვენებს CPU-ის მიმდინარე დატვირთვას" ================================================ FILE: plugin-cpuload/translations/cpuload_ka.ts ================================================ LXQtCpuLoad CPU load %1% პროცესორის დატვირთვა %1% LXQtCpuLoadConfiguration CPU Load Settings პროცესორის დატვირთვის მორგება General ზოგადი Show text ტექსტის ჩვენება Update interval: განახლების ინტერვალი: sec წმ Bar orientation: პანელის ორიენტაცია: Bar width: პანელის სიგანე: Bottom up დაბლიდან მაღლა Top down მაღლიდან დაბლა Left to right მარცხნიდან მარჯვნივ Right to left მარჯვნიდან მარცხნივ ================================================ FILE: plugin-cpuload/translations/cpuload_kab.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-cpuload/translations/cpuload_kk.desktop.yaml ================================================ Desktop Entry/Name: "Процессор жүктемесінің бақылаушысы" Desktop Entry/Comment: "Процессордың ағымдағы жүктемесін көрсетеді" ================================================ FILE: plugin-cpuload/translations/cpuload_kk.ts ================================================ LXQtCpuLoad CPU load %1% Процессор жүктемесі %1% LXQtCpuLoadConfiguration CPU Load Settings Процессор жүктемесінің баптаулары General Жалпы Show text Мәтінді көрсету Update interval: Жаңарту интервалы: sec сек Bar orientation: Жолақ бағыты: Bar width: Жолақ ені: Bottom up Төменнен жоғары Top down Жоғарыдан төмен Left to right Солдан оңға Right to left Оңнан солға ================================================ FILE: plugin-cpuload/translations/cpuload_ko.desktop.yaml ================================================ Desktop Entry/Name: "CPU 모니터" Desktop Entry/Comment: "현재 CPU 부하를 표시합니다" ================================================ FILE: plugin-cpuload/translations/cpuload_ko.ts ================================================ LXQtCpuLoad CPU load %1% CPU 부하 %1% LXQtCpuLoadConfiguration CPU Load Settings CPU 부하 설정 General 일반 Show text 텍스트 표시 Update interval: 업데이트 간격: sec Bar orientation: 막대 방향: Bar width: 막대 폭: Bottom up 상향식 Top down 하향식 Left to right 왼쪽에서 오른쪽으로 Right to left 오른쪽에서 왼쪽으로 ================================================ FILE: plugin-cpuload/translations/cpuload_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ekirabiriza ekitundu ekibazi" Desktop Entry/Comment: "Kano kakulaga okukuluusana kw'ekitundu ekibazi" ================================================ FILE: plugin-cpuload/translations/cpuload_lg.ts ================================================ LXQtCpuLoad CPU load %1% Obusobozi obukozesewa %1% LXQtCpuLoadConfiguration CPU Load Settings Enteekateeka z'ekirabiriza ekitundu ekibazi General Eby'awamu Show text Okukuluusana kulage mu buwandike Update interval: Kiddengamu okukebera okukuluusana buli: sec sikonda Bar orientation: Olukoloboze olulaga okukuluusana gye luviira: Bar width: Bugazi bw'olukoloboze olulaga okukuluusana: Bottom up Wansi Top down Waggulu Left to right Ku kkono Right to left Ku ddyo ================================================ FILE: plugin-cpuload/translations/cpuload_lt.desktop.yaml ================================================ Desktop Entry/Name: "Procesoriaus apkrova" Desktop Entry/Comment: "Procesoriaus stebėtojas" ================================================ FILE: plugin-cpuload/translations/cpuload_lt.ts ================================================ LXQtCpuLoad CPU load %1% Procesoriaus apkrova %1% LXQtCpuLoadConfiguration CPU Load Settings Procesoriaus apkrovos nustatymai General Bendra Show text Rodyti tekstą Update interval: Atnaujinimo intervalas: sec sek Bar orientation: Juostos orientacija: Bar width: Juostos plotis: Bottom up Iš apačios į viršų Top down Iš viršaus į apačią Left to right Iš kairės į dešinę Right to left Iš dešinės į kairę ================================================ FILE: plugin-cpuload/translations/cpuload_lv.desktop.yaml ================================================ Desktop Entry/Name: "Procesora vērotājs" Desktop Entry/Comment: "Parāda tekošo CPU noslodzi" ================================================ FILE: plugin-cpuload/translations/cpuload_lv.ts ================================================ LXQtCpuLoad CPU load %1% CPU noslodze %1% LXQtCpuLoadConfiguration CPU Load Settings CPU slodzes iestatījumi General Vispārīgie Show text Rādīt tekstu Update interval: Aktualizācijas intervāls: sec sek Bar orientation: Skalas orientācija: Bar width: Skalas platums: Bottom up Ar augšu uz leju Top down No augšas uz leju Left to right No kreisās uz labo pusi Right to left No labās uz kreiso pusi ================================================ FILE: plugin-cpuload/translations/cpuload_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Prosessorovervåkning" Desktop Entry/Comment: "Viser nåværende CPU-last" ================================================ FILE: plugin-cpuload/translations/cpuload_nb_NO.ts ================================================ LXQtCpuLoad CPU load %1% Prosessorlast %1% LXQtCpuLoadConfiguration CPU Load Settings Prosessorlastinnstillinger General Generelt Show text Vis tekst Update interval: Oppdateringsintervall: sec sek Bar orientation: Orientering av indikatoren: Bar width: Indikatorens bredde: Bottom up Nedenfra Top down Ovenfra Left to right Fra venstre til høyre Right to left Fra høyre til venstre ================================================ FILE: plugin-cpuload/translations/cpuload_nl.desktop.yaml ================================================ Desktop Entry/Name: "Processormonitor" Desktop Entry/Comment: "Toont de huidige processorbelasting" ================================================ FILE: plugin-cpuload/translations/cpuload_nl.ts ================================================ LXQtCpuLoad CPU load %1% Processorbelasting %1% LXQtCpuLoadConfiguration CPU Load Settings Instellingen voor processorbelasting General Algemeen Show text Tekst tonen Update interval: Bijwerkinterval: sec sec Bar orientation: Balkrichting: Bar width: Balkbreedte: Bottom up Van onder naar boven Top down Van boven naar onder Left to right Van links naar rechts Right to left Van rechts naar links ================================================ FILE: plugin-cpuload/translations/cpuload_oc.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de CPU" Desktop Entry/Comment: "Afichatge de la carga del processor" ================================================ FILE: plugin-cpuload/translations/cpuload_oc.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General General Show text Afichar lo tèxt Update interval: Interval de mesa a jorn : sec seg. Bar orientation: Orientacion de la barra : Bar width: Largor de la barra : Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_pa.desktop.yaml ================================================ Desktop Entry/Name: "CPU ਮਾਨੀਟਰ" Desktop Entry/Comment: "ਮੌਜੂਦਾ CPU ਲੋਡ ਨੂੰ ਦਿਖਾਉਂਦਾ ਹੈ" ================================================ FILE: plugin-cpuload/translations/cpuload_pa.ts ================================================ LXQtCpuLoad CPU load %1% CPU ਲੋਡ %1% LXQtCpuLoadConfiguration CPU Load Settings CPU ਲੋਡ ਸੈਟਿੰਗਾਂ General ਆਮ Show text ਲਿਖਤ ਵੇਖਾਓ Update interval: ਅੱਪਡੇਟ ਕਰਨ ਦਾ ਅੰਤਰਾਲ: sec ਸਕਿੰਟ Bar orientation: ਪੱਟੀ ਦੀ ਸਥਿਤੀ: Bar width: ਪੱਟੀ ਦੀ ਚੌੜਾਈ: Bottom up ਹੇਠਾਂ ਤੋਂ ਉੱਤੇ Top down ਉੱਤੇ ਤੋਂ ਹੇਠਾਂ Left to right ਖੱਬੇ ਤੋਂ ਸੱਜੇ Right to left ਸੱਜੇ ਤੋਂ ਖੱਬੇ ================================================ FILE: plugin-cpuload/translations/cpuload_pl.desktop.yaml ================================================ Desktop Entry/Name: "Obciążenie CPU" Desktop Entry/Comment: "Wyświetla obecne obciążenie CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_pl.ts ================================================ LXQtCpuLoad CPU load %1% Obciążenie procesora %1% LXQtCpuLoadConfiguration CPU Load Settings Ustawienia obciążenia procesora General Ogólne Show text Pokaż tekst Update interval: Odświeżanie widoku: sec sek Bar orientation: Położenie paska stanu: Bar width: Szerokość paska: Bottom up Z dołu do góry Top down Z góry na dół Left to right Lewo na prawo Right to left Prawo na lewo ================================================ FILE: plugin-cpuload/translations/cpuload_pt.desktop.yaml ================================================ Desktop Entry/Name: "Carga do CPU" Desktop Entry/Comment: "Monitor de carga do CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_pt.ts ================================================ LXQtCpuLoad CPU load %1% Carga do CPU %1% LXQtCpuLoadConfiguration CPU Load Settings Definições General Geral Show text Mostrar texto Update interval: Intervalo de atualização: sec seg Bar orientation: Orientação da barra: Bar width: Largura da barra: Bottom up Baixo para cima Top down Cima para baixo Left to right Esquerda para direita Right to left Direita para esquerda ================================================ FILE: plugin-cpuload/translations/cpuload_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Carga da CPU" Desktop Entry/Comment: "Monitor de carga da CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_pt_BR.ts ================================================ LXQtCpuLoad CPU load %1% Carga do processador %1% LXQtCpuLoadConfiguration CPU Load Settings Configurações da carga do processador General Geral Show text Exibir texto Update interval: Intervalo de atualização: sec seg Bar orientation: Orientação da barra: Bar width: Largura da barra: Bottom up De baixo para cima Top down De cima para baixo Left to right Da esquerda para a direita Right to left Da direita para a esquerda ================================================ FILE: plugin-cpuload/translations/cpuload_ro.desktop.yaml ================================================ Desktop Entry/Name: "Afișează gradul de încărcare al procesorului" Desktop Entry/Comment: "Monitor de încărcare a procesorului" ================================================ FILE: plugin-cpuload/translations/cpuload_ro_RO.ts ================================================ LXQtCpuLoad CPU load %1% Încărcare procesor LXQtCpuLoadConfiguration CPU Load Settings Setări încărcare procesor General General Show text Afișează text Update interval: Interval de actualizare sec sec Bar orientation: Orientare bară: Bar width: Lățime bară: Bottom up De jos în sus Top down De sus în jos Left to right De la stânga la dreapta Right to left De la dreapta la stânga ================================================ FILE: plugin-cpuload/translations/cpuload_ru.desktop.yaml ================================================ Desktop Entry/Name: "Монитор загрузки процессора" Desktop Entry/Comment: "Отображает текущую загрузку процессора" ================================================ FILE: plugin-cpuload/translations/cpuload_ru.ts ================================================ LXQtCpuLoad CPU load %1% Загрузка процессора %1% LXQtCpuLoadConfiguration CPU Load Settings Настройки загрузки процессора General Общие Show text Показать текст Update interval: Период обновления: sec сек Bar orientation: Ориентация шкалы: Bar width: Ширина шкалы: Bottom up Снизу вверх Top down Сверху вниз Left to right Слева направо Right to left Справа налево ================================================ FILE: plugin-cpuload/translations/cpuload_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-cpuload/translations/cpuload_si.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General Show text Update interval: sec Bar orientation: Bar width: Bottom up Top down Left to right Right to left ================================================ FILE: plugin-cpuload/translations/cpuload_sk.desktop.yaml ================================================ Desktop Entry/Name: "Vyťaženie procesora" Desktop Entry/Comment: "Zobrazuje aktuálne vyťaženie procesora" ================================================ FILE: plugin-cpuload/translations/cpuload_sk_SK.ts ================================================ LXQtCpuLoad CPU load %1% Zaťaženie procesora %1% LXQtCpuLoadConfiguration CPU Load Settings Nastavenie zaťaženia procesora General Všeobecné Show text Zobraziť text Update interval: Interval obnovení: sec sek Bar orientation: Smer panela: Bar width: Šírka panela: Bottom up Zdola hore Top down Zhora dole Left to right Zľava doprava Right to left Z prava doľava ================================================ FILE: plugin-cpuload/translations/cpuload_sl.desktop.yaml ================================================ Desktop Entry/Name: "Obremenitev CPE" Desktop Entry/Comment: "Nadzornik obremenitve CPE" ================================================ FILE: plugin-cpuload/translations/cpuload_sl.ts ================================================ LXQtCpuLoad CPU load %1% Obremenitev CPE %1% LXQtCpuLoadConfiguration CPU Load Settings Nastavitve CPU-gradnika General Splošno Show text Prikaži porabo v odstotkih Update interval: Hitrost osveževanja: sec s Bar orientation: Usmerjenost vrstice: Bar width: Širina vrstice: Bottom up Od spodaj navzgor Top down Od zgoraj navzdol Left to right Iz leve proti desni Right to left Iz desne proti levi ================================================ FILE: plugin-cpuload/translations/cpuload_sr.desktop.yaml ================================================ Desktop Entry/Name: "CPU монитор" Desktop Entry/Comment: "Прикажи тренутно оптерећење процесора" ================================================ FILE: plugin-cpuload/translations/cpuload_sr.ts ================================================ LXQtCpuLoad CPU load %1% Оптерећење процесора %1% LXQtCpuLoadConfiguration CPU Load Settings Поставке оптерећења процесора General Уопштено Show text Прикажи текст Update interval: Ажурирај интервал: sec sec Bar orientation: Орентација бара: Bar width: Ширина бара: Bottom up Одоздо према горе Top down Одозго према доле Left to right Са лева на десно Right to left Са десна на лево ================================================ FILE: plugin-cpuload/translations/cpuload_sv.desktop.yaml ================================================ Desktop Entry/Name: "CPU-övervakare" Desktop Entry/Comment: "Visar aktuell belastning på processorn" ================================================ FILE: plugin-cpuload/translations/cpuload_sv.ts ================================================ LXQtCpuLoad CPU load %1% CPU-belastning% 1% LXQtCpuLoadConfiguration CPU Load Settings Inställningar för CPU-belastning General Allmänt Show text Visa text Update interval: Uppdateringsintervall: sec sek Bar orientation: Stapelns orientering: Bar width: Stapelbredd: Bottom up Botten upp Top down Toppen ned Left to right Vänster till höger Right to left Höger till vänster ================================================ FILE: plugin-cpuload/translations/cpuload_th.desktop.yaml ================================================ Desktop Entry/Name: "การทำงานซีพียู" Desktop Entry/Comment: "เฝ้าสังเกตการทำงานซีพียู" ================================================ FILE: plugin-cpuload/translations/cpuload_th_TH.ts ================================================ LXQtCpuLoad CPU load %1% LXQtCpuLoadConfiguration CPU Load Settings General ทั่วไป Show text แสดงข้อความ Update interval: ทิ้งระยะการปรับข้อมูล: sec วิ Bar orientation: การจัดเรียง: Bar width: Bottom up ล่างขึ้นบน Top down บนลงล่าง Left to right ซ้ายไปขวา Right to left ขวาไปซ้าย ================================================ FILE: plugin-cpuload/translations/cpuload_tr.desktop.yaml ================================================ Desktop Entry/Name: "İşlemci Yükü" Desktop Entry/Comment: "İşlemci Yükü izleyici" ================================================ FILE: plugin-cpuload/translations/cpuload_tr.ts ================================================ LXQtCpuLoad CPU load %1% İşlemci yükü %1% LXQtCpuLoadConfiguration CPU Load Settings İşlemci Yükü Ayarları General Genel Show text Metni göster Update interval: Güncelleme aralığı: sec sn Bar orientation: Çubuk yönelimi: Bar width: Çubuk genişliği: Bottom up Aşağıdan yukarı Top down Yukarıdan aşağı Left to right Soldan sağa Right to left Sağdan sola ================================================ FILE: plugin-cpuload/translations/cpuload_uk.desktop.yaml ================================================ Desktop Entry/Name: "Монітор ЦП" Desktop Entry/Comment: "Показує поточне навантаження CPU" ================================================ FILE: plugin-cpuload/translations/cpuload_uk.ts ================================================ LXQtCpuLoad CPU load %1% Завантаження Cpu %1% LXQtCpuLoadConfiguration CPU Load Settings Налаштування завантаження ЦП General Загальне Show text Показувати текст Update interval: Період поновлення: sec сек Bar orientation: Орієнтація панелі: Bar width: Ширина панелі: Bottom up Знизу вверх Top down Зверху вниз Left to right Зліва направо Right to left Зправа наліво ================================================ FILE: plugin-cpuload/translations/cpuload_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "CPU 负载" Desktop Entry/Comment: "CPU 负载监视器" ================================================ FILE: plugin-cpuload/translations/cpuload_zh_CN.ts ================================================ LXQtCpuLoad CPU load %1% CPU 负载 %1% LXQtCpuLoadConfiguration CPU Load Settings CPU 负载设置 General 常规 Show text 显示文本 Update interval: 更新间隔: sec Bar orientation: 状态栏方向: Bar width: 状态栏宽度: Bottom up 自下而上 Top down 自上而下 Left to right 从左到右 Right to left 从右到左 ================================================ FILE: plugin-cpuload/translations/cpuload_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "CPU 監視" Desktop Entry/Comment: "顯示目前 CPU 負載" ================================================ FILE: plugin-cpuload/translations/cpuload_zh_TW.ts ================================================ LXQtCpuLoad CPU load %1% CPU 負載 %1% LXQtCpuLoadConfiguration CPU Load Settings CPU 負載設定 General 通則 Show text 顯示文字 Update interval: 更新間隔: sec Bar orientation: 進度條方向: Bar width: 進度條寬度: Bottom up 由下至上 Top down 由上至下 Left to right 由左至右 Right to left 由右至左 ================================================ FILE: plugin-customcommand/CMakeLists.txt ================================================ set(PLUGIN "customcommand") set(HEADERS lxqtcustomcommand.h custombutton.h lxqtcustomcommandconfiguration.h colorLabel.h ) set(SOURCES ${PROJECT_SOURCE_DIR}/panel/lxqtpanelpluginconfigdialog.cpp lxqtcustomcommand.cpp custombutton.cpp lxqtcustomcommandconfiguration.cpp colorLabel.cpp ) set(UIS lxqtcustomcommandconfiguration.ui ) set(LIBRARIES Qt6Xdg ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-customcommand/colorLabel.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt-project.org/ * * Copyright: 2025 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "colorLabel.h" #include #include #include ColorLabel::ColorLabel(QWidget* parent, Qt::WindowFlags f) : QLabel(parent, f) { setFrameStyle(QFrame::Panel | QFrame::Sunken); setLineWidth(1); setToolTip(tr("Click to change color")); } ColorLabel::~ColorLabel() {} void ColorLabel::setColor(const QColor& color, bool announceChange) { if (!color.isValid() || color == color_) return; color_ = color; color_.setAlpha(255); // ignore translucency update(); if (announceChange) emit colorChanged(); } QColor ColorLabel::getColor() const { return color_; } void ColorLabel::reset() { color_ = QColor(); update(); } void ColorLabel::mousePressEvent(QMouseEvent* /*event*/) { QColor color = QColorDialog::getColor(color_, window(), tr("Select Color")); setColor(color, true); } void ColorLabel::paintEvent(QPaintEvent* /*event*/) { QPainter p(this); if (color_.isValid()) p.fillRect(contentsRect(), color_); QStyleOptionFrame opt; initStyleOption(&opt); style()->drawControl(QStyle::CE_ShapedFrame, &opt, &p, this); } ================================================ FILE: plugin-customcommand/colorLabel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt-project.org/ * * Copyright: 2025 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef COLORLABEL_H #define COLORLABEL_H #include #include #include class ColorLabel : public QLabel { Q_OBJECT public: explicit ColorLabel(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); ~ColorLabel(); void setColor(const QColor& color, bool announceChange = false); QColor getColor() const; void reset(); signals: void colorChanged(); protected: void mousePressEvent(QMouseEvent* event) override; void paintEvent(QPaintEvent* event) override; private: QColor color_; }; #endif // COLORLABEL_H ================================================ FILE: plugin-customcommand/custombutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "custombutton.h" #include #include #include #include #include #include #include class LeftAlignedTextStyle : public QProxyStyle { using QProxyStyle::QProxyStyle; public: virtual void drawItemText(QPainter * painter, const QRect & rect, int flags , const QPalette & pal, bool enabled, const QString & text , QPalette::ColorRole textRole = QPalette::NoRole) const override; }; void LeftAlignedTextStyle::drawItemText(QPainter * painter, const QRect & rect, int flags , const QPalette & pal, bool enabled, const QString & text , QPalette::ColorRole textRole) const { QString txt = text; // get the button text because the text that's given to this function may be middle-elided if (const QToolButton *tb = dynamic_cast(painter->device())) txt = tb->text(); txt = QFontMetrics(painter->font()).elidedText(txt, Qt::ElideRight, rect.width()); QProxyStyle::drawItemText(painter, rect, (flags & ~Qt::AlignHCenter) | Qt::AlignLeft, pal, enabled, txt, textRole); } CustomButton::CustomButton(ILXQtPanelPlugin *plugin, QWidget* parent): QToolButton(parent), mPlugin(plugin), mPanel(plugin->panel()), mMaxWidth(200) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setAutoRaise(true); setContentsMargins(0, 0, 0, 0); setMinimumWidth(1); setMinimumHeight(1); setToolButtonStyle(Qt::ToolButtonTextBesideIcon); setStyle(new LeftAlignedTextStyle()); updateWidth(); } CustomButton::~CustomButton() = default; void CustomButton::wheelEvent(QWheelEvent *event) { QPoint anglePoint = event->angleDelta(); bool horizontal(std::abs(event->angleDelta().x()) > std::abs(anglePoint.y())); int delta = horizontal ? anglePoint.x() : anglePoint.y(); emit wheelScrolled(delta); event->accept(); } void CustomButton::setMaxWidth(int maxWidth) { mMaxWidth = maxWidth; updateWidth(); } void CustomButton::updateWidth() { int newWidth = std::min(sizeHint().width(), mMaxWidth); if (mOrigin == Qt::TopLeftCorner) { setFixedWidth(newWidth); setMinimumHeight(1); setMaximumHeight(QWIDGETSIZE_MAX); } else { setMinimumWidth(1); setMaximumWidth(QWIDGETSIZE_MAX); setFixedHeight(newWidth); } update(); } void CustomButton::setOrigin(Qt::Corner newOrigin) { if (mOrigin != newOrigin) { mOrigin = newOrigin; updateWidth(); } } void CustomButton::setAutoRotation(bool value) { if (value) { switch (mPanel->position()) { case ILXQtPanel::PositionTop: case ILXQtPanel::PositionBottom: setOrigin(Qt::TopLeftCorner); break; case ILXQtPanel::PositionLeft: setOrigin(Qt::BottomLeftCorner); break; case ILXQtPanel::PositionRight: setOrigin(Qt::TopRightCorner); break; } } else setOrigin(Qt::TopLeftCorner); } void CustomButton::paintEvent(QPaintEvent *event) { if (mOrigin == Qt::TopLeftCorner) { QToolButton::paintEvent(event); return; } QSize sz = size(); bool transpose = false; QTransform transform; switch (mOrigin) { case Qt::TopLeftCorner: break; case Qt::TopRightCorner: transform.rotate(90.0); transform.translate(0.0, -sz.width()); transpose = true; break; case Qt::BottomRightCorner: transform.rotate(180.0); transform.translate(-sz.width(), -sz.height()); break; case Qt::BottomLeftCorner: transform.rotate(270.0); transform.translate(-sz.height(), 0.0); transpose = true; break; } QStylePainter painter(this); painter.setTransform(transform); QStyleOptionToolButton opt; initStyleOption(&opt); if (transpose) opt.rect = opt.rect.transposed(); painter.drawComplexControl(QStyle::CC_ToolButton, opt); } ================================================ FILE: plugin-customcommand/custombutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include #include "../panel/ilxqtpanel.h" #include "../panel/ilxqtpanelplugin.h" class CustomButton : public QToolButton { Q_OBJECT public: CustomButton(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~CustomButton(); public slots: void setAutoRotation(bool value); void setMaxWidth(int maxWidth); void updateWidth(); protected: void wheelEvent(QWheelEvent *event) override; void paintEvent(QPaintEvent *event) override; private slots: void setOrigin(Qt::Corner newOrigin); private: ILXQtPanelPlugin *mPlugin; ILXQtPanel *mPanel; Qt::Corner mOrigin; int mMaxWidth; signals: void wheelScrolled(int); }; #endif // CUSTOMBUTTON_H ================================================ FILE: plugin-customcommand/lxqtcustomcommand.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtcustomcommand.h" #include "custombutton.h" #include "lxqtcustomcommandconfiguration.h" #include #include #include #include #include #include #include #include LXQtCustomCommand::LXQtCustomCommand(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mProcess(new QProcess(this)), mTerminating(false), mTimer(new QTimer(this)), mDelayedRunTimer(new QTimer(this)), mFirstRun(true), mAutoRotate(true), mRunWithBash(true), mOutputFormat(OutputFormat_t::OUTPUT_BEGIN), mContinuousOutput(false), mRepeat(true), mRepeatTimer(5), mMaxWidth(200) { mButton = new CustomButton(this); mButton->setObjectName(QLatin1String("CustomButton")); mFont = mButton->font().toString(); mTimer->setSingleShot(true); mDelayedRunTimer->setSingleShot(true); mDelayedRunTimer->setInterval(500); connect(mButton, &CustomButton::clicked, this, &LXQtCustomCommand::handleClick); connect(mButton, &CustomButton::wheelScrolled, this, &LXQtCustomCommand::handleWheelScrolled); connect(mTimer, &QTimer::timeout, this, &LXQtCustomCommand::runCommand); connect(mDelayedRunTimer, &QTimer::timeout, this, &LXQtCustomCommand::runCommand); connect(mProcess, &QProcess::finished, this, &LXQtCustomCommand::handleFinished); connect(mProcess, &QProcess::readyReadStandardOutput, this, &LXQtCustomCommand::handleOutput); settingsChanged(); } LXQtCustomCommand::~LXQtCustomCommand() { // Ensure process is closed before exiting and avoids warning from QProcess. mTerminating = true; mProcess->terminate(); delete mButton; mProcess->waitForFinished(200); mProcess->close(); } QWidget *LXQtCustomCommand::widget() { return mButton; } void LXQtCustomCommand::realign() { mButton->setAutoRotation(mAutoRotate); } QDialog *LXQtCustomCommand::configureDialog() { if (!mConfigDialog) mConfigDialog = new LXQtCustomCommandConfiguration(settings()); return mConfigDialog; } void LXQtCustomCommand::settingsChanged() { bool shouldRun = false; bool oldAutoRotate = mAutoRotate; QString oldFont = mFont; QString oldCommand = mCommand; bool oldRunWithBash = mRunWithBash; LXQtCustomCommandConfiguration::OutputFormat_t oldOutputFormat = mOutputFormat; bool oldContinuousOutput = mContinuousOutput; bool oldRepeat = mRepeat; int oldRepeatTimer = mRepeatTimer; QString oldIcon = mIcon; QString oldText = mText; QString oldTooltip = mTooltip; int oldMaxWidth = mMaxWidth; mAutoRotate = settings()->value(QStringLiteral("autoRotate"), true).toBool(); mFont = settings()->value(QStringLiteral("font"), QString()).toString(); // the default font should be empty QColor textColor = QColor::fromString(settings()->value(QStringLiteral("textColor")).toString()); mCommand = settings()->value(QStringLiteral("command"), QStringLiteral("echo Configure...")).toString().trimmed(); mRunWithBash = settings()->value(QStringLiteral("runWithBash"), true).toBool(); // backward compatibility check if (settings()->contains(QStringLiteral("outputFormat"))) mOutputFormat = static_cast(settings()->value(QStringLiteral("outputFormat")).toInt()); else mOutputFormat = settings()->value(QStringLiteral("outputImage"), false).toBool() ? OutputFormat_t::OUTPUT_ICON : OutputFormat_t::OUTPUT_TEXT; mContinuousOutput = settings()->value(QStringLiteral("continuousOutput"), false).toBool(); mRepeat = settings()->value(QStringLiteral("repeat"), true).toBool(); mRepeatTimer = settings()->value(QStringLiteral("repeatTimer"), 5).toInt(); mRepeatTimer = std::max(1, mRepeatTimer); mIcon = settings()->value(QStringLiteral("icon"), QString()).toString(); mText = settings()->value(QStringLiteral("text"), QStringLiteral("%1")).toString(); mTooltip = settings()->value(QStringLiteral("tooltip"), QString()).toString(); mMaxWidth = settings()->value(QStringLiteral("maxWidth"), 200).toInt(); mClick = settings()->value(QStringLiteral("click"), QString()).toString().trimmed(); mWheelUp = settings()->value(QStringLiteral("wheelUp"), QString()).toString().trimmed(); mWheelDown = settings()->value(QStringLiteral("wheelDown"), QString()).toString().trimmed(); if (oldFont != mFont) { QFont newFont; if (!mFont.isEmpty()) // is empty when it's reset to app's font newFont.fromString(mFont); if (mFirstRun) { QTimer::singleShot(0, mButton, [this, newFont] { mButton->setFont(newFont); updateButton(); }); } else { mButton->setFont(newFont); updateButton(); } } if (textColor.isValid()) { mButton->setStyleSheet(QStringLiteral("QToolButton{color: %1}").arg(textColor.name())); } else { mButton->setStyleSheet(QString()); } if (oldCommand != mCommand || oldRunWithBash != mRunWithBash || oldOutputFormat != mOutputFormat || oldContinuousOutput != mContinuousOutput || oldRepeat != mRepeat) shouldRun = true; if (mFirstRun || oldRepeatTimer != mRepeatTimer) mTimer->setInterval(mRepeatTimer * 1000); if (oldIcon != mIcon) { mButton->setIcon(QIcon::fromTheme(mIcon, QIcon(mIcon))); updateButton(); } else if (oldText != mText) updateButton(); if (oldTooltip != mTooltip) mButton->setToolTip(mTooltip); if (mFirstRun || oldMaxWidth != mMaxWidth) mButton->setMaxWidth(mMaxWidth); if (mFirstRun || oldAutoRotate != mAutoRotate) mButton->setAutoRotation(mAutoRotate); if (mFirstRun) { mFirstRun = false; shouldRun = true; } // Delay timer for running command, avoids multiple calls on settings change while typing command or clicking "Reset" if (shouldRun) { if (mProcess->state() == QProcess::Running) { mTerminating = true; mProcess->terminate(); } mButton->setIcon(QIcon::fromTheme(mIcon, QIcon(mIcon))); mButton->setText(QString{}); mButton->setToolTip(mTooltip); mButton->updateWidth(); mDelayedRunTimer->start(); } } void LXQtCustomCommand::handleClick() { if (!mClick.isEmpty()) runDetached(mClick); } void LXQtCustomCommand::handleFinished(int exitCode, QProcess::ExitStatus exitStatus) { if (!mTerminating) { if (exitStatus != QProcess::NormalExit || exitCode != 0) qWarning().nospace() << "customcommand: non-gracefull command finish(" << exitStatus << ',' << exitCode << "): " << mProcess->readAllStandardError(); else if (!mContinuousOutput) { mOutputByteArray = mProcess->readAllStandardOutput(); updateButton(); } if (mRepeat) mTimer->start(); } } void LXQtCustomCommand::handleOutput() { if (!mContinuousOutput) return; bool something_read = false; while (mProcess->canReadLine()) { mOutputByteArray = mProcess->readLine(); something_read = true; } if (something_read) updateButton(); } void LXQtCustomCommand::updateButton() { const auto iconsetter = [this](const QByteArray & iconData, const bool decoded) { QIcon icon; if (iconData.size() > 0) { const QString iconString = QString::fromUtf8(iconData.trimmed()); static const QRegularExpression re_no_xdg_name{QStringLiteral("[^[:alnum:]-]")}; if (!iconString.contains(re_no_xdg_name)) icon = QIcon::fromTheme(iconString); if (icon.isNull() && !iconString.contains(QChar::Null) && QFileInfo::exists(iconString)) icon = QIcon{iconString}; if (icon.isNull()) { QPixmap pixmap; pixmap.loadFromData(iconData); if (pixmap.isNull() && !decoded) pixmap.loadFromData(QByteArray::fromBase64(iconData)); icon = QIcon{pixmap}; } } mButton->setIcon(icon); }; switch (mOutputFormat) { case OutputFormat_t::OUTPUT_STRUCTURED: if (mOutputByteArray.size() > 0) { for (const auto & variable : mOutputByteArray.split(' ')) { const auto & name_value = variable.split(':'); bool error = false; QByteArray value; if (name_value.size() != 2) error = true; if (!error) { const auto decoded = QByteArray::fromBase64Encoding(name_value[1]); if (decoded.decodingStatus == QByteArray::Base64DecodingStatus::Ok) value = decoded.decoded; else error = true; } if (error) { qWarning().nospace() << "customcommand: Can't parse name-value(" << (name_value.empty() ? QString{} : QString::fromUtf8(name_value[0])) << ") from input: " << QString::fromUtf8(mOutputByteArray); continue; } if (name_value[0] == "text") { mButton->setText(QString::fromUtf8(value)); } else if (name_value[0] == "tooltip") { mButton->setToolTip(QString::fromUtf8(value)); } else if (name_value[0] == "icon") { iconsetter(value, true); } else { qWarning().nospace() << "customcommand: Unsupported parameter(" << QString::fromUtf8(name_value[0]) << ") to set"; } } } break; case OutputFormat_t::OUTPUT_ICON: iconsetter(mOutputByteArray, false); mButton->setText(QString{}); break; case OutputFormat_t::OUTPUT_TEXT: { QString newText = mText; if (newText.contains(QStringLiteral("%1"))) newText = newText.arg(QString::fromUtf8(mOutputByteArray.trimmed())); mButton->setText(newText); } break; case OutputFormat_t::OUTPUT_END: assert(false); } if (mButton->icon().isNull()) mButton->setToolButtonStyle(Qt::ToolButtonTextOnly); else if (mButton->text().isEmpty()) mButton->setToolButtonStyle(Qt::ToolButtonIconOnly); else mButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mButton->updateWidth(); } void LXQtCustomCommand::handleWheelScrolled(int delta) { if (delta > 0 && !mWheelUp.isEmpty()) runDetached(mWheelUp); else if (delta < 0 && !mWheelDown.isEmpty()) runDetached(mWheelDown); } void LXQtCustomCommand::runCommand() { if (mProcess->state() == QProcess::Running) mProcess->close(); mTerminating = false; if (mCommand.isEmpty()) return; QStringList args; if (mRunWithBash) args << QStringLiteral("bash") << QStringLiteral("-c") << mCommand; else args = QProcess::splitCommand(mCommand); mProcess->start(args.takeFirst(), args); } void LXQtCustomCommand::runDetached(QString command) { QStringList args = QProcess::splitCommand(command); QProcess::startDetached(args.takeFirst(), args); } ================================================ FILE: plugin-customcommand/lxqtcustomcommand.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTCUSTOMCOMMAND_H #define LXQTCUSTOMCOMMAND_H #include "../panel/ilxqtpanelplugin.h" #include "lxqtcustomcommandconfiguration.h" #include #include #include #include #include class CustomButton; class LXQtCustomCommand : public QObject, public ILXQtPanelPlugin { Q_OBJECT using OutputFormat_t = LXQtCustomCommandConfiguration::OutputFormat_t; public: LXQtCustomCommand(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtCustomCommand(); virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("Custom"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog ; } void realign(); QDialog *configureDialog(); protected slots: virtual void settingsChanged(); private slots: void handleClick(); void handleFinished(int exitCode, QProcess::ExitStatus exitStatus); void handleOutput(); void handleWheelScrolled(int delta); void updateButton(); void runCommand(); void runDetached(QString command); private: CustomButton *mButton; QPointer mConfigDialog; QProcess *mProcess; bool mTerminating; QTimer *mTimer; QTimer *mDelayedRunTimer; bool mFirstRun; QByteArray mOutputByteArray; bool mAutoRotate; QString mFont; QString mCommand; bool mRunWithBash; OutputFormat_t mOutputFormat; bool mContinuousOutput; bool mRepeat; int mRepeatTimer; QString mIcon; QString mText; QString mTooltip; int mMaxWidth; QString mClick; QString mWheelUp; QString mWheelDown; }; class LXQtCustomCommandPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtCustomCommand(startupInfo); } }; #endif // LXQTCUSTOMCOMMAND_H ================================================ FILE: plugin-customcommand/lxqtcustomcommandconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtcustomcommandconfiguration.h" #include "lxqtcustomcommand.h" #include "ui_lxqtcustomcommandconfiguration.h" #include #include #include #include #include #include #define HELP_TEXT_DESC LXQtCustomCommandConfiguration::tr("command outputs plain text to be used as text of the button") #define HELP_ICON_DESC1 LXQtCustomCommandConfiguration::tr("command outputs icon in form of:") #define HELP_ICON_DESC2 LXQtCustomCommandConfiguration::tr("theme name") #define HELP_ICON_DESC3 LXQtCustomCommandConfiguration::tr("name of icon resolved to image based on XDG spec") #define HELP_ICON_DESC4 LXQtCustomCommandConfiguration::tr("image file path") #define HELP_ICON_DESC5 LXQtCustomCommandConfiguration::tr("image data stream") #define HELP_ICON_DESC6 LXQtCustomCommandConfiguration::tr("plain image stream") #define HELP_ICON_DESC7 LXQtCustomCommandConfiguration::tr("base64 encoded image data stream") #define HELP_ICON_DESC8 LXQtCustomCommandConfiguration::tr("as above but base64 encoded") #define HELP_STRUC_DESC1 LXQtCustomCommandConfiguration::tr("command outputs structured variables to be used for button visualization in form of:") #define HELP_STRUC_DESC2 LXQtCustomCommandConfiguration::tr("name1:base64value1 name2:base64value2 ...") #define HELP_STRUC_DESC3 LXQtCustomCommandConfiguration::tr("Handled names are:") #define HELP_STRUC_DESC4 LXQtCustomCommandConfiguration::tr("string to be used as text of the button") #define HELP_STRUC_DESC5 LXQtCustomCommandConfiguration::tr("icon to be shown in the button, in the same form as explained before") #define HELP_STRUC_DESC6 LXQtCustomCommandConfiguration::tr("string to be used as tooltip of the button") #define HELP_STRUC_DESC7 LXQtCustomCommandConfiguration::tr("All values should be encoded in base64") #define HELP_STRUC_DESC8 LXQtCustomCommandConfiguration::tr("Example of script generating structured output:") #define HELP_STRUC_EXAMPLE1 LXQtCustomCommandConfiguration::tr("My Text") #define HELP_STRUC_EXAMPLE2 LXQtCustomCommandConfiguration::tr("my_image") #define HELP_STRUC_EXAMPLE3 LXQtCustomCommandConfiguration::tr("My Tooltip") //Note: strings can't actually be translated here (in static initialization time) // the QT_TR_NOOP here is just for qt translate tools to get the strings for translation const QStringList LXQtCustomCommandConfiguration::msOutputFormatStrings = { QStringLiteral(QT_TR_NOOP("Text only")) , QStringLiteral(QT_TR_NOOP("Icon only")) , QStringLiteral(QT_TR_NOOP("Structured")) }; LXQtCustomCommandConfiguration::LXQtCustomCommandConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtCustomCommandConfiguration), mLockSettingChanges(false) { assert(msOutputFormatStrings.size() == OUTPUT_END); ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); const QFont monoFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); ui->commandPlainTextEdit->setFont(monoFont); mHelpText = QStringLiteral("

%1 - %2

" "

%3 - %4
" "- %5 - %6
" "- %7 - %7
" "- %8 - %9
" "- %10 - %11

" "

%12 - %13 \"%14\".
" "%15
" "- text - %16
" "- icon - %17
" "- tooltip - %18
" "%19

" "%20
" "echo \"text:$(echo -n \"%21\" | base64 --wrap=0) icon:$(base64 --wrap=0 %22.svg) tooltip:$(echo -n \"%23\" | base64 --wrap=0)\"

") .arg(msOutputFormatStrings[OUTPUT_TEXT], HELP_TEXT_DESC, msOutputFormatStrings[OUTPUT_ICON], HELP_ICON_DESC1, HELP_ICON_DESC2, HELP_ICON_DESC3, HELP_ICON_DESC4, HELP_ICON_DESC5, HELP_ICON_DESC6, HELP_ICON_DESC7, HELP_ICON_DESC8, msOutputFormatStrings[OUTPUT_STRUCTURED], HELP_STRUC_DESC1, HELP_STRUC_DESC2, HELP_STRUC_DESC3, HELP_STRUC_DESC4, HELP_STRUC_DESC5, HELP_STRUC_DESC6, HELP_STRUC_DESC7, HELP_STRUC_DESC8, HELP_STRUC_EXAMPLE1, HELP_STRUC_EXAMPLE2, HELP_STRUC_EXAMPLE3 ); //Note: translation is needed here in runtime (translator is attached already) for (int format = OUTPUT_BEGIN; format < OUTPUT_END; ++format) ui->outputFormatComboBox->addItem(tr(msOutputFormatStrings[format].toStdString().c_str()), format); loadSettings(); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &LXQtCustomCommandConfiguration::dialogButtonsAction); connect(ui->autoRotateCheckBox, &QCheckBox::toggled, this, &LXQtCustomCommandConfiguration::autoRotateChanged); connect(ui->fontButton, &QPushButton::clicked, this, &LXQtCustomCommandConfiguration::fontButtonClicked); connect(ui->textColorLabel, &ColorLabel::colorChanged, this, &LXQtCustomCommandConfiguration::textColorChanged); connect(ui->textColorResetButton, &QPushButton::clicked, this, &LXQtCustomCommandConfiguration::textColorResetButtonClicked); connect(ui->commandPlainTextEdit, &QPlainTextEdit::textChanged, this, &LXQtCustomCommandConfiguration::commandPlainTextEditChanged); connect(ui->runWithBashCheckBox, &QCheckBox::toggled, this, &LXQtCustomCommandConfiguration::runWithBashCheckBoxChanged); connect(ui->outputFormatComboBox, &QComboBox::currentIndexChanged, this, &LXQtCustomCommandConfiguration::outputFormatComboBoxChanged); connect(ui->continuousOutputCheckBox, &QCheckBox::toggled, this, &LXQtCustomCommandConfiguration::continuousOutputCheckBoxChanged); connect(ui->repeatCheckBox, &QCheckBox::toggled, this, &LXQtCustomCommandConfiguration::repeatCheckBoxChanged); connect(ui->repeatTimerSpinBox, &QSpinBox::editingFinished, this, &LXQtCustomCommandConfiguration::repeatTimerSpinBoxChanged); connect(ui->iconLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::iconLineEditChanged); connect(ui->iconBrowseButton, &QPushButton::clicked, this, &LXQtCustomCommandConfiguration::iconBrowseButtonClicked); connect(ui->textLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::textLineEditChanged); connect(ui->tooltipLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::tooltipLineEditChanged); connect(ui->maxWidthSpinBox, &QSpinBox::editingFinished, this, &LXQtCustomCommandConfiguration::maxWidthSpinBoxChanged); connect(ui->clickLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::clickLineEditChanged); connect(ui->wheelUpLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::wheelUpLineEditChanged); connect(ui->wheelDownLineEdit, &QLineEdit::editingFinished, this, &LXQtCustomCommandConfiguration::wheelDownLineEditChanged); connect(ui->helpToolButton, &QToolButton::clicked, this, [this] () { QWhatsThis::showText(QCursor::pos(), mHelpText, this); }); } LXQtCustomCommandConfiguration::~LXQtCustomCommandConfiguration() { delete ui; } void LXQtCustomCommandConfiguration::loadSettings() { mLockSettingChanges = true; ui->autoRotateCheckBox->setChecked(settings().value(QStringLiteral("autoRotate"), true).toBool()); ui->fontButton->setText(settings().value(QStringLiteral("font"), font().toString()).toString()); ui->textColorLabel->setColor(QColor::fromString(settings().value(QStringLiteral("textColor")).toString())); ui->commandPlainTextEdit->setPlainText(settings().value(QStringLiteral("command"), QStringLiteral("echo Configure...")).toString()); ui->runWithBashCheckBox->setChecked(settings().value(QStringLiteral("runWithBash"), true).toBool()); // backward compatibility check if (settings().contains(QStringLiteral("outputFormat"))) ui->outputFormatComboBox->setCurrentIndex(ui->outputFormatComboBox->findData(settings().value(QStringLiteral("outputFormat")).toInt())); else { const bool image = settings().value(QStringLiteral("outputImage"), false).toBool(); ui->outputFormatComboBox->setCurrentIndex(ui->outputFormatComboBox->findData(image ? OUTPUT_ICON : OUTPUT_TEXT)); } ui->continuousOutputCheckBox->setChecked(settings().value(QStringLiteral("continuousOutput"), false).toBool()); ui->repeatCheckBox->setChecked(settings().value(QStringLiteral("repeat"), true).toBool()); ui->repeatTimerSpinBox->setEnabled(ui->repeatCheckBox->isChecked()); ui->repeatTimerSpinBox->setValue(settings().value(QStringLiteral("repeatTimer"), 5).toInt()); ui->iconLineEdit->setText(settings().value(QStringLiteral("icon"), QString()).toString()); ui->textLineEdit->setText(settings().value(QStringLiteral("text"), QStringLiteral("%1")).toString()); ui->tooltipLineEdit->setText(settings().value(QStringLiteral("tooltip"), QString()).toString()); ui->maxWidthSpinBox->setValue(settings().value(QStringLiteral("maxWidth"), 200).toInt()); ui->clickLineEdit->setText(settings().value(QStringLiteral("click"), QString()).toString()); ui->wheelUpLineEdit->setText(settings().value(QStringLiteral("wheelUp"), QString()).toString()); ui->wheelDownLineEdit->setText(settings().value(QStringLiteral("wheelDown"), QString()).toString()); mLockSettingChanges = false; } void LXQtCustomCommandConfiguration::autoRotateChanged(bool autoRotate) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("autoRotate"), autoRotate); } void LXQtCustomCommandConfiguration::fontButtonClicked() { bool ok; QFont currentFont; currentFont.fromString(ui->fontButton->text()); QFont getFont = QFontDialog::getFont(&ok, currentFont, this); if (ok) { auto fontString = getFont.toString(); ui->fontButton->setText(fontString); settings().setValue(QStringLiteral("font"), fontString); } } void LXQtCustomCommandConfiguration::textColorChanged() { QColor color = ui->textColorLabel->getColor(); QColor oldColor = QColor::fromString(settings().value(QStringLiteral("textColor")).toString()); if (color != oldColor) settings().setValue(QStringLiteral("textColor"), color.name()); } void LXQtCustomCommandConfiguration::textColorResetButtonClicked() { ui->textColorLabel->reset(); settings().remove(QStringLiteral("textColor")); } void LXQtCustomCommandConfiguration::commandPlainTextEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("command"), ui->commandPlainTextEdit->toPlainText().trimmed()); } void LXQtCustomCommandConfiguration::runWithBashCheckBoxChanged(bool runWithBash) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("runWithBash"), runWithBash); } void LXQtCustomCommandConfiguration::outputFormatComboBoxChanged(int index) { if (!mLockSettingChanges) { settings().setValue(QStringLiteral("outputFormat"), ui->outputFormatComboBox->itemData(index, Qt::UserRole)); settings().remove(QStringLiteral("outputImage")); } } void LXQtCustomCommandConfiguration::continuousOutputCheckBoxChanged(bool continuousOutput) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("continuousOutput"), continuousOutput); } void LXQtCustomCommandConfiguration::repeatCheckBoxChanged(bool repeat) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("repeat"), repeat); ui->repeatTimerSpinBox->setEnabled(repeat); } void LXQtCustomCommandConfiguration::repeatTimerSpinBoxChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("repeatTimer"), ui->repeatTimerSpinBox->value()); } void LXQtCustomCommandConfiguration::iconLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("icon"), ui->iconLineEdit->text()); } void LXQtCustomCommandConfiguration::iconBrowseButtonClicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Select Icon File"), QString(), tr("Images (*.png *.svg *.xpm *.jpg)")); ui->iconLineEdit->setText(fileName); } void LXQtCustomCommandConfiguration::textLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("text"), ui->textLineEdit->text()); } void LXQtCustomCommandConfiguration::tooltipLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("tooltip"), ui->tooltipLineEdit->text()); } void LXQtCustomCommandConfiguration::maxWidthSpinBoxChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("maxWidth"), ui->maxWidthSpinBox->value()); } void LXQtCustomCommandConfiguration::clickLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("click"), ui->clickLineEdit->text().trimmed()); } void LXQtCustomCommandConfiguration::wheelUpLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("wheelUp"), ui->wheelUpLineEdit->text().trimmed()); } void LXQtCustomCommandConfiguration::wheelDownLineEditChanged() { if (!mLockSettingChanges) settings().setValue(QStringLiteral("wheelDown"), ui->wheelDownLineEdit->text().trimmed()); } ================================================ FILE: plugin-customcommand/lxqtcustomcommandconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTCUSTOMCOMMANDCONFIGURATION_H #define LXQTCUSTOMCOMMANDCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" namespace Ui { class LXQtCustomCommandConfiguration; } class LXQtCustomCommandConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: enum OutputFormat_t { OUTPUT_BEGIN , OUTPUT_TEXT = OUTPUT_BEGIN , OUTPUT_ICON , OUTPUT_STRUCTURED , OUTPUT_END }; static const QStringList msOutputFormatStrings; public: explicit LXQtCustomCommandConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtCustomCommandConfiguration(); private slots: void autoRotateChanged(bool autoRotate); void fontButtonClicked(); void textColorChanged(); void textColorResetButtonClicked(); void commandPlainTextEditChanged(); void runWithBashCheckBoxChanged(bool runWithBash); void outputFormatComboBoxChanged(int index); void continuousOutputCheckBoxChanged(bool continuousOutput); void repeatCheckBoxChanged(bool repeat); void repeatTimerSpinBoxChanged(); void iconLineEditChanged(); void iconBrowseButtonClicked(); void textLineEditChanged(); void tooltipLineEditChanged(); void maxWidthSpinBoxChanged(); void clickLineEditChanged(); void wheelUpLineEditChanged(); void wheelDownLineEditChanged(); protected slots: virtual void loadSettings(); private: Ui::LXQtCustomCommandConfiguration *ui; bool mLockSettingChanges; QString mHelpText; }; #endif // LXQTCUSTOMCOMMANDCONFIGURATION_H ================================================ FILE: plugin-customcommand/lxqtcustomcommandconfiguration.ui ================================================ LXQtCustomCommandConfiguration 0 0 488 572 Custom Command Configuration Display Reset false Output format: ... Command Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter px 10 9999 5 200 Run with "bash -c" true Select Font false Text Color 0 52 0 50 echo Configure... 40.000000000000000 Command to run Max Width Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter Autorotate when the panel is vertical Font Icon Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter 0 0 0 0 QFrame::Shape::NoFrame QFrame::Shadow::Raised 0 0 0 0 0 0 0 Repeat command after: false 0 0 second(s) 1 86400 1 5 %1 Use %1 to display command output Tooltip Text Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter Browse false Use icon from theme or browse file Continuous output (processed line by line) false Mouse Commands Click Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter Command to run Wheel Up Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter Command to run Wheel Down Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter Command to run Qt::Orientation::Horizontal QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Reset ColorLabel QLabel
colorLabel.h
autoRotateCheckBox fontButton textColorResetButton commandPlainTextEdit runWithBashCheckBox continuousOutputCheckBox repeatCheckBox repeatTimerSpinBox outputFormatComboBox iconLineEdit iconBrowseButton textLineEdit tooltipLineEdit maxWidthSpinBox clickLineEdit wheelUpLineEdit wheelDownLineEdit buttonBox accepted() LXQtCustomCommandConfiguration accept() buttonBox rejected() LXQtCustomCommandConfiguration reject()
================================================ FILE: plugin-customcommand/resources/customcommand.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=preferences-plugin #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-customcommand/translations/customcommand.desktop.yaml ================================================ Desktop Entry/Name: "Custom Command" Desktop Entry/Comment: "Displays the output of a CLI command" ================================================ FILE: plugin-customcommand/translations/customcommand.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Display Use icon from theme or browse file Run with "bash -c" Select Font Text Command Font px %1 Use %1 to display command output Icon Browse Autorotate when the panel is vertical Output format: ... echo Configure... Command to run Max Width Repeat command after: Text Color Reset second(s) Tooltip Continuous output (processed line by line) Mouse Commands Click Wheel Up Wheel Down command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Images (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ar.desktop.yaml ================================================ Desktop Entry/Name: "أمر مخصص" Desktop Entry/Comment: "عرض نتائج أمر cli" ================================================ FILE: plugin-customcommand/translations/customcommand_ar.ts ================================================ ColorLabel Click to change color انقر لتغيير اللون Select Color انقر لتغيير اللون LXQtCustomCommandConfiguration Custom Command Configuration إعدادات الاوامر المخصصة Display عرض Use icon from theme or browse file استخدام أيقونة من موضوع أو تصفح الملف Run with "bash -c" تشغيل باستخدام "bash -c" Select Font تحديد الخط Text نص Command الأمر Font الخط px بكسل %1 %1 Use %1 to display command output استخدم%1 لعرض إخراج الأمر Icon أيقونة Browse تصفّح Autorotate when the panel is vertical تدوير تلقائي عندما تكون اللوحة عمودية Output format: تنسيق الإخراج: ... ... echo Configure... اعداد الصدى ... Command to run تشغيل الأمر Max Width أقصي عرض Repeat command after: كرر الأمر بعد: Text Color لون النص Reset إعادة ضبط second(s) ثانية (ثوان) Tooltip تلميح الأدوات Continuous output (processed line by line) الإخراج المستمر (معالجة سطرًا بسطر) Mouse Commands أوامر الماوس Click انقر Wheel Up عجلة لأعلى Wheel Down عجلة أسفل command outputs plain text to be used as text of the button يقوم الأمر بإخراج نص عادي ليتم استخدامه كنص للزر command outputs icon in form of: أيقونة مخرجات الأوامر على شكل: theme name اسم الموضوع name of icon resolved to image based on XDG spec اسم الرمز تم حله للصورة بناءً على مواصفات XDG image file path مسار ملف الصورة image data stream تدفق بيانات الصورة plain image stream تدفق الصور العادية base64 encoded image data stream دفق بيانات الصورة المشفرة بتنسيق base64 as above but base64 encoded كما هو مذكور أعلاه ولكن تم ترميزه باستخدام base64 command outputs structured variables to be used for button visualization in form of: يقوم الأمر بإخراج متغيرات منظمة لاستخدامها في تصور الأزرار في شكل: name1:base64value1 name2:base64value2 ... الاسم 1: القيمة الأساسية 641 الاسم 2: القيمة الأساسية 642 ... Handled names are: الأسماء التي تمت معالجتها هي: string to be used as text of the button السلسلة التي سيتم استخدامها كنص للزر icon to be shown in the button, in the same form as explained before الرمز الذي سيتم عرضه في الزر، بنفس الشكل الذي تم شرحه من قبل string to be used as tooltip of the button سلسلة سيتم استخدامها كأداة تلميح للزر All values should be encoded in base64 يجب ترميز جميع القيم في base64 Example of script generating structured output: مثال على البرنامج النصي الذي يولد مخرجات منظمة: My Text نصي my_image صورتي My Tooltip تلميحاتي Text only نص فقط Icon only أيقونة فقط Structured مهيكلة Select Icon File حدد ملف الأيقونة Images (*.png *.svg *.xpm *.jpg) الصور (* .png * .svg * .xpm * .jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_bg.desktop.yaml ================================================ Desktop Entry/Name: "Потребителски команди" Desktop Entry/Comment: "Показва резултата от команда на терминала" ================================================ FILE: plugin-customcommand/translations/customcommand_bg.ts ================================================ ColorLabel Click to change color Кликнете, за да промените цвета Select Color Изберете цвят LXQtCustomCommandConfiguration Custom Command Configuration Конфигуриране на персонализирана команда Display Дисплей Use icon from theme or browse file Използвайте икона от темата или изберете файл Run with "bash -c" Изпълняване с "bash -c" Select Font Избиране на шрифт Text Текст Command Команда(Инструкция) Font Шрифт px пиксела %1 %1 Use %1 to display command output Използвайте %1, за да покажете изходът от командата Icon Икона Browse Разглеждане Autorotate when the panel is vertical Автоматично завъртане когато панелът е в вертикално положение Output format: Формат на изхода: ... ... echo Configure... echo Конфигуриране... Command to run Команда за изпълнение Max Width Максимална широчина Repeat command after: Повтаряне на команда след: Text Color Цвят на текста Reset Нулиране second(s) секунда(и) Tooltip Съвет Continuous output (processed line by line) Непрекъснат изход (обработва се ред по ред) Mouse Commands Команди за мишката Click Кликване Wheel Up Колело нагоре Wheel Down Колело надолу command outputs plain text to be used as text of the button командата извежда обикновен текст, който да се използва като текст на бутона command outputs icon in form of: командата извежда икона във форма на: theme name име на темата name of icon resolved to image based on XDG spec името на иконата се преобразува в изображение въз основа на спецификацията XDG image file path път към файла с изображението image data stream поток от данни за изображение plain image stream обикновен поток от изображения base64 encoded image data stream поток от данни за изображения, кодирани в base64 as above but base64 encoded както по-горе, но кодирано в base64 command outputs structured variables to be used for button visualization in form of: командата извежда структурирани променливи, които се използват за визуализация на бутони във форма на: name1:base64value1 name2:base64value2 ... име1:base64value1 име2:base64value2 ... Handled names are: Обработените имена са: string to be used as text of the button низ, който да се използва като текст на бутона icon to be shown in the button, in the same form as explained before икона, която да се показва в бутона, в същата форма, както е обяснено по-горе string to be used as tooltip of the button низ, който да се използва като подсказка за бутона All values should be encoded in base64 Всички стойности трябва да бъдат кодирани в base64 Example of script generating structured output: Пример за скрипт, генериращ структуриран изход: My Text Мой текст my_image мое_изображение My Tooltip Моя подсказка Text only Моята подсказка Icon only Само икона Structured Структурирано Select Icon File Избиране на файл с икона Images (*.png *.svg *.xpm *.jpg) Изображения (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ca.desktop.yaml ================================================ Desktop Entry/Name: "Ordre personalitzada" Desktop Entry/Comment: "Mostra el resultat d'una ordre de terminal" ================================================ FILE: plugin-customcommand/translations/customcommand_ca.ts ================================================ ColorLabel Click to change color Cliqueu per canviar de color Select Color Color de selecció LXQtCustomCommandConfiguration Custom Command Configuration Configuració d'ordres personalitzades Display Mostra Use icon from theme or browse file Usa la icona del tema o navega fins al fitxer Run with "bash -c" Executa amb "bash -c" Select Font Selecciona la lletra tipogràfica Text Text Command Ordre Font Lletra tipogràfica px px %1 %1 Use %1 to display command output Usa % 1 per mostrar la sortida de l'ordre Icon Icona Browse Navega Autorotate when the panel is vertical Gira automàticament quan el panell sigui vertical Output format: Format de sortida: ... ... echo Configure... Configuració de l'eco... Command to run Ordre a executar Max Width Amplada màxima Repeat command after: Repeteix l'ordre després de: Text Color Color del text Reset Restableix second(s) segon(s) Tooltip Consell d'eina Continuous output (processed line by line) Sortida contínua (processada línia per línia) Mouse Commands Ordres del ratolí Click Clic Wheel Up Roda amunt Wheel Down Roda avall command outputs plain text to be used as text of the button l'ordre genera text sense format que s'usarà com a text del botó command outputs icon in form of: icona de sortides d'ordres en forma de theme name nom del tema name of icon resolved to image based on XDG spec nom de la icona resolt a imatge segons l'especificació XDG image file path camí del fitxer d'imatge image data stream flux de dades d'imatge plain image stream flux d'imatge senzilla base64 encoded image data stream flux de dades d'imatges codificades en base64 as above but base64 encoded com l'anterior però codificat en base64 command outputs structured variables to be used for button visualization in form of: L'ordre genera variables estructurades que s'usaran per a la visualització de botons en forma de name1:base64value1 name2:base64value2 ... nom1:valorbase641 nom2:valorbase642... Handled names are: Els noms gestionats són aquests: string to be used as text of the button cadena que s'usarà com a text del botó icon to be shown in the button, in the same form as explained before icona que es mostrarà al botó, de la mateixa manera que s'ha explicat abans string to be used as tooltip of the button cadena que s'usarà com a informació emergent del botó All values should be encoded in base64 Tots els valors s'han de codificar en base64 Example of script generating structured output: Exemple de script que genera una sortida estructurada: My Text El text my_image la imatge My Tooltip La informació Text only Només text Icon only Només la icona Structured Estructurat Select Icon File Trieu un fitxer d'icona Images (*.png *.svg *.xpm *.jpg) Imatges (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_cs.desktop.yaml ================================================ Desktop Entry/Name: "Uživatelsky určený příkaz" Desktop Entry/Comment: "Zobrazí výstup z příkazového řádku" ================================================ FILE: plugin-customcommand/translations/customcommand_cs.ts ================================================ ColorLabel Click to change color Klepněte pro změnu barvy Select Color Vybrat barvu LXQtCustomCommandConfiguration Custom Command Configuration Nastavení uživatelsky určeného příkazu Display Zobrazení Use icon from theme or browse file Použít ikonu z motivu vzhledu nebo nalistujte soubor Run with "bash -c" Spustit prostřednictvím „bash -c“ Select Font Vybrat písmo Text Text Command Příkaz Font Písmo px obraz. bodů %1 %1 Use %1 to display command output Pro zobrazení výstupu z příkazu použít %1 Icon Ikona Browse Procházet Autorotate when the panel is vertical Automaticky otočit, pokud je panel orientován svisle Output format: Výstupní formát: ... echo Configure... echo Nastavte… Command to run Příkaz ke spuštění Max Width Nejvyšší umožněná šířka Repeat command after: Zopakovat příkaz po uplynutí: Text Color Barva textu Reset Obnovit výchozí second(s) sekund Tooltip Nástrojová rada Continuous output (processed line by line) Průběžný výstup (zpracováváno řádek po řádku) Mouse Commands Příkazy myší Click Kliknutí Wheel Up Pootočení kolečkem nahoru Wheel Down Pootočení kolečkem dolů command outputs plain text to be used as text of the button neformátovaný text výstupu z příkazu, který použít jako text tlačítka command outputs icon in form of: ikona výstupů z příkazu v podobě: theme name název vzhledu name of icon resolved to image based on XDG spec název ikony přeložený na obrázek na základě XDG specifikace image file path popis umístění souboru s obrázkem image data stream proud obrazových dat plain image stream proud neformátovaného obrázku base64 encoded image data stream proud obrazových dat v base64 kódování as above but base64 encoded stejné jako výše ale v base64 kódování command outputs structured variables to be used for button visualization in form of: strukturované proměnné výstupů příkazu, které použít pro vizualizaci tlačítka ve formě: name1:base64value1 name2:base64value2 ... nazev1:base64hodnota1 nazev2:base64hodnota2 … Handled names are: Obsluhované názvy jsou: string to be used as text of the button řetězec který použít jako text tlačítka icon to be shown in the button, in the same form as explained before ikona kterou zobrazit v tlačítku, ve stejné podobě, jako vysvětleno předtím string to be used as tooltip of the button řetězec který použít jako popisek tlačítka All values should be encoded in base64 Veškeré hodnoty by měly být v base64 kódování Example of script generating structured output: Příklad skriptu vytvářejícího strukturovaný výstup: My Text Můj text my_image muj_obrazek My Tooltip Muj popisek Text only Pouze text Icon only Pouze ikona Structured Strukturované Select Icon File Vyberte soubor obsahující ikonu Images (*.png *.svg *.xpm *.jpg) Obrázky (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_da.desktop.yaml ================================================ Desktop Entry/Name: "Brugerdefineret kommando" Desktop Entry/Comment: "Viser uddata fra en cli kommando" ================================================ FILE: plugin-customcommand/translations/customcommand_da.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Indstilling af brugerdefineret kommando Display Skærm Use icon from theme or browse file Brug ikon fra tema eller søg efter fil Run with "bash -c" Kør med "bash -c" Select Font Vælg skrifttype Text Tekst Command Kommando Font Skrifttype px px %1 %1 Use %1 to display command output Brug %1 til at vise kommando uddata Icon Ikon Browse Gennemse Autorotate when the panel is vertical Roter automatisk når panelet er lodret Output format: ... echo Configure... echo Indstil... Command to run Kør kommando Max Width Max bredde Repeat command after: Gentag kommando efter: Text Color Reset second(s) sekund(er) Tooltip Continuous output (processed line by line) Mouse Commands Muse kommandoer Click Klik Wheel Up Hjul op Wheel Down Hjul ned command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Vælg ikon fil Images (*.png *.svg *.xpm *.jpg) Billeder (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_de.desktop.yaml ================================================ Desktop Entry/Name: "Persönliche Befehlszeile" Desktop Entry/Comment: "Zeigt Ausgabe der Befehlszeile" ================================================ FILE: plugin-customcommand/translations/customcommand_de.ts ================================================ ColorLabel Click to change color Zum Ändern der Farbe klicken Select Color Farbe auswählen LXQtCustomCommandConfiguration Custom Command Configuration Einstellung der persönlichen Befehlszeile Display Anzeige Use icon from theme or browse file Verwende Symbolthema oder suche Datei Run with "bash -c" Ausführen mit "bash -c" Select Font Wähle Schriftart Text Text Command Befehl Font Schriftart px px %1 %1 Use %1 to display command output Verwende %1 zur Anzeige der Befehlszeile Icon Symbol Browse Durchsuche Autorotate when the panel is vertical Selbstdrehen bei vertikaler Anzeige Output format: ... echo Configure... echo Konfigurieren... Command to run Auszuführender Befehl Max Width Max. Breite Repeat command after: Befehl wiederholen nach: Text Color Textfarbe Reset Zurücksetzen second(s) Sekunde(n) Tooltip Kurzinfo Continuous output (processed line by line) Mouse Commands Mausbefehle Click Klick Wheel Up Rad nach oben Wheel Down Rad nach unten command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Symboldatei auswählen Images (*.png *.svg *.xpm *.jpg) Bilder (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_el.desktop.yaml ================================================ Desktop Entry/Name: "Προσαρμοσμένη εντολή" Desktop Entry/Comment: "Προβολή της εξόδου μιας εντολής cli" ================================================ FILE: plugin-customcommand/translations/customcommand_el.ts ================================================ ColorLabel Click to change color Κλικ για αλλαγή του χρώματος Select Color Επιλογή του χρώματος LXQtCustomCommandConfiguration Custom Command Configuration Διαμόρφωση προσαρμοσμένης εντολής Display Προβολή Use icon from theme or browse file Χρήση εικονιδίου θέματος ή από αρχείο Run with "bash -c" Εκτέλεση με "bash -c" Select Font Επιλογή γραμματοσειράς Text Κείμενο Command Εντολή Font Γραμματοσειρά px εικ %1 %1 Use %1 to display command output Χρήση του %1 για την προβολή της εξόδου της εντολής Icon Εικονίδιο Browse Περιήγηση Autorotate when the panel is vertical Αυτόματη περιστροφή όταν ο πίνακας είναι κάθετος Output format: Μορφή εξόδου: ... ... echo Configure... Διαμόρφωση ηχώς... Command to run Εντολή προς εκτέλεση Max Width Μέγιστο πλάτος Repeat command after: Επανάληψη της εντολής μετά: Text Color Χρώμα κειμένου Reset Επαναφορά second(s) δευτερόλεπτο(α) Tooltip Υπόδειξη Continuous output (processed line by line) Συνεχής έξοδος (γραμμή-γραμμή σε πραγματικό χρόνο) Mouse Commands Εντολές ποντικιού Click Κλικ Wheel Up Ρόδα προς τα πάνω Wheel Down Ρόδα προς τα κάτω command outputs plain text to be used as text of the button η εντολή παράγει απλό κείμενο που θα χρησιμοποιηθεί ως το κείμενο του κουμπιού command outputs icon in form of: η εντολή παράγει εικονίδιο σε μορφή: theme name όνομα του θέματος name of icon resolved to image based on XDG spec όνομα εικονιδίου, το οποίο αντιστοιχίζεται σε εικόνα σύμφωνα με τις προδιαγραφές XDG image file path διαδρομή αρχείου εικόνας image data stream ροή δεδομένων εικόνας plain image stream ακατέργαστη ροή δεδομένων εικόνας base64 encoded image data stream ροή δεδομένων εικόνας κωδικοποιημένη σε base64 as above but base64 encoded όπως παραπάνω, αλλά κωδικοποιημένο σε base64 command outputs structured variables to be used for button visualization in form of: η εντολή παράγει δομημένες μεταβλητές που θα χρησιμοποιηθούν για την απεικόνιση του κουμπιού, σε μορφή: name1:base64value1 name2:base64value2 ... όνομα1:base64τιμή1 όνομα2:base64τιμή2 ... Handled names are: Τα υποστηριζόμενα ονόματα είναι: string to be used as text of the button συμβολοσειρά που θα χρησιμοποιηθεί ως κείμενο του κουμπιού icon to be shown in the button, in the same form as explained before εικονίδιο που θα εμφανίζεται στο κουμπί, στην ίδια μορφή όπως εξηγήθηκε παραπάνω string to be used as tooltip of the button συμβολοσειρά που θα χρησιμοποιηθεί ως υπόδειξη του κουμπιού All values should be encoded in base64 Όλες οι τιμές πρέπει να είναι κωδικοποιημένες σε base64 Example of script generating structured output: Παράδειγμα σεναρίου που παράγει δομημένη έξοδο: My Text Το κείμενό μου my_image η_εικόνα_μου My Tooltip Η υπόδειξή μου Text only Μόνο κείμενο Icon only Μόνο εικονίδιο Structured Δομημένο Select Icon File Επιλογή του αρχείου εικονιδίου Images (*.png *.svg *.xpm *.jpg) Εικόνες (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Custom Command" Desktop Entry/Comment: "Displays the output of a CLI command" ================================================ FILE: plugin-customcommand/translations/customcommand_en_GB.ts ================================================ ColorLabel Click to change color Click to change colour Select Color Select Colour LXQtCustomCommandConfiguration Custom Command Configuration Custom Command Configuration Display Display Use icon from theme or browse file Use icon from theme or browse file Run with "bash -c" Run with "bash -c" Select Font Select Font Text Text Command Command Font Font px px %1 %1 Use %1 to display command output Use %1 to display command output Icon Icon Browse Browse Autorotate when the panel is vertical Autorotate when the panel is vertical Output format: Output format: ... ... echo Configure... echo Configure... Command to run Command to run Max Width Max Width Repeat command after: Repeat command after: Text Color Text Colour Reset Reset second(s) second(s) Tooltip Tooltip Continuous output (processed line by line) Continuous output (processed line by line) Mouse Commands Mouse Commands Click Click Wheel Up Wheel Up Wheel Down Wheel Down command outputs plain text to be used as text of the button command outputs plain text to be used as the text of the button command outputs icon in form of: command outputs icon in form of: theme name theme name name of icon resolved to image based on XDG spec name of icon resolved to image based on XDG spec image file path image file path image data stream image data stream plain image stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Images (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_es.desktop.yaml ================================================ Desktop Entry/Name: "Comando personalizado" Desktop Entry/Comment: "Muestra la salida de un comando para la línea de órdenes" ================================================ FILE: plugin-customcommand/translations/customcommand_es.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Configuración del comando personalizado Display Mostrar Use icon from theme or browse file Use el icono del tema o busque el archivo Run with "bash -c" Ejecutar con «bash -c» Select Font Elegir la tipografía Text Texto Command Comando Font Tipografía px px %1 %1 Use %1 to display command output Usar %1 para mostrar la salida del comando Icon Icono Browse Explorar Autorotate when the panel is vertical Autorotar cuando el panel esté en vertical Output format: ... echo Configure... echo Configurar... Command to run Comando a ejecutar Max Width Ancho máximo Repeat command after: Repetir el comando tras: Text Color Reset second(s) segundo(s) Tooltip Continuous output (processed line by line) Mouse Commands Comandos del ratón Click Clic Wheel Up Rueda hacia arriba Wheel Down Rueda hacia abajo command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Seleccionar el archivo del icono Images (*.png *.svg *.xpm *.jpg) Imágenes (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_et.desktop.yaml ================================================ Desktop Entry/Name: "Kohandatud käsud" Desktop Entry/Comment: "Kohandatud käsud kuvavad käsurea väljundit" ================================================ FILE: plugin-customcommand/translations/customcommand_et.ts ================================================ ColorLabel Click to change color Värvi muutmiseks klõpsi Select Color Vali värv LXQtCustomCommandConfiguration Custom Command Configuration Kohandatud käskude seadistamine Display Liides Use icon from theme or browse file Kasuta teemale vastavat ikooni või vali oma Run with "bash -c" Käivita „bash -c“ abil Select Font Vali font Text Tekst Command Käsk Font Font px pikslit %1 %1 Use %1 to display command output Käsu väljundi kuvamiseks kasuta %1 Icon Ikoon Browse Sirvi Autorotate when the panel is vertical Kui paneel asub püstloodis, siis pööra automaatselt Output format: Väljundvorming: ... ... echo Configure... Seadista echo... Command to run Käivitatav käsk Max Width Suurim laius Repeat command after: Käsu kordamise aeg: Text Color Teksti värv Reset Lähtesta second(s) sekund(it) Tooltip Kohtspikker Continuous output (processed line by line) Pidev väljund (töödeldud ridahaaval) Mouse Commands Hiirekäsud Click Klõpsimine Wheel Up Ratta viibe üles Wheel Down Ratta viibe alla command outputs plain text to be used as text of the button käsu väljundiks on tavatekst, mida saab kasutada nupu tekstina command outputs icon in form of: käsu väljundiks on ikoon järgmises vormingus: theme name kujunduse nimi name of icon resolved to image based on XDG spec ikooni nimi, mis järgib pildi nime vastavalt XDG spetsifikatsioonile image file path pildifaili asukoht image data stream pildi andmevoog plain image stream pildi tavaline sisuvoog base64 encoded image data stream base64 kodeeringus pildi sisuvoog as above but base64 encoded sama, kui ülal, aga base64 kodeeringus command outputs structured variables to be used for button visualization in form of: käsi väljundiks on struktureeritud muutujad, mida saab kasutada nupu visualiseerimiseks järgmises vormingus: name1:base64value1 name2:base64value2 ... nimi1:base64väärtus1 nimi2:base64väärtus2 ... Handled names are: Käsitletavad nimed on: string to be used as text of the button sõne, mida kasutatakse nupu tekstina icon to be shown in the button, in the same form as explained before ikoon, mida kuvatakse nupul, kasutusel on eespool kirjeldatud vorming string to be used as tooltip of the button sõne, mida kasutatakse nupu kohtvihjena All values should be encoded in base64 Kõik väärtused peaks olema kodeeritud base64-na Example of script generating structured output: Skripti näidis, mis lood struktureeritud sisu: My Text Minu tekst my_image minu_pilt My Tooltip Minu kohtspikker Text only Ainult tekst Icon only Ainult ikoon Structured Struktureeritud Select Icon File Vali ikooni fail Images (*.png *.svg *.xpm *.jpg) Pildid (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_fi.desktop.yaml ================================================ Desktop Entry/Name: "Mukautettu komento" Desktop Entry/Comment: "Näyttää komentokehotteessa suoritettavan ohjelman tulosteen" ================================================ FILE: plugin-customcommand/translations/customcommand_fi.ts ================================================ ColorLabel Click to change color Napsauta muuttaaksesi väriä Select Color Valitse väri LXQtCustomCommandConfiguration Custom Command Configuration Mukautetun komennon asetukset Display Ulkoasu Use icon from theme or browse file Käytä teeman kuvaketta tai selaa tiedostoa Run with "bash -c" Suorita lisäämällä "bash -c" komennon alkuun Select Font Valitse fontti Text Teksti Command Komento Font Fontti px px %1 %1 Use %1 to display command output Käytä %1 komennon tuloksen näyttämiseen Icon Kuvake Browse Selaa Autorotate when the panel is vertical Kierrä automaattisesti kun paneeli on pystysuorassa Output format: Tulosteen muoto: ... ... echo Configure... echo Määritä... Command to run Suoritettava komento Max Width Enimmäisleveys Repeat command after: Toista komento viiveellä: Text Color Tekstin väri Reset Palauta second(s) sekunti(a) Tooltip Työkaluvihje Continuous output (processed line by line) Mouse Commands Hiirikomennot Click Napsautus Wheel Up Vieritys ylös Wheel Down Vieritys alas command outputs plain text to be used as text of the button komennon tekstimuotoista tulostetta käytetään painikkeen tekstinä command outputs icon in form of: theme name teeman nimi name of icon resolved to image based on XDG spec image file path kuvan sijainti image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Valitse kuvaketiedosto Images (*.png *.svg *.xpm *.jpg) Kuvat (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_fr.desktop.yaml ================================================ Desktop Entry/Name: "Commande personalisée" Desktop Entry/Comment: "Affiche la sortie d'une commande cli" ================================================ FILE: plugin-customcommand/translations/customcommand_fr.ts ================================================ ColorLabel Click to change color Cliquez pour changer la couleur Select Color Sélectionner la couleur LXQtCustomCommandConfiguration Custom Command Configuration Configuration de commande personnalisée Display Affichage Use icon from theme or browse file Utiliser l'icône du thème ou chercher un fichier Run with "bash -c" Exécuter avec "bash -c" Select Font Sélectionnez la police Text Texte Command Commande Font Police px px %1 %1 Use %1 to display command output Utiliser %1 pour afficher la sortie de la commande Icon Icône Browse Parcourir Autorotate when the panel is vertical Rotation automatique lorsque le tableau de bord est vertical Output format: ... echo Configure... echo configuration... Command to run Commande à exécuter Max Width Largeur maximale Repeat command after: Répéter la commande après : Text Color Couleur du texte Reset Réinitialiser second(s) seconde(s) Tooltip Info-bulle Continuous output (processed line by line) Mouse Commands Commandes de la souris Click Cliquer Wheel Up Roue vers le haut Wheel Down Roue vers le bas command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Sélectionnez le fichier d'icône Images (*.png *.svg *.xpm *.jpg) Images (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_he.desktop.yaml ================================================ Desktop Entry/Name: "פקודה משלך" Desktop Entry/Comment: "מציג פלט משורת הפקודה" ================================================ FILE: plugin-customcommand/translations/customcommand_he.ts ================================================ ColorLabel Click to change color לחיצה לשינוי צבע Select Color בחירת צבע LXQtCustomCommandConfiguration Custom Command Configuration הגדרות פקודה משלך Display תצוגה Use icon from theme or browse file להשתמש בסמל מערכת העיצוב או לבחור קובץ Run with "bash -c" הפעלה עם „bash -c” Select Font בחירת גופן Text טקסט Command פקודה Font גופן px פיקסלים %1 %1 Use %1 to display command output להשתמש ב־%1 להצגת פלט הפקודה Icon סמל Browse עיון Autorotate when the panel is vertical לסובב אוטומטית כאשר הלוח הוא אנכי Output format: תבנית פלט: ... echo Configure... echo הגדרה… Command to run פקודה להרצה Max Width רוחב מרבי Repeat command after: לחזור על הפקודה לאחר: Text Color צבע טקסט Reset איפוס second(s) שניות Tooltip חלונית מידע Continuous output (processed line by line) פלט רציף (מעובד שורה אחר שורה) Mouse Commands פקודות עכבר Click לחיצה Wheel Up גלגלת למעלה Wheel Down גלגלת למטה command outputs plain text to be used as text of the button הפקודה פולטת טקסט פשוט לשימוש בתור הטקסט של הכפתור command outputs icon in form of: הפקודה פולטת סמל בצורת: theme name שם ערכת העיצוב name of icon resolved to image based on XDG spec שם הסמל נפתר לתמונה לפי מפרט XDG image file path נתיב קובץ תמונה image data stream תזרים נתוני תמונה plain image stream תזרים תמונה פשוטה base64 encoded image data stream תזרים נתוני תמונה בקידוד base64 as above but base64 encoded כמו לעיל אבל בקידוד base64 command outputs structured variables to be used for button visualization in form of: הפקודה פולטת משתנים במבנים מוסכמים לשימוש להצגת כפתורים בצורת: name1:base64value1 name2:base64value2 ... שם1:ערך1ב־base64 שם2:ערך2ב־base64 … Handled names are: השמות שמטופלים הם: string to be used as text of the button מחרוזת לשימוש כטקסט הכפתור icon to be shown in the button, in the same form as explained before סמל שיופיע על הכפתור, באותה צורה כפי שכבר הוסבר string to be used as tooltip of the button מחרוזת לשימוש כחלונית עצה של הכפתור All values should be encoded in base64 את כל הערכים יש לקודד ב־base64 Example of script generating structured output: דוגמה לסקריפט שמייצר פלט בתבנית מוסכמת: My Text הטקסט שלי my_image התמונה_שלי My Tooltip חלונית העצה שלי Text only טקסט בלבד Icon only סמל בלבד Structured תבנית מוסכמת Select Icon File בחירת קובץ סמל Images (*.png *.svg *.xpm *.jpg) תמונות (‎*.png‏ ‎*.svg‏ ‎*.xpm‏ ‎*.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_hr.desktop.yaml ================================================ Desktop Entry/Name: "Prilagođena naredba" Desktop Entry/Comment: "Prikazuje rezultat cli naredbe" ================================================ FILE: plugin-customcommand/translations/customcommand_hr.ts ================================================ ColorLabel Click to change color Klikni za mijenjanje boje Select Color Odaberi boju LXQtCustomCommandConfiguration Custom Command Configuration Prilagođena naredba – konfiguracija Display Prikaz Use icon from theme or browse file Koristi ikonu teme ili odaberi datoteku Run with "bash -c" Pokreni s "bash -c" Select Font Odaberi font Text Tekst Command Naredba Font Font px px %1 %1 Use %1 to display command output Koristi %1 za prikaz rezultata naredbe Icon Ikona Browse Odaberi Autorotate when the panel is vertical Automatski okreni kad ploča stoji okomito Output format: Izlazni format: ... ... echo Configure... echo konfiguriraj … Command to run Naredba koja će se pokrenuti Max Width Maks. širina Repeat command after: Ponovi naredbu nakon: Text Color Boja teksta Reset Resetiraj second(s) s Tooltip Savjet za alat Continuous output (processed line by line) Kontinuirani rezultati (obrađeni redak po redak) Mouse Commands Naredbe funkcija miša Click Pritiskanje tipke Wheel Up Okretanje kotačića prema gore Wheel Down Okretanje kotačića prema dolje command outputs plain text to be used as text of the button naredba ispisuje običan tekst koji će se koristiti kao tekst gumba command outputs icon in form of: naredba ispisuje ikonu u obliku: theme name ime teme name of icon resolved to image based on XDG spec ime ikone određeno za sliku na temelju XDG specifikacije image file path putanja slikovne datoteke image data stream plain image stream base64 encoded image data stream as above but base64 encoded kao gore, ali kodirano u base64 formatu command outputs structured variables to be used for button visualization in form of: naredba ispisuje strukturirane varijable koje će se koristiti za vizualizaciju gumba u obliku: name1:base64value1 name2:base64value2 ... name1:base64value1 name2:base64value2 … Handled names are: Obrađena imena su: string to be used as text of the button znakovni niz koji će se koristiti kao tekst gumba icon to be shown in the button, in the same form as explained before ikona koja će se prikazati u gumbu, u istom obliku kao što je prethodno objašnjeno string to be used as tooltip of the button znakovni niz koji će se koristiti kao opis gumba All values should be encoded in base64 Sve vrijednosti moraju biti kodirane u base64 formatu Example of script generating structured output: Primjer skripta koji generira strukturirani rezultat: My Text Moj tekst my_image moja_slika My Tooltip Moj savjet za alat Text only Samo tekst Icon only Samo ikona Structured Strukturirano Select Icon File Odaberi datoteku ikone Images (*.png *.svg *.xpm *.jpg) Slike (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_hu.desktop.yaml ================================================ Desktop Entry/Name: "Egyéni parancs" Desktop Entry/Comment: "Egy cli parancs kimenetetét jeleníti meg" ================================================ FILE: plugin-customcommand/translations/customcommand_hu.ts ================================================ ColorLabel Click to change color Kattintson a szín megváltoztatásához Select Color Szín kiválasztása LXQtCustomCommandConfiguration Custom Command Configuration Egyéni parancs konfiguráció Display Megjelenés Use icon from theme or browse file Ikon használata ikontémából vagy fájl tallózása Run with "bash -c" Futtatás "bash -c"-vel Select Font Betűtípus kiválasztása Text Szöveg Command Parancs Font Betűtípus px px %1 %1 Use %1 to display command output %1 használata a parancskimenet megjelenítéséhez Icon Ikon Browse Tallózás Autorotate when the panel is vertical Automatikus forgatás, amikor a panel függőleges Output format: Kimeneti formátum: ... echo Configure... echo Konfigurálás… Command to run Futtatandó parancs Max Width Maximum szélesség Repeat command after: Parancs ismétlése ezután: Text Color Szöveg színe Reset Visszaállítás second(s) másodperc Tooltip Buboréksúgó Continuous output (processed line by line) Folyamatos kimenet (soronkénti feldolgozás) Mouse Commands Egérparancsok Click Kattintás Wheel Up Felfelé görgetés Wheel Down Lefelé görgetés command outputs plain text to be used as text of the button a parancs egyszerű szöveges kimenetet ad, amely a gomb felirataként szolgál command outputs icon in form of: a parancs az alábbi formátumban adja meg az ikont: theme name téma neve name of icon resolved to image based on XDG spec az ikon neve az XDG-szabvány alapján képfájllá feloldva image file path képfájl útvonala image data stream képadatfolyam plain image stream egyszerű képadatfolyam base64 encoded image data stream base64 kódolású képadatfolyam as above but base64 encoded mint fent, de base64 kódolással command outputs structured variables to be used for button visualization in form of: a parancs strukturált változókat ad vissza a gomb megjelenítéséhez, az alábbi formában: name1:base64value1 name2:base64value2 ... név1:base64érték1 név2:base64érték2 … Handled names are: A kezelt nevek a következők: string to be used as text of the button a gomb felirataként használandó karakterlánc icon to be shown in the button, in the same form as explained before a gombban megjelenítendő ikon, a korábban ismertetett formában string to be used as tooltip of the button a gomb buboréksúgójaként használandó karakterlánc All values should be encoded in base64 Minden érték base64 kódolású legyen Example of script generating structured output: Példa strukturált kimenetet generáló parancsfájlra: My Text Az én szövegem my_image az_én_képem My Tooltip Az én buboréksúgóm Text only Csak szöveg Icon only Csak ikon Structured Strukturált Select Icon File Ikonfájl kiválasztása Images (*.png *.svg *.xpm *.jpg) Képek (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_it.desktop.yaml ================================================ Desktop Entry/Name: "Comando personalizzato" Desktop Entry/Comment: "Mostra il risultato di un comando da terminale" ================================================ FILE: plugin-customcommand/translations/customcommand_it.ts ================================================ ColorLabel Click to change color Cliccare per cambiare colore Select Color Seleziona colore LXQtCustomCommandConfiguration Custom Command Configuration Configurazione comando personalizzato Display Visualizzazione Use icon from theme or browse file Usa icona del tema o seleziona Run with "bash -c" Esegui con "bash -c" Select Font Selezione carattere Text Testo Command Comando Font Carattere px px %1 %1 Use %1 to display command output Usare %1 per mostrare il risultato del comando Icon Icona Browse Seleziona Autorotate when the panel is vertical Ruota automaticamente se il pannello è verticale Output format: Formato di output: ... ... echo Configure... echo Configura... Command to run Comando da eseguire Max Width Larghezza massima Repeat command after: Ripeti comando ogni: Text Color Colore del testo Reset Ripristina second(s) secondo/i Tooltip Suggerimento Continuous output (processed line by line) Output continuo (elaborato riga per riga) Mouse Commands Comandi per il mouse Click Clic Wheel Up Rotellina insù Wheel Down Rotellina ingiù command outputs plain text to be used as text of the button il comando genera testo semplice da utilizzare come testo del pulsante command outputs icon in form of: il comando genera un'icona nel formato: theme name nome del tema name of icon resolved to image based on XDG spec nome dell'icona risolto in immagine in base alle specifiche XDG image file path percorso del file immagine image data stream flusso di dati di immagine plain image stream flusso di immagine semplice base64 encoded image data stream flusso di dati immagine codificato base64 as above but base64 encoded come sopra ma codificato base64 command outputs structured variables to be used for button visualization in form of: il comando genera variabili strutturate da utilizzare per la visualizzazione del pulsante sotto forma di: name1:base64value1 name2:base64value2 ... nome1:base64valore1 nome2_base64valore2 ... Handled names are: I nomi gestiti sono: string to be used as text of the button stringa da utilizzare come testo del pulsante icon to be shown in the button, in the same form as explained before icona da mostrare nel pulsante, nella stessa forma spiegata in precedenza string to be used as tooltip of the button stringa da utilizzare come suggerimento del pulsante All values should be encoded in base64 Tutti i valori devono essere codificati in base64 Example of script generating structured output: Esempio di script che genera un output strutturato: My Text Testo mio my_image immagine_mio My Tooltip Suggerimento mio Text only Solo testo Icon only Solo icona Structured Strutturato Select Icon File Seleziona file icona Images (*.png *.svg *.xpm *.jpg) Immagini (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ja.desktop.yaml ================================================ Desktop Entry/Name: "カスタムコマンド" Desktop Entry/Comment: "CLI(コマンドラインインタフェース) の出力を表示します" ================================================ FILE: plugin-customcommand/translations/customcommand_ja.ts ================================================ ColorLabel Click to change color クリックして色を変更します Select Color 色の選択 LXQtCustomCommandConfiguration Custom Command Configuration カスタムコマンドの設定 Display 表示 Use icon from theme or browse file テーマからアイコンを使用するかファイルを参照します Run with "bash -c" "bash -c" で実行する Select Font フォントの選択 Text 文字列 Command コマンド Font フォント px ピクセル %1 %1 Use %1 to display command output コマンドの出力を表示するために %1 を使用します Icon アイコン Browse 参照 Autorotate when the panel is vertical パネルが垂直ならば回転する Output format: 出力形式: ... ... echo Configure... echo 設定して下さい... Command to run 実行するコマンド Max Width 最大幅 Repeat command after: 次の時間の後にコマンドを繰り返す: Text Color テキストの色 Reset リセット second(s) Tooltip ツールチップ Continuous output (processed line by line) 連続出力(行ごとに処理) Mouse Commands マウスのコマンド Click クリック Wheel Up ホイールアップ Wheel Down ホイールダウン command outputs plain text to be used as text of the button コマンドはボタンのテキストとして使用するプレーンテキストを出力します command outputs icon in form of: コマンドは以下の形式でアイコンを出力します: theme name テーマ名 name of icon resolved to image based on XDG spec XDG の仕様に基づいて画像化されたアイコン名 image file path 画像ファイルのパス image data stream 画像データストリーム plain image stream プレーン画像ストリーム base64 encoded image data stream Base64 でエンコードされた画像データストリーム as above but base64 encoded 上と同じだが base64 でエンコードされている command outputs structured variables to be used for button visualization in form of: コマンドはボタンの表示に使用する構造化の変数を次の形式で出力します: name1:base64value1 name2:base64value2 ... name1:base64値1 name2:base64値2 ... Handled names are: 処理される name は次の通りです: string to be used as text of the button ボタンのテキストとして使用する文字列 icon to be shown in the button, in the same form as explained before 前に説明したのと同じ形式でボタンに表示されるアイコン string to be used as tooltip of the button ボタンのツールチップとして使用する文字列 All values should be encoded in base64 すべての値は base64 でエンコードされる必要があります Example of script generating structured output: 構造化された出力を生成するスクリプトの例: My Text 自分のテキスト my_image my_image My Tooltip 自分のツールチップ Text only テキストのみ Icon only アイコンのみ Structured 構造化 Select Icon File アイコンファイルの選択 Images (*.png *.svg *.xpm *.jpg) 画像 (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ka.desktop.yaml ================================================ Desktop Entry/Name: "მორგებული ბრძანება" Desktop Entry/Comment: "აჩვენებს CLI-ის ბრძანების გამოტანილ ინფორმაციას" ================================================ FILE: plugin-customcommand/translations/customcommand_ka.ts ================================================ ColorLabel Click to change color დააწკაპუნეთ ფერის შესაცვლელად Select Color აირჩიეთ ფერი LXQtCustomCommandConfiguration Custom Command Configuration მომხმარებლის ბრძანების მორგება Display ჩვენება Use icon from theme or browse file გამოიყენეთ ხატულა თემიდან ან აირჩიეთ ფაილი Run with "bash -c" გაშვება ბრძანებით "bash -c" Select Font აირჩიეთ ფონტი Text ტექსტი Command ბრძანება Font ფონტი px პქს %1 %1 Use %1 to display command output %1-ის გამოყენება ბრძანების გამოტანილი ინფორმაციის საჩვენებლად Icon ხატულა Browse პოვნა Autorotate when the panel is vertical ავტომობრუნება, როცა პანელი ვერტიკალურია Output format: გამოტანის ფორმატი: ... ... echo Configure... echo მორგება... Command to run გასაშვები ბრძანება Max Width მაქს სიგანე Repeat command after: ბრძანების გამეორების დრო: Text Color ტექსტის ფერი Reset ჩამოყრა second(s) წამი Tooltip მინიშნება Continuous output (processed line by line) უწყვეტი გამოტანა (დამუშავდება თითო-თითო ხაზი) Mouse Commands თაგუნას ბრძანებები Click წკაპი Wheel Up რგოლი მაღლა Wheel Down რგოლი დაბლა command outputs plain text to be used as text of the button ბრძანება იძლევა უბრალო ტექსტს, რომელიც ღილაკის ტექსტად გამოიყენება command outputs icon in form of: ბრძანება იძლევა ხატულას ფორმით: theme name თემის სახელი name of icon resolved to image based on XDG spec ხატულას სახელი, რომელიც ამოიხსნა გამოსახულებაში XDG სპეციფიკაციაზე დაყრდნობით image file path გამოსახულების ფაილის ბილიკი image data stream გამოსახულების მონაცემების ნაკადი plain image stream უბრალო გამოსახულების ნაკადი base64 encoded image data stream base64-ით კოდირებული გამოსახულების მონაცემების ნაკადი as above but base64 encoded როგორც მაღლაა, მაგრამ კოდირებული base64-ში command outputs structured variables to be used for button visualization in form of: ბრძანება იძლევა სტრუქტურის მქონე ცვლადებს, რომელიც გამოიყენება ღილაკის ვიზუალიზაციისთვის ფორმაში: name1:base64value1 name2:base64value2 ... სახელი1:base64value1 სახელი2:base64value2 ... Handled names are: დამუშავებული სახელებია: string to be used as text of the button სტრიქონი ღილაკის ტექსტად გამოსაყენებლად icon to be shown in the button, in the same form as explained before ღილაკზე საჩვენებელი ხატულა იგივე ფორმაში, როგორც ეს მაღლაა ახსნილი string to be used as tooltip of the button სტრიქონი ღილაკის მინიშნებად გამოსაყენებლად All values should be encoded in base64 ყველა მნიშვნელობა უნდა იყოს კოდირებული base64-ში Example of script generating structured output: სკრიპტის მიერ გენერირებული სტრუქტურის მქონე გამოტანის მაგალითი: My Text ჩემი ტექსტი my_image ჩემი_გამოსახულება My Tooltip ჩემი მინიშნება Text only მხოლოდ ტექსტი Icon only მხოლოდ ხატულა Structured სტრუქტურის მქონე Select Icon File აირჩიეთ ხატულას ფაილი Images (*.png *.svg *.xpm *.jpg) გამოსახულებები (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_kk.ts ================================================ ColorLabel Click to change color Түсті өзгерту үшін шерту Select Color Түсті таңдау LXQtCustomCommandConfiguration Custom Command Configuration Пайдаланушылық команда баптаулары Display Көрсету Use icon from theme or browse file Темадан таңбашаны қолдану немесе файлды шолу Run with "bash -c" "bash -c" арқылы іске қосу Select Font Қаріпті таңдау Text Мәтін Command Команда Font Қаріп px пикс %1 %1 Use %1 to display command output Команда шығысын көрсету үшін %1 қолдану Icon Таңбаша Browse Шолу Autorotate when the panel is vertical Панель вертикалды болғанда автоматты түрде бұру Output format: Шығыс пішімі: ... ... echo Configure... echo Баптау... Command to run Орындалатын команда Max Width Максималды ені Repeat command after: Команданы қайталау уақыты: Text Color Мәтін түсі Reset Қалпына келтіру second(s) секунд Tooltip Қалқымалы көмек Continuous output (processed line by line) Үздіксіз шығыс (жолма-жол өңделеді) Mouse Commands Тышқан командалары Click Шерту Wheel Up Дөңгелекті жоғары Wheel Down Дөңгелекті төмен command outputs plain text to be used as text of the button команда батырма мәтіні ретінде пайдаланылатын жай мәтінді шығарады command outputs icon in form of: команда таңбашаны келесі пішімде шығарады: theme name тема аты name of icon resolved to image based on XDG spec XDG спецификациясы негізіндегі суретке сәйкес келетін таңбаша аты image file path сурет файлының жолы image data stream сурет деректерінің ағыны plain image stream жай сурет ағыны base64 encoded image data stream base64 форматында кодталған сурет деректерінің ағыны as above but base64 encoded жоғарыдағыдай, бірақ base64 форматында кодталған command outputs structured variables to be used for button visualization in form of: команда батырманы визуализациялау үшін пайдаланылатын құрылымдық айнымалыларды келесі пішімде шығарады: name1:base64value1 name2:base64value2 ... name1:base64value1 name2:base64value2 ... Handled names are: Өңделетін атаулар: string to be used as text of the button батырма мәтіні ретінде пайдаланылатын жол icon to be shown in the button, in the same form as explained before батырмада көрсетілетін таңбаша, жоғарыда түсіндірілгендей string to be used as tooltip of the button батырманың қалқымалы көмегі ретінде пайдаланылатын жол All values should be encoded in base64 Барлық мәндер base64 форматында кодталуы тиіс Example of script generating structured output: Құрылымдық шығысты генерациялайтын скрипт мысалы: My Text Менің мәтінім my_image менің_суретім My Tooltip Менің қалқымалы көмегім Text only Тек мәтін Icon only Тек таңбаша Structured Құрылымдық Select Icon File Таңбаша файлын таңдау Images (*.png *.svg *.xpm *.jpg) Суреттер (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ko.desktop.yaml ================================================ Desktop Entry/Name: "사용자 지정 명령" Desktop Entry/Comment: "cli 명령의 출력을 표시합니다" ================================================ FILE: plugin-customcommand/translations/customcommand_ko.ts ================================================ ColorLabel Click to change color 색상 변경하려면 클릭 Select Color 색상 선택하기 LXQtCustomCommandConfiguration Custom Command Configuration 사용자 지정 명령 구성 Display 디스플레이 Use icon from theme or browse file 테마에서 아이콘 사용 또는 파일 찾아보기 Run with "bash -c" "bash -c"로 실행 Select Font 글꼴 선택 Text 텍스트 Command 명령 Font 글꼴 px 픽셀 %1 %1 Use %1 to display command output 명령 출력을 표시하려면 %1 사용 Icon 아이콘 Browse 찾아보기 Autorotate when the panel is vertical 패널이 수직일 때 자동 회전 Output format: 출력 형식: ... ... echo Configure... 에코 구성하기... Command to run 실행할 명령 Max Width 최대 너비 Repeat command after: 다음 시간 이후에 명령 반복: Text Color 텍스트 색상 Reset 재설정 second(s) Tooltip 툴팁 Continuous output (processed line by line) 연속 출력 (한 줄씩 처리됨) Mouse Commands 마우스 명령 Click 클릭 Wheel Up 휠 위로 Wheel Down 휠 아래로 command outputs plain text to be used as text of the button 명령어는 버튼의 텍스트로 사용될 일반 텍스트를 출력합니다 command outputs icon in form of: 명령어 출력 아이콘 형식: theme name 테마 이름 name of icon resolved to image based on XDG spec XDG 사양에 따라 이미지로 확인된 아이콘 이름 image file path 이미지 파일 경로 image data stream 이미지 데이터 스트림 plain image stream 일반 이미지 스트림 base64 encoded image data stream base64로 인코딩된 이미지 데이터 스트림 as above but base64 encoded 위와 같지만 base64로 인코딩됨 command outputs structured variables to be used for button visualization in form of: 명령은 버튼 시각화에 사용될 구조화된 변수를 다음과 같은 형태로 출력함: name1:base64value1 name2:base64value2 ... 이름1:base64value1 이름2:base64value2 ... Handled names are: 처리된 이름들: string to be used as text of the button 버튼의 텍스트로 사용할 문자열 icon to be shown in the button, in the same form as explained before 이전에 설명한 것과 동일한 형식으로 버튼에 표시될 아이콘 string to be used as tooltip of the button 버튼의 툴팁으로 사용할 문자열 All values should be encoded in base64 모든 값은 base64로 인코딩해야 합니다 Example of script generating structured output: 구조화된 출력을 생성하는 스크립트의 예: My Text 내 글 my_image 내_이미지 My Tooltip 내 툴팁 Text only 텍스트만 Icon only 아이콘만 Structured 구조화됨 Select Icon File 아이콘 파일 선택 Images (*.png *.svg *.xpm *.jpg) 이미지 (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kiragiro kikyo" Desktop Entry/Comment: "Kano kalaga ebiva mu kiragiro ky'obeera okataddemu" ================================================ FILE: plugin-customcommand/translations/customcommand_lg.ts ================================================ ColorLabel Click to change color Okukyusa langi nyiga wano Select Color Londa Langi LXQtCustomCommandConfiguration Custom Command Configuration Enteekateeka ez'akalaga ebiva mu kiragiro kikyo Display Endabika Use icon from theme or browse file Tegeka wano fayiro ey'akafaananyi gy'esangibwa Run with "bash -c" Ekiragiro kitandikise "bash -c" Select Font Londa enkula y'ennukuta Text Ekiwandikibwa ku ppeesa Command Ebifa ku kiragiro Font Nkula y'ennukuta px px %1 %1 Use %1 to display command output Kozesa %1 okulaga ebiva mu kiragiro Icon Kafaananyi Browse Noonya Autorotate when the panel is vertical Eppeesa lyetereeze okujja ku lubaawo bwe lubeera lwa mu busimba Output format: Empandika y'ebiva mu: ... ... echo Configure... wandika Teekateeka... Command to run Ekiragiro ekibeera kitandikibwa Max Width Kkomo ly'obugazi bw'eppeesa Repeat command after: Ekiragiro kiddengamu oluvannyuma lw'ekiseera kino: Text Color Langi Ya Bigambo Reset Masookawaza second(s) sikonda Tooltip Magezi Continuous output (processed line by line) Ebiva mu bijje tungatunga (omulimu gutambule lunyiriri ku lunyiriri) Mouse Commands Ebiragiro ebitandikibwa akasongesebwa Click Bw'onyiga eppeesa lyako Wheel Up Namuziga ya ko bw'oginyoolera ku kkono Wheel Down Namuziga ya ko bw'oginyoolera ku ddyo command outputs plain text to be used as text of the button ekiragiro kikolawo ebigambo ebinaalabikira ku ppeesa command outputs icon in form of: ekiragiro kikolawo akafaananyi ak'ekika kya: theme name erinnya ly'olulyo name of icon resolved to image based on XDG spec amateeka ga XDG ge gagobererwa okukwataganya akafaananyi akayunzi n'erinnya lya ko image file path obusangiro bwa fayiro y'akafaananyi image data stream kisinde kya data y'akafaananyi plain image stream ekifaananyi ekiwerezebwa base64 encoded image data stream kisinde kya data y'akafaananyi ey'enkongojja ya kika kya base64 as above but base64 encoded ekifaananyi ekiwerezebwa nga kikongojedwa mu nkola ya base64 command outputs structured variables to be used for button visualization in form of: ekiragiro kivaamu ebigambo ebikongozzi ebirimu ebitundu nga ebigambo ebyo bikozesebwa mu kuteekawo amapeesa era nga byaakula bityi: name1:base64value1 name2:base64value2 ... linnya1:kikongojjebase641 linnya2:kikongojjebase642 ... Handled names are: Amannya agasoboke ge: string to be used as text of the button kigambo ekinaalabikaranga ku ppeesa icon to be shown in the button, in the same form as explained before kafaananyi akanaalabikiranga ku ppeesa string to be used as tooltip of the button ekigambo ekibeeranga amagezi aganaawebwanga ku ppeesa All values should be encoded in base64 ebikongojje byonna bya kukongojjebwa mu nkola ya base64 Example of script generating structured output: Ebiragiro ebiyunge ebimu ebikola ebivaamu ebyawulidwa mu bitundu ebigereke: My Text Bigambo Byange my_image kifaananyi_kyange My Tooltip Kulagirira Kwange Text only Bigambo byokka Icon only Kafaananyi kokka Structured Bitundu ebigereke Select Icon File Londa fayiro ey'akafaananyi Images (*.png *.svg *.xpm *.jpg) Bifaananyi (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_lt.desktop.yaml ================================================ Desktop Entry/Name: "Tinkinta komanda" Desktop Entry/Comment: "Rodo komandų eilutės komandos išvestį" ================================================ FILE: plugin-customcommand/translations/customcommand_lt.ts ================================================ ColorLabel Click to change color Spustelėkite norėdami pakeisti spalvą Select Color Pasirinkti spalvą LXQtCustomCommandConfiguration Custom Command Configuration Tinkintos komandos konfigūracija Display Rodymas Use icon from theme or browse file Naudoti piktogramą iš apipavidalinimo arba naršyti failą Run with "bash -c" Paleisti naudojant „bash -c“ Select Font Pasirinkti šriftą Text Tekstas Command Komanda Font Šriftas px piks. %1 %1 Use %1 to display command output Komandos išvesties rodymui naudoti %1 Icon Piktograma Browse Naršyti Autorotate when the panel is vertical Automatiškai pasukti, kai skydelis yra vertikalus Output format: Išvesties formatas: ... ... echo Configure... echo Konfigūruoti... Command to run Komanda, kurią paleisti Max Width Didžiausias plotis Repeat command after: Kartoti komandą po: Text Color Teksto spalva Reset Atstatyti second(s) sek. Tooltip Paaiškinimas Continuous output (processed line by line) Nepertraukiama išvestis (apdorojama eilutė po eilutės) Mouse Commands Pelės komandos Click Spustelėjimas Wheel Up Ratuku aukštyn Wheel Down Ratuku žemyn command outputs plain text to be used as text of the button komanda išveda grynąjį tekstą, kuris bus naudojamas kaip mygtuko tekstas command outputs icon in form of: komanda išveda piktogramą štai tokiu pavidalu: theme name apipavidalinimo pavadinimas name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button eilutė, kuri bus naudojama kaip mygtuko tekstas icon to be shown in the button, in the same form as explained before piktograma, kuri bus rodoma mygtuke, tokiu pačiu pavidalu, kaip buvo paaiškinta anksčiau string to be used as tooltip of the button eilutė, kuri bus naudojama kaip mygtuko paaiškinimas All values should be encoded in base64 Example of script generating structured output: My Text Mano tekstas my_image mano_paveikslas My Tooltip Mano paaiškinimas Text only Tik tekstas Icon only Tik piktograma Structured Select Icon File Pasirinkti piktogramos failą Images (*.png *.svg *.xpm *.jpg) Paveikslai (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_lv.desktop.yaml ================================================ Desktop Entry/Name: "Pielāgojama komanda" Desktop Entry/Comment: "Attēlo CLI (termināla/komandrindas) komandas izvadu" ================================================ FILE: plugin-customcommand/translations/customcommand_lv.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Pielāgotās komandas iestatīšana Display Rādīt/ekrāns Use icon from theme or browse file Izmantot ikonu no tēmas vai izvēlēt failu Run with "bash -c" Palaist ar "bash -c" Select Font Izvēlēt šriftu Text Teksts Command Komanda Font Šrifts px piks. %1 %1 Use %1 to display command output Izmantojiet %1, lai parādītu komandas izvadu Icon Ikona Browse Izvēlēt/pārlūkot Autorotate when the panel is vertical Automātiski pagriezt, ja panelis ir vertikāls Output format: ... echo Configure... echo iestatīšana... Command to run Komanda, kuru palaist Max Width Maksimālais platums Repeat command after: Atkārtot komandu pēc: Text Color Reset second(s) sekunde(s) Tooltip Continuous output (processed line by line) Mouse Commands Peles komandas Click Klikšķiniet Wheel Up Ritentiņu augšup Wheel Down Ritentiņu lejup command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Images (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Egendefinert kommando" Desktop Entry/Comment: "Viser utdata for en kommandolinje-kommando" ================================================ FILE: plugin-customcommand/translations/customcommand_nb_NO.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Oppsett av egendefinert kommando Display Visning Use icon from theme or browse file Bruk ikon fra drakt eller velg fil Run with "bash -c" Kjør med «bash -c» Select Font Velg skrift Text Tekst Command Kommando Font Skrift px piksler %1 %1 Use %1 to display command output Bruk %1 for å vise kommando-resultat Icon Ikon Browse Utforsk Autorotate when the panel is vertical Autoroter når panelet er loddrett Output format: ... echo Configure... echo Oppsett… Command to run Kommando å kjøre Max Width Maksimal bredde Repeat command after: Gjenta kommando etter: Text Color Reset second(s) sekund(er) Tooltip Continuous output (processed line by line) Mouse Commands Musekommandoer Click Klikk Wheel Up Musehjul opp Wheel Down Musehjul ned command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Velg ikonfil Images (*.png *.svg *.xpm *.jpg) Bilder (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_nl.desktop.yaml ================================================ Desktop Entry/Name: "Eigen opdracht" Desktop Entry/Comment: "Toont de uitvoer van een terminalopdracht" ================================================ FILE: plugin-customcommand/translations/customcommand_nl.ts ================================================ ColorLabel Click to change color Klik om de kleur te wijzigen Select Color Kleur kiezen LXQtCustomCommandConfiguration Custom Command Configuration Instellingen Display Weergave Use icon from theme or browse file Gebruik het standaardpictogram of kies een bestand Run with "bash -c" Uitvoeren met ‘bash -c’ Select Font Kies een lettertype Text Tekst Command Opdracht Font Lettertype px px %1 %1 Use %1 to display command output %1 gebruiken om uitvoer te tonen Icon Pictogram Browse Bladeren Autorotate when the panel is vertical Automatisch draaien als het paneel verticaal is Output format: Uitvoerformaat: ... echo Configure... echo instellen… Command to run Uit te voeren opdracht Max Width Max. breedte Repeat command after: Opdracht herhalen na: Text Color Tekstkleur Reset Standaardwaarden second(s) second(en) Tooltip Hulpballon Continuous output (processed line by line) Continue uitvoer (regel voor regel) Mouse Commands Muisopdrachten Click Klikken Wheel Up Omhoogscrollen Wheel Down Omlaagscrollen command outputs plain text to be used as text of the button de opdracht die platte tekst als resultaat geeft voor gebruik als knoptekst command outputs icon in form of: de opdracht die een pictogram toont in de vorm van: theme name themanaam name of icon resolved to image based on XDG spec pictogramnaam van afbeelding op basis van XDG-specificatie image file path afbeeldingslocatie image data stream afbeeldingsgegevensstream plain image stream platte-afbeeldingsstream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Kies een pictogrambestand Images (*.png *.svg *.xpm *.jpg) Afbeeldingen (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_oc.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Configuracion de comanda personalizada Display Afichatge Use icon from theme or browse file Utilizar l’icòna del tèma o cercar un fichièr Run with "bash -c" Executar amb « bash -c » Select Font Seleccionatz la polissa Text Tèxt Command Comanda Font Polissa px px %1 %1 Use %1 to display command output Utilizar %1 per afichar la sortida de la comanda Icon Icòna Browse Percórrer Autorotate when the panel is vertical Virar automaticament quand lo panèl es vertical Output format: ... echo Configure... Configuracion d’echo... Command to run Comanda d’executar Max Width Largor maximala Repeat command after: Repetir la comanda aprèp : Text Color Reset second(s) segonda(s) Tooltip Continuous output (processed line by line) Mouse Commands Comandes de la mirga Click Clicar Wheel Up Rodeta amont Wheel Down Rodeta aval command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Seleccionatz lo fichièr d’icòna Images (*.png *.svg *.xpm *.jpg) Imatges (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_pa.ts ================================================ ColorLabel Click to change color ਰੰਗ ਬਦਲਣ ਲਈ ਕਲਿੱਕ ਕਰੋ Select Color ਰੰਗ ਨੂੰ ਚੁਣੋ LXQtCustomCommandConfiguration Custom Command Configuration ਕਸਟਮ ਕਮਾਂਡ ਦੀ ਸੰਰਚਨਾ Display ਡਿਸਪਲੇਅ Use icon from theme or browse file ਥੀਮ ਤੋਂ ਆਈਕਾਨ ਵਰਤੋਂ ਜਾਂ ਫ਼ਾਇਲ ਬਰਾਊਜ਼ ਕਰੋ Run with "bash -c" Select Font ਫ਼ੋਂਟ ਨੂੰ ਚੁਣੋ Text ਲਿਖਤ Command ਕਮਾਂਡ Font ਫ਼ੋਂਟ px %1 %1 Use %1 to display command output Icon ਆਈਕਾਨ Browse ਝਲਕ Autorotate when the panel is vertical Output format: ਆਉਟਪੁੱਟ ਫਾਰਮੈਟ: ... echo Configure... Command to run ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ Max Width ਵੱਧ ਤੋਂ ਵੱਧ ਚੌੜਾਈ Repeat command after: Text Color ਲਿਖਤ ਦਾ ਰੰਗ Reset ਮੁੜ-ਸੈੱਟ second(s) ਸਕਿੰਟ Tooltip Continuous output (processed line by line) Mouse Commands ਮਾਊਂਸ ਕਮਾਡਾਂ Click ਕਲਿੱਕ Wheel Up Wheel Down command outputs plain text to be used as text of the button command outputs icon in form of: theme name ਥੀਮ ਦਾ ਨਾਂ name of icon resolved to image based on XDG spec image file path ਚਿੱਤਰ ਫ਼ਾਇਲ ਦਾ ਮਾਰਗ image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only ਸਿਰਫ਼ ਲਿਖਤ Icon only ਸਿਰਫ਼ ਆਈਕਾਨ Structured Select Icon File ਆਈਕਾਨ ਫ਼ਾਇਲ ਨੂੰ ਚੁਣੋ Images (*.png *.svg *.xpm *.jpg) ਚਿੱਤਰ (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_pl.desktop.yaml ================================================ Desktop Entry/Name: "Własna komenda" Desktop Entry/Comment: "Wyświetla dane wyjściowe wiersza komend" ================================================ FILE: plugin-customcommand/translations/customcommand_pl.ts ================================================ ColorLabel Click to change color Kliknij, aby zmienić kolor Select Color Wybierz kolor LXQtCustomCommandConfiguration Custom Command Configuration Konfiguracja własnej komendy Display Wyświetlanie Use icon from theme or browse file Użyj ikony z motywu lub przeglądaj pliki Run with "bash -c" Uruchom przez „bash -c” Select Font Wybierz czcionkę Text Tekst Command Komenda Font Czcionka px px %1 %1 Use %1 to display command output Użyj % 1, aby wyświetlić wynik polecenia Icon Ikona Browse Przeglądaj Autorotate when the panel is vertical Automatyczne obracanie, gdy panel jest ustawiony w pionie Output format: Format wyjściowy: ... ... echo Configure... echo Konfiguruj… Command to run Komenda do uruchomienia Max Width Maks. szerokość Repeat command after: Powtórz komendę po: Text Color Kolor tekstu Reset Zresetuj second(s) sek Tooltip Podpowiedź Continuous output (processed line by line) Wyjście ciągłe (przetwarzane wiersz po wierszu) Mouse Commands Komendy myszy Click Klik Wheel Up Kółko w górę Wheel Down Kółko w dół command outputs plain text to be used as text of the button polecenie wyprowadza zwykły tekst, który ma być użyty jako tekst przycisku command outputs icon in form of: polecenie wyprowadza ikonę w formie: theme name nazwa motywu name of icon resolved to image based on XDG spec nazwa ikony została rozwiązana na obraz na podstawie specyfikacji XDG image file path ścieżka do pliku obrazu image data stream strumień danych obrazu plain image stream strumień zwykłego obrazu base64 encoded image data stream strumień danych obrazu zakodowany w base64 as above but base64 encoded jak wyżej, ale zakodowany w base64 command outputs structured variables to be used for button visualization in form of: polecenie wyprowadza zmienne strukturalne, które mają być użyte do wizualizacji przycisku w formie: name1:base64value1 name2:base64value2 ... nazwa1:base64nazwa1 nazwa2:base64nazwa2 ... Handled names are: Obsługiwane nazwy to: string to be used as text of the button ciąg znaków, który ma być użyty jako tekst przycisku icon to be shown in the button, in the same form as explained before ikona, która ma być wyświetlana na przycisku, w tej samej formie, jak wyjaśniono wcześniej string to be used as tooltip of the button ciąg znaków, który ma być używany jako podpowiedź przycisku All values should be encoded in base64 Wszystkie wartości powinny być zakodowane w formacie base64 Example of script generating structured output: Przykład skryptu generującego ustrukturyzowane dane wyjściowe: My Text Mój tekst my_image mój_obraz My Tooltip Moja podpowiedź Text only Tylko tekst Icon only Tylko ikona Structured Zbudowany Select Icon File Wybierz plik ikony Images (*.png *.svg *.xpm *.jpg) Obrazy (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_pt.desktop.yaml ================================================ Desktop Entry/Name: "Comando personalizado" Desktop Entry/Comment: "Mostra o resultado do comando" ================================================ FILE: plugin-customcommand/translations/customcommand_pt.ts ================================================ ColorLabel Click to change color Clicar para mudar de cor Select Color Selecionar cor LXQtCustomCommandConfiguration Custom Command Configuration Configuração de comando personalizado Display Mostrar Use icon from theme or browse file Utilizar ícone do tema ou escolher um ficheiro Run with "bash -c" Executar com "bash -c" Select Font Selecione o tipo de letra Text Texto Command Comando Font Tipo de letra px px %1 %1 Use %1 to display command output Utilize %1 para mostrar o resultado do comando Icon Ícone Browse Explorar Autorotate when the panel is vertical Rotação automática se o painel for vertical Output format: Formato de saída: ... ... echo Configure... Configuração de echo... Command to run Comando a executar Max Width Largura máxima Repeat command after: Repetir comando após: Text Color Cor do texto Reset Repor second(s) segundos Tooltip Dica Continuous output (processed line by line) Saída contínua (processada linha por linha) Mouse Commands Comandos com o rato Click Clique Wheel Up Roda para cima Wheel Down Roda para baixo command outputs plain text to be used as text of the button o comando gera texto simples para ser usado como texto do botão command outputs icon in form of: o comando gera um ícone com o seguinte formato: theme name nome do tema name of icon resolved to image based on XDG spec nome do ícone resolvido para imagem com base na especificação XDG image file path caminho do ficheiro de imagem image data stream fluxo de dados de imagem plain image stream fluxo de imagens simples base64 encoded image data stream fluxo de dados de imagem codificado em base64 as above but base64 encoded como acima, mas codificado em base64 command outputs structured variables to be used for button visualization in form of: o comando gera variáveis estruturadas para serem usadas na visualização dos botões na forma de: name1:base64value1 name2:base64value2 ... nome1:valorbase641 nome2:valorbase642 ... Handled names are: Os nomes processados são: string to be used as text of the button frase a ser usada como texto do botão icon to be shown in the button, in the same form as explained before ícone a ser exibido no botão, da mesma forma que explicado anteriormente string to be used as tooltip of the button frase a ser usada como dica do botão All values should be encoded in base64 Todos os valores devem ser codificados em base64 Example of script generating structured output: Exemplo de script que gera saída estruturada: My Text Meu texto my_image minha_imagem My Tooltip Minha dica Text only Apenas texto Icon only Apenas ícone Structured Estruturado Select Icon File Selecionar ficheiro de ícones Images (*.png *.svg *.xpm *.jpg) Imagens (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Comando customizado" Desktop Entry/Comment: "Exibe a saída de um comando cli" ================================================ FILE: plugin-customcommand/translations/customcommand_pt_BR.ts ================================================ ColorLabel Click to change color Clique para mudar a cor Select Color Selecionar Cor LXQtCustomCommandConfiguration Custom Command Configuration Configuração de Comando Personalizado Display Exibição Use icon from theme or browse file Usar o ícone do tema ou buscar arquivo Run with "bash -c" Execute com "bash -c" Select Font Selecionar Fonte Text Texto Command Comando Font Fonte px px %1 %1 Use %1 to display command output Use %1 para mostrar a saída do comando Icon Ícone Browse Navegar Autorotate when the panel is vertical Girar automaticamente quando o painel estiver vertical Output format: Formato de saída: ... ... echo Configure... echo Configurar... Command to run Comando para executar Max Width Largura máxima Repeat command after: Repitir o comando após: Text Color Cor do Texto Reset Redefinir second(s) segundo(s) Tooltip Dica Continuous output (processed line by line) Saída contínua (processada linha por linha) Mouse Commands Comandos do mouse Click Clique Wheel Up Roda para cima Wheel Down Roda para baixo command outputs plain text to be used as text of the button o comando gera texto simples para ser usado como texto do botão command outputs icon in form of: o comando gera um ícone com o seguinte formato: theme name nome do tema name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Selecionar arquivo de ícone Images (*.png *.svg *.xpm *.jpg) Imagens (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_ru.desktop.yaml ================================================ Desktop Entry/Name: "Настраиваемая команда" Desktop Entry/Comment: "Отображает вывод команды терминала" ================================================ FILE: plugin-customcommand/translations/customcommand_ru.ts ================================================ ColorLabel Click to change color Нажмите чтобы изменить цвет Select Color Выберите Цвет LXQtCustomCommandConfiguration Custom Command Configuration Настройка собственной команды Display Экран Use icon from theme or browse file Используйте значок из темы или выберите файл Run with "bash -c" Запускать с "bash -c" Select Font Выбрать шрифт Text Текст Command Команда Font Шрифт px пикс %1 %1 Use %1 to display command output Используйте %1 чтобы отобразить вывод команды Icon Значок Browse Выбрать Autorotate when the panel is vertical Автоматически поворачивать если панель вертикальна Output format: Формат вывода: ... ... echo Configure... echo Конфигурация... Command to run Команда для запуска Max Width Максимальная ширина Repeat command after: Повторить команду через: Text Color Цвет текста Reset Сбросить second(s) секунд(ы) Tooltip Всплывающая подсказка Continuous output (processed line by line) Непрерывный вывод (обработка построчно) Mouse Commands Команды мыши Click Кликнуть Wheel Up Прокрутить колесо мыши вверх Wheel Down Прокрутить колесо мыши вниз command outputs plain text to be used as text of the button команда выводит обычный текст, который будет использоваться в качестве текста кнопки command outputs icon in form of: команда выводит значок в виде: theme name имя темы name of icon resolved to image based on XDG spec имя значка преобразовано в изображение в соответствии со спецификацией XDG image file path путь к файлу изображения image data stream поток данных изображения plain image stream поток обычных изображений base64 encoded image data stream поток данных изображения с кодировкой Base64 as above but base64 encoded как выше, но с кодировкой Base64 command outputs structured variables to be used for button visualization in form of: команда выводит структурированные переменные, использующиеся для визуализации кнопок, в виде: name1:base64value1 name2:base64value2 ... name1:base64value1 name2:base64value2 ... Handled names are: Обрабатываемые имена: string to be used as text of the button строка для текста кнопки icon to be shown in the button, in the same form as explained before значок, который будет отображаться на кнопке, в том же виде, что и описано выше string to be used as tooltip of the button строка, которая будет использоваться в качестве всплывающей подсказки для кнопки All values should be encoded in base64 Все значения должны быть в кодировке Base64 Example of script generating structured output: Пример сценария, создающего структурированный вывод: My Text Мой текст my_image моё_изображение My Tooltip Моя всплывающая подсказка Text only Только текст Icon only Только значки Structured Структурированно Select Icon File Выберите файл со значком Images (*.png *.svg *.xpm *.jpg) Изображения (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_sk.desktop.yaml ================================================ Desktop Entry/Name: "Vlastný príkaz" Desktop Entry/Comment: "Zobrazí výstup cli príkazu" ================================================ FILE: plugin-customcommand/translations/customcommand_sk.ts ================================================ ColorLabel Click to change color Kliknutím zmeníte farbu Select Color Vyberte farbu LXQtCustomCommandConfiguration Custom Command Configuration Nastavenie vlasných príkazov Display Zobraziť Use icon from theme or browse file Použiť ikonu z témy alebo prehliadať súbor Run with "bash -c" Spustiť s "bash -c" Select Font Vybrať písmo Text Text Command Príkaz Font Písmo px px %1 %1 Use %1 to display command output Použiť%1 na zobrazenie výstupu príkazu Icon Ikona Browse Prehliadať Autorotate when the panel is vertical Automaticky otočiť v prípade, že je panel zvislý Output format: ... echo Configure... echo Konfigurovať... Command to run Príkaz na spustenie Max Width Maximálna šírka Repeat command after: Opakovať príkaz po: Text Color Farba textu Reset Obnoviť second(s) Sekundy(s) Tooltip Popis Continuous output (processed line by line) Mouse Commands Príkaz myšou Click Kliknutie Wheel Up Koliesko hore Wheel Down Koliesko dole command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Vybrať súbor ikôn Images (*.png *.svg *.xpm *.jpg) Obrázky (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_sr.ts ================================================ ColorLabel Click to change color Select Color LXQtCustomCommandConfiguration Custom Command Configuration Прилагођена конфигурација команди Display Дисплеј Use icon from theme or browse file Користи икону из теме или претражи фајл Run with "bash -c" Покрени са "bash -c" Select Font Изабери фонт Text Текст Command Команда Font Фонт px px %1 %1 Use %1 to display command output Користи %1 да прикажеш излаз команде Icon Икона Browse Претражи Autorotate when the panel is vertical Аутоматски ротирај када је панел вертикалан Output format: ... echo Configure... echo Configure.. Command to run Команда за покретање Max Width Максимална ширина Repeat command after: Понови команду послије: Text Color Reset second(s) секунде Tooltip Continuous output (processed line by line) Mouse Commands Команде миша Click Клик Wheel Up Точак горе Wheel Down Точак доле command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Изабери икону фајла Images (*.png *.svg *.xpm *.jpg) Слике (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_sv.desktop.yaml ================================================ Desktop Entry/Name: "Anpassat kommando" Desktop Entry/Comment: "Visar utdatat från ett terminalkommando" ================================================ FILE: plugin-customcommand/translations/customcommand_sv.ts ================================================ ColorLabel Click to change color Klicka för att ändra färg Select Color Välj färg LXQtCustomCommandConfiguration Custom Command Configuration Konfigurering av egendefinierade kommandon Display Visa Use icon from theme or browse file Använd ikon från tema eller bläddra efter fil Run with "bash -c" Kör med "bash -c" Select Font Välj typsnitt Text Text Command Kommando Font Typsnitt px px %1 %1 Use %1 to display command output Använd %1 för att visa utdata från kommando Icon Ikon Browse Bläddra Autorotate when the panel is vertical Rotera automatiskt när panelen är vertikal Output format: Utdataformat: ... ... echo Configure... echo konfigurera... Command to run Kommando att köra Max Width Max bredd Repeat command after: Repetera kommando efter: Text Color Textfärg Reset Återställ second(s) sekund(er) Tooltip Verktygsfält Continuous output (processed line by line) Kontinuerlig utdata (bearbetad rad för rad) Mouse Commands Muskommandon Click Klick Wheel Up Hjul upp Wheel Down Hjul ner command outputs plain text to be used as text of the button kommandot matar ut vanlig text som ska användas som text på knappen command outputs icon in form of: kommandoutmatning ikon i form av: theme name temanamn name of icon resolved to image based on XDG spec namn på ikonen som lösts till bild baserat på XDG-specifikationen image file path bild filsökväg image data stream bilddataström plain image stream vanlig bildström base64 encoded image data stream base64 kodad bilddataström as above but base64 encoded som ovan men kodad med base64 command outputs structured variables to be used for button visualization in form of: kommandot matar ut strukturerade variabler som ska användas för knappvisualisering i form av: name1:base64value1 name2:base64value2 ... namn:base64värde1 namn2:base64värde2 ... Handled names are: Hanterade namn är: string to be used as text of the button sträng som ska användas som text för knapp icon to be shown in the button, in the same form as explained before ikon som ska visas i knapp, i samma form som förklarats tidigare string to be used as tooltip of the button sträng som ska användas som verktygstips för knapp All values should be encoded in base64 Alla värden ska vara kodade i base64 Example of script generating structured output: Exempel på skript som genererar strukturerad utdata: My Text Min text my_image min_bild My Tooltip Mitt verktygstips Text only Text endast Icon only Ikon endast Structured Strukturerad Select Icon File Välj ikonfil Images (*.png *.svg *.xpm *.jpg) Bilder (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_tr.desktop.yaml ================================================ Desktop Entry/Name: "Özel Komut" Desktop Entry/Comment: "Bir istemci komutunun çıktısını görüntüler" ================================================ FILE: plugin-customcommand/translations/customcommand_tr.ts ================================================ ColorLabel Click to change color Rengi değiştirmek için tıkla Select Color Renk Seç LXQtCustomCommandConfiguration Custom Command Configuration Özel Komut Yapılandırması Display Görüntüle Use icon from theme or browse file Temadaki simgeyi kullanın veya dosyaya göz atın Run with "bash -c" "bash -c" ile çalıştır Select Font Yazı Tipi Seç Text Metin Command Komut Font Yazı Tipi px nk %1 %1 Use %1 to display command output Komut çıktısını görüntülemek için %1 kullanın Icon Simge Browse Gözat Autorotate when the panel is vertical Panel dikey olduğunda otomatik döndür Output format: Çıktı formatı: ... echo Configure... echo Yapılandır... Command to run Çalıştırılacak komut Max Width Azami Genişlik Repeat command after: Şundan sonra komutu tekrarla: Text Color Metin Rengi Reset Sıfırla second(s) saniye Tooltip İpucu Continuous output (processed line by line) Sürekli çıktı (satır satır işlenir) Mouse Commands Fare Komutları Click Tıkla Wheel Up Yukarı Kaydır Wheel Down Aşağı Kaydır command outputs plain text to be used as text of the button komut, düğmenin metni olarak kullanılacak düz metni görüntüler command outputs icon in form of: komutun çıktısı şu şekilde bir simgeyle gösterilir: theme name tema ismi name of icon resolved to image based on XDG spec simgenin adı, XDG spesifikasyonuna göre görsele dönüştürüldü image file path görsel dosyası yolu image data stream görsel veri akışı plain image stream düz görsel akışı base64 encoded image data stream base64 ile kodlanmış görsel veri akışı as above but base64 encoded yukarıdaki gibi ancak base64 ile kodlanmış command outputs structured variables to be used for button visualization in form of: komut, formlarda düğme görselleştirmesi için kullanılacak yapılandırılmış değişkenleri şu biçimde çıktı olarak verir: name1:base64value1 name2:base64value2 ... name1:base64value1 name2:base64value2 ... Handled names are: İşlenen adlar şunlardır: string to be used as text of the button düğmenin metni olarak kullanılacak metin icon to be shown in the button, in the same form as explained before düğmede gösterilecek simge, daha önce açıklandığı şekilde string to be used as tooltip of the button düğmenin araç ipucu olarak kullanılacak metin All values should be encoded in base64 Tüm değerler base64 ile kodlanmalıdır Example of script generating structured output: Yapılandırılmış çıktı üreten betik örneği: My Text Benim Metnim my_image benim_görselim My Tooltip Benim Araç İpucum Text only Sadece metin Icon only Sadece simge Structured Yapılandırılmış Select Icon File Simge Dosyasını Seçin Images (*.png *.svg *.xpm *.jpg) Resim (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_uk.desktop.yaml ================================================ Desktop Entry/Name: "Власна команда" Desktop Entry/Comment: "Показує вивід cli-команди" ================================================ FILE: plugin-customcommand/translations/customcommand_uk.ts ================================================ ColorLabel Click to change color Клацніть, щоб змінити колір Select Color Вибрати колір LXQtCustomCommandConfiguration Custom Command Configuration Конфігурування користувацьких команд Display Дисплей Use icon from theme or browse file Застосувати піктограму з теми або знайти файл Run with "bash -c" Запустити з «bash -c» Select Font Вибрати шрифт Text Текст Command Команда Font Шрифт px px %1 %1 Use %1 to display command output Застосуйте %1, щоб показати вивід команди Icon Піктограма Browse Огляд Autorotate when the panel is vertical Автообертання, коли панель вертикальна Output format: ... echo Configure... echo налаштувати... Command to run Команда для запуску Max Width Максимальна ширина Repeat command after: Повторити команду через: Text Color Колір тексту Reset Скинути second(s) секунд(у) Tooltip Підказка Continuous output (processed line by line) Mouse Commands Команди миші Click Клацнути Wheel Up Прокрутити коліщатко вгору Wheel Down Прокрутити коліщатко вниз command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File Вибрати піктограму файлу Images (*.png *.svg *.xpm *.jpg) Зображення (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "自定义命令" Desktop Entry/Comment: "显示终端命令的输出" ================================================ FILE: plugin-customcommand/translations/customcommand_zh_CN.ts ================================================ ColorLabel Click to change color 点击改变颜色 Select Color 选择颜色 LXQtCustomCommandConfiguration Custom Command Configuration 自定义命令配置 Display 显示 Use icon from theme or browse file 使用主题图标或浏览文件 Run with "bash -c" 使用“bash -c”运行 Select Font 选择字体 Text 文本 Command 命令 Font 字体 px px %1 %1 Use %1 to display command output 使用 %1 显示命令输出 Icon 图标 Browse 浏览 Autorotate when the panel is vertical 面板垂直时自动旋转 Output format: 输出格式: ... echo Configure... echo 配置... Command to run 运行命令 Max Width 最大宽度 Repeat command after: 在以下之后重复命令: Text Color 文本颜色 Reset 重设 second(s) 秒(s) Tooltip Continuous output (processed line by line) Mouse Commands 鼠标命令 Click 点击 Wheel Up 滚轮向上 Wheel Down 滚轮向下 command outputs plain text to be used as text of the button command outputs icon in form of: theme name name of icon resolved to image based on XDG spec image file path image data stream plain image stream base64 encoded image data stream as above but base64 encoded command outputs structured variables to be used for button visualization in form of: name1:base64value1 name2:base64value2 ... Handled names are: string to be used as text of the button icon to be shown in the button, in the same form as explained before string to be used as tooltip of the button All values should be encoded in base64 Example of script generating structured output: My Text my_image My Tooltip Text only Icon only Structured Select Icon File 选择图标文件 Images (*.png *.svg *.xpm *.jpg) 图片 (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-customcommand/translations/customcommand_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "自訂指令" Desktop Entry/Comment: "顯示 CLI 指令的輸出" ================================================ FILE: plugin-customcommand/translations/customcommand_zh_TW.ts ================================================ ColorLabel Click to change color 點按變更顏色 Select Color 選擇顏色 LXQtCustomCommandConfiguration Custom Command Configuration 自訂指令設定 Display 顯示 Use icon from theme or browse file 使用佈景主題提供的圖示或是瀏覽檔案 Run with "bash -c" 以 "bash -c" 執行 Select Font 選擇字型 Text 顯示文字 Command 指令 Font 字體 px px %1 %1 Use %1 to display command output 使用 %1 顯示指令的輸出 Icon 圖示 Browse 瀏覽 Autorotate when the panel is vertical 當面板垂直時自動旋轉 Output format: 輸出格式: ... ... echo Configure... echo 設定… Command to run 要執行的指令 Max Width 最大寬度 Repeat command after: 經過這些時間後重複執行指令: Text Color 文字顏色 Reset 重設 second(s) Tooltip 工具提示 Continuous output (processed line by line) 連續輸出 (逐行處理) Mouse Commands 滑鼠指令 Click 點按 Wheel Up 滾輪向上 Wheel Down 滾輪向下 command outputs plain text to be used as text of the button 指令輸出純文字使用作為按鈕的文字 command outputs icon in form of: 指令輸出圖示的形式為: theme name 主題名稱 name of icon resolved to image based on XDG spec 基於 XDG 規格解析成圖片的圖示名稱 image file path 圖片檔案路徑 image data stream 圖片資料串流 plain image stream 純圖片串流 base64 encoded image data stream Base64 編碼的圖片資料串流 as above but base64 encoded 如同上述,但採用 Base64 編碼 command outputs structured variables to be used for button visualization in form of: 指令輸出結構化的參數用於按鈕視覺化的形式為: name1:base64value1 name2:base64value2 ... 名稱1:base64value1 名稱2:base64value2 ... Handled names are: 所處理的名稱是: string to be used as text of the button 使用作為按鈕文字的字串 icon to be shown in the button, in the same form as explained before 按鈕中顯示的圖示,其形式與先前所述相同 string to be used as tooltip of the button 使用作為按鈕工具提示的字串 All values should be encoded in base64 全部的值均應以 base64 編碼 Example of script generating structured output: 生成結構化輸出的腳本範例: My Text 我的文字 my_image 我的圖片(_I) My Tooltip 我的工具提示 Text only 僅有文字 Icon only 僅有圖示 Structured 結構化的 Select Icon File 選擇圖示檔案 Images (*.png *.svg *.xpm *.jpg) 圖片 (*.png *.svg *.xpm *.jpg) ================================================ FILE: plugin-desktopswitch/CMakeLists.txt ================================================ set(PLUGIN "desktopswitch") set(HEADERS desktopswitch.h desktopswitchbutton.h desktopswitchconfiguration.h ) set(SOURCES desktopswitch.cpp desktopswitchbutton.cpp desktopswitchconfiguration.cpp ) set(UIS desktopswitchconfiguration.ui ) set(LIBRARIES ${LIBRARIES} lxqt lxqt-globalkeys) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-desktopswitch/desktopswitch.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include #include #include #include "../panel/lxqtpanelapplication.h" #include "../panel/backends/ilxqtabstractwmiface.h" #include #include #include "desktopswitch.h" #include "desktopswitchbutton.h" #include "desktopswitchconfiguration.h" static const QString DEFAULT_SHORTCUT_TEMPLATE(QStringLiteral("Control+F%1")); DesktopSwitch::DesktopSwitch(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo), m_pSignalMapper(new QSignalMapper(this)), m_desktopCount(0), mRows(-1), mShowOnlyActive(false), mLabelType(DesktopSwitchButton::LABEL_TYPE_INVALID) { LXQtPanelApplication *a = reinterpret_cast(qApp); mBackend = a->getWMBackend(); m_desktopCount = mBackend->getWorkspacesCount(getScreen()); m_buttons = new QButtonGroup(this); connect (m_pSignalMapper, &QSignalMapper::mappedInt, this, &DesktopSwitch::setDesktop); mLayout = new LXQt::GridLayout(&mWidget); mWidget.setLayout(mLayout); settingsChanged(); onCurrentDesktopChanged(mBackend->getCurrentWorkspace(getScreen())); QTimer::singleShot(0, this, SLOT(registerShortcuts())); connect(m_buttons, &QButtonGroup::idClicked, this, &DesktopSwitch::setDesktop); connect(mBackend, &ILXQtAbstractWMInterface::workspacesCountChanged, this, &DesktopSwitch::onNumberOfDesktopsChanged); connect(mBackend, &ILXQtAbstractWMInterface::currentWorkspaceChanged, this, &DesktopSwitch::onCurrentDesktopChanged); connect(mBackend, &ILXQtAbstractWMInterface::workspaceNameChanged, this, &DesktopSwitch::onDesktopNamesChanged); connect(mBackend, &ILXQtAbstractWMInterface::windowPropertyChanged, this, &DesktopSwitch::onWindowChanged); connect(mBackend, &ILXQtAbstractWMInterface::windowRemoved, this, &DesktopSwitch::onWindowRemoved); } QScreen* DesktopSwitch::getScreen() const { const auto screens = QApplication::screens(); for (const auto& screen : screens) { if (screen->name() == panel()->screenName()) { return screen; } } return nullptr; } void DesktopSwitch::registerShortcuts() { // Register shortcuts to change desktop GlobalKeyShortcut::Action * gshortcut; QString path; QString description; for (int i = 0; i < 12; ++i) { path = QStringLiteral("/panel/%1/desktop_%2").arg(settings()->group()).arg(i + 1); description = tr("Switch to desktop %1").arg(i + 1); gshortcut = GlobalKeyShortcut::Client::instance()->addAction(QString(), path, description, this); if (nullptr != gshortcut) { m_keys << gshortcut; connect(gshortcut, &GlobalKeyShortcut::Action::registrationFinished, this, &DesktopSwitch::shortcutRegistered); connect(gshortcut, &GlobalKeyShortcut::Action::activated, m_pSignalMapper, [this] { m_pSignalMapper->map(); }); m_pSignalMapper->setMapping(gshortcut, i); } } } void DesktopSwitch::shortcutRegistered() { GlobalKeyShortcut::Action * const shortcut = qobject_cast(sender()); disconnect(shortcut, &GlobalKeyShortcut::Action::registrationFinished, this, &DesktopSwitch::shortcutRegistered); const int i = m_keys.indexOf(shortcut); Q_ASSERT(-1 != i); if (shortcut->shortcut().isEmpty()) { shortcut->changeShortcut(DEFAULT_SHORTCUT_TEMPLATE.arg(i + 1)); } } void DesktopSwitch::onWindowChanged(WId id, int prop) { if (prop == int(LXQtTaskBarWindowProperty::State) || prop == int(LXQtTaskBarWindowProperty::Urgency) || prop == int(LXQtTaskBarWindowProperty::Workspace)) { int desktop = mBackend->getWindowWorkspace(id); if (desktop == mBackend->onAllWorkspacesEnum()) return; if (prop == int(LXQtTaskBarWindowProperty::Workspace)) { // remove the urgent hint from desktops that do not contain the window const auto buttons = m_buttons->buttons(); for (auto button : buttons) { qobject_cast(button)->setUrgencyHint(id, desktop != m_buttons->id(button) + 1 ? false : mBackend->applicationDemandsAttention(id)); } } else if (auto button = qobject_cast(m_buttons->button(desktop - 1))) { // set the urgent hint based on whether the window demands attention button->setUrgencyHint(id, mBackend->applicationDemandsAttention(id)); } } } void DesktopSwitch::onWindowRemoved(WId id) { const auto buttons = m_buttons->buttons(); for (auto button : buttons) qobject_cast(button)->setUrgencyHint(id, false); } void DesktopSwitch::refresh() { QScreen *scrn = getScreen(); const QString screenName = scrn ? scrn->name() : QString(); const QList btns = m_buttons->buttons(); int i = 0; const int current_desktop = mBackend->getCurrentWorkspace(scrn); const int current_cnt = btns.count(); const int border = std::min(btns.count(), (qsizetype) m_desktopCount); //update existing buttons for ( ; i < border; ++i) { DesktopSwitchButton * button = qobject_cast(btns[i]); auto deskName = mBackend->getWorkspaceName(i + 1, screenName); button->update(i, mLabelType, deskName.isEmpty() ? tr("Desktop %1").arg(i + 1) : deskName); button->setVisible(!mShowOnlyActive || i + 1 == current_desktop); } //create new buttons (if necessary) QAbstractButton *b; for ( ; i < m_desktopCount; ++i) { auto deskName = mBackend->getWorkspaceName(i + 1, screenName); b = new DesktopSwitchButton(&mWidget, i, mLabelType, deskName.isEmpty() ? tr("Desktop %1").arg(i+1) : deskName); mWidget.layout()->addWidget(b); m_buttons->addButton(b, i); b->setVisible(!mShowOnlyActive || i + 1 == current_desktop); } //delete unneeded buttons (if necessary) for ( ; i < current_cnt; ++i) { b = m_buttons->buttons().constLast(); m_buttons->removeButton(b); mWidget.layout()->removeWidget(b); delete b; } } DesktopSwitch::~DesktopSwitch() = default; void DesktopSwitch::setDesktop(int desktop) { mBackend->setCurrentWorkspace(desktop + 1, getScreen()); } void DesktopSwitch::onNumberOfDesktopsChanged() { int count = mBackend->getWorkspacesCount(getScreen()); qDebug() << "Desktop count changed from" << m_desktopCount << "to" << count; m_desktopCount = count; refresh(); } void DesktopSwitch::onCurrentDesktopChanged(int current, const QString& screenName) { if (!screenName.isEmpty() && panel()->screenName() != screenName) return; if (mShowOnlyActive) { mLayout->setEnabled(false); int i = 1; const auto buttons = m_buttons->buttons(); for (const auto button : buttons) { if (current == i) { button->setChecked(true); button->setVisible(true); } else { button->setVisible(false); } ++i; } mLayout->setEnabled(true); } else { QAbstractButton *button = m_buttons->button(current - 1); if (button) button->setChecked(true); } } void DesktopSwitch::onDesktopNamesChanged() { refresh(); } void DesktopSwitch::settingsChanged() { const int rows = settings()->value(QStringLiteral("rows"), 1).toInt(); const bool show_only_active = settings()->value(QStringLiteral("showOnlyActive"), false).toBool(); const int label_type = settings()->value(QStringLiteral("labelType"), DesktopSwitchButton::LABEL_TYPE_NUMBER).toInt(); const bool need_realign = mRows != rows || show_only_active != mShowOnlyActive; const bool need_refresh = mLabelType != static_cast(label_type) || show_only_active != mShowOnlyActive; mRows = rows; mShowOnlyActive = show_only_active; mLabelType = static_cast(label_type); if (need_realign) { // WARNING: Changing the desktop layout may call "LXQtPanel::realign", which calls // "DesktopSwitch::realign()". Therefore, the desktop layout should not be changed // inside the latter method. int columns = static_cast(ceil(static_cast(m_desktopCount) / mRows)); mBackend->setDesktopLayout(panel()->isHorizontal() ? Qt::Horizontal : Qt::Vertical, mRows, columns, mWidget.isRightToLeft()); realign(); // in case it isn't called when the desktop layout changes } if (need_refresh) refresh(); } void DesktopSwitch::realign() { mLayout->setEnabled(false); if (panel()->isHorizontal()) { mLayout->setRowCount(mShowOnlyActive ? 1 : mRows); mLayout->setColumnCount(0); } else { mLayout->setColumnCount(mShowOnlyActive ? 1 : mRows); mLayout->setRowCount(0); } mLayout->setEnabled(true); } QDialog *DesktopSwitch::configureDialog() { return new DesktopSwitchConfiguration(settings()); } DesktopSwitchWidget::DesktopSwitchWidget(): QFrame(), m_mouseWheelThresholdCounter(0) { } void DesktopSwitchWidget::wheelEvent(QWheelEvent *e) { // Without some sort of threshold which has to be passed, scrolling is too sensitive QPoint angleDelta = e->angleDelta(); Qt::Orientation orient = (std::abs(angleDelta.x()) > std::abs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int rotationSteps = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); m_mouseWheelThresholdCounter -= rotationSteps; // If the user hasn't scrolled far enough in one direction (positive or negative): do nothing if(std::abs(m_mouseWheelThresholdCounter) < 100) return; LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a->getWMBackend(); int max = wmBackend->getWorkspacesCount(screen()); int delta = rotationSteps < 0 ? 1 : -1; int current = wmBackend->getCurrentWorkspace(screen()) + delta; if (current > max){ current = 1; } else if (current < 1) current = max; m_mouseWheelThresholdCounter = 0; wmBackend->setCurrentWorkspace(current, screen()); } ILXQtPanelPlugin *DesktopSwitchPluginLibrary::instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a ? a->getWMBackend() : nullptr; if(!wmBackend || !wmBackend->supportsAction(0, LXQtTaskBarBackendAction::DesktopSwitch)) return new DesktopSwitchUnsupported{startupInfo}; return new DesktopSwitch{startupInfo}; } DesktopSwitchUnsupported::DesktopSwitchUnsupported(const ILXQtPanelPluginStartupInfo &startupInfo) : ILXQtPanelPlugin(startupInfo) , mLabel(new QLabel(tr("n/a"))) { mLabel->setToolTip(tr("DesktopSwitch is unsupported on current platform: %1").arg(QGuiApplication::platformName())); } DesktopSwitchUnsupported::~DesktopSwitchUnsupported() { delete mLabel; mLabel = nullptr; } QWidget *DesktopSwitchUnsupported::widget() { return mLabel; } ================================================ FILE: plugin-desktopswitch/desktopswitch.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DESKTOPSWITCH_H #define DESKTOPSWITCH_H #include "../panel/ilxqtpanelplugin.h" #include #include #include "desktopswitchbutton.h" class QLabel; class QSignalMapper; class QButtonGroup; namespace LXQt { class GridLayout; } class ILXQtAbstractWMInterface; class DesktopSwitchWidget: public QFrame { Q_OBJECT public: DesktopSwitchWidget(); private: int m_mouseWheelThresholdCounter; protected: void wheelEvent(QWheelEvent* e); }; /** * @brief Desktop switcher. A very simple one... */ class DesktopSwitch : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: DesktopSwitch(const ILXQtPanelPluginStartupInfo &startupInfo); ~DesktopSwitch(); QString themeId() const { return QStringLiteral("DesktopSwitch"); } QWidget *widget() { return &mWidget; } bool isSeparate() const { return true; } void realign(); virtual ILXQtPanelPlugin::Flags flags() const { return HaveConfigDialog; } QDialog *configureDialog(); private: QButtonGroup * m_buttons; QList m_keys; QSignalMapper* m_pSignalMapper; int m_desktopCount; DesktopSwitchWidget mWidget; LXQt::GridLayout *mLayout; int mRows; bool mShowOnlyActive; ILXQtAbstractWMInterface *mBackend; DesktopSwitchButton::LabelType mLabelType; void refresh(); QScreen* getScreen() const; private slots: void setDesktop(int desktop); void onNumberOfDesktopsChanged(); void onCurrentDesktopChanged(int current, const QString& screenName = QString()); void onDesktopNamesChanged(); virtual void settingsChanged(); void registerShortcuts(); void shortcutRegistered(); void onWindowChanged(WId id, int prop); void onWindowRemoved(WId id); }; class DesktopSwitchUnsupported : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: DesktopSwitchUnsupported(const ILXQtPanelPluginStartupInfo &startupInfo); ~DesktopSwitchUnsupported(); QString themeId() const { return QStringLiteral("DesktopSwitchUnsupported"); } QWidget *widget(); bool isSeparate() const { return true; } private: QLabel *mLabel; }; class DesktopSwitchPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const; }; #endif ================================================ FILE: plugin-desktopswitch/desktopswitchbutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include "desktopswitchbutton.h" DesktopSwitchButton::DesktopSwitchButton(QWidget * parent, int index, LabelType labelType, const QString &title) : QToolButton(parent), mUrgencyHint(false) { update(index, labelType, title); setCheckable(true); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } void DesktopSwitchButton::update(int index, LabelType labelType, const QString &title) { switch (labelType) { case LABEL_TYPE_NAME: setText(title); break; // A blank space was used in NONE Label Type as it uses less space // for each desktop button at the panel case LABEL_TYPE_NONE: setText(QStringLiteral(" ")); break; default: // LABEL_TYPE_NUMBER setText(QString::number(index + 1)); } if (!title.isEmpty()) { setToolTip(title); } } void DesktopSwitchButton::setUrgencyHint(WId id, bool urgent) { if (urgent) mUrgentWIds.insert(id); else mUrgentWIds.remove(id); // Add a small delay because, under some circumstances, urgencies may // be added and removed instantly, while repolishing can be costly. QTimer::singleShot(50, this, [this]() { if (mUrgencyHint != !mUrgentWIds.empty()) { mUrgencyHint = !mUrgentWIds.empty(); setProperty("urgent", mUrgencyHint); style()->unpolish(this); style()->polish(this); QToolButton::update(); } }); } ================================================ FILE: plugin-desktopswitch/desktopswitchbutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DESKTOPSWITCHBUTTON_H #define DESKTOPSWITCHBUTTON_H #include #include namespace GlobalKeyShortcut { class Action; } class DesktopSwitchButton : public QToolButton { Q_OBJECT public: enum LabelType { // Must match with combobox indexes LABEL_TYPE_INVALID = -1, LABEL_TYPE_NUMBER = 0, LABEL_TYPE_NAME = 1, LABEL_TYPE_NONE = 2 }; DesktopSwitchButton(QWidget * parent, int index, LabelType labelType, const QString &title=QString()); void update(int index, LabelType labelType, const QString &title); void setUrgencyHint(WId, bool); private: // for urgency hint handling bool mUrgencyHint; QSet mUrgentWIds; }; #endif ================================================ FILE: plugin-desktopswitch/desktopswitchconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "desktopswitchconfiguration.h" #include "ui_desktopswitchconfiguration.h" #include "../panel/lxqtpanelapplication.h" #include "../panel/backends/ilxqtabstractwmiface.h" #include #include #include DesktopSwitchConfiguration::DesktopSwitchConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::DesktopSwitchConfiguration) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("DesktopSwitchConfigurationWindow")); ui->setupUi(this); connect(ui->buttons, &QDialogButtonBox::clicked, this, &DesktopSwitchConfiguration::dialogButtonsAction); loadSettings(); connect(ui->rowsSB, &QSpinBox::valueChanged, this, &DesktopSwitchConfiguration::rowsChanged); connect(ui->labelTypeCB, &QComboBox::currentIndexChanged, this, &DesktopSwitchConfiguration::labelTypeChanged); connect(ui->showOnlyActiveCB, &QAbstractButton::toggled, this, [this] (bool checked) { this->settings().setValue(QStringLiteral("showOnlyActive"), checked); }); loadDesktopsNames(); } DesktopSwitchConfiguration::~DesktopSwitchConfiguration() { delete ui; } void DesktopSwitchConfiguration::loadSettings() { ui->rowsSB->setValue(settings().value(QStringLiteral("rows"), 1).toInt()); ui->labelTypeCB->setCurrentIndex(settings().value(QStringLiteral("labelType"), 0).toInt()); ui->showOnlyActiveCB->setChecked(settings().value(QStringLiteral("showOnlyActive"), false).toBool()); } void DesktopSwitchConfiguration::loadDesktopsNames() { LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a->getWMBackend(); int n = wmBackend->getWorkspacesCount(screen()); for (int i = 1; i <= n; i++) { auto deskName = wmBackend->getWorkspaceName(i, screen() ? screen()->name() : QString()); if (deskName.isEmpty()) deskName = tr("Desktop %1").arg(i); QLineEdit *edit = new QLineEdit(deskName, this); ((QFormLayout *) ui->namesGroupBox->layout())->addRow(tr("Desktop %1:").arg(i), edit); //TODO: on Wayland we cannot set desktop names in a standart way // On KWin we could use DBus org.kde.KWin as done by kcm_kwin_virtualdesktops if(qGuiApp->nativeInterface()) { // C++11 rocks! QTimer *timer = new QTimer(this); timer->setInterval(400); timer->setSingleShot(true); connect(timer, &QTimer::timeout, this, [=] { KX11Extras::setDesktopName(i, edit->text()); }); connect(edit, &QLineEdit::textEdited, this, [=] { timer->start(); }); } else { edit->setReadOnly(true); } } } void DesktopSwitchConfiguration::rowsChanged(int value) { settings().setValue(QStringLiteral("rows"), value); } void DesktopSwitchConfiguration::labelTypeChanged(int type) { settings().setValue(QStringLiteral("labelType"), type); } ================================================ FILE: plugin-desktopswitch/desktopswitchconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DESKTOPSWITCHCERCONFIGURATION_H #define DESKTOPSWITCHCERCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #include class QAbstractButton; namespace Ui { class DesktopSwitchConfiguration; } class DesktopSwitchConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit DesktopSwitchConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~DesktopSwitchConfiguration(); private: Ui::DesktopSwitchConfiguration *ui; private slots: /* Saves settings in conf file. */ void loadSettings(); void loadDesktopsNames(); void rowsChanged(int value); void labelTypeChanged(int type); }; #endif // DESKTOPSWITCHCERCONFIGURATION_H ================================================ FILE: plugin-desktopswitch/desktopswitchconfiguration.ui ================================================ DesktopSwitchConfiguration 0 0 253 235 DesktopSwitch Settings Appearance 1 40 1 Desktop labels: Number of rows: Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Qt::Horizontal QDialogButtonBox::Close ================================================ FILE: plugin-desktopswitch/resources/desktopswitch.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=user-desktop #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-desktopswitch/translations/desktopswitch.desktop.yaml ================================================ Desktop Entry/Name: "Desktop Switcher" Desktop Entry/Comment: "Allows easy switching between virtual desktops" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ar.desktop.yaml ================================================ Desktop Entry/Name: "مبدّل سطح المكتب" Desktop Entry/Comment: "تسمح بالتّبديل السهل بين أسطح المكتب الوهميّة" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ar.ts ================================================ DesktopSwitch Switch to desktop %1 بدّل إلى سطح المكتب %1 Desktop %1 سطح المكتب %1 DesktopSwitchConfiguration DesktopSwitch Settings إعدادات مبدّل سطح المكتب Number of rows: عدد الصفوف: Desktop labels: ملصقات أسطح المكتب: Appearance المظهر Numbers أرقام Names أسماء None بلا If checked, widget will be just an indicator إذا تم تحديده ، فسيكون عنصر واجهة المستخدم مجرد مؤشر Show only active desktop إظهار سطح المكتب النشط فقط Desktop names أسماء أسطح المكتب Desktop %1 سطح المكتب 1% Desktop %1: سطح المكتب 1%: DesktopSwitchUnsupported n/a غير موجود DesktopSwitch is unsupported on current platform: %1 تبديل سطح المكتب غير معتمد في النظام الأساسي الحالي:1% ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_arn.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ast.ts ================================================ DesktopSwitch Switch to desktop %1 Cambiar al escritoriu %1 Desktop %1 Escritoriu %1 DesktopSwitchConfiguration DesktopSwitch Settings Axustes del conmutador d'escritorios Number of rows: Númberu de fileres: Desktop labels: Etiquetes: Appearance Aspeutu Numbers Númberos Names Nomes None Nada If checked, widget will be just an indicator Show only active desktop Desktop names Nomes de los escritorios ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_bg.desktop.yaml ================================================ Desktop Entry/Name: "Превключвател на работен плот" Desktop Entry/Comment: "Позволява лесно превключване между работните плотове" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_bg.ts ================================================ DesktopSwitch Switch to desktop %1 Премини към плот %1 Desktop %1 Плот %1 DesktopSwitchConfiguration DesktopSwitch Settings Настройки за превключване на плота Number of rows: Брой редове: Desktop labels: Етикет: Appearance Външен вид Numbers Номер Names Име None Без If checked, widget will be just an indicator Ако опцията е избрана, панелът ще бъде само индикатор Show only active desktop Показване само на активния работен плот Desktop names Име на плот Desktop %1 Плот %1 Desktop %1: Плот %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch не се поддържа на текущата платформа: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ca.desktop.yaml ================================================ Desktop Entry/Name: "Canviador d'escriptoris" Desktop Entry/Comment: "Permet un canvi fàcil entre escriptoris virtuals" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ca.ts ================================================ DesktopSwitch Switch to desktop %1 Canvia a l'escriptori %1 Desktop %1 Escriptori %1 DesktopSwitchConfiguration DesktopSwitch Settings Ajusts de canvi d'escriptori Number of rows: Nombre de files: Desktop labels: Etiquetes dels escriptoris: Appearance Aparença Numbers Números Names Noms None Cap If checked, widget will be just an indicator Si està marcat, l' estri serà només un indicador Show only active desktop Mostra només l'escriptori actiu Desktop names Noms dels escriptoris Desktop %1 Escriptori %1 Desktop %1: Escriptori %1: DesktopSwitchUnsupported n/a n / a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch no és compatible a la plataforma actual: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_cs.desktop.yaml ================================================ Desktop Entry/Name: "Přepínání ploch" Desktop Entry/Comment: "Umožňuje snadné přepínání mezi virtuálními plochami" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_cs.ts ================================================ DesktopSwitch Switch to desktop %1 Přepnout na plochu %1 Desktop %1 Plocha %1 DesktopSwitchConfiguration DesktopSwitch Settings Nastavení přepínání ploch Number of rows: Počet řádků: Desktop labels: Popisky ploch: Appearance Vzhled Numbers Čísla Names Názvy None Žádné If checked, widget will be just an indicator Pokud zaškrtnuto, ovládací prvek bude pouze ukazatelem Show only active desktop Zobrazovat pouze pracovní plochu, na které se nacházíte Desktop names Názvy ploch Desktop %1 Plocha %1 Desktop %1: Plocha %1: DesktopSwitchUnsupported n/a není dostupné DesktopSwitch is unsupported on current platform: %1 Služba DesktopSwitch není na současné platformě podporována: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_cy.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_da.desktop.yaml ================================================ Desktop Entry/Name: "Skrivebordsskifter" Desktop Entry/Comment: "Giver mulighed for nemt at skifte mellem virtuelle skriveborde" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_da.ts ================================================ DesktopSwitch Switch to desktop %1 Skift til skrivebord %1 Desktop %1 Skrivebord %1 DesktopSwitchConfiguration DesktopSwitch Settings Indstillinger for Skrivebordsskifter Number of rows: Antal rækker: Desktop labels: Skrivebordsetiketter: Appearance Udseende Numbers Antal Names Navne None Intet If checked, widget will be just an indicator Hvis den er tilvalgt, så er kontrollen blot en indikator Show only active desktop Vis kun det aktive skrivebord Desktop names Skrivebordsnavne Desktop %1 Skrivebord %1 Desktop %1: Skrivebord %1: DesktopSwitchUnsupported n/a i/t DesktopSwitch is unsupported on current platform: %1 Skrivebordskifter er ikke understøttet på denne platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_de.desktop.yaml ================================================ Desktop Entry/Name: "Arbeitsflächenumschalter" Desktop Entry/Comment: "Zwischen den virtuellen Arbeitsflächen umschalten" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_de.ts ================================================ DesktopSwitch Switch to desktop %1 Wechsele zu Arbeitsfläche %1 Desktop %1 Arbeitsfläche %1 DesktopSwitchConfiguration DesktopSwitch Settings Einstellungen für Arbeitsflächenumschalter Appearance Erscheinungsbild Desktop labels: Arbeitsflächenbezeichnungen: Number of rows: Zeilenanzahl: Numbers Zahlen Names Namen None Keine If checked, widget will be just an indicator Wenn diese Option aktiviert ist, ist das Widget nur ein Indikator Show only active desktop Nur aktiven Desktop anzeigen Desktop names Arbeitsflächennamen Desktop %1 Arbeitsfläche %1 Desktop %1: Arbeitsfläche %1: DesktopSwitchUnsupported n/a n/v DesktopSwitch is unsupported on current platform: %1 DesktopSwitch wird auf der aktuellen Plattform nicht unterstützt: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_el.desktop.yaml ================================================ Desktop Entry/Name: "Εναλλαγή επιφάνειας εργασίας" Desktop Entry/Comment: "Επιτρέπει την εναλλαγή των εικονικών επιφανειών εργασίας" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_el.ts ================================================ DesktopSwitch Switch to desktop %1 Εναλλαγή στην επιφάνεια εργασίας %1 Desktop %1 Επιφάνεια εργασίας %1 DesktopSwitchConfiguration DesktopSwitch Settings Ρυθμίσεις εναλλαγής των επιφανειών εργασίας Number of rows: Αριθμός γραμμών: Desktop labels: Ετικέτες επιφανειών εργασίας: Appearance Εμφάνιση Numbers Αριθμοί Names Ονόματα None Καμία If checked, widget will be just an indicator Αν είναι επιλεγμένο, το γραφικό συστατικό θα είναι απλώς μια ένδειξη Show only active desktop Εμφάνιση μόνο της ενεργής επιφάνειας εργασίας Desktop names Ονόματα των επιφανειών εργασίας Desktop %1 Επιφάνεια εργασίας %1 Desktop %1: Επιφάνεια εργασίας %1: DesktopSwitchUnsupported n/a α/α DesktopSwitch is unsupported on current platform: %1 Το DesktopSwitch δεν υποστηρίζεται στο τρέχον πλατύβαθρο: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Desktop Switcher" Desktop Entry/Comment: "Allows easy switching between virtual desktops" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_en_GB.ts ================================================ DesktopSwitch Switch to desktop %1 Switch to desktop %1 Desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings DesktopSwitch Settings Number of rows: Number of rows: Desktop labels: Desktop labels: Appearance Appearance Numbers Numbers Names Names None None If checked, widget will be just an indicator If checked, widget will be just an indicator Show only active desktop Show only active desktop Desktop names Desktop names Desktop %1 Desktop %1 Desktop %1: Desktop %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_eo.desktop.yaml ================================================ Desktop Entry/Name: "Ŝalto de labortabloj" Desktop Entry/Comment: "Permesi ŝaltadon de virtualaj labortabloj" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_eo.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 Labortablo %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Labortablo %1 Desktop %1: Labortablo %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_es.desktop.yaml ================================================ Desktop Entry/Name: "Cambiador de escritorios" Desktop Entry/Comment: "Permite cambiar fácilmente entre escritorios virtuales" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_es.ts ================================================ DesktopSwitch Switch to desktop %1 Cambiar al escritorio %1 Desktop %1 Escritorio %1 DesktopSwitchConfiguration DesktopSwitch Settings Configuración del cambiador de escritorio Number of rows: Número de filas: Desktop labels: Etiquetas de escritorio: Appearance Apariencia Numbers Números Names Nombres None Ninguna If checked, widget will be just an indicator Si está marcado, el control será solo un indicador Show only active desktop Mostrar solo el escritorio activo Desktop names Nombres de escritorio Desktop %1 Escritorio %1 Desktop %1: Escritorio %1: DesktopSwitchUnsupported n/a Cambio de escritorio no soportado DesktopSwitch is unsupported on current platform: %1 DesktopSwitch no es compatible con la plataforma actual ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_es_UY.ts ================================================ DesktopSwitch Switch to desktop %1 Cambiar a escritorio %1 Desktop %1 Escritorio %1 DesktopSwitchConfiguration DesktopSwitch Settings Configuración de DesktopSwitch Number of rows: Cantidad de filas: Desktop labels: Etiquetas de escritorio: Appearance Apariencia Numbers Números Names Nombres None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Escritorio %1 Desktop %1: Escritorio %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Cambiador de Escritorios" Desktop Entry/Comment: "Permitir cambiar a escritorios virtuales" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_es_VE.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 Escritorio %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Escritorio %1 Desktop %1: Escritorio %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_et.desktop.yaml ================================================ Desktop Entry/Name: "Töölauavahetaja" Desktop Entry/Comment: "Lihtne liides virtuaalsete töölaudade vahetamiseks" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_et.ts ================================================ DesktopSwitch Switch to desktop %1 Suundu töölauale %1 Desktop %1 Töölaud %1 DesktopSwitchConfiguration DesktopSwitch Settings Töölauavahetaja seadistused Number of rows: Ridade arv: Desktop labels: Töölaudade sildid: Appearance Välimus Numbers Numbrid Names Nimed None Mitte midagi If checked, widget will be just an indicator Kui see valik on aktiivne, siis vidin toimib vaid näidikuna Show only active desktop Näita vaid kasutusel olevat töölauda Desktop names Töölaudade nimed Desktop %1 Töölaud %1 Desktop %1: Töölaud %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 Töölauavahetaja selles operatsioonisüsteemis ei toimi: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_eu.desktop.yaml ================================================ Desktop Entry/Name: "Mahaigain-aldatzailea" Desktop Entry/Comment: "Mahaigain birtualen artean modu errazean aldatzeko aukera eskaintzen du" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_eu.ts ================================================ DesktopSwitch Switch to desktop %1 Aldatu % 1 mahaigainera Desktop %1 %1 mahaigaina DesktopSwitchConfiguration DesktopSwitch Settings Mahaigaineko etengailuaren ezarpenak Number of rows: Errenkada kopurua: Desktop labels: Mahaigaineko etiketak: Appearance Itxura Numbers Zenbakiak Names Izenak None Bat ere ez If checked, widget will be just an indicator Hautatzen bada, widget-a adierazle bat besterik ez da izango Show only active desktop Erakutsi mahaigain aktiboa soilik Desktop names Mahaigaineko izenak Desktop %1 %1 mahaigaina Desktop %1: %1: mahaigaina DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 Mahaigaineko aldagailua ez da onartzen oraingo plataforman: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_fi.desktop.yaml ================================================ Desktop Entry/Name: "Työpöydän vaihtaja" Desktop Entry/Comment: "Vaihda virtuaalisten työpöytien välillä" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_fi.ts ================================================ DesktopSwitch Switch to desktop %1 Siirry työpöydälle %1 Desktop %1 Työpöytä %1 DesktopSwitchConfiguration DesktopSwitch Settings Työpöydän vaihtajan asetukset Number of rows: Rivien määrä: Desktop labels: Työpöydän nimikkeet: Appearance Ulkoasu Numbers Numerot Names Nimet None Ei mitään If checked, widget will be just an indicator Käytä vain työpöydän ilmaisimena Show only active desktop Näytä vain aktiivinen työpöytä Desktop names Työpöytien nimet Desktop %1 Työpöytä %1 Desktop %1: Työpöytä %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitchiä ei tueta nykyisellä alustalla: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_fr.desktop.yaml ================================================ Desktop Entry/Name: "Changeur de bureau" Desktop Entry/Comment: "permettre un basculement aisé entre les bureaux virtuels" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_fr.ts ================================================ DesktopSwitch Switch to desktop %1 Basculer vers le bureau %1 Desktop %1 Bureau %1 DesktopSwitchConfiguration DesktopSwitch Settings Paramétrage du basculement de bureau Number of rows: Nombre de colonnes : Desktop labels: Étiquettes de bureau : Appearance Apparence Numbers Numéros Names Noms None Aucun If checked, widget will be just an indicator Si coché, le widget ne sera qu'un indicateur Show only active desktop Afficher uniquement le bureau actif Desktop names Noms des bureaux Desktop %1 Bureau %1 Desktop %1: Bureau %1 : DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch n'est pas pris en charge sur la plate-forme actuelle : %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_gl.ts ================================================ DesktopSwitch Switch to desktop %1 Cambiar para o escritorio %1 Desktop %1 Escritorio %1 DesktopSwitchConfiguration DesktopSwitch Settings Axustes do cambiador de escritorios Number of rows: Número de filas: Desktop labels: Etiquetas dos escritorios: Appearance Aparencia Numbers Números Names Nomes None Ningún If checked, widget will be just an indicator Se está marcado, o trebello será só un indicador Show only active desktop Amosa só escritorio activo Desktop names Nomes dos escritorios Desktop %1 Escritorio %1 Desktop %1: Escritorio %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_he.desktop.yaml ================================================ Desktop Entry/Name: "מחליף שולחנות עבודה" Desktop Entry/Comment: "מאפשר החלפה פשוטה בין שולחנות עבודה וירטואליים" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_he.ts ================================================ DesktopSwitch Switch to desktop %1 מעבר לשולחן עבודה %1 Desktop %1 שולחן עבודה %1 DesktopSwitchConfiguration DesktopSwitch Settings הגדרות מעבר בין שולחנות עבודה Number of rows: מספר שורות: Desktop labels: תוויות שולחנות עבודה: Appearance מראה Numbers מספרים Names שמות None כלום If checked, widget will be just an indicator אם האפשרות מסומנת, הווידג׳ט יהיה מחוון בלבד Show only active desktop הצגת שולחן העבודה הפעיל בלבד Desktop names שמות שולחנות עבודה Desktop %1 שולחן עבודה %1 Desktop %1: שולחן עבודה %1: DesktopSwitchUnsupported n/a לא זמין DesktopSwitch is unsupported on current platform: %1 אין תמיכה במעבר שולחנות עבודה (DesktopSwitch) בפלטפורמה הנוכחית: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_hr.desktop.yaml ================================================ Desktop Entry/Name: "Prebacivanje između radnih površina" Desktop Entry/Comment: "Omugućuje jednostavno prebacivanje između virtualnih radnih površina" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_hr.ts ================================================ DesktopSwitch Switch to desktop %1 Prebaci na radnu površinu %1 Desktop %1 Radna površina %1 DesktopSwitchConfiguration DesktopSwitch Settings Prebacivanje između radnih površina – Postavke Number of rows: Broj redaka: Desktop labels: Oznake za radnu površinu: Appearance Izgled Numbers Brojevi Names Imena None Bez If checked, widget will be just an indicator Ako je označeno, programčić će biti samo indikator Show only active desktop Prikaži samo aktivne radne površine Desktop names Imena radnih površina Desktop %1 Radna površina %1 Desktop %1: Radna površina %1: DesktopSwitchUnsupported n/a -- DesktopSwitch is unsupported on current platform: %1 DesktopSwitch nije podržan na trenutačnoj platformi: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_hu.desktop.yaml ================================================ Desktop Entry/Name: "Asztalváltó" Desktop Entry/Comment: "Lehetővé teszi a virtuális asztalok közötti váltást" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_hu.ts ================================================ DesktopSwitch Switch to desktop %1 %1. asztalra váltás Desktop %1 %1. asztal DesktopSwitchConfiguration DesktopSwitch Settings Asztalváltó beállításai Number of rows: Sorok száma: Desktop labels: Asztalazonosítók: Appearance Megjelenés Numbers Számok Names Nevek None Nincs If checked, widget will be just an indicator Ha be van jelölve, nem lehet asztalt váltani vele Show only active desktop Csak az aktív asztal megjelenítése Desktop names Asztalnevek Desktop %1 %1. asztal Desktop %1: %1. asztal: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 A DesktopSwitch nem támogatott a jelenlegi platformon: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ia.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_id.ts ================================================ DesktopSwitch Switch to desktop %1 Beralih ke desktop %1 Desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Pengaturan DesktopSwitch Number of rows: Jumlah baris: Desktop labels: Label desktop: Appearance Penampilan Numbers Nomor Names Nama None Tak ada If checked, widget will be just an indicator Show only active desktop Desktop names Nama desktop Desktop %1 Desktop %1 Desktop %1: Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_it.desktop.yaml ================================================ Desktop Entry/Name: "Cambia desktop" Desktop Entry/Comment: "Permette di passare ad altri desktop virtuali" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_it.ts ================================================ DesktopSwitch Switch to desktop %1 Passa al desktop %1 Desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Preferenze cambia desktop Appearance Aspetto Number of rows: Numero righe: Desktop labels: Etichette desktop: Numbers Numeri Names Nomi None Nessuna If checked, widget will be just an indicator Se selezionato, l'elemento sarà un semplice indicatore Show only active desktop Mostra solo desktop attivo Desktop names Nomi dei desktop Desktop %1 Spazio di lavoro %1 Desktop %1: Desktop %1: DesktopSwitchUnsupported n/a n.d. DesktopSwitch is unsupported on current platform: %1 Cambiadesktop non è supportato su questa piattaforma: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ja.desktop.yaml ================================================ Desktop Entry/Name: "デスクトップ切り替え" Desktop Entry/Comment: "仮想デスクトップの切り替えを簡単にします" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ja.ts ================================================ DesktopSwitch Switch to desktop %1 デスクトップ %1 に切り替える Desktop %1 デスクトップ %1 DesktopSwitchConfiguration DesktopSwitch Settings デスクトップ切り替えの設定 Number of rows: 行数: Desktop labels: デスクトップのラベル: Appearance 外観 Numbers 番号 Names 名前 None なし If checked, widget will be just an indicator チェックすると、ウィジェットがインジケーターのみになります Show only active desktop アクティブなデスクトップのみを表示する Desktop names デスクトップの名前 Desktop %1 デスクトップ %1 Desktop %1: デスクトップ %1: DesktopSwitchUnsupported n/a N/A DesktopSwitch is unsupported on current platform: %1 デスクトップ切り替えは現在のプラットフォームではサポートされていません: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ka.desktop.yaml ================================================ Desktop Entry/Name: "სამუშაო მაგიდის გადამრთველი" Desktop Entry/Comment: "საშუალებას გაძლევთ, იოლად გადართოთ ვირტუალურ სამუშაო მაგიდებს შორის" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ka.ts ================================================ DesktopSwitch Switch to desktop %1 გადართვა სამუშაო მაგიდაზე %1 Desktop %1 სამუშაო მაგიდა %1 DesktopSwitchConfiguration DesktopSwitch Settings სამუშაო მაგიდების გადამრთველის მორგება Number of rows: მწკრივების რაოდენობა: Desktop labels: სამუშაო მაგიდის ჭდეები: Appearance გარეგნობა Numbers რიცხვები Names სახელები None არცერთი If checked, widget will be just an indicator თუ ჩართულია, ვიჯეტი ინდიკატორი იქნება Show only active desktop მხოლოდ, აქტიურ სამუშაო მაგიდაზე ჩვენება Desktop names სამუშაო მაგიდის სახელები Desktop %1 სამუშაო მაგიდა %1 Desktop %1: სამუშაო მაგიდა %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 სამუშაო მაგიდის გადართვა მხარდაჭერილი არაა მიმდინარე პლატფორმაზე: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_kab.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 Tanarit %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names Ismawen None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1: Tanarit %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_kk.ts ================================================ DesktopSwitch Switch to desktop %1 %1 жұмыс үстеліне ауысу Desktop %1 %1 жұмыс үстелі DesktopSwitchConfiguration DesktopSwitch Settings Жұмыс үстелін ауыстырушы баптаулары Number of rows: Жолдар саны: Desktop labels: Жұмыс үстелінің белгілері: Appearance Сыртқы түрі Numbers Сандар Names Атаулар None Жоқ If checked, widget will be just an indicator Белгіленген болса, виджет тек индикатор болады Show only active desktop Тек белсенді жұмыс үстелін көрсету Desktop names Жұмыс үстелдерінің атаулары Desktop %1 %1 жұмыс үстелі Desktop %1: %1 жұмыс үстелі: DesktopSwitchUnsupported n/a қ/ж DesktopSwitch is unsupported on current platform: %1 Жұмыс үстелін ауыстырушы ағымдағы %1 платформасында қолдау көрсетілмейді ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ko.desktop.yaml ================================================ Desktop Entry/Name: "바탕화면 전환기" Desktop Entry/Comment: "가상 바탕화면 간 편하게 전환할 수 있습니다" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ko.ts ================================================ DesktopSwitch Switch to desktop %1 %1 바탕화면으로 전환 Desktop %1 %1 바탕화면 DesktopSwitchConfiguration DesktopSwitch Settings 바탕화면 전환 설정 Number of rows: 줄 수: Desktop labels: 바탕화면 레이블: Appearance 모양새 Numbers 번호 Names 이름 None 없음 If checked, widget will be just an indicator 이 옵션을 선택하면 위젯은 표시기만 됩니다 Show only active desktop 활성 바탕화면만 표시 Desktop names 바탕화면 이름 Desktop %1 바탕화면 %1 Desktop %1: %1 바탕화면: DesktopSwitchUnsupported n/a 해당 없음 DesktopSwitch is unsupported on current platform: %1 DesktopSwitch는 현재 플랫폼에서 지원되지 않습니다: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lg.desktop.yaml ================================================ Desktop Entry/Name: "Akakyusa awakolerwa" Desktop Entry/Comment: "Kano kakusobozesa okukyusa mangu okuva awakolerwa wamu okudda walala" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lg.ts ================================================ DesktopSwitch Switch to desktop %1 Genda ku awakolerwa %1 Desktop %1 Awakolerwa %1 DesktopSwitchConfiguration DesktopSwitch Settings Enteekateeka za kakyusa awakolerwa Number of rows: Ennyiriri z'amapeesa agakyusa awakolerwa: Desktop labels: Ekibaalambanga awakolerwa: Appearance Endabika Numbers Namba Names Bigambo None Bwereere If checked, widget will be just an indicator Bw'otonyeza wano wajjakubaawo akalagabulazi awakolerwa kw'oli Show only active desktop Laga awakolerwa kw'okolera wokka Desktop names Entuuma y'awakolerwa Desktop %1 Awakolerwa %1 Desktop %1: Awakolerwa %1: DesktopSwitchUnsupported n/a Awakolerwa tewakyusibwa DesktopSwitch is unsupported on current platform: %1 Ku sisitemu eno tekisoboka okyusa awakolerwa: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lt.desktop.yaml ================================================ Desktop Entry/Name: "Darbalaukių perjungiklis" Desktop Entry/Comment: "Leidžia lengvai perjunginėti virtualius darbalaukius" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lt.ts ================================================ DesktopSwitch Switch to desktop %1 Perjungti į darbalaukį %1 Desktop %1 Darbalaukis %1 DesktopSwitchConfiguration DesktopSwitch Settings Darbalaukių perjungiklio nustatymai Number of rows: Eilučių skaičius: Desktop labels: Darbalaukių etiketės: Appearance Išvaizda Numbers Skaičiai Names Pavadinimai None Nėra If checked, widget will be just an indicator Jei pažymėta, valdiklis bus tiesiog indikatoriumi Show only active desktop Rodyti tik aktyvų darbalaukį Desktop names Darbalaukių pavadinimai Desktop %1 Darbalaukis %1 Desktop %1: Darbalaukis %1: DesktopSwitchUnsupported n/a neprieinama DesktopSwitch is unsupported on current platform: %1 Šioje platformoje DesktopSwitch yra neprieinama: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lv.desktop.yaml ================================================ Desktop Entry/Name: "Darbvirsmu pārslēdzis" Desktop Entry/Comment: "Ļauj viegli pārslēgties starp virtuālajām darbvirsmām" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_lv.ts ================================================ DesktopSwitch Switch to desktop %1 Pārslēgt uz darbvirsmu %1 Desktop %1 Darbvirsma %1 DesktopSwitchConfiguration DesktopSwitch Settings Darbvirsmas pārslēdža iestatījumi Number of rows: Rindu skaits: Desktop labels: Darbvirsmu birkas: Appearance Izskats Numbers Numuri Names Nosaukumi None Bez atzīmēm/birkām If checked, widget will be just an indicator Ja atzīmēts, logrīks/vidžets darbosies kā vienkāršs indikators Show only active desktop Rādīt tikai aktīvo darbvirsmu Desktop names Darbvirsmu nosaukumi Desktop %1 Darbvirsma %1 Desktop %1: Darbvirsma/darbalauks %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Skrivebordsbytter" Desktop Entry/Comment: "Veksle mellom virtuelle skrivebord" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_nb_NO.ts ================================================ DesktopSwitch Switch to desktop %1 Bytt til skrivebord %1 Desktop %1 Skrivebord %1 DesktopSwitchConfiguration DesktopSwitch Settings Skrivebordsbytteinnstillinger Number of rows: Antall rader: Desktop labels: Skrivebordsnavn: Appearance Utseende Numbers Tall Names Navn None Ingen If checked, widget will be just an indicator Når aktivert blir widgeten bare en indikator Show only active desktop Vis bare aktivt skrivebord Desktop names Skrivebordsnavn Desktop %1 Skrivebord %1 Desktop %1: Skrivebord %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_nl.desktop.yaml ================================================ Desktop Entry/Name: "Werkbladwisselaar" Desktop Entry/Comment: "Schakel eenvoudig tussen virtuele werkbladen" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_nl.ts ================================================ DesktopSwitch Switch to desktop %1 Ga naar werkblad %1 Desktop %1 Werkblad %1 DesktopSwitchConfiguration DesktopSwitch Settings Werkbladwisselaar-instellingen Number of rows: Aantal rijen: Desktop labels: Werkbladlabels: Appearance Vormgeving Numbers Getallen Names Namen None Geen If checked, widget will be just an indicator Schakel in om de werkbladwisselaar alleen als indicator te tonen Show only active desktop Alleen tonen op actief werkblad Desktop names Werkbladnamen Desktop %1 Werkblad %1 Desktop %1: Werkblad %1: DesktopSwitchUnsupported n/a n/b DesktopSwitch is unsupported on current platform: %1 De werkbladwisselaar wordt niet ondersteund op dit platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_oc.ts ================================================ DesktopSwitch Switch to desktop %1 Bascular al burèu %1 Desktop %1 Burèu %1 DesktopSwitchConfiguration DesktopSwitch Settings Paramètres del cambiament de burèu Number of rows: Nombre de colomnas : Desktop labels: Etiquetas del burèu : Appearance Aparéncia Numbers Numèros Names Noms None Cap If checked, widget will be just an indicator Se marcat, lo widget serà pas qu’un indicador Show only active desktop Mostrar que lo burèu actiu Desktop names Noms dels burèus Desktop %1 Burèu %1 Desktop %1: Burèu %1 : DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch es pas compatible amb la platafòrma actuala : %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਡੈਸਕਟਾਪ ਸਵਿੱਚਰ" Desktop Entry/Comment: "ਵਰਚੁਅਲ ਡੈਸਕਟਾਪਾਂ ਵਿੱਚ ਸੌਖੀ ਤਰ੍ਹਾਂ ਬਦਲਣ ਲਈ ਸਹਾਇਕ ਹੈ" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pa.ts ================================================ DesktopSwitch Switch to desktop %1 %1 ਡੈਸਕਟਾਪ ਉੱਤੇ ਜਾਓ Desktop %1 ਡੈਸਕਟਾਪ %1 DesktopSwitchConfiguration DesktopSwitch Settings ਡੈਸਕਟਾਪ-ਸਵਿੱਚ ਸੈਟਿੰਗਾਂ Number of rows: ਕਤਾਰਾਂ ਦੀ ਗਿਣਤੀ: Desktop labels: ਡੈਸਕਟਾਪ ਲੇਬਲ: Appearance ਦਿੱਖ Numbers ਅੰਕ Names ਨਾਂ None ਕੋਈ ਨਹੀਂ If checked, widget will be just an indicator ਜੇ ਚੁਣਿਆ ਤਾਂ ਵਿਜੈੱਟ ਸਿਰਫ਼ ਸੰਕੇਤ ਹੋਵੇਗਾ Show only active desktop ਸਿਰਫ਼ ਸਰਗਰਮ ਡੈਸਕਟਾਪ ਉੱਤੇ ਹੀ ਵੇਕਾਓ Desktop names ਡੈਸਕਟਾਪਾਂ ਦੇ ਨਾਂ Desktop %1 ਡੈਸਕਟਾਪ %1 Desktop %1: ਡੈਸਕਟਾਪ %1: DesktopSwitchUnsupported n/a ਲਾਗੂ ਨਹੀਂ DesktopSwitch is unsupported on current platform: %1 ਡੈਸਕਟਾਪ-ਸਵਿੱਚ ਮੌਜੂਦਾ ਪਲੇਟਫਾਰਮ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pl.desktop.yaml ================================================ Desktop Entry/Name: "Obszary robocze" Desktop Entry/Comment: "Pozwala na proste przełączanie pomiędzy wirtualnymi pulpitami" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pl.ts ================================================ DesktopSwitch Switch to desktop %1 Przełącz na pulpit %1 Desktop %1 Pulpit %1 DesktopSwitchConfiguration DesktopSwitch Settings Ustawienia przełączania pulpitu Number of rows: Liczba rzędów: Desktop labels: Podpisy pulpitów: Appearance Wygląd Numbers Liczby Names Nazwy None Brak If checked, widget will be just an indicator Jeżeli zaznaczono, widżet będzie po prostu wskaźnikiem Show only active desktop Pokazuj tylko aktywny pulpit Desktop names Nazwy pulpitów Desktop %1 Pulpit %1 Desktop %1: Pulpit %1: DesktopSwitchUnsupported n/a niedostępny DesktopSwitch is unsupported on current platform: %1 DesktopSwitch nie jest obsługiwany na bieżącej platformie: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pt.desktop.yaml ================================================ Desktop Entry/Name: "Alternador de áreas de trabalho" Desktop Entry/Comment: "Permite trocar entre as áreas de trabalho" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pt.ts ================================================ DesktopSwitch Switch to desktop %1 Trocar para a área de trabalho %1 Desktop %1 Área de trabalho %1 DesktopSwitchConfiguration DesktopSwitch Settings Definições do DesktopSwitch Number of rows: Número de linhas: Desktop labels: Texto da área de trabalho: Appearance Aparência Numbers Números Names Nomes None Nenhum If checked, widget will be just an indicator Se ativada, o widget será apenas um indicador Show only active desktop Mostrar apenas a área de trabalho ativa Desktop names Nomes da áreas de trabalho Desktop %1 Área de trabalho %1 Desktop %1: Área de trabalho %1: DesktopSwitchUnsupported n/a n/d DesktopSwitch is unsupported on current platform: %1 O DesktopSwitch não é suportado na plataforma atual: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Alternador de área de trabalho" Desktop Entry/Comment: "Permite alternar áreas de trabalho virtuais" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_pt_BR.ts ================================================ DesktopSwitch Switch to desktop %1 Ir para a área de trabalho %1 Desktop %1 Área de trabalho %1 DesktopSwitchConfiguration DesktopSwitch Settings Configurações do DesktopSwitch Number of rows: Número de linhas: Desktop labels: Etiquetas das áreas de trabalho: Appearance Aparência Numbers Números Names Nomes None Nenhum If checked, widget will be just an indicator Se marcado, o widget será apenas um indicador Show only active desktop Exibir somente a área de trabalho ativa Desktop names Nomes das áreas de trabalho Desktop %1 Área de trabalho %1 Desktop %1: Área de trabalho %1: DesktopSwitchUnsupported n/a n.a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch não é suportado na plataforma atual: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ro.desktop.yaml ================================================ Desktop Entry/Name: "Comutare ecrane virtuale" Desktop Entry/Comment: "Permite comutarea între ecranele virtuale" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ro_RO.ts ================================================ DesktopSwitch Switch to desktop %1 Comutare la ecranul %1 Desktop %1 Ecranul %1 DesktopSwitchConfiguration DesktopSwitch Settings Setäri de comutare a ecranului Number of rows: Numărul de rânduri: Desktop labels: Etichetele ecranelor: Appearance Aspect Numbers Numere Names Nume None Nici unul If checked, widget will be just an indicator Show only active desktop Desktop names Denumiri ale desktopului Desktop %1 Ecranul %1 Desktop %1: Ecranul %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ru.desktop.yaml ================================================ Desktop Entry/Name: "Переключатель рабочих столов" Desktop Entry/Comment: "Позволяет легко переключаться между виртуальными рабочими\ \ столами" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_ru.ts ================================================ DesktopSwitch Switch to desktop %1 Переключиться на рабочий стол %1 Desktop %1 Рабочий стол %1 DesktopSwitchConfiguration DesktopSwitch Settings Настройки переключения рабочих столов Appearance Внешний вид Number of rows: Количество рядов: Desktop labels: Метки рабочих столов: Numbers Номера Names Имена None Без меток If checked, widget will be just an indicator Если отмечено, виджет будет работать как простой индикатор Show only active desktop Показывать только активный рабочий стол Desktop names Имена рабочих столов Desktop %1 Рабочий стол %1 Desktop %1: Рабочий стол %1: DesktopSwitchUnsupported n/a н/д DesktopSwitch is unsupported on current platform: %1 DesktopSwitch не поддерживает на текущей платформе: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_si.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sk.desktop.yaml ================================================ Desktop Entry/Name: "Prepínač plôch" Desktop Entry/Comment: "Umožňuje prepínanie medzi virtuálnymi plochami" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sk_SK.ts ================================================ DesktopSwitch Switch to desktop %1 Prejsť na plochu %1 Desktop %1 Plocha %1 DesktopSwitchConfiguration DesktopSwitch Settings Nastavenia prepínača pracovnej plochy Number of rows: Počet riadkov: Desktop labels: Názov plochy: Appearance Vzhľad Numbers Počet Names Mená None Žiadne If checked, widget will be just an indicator Ak je možnosť aktivovaná, ovládací prvok bude iba indikátorom Show only active desktop Zobraziť iba aktívnu plochu Desktop names Názov plochy Desktop %1 Plocha %1 Desktop %1: Plocha %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 DesktopSwitch nie je podporovaný na aktuálnej platforme: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sl.desktop.yaml ================================================ Desktop Entry/Name: "Desktopswitch" Desktop Entry/Comment: "Omogoča preklop med navideznimi namizji" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sl.ts ================================================ DesktopSwitch Switch to desktop %1 Preklopi na namizje %1 Desktop %1 Namizje %1 DesktopSwitchConfiguration DesktopSwitch Settings Nastavitve preklopnika namizij Number of rows: Število vrstic: Desktop labels: Oznake namizij: Appearance Izgled Numbers Številke Names Imena None Brez If checked, widget will be just an indicator Če obkljukano, bo gradnik le indikator Show only active desktop Prikaži le aktivno namizje Desktop names Imena namizij Desktop %1 Namizje %1 Desktop %1: Namizje %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr.desktop.yaml ================================================ Desktop Entry/Name: "Пребацивач површи" Desktop Entry/Comment: "Пребацујте виртуелне површи" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Пребацивач површи" Desktop Entry/Comment: "Омогућава лако пребацивање између виртуелних десктопова" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr@ijekavian.ts ================================================ DesktopSwitch Switch to desktop %1 Пребаци се на десктоп %1 Desktop %1 Десктоп %1 DesktopSwitchConfiguration DesktopSwitch Settings DesktopSwitch поставке Number of rows: Број редова: Desktop labels: Ознаке десктопова: Appearance Приказ Numbers Бројеви Names Имена None Ниједно If checked, widget will be just an indicator Ако је провјерен, виџет ће бити само индикатор Show only active desktop Прикажи само активан десктоп Desktop names Имена декстопова Desktop %1: Десктоп %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Prebacivač površi" Desktop Entry/Comment: "Prebacujte virtuelne površi" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Prebacivač površi" Desktop Entry/Comment: "Prebacujte virtuelne površi" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr@latin.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Desktop %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr_BA.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 Површ %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 Површ %1 Desktop %1: Површ %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sr_RS.ts ================================================ DesktopSwitch Switch to desktop %1 Пребаци на десктоп %1 Desktop %1 Десктоп %1 DesktopSwitchConfiguration DesktopSwitch Settings DesktopSwitch поставке Number of rows: Број редова: Desktop labels: Десктоп ознаке: Appearance Изглед Numbers Бројеви Names Имена None Ниједан If checked, widget will be just an indicator Ако је означено, виџет ће бити само индикатор Show only active desktop Прикажи само активни десктоп Desktop names Имена десктопова Desktop %1 Десктоп %1 Desktop %1: Десктоп %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sv.desktop.yaml ================================================ Desktop Entry/Name: "Skrivbordsväxlare" Desktop Entry/Comment: "Växla smidigt mellan virtuella arbetsytor" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_sv.ts ================================================ DesktopSwitch Switch to desktop %1 Byt till skrivbord %1 Desktop %1 Skrivbord %1 DesktopSwitchConfiguration DesktopSwitch Settings Skrivbordsbyte-inställningar Number of rows: Antal rader: Desktop labels: Skrivbordsnamn: Appearance Utseende Numbers Nummer Names Namn None Ingen If checked, widget will be just an indicator Om markerat är widgeten bara en indikator Show only active desktop Visa endast aktivt skrivbord Desktop names Skrivbordsnamn Desktop %1 Skrivbord %1 Desktop %1: Skrivbord %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 Skrivbordsbyte stöds inte på nuvarande plattform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_th.desktop.yaml ================================================ Desktop Entry/Name: "สลับพื้นโต๊ะ" Desktop Entry/Comment: "อนุญาตให้ทำการสลับพื้นโต๊ะ" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_th_TH.ts ================================================ DesktopSwitch Switch to desktop %1 Desktop %1 พื้นโต๊ะ %1 DesktopSwitchConfiguration DesktopSwitch Settings Number of rows: Desktop labels: Appearance Numbers Names None If checked, widget will be just an indicator Show only active desktop Desktop names Desktop %1 พื้นโต๊ะ %1 Desktop %1: พื้นโต๊ะ %1: DesktopSwitchUnsupported n/a DesktopSwitch is unsupported on current platform: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_tr.desktop.yaml ================================================ Desktop Entry/Name: "Masaüstü değiştirici" Desktop Entry/Comment: "Sanal masaüstleri arasında geçiş yapın" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_tr.ts ================================================ DesktopSwitch Switch to desktop %1 %1 Masaüstüne geç Desktop %1 %1 Masaüstü DesktopSwitchConfiguration DesktopSwitch Settings Masaüstü Değiştirme Ayarları Number of rows: Satır sayısı: Desktop labels: Masaüstü etiketi: Appearance Görünüm Numbers Sayılar Names İsimler None Hiçbiri If checked, widget will be just an indicator İşaretliyse, gereç sadece bir gösterge olacaktır Show only active desktop Sadece aktif masaüstünü göster Desktop names Masaüstü isimleri Desktop %1 Masaüstü %1 Desktop %1: %1 Masaüstü: DesktopSwitchUnsupported n/a yok DesktopSwitch is unsupported on current platform: %1 DesktopSwitch geçerli platformda desteklenmiyor: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_uk.desktop.yaml ================================================ Desktop Entry/Name: "Перемикач стільниць" Desktop Entry/Comment: "Дозволяє легко перемикатися між віртуальними стільницями" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_uk.ts ================================================ DesktopSwitch Switch to desktop %1 Перейти на стільницю %1 Перемкнутися до стільниці %1 Desktop %1 Стільниця %1 DesktopSwitchConfiguration DesktopSwitch Settings Налаштування перемикача стільниць Number of rows: Кількість рядків: Desktop labels: Мітки стільниць: Appearance Вигляд Numbers Кількість Names Назви None Немає If checked, widget will be just an indicator Якщо позначити, віджет буде лише покажчиком Show only active desktop Показувати лише активну стільницю Desktop names Назви стільниць Desktop %1 Стільниця %1 Desktop %1: Стільниця %1: DesktopSwitchUnsupported n/a н/д DesktopSwitch is unsupported on current platform: %1 DesktopSwitch не підтримується на цій платформі: %1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "桌面切换" Desktop Entry/Comment: "在虚拟桌面间切换" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_zh_CN.ts ================================================ DesktopSwitch Switch to desktop %1 切换至桌面 %1 Desktop %1 桌面 %1 DesktopSwitchConfiguration DesktopSwitch Settings 桌面切换设置 Number of rows: 行数: Desktop labels: 桌面标签: Appearance 外观 Numbers 数量 Names 名称 None If checked, widget will be just an indicator 若勾选,小部件将只是一个指示器 Show only active desktop 仅显示活动桌面 Desktop names 桌面名称 Desktop %1 桌面 %1 Desktop %1: 桌面 %1: DesktopSwitchUnsupported n/a n/a DesktopSwitch is unsupported on current platform: %1 当前平台不支持 DesktopSwitch:%1 ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "桌面切換" Desktop Entry/Comment: "讓您在虛擬桌面之間容易切換" ================================================ FILE: plugin-desktopswitch/translations/desktopswitch_zh_TW.ts ================================================ DesktopSwitch Switch to desktop %1 切換至桌面 %1 Desktop %1 桌面 %1 DesktopSwitchConfiguration DesktopSwitch Settings 桌面切換設定 Number of rows: 列的數量: Desktop labels: 桌面標籤: Appearance 外觀 Numbers 數字 Names 名稱 None If checked, widget will be just an indicator 若是勾選,小工具將會是個指示器 Show only active desktop 僅顯示作用視窗 Desktop names 桌面名稱 Desktop %1 桌面 %1 Desktop %1: 桌面 %1: DesktopSwitchUnsupported n/a 不適用 DesktopSwitch is unsupported on current platform: %1 桌面切換功能不支援於目前平台:%1 ================================================ FILE: plugin-directorymenu/CMakeLists.txt ================================================ set(PLUGIN "directorymenu") set(HEADERS directorymenu.h directorymenuconfiguration.h ) set(SOURCES directorymenu.cpp directorymenuconfiguration.cpp ) set(UIS directorymenuconfiguration.ui ) set(LIBRARIES ${LIBRARIES} Qt6Xdg ) include ("../cmake/BuildPlugin.cmake") BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-directorymenu/directorymenu.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Daniel Drzisga * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is diinstributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "directorymenu.h" #include #include #include #include #include #include #include #include DirectoryMenu::DirectoryMenu(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo), mMenu(nullptr), mDefaultIcon(XdgIcon::fromTheme(QStringLiteral("folder"))) { mOpenDirectorySignalMapper = new QSignalMapper(this); mOpenTerminalSignalMapper = new QSignalMapper(this); mMenuSignalMapper = new QSignalMapper(this); mButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mButton.setAutoRaise(true); mButton.setIcon(XdgIcon::fromTheme(QStringLiteral("folder"))); connect(&mButton, &QToolButton::clicked, this, &DirectoryMenu::showMenu); connect(mOpenDirectorySignalMapper, &QSignalMapper::mappedString, this, &DirectoryMenu::openDirectory); connect(mOpenTerminalSignalMapper, &QSignalMapper::mappedString, this, &DirectoryMenu::openInTerminal); connect(mMenuSignalMapper, &QSignalMapper::mappedString, this, &DirectoryMenu::addMenu); settingsChanged(); } DirectoryMenu::~DirectoryMenu() { delete mMenu; } void DirectoryMenu::showMenu() { if(mBaseDirectory.exists()) { buildMenu(mBaseDirectory.absolutePath()); } else { buildMenu(QDir::homePath()); } willShowWindow(mMenu); // Just using Qt`s activateWindow() won't work on some WMs like Kwin. // Solution is to execute menu 1ms later using timer mMenu->popup(calculatePopupWindowPos(mMenu->sizeHint()).topLeft()); } void DirectoryMenu::buildMenu(const QString& path) { delete mMenu; mPathStrings.clear(); mMenu = new QMenu(); addActions(mMenu, path); } void DirectoryMenu::openDirectory(const QString& path) { QDesktopServices::openUrl(QUrl(QStringLiteral("file://") + QDir::toNativeSeparators(path))); } void DirectoryMenu::openInTerminal(const QString& path) { // Execute the default terminal program in the given working directory QProcess::startDetached(mDefaultTerminal, QStringList(), QDir::toNativeSeparators(path)); } void DirectoryMenu::addMenu(QString path) { QSignalMapper* sender = (QSignalMapper* )QObject::sender(); QMenu* parentMenu = (QMenu*) sender->mapping(path); if(parentMenu->isEmpty()) { addActions(parentMenu, path); } } void DirectoryMenu::addActions(QMenu* menu, const QString& path) { mPathStrings.push_back(path); QAction* openDirectoryAction = menu->addAction(XdgIcon::fromTheme(QStringLiteral("document-open")), tr("Open")); connect(openDirectoryAction, &QAction::triggered, mOpenDirectorySignalMapper, [this] { mOpenDirectorySignalMapper->map(); } ); mOpenDirectorySignalMapper->setMapping(openDirectoryAction, mPathStrings.back()); QAction* openTerminalAction = menu->addAction(XdgIcon::fromTheme(QStringLiteral("utilities-terminal")), tr("Open in terminal")); connect(openTerminalAction, &QAction::triggered, mOpenTerminalSignalMapper, [this] { mOpenTerminalSignalMapper->map(); } ); mOpenTerminalSignalMapper->setMapping(openTerminalAction, mPathStrings.back()); menu->addSeparator(); QDir dir(path); const QFileInfoList list = dir.entryInfoList(); for (const QFileInfo& entry : list) { if(entry.isDir() && !entry.isHidden()) { mPathStrings.push_back(entry.fileName()); QMenu* subMenu = menu->addMenu(XdgIcon::fromTheme(QStringLiteral("folder")), mPathStrings.back()); connect(subMenu, &QMenu::aboutToShow, mMenuSignalMapper, [this] { mMenuSignalMapper->map(); } ); mMenuSignalMapper->setMapping(subMenu, entry.absoluteFilePath()); } } } QDialog* DirectoryMenu::configureDialog() { return new DirectoryMenuConfiguration(settings()); } void DirectoryMenu::settingsChanged() { mBaseDirectory.setPath(settings()->value(QStringLiteral("baseDirectory"), QDir::homePath()).toString()); // icon bool customIcon = false; QString iconPath = settings()->value(QStringLiteral("icon"), QString()).toString(); QIcon icon = QIcon(iconPath); if(!icon.isNull()) { QIcon buttonIcon = QIcon(icon); if(!buttonIcon.pixmap(QSize(24, 24)).isNull()) { mButton.setIcon(buttonIcon); customIcon = true; } } if (!customIcon) mButton.setIcon(mDefaultIcon); // label QString label = settings()->value(QStringLiteral("label"), QString()).toString(); mButton.setText(label); // style QString style = settings()->value(QStringLiteral("buttonStyle")).toString().toUpper(); if (style == QStringLiteral("ICON")) mButton.setToolButtonStyle(Qt::ToolButtonIconOnly); else if (!label.isEmpty()) { if (style == QStringLiteral("TEXT")) mButton.setToolButtonStyle(Qt::ToolButtonTextOnly); else mButton.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } // Set default terminal mDefaultTerminal = settings()->value(QStringLiteral("defaultTerminal"), QStringLiteral("xterm")).toString(); } ================================================ FILE: plugin-directorymenu/directorymenu.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Daniel Drzisga * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DIRECTORYMENU_H #define DIRECTORYMENU_H #include "../panel/ilxqtpanelplugin.h" #include "directorymenuconfiguration.h" #include #include #include #include #include #include #include #include class DirectoryMenu : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: DirectoryMenu(const ILXQtPanelPluginStartupInfo &startupInfo); ~DirectoryMenu(); virtual QWidget *widget() { return &mButton; } virtual QString themeId() const { return QStringLiteral("DirectoryMenu"); } virtual ILXQtPanelPlugin::Flags flags() const { return HaveConfigDialog; } QDialog *configureDialog(); void settingsChanged(); private slots: void showMenu(); void openDirectory(const QString& path); void openInTerminal(const QString &path); void addMenu(QString path); protected slots: void buildMenu(const QString& path); private: void addActions(QMenu* menu, const QString& path); QToolButton mButton; QMenu *mMenu; QSignalMapper *mOpenDirectorySignalMapper; QSignalMapper *mOpenTerminalSignalMapper; // New signal mapper to opening directory in term QSignalMapper *mMenuSignalMapper; QDir mBaseDirectory; QIcon mDefaultIcon; std::vector mPathStrings; QString mDefaultTerminal; }; class DirectoryMenuLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new DirectoryMenu(startupInfo); } }; #endif ================================================ FILE: plugin-directorymenu/directorymenuconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Daniel Drzisga * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include #include "directorymenuconfiguration.h" #include "ui_directorymenuconfiguration.h" DirectoryMenuConfiguration::DirectoryMenuConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::DirectoryMenuConfiguration), mBaseDirectory(QDir::homePath()), mDefaultIcon(XdgIcon::fromTheme(QStringLiteral("folder"))), mDefaultTerminal(QStringLiteral("/usr/bin/qterminal")) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("DirectoryMenuConfigurationWindow")); ui->setupUi(this); connect(ui->buttons, &QDialogButtonBox::clicked, this, &DirectoryMenuConfiguration::dialogButtonsAction); ui->buttonStyleCB->addItem(tr("Only icon"), QLatin1String("Icon")); ui->buttonStyleCB->addItem(tr("Only text"), QLatin1String("Text")); ui->buttonStyleCB->addItem(tr("Icon and text"), QLatin1String("IconText")); connect(ui->buttonStyleCB, &QComboBox::activated, this, &DirectoryMenuConfiguration::saveSettings); loadSettings(); ui->baseDirectoryB->setIcon(mDefaultIcon); connect(ui->baseDirectoryB, &QPushButton::clicked, this, &DirectoryMenuConfiguration::showDirectoryDialog); connect(ui->iconB, &QPushButton::clicked, this, &DirectoryMenuConfiguration::showIconDialog); connect(ui->labelB, &QPushButton::clicked, this, &DirectoryMenuConfiguration::showLabelDialog); connect(ui->terminalB, &QPushButton::clicked, this, &DirectoryMenuConfiguration::showTermDialog); } DirectoryMenuConfiguration::~DirectoryMenuConfiguration() { delete ui; } void DirectoryMenuConfiguration::loadSettings() { mBaseDirectory.setPath(settings().value(QStringLiteral("baseDirectory"), QDir::homePath()).toString()); ui->baseDirectoryB->setText(mBaseDirectory.dirName()); // icon bool iconSet = false; mIcon = settings().value(QStringLiteral("icon"), QString()).toString(); if(!mIcon.isNull()) { QIcon buttonIcon = QIcon(mIcon); if(!buttonIcon.pixmap(QSize(24, 24)).isNull()) { ui->iconB->setIcon(buttonIcon); iconSet = true; } } if (!iconSet) ui->iconB->setIcon(mDefaultIcon); // label ui->labelB->setText(settings().value(QStringLiteral("label"), QString()).toString()); // style int index = ui->buttonStyleCB->findData(settings().value(QStringLiteral("buttonStyle"), QLatin1String("Icon"))); if (index == -1) index = 0; ui->buttonStyleCB->setCurrentIndex(index); ui->terminalB->setText(settings().value(QStringLiteral("defaultTerminal"), QString()).toString()); } void DirectoryMenuConfiguration::saveSettings() { settings().setValue(QStringLiteral("baseDirectory"), mBaseDirectory.absolutePath()); settings().setValue(QStringLiteral("icon"), mIcon); settings().setValue(QStringLiteral("label"), ui->labelB->text()); settings().setValue(QStringLiteral("buttonStyle"), ui->buttonStyleCB->itemData(ui->buttonStyleCB->currentIndex())); settings().setValue(QStringLiteral("defaultTerminal"), mDefaultTerminal); } void DirectoryMenuConfiguration::showDirectoryDialog() { QFileDialog d(this, tr("Choose Base Directory"), mBaseDirectory.absolutePath()); d.setFileMode(QFileDialog::Directory); d.setOptions(QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); d.setWindowModality(Qt::WindowModal); if(d.exec() && !d.selectedFiles().isEmpty()) { mBaseDirectory.setPath(d.selectedFiles().constFirst()); ui->baseDirectoryB->setText(mBaseDirectory.dirName()); saveSettings(); } } void DirectoryMenuConfiguration::showTermDialog() { QFileDialog d(this, tr("Choose Default Terminal"), QStringLiteral("/usr/bin")); d.setFileMode(QFileDialog::ExistingFile); d.setWindowModality(Qt::WindowModal); if (d.exec() && !d.selectedFiles().isEmpty()) { mDefaultTerminal = d.selectedFiles().constFirst(); saveSettings(); } ui->terminalB->setText(mDefaultTerminal); } void DirectoryMenuConfiguration::showIconDialog() { // prefer the icon theme folder and give priority to the "places" folder QString iconDir; QString iconThemeName = QIcon::themeName(); const auto icons = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("icons"), QStandardPaths::LocateDirectory); for (const auto& icon : icons) { QString iconThemeFolder = icon + QLatin1String("/") + iconThemeName; if (QDir(iconThemeFolder).exists() && QFileInfo(iconThemeFolder).permission(QFileDevice::ReadUser)) { const QString places = iconThemeFolder + QLatin1String("/places"); if (QDir(places).exists() && QFileInfo(places).permission(QFileDevice::ReadUser)) iconDir = places; else iconDir = iconThemeFolder; break; } } QFileDialog d(this, tr("Choose Icon"), iconDir, tr("Icons (*.png *.xpm *.jpg *.svg)")); d.setWindowModality(Qt::WindowModal); if(d.exec() && !d.selectedFiles().isEmpty()) { QIcon newIcon = QIcon(d.selectedFiles().constFirst()); if(newIcon.pixmap(QSize(24, 24)).isNull()) { QMessageBox::warning(this, tr("Directory Menu"), tr("An error occurred while loading the icon.")); return; } ui->iconB->setIcon(newIcon); mIcon = d.selectedFiles().constFirst(); saveSettings(); } } void DirectoryMenuConfiguration::showLabelDialog() { QInputDialog d(this); d.setWindowModality(Qt::WindowModal); d.setInputMode(QInputDialog::TextInput); d.setWindowTitle(tr("Choose Label")); d.setLabelText(tr("Label:")); QString label = settings().value(QStringLiteral("label"), QString()).toString(); if (!label.isEmpty()) d.setTextValue(label); if (d.exec()) { ui->labelB->setText(d.textValue()); saveSettings(); } } ================================================ FILE: plugin-directorymenu/directorymenuconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Daniel Drzisga * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DIRECTORYMENUCONFIGURATION_H #define DIRECTORYMENUCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #include #include #include #include namespace Ui { class DirectoryMenuConfiguration; } class DirectoryMenuConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit DirectoryMenuConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~DirectoryMenuConfiguration(); private: Ui::DirectoryMenuConfiguration *ui; QDir mBaseDirectory; QString mIcon; QIcon mDefaultIcon; QString mDefaultTerminal; /* Read settings from conf file and put data into controls. */ void loadSettings(); private slots: /* Saves settings in conf file. */ void saveSettings(); void showDirectoryDialog(); void showIconDialog(); void showLabelDialog(); void showTermDialog(); private: }; #endif // DIRECTORYMENUCONFIGURATION_H ================================================ FILE: plugin-directorymenu/directorymenuconfiguration.ui ================================================ DirectoryMenuConfiguration 0 0 342 195 Directory Menu Settings Appearance Base directory: 0 0 BaseDirectoryName Icon: 0 0 Label 0 0 Button style Choose Default Terminal Terminal Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() DirectoryMenuConfiguration accept() buttons rejected() DirectoryMenuConfiguration reject() ================================================ FILE: plugin-directorymenu/resources/directorymenu.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=folder #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-directorymenu/translations/directorymenu.desktop.yaml ================================================ Desktop Entry/Name: "Directory Menu" Desktop Entry/Comment: "Displays a menu showing the contents of a directory" ================================================ FILE: plugin-directorymenu/translations/directorymenu.ts ================================================ DirectoryMenu Open Open in terminal DirectoryMenuConfiguration Directory Menu Settings Appearance Base directory: BaseDirectoryName Icon: Label Button style Terminal Choose Default Terminal Only icon Only text Icon and text Choose Base Directory Choose Icon Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ar.desktop.yaml ================================================ Desktop Entry/Name: "قائمة المجلدات" Desktop Entry/Comment: "تعرض قائمة تظهر محتويات المجلد" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ar.ts ================================================ DirectoryMenu Open افتح Open in terminal افتح في الطرفية DirectoryMenuConfiguration Directory Menu Settings إعدادات قائمة الأدلة Appearance المظهر Base directory: الدليل الأساس: BaseDirectoryName اسم الدليل الأساس Icon: الأيقونة: Label تسمية Button style شكل الزر Terminal الطرفية Choose Default Terminal اختر الطرفية المبدئية Only icon ايقونة فقط Only text النص فقط Icon and text ايقونة والنص Choose Base Directory اختر الدليل الأساس Choose Icon اختر أيقونة Icons (*.png *.xpm *.jpg *.svg) ايقونات (* .png * .xpm * .jpg * .svg) Choose Label اختر تسمية Label: تسمية: Directory Menu قائمة الأدلة An error occurred while loading the icon. حدث خطأ أثناء تحميل الأيقونة. ================================================ FILE: plugin-directorymenu/translations/directorymenu_arn.ts ================================================ DirectoryMenu Open Open in terminal DirectoryMenuConfiguration Directory Menu Settings Appearance Base directory: BaseDirectoryName Icon: Label Button style Terminal Choose Default Terminal Only icon Only text Icon and text Choose Base Directory Choose Icon Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ast.ts ================================================ DirectoryMenu Open Abrir Open in terminal DirectoryMenuConfiguration Directory Menu Settings Axustes del menú de direutorios Appearance Aspeutu Base directory: Direutoriu base: BaseDirectoryName BaseDirectoryName Icon: Iconu: Terminal Choose Default Terminal Choose Base Directory Escoyeta d'un direutoriu base Choose Icon Escoyeta d'un iconu Icons (*.png *.xpm *.jpg) Iconos (*.png *.xpm *.jpg) Directory Menu Menú de direutorios An error occurred while loading the icon. Asocedió un fallu mentanto se cargaba l'iconu. ================================================ FILE: plugin-directorymenu/translations/directorymenu_bg.desktop.yaml ================================================ Desktop Entry/Name: "Меню с директории" Desktop Entry/Comment: "Показва меню със съдържанието на избрана директория" ================================================ FILE: plugin-directorymenu/translations/directorymenu_bg.ts ================================================ DirectoryMenu Open Отваряне Open in terminal Отваряне в терминал DirectoryMenuConfiguration Directory Menu Settings Настройване на Меню за директории Appearance Изглед Base directory: Основна директория: BaseDirectoryName Име на основна директория Icon: Икона: Label Етикет Button style Стил на бутоните Terminal Терминал Choose Default Terminal Избиране на терминал Only icon Само икони Only text Само текст Icon and text Икони и текст Choose Base Directory Избиране на основна директория Choose Icon Избиране на икона Icons (*.png *.xpm *.jpg *.svg) Икони (*.png *.xpm *.jpg *.svg) Choose Label Избери етикет Label: Етикет: Directory Menu Меню на директорията An error occurred while loading the icon. Грешка при зареждането на иконата. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ca.desktop.yaml ================================================ Desktop Entry/Name: "Menú del directori" Desktop Entry/Comment: "Mostra un menú que visualitza el contingut d'un directori" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ca.ts ================================================ DirectoryMenu Open Obre Open in terminal Obre al terminal DirectoryMenuConfiguration Directory Menu Settings Ajusts del menú de directoris Appearance Aparença Base directory: Directori base: BaseDirectoryName NomDirectoriBase Icon: Icona: Label Etiqueta Button style Estil de botó Terminal Terminal Choose Default Terminal Trieu el terminal predeterminat Only icon Només icones Only text Només text Icon and text Text i icones Choose Base Directory Trieu el directori base Choose Icon Trieu la icona Icons (*.png *.xpm *.jpg *.svg) Icones (*.png *.xpm *.jpg *.svg) Choose Label Escolliu una etiqueta Label: Etiqueta: Directory Menu Menú de directoris An error occurred while loading the icon. S'ha produït un error mentre es carregava la icona. ================================================ FILE: plugin-directorymenu/translations/directorymenu_cs.desktop.yaml ================================================ Desktop Entry/Name: "Nabídka složky" Desktop Entry/Comment: "Zobrazí nabídku s obsahem složky" ================================================ FILE: plugin-directorymenu/translations/directorymenu_cs.ts ================================================ DirectoryMenu Open Otevřít Open in terminal Otevřít v terminálu DirectoryMenuConfiguration Directory Menu Settings Nastavení nabídky složky Appearance Vzhled Base directory: Základní složka: BaseDirectoryName Název základní složky Icon: Ikona: Label Štítek Button style Styl tlačítka Terminal Terminál Choose Default Terminal Zvolit výchozí terminál Only icon Pouze ikona Only text Pouze text Icon and text Ikona a text Choose Base Directory Vybrat základní složku Choose Icon Zvolit ikonu Icons (*.png *.xpm *.jpg *.svg) Ikony (*.png *.xpm *.jpg *.svg) Choose Label Zvolte štítek Label: Štítek: Directory Menu Nabídka složky An error occurred while loading the icon. Při načítání ikony se vyskytla chyba. ================================================ FILE: plugin-directorymenu/translations/directorymenu_cy.ts ================================================ DirectoryMenu Open Open in terminal DirectoryMenuConfiguration Directory Menu Settings Appearance Base directory: BaseDirectoryName Icon: Label Button style Terminal Choose Default Terminal Only icon Only text Icon and text Choose Base Directory Choose Icon Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_da.desktop.yaml ================================================ Desktop Entry/Name: "Mappemenu" Desktop Entry/Comment: "Viser en menu med indholdet af en mappe" ================================================ FILE: plugin-directorymenu/translations/directorymenu_da.ts ================================================ DirectoryMenu Open Åben Open in terminal Åbn i terminal DirectoryMenuConfiguration Directory Menu Settings Indstillinger for mappemenu Appearance Udseende Base directory: Grundmappe: BaseDirectoryName Grundmappenavn Icon: Ikon: Label Etiket Button style Knap stil Terminal Terminal Choose Default Terminal Vælg standardterminal Only icon Kun ikon Only text Kun tekst Icon and text Ikon og tekst Choose Base Directory Vælg grundmappe Choose Icon Vælg ikon Icons (*.png *.xpm *.jpg *.svg) Ikoner (*.png *.xpm *.jpg *.svg) Choose Label Vælg etiket Label: Etiket: Directory Menu Mappemenu An error occurred while loading the icon. Der opstod en fejl under indlæsning af ikonet. ================================================ FILE: plugin-directorymenu/translations/directorymenu_de.desktop.yaml ================================================ Desktop Entry/Name: "Ordnermenü" Desktop Entry/Comment: "Zeigt ein Menü mit dem Inhalt eines Ordners an" ================================================ FILE: plugin-directorymenu/translations/directorymenu_de.ts ================================================ DirectoryMenu Open Öffnen Open in terminal In Terminal öffnen DirectoryMenuConfiguration Directory Menu Settings Einstellungen zum Verzeichnismenü Appearance Erscheinungsbild Base directory: Basisverzeichnis: BaseDirectoryName BasisVerzeichnisName Icon: Symbol: Label Bezeichnung Button style Schaltflächenstil Terminal Terminal Choose Default Terminal Wählen Sie das Standardterminal Only icon Nur Symbol Only text Nur Text Icon and text Symbol und Text Choose Base Directory Basisverzeichnis auswählen Choose Icon Symbol auswählen Icons (*.png *.xpm *.jpg *.svg) Symbole (*.png *.xpm *.jpg *.svg) Choose Label Bezeichnung auswählen Label: Bezeichnung: Directory Menu Verzeichnismenü An error occurred while loading the icon. Beim Laden des Symbols trat ein Fehler auf. ================================================ FILE: plugin-directorymenu/translations/directorymenu_el.desktop.yaml ================================================ Desktop Entry/Name: "Μενού καταλόγου" Desktop Entry/Comment: "Εμφανίζει ένα μενού με τα περιεχόμενα ενός καταλόγου" ================================================ FILE: plugin-directorymenu/translations/directorymenu_el.ts ================================================ DirectoryMenu Open Άνοιγμα Open in terminal Άνοιγμα στο τερματικό DirectoryMenuConfiguration Directory Menu Settings Ρυθμίσεις μενού καταλόγου Appearance Εμφάνιση Base directory: Βασικός κατάλογος: BaseDirectoryName Όνομα βασικού καταλόγου Icon: Εικονίδιο: Label Ετικέτα Button style Τεχνοτροπία κουμπιού Terminal Τερματικό Choose Default Terminal Επιλογή προκαθορισμένου τερματικού Only icon Μόνο εικονίδιο Only text Μόνο κείμενο Icon and text Εικονίδιο και κείμενο Choose Base Directory Επιλέξτε τον βασικό κατάλογο Choose Icon Επιλέξτε το εικονίδιο Icons (*.png *.xpm *.jpg *.svg) Εικόνες (*.png *.xpm *.jpg *.svg) Choose Label Επιλογή ετικέτας Label: Ετικέτα: Directory Menu Μενού καταλόγου An error occurred while loading the icon. Παρουσιάστηκε ένα σφάλμα κατά την φόρτωση του εικονιδίου. ================================================ FILE: plugin-directorymenu/translations/directorymenu_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Directory Menu" Desktop Entry/Comment: "Displays a menu showing the contents of a directory" ================================================ FILE: plugin-directorymenu/translations/directorymenu_en_GB.ts ================================================ DirectoryMenu Open Open Open in terminal Open in terminal DirectoryMenuConfiguration Directory Menu Settings Directory Menu Settings Appearance Appearance Base directory: Base directory: BaseDirectoryName BaseDirectoryName Icon: Icon: Label Label Button style Button style Terminal Terminal Choose Default Terminal Choose Default Terminal Only icon Only icon Only text Only text Icon and text Icon and text Choose Base Directory Choose Base Directory Choose Icon Choose Icon Icons (*.png *.xpm *.jpg *.svg) Icons (*.png *.xpm *.jpg *.svg) Choose Label Choose Label Label: Label: Directory Menu Directory Menu An error occurred while loading the icon. An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_es.desktop.yaml ================================================ Desktop Entry/Name: "Menú de directorio" Desktop Entry/Comment: "Muestra en un menú el contenido de un directorio" ================================================ FILE: plugin-directorymenu/translations/directorymenu_es.ts ================================================ DirectoryMenu Open Abrir Open in terminal Abrir en la terminal DirectoryMenuConfiguration Directory Menu Settings Configuración del Menú de directorio Appearance Apariencia Base directory: Directorio base: BaseDirectoryName Nombre del directorio base Icon: Icono: Label Etiqueta Button style Estilo de botón Terminal Terminal Choose Default Terminal Elegir la terminal por defecto Only icon Solo el icono Only text Solo el texto Icon and text Icono y texto Choose Base Directory Elija el directorio base Choose Icon Elija el icono Icons (*.png *.xpm *.jpg *.svg) Iconos (*.png *.xpm *.jpg *.svg) Choose Label Elegir la etiqueta Label: Etiqueta: Directory Menu Menú de directorio An error occurred while loading the icon. Ha ocurrido un error al intentar cargar el icono. ================================================ FILE: plugin-directorymenu/translations/directorymenu_et.desktop.yaml ================================================ Desktop Entry/Name: "Kaustade menüü" Desktop Entry/Comment: "Kuvab kaustapuud menüünupuna" ================================================ FILE: plugin-directorymenu/translations/directorymenu_et.ts ================================================ DirectoryMenu Open Ava Open in terminal Ava terminalis DirectoryMenuConfiguration Directory Menu Settings Kaustade menüü seadistused Appearance Välimus Base directory: Lähtekaust: BaseDirectoryName Lähtekausta nimi Icon: Ikoon: Label Silt Button style Nuppude stiil Terminal Terminal Choose Default Terminal Vali vaikimisi kasutatav terminalirakendus Only icon Ainult ikoon Only text Ainult tekst Icon and text Ikoon ja tekst Choose Base Directory Palun vali kaust, millest alates kuvame kaustade puud Choose Icon Vali ikoon Icons (*.png *.xpm *.jpg *.svg) Ikoonid (*.png *.xpm *.jpg *.svg) Choose Label Vali silt Label: Silt: Directory Menu Kaustade menüü An error occurred while loading the icon. Ikooni laadimisel tekkis viga. ================================================ FILE: plugin-directorymenu/translations/directorymenu_fi.desktop.yaml ================================================ Desktop Entry/Name: "Hakemistovalikko" Desktop Entry/Comment: "Näyttää hakemiston sisällön valikossa" ================================================ FILE: plugin-directorymenu/translations/directorymenu_fi.ts ================================================ DirectoryMenu Open Avaa Open in terminal Avaa päätteessä DirectoryMenuConfiguration Directory Menu Settings Hakemistovalikon asetukset Appearance Ulkoasu Base directory: Hakemisto: BaseDirectoryName Hakemiston nimi Icon: Kuvake: Label Nimike Button style Painiketyyli Terminal Pääte Choose Default Terminal Valitse oletuspääte Only icon Kuvake Only text Teksti Icon and text Kuvake ja teksti Choose Base Directory Valitse näytettävä hakemisto Choose Icon Valitse kuvake Icons (*.png *.xpm *.jpg *.svg) Kuvakkeet (*.png *.xpm *.jpg *.svg) Choose Label Valitse nimike Label: Nimike: Directory Menu Hakemistovalikko An error occurred while loading the icon. Kuvaketta ladattaessa tapahtui virhe. ================================================ FILE: plugin-directorymenu/translations/directorymenu_fr.desktop.yaml ================================================ Desktop Entry/Name: "Menu de répertoire" Desktop Entry/Comment: "Affiche un menu avec le contenu d'un répertoire" ================================================ FILE: plugin-directorymenu/translations/directorymenu_fr.ts ================================================ DirectoryMenu Open Ouvrir Open in terminal Ouvrir dans le terminal DirectoryMenuConfiguration Directory Menu Settings Paramétrage du menu des répertoires Appearance Apparence Base directory: Répertoire de base : BaseDirectoryName Nom du répertoire de base Icon: Icône : Label Étiquette Button style Style du bouton Terminal Qterminal Choose Default Terminal Choisir le terminal par défaut Only icon Seulement l'icône Only text Seulement le texte Icon and text Icône et texte Choose Base Directory Choisir le répertoire de base Choose Icon Choisir l'icône Icons (*.png *.xpm *.jpg *.svg) Icônes (*.png *.xpm *.jpg *.svg) Choose Label Choisir l'étiquette Label: Étiquette : Directory Menu Menu des répertoires An error occurred while loading the icon. Une erreur s'est produite lors du chargement de l'icône. ================================================ FILE: plugin-directorymenu/translations/directorymenu_gl.ts ================================================ DirectoryMenu Open Abrir Open in terminal Abrir nun terminal DirectoryMenuConfiguration Directory Menu Settings Axustes do menú de directorios Appearance Aparencia Base directory: Directorio base: BaseDirectoryName Nome do directorio base Icon: Icona: Label Button style Terminal Terminal Choose Default Terminal Escolla o terminal predeterminado Only icon Only text Icon and text Choose Base Directory Escolla o directorio base Choose Icon Escolla a icona Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu Menú de directorios An error occurred while loading the icon. Produciuse un erro ao cargar a icona. ================================================ FILE: plugin-directorymenu/translations/directorymenu_he.desktop.yaml ================================================ Desktop Entry/Name: "תפריט תיקייה" Desktop Entry/Comment: "מציג תפריט עם התכנים שבתיקייה" ================================================ FILE: plugin-directorymenu/translations/directorymenu_he.ts ================================================ DirectoryMenu Open פתיחה Open in terminal פתיחה במסוף DirectoryMenuConfiguration Directory Menu Settings הגדרות תפריט תיקיות Appearance מראה Base directory: תיקיית בסיס: BaseDirectoryName שם תיקיית בסיס Icon: סמל: Label תווית Button style סגנון כפתור Terminal מסוף Choose Default Terminal בחירת מסוף בררת המחדל Only icon סמל בלבד Only text כיתוב בלבד Icon and text סמל וכיתוב Choose Base Directory בחירת תיקיית בסיס Choose Icon בחירת סמל Icons (*.png *.xpm *.jpg *.svg) סמלים (‎*.png‏ ‎*.xpm‏ ‎*.jpg‏ ‎*.svg) Choose Label בחירת תווית Label: תווית: Directory Menu תפריט תיקיות An error occurred while loading the icon. אירעה שגיאה בעת טעינת הסמל. ================================================ FILE: plugin-directorymenu/translations/directorymenu_hr.desktop.yaml ================================================ Desktop Entry/Name: "Izbornik mape" Desktop Entry/Comment: "Prikazuje sadržaj mape u izborniku" ================================================ FILE: plugin-directorymenu/translations/directorymenu_hr.ts ================================================ DirectoryMenu Open Otvori Open in terminal Otvori u terminalu DirectoryMenuConfiguration Directory Menu Settings Izbornik mape – Postavke Appearance Izgled Base directory: Osnovna mapa: BaseDirectoryName Ime osnovne mape Icon: Ikona: Label Etiketa Button style Stil gumbova Terminal Terminal Choose Default Terminal Odaberi standardni terminal Only icon Samo ikona Only text Samo tekst Icon and text Ikona i tekst Choose Base Directory Odaberi osnovnu mapu Choose Icon Odaberi ikonu Icons (*.png *.xpm *.jpg *.svg) Ikone (*.png *.xpm *.jpg *.svg) Choose Label Odaberi etiketu Label: Etiketa: Directory Menu Izbornik mape An error occurred while loading the icon. Došlo je do greške pri učitavanju ikone. ================================================ FILE: plugin-directorymenu/translations/directorymenu_hu.desktop.yaml ================================================ Desktop Entry/Name: "Könyvtármenü" Desktop Entry/Comment: "Egy könyvtár tartalmát mutató menü" ================================================ FILE: plugin-directorymenu/translations/directorymenu_hu.ts ================================================ DirectoryMenu Open Megnyitás Open in terminal Megnyitás terminálban DirectoryMenuConfiguration Directory Menu Settings Könyvtármenü beállítás Appearance Megjelenés Base directory: Alapkönyvtár: BaseDirectoryName Alapkönyvtárnév Icon: Ikon: Label Címke Button style Gombstílus Terminal Terminál Choose Default Terminal Alapértelmezett terminál kiválasztása Only icon Csak ikon Only text Csak szöveg Icon and text Ikon és szöveg Choose Base Directory Alapkönyvtár kiválasztása Choose Icon Ikon kiválasztása Icons (*.png *.xpm *.jpg *.svg) Ikonok (*.png *.xpm *.jpg *.svg) Choose Label Címke kiválasztása Label: Címke: Directory Menu Könyvtármenü An error occurred while loading the icon. Hiba történt az ikon betöltése közben. ================================================ FILE: plugin-directorymenu/translations/directorymenu_id.ts ================================================ DirectoryMenu Open Buka Open in terminal Buka di terminal DirectoryMenuConfiguration Directory Menu Settings Pengaturan Menu Direktori Appearance Penampilan Base directory: Direktori dasar: BaseDirectoryName BaseDirectoryName Icon: Ikon: Label Label Button style Gaya tombol Terminal Terminal Choose Default Terminal Pilih Terminal Default Only icon Hanya ikon Only text Hanya teks Icon and text Ikon dan teks Choose Base Directory Pilih Direktori Dasar Choose Icon Pilih Ikon Icons (*.png *.xpm *.jpg *.svg) Ikon (*.png *.xpm *.jpg *.svg) Choose Label Pilih Label Label: Label: Directory Menu Menu Direktori An error occurred while loading the icon. Terjadi kesalahan saat memuat ikon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_it.desktop.yaml ================================================ Desktop Entry/Name: "Menu cartella" Desktop Entry/Comment: "Mostra il contenuto di una cartella" ================================================ FILE: plugin-directorymenu/translations/directorymenu_it.ts ================================================ DirectoryMenu Open Apri Open in terminal Apri nel terminale DirectoryMenuConfiguration Directory Menu Settings Impostazioni del menu Appearance Aspetto Base directory: Cartella mostrata: BaseDirectoryName Nome della cartella Icon: Icona: Label Etichetta Button style Stile pulsante Terminal Terminale Choose Default Terminal Seleziona terminale predefinito Only icon Solo icona Only text Solo testo Icon and text Icona e testo Choose Base Directory Seleziona cartella mostrata Choose Icon Scegli icona Icons (*.png *.xpm *.jpg *.svg) Icone (*.png *.xpm *.jpg *.svg) Choose Label Seleziona etichetta Label: Etichetta: Directory Menu Menu cartella An error occurred while loading the icon. Errore durante il caricamento dell'icona. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ja.desktop.yaml ================================================ Desktop Entry/Name: "ディレクトリメニュー" Desktop Entry/Comment: "指定したディレクトリからツリー表示します" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ja.ts ================================================ DirectoryMenu Open 開く Open in terminal 端末で開く DirectoryMenuConfiguration Directory Menu Settings ディレクトリメニューの設定 Appearance 外観 Base directory: ベースディレクトリ: BaseDirectoryName ベースディレクトリの名前 Icon: アイコン: Label ラベル Button style ボタンのスタイル Terminal 端末 Choose Default Terminal 既定の端末を選択 Only icon アイコンのみ Only text テキストのみ Icon and text アイコンとテキスト Choose Base Directory ベースディレクトリを選ぶ Choose Icon アイコンを選ぶ Icons (*.png *.xpm *.jpg *.svg) アイコン (*.png *.xpm *.jpg *.svg) Choose Label ラベルの選択 Label: ラベル: Directory Menu ディレクトリメニュー An error occurred while loading the icon. アイコンのロード中にエラーが発生しました。 ================================================ FILE: plugin-directorymenu/translations/directorymenu_ka.desktop.yaml ================================================ Desktop Entry/Name: "საქაღალდის მენიუ" Desktop Entry/Comment: "აჩვენებს მენიუს, რომელიც საქაღალდის შემცველობას აჩვენებს" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ka.ts ================================================ DirectoryMenu Open გახსნა Open in terminal ტერმინალში გახსნა DirectoryMenuConfiguration Directory Menu Settings საქაღალდის მენიუს მორგება Appearance გარეგნობა Base directory: საბაზისო საქაღალდე: BaseDirectoryName საბაზისოსაქაღალდისსახელი Icon: ხატულა: Label ჭდე Button style ღილაკის სტილი Terminal ტერმინალი Choose Default Terminal აირჩიეთ ნაგულისხმევი ტერმინალი Only icon მხოლოდ ხატულა Only text მხოლოდ ტექსტური Icon and text ხატულა და ტექსტი Choose Base Directory აირჩიეთ საბაზისო საქაღალდე Choose Icon აირჩიეთ ხატულა Icons (*.png *.xpm *.jpg *.svg) ხატულები (*.png *.xpm *.jpg *.svg) Choose Label აირჩიეთ ჭდე Label: ჭდე: Directory Menu კატალოგის მენიუ An error occurred while loading the icon. შეცდომა ხატულას ჩატვირთვისას. ================================================ FILE: plugin-directorymenu/translations/directorymenu_kab.ts ================================================ DirectoryMenu Open Ldi Open in terminal DirectoryMenuConfiguration Directory Menu Settings Appearance Base directory: BaseDirectoryName Icon: Tignit: Label Tabzimt Button style Terminal Choose Default Terminal Only icon Tignit kan Only text Aḍris kan Icon and text Tignit akked uḍris Choose Base Directory Choose Icon Fren tignit Icons (*.png *.xpm *.jpg *.svg) Choose Label Fren tabzimt Label: Tabzimt: Directory Menu An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_kk.desktop.yaml ================================================ Desktop Entry/Name: "Бума ағаш мәзірі" Desktop Entry/Comment: "Бума мазмұнын көрсететін мәзірді көрсетеді" ================================================ FILE: plugin-directorymenu/translations/directorymenu_kk.ts ================================================ DirectoryMenu Open Ашу Open in terminal Терминалда ашу DirectoryMenuConfiguration Directory Menu Settings Бума мәзірінің баптаулары Appearance Сыртқы түрі Base directory: Негізгі бума: BaseDirectoryName Негізгі бума аты Icon: Таңбаша: Label Белгі Button style Батырма стилі Terminal Терминал Choose Default Terminal Әдепкі терминалды таңдау Only icon Тек таңбаша Only text Тек мәтін Icon and text Таңбаша мен мәтін Choose Base Directory Негізгі буманы таңдау Choose Icon Таңбашаны таңдау Icons (*.png *.xpm *.jpg *.svg) Таңбашалар (*.png *.xpm *.jpg *.svg) Choose Label Белгіні таңдау Label: Белгі: Directory Menu Бума мәзірі An error occurred while loading the icon. Таңбашаны жүктеу кезінде қате орын алды. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ko.desktop.yaml ================================================ Desktop Entry/Name: "디렉터리 메뉴" Desktop Entry/Comment: "디렉터리의 내용을 보여주는 메뉴를 표시합니다" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ko.ts ================================================ DirectoryMenu Open 열기 Open in terminal 터미널에서 열기 DirectoryMenuConfiguration Directory Menu Settings 디렉터리 메뉴 설정 Appearance 모양새 Base directory: 기본 디렉터리: BaseDirectoryName 기본 디렉터리이름 Icon: 아이콘: Label 레이블 Button style 버튼 스타일 Terminal 터미널 Choose Default Terminal 기본 터미널 선택하기 Only icon 아이콘만 Only text 텍스트만 Icon and text 아이콘 및 텍스트 Choose Base Directory 기본 디렉터리 선택하기 Choose Icon 아이콘 선택하기 Icons (*.png *.xpm *.jpg *.svg) 아이콘 (*.png *.xpm *.jpg *.svg) Choose Label 레이블 선택하기 Label: 레이블: Directory Menu 디렉터리 메뉴 An error occurred while loading the icon. 아이콘을 불러오는 중에 오류가 발생했습니다. ================================================ FILE: plugin-directorymenu/translations/directorymenu_lg.desktop.yaml ================================================ Desktop Entry/Name: "Menyu ey'amaterekero" Desktop Entry/Comment: "Kano kakuwa menyu ekusobozesa okubikkula etterekero n'agarisangibwamu" ================================================ FILE: plugin-directorymenu/translations/directorymenu_lg.ts ================================================ DirectoryMenu Open Bikkula Open in terminal Bikkulira mu kiwandikiro DirectoryMenuConfiguration Directory Menu Settings Enteekateeka za menyu ey'amaterekero Appearance Endabika Base directory: Menyu ekole ku tterekero lino: BaseDirectoryName Linnya lya tterekero erikolebwako Icon: Kafaananyi: Label Kirambe Button style Endabika ya ppeesa Terminal Kika kya kiwandikiro Choose Default Terminal Londa ekika ky'ekiwandikiro amaterekero mwe ganaabikkulirwanga Only icon Kubeko kafaananyi kokka Only text Kubeko bigambo byokka Icon and text Kubeko kafaananyi n'ebigambo Choose Base Directory Londa etterekero menyu mwekolera Choose Icon Londa akafaananyi Icons (*.png *.xpm *.jpg *.svg) Bufaananyi (*.png *.xpm *.jpg *.svg) Choose Label Tegeka ekirambe Label: Kirambe: Directory Menu Menyu y'amaterekero An error occurred while loading the icon. Okubikkula kafaananyi kuzzemu kiremya. ================================================ FILE: plugin-directorymenu/translations/directorymenu_lt.desktop.yaml ================================================ Desktop Entry/Name: "Katalogų meniu" Desktop Entry/Comment: "Rodo meniu, kuriame rodomas katalogų turinys" ================================================ FILE: plugin-directorymenu/translations/directorymenu_lt.ts ================================================ DirectoryMenu Open Atverti Open in terminal Atverti terminale DirectoryMenuConfiguration Directory Menu Settings Katalogų meniu nustatymai Appearance Išvaizda Base directory: Bazinis katalogas: BaseDirectoryName Bazinio katalogo pavadinimas Icon: Piktograma: Label Etiketė Button style Mygtukų stilius Terminal Terminalas Choose Default Terminal Pasirinkti numatytąjį terminalą Only icon Tik piktograma Only text Tik tekstas Icon and text Piktograma ir tekstas Choose Base Directory Pasirinkite bazinį katalogą Choose Icon Pasirinkite piktogramą Icons (*.png *.xpm *.jpg *.svg) Piktogramos (*.png *.xpm *.jpg *.svg) Choose Label Pasirinkti etiketę Label: Etiketė: Directory Menu Katalogų meniu An error occurred while loading the icon. Įkeliant piktogramą, įvyko klaida. ================================================ FILE: plugin-directorymenu/translations/directorymenu_lv.desktop.yaml ================================================ Desktop Entry/Name: "Kataloga/mapju izvēlne" Desktop Entry/Comment: "Rāda izvēlni, kurā redzams mapes saturs" ================================================ FILE: plugin-directorymenu/translations/directorymenu_lv.ts ================================================ DirectoryMenu Open Atvērt Open in terminal Atvērt konsolē (terminālī) DirectoryMenuConfiguration Directory Menu Settings Mapju izvēlnes iestatījumi Appearance Izskats Base directory: Bāzes katalogs/mape/direktorija: BaseDirectoryName BāzesKatalogaNosaukums Icon: Ikona: Label Button style Terminal Termināls Choose Default Terminal Izvēlieties noklusējuma termināli Only icon Only text Icon and text Choose Base Directory Izvēlieties bāzes mapi Choose Icon Izvēlieties ikonu Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu Mapju izvēlne An error occurred while loading the icon. Ielādējot ikonu atgadījās kļūme. ================================================ FILE: plugin-directorymenu/translations/directorymenu_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Mappemeny" Desktop Entry/Comment: "Viser en meny som viser innholdet av en mappe" ================================================ FILE: plugin-directorymenu/translations/directorymenu_nb_NO.ts ================================================ DirectoryMenu Open Åpne Open in terminal Åpne i terminal DirectoryMenuConfiguration Directory Menu Settings Mappemenyinnstillinger Appearance Utseende Base directory: Basismappe: BaseDirectoryName Basismappenavn Icon: Ikon: Label Etikett Button style Knappestil Terminal Terminal Choose Default Terminal Velg standard terminal Only icon Kun ikon Only text Kun tekst Icon and text Ikon og tekst Choose Base Directory Velg basismappe Choose Icon Velg ikon Icons (*.png *.xpm *.jpg *.svg) Ikoner (*.png *.xpm *.jpg *.svg) Choose Label Velg etikett Label: Etikett: Directory Menu Mappemeny An error occurred while loading the icon. En feil oppstod da ikonet ble lastet inn. ================================================ FILE: plugin-directorymenu/translations/directorymenu_nl.desktop.yaml ================================================ Desktop Entry/Name: "Mapmenu" Desktop Entry/Comment: "Toont de inhoud van een map in een menu" ================================================ FILE: plugin-directorymenu/translations/directorymenu_nl.ts ================================================ DirectoryMenu Open Openen Open in terminal Openen in terminalvenster DirectoryMenuConfiguration Directory Menu Settings Mapmenu-instellingen Appearance Vormgeving Base directory: Hoofdmap: BaseDirectoryName Naam van hoofdmap Icon: Pictogram: Label Label Button style Knopstijl Terminal Terminal Choose Default Terminal Kies standaard terminalprogramma Only icon Alleen pictogrammen Only text Alleen tekst Icon and text Pictogrammen en tekst Choose Base Directory Kies een hoofdmap Choose Icon Kies een pictogram Icons (*.png *.xpm *.jpg *.svg) Pictogrammen (*.png *.xpm *.jpg *.svg) Choose Label Voer een labelnaam in Label: Label: Directory Menu Mapmenu An error occurred while loading the icon. Er is een fout opgetreden bij het laden van het pictogram. ================================================ FILE: plugin-directorymenu/translations/directorymenu_oc.desktop.yaml ================================================ Desktop Entry/Name: "Menú del repertòri" Desktop Entry/Comment: "" ================================================ FILE: plugin-directorymenu/translations/directorymenu_oc.ts ================================================ DirectoryMenu Open Dobrir Open in terminal Dobrir dins un terminal DirectoryMenuConfiguration Directory Menu Settings Paramètres del menú dels repertòris Appearance Aparéncia Base directory: Repertòri de basa : BaseDirectoryName NomRepertòriDeBasa Icon: Icòna : Label Etiqueta Button style Estil del boton Terminal Terminal Choose Default Terminal Causir lo terminal per defaut Only icon Sonque icònas Only text Sonque tèxt Icon and text Tèxt e icòna Choose Base Directory Causir lo repertòri de basa Choose Icon Causir l’icòna Icons (*.png *.xpm *.jpg *.svg) Icònas (*.png *.xpm *.jpg *.svg) Choose Label Causir l’etiqueta Label: Etiqueta : Directory Menu Menú dels repertòris An error occurred while loading the icon. S'es producha una error pendent lo cargament de l’icòna. ================================================ FILE: plugin-directorymenu/translations/directorymenu_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਡਾਇਰੈਕਟਰੀ ਮੇਨੂ" Desktop Entry/Comment: "ਡਾਇਰੈਕਟਰੀ ਦੀ ਸਮੱਗਰੀ ਦਿਖਾਉਣ ਲਈ ਮੇਨੂ ਦਿਖਾਉਂਦਾ ਹੈ" ================================================ FILE: plugin-directorymenu/translations/directorymenu_pa.ts ================================================ DirectoryMenu Open ਖੋਲ੍ਹੋ Open in terminal ਟਰਮੀਨਲ ਵਿੱਚ ਖੋਲ੍ਹੋ DirectoryMenuConfiguration Directory Menu Settings ਡਾਇਰੈਕਟਰੀ ਮੇਨੂ ਸੈਟਿੰਗਾਂ Appearance ਦਿੱਖ Base directory: ਬੇਸ ਡਾਇਰੈਕਟਰੀ: BaseDirectoryName ਬੇਸ-ਡਾਇਰੈਕਟਰੀ-ਨਾਂ Icon: ਆਈਕਾਨ: Label ਲੇਬਲ Button style ਬਟਨ ਦਾ ਸਟਾਈਲ Terminal ਟਰਮੀਨਲ Choose Default Terminal ਮੂਲ ਟਰਮੀਨਲ ਚੁਣੋ Only icon ਸਿਰਫ਼ ਆਈਕਾਨ Only text ਸਿਰਫ਼ ਲਿਖਤ Icon and text ਆਈਕਾਨ ਤੇ ਲਿਖਤ Choose Base Directory ਮੂਲ ਡਾਇਰੈਕਟਰੀ ਚੁਣੋ Choose Icon ਆਈਕਾਨ ਚੁਣੋ Icons (*.png *.xpm *.jpg *.svg) ਆਈਕਾਨ (*.png *.xpm *.jpg *.svg) Choose Label ਲੇਬਲ ਚੁਣੋ Label: ਲੇਬਲ: Directory Menu ਡਾਇਰੈਕਟਰੀ ਮੇਨੂ An error occurred while loading the icon. ਆਈਕਾਨ ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। ================================================ FILE: plugin-directorymenu/translations/directorymenu_pl.desktop.yaml ================================================ Desktop Entry/Name: "Menu katalogów" Desktop Entry/Comment: "Wyświetla menu z zawartością katalogów" ================================================ FILE: plugin-directorymenu/translations/directorymenu_pl.ts ================================================ DirectoryMenu Open Otwarty Open in terminal Otwórz w terminalu DirectoryMenuConfiguration Directory Menu Settings Menu katalogu Appearance Wygląd Base directory: Katalog główny: BaseDirectoryName Nazwa katalogu podstawowego Icon: Ikona: Label Opis Button style Styl przycisków Terminal Terminal Choose Default Terminal Wybierz domyślny terminal Only icon Tylko ikona Only text Tylko tekst Icon and text Ikona i tekst Choose Base Directory Wybierz katalog bazowy Choose Icon Wybierz ikonę Icons (*.png *.xpm *.jpg *.svg) Ikony (*.png *.xpm *.jpg *.svg) Choose Label Wybierz opis Label: Opis: Directory Menu Menu katalogu An error occurred while loading the icon. Wystąpił błąd podczas ładowania ikony. ================================================ FILE: plugin-directorymenu/translations/directorymenu_pt.desktop.yaml ================================================ Desktop Entry/Name: "Menu de diretórios" Desktop Entry/Comment: "Mostra um menu com o conteúdo do diretório" ================================================ FILE: plugin-directorymenu/translations/directorymenu_pt.ts ================================================ DirectoryMenu Open Abrir Open in terminal Abrir no terminal DirectoryMenuConfiguration Directory Menu Settings Configuração do Menu de diretórios Appearance Aparência Base directory: Diretório base: BaseDirectoryName Nome do diretório base Icon: Ícone: Label Rótulo Button style Estilo do botão Terminal Terminal Choose Default Terminal Escolher terminal padrão Only icon Apenas o ícone Only text Apenas o texto Icon and text Ícone e texto Choose Base Directory Escolha o diretório base Choose Icon Escolha o ícone Icons (*.png *.xpm *.jpg *.svg) Ícones (*.png *.xpm *.jpg *.svg) Choose Label Escolha o rótulo Label: Rótulo: Directory Menu Menu de diretórios An error occurred while loading the icon. Ocorreu um erro ao carregar o ícone. ================================================ FILE: plugin-directorymenu/translations/directorymenu_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Menu de diretório" Desktop Entry/Comment: "Abre um menu mostrando o conteúdo de um diretório" ================================================ FILE: plugin-directorymenu/translations/directorymenu_pt_BR.ts ================================================ DirectoryMenu Open Abrir Open in terminal Abrir no terminal DirectoryMenuConfiguration Directory Menu Settings Configurações do menu de diretório Appearance Aparência Base directory: Diretório base: BaseDirectoryName Icon: Ícone: Label Rótulo Button style Estilo do botão Terminal Terminal Choose Default Terminal Escolher terminal padrão Only icon Só ícone Only text Só texto Icon and text Ícone e texto Choose Base Directory Escolher diretório base Choose Icon Escolher ícone Icons (*.png *.xpm *.jpg *.svg) Ícones (*.png *.xpm *.jpg *.svg) Choose Label Escolher rótulo Label: Rótulo: Directory Menu Menu de diretório An error occurred while loading the icon. Um erro ocorreu ao carregar o ícone. ================================================ FILE: plugin-directorymenu/translations/directorymenu_ru.desktop.yaml ================================================ Desktop Entry/Name: "Меню каталога" Desktop Entry/Comment: "Показывает меню, отображающее содержимое каталога" ================================================ FILE: plugin-directorymenu/translations/directorymenu_ru.ts ================================================ DirectoryMenu Open Открыть Open in terminal Открыть в терминале DirectoryMenuConfiguration Directory Menu Settings Настройки меню каталога Appearance Внешний вид Base directory: Начальный каталог: BaseDirectoryName ИмяБазовогоКаталога Icon: Значок: Label Подпись Button style Стиль кнопок Terminal Терминал Choose Default Terminal Выберите терминал по умолчанию Only icon Только значок Only text Только текст Icon and text Значок и текст Choose Base Directory Выберите начальный каталог Choose Icon Выберите значок Icons (*.png *.xpm *.jpg *.svg) Значки (*.png *.xpm *.jpg *.svg) Choose Label Выбрать надпись Label: Надпись: Directory Menu Меню каталога An error occurred while loading the icon. Произошла ошибка при загрузке значка. ================================================ FILE: plugin-directorymenu/translations/directorymenu_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-directorymenu/translations/directorymenu_si.ts ================================================ DirectoryMenu Open Open in terminal DirectoryMenuConfiguration Directory Menu Settings Appearance Base directory: BaseDirectoryName Icon: Label Button style Terminal Choose Default Terminal Only icon Only text Icon and text Choose Base Directory Choose Icon Icons (*.png *.xpm *.jpg *.svg) Choose Label Label: Directory Menu An error occurred while loading the icon. ================================================ FILE: plugin-directorymenu/translations/directorymenu_sk.desktop.yaml ================================================ Desktop Entry/Name: "Ponuka adresára" Desktop Entry/Comment: "Zobrazuje ponuku s obsahom priečinka" ================================================ FILE: plugin-directorymenu/translations/directorymenu_sk_SK.ts ================================================ DirectoryMenu Open Otvoriť Open in terminal Otvoriť v terminále DirectoryMenuConfiguration Directory Menu Settings Nastavenie ponuky Appearance Vzhľad Base directory: Základný adresár: BaseDirectoryName Názov základného adresára Icon: Ikona: Label Označenie Button style Štýl tlačidla Terminal Terminál Choose Default Terminal Vybrať predvolený terminál Only icon Iba ikona Only text Iba text Icon and text Ikona a text Choose Base Directory Vybrať základný adresár Choose Icon Zvoliť ikonu Icons (*.png *.xpm *.jpg *.svg) Ikony (*.png *.xpm *.jpg *.svg) Choose Label Vyberať štítok Label: Označenie: Directory Menu Ponuka adresára An error occurred while loading the icon. Pri načítaní ikony nastala chyba. ================================================ FILE: plugin-directorymenu/translations/directorymenu_sr.desktop.yaml ================================================ Desktop Entry/Name: "Мени директорија" Desktop Entry/Comment: "Приказује мени који приказује садржај директорија" ================================================ FILE: plugin-directorymenu/translations/directorymenu_sv.desktop.yaml ================================================ Desktop Entry/Name: "Mappmeny" Desktop Entry/Comment: "Öppnar en meny som visar innehållet av en mapp" ================================================ FILE: plugin-directorymenu/translations/directorymenu_sv.ts ================================================ DirectoryMenu Open Öppna Open in terminal Öppna i terminal DirectoryMenuConfiguration Directory Menu Settings Inställningar för mapp-meny Appearance Utseende Base directory: Basmapp: BaseDirectoryName BaseDirectoryName Icon: Ikon: Label Etikett Button style Knappstil Terminal Terminal Choose Default Terminal Välj standard Terminal Only icon Endast ikon Only text Endast text Icon and text Ikon och text Choose Base Directory Välj basmapp Choose Icon Välj ikon Icons (*.png *.xpm *.jpg *.svg) Ikoner (*.png *.xpm *.jpg *.svg) Choose Label Välj etikett Label: Etikett: Directory Menu Mapp-meny An error occurred while loading the icon. Ett fel inträffade när ikonen laddades. ================================================ FILE: plugin-directorymenu/translations/directorymenu_tr.desktop.yaml ================================================ Desktop Entry/Name: "Dizin Menüsü" Desktop Entry/Comment: "Bir dizinin içeriğini gösteren bir menü görüntüler" ================================================ FILE: plugin-directorymenu/translations/directorymenu_tr.ts ================================================ DirectoryMenu Open Open in terminal Terminal'de aç DirectoryMenuConfiguration Directory Menu Settings Dizin Menü Ayarları Appearance Görünüm Base directory: Temel dizin: BaseDirectoryName Temel Dizin Adı Icon: Simge: Label Etiket Button style Düğme biçemi Terminal Terminal Choose Default Terminal Varsayılan Terminal'i Seç Only icon Sadece simge Only text Sadece metin Icon and text Simge ve metin Choose Base Directory Temel Dizini Seç Choose Icon Simge Seç Icons (*.png *.xpm *.jpg *.svg) Simgeler (*.png *.xpm *.jpg *.svg) Choose Label Etiket Seç Label: Etiket: Directory Menu Dizin Menüsü An error occurred while loading the icon. Simge yüklenirken hata oluştu. ================================================ FILE: plugin-directorymenu/translations/directorymenu_uk.desktop.yaml ================================================ Desktop Entry/Name: "Меню теки" Desktop Entry/Comment: "Показує меню, яке відображає вміст теки" ================================================ FILE: plugin-directorymenu/translations/directorymenu_uk.ts ================================================ DirectoryMenu Open Відкрити Open in terminal Відкрити у терміналі DirectoryMenuConfiguration Directory Menu Settings Налаштування меню тек Appearance Вигляд Base directory: Базова тека: BaseDirectoryName НазваБазовоїТеки Icon: Піктограма: Label Мітка Button style Стиль кнопок Terminal Термінал Choose Default Terminal Вибрати типовий термінал Only icon Лише піктограма Only text Лише текст Icon and text Піктограма та текст Choose Base Directory Вибрати базову теку Choose Icon Вибрати піктограму Icons (*.png *.xpm *.jpg *.svg) Піктограми (*.png *.xpm *.jpg *.svg) Choose Label Обрати мітку Label: Мітка: Directory Menu Меню теки An error occurred while loading the icon. Сталася помилка завантаження піктограми. ================================================ FILE: plugin-directorymenu/translations/directorymenu_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "目录菜单" Desktop Entry/Comment: "显示包含目录内容的菜单" ================================================ FILE: plugin-directorymenu/translations/directorymenu_zh_CN.ts ================================================ DirectoryMenu Open 打开 Open in terminal 在终端打开 DirectoryMenuConfiguration Directory Menu Settings 目录菜单设置 Appearance 外观 Base directory: 起始目录: BaseDirectoryName 基本目录名 Icon: 图标: Label 标签 Button style 按钮样式 Terminal 终端 Choose Default Terminal 选择默认终端 Only icon 仅有图标 Only text 只有文本 Icon and text 图标和文本 Choose Base Directory 选择起始目录 Choose Icon 选择图标 Icons (*.png *.xpm *.jpg *.svg) Icons (*.png *.xpm *.jpg *.svg) Choose Label 选择标签 Label: 标签: Directory Menu 目录菜单 An error occurred while loading the icon. 加载图标时出现错误。 ================================================ FILE: plugin-directorymenu/translations/directorymenu_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "目錄選單" Desktop Entry/Comment: "顯示選單呈現目錄內容" ================================================ FILE: plugin-directorymenu/translations/directorymenu_zh_TW.ts ================================================ DirectoryMenu Open 開啟 Open in terminal 開啟終端機 DirectoryMenuConfiguration Directory Menu Settings 目錄選單設定 Appearance 外觀 Base directory: 基本目錄: BaseDirectoryName 基本目錄名稱 Icon: 圖示: Label 標籤 Button style 按鈕樣式 Terminal 終端機 Choose Default Terminal 選擇預設終端機 Only icon 僅圖示 Only text 僅文字 Icon and text 圖示和文字 Choose Base Directory 選擇基本目錄 Choose Icon 選擇圖示 Icons (*.png *.xpm *.jpg *.svg) 圖示 (*.png *.xpm *.jpg *.svg) Choose Label 選擇標籤 Label: 標籤: Directory Menu 目錄選單 An error occurred while loading the icon. 載入圖示時發生錯誤。 ================================================ FILE: plugin-dom/CMakeLists.txt ================================================ set(PLUGIN "dom") set(HEADERS domplugin.h treewindow.h domtreeitem.h ) set(SOURCES domplugin.cpp treewindow.cpp domtreeitem.cpp ) set(UIS treewindow.ui ) set(RESOURCES resources.qrc ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-dom/domplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "domplugin.h" #include "treewindow.h" #include #include DomPlugin::DomPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo) { mButton.setAutoRaise(true); mButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mButton.setIcon(XdgIcon::fromTheme(QStringLiteral("preferences-plugin"))); mButton.setToolTip(tr("Panel DOM Tree")); connect(&mButton, &QToolButton::clicked, this, &DomPlugin::showDialog); } void DomPlugin::showDialog() { TreeWindow *dialog = mButton.findChild(); if (dialog == 0) { dialog = new TreeWindow(&mButton); dialog->setAttribute(Qt::WA_DeleteOnClose); } willShowWindow(dialog); dialog->show(); dialog->activateWindow(); } ================================================ FILE: plugin-dom/domplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DOMPLUGIN_H #define DOMPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include class DomPlugin: public QObject, public ILXQtPanelPlugin { Q_OBJECT public: DomPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); virtual QWidget *widget() { return &mButton; } virtual QString themeId() const { return QStringLiteral("Dom"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment; } private slots: void showDialog(); private: QToolButton mButton; }; class DomPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new DomPlugin(startupInfo); } }; #endif // DOMPLUGIN_H ================================================ FILE: plugin-dom/domtreeitem.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "domtreeitem.h" #include #include #include #include DomTreeItem::DomTreeItem(QTreeWidget *view, QWidget *widget): QTreeWidgetItem(view), mWidget(widget) { init(); mWidget->installEventFilter(this); connect(mWidget, &QWidget::destroyed, this, &DomTreeItem::widgetDestroyed); } DomTreeItem::DomTreeItem(QTreeWidgetItem *parent, QWidget *widget): QTreeWidgetItem(parent), mWidget(widget) { init(); mWidget->installEventFilter(this); connect(mWidget, &QWidget::destroyed, this, &DomTreeItem::widgetDestroyed); } void DomTreeItem::init() { QStringList hierarchy = widgetClassHierarchy(); for (int i=0; iobjectName(); setText(0, QStringLiteral("%1 (%2)%3").arg( name , widgetClassName(), text)); setText(1, hierarchy.join(QStringLiteral(" :: "))); fill(); } void DomTreeItem::fill() { const QList widgets = mWidget->findChildren(); for (QWidget *w : widgets) { if (w->parentWidget() != mWidget) continue; new DomTreeItem(this, w); } } bool DomTreeItem::eventFilter(QObject *watched, QEvent *event) { if (watched == mWidget && event->type() == QEvent::ChildPolished) { QChildEvent *ce = static_cast(event); QWidget *w = qobject_cast(ce->child()); if (w) { for (int i=0; i(child(i)); if (ci->widget() == w) ci->deleteLater(); } new DomTreeItem(this, w); } } return QObject::eventFilter(watched, event); } QString DomTreeItem::widgetObjectName() const { return mWidget->objectName(); } QString DomTreeItem::widgetText() const { QToolButton *toolButton = qobject_cast(mWidget); if (toolButton) return toolButton->text(); return QLatin1String(""); } QString DomTreeItem::widgetClassName() const { return QString::fromUtf8(mWidget->metaObject()->className()); } QStringList DomTreeItem::widgetClassHierarchy() const { QStringList hierarchy; const QMetaObject *m = mWidget->metaObject(); while (m) { hierarchy << QString::fromUtf8(m->className()); m = m->superClass(); } return hierarchy; } void DomTreeItem::widgetDestroyed() { deleteLater(); } ================================================ FILE: plugin-dom/domtreeitem.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef DOMTREEITEM_H #define DOMTREEITEM_H #include #include class DomTreeItem: public QObject, public QTreeWidgetItem { Q_OBJECT public: explicit DomTreeItem(QTreeWidget *view, QWidget *widget); explicit DomTreeItem(QTreeWidgetItem *parent, QWidget *widget); bool eventFilter(QObject *watched, QEvent *event); QString widgetObjectName() const; QString widgetText() const; QString widgetClassName() const; QStringList widgetClassHierarchy() const; QWidget *widget() const { return mWidget; } private slots: void widgetDestroyed(); private: QWidget *mWidget; void init(); void fill(); }; #endif // DOMTREEITEM_H ================================================ FILE: plugin-dom/resources/dom.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=view-web-browser-dom-tree #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-dom/resources.qrc ================================================ images/widgets/plugin.png images/widgets/calendarwidget.png images/widgets/checkbox.png images/widgets/columnview.png images/widgets/combobox.png images/widgets/commandlinkbutton.png images/widgets/dateedit.png images/widgets/datetimeedit.png images/widgets/dialogbuttonbox.png images/widgets/dial.png images/widgets/dockwidget.png images/widgets/doublespinbox.png images/widgets/fontcombobox.png images/widgets/frame.png images/widgets/graphicsview.png images/widgets/groupboxcollapsible.png images/widgets/groupbox.png images/widgets/hscrollbar.png images/widgets/hslider.png images/widgets/hsplit.png images/widgets/label.png images/widgets/lcdnumber.png images/widgets/lineedit.png images/widgets/line.png images/widgets/listbox.png images/widgets/listview.png images/widgets/mdiarea.png images/widgets/plaintextedit.png images/widgets/plugin.png images/widgets/progress.png images/widgets/pushbutton.png images/widgets/radiobutton.png images/widgets/scrollarea.png images/widgets/spacer.png images/widgets/spinbox.png images/widgets/tabbar.png images/widgets/table.png images/widgets/tabwidget.png images/widgets/textedit.png images/widgets/timeedit.png images/widgets/toolbox.png images/widgets/toolbutton.png images/widgets/vline.png images/widgets/vscrollbar.png images/widgets/vslider.png images/widgets/vspacer.png images/widgets/widget.png images/widgets/widgetstack.png images/widgets/wizard.png ================================================ FILE: plugin-dom/translations/dom.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM Tree" Desktop Entry/Comment: "Show a DOM tree of the LXQt panel" ================================================ FILE: plugin-dom/translations/dom.ts ================================================ DomPlugin Panel DOM Tree TreeWindow Panel DOM Tree Property Value All properties Type String value ================================================ FILE: plugin-dom/translations/dom_ar.desktop.yaml ================================================ Desktop Entry/Name: "شجرة DOM للّوحة" Desktop Entry/Comment: "تُظهر شجرة DOM للوحة لكسكيوت" ================================================ FILE: plugin-dom/translations/dom_ar.ts ================================================ DomPlugin Panel DOM Tree لوحة شجرة DOM TreeWindow Panel DOM Tree لوحة شجرة DOM Property ميزة Value قيمة All properties كل الصفات Type نوع String value قيمة السلسلة ================================================ FILE: plugin-dom/translations/dom_arn.ts ================================================ DomPlugin Panel DOM Tree TreeWindow Panel DOM Tree Property Value All properties Type String value ================================================ FILE: plugin-dom/translations/dom_ast.ts ================================================ DomPlugin Panel DOM Tree TreeWindow Panel DOM Tree Property Value All properties Type String value ================================================ FILE: plugin-dom/translations/dom_bg.desktop.yaml ================================================ Desktop Entry/Name: "Панел със структура на DOM" Desktop Entry/Comment: "Показва DOM структура на LXQt панел" ================================================ FILE: plugin-dom/translations/dom_bg.ts ================================================ DomPlugin Panel DOM Tree Панел DOM структура TreeWindow Panel DOM Tree Панел DOM структура Property Свойство Value Стойност All properties Всички свойства Type Тип String value Низова стойност ================================================ FILE: plugin-dom/translations/dom_ca.desktop.yaml ================================================ Desktop Entry/Name: "Panell d'arbre DOM" Desktop Entry/Comment: "Mostra un arbre DOM del tauler de LXQt" ================================================ FILE: plugin-dom/translations/dom_ca.ts ================================================ DomPlugin Panel DOM Tree Arbre DOM del tauler TreeWindow Panel DOM Tree Arbre DOM del tauler Property Propietat Value Valor All properties Totes les propietats Type Tipus String value Valor de la cadena ================================================ FILE: plugin-dom/translations/dom_cs.desktop.yaml ================================================ Desktop Entry/Name: "Strom DOM panelu" Desktop Entry/Comment: "Zobrazit DOM strom LXQt panelu" ================================================ FILE: plugin-dom/translations/dom_cs.ts ================================================ DomPlugin Panel DOM Tree DOM strom panelu TreeWindow Panel DOM Tree DOM strom panelu Property Vlastnost Value Hodnota All properties Všechny vlastnosti Type Typ String value Hodnota řetězce ================================================ FILE: plugin-dom/translations/dom_cy.ts ================================================ DomPlugin Panel DOM Tree Panel DOM Tree TreeWindow Panel DOM Tree Panel DOM Tree Property Value All properties Type String value ================================================ FILE: plugin-dom/translations/dom_da.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM-træ" Desktop Entry/Comment: "Vis et DOM-træ af LXQt-panelet" ================================================ FILE: plugin-dom/translations/dom_da.ts ================================================ DomPlugin Panel DOM Tree Panel DOM-træ TreeWindow Panel DOM Tree Panel DOM-træ Property Egenskab Value Værdi All properties Alle egenskaber Type Type String value Streng-værdi ================================================ FILE: plugin-dom/translations/dom_de.desktop.yaml ================================================ Desktop Entry/Name: "Leisten DOM-Baum" Desktop Entry/Comment: "Zeigt einen DOM-Baum der LXQt-Leiste" ================================================ FILE: plugin-dom/translations/dom_de.ts ================================================ DomPlugin Panel DOM Tree DOM-Baum der Leiste TreeWindow Panel DOM Tree DOM-Baum der Leiste Property Eigenschaft Value Wert All properties Alle Eigenschaften Type Typ String value Zeichenkettenwert ================================================ FILE: plugin-dom/translations/dom_el.desktop.yaml ================================================ Desktop Entry/Name: "Δέντρο DOM πίνακα" Desktop Entry/Comment: "Εμφάνιση ενός δέντρου DOM του πίνακα LXQt" ================================================ FILE: plugin-dom/translations/dom_el.ts ================================================ DomPlugin Panel DOM Tree Δέντρο DOM του πίνακα TreeWindow Panel DOM Tree Δέντρο πίνακα DOM Property Ιδιότητα Value Τιμή All properties Όλες οι ιδιότητες Type Τύπος String value Τιμή συμβολοσειράς ================================================ FILE: plugin-dom/translations/dom_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM Tree" Desktop Entry/Comment: "Show a DOM tree of the LXQt panel" ================================================ FILE: plugin-dom/translations/dom_en_GB.ts ================================================ DomPlugin Panel DOM Tree Panel DOM Tree TreeWindow Panel DOM Tree Panel DOM Tree Property Property Value Value All properties All properties Type Type String value String value ================================================ FILE: plugin-dom/translations/dom_es.desktop.yaml ================================================ Desktop Entry/Name: "Árbol DOM del panel" Desktop Entry/Comment: "Muestra el árbol DOM del panel de LXQt" ================================================ FILE: plugin-dom/translations/dom_es.ts ================================================ DomPlugin Panel DOM Tree Árbol DOM del panel TreeWindow Panel DOM Tree Árbol DOM del panel Property Propiedad Value Valor All properties Todas las propiedades Type Tipo String value Valor de la cadena ================================================ FILE: plugin-dom/translations/dom_et.desktop.yaml ================================================ Desktop Entry/Name: "Paneeli dokumendiobjektide mudeli puu" Desktop Entry/Comment: "Näita LXQt paneeli dokumendiobjektide mudeli puud" ================================================ FILE: plugin-dom/translations/dom_et.ts ================================================ DomPlugin Panel DOM Tree Paneeli dokumendiobjektide mudeli puu TreeWindow Panel DOM Tree Paneeli dokumendiobjektide mudeli puu Property Omadus Value Väärtus All properties Kõik omadused Type Tüüp String value Sõne väärtus ================================================ FILE: plugin-dom/translations/dom_fi.desktop.yaml ================================================ Desktop Entry/Name: "Paneelin DOM-puu" Desktop Entry/Comment: "Näytä LXQt-paneelin DOM-puu" ================================================ FILE: plugin-dom/translations/dom_fi.ts ================================================ DomPlugin Panel DOM Tree Paneelin DOM-puu TreeWindow Panel DOM Tree Paneelin DOM-puu Property Asetus Value Arvo All properties Kaikki asetukset Type Tyyppi String value Merkkijonoarvo ================================================ FILE: plugin-dom/translations/dom_fr.desktop.yaml ================================================ Desktop Entry/Name: "Arborescence DOM dans le tableau de bord" Desktop Entry/Comment: "Affiche une arborescence DOM dans le tableau de bord" ================================================ FILE: plugin-dom/translations/dom_fr.ts ================================================ DomPlugin Panel DOM Tree Arborescence DOM du tableau de bord TreeWindow Panel DOM Tree Arborescence DOM du tableau de bord Property Propriété Value Valeur All properties Toutes les propriétés Type Type String value Valeur de chaîne ================================================ FILE: plugin-dom/translations/dom_gl.ts ================================================ DomPlugin Panel DOM Tree Árbore DOM do panel TreeWindow Panel DOM Tree Árbore DOM do panel Property Propiedade Value Valor All properties Todas as propiedade Type Tipo String value Valor da cadea ================================================ FILE: plugin-dom/translations/dom_he.desktop.yaml ================================================ Desktop Entry/Name: "עץ ה־DOM של החלונית" Desktop Entry/Comment: "הצגת עץ ה־DOM של חלונית ה־LXQt" ================================================ FILE: plugin-dom/translations/dom_he.ts ================================================ DomPlugin Panel DOM Tree עץ ה־DOM של הלוח TreeWindow Panel DOM Tree עץ ה־DOM של הלוח Property מאפיין Value ערך All properties כל המאפיינים Type סוג String value ערך מחרוזת ================================================ FILE: plugin-dom/translations/dom_hr.desktop.yaml ================================================ Desktop Entry/Name: "Ploča DOM stabla" Desktop Entry/Comment: "Prikazuje DOM stablo LXQt ploče" ================================================ FILE: plugin-dom/translations/dom_hr.ts ================================================ DomPlugin Panel DOM Tree DOM stablo ploče TreeWindow Panel DOM Tree DOM stablo ploče Property Svojstvo Value Vrijednost All properties Sva svojstva Type Vrsta String value Vrijednost niza ================================================ FILE: plugin-dom/translations/dom_hu.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM fa" Desktop Entry/Comment: "DOM fa megjelenítése az LXQt panelen" ================================================ FILE: plugin-dom/translations/dom_hu.ts ================================================ DomPlugin Panel DOM Tree Panel DOM fa TreeWindow Panel DOM Tree Panel DOM fa Property Tulajdonság Value Érték All properties Minden tulajdonság Type Típus String value Kifejezés ================================================ FILE: plugin-dom/translations/dom_id.ts ================================================ DomPlugin Panel DOM Tree Panel pohon DOM TreeWindow Panel DOM Tree Panel pohon DOM Property Properti Value Nilai All properties Semua properti Type Tipe String value Nilai string ================================================ FILE: plugin-dom/translations/dom_it.desktop.yaml ================================================ Desktop Entry/Name: "Albero DOM del pannello" Desktop Entry/Comment: "Mostra un albero DOM del pannello di LXQt" ================================================ FILE: plugin-dom/translations/dom_it.ts ================================================ DomPlugin Panel DOM Tree Pannello dell'albero DOM TreeWindow Panel DOM Tree Pannello dell'albero DOM Property Proprietà Value Valore All properties Tutte le proprietà Type Tipo String value Valore della stringa ================================================ FILE: plugin-dom/translations/dom_ja.desktop.yaml ================================================ Desktop Entry/Name: "パネル DOM ツリー" Desktop Entry/Comment: "LXQt パネルの DOM ツリーを表示します" ================================================ FILE: plugin-dom/translations/dom_ja.ts ================================================ DomPlugin Panel DOM Tree パネルの DOM ツリー TreeWindow Panel DOM Tree パネルの DOM ツリー Property プロパティ Value All properties すべてのプロパティ Type タイプ String value ================================================ FILE: plugin-dom/translations/dom_ka.desktop.yaml ================================================ Desktop Entry/Name: "პანელის DOM ხე" Desktop Entry/Comment: "აჩვენებს LXQt-ის პანელის DOM ხეს" ================================================ FILE: plugin-dom/translations/dom_ka.ts ================================================ DomPlugin Panel DOM Tree პანელის DOM ხე TreeWindow Panel DOM Tree პანელის DOM ხე Property თვისება Value მნიშვნელობა All properties ყველა თვისება Type ტიპი String value სტრიქონის მნიშვნელობა ================================================ FILE: plugin-dom/translations/dom_kab.ts ================================================ TreeWindow Panel DOM Tree Property Value Azal All properties Type String value ================================================ FILE: plugin-dom/translations/dom_kk.desktop.yaml ================================================ Desktop Entry/Name: "Панельдің DOM ағашы" Desktop Entry/Comment: "LXQt панелінің DOM ағашын көрсетеді" ================================================ FILE: plugin-dom/translations/dom_kk.ts ================================================ DomPlugin Panel DOM Tree Панельдің DOM ағашы TreeWindow Panel DOM Tree Панельдің DOM ағашы Property Қасиет Value Мән All properties Барлық қасиеттер Type Түрі String value Жолдық мән ================================================ FILE: plugin-dom/translations/dom_ko.desktop.yaml ================================================ Desktop Entry/Name: "패널 DOM 트리" Desktop Entry/Comment: "LXQt 패널의 DOM 트리를 표시합니다" ================================================ FILE: plugin-dom/translations/dom_ko.ts ================================================ DomPlugin Panel DOM Tree 패널 DOM 트리 TreeWindow Panel DOM Tree 패널 DOM 트리 Property 속성 Value All properties 모든 속성 Type 유형 String value 문자열 값 ================================================ FILE: plugin-dom/translations/dom_lg.desktop.yaml ================================================ Desktop Entry/Name: "Laga enkwatagana ya DOM ey'ebitundu by'olubaawo" Desktop Entry/Comment: "Kano kaleetawo ekiraga enkwatagana ya mu mateeka aga DOM ey'ebitundu\ \ by'olubaawo lwa mu LXQt" ================================================ FILE: plugin-dom/translations/dom_lg.ts ================================================ DomPlugin Panel DOM Tree Enkwatagana ya DOM ey'ebitundu by'olubaawo TreeWindow Panel DOM Tree Enkwatagana ya DOM ey'ebitundu by'olubaawo Property Eky'obutonde Value Ekikongojjedwa mu kyabutonde All properties Lukalala lw'eby'obutonde byonna Type Kika ky'eky'obutonde String value Ekikongojjedwa mu kyabutonde ================================================ FILE: plugin-dom/translations/dom_lt.desktop.yaml ================================================ Desktop Entry/Name: "Skydelio DOM medis" Desktop Entry/Comment: "Rodyti LXQt skydelio DOM medį" ================================================ FILE: plugin-dom/translations/dom_lt.ts ================================================ DomPlugin Panel DOM Tree Skydelio DOM medis TreeWindow Panel DOM Tree Skydelio DOM medis Property Savybė Value Reikšmė All properties Visos savybės Type Tipas String value Eilutės reikšmė ================================================ FILE: plugin-dom/translations/dom_lv.desktop.yaml ================================================ Desktop Entry/Name: "Paneļa DOM koks" Desktop Entry/Comment: "Rādīt LXQt paneļa DOM koku" ================================================ FILE: plugin-dom/translations/dom_lv.ts ================================================ DomPlugin Panel DOM Tree Paneļa DOM koks TreeWindow Panel DOM Tree Paneļa DOM koks Property Rekvizīts/īpašība Value Vērtība All properties Visi rekvizīti/īpašības Type Tips String value Virknes vērtība ================================================ FILE: plugin-dom/translations/dom_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Panel-DOM-tre" Desktop Entry/Comment: "Vis et DOM-tre av LXQt-penelet" ================================================ FILE: plugin-dom/translations/dom_nb_NO.ts ================================================ DomPlugin Panel DOM Tree Panelets DOM-tre TreeWindow Panel DOM Tree Panelets DOM-tre Property Egenskap Value Verdi All properties Alle egenskaper Type String value Strengverdi ================================================ FILE: plugin-dom/translations/dom_nl.desktop.yaml ================================================ Desktop Entry/Name: "DOM-boomweergave op paneel" Desktop Entry/Comment: "Toont de DOM-boomweergave van een LXQt-paneel" ================================================ FILE: plugin-dom/translations/dom_nl.ts ================================================ DomPlugin Panel DOM Tree DOM-boomweergave op paneel TreeWindow Panel DOM Tree DOM-boomweergave op paneel Property Eigenschap Value Waarde All properties Alle eigenschappen Type Soort String value Tekenreekswaarde ================================================ FILE: plugin-dom/translations/dom_oc.ts ================================================ DomPlugin Panel DOM Tree Arborescéncia DOM del tablèu de bòrd TreeWindow Panel DOM Tree Arborescéncia DOM del tablèu de bòrd Property Proprietat Value Valor All properties Totas las proprietats Type Tipe String value Valor de la cadena ================================================ FILE: plugin-dom/translations/dom_pa.ts ================================================ DomPlugin Panel DOM Tree ਪੈਨਲ DOM ਲੜੀ TreeWindow Panel DOM Tree ਪੈਨਲ DOM ਲੜੀ Property ਵਿਸ਼ੇਸ਼ਤਾ Value ਮੁੱਲ All properties ਸਾਰੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ Type ਕਿਸਮ String value ਸਤਰ ਮੁੱਲ ================================================ FILE: plugin-dom/translations/dom_pl.desktop.yaml ================================================ Desktop Entry/Name: "Drzewo DOM panelu" Desktop Entry/Comment: "Wyświetla drzewo DOM panelu LXQt" ================================================ FILE: plugin-dom/translations/dom_pl.ts ================================================ DomPlugin Panel DOM Tree Drzewo DOM panelu TreeWindow Panel DOM Tree Drzewo DOM panelu Property Właściwość Value Wartość All properties Wszystkie właściwości Type Rodzaj String value Ciąg znaków ================================================ FILE: plugin-dom/translations/dom_pt.desktop.yaml ================================================ Desktop Entry/Name: "Árvore DOM do painel" Desktop Entry/Comment: "Mostra a árvore DOM do painel do LXQt" ================================================ FILE: plugin-dom/translations/dom_pt.ts ================================================ DomPlugin Panel DOM Tree Árvore do painel DOM TreeWindow Panel DOM Tree Árvore do painel DOM Property Propriedade Value Valor All properties Todas propriedades Type Tipo String value Valor da cadeia ================================================ FILE: plugin-dom/translations/dom_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Árvore DOM do painel" Desktop Entry/Comment: "Mostra a árvore DOM do painel do LXQt" ================================================ FILE: plugin-dom/translations/dom_pt_BR.ts ================================================ DomPlugin Panel DOM Tree Árvore do Painel DOM TreeWindow Panel DOM Tree Árvore do Painel DOM Property Propriedade Value Valor All properties Todas propriedades Type Tipo String value Valor da cadeia de caracteres ================================================ FILE: plugin-dom/translations/dom_ru.desktop.yaml ================================================ Desktop Entry/Name: "Дерево DOM панели" Desktop Entry/Comment: "Показать дерево DOM панели LXQt" ================================================ FILE: plugin-dom/translations/dom_ru.ts ================================================ DomPlugin Panel DOM Tree Дерево DOM панели TreeWindow Panel DOM Tree Дерево DOM панели Property Свойство Value Значение All properties Все свойства Type Тип String value Строковое значение ================================================ FILE: plugin-dom/translations/dom_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-dom/translations/dom_si.ts ================================================ DomPlugin Panel DOM Tree TreeWindow Panel DOM Tree Property Value All properties Type String value ================================================ FILE: plugin-dom/translations/dom_sk.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM stromu" Desktop Entry/Comment: "Zobraziť DOM strom LXQt panelu" ================================================ FILE: plugin-dom/translations/dom_sk_SK.ts ================================================ DomPlugin Panel DOM Tree DOM strom panelu TreeWindow Panel DOM Tree DOM strom panelu Property Vlastníctvo Value Hodnota All properties Všetky vlastnosti Type Typ String value Hodnota reťazca ================================================ FILE: plugin-dom/translations/dom_sr.ts ================================================ DomPlugin Panel DOM Tree Панел DOM дрво TreeWindow Panel DOM Tree Панел DOM дрво Property Власништво Value Вредност All properties Сва власништва Type Тип String value Вредност стринга ================================================ FILE: plugin-dom/translations/dom_sr@ijekavian.ts ================================================ DomPlugin Panel DOM Tree TreeWindow Panel DOM Tree Property Власништво Value Вриједност All properties Сва својства Type Тип String value Вриједност стринга ================================================ FILE: plugin-dom/translations/dom_sv.desktop.yaml ================================================ Desktop Entry/Name: "Panel för DOM-träd" Desktop Entry/Comment: "Visa ett DOM-träd av LXQt-panelen" ================================================ FILE: plugin-dom/translations/dom_sv.ts ================================================ DomPlugin Panel DOM Tree Panel för DOM-träd TreeWindow Panel DOM Tree Panel för DOM-träd Property Egenskap Value Värde All properties Alla egenskaper Type Typ String value Textvärde ================================================ FILE: plugin-dom/translations/dom_tr.desktop.yaml ================================================ Desktop Entry/Name: "Panel DOM ağacı" Desktop Entry/Comment: "LXQt panelin DOM ağacını göster" ================================================ FILE: plugin-dom/translations/dom_tr.ts ================================================ DomPlugin Panel DOM Tree Panel DOM ağacı TreeWindow Panel DOM Tree Panel DOM ağacı Property Özellik Value Değer All properties Tüm özellikler Type Tür String value Dizi değeri ================================================ FILE: plugin-dom/translations/dom_uk.desktop.yaml ================================================ Desktop Entry/Name: "Панель дерева DOM" Desktop Entry/Comment: "Показує дерево DOM панелі LXQt" ================================================ FILE: plugin-dom/translations/dom_uk.ts ================================================ DomPlugin Panel DOM Tree Панель дерева DOM TreeWindow Panel DOM Tree Панель дерева DOM Property Властивість Value Значення All properties Всі властивості Type Тип String value Значення рядка ================================================ FILE: plugin-dom/translations/dom_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "面板 DOM 树" Desktop Entry/Comment: "显示 LXQt 面板的 DOM 树" ================================================ FILE: plugin-dom/translations/dom_zh_CN.ts ================================================ DomPlugin Panel DOM Tree 面板 DOM 树 TreeWindow Panel DOM Tree 面板 DOM 树 Property 属性 Value All properties 所有属性 Type 类型 String value 字符串类型 ================================================ FILE: plugin-dom/translations/dom_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "面板 DOM 樹" Desktop Entry/Comment: "顯示 LXQt 面板的 DOM 樹" ================================================ FILE: plugin-dom/translations/dom_zh_TW.ts ================================================ DomPlugin Panel DOM Tree 面板 DOM 樹 TreeWindow Panel DOM Tree 面板 DOM 樹 Property 屬性 Value All properties 全部屬性 Type 類型 String value 字串值 ================================================ FILE: plugin-dom/treewindow.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "treewindow.h" #include "ui_treewindow.h" #include "domtreeitem.h" #include #include #include #define PROP_OBJECT_NAME 0 #define PROP_CLASS_NAME 1 #define PROP_TEXT 2 #define PROP_CLASS_HIERARCHY 3 TreeWindow::TreeWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::TreeWindow) { mRootWidget = this; while (mRootWidget->parentWidget()) mRootWidget = mRootWidget->parentWidget(); ui->setupUi(this); ui->tree->setStyleSheet(QStringLiteral( "QTreeView::item { " "padding: 2px;" "}" )); initPropertiesView(); ui->tree->setRootIsDecorated(false); DomTreeItem *item = new DomTreeItem(ui->tree, mRootWidget); ui->tree->expandItem(item); ui->tree->resizeColumnToContents(0); connect(ui->tree, &QTreeWidget::itemSelectionChanged, this, &TreeWindow::updatePropertiesView); item->setSelected(true); QHeaderView* h = new QHeaderView(Qt::Horizontal); h->setStretchLastSection(true); ui->allPropertiesView->setHorizontalHeader(h); connect(h, &QHeaderView::sectionDoubleClicked, this, &TreeWindow::sectionDoubleClickedSlot); } TreeWindow::~TreeWindow() { delete ui; } void TreeWindow::initPropertiesView() { ui->propertiesView->viewport()->setAutoFillBackground(false); ui->propertiesView->setRowCount(4); ui->propertiesView->setColumnCount(2); QTableWidgetItem *item; item = new QTableWidgetItem(QStringLiteral("Object name")); ui->propertiesView->setItem(PROP_OBJECT_NAME, 0, item); ui->propertiesView->setItem(PROP_OBJECT_NAME, 1, new QTableWidgetItem()); item = new QTableWidgetItem(QStringLiteral("Class name")); ui->propertiesView->setItem(PROP_CLASS_NAME, 0, item); ui->propertiesView->setItem(PROP_CLASS_NAME, 1, new QTableWidgetItem()); item = new QTableWidgetItem(QStringLiteral("Text")); ui->propertiesView->setItem(PROP_TEXT, 0, item); ui->propertiesView->setItem(PROP_TEXT, 1, new QTableWidgetItem()); item = new QTableWidgetItem(QStringLiteral("Class hierarchy")); ui->propertiesView->setItem(PROP_CLASS_HIERARCHY, 0, item); ui->propertiesView->setItem(PROP_CLASS_HIERARCHY, 1, new QTableWidgetItem()); } void TreeWindow::updatePropertiesView() { if (ui->tree->selectedItems().isEmpty()) { clearPropertiesView(); return; } QTreeWidgetItem *item = ui->tree->selectedItems().first(); if (!item) { clearPropertiesView(); return; } DomTreeItem *treeItem = static_cast(item); ui->propertiesView->item(PROP_OBJECT_NAME, 1)->setText(treeItem->widgetObjectName()); ui->propertiesView->item(PROP_CLASS_NAME, 1)->setText(treeItem->widgetClassName()); ui->propertiesView->item(PROP_TEXT, 1)->setText(treeItem->widgetText()); ui->propertiesView->item(PROP_CLASS_HIERARCHY, 1)->setText(treeItem->widgetClassHierarchy().join(QStringLiteral(" :: "))); QString s; QDebug out(&s); QMetaObject const * const m = treeItem->widget()->metaObject(); const int curr_cnt = ui->allPropertiesView->rowCount(); ui->allPropertiesView->setRowCount(m->propertyCount()); for (int i = 0, cnt = m->propertyCount(); cnt > i; ++i) { if (curr_cnt <= i) { ui->allPropertiesView->setItem(i, 0, new QTableWidgetItem); ui->allPropertiesView->setItem(i, 1, new QTableWidgetItem); ui->allPropertiesView->setItem(i, 2, new QTableWidgetItem); } QMetaProperty const & prop = m->property(i); ui->allPropertiesView->item(i, 0)->setText(QString::fromUtf8(prop.name())); ui->allPropertiesView->item(i, 1)->setText(QString::fromUtf8(prop.typeName())); s.clear(); out << prop.read(treeItem->widget()); ui->allPropertiesView->item(i, 2)->setText(s); } for (int i = m->propertyCount(); curr_cnt > i; ++i) ui->allPropertiesView->removeRow(i); } void TreeWindow::clearPropertiesView() { for (int i=0; ipropertiesView->rowCount(); ++i) ui->propertiesView->item(i, 1)->setText(QLatin1String("")); for (int i = ui->allPropertiesView->rowCount(); 0 <= i; --i) ui->allPropertiesView->removeRow(i); ui->allPropertiesView->setRowCount(0); } void TreeWindow::sectionDoubleClickedSlot(int column) { ui->allPropertiesView->sortByColumn(column, Qt::AscendingOrder); } ================================================ FILE: plugin-dom/treewindow.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef TREEWINDOW_H #define TREEWINDOW_H #include #include class QTreeWidgetItem; class QTreeWidget; class QEvent; namespace Ui { class TreeWindow; } class TreeWindow : public QMainWindow { Q_OBJECT public: explicit TreeWindow(QWidget *parent = nullptr); ~TreeWindow(); private slots: void updatePropertiesView(); void clearPropertiesView(); void sectionDoubleClickedSlot(int column); private: Ui::TreeWindow *ui; QWidget *mRootWidget; void initPropertiesView(); }; #endif // TREEWINDOW_H ================================================ FILE: plugin-dom/treewindow.ui ================================================ TreeWindow 0 0 800 424 Panel DOM Tree Qt::Horizontal 1 0 Name 1 0 QFrame::NoFrame Qt::DotLine 1 0 true Property Value All properties 0 0 QFrame::NoFrame Qt::DotLine Property Type String value ================================================ FILE: plugin-fancymenu/CMakeLists.txt ================================================ set(PLUGIN "fancymenu") set(HEADERS lxqtfancymenu.h lxqtfancymenuconfiguration.h lxqtfancymenuwindow.h lxqtfancymenuappmap.h lxqtfancymenuappmodel.h lxqtfancymenucategoriesmodel.h lxqtfancymenutypes.h ) set(SOURCES lxqtfancymenu.cpp lxqtfancymenuconfiguration.cpp lxqtfancymenuwindow.cpp lxqtfancymenuappmap.cpp lxqtfancymenuappmodel.cpp lxqtfancymenucategoriesmodel.cpp ) set(UIS lxqtfancymenuconfiguration.ui ) set(LIBRARIES lxqt lxqt-globalkeys lxqt-globalkeys-ui Qt6::Xml Qt6::DBus ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-fancymenu/lxqtfancymenu.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenu.h" #include "lxqtfancymenuconfiguration.h" #include "lxqtfancymenuwindow.h" #include "../panel/lxqtpanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_SHORTCUT "Alt+F1" LXQtFancyMenu::LXQtFancyMenu(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mWindow(nullptr), mShortcut(nullptr), mFilterClear(false) { mWindow = new LXQtFancyMenuWindow(&mButton); mWindow->setObjectName(QStringLiteral("TopLevelFancyMenu")); mWindow->installEventFilter(this); connect(mWindow, &LXQtFancyMenuWindow::aboutToHide, &mHideTimer, QOverload<>::of(&QTimer::start)); connect(mWindow, &LXQtFancyMenuWindow::aboutToShow, &mHideTimer, &QTimer::stop); connect(mWindow, &LXQtFancyMenuWindow::favoritesChanged, this, &LXQtFancyMenu::saveFavorites); mDelayedPopup.setSingleShot(true); mDelayedPopup.setInterval(200); connect(&mDelayedPopup, &QTimer::timeout, this, &LXQtFancyMenu::showHideMenu); mHideTimer.setSingleShot(true); mHideTimer.setInterval(250); mButton.setAutoRaise(true); mButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); //Notes: //1. installing event filter to parent widget to avoid infinite loop // (while setting icon we also need to set the style) //2. delaying of installEventFilter because in c-tor mButton has no parent widget // (parent is assigned in panel's logic after widget() call) QTimer::singleShot(0, mButton.parentWidget(), [this] { Q_ASSERT(mButton.parentWidget()); mButton.parentWidget()->installEventFilter(this); }); connect(&mButton, &QToolButton::clicked, this, &LXQtFancyMenu::showHideMenu); QTimer::singleShot(0, this, [this] { settingsChanged(); }); mShortcut = GlobalKeyShortcut::Client::instance()->addAction(QString{}, QStringLiteral("/panel/%1/show_hide").arg(settings()->group()), LXQtFancyMenu::tr("Show/hide main menu"), this); if (mShortcut) { connect(mShortcut, &GlobalKeyShortcut::Action::shortcutChanged, this, [this](const QString &, const QString & shortcut) { mShortcutSeq = shortcut; }); connect(mShortcut, &GlobalKeyShortcut::Action::registrationFinished, this, [this] { if (mShortcut->shortcut().isEmpty()) mShortcut->changeShortcut(QStringLiteral(DEFAULT_SHORTCUT)); else mShortcutSeq = mShortcut->shortcut(); }); connect(mShortcut, &GlobalKeyShortcut::Action::activated, this, [this] { if (!mHideTimer.isActive()) // Delay this a little -- if we don't do this, search field // won't be able to capture focus // See and // mDelayedPopup.start(); }); } } /************************************************ ************************************************/ LXQtFancyMenu::~LXQtFancyMenu() { mButton.parentWidget()->removeEventFilter(this); delete mWindow; } /************************************************ ************************************************/ void LXQtFancyMenu::showHideMenu() { if(mWindow && mWindow->isVisible()) mWindow->hide(); else showMenu(); } /************************************************ ************************************************/ void LXQtFancyMenu::showMenu() { if (!mWindow) return; willShowWindow(mWindow); // Just using Qt`s activateWindow() won't work on some WMs like Kwin. // Solution is to execute menu 1ms later using timer mWindow->move(calculatePopupWindowPos(mWindow->sizeHint()).topLeft()); emit mWindow->aboutToShow(); mWindow->show(); mWindow->setSearchEditFocus(); } /************************************************ ************************************************/ void LXQtFancyMenu::settingsChanged() { setButtonIcon(); if (settings()->value(QStringLiteral("showText"), false).toBool()) { mButton.setText(settings()->value(QStringLiteral("text"), QStringLiteral("Start")).toString()); mButton.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { mButton.setText(QLatin1String("")); mButton.setToolButtonStyle(Qt::ToolButtonIconOnly); } mLogDir = settings()->value(QStringLiteral("log_dir"), QString()).toString(); QString menu_file = settings()->value(QStringLiteral("menu_file"), QString()).toString(); if (menu_file.isEmpty()) menu_file = XdgMenu::getMenuFileName(QLatin1String("panel-applications.menu")); else if (!menu_file.contains(QLatin1String("/"))) menu_file = XdgMenu::getMenuFileName(menu_file); if (mMenuFile != menu_file) { mMenuFile = menu_file; mXdgMenu.setEnvironments(QStringList() << QStringLiteral("X-LXQT") << QStringLiteral("LXQt")); mXdgMenu.setLogDir(mLogDir); bool res = mXdgMenu.read(mMenuFile); connect(&mXdgMenu, &XdgMenu::changed, this, &LXQtFancyMenu::buildMenu); if (res) { QTimer::singleShot(1000, this, &LXQtFancyMenu::buildMenu); } else { QMessageBox::warning(nullptr, QStringLiteral("Parse error"), mXdgMenu.errorString()); return; } } loadFavorites(); setMenuFontSize(); //clear the search to not leaving the menu in wrong state mFilterClear = settings()->value(QStringLiteral("filterClear"), true).toBool(); mWindow->setFilterClear(mFilterClear); bool buttonsAtTop = settings()->value(QStringLiteral("buttonsAtTop"), false).toBool(); mWindow->setButtonPosition(buttonsAtTop ? LXQtFancyMenuButtonPosition::Top : LXQtFancyMenuButtonPosition::Bottom); bool categoriesAtRight = settings()->value(QStringLiteral("categoriesAtRight"), true).toBool(); mWindow->setCategoryPosition(categoriesAtRight ? LXQtFancyMenuCategoryPosition::Right : LXQtFancyMenuCategoryPosition::Left); mWindow->setAutoSelection(settings()->value(QStringLiteral("autoSel"), false).toBool()); int delay = std::clamp(settings()->value(QStringLiteral("autoSelDelay"), 250).toInt(), 50, 1000); mWindow->setAutoSelectionDelay(delay); realign(); } /************************************************ ************************************************/ void LXQtFancyMenu::buildMenu() { mWindow->rebuildMenu(mXdgMenu); mWindow->doSearch(); setMenuFontSize(); } void LXQtFancyMenu::loadFavorites() { bool listChanged = false; const QList > list = settings()->readArray(QStringLiteral("favorites")); QStringList fileList; for(const QMap& item : list) { QString file = item.value(QStringLiteral("desktopFile")).toString(); if(file.isEmpty()) { listChanged = true; continue; } QString canonicalPath = QDir(file).canonicalPath(); if(canonicalPath != file) listChanged = true; if(canonicalPath.isEmpty()) continue; if(fileList.contains(canonicalPath)) { // Don't add duplicates listChanged = true; continue; } fileList.append(canonicalPath); } mWindow->setFavorites(fileList); if(listChanged) saveFavorites(); } void LXQtFancyMenu::saveFavorites() { const QStringList fileList = mWindow->favorites(); QList > list; list.reserve(fileList.size()); for(const QString& file : fileList) { QMap item; item.insert(QStringLiteral("desktopFile"), file); list.append(item); } // HACK: force Qt to clear old array and rewrite it // Otherwise it would leave garbage values inside it. settings()->remove(QStringLiteral("favorites")); settings()->setArray(QStringLiteral("favorites"), list); } /************************************************ ************************************************/ void LXQtFancyMenu::setMenuFontSize() { if (!mWindow) return; QFont menuFont = mButton.font(); bool customFont = settings()->value(QStringLiteral("customFont"), false).toBool(); int customFontSize = settings()->value(QStringLiteral("customFontSize")).toInt(); if(customFont) { menuFont = mWindow->font(); menuFont.setPointSize(customFontSize); } mWindow->setCustomFont(menuFont); } /************************************************ ************************************************/ void LXQtFancyMenu::setButtonIcon() { if (settings()->value(QStringLiteral("ownIcon"), false).toBool()) { mButton.setStyleSheet(QStringLiteral("#FancyMenu { qproperty-icon: url(%1); }") .arg(settings()->value(QLatin1String("icon"), QLatin1String(LXQT_GRAPHICS_DIR "/helix.svg")).toString())); } else { mButton.setStyleSheet(QString()); } } /************************************************ ************************************************/ QDialog *LXQtFancyMenu::configureDialog() { return new LXQtFancyMenuConfiguration(settings(), mShortcut, QStringLiteral(DEFAULT_SHORTCUT)); } /************************************************ ************************************************/ bool LXQtFancyMenu::eventFilter(QObject *obj, QEvent *event) { if(obj == mButton.parentWidget()) { // the application is given a new QStyle if(event->type() == QEvent::StyleChange) { setMenuFontSize(); setButtonIcon(); mWindow->updateButtonIconSize(); } } else if(obj == mWindow) { if(event->type() == QEvent::KeyRelease) { if (mShortcutSeq.isEmpty()) { return false; } static const auto key_meta = QMetaEnum::fromType(); // if our shortcut key is pressed while the menu is open, close the menu QKeyEvent* keyEvent = static_cast(event); QFlags mod = keyEvent->modifiers(); QList keys = {static_cast(keyEvent->key())}; switch (keyEvent->key()) { case Qt::Key_Alt: mod &= ~Qt::AltModifier; break; case Qt::Key_Control: mod &= ~Qt::ControlModifier; break; case Qt::Key_Shift: mod &= ~Qt::ShiftModifier; break; case Qt::Key_Meta: keys << Qt::Key_Super_L << Qt::Key_Super_R; [[fallthrough]]; case Qt::Key_Super_L: case Qt::Key_Super_R: mod &= ~Qt::MetaModifier; break; } for (const auto & key : std::as_const(keys)) { const QString press = QKeySequence{static_cast(mod)}.toString() % QString::fromLatin1(key_meta.valueToKey(key)).remove(0, 4); if (press == mShortcutSeq) { mWindow->hide(); // close the app menu return true; } } //TODO: go to item which starts with pressed letter } else if (event->type() == QEvent::Resize) { QResizeEvent *e = static_cast(event); if (e->oldSize().isValid() && e->oldSize() != e->size()) { mWindow->move(calculatePopupWindowPos(e->size()).topLeft()); } } } return false; } #undef DEFAULT_SHORTCUT ================================================ FILE: plugin-fancymenu/lxqtfancymenu.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_FANCYMENU_H #define LXQT_FANCYMENU_H #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include class LXQtFancyMenuWindow; class LXQtBar; namespace LXQt { class PowerManager; class ScreenSaver; } namespace GlobalKeyShortcut { class Action; } class LXQtFancyMenu : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtFancyMenu(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtFancyMenu(); QString themeId() const { return QStringLiteral("FancyMenu"); } virtual ILXQtPanelPlugin::Flags flags() const { return HaveConfigDialog ; } QWidget *widget() { return &mButton; } QDialog *configureDialog(); bool isSeparate() const { return true; } protected: bool eventFilter(QObject *obj, QEvent *event); private: void setMenuFontSize(); void setButtonIcon(); private: QToolButton mButton; QString mLogDir; LXQtFancyMenuWindow *mWindow; GlobalKeyShortcut::Action *mShortcut; bool mFilterClear; //!< search field should be cleared upon showing the menu XdgMenu mXdgMenu; QTimer mDelayedPopup; QTimer mHideTimer; QString mShortcutSeq; QString mMenuFile; protected slots: virtual void settingsChanged(); void buildMenu(); void loadFavorites(); void saveFavorites(); private slots: void showMenu(); void showHideMenu(); }; class LXQtFancyMenuPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtFancyMenu(startupInfo);} }; #endif ================================================ FILE: plugin-fancymenu/lxqtfancymenuappmap.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenuappmap.h" #include #include #include #include class LXQtFancyMenuAppMapStrings { Q_DECLARE_TR_FUNCTIONS(LXQtFancyMenuAppMapStrings) }; LXQtFancyMenuAppMap::LXQtFancyMenuAppMap() { mCachedIndex = -1; mCachedIterator = mAppSortedByName.constEnd(); //Add Favorites category Category favorites; favorites.menuTitle = LXQtFancyMenuAppMapStrings::tr("Favorites"); favorites.icon = XdgIcon::fromTheme(QLatin1String("bookmarks")); favorites.type = LXQtFancyMenuItemType::CategoryItem; mCategories.append(favorites); //Add All Apps category Category allAppsCategory; allAppsCategory.menuTitle = LXQtFancyMenuAppMapStrings::tr("All Applications"); allAppsCategory.icon = XdgIcon::fromTheme(QLatin1String("folder")); allAppsCategory.type = LXQtFancyMenuItemType::CategoryItem; mCategories.append(allAppsCategory); //Add separator Category sepatorCategory; sepatorCategory.type = LXQtFancyMenuItemType::SeparatorItem; mCategories.append(sepatorCategory); } LXQtFancyMenuAppMap::~LXQtFancyMenuAppMap() { clear(); clearFavorites(); } void LXQtFancyMenuAppMap::clear() { // Keep Favorites, All Applications and separator mCategories.erase(mCategories.begin() + 3, mCategories.end()); mAppSortedByName.clear(); qDeleteAll(mAppSortedByDesktopFile); mAppSortedByDesktopFile.clear(); mCachedIndex = -1; mCachedIterator = mAppSortedByName.constEnd(); } void LXQtFancyMenuAppMap::clearFavorites() { Category& favoritesCatRef = mCategories[0]; for(Category::Item& item : favoritesCatRef.apps) { if(item.appItem) { delete item.appItem; item.appItem = nullptr; } } favoritesCatRef.apps.clear(); } bool LXQtFancyMenuAppMap::rebuildModel(const XdgMenu &menu) { clear(); QDomElement rootMenu = menu.xml().documentElement(); parseMenu(rootMenu, QString()); mCategories.squeeze(); return true; } void LXQtFancyMenuAppMap::setFavorites(const QStringList &favorites) { clearFavorites(); Category& favoritesCatRef = mCategories[0]; favoritesCatRef.apps.reserve(favorites.size()); for(const QString& desktopFile : favorites) { Category::Item item; item.type = LXQtFancyMenuItemType::AppItem; item.appItem = loadAppItem(desktopFile); if(!item.appItem) continue; favoritesCatRef.apps.append(item); } favoritesCatRef.apps.squeeze(); } QStringList LXQtFancyMenuAppMap::getFavorites() const { const Category& favoritesCatRef = mCategories[0]; QStringList favorites; favorites.reserve(favoritesCatRef.apps.size()); for(const Category::Item& item : favoritesCatRef.apps) { if(item.appItem) { favorites.append(item.appItem->desktopFile); } } return favorites; } int LXQtFancyMenuAppMap::getFavoriteIndex(const QString &desktopFile) const { const Category& favoritesCatRef = mCategories.at(0); for(int i = 0; i < favoritesCatRef.apps.size(); i++) { const Category::Item& item = favoritesCatRef.apps.at(i); if(item.appItem && item.appItem->desktopFile == desktopFile) return i; } return -1; } void LXQtFancyMenuAppMap::addToFavorites(const QString &desktopFile) { if(isFavorite(desktopFile)) return; Category::Item item; item.type = LXQtFancyMenuItemType::AppItem; item.appItem = loadAppItem(desktopFile); if(!item.appItem) return; Category& favoritesCatRef = mCategories[0]; favoritesCatRef.apps.append(item); } void LXQtFancyMenuAppMap::removeFromFavorites(const QString &desktopFile) { if(!isFavorite(desktopFile)) return; Category& favoritesCatRef = mCategories[0]; for(auto it = favoritesCatRef.apps.begin(); it != favoritesCatRef.apps.end(); it++) { AppItem *appItem = (*it).appItem; if(appItem && appItem->desktopFile == desktopFile) { favoritesCatRef.apps.erase(it); delete appItem; return; } } } void LXQtFancyMenuAppMap::moveFavoriteItem(int oldPos, int newPos) { Category& favoritesCatRef = mCategories[0]; favoritesCatRef.apps.move(oldPos, newPos); } LXQtFancyMenuAppMap::AppItem *LXQtFancyMenuAppMap::getAppAt(int index) { if(index < 0 || index >= getTotalAppCount()) return nullptr; if(mCachedIndex != -1) { if(index == mCachedIndex + 1) { //Fast case, go to next row mCachedIndex++; mCachedIterator++; } if(index == mCachedIndex) return *mCachedIterator; int dist1 = qAbs(mCachedIndex - index); if(dist1 < index) { std::advance(mCachedIterator, index - mCachedIndex); mCachedIndex = index; return *mCachedIterator; } } // Recalculate cached iterator mCachedIterator = mAppSortedByName.constBegin(); std::advance(mCachedIterator, index); mCachedIndex = index; return *mCachedIterator; } QList LXQtFancyMenuAppMap::getMatchingApps(const QString &query) const { QList matches; for(const AppItem *app : std::as_const(mAppSortedByName)) { if(app->title.contains(query, Qt::CaseInsensitive)) { matches.append(app); continue; } if(app->comment.contains(query, Qt::CaseInsensitive)) { matches.append(app); continue; } bool found = false; for(const QString& key : app->keywords) { if(key.startsWith(query, Qt::CaseInsensitive)) { matches.append(app); found = true; break; } } if(found) continue; for(const QString& key : app->exec) { if(key.contains(query, Qt::CaseInsensitive)) { matches.append(app); break; } } } // Give the priority to the apps whose titles start with // or contain the filter string, and sort the other items. QCollator collator; collator.setCaseSensitivity(Qt::CaseInsensitive); std::sort(matches.begin(), matches.end(), [&collator, query](const AppItem* a, const AppItem* b) { // starting if(a->title.startsWith(query, Qt::CaseInsensitive)) { if(!b->title.startsWith(query, Qt::CaseInsensitive)) return true; } else if(b->title.startsWith(query, Qt::CaseInsensitive)) return false; // containing if(a->title.contains(query, Qt::CaseInsensitive)) { if(!b->title.contains(query, Qt::CaseInsensitive)) return true; } else if(b->title.contains(query, Qt::CaseInsensitive)) return false; // otherwise return collator.compare(a->title, b->title) < 0; }); return matches; } void LXQtFancyMenuAppMap::parseMenu(const QDomElement &menu, const QString& topLevelCategory) { bool catAdded = false; QDomElement e = menu.firstChildElement(); while(!e.isNull()) { if(e.tagName() == QLatin1String("Menu")) { if(topLevelCategory.isEmpty()) { //This is a top level menu Category item; item.type = LXQtFancyMenuItemType::CategoryItem; item.menuName = e.attribute(QLatin1String("name")); item.menuTitle = e.attribute(QLatin1String("title"), item.menuName); QString iconName = e.attribute(QLatin1String("icon")); item.icon = XdgIcon::fromTheme(iconName); mCategories.append(item); catAdded = true; //Merge sub menu to parent parseMenu(e, item.menuName); } else { //Merge sub menu to parent parseMenu(e, topLevelCategory); } } else if(!topLevelCategory.isEmpty()) { if(e.tagName() == QLatin1String("AppLink")) parseAppLink(e, topLevelCategory); else if(e.tagName() == QLatin1String("Separator")) parseSeparator(e, topLevelCategory); } else if(catAdded && e.tagName() == QLatin1String("Separator")) { Category item; item.type = LXQtFancyMenuItemType::SeparatorItem; mCategories.append(item); catAdded = false; } e = e.nextSiblingElement(); } // Build sorted list of all apps mAppSortedByName = mAppSortedByDesktopFile.values(); QCollator collator; collator.setCaseSensitivity(Qt::CaseInsensitive); std::sort(mAppSortedByName.begin(), mAppSortedByName.end(), [&](AppItem* a, AppItem* b) { return collator.compare(a->title, b->title) < 0; }); } void LXQtFancyMenuAppMap::parseAppLink(const QDomElement &app, const QString& topLevelCategory) { QString desktopFile = app.attribute(QLatin1String("desktopFile")); // Check if already added AppItem *appItem = mAppSortedByDesktopFile.value(desktopFile, nullptr); if(!appItem) { // Add new app appItem = loadAppItem(desktopFile); if(!appItem) return; // Invalid app mAppSortedByDesktopFile.insert(appItem->desktopFile, appItem); } // Now add app to category for(Category &category : mCategories) { if(category.menuName == topLevelCategory) { Category::Item item; item.appItem = appItem; item.type = LXQtFancyMenuItemType::AppItem; category.apps.append(item); break; } } } void LXQtFancyMenuAppMap::parseSeparator(const QDomElement &sep, const QString& topLevelCategory) { Q_UNUSED(sep) // Find category for(Category &category : mCategories) { if(category.menuName != topLevelCategory) continue; // XdgMenu already cares of removing consecutive separators // Or separators put as first or last items Category::Item item; item.type = LXQtFancyMenuItemType::SeparatorItem; category.apps.append(item); break; } } LXQtFancyMenuAppMap::AppItem *LXQtFancyMenuAppMap::loadAppItem(const QString &desktopFile) { XdgDesktopFile f; if(!f.load(desktopFile)) return nullptr; // Invalid App AppItem *item = new AppItem; item->desktopFile = desktopFile; item->title = f.name(); item->comment = f.comment(); if(item->comment.isEmpty()) item->comment = f.localizedValue(QLatin1String("GenericName")).toString(); item->icon = f.icon(); item->desktopFileCache = f; item->keywords << f.localizedValue(QLatin1String("Keywords")).toString().split(QLatin1Char(';')); item->exec = f.expandExecString(); return item; } ================================================ FILE: plugin-fancymenu/lxqtfancymenuappmap.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUAPPMAP_H #define LXQTFANCYMENUAPPMAP_H #include #include #include #include #include #include "lxqtfancymenutypes.h" class XdgMenu; class QDomElement; struct LXQtFancyMenuAppItem { QString desktopFile; QString title; QString comment; QStringList keywords; QStringList exec; QIcon icon; XdgDesktopFile desktopFileCache; }; class LXQtFancyMenuAppMap { public: enum SpecialCategory { FavoritesCategory = 0, AllAppsCategory = 1 }; typedef LXQtFancyMenuAppItem AppItem; struct Category { QString menuName; QString menuTitle; QIcon icon; struct Item { AppItem *appItem = nullptr; LXQtFancyMenuItemType type = LXQtFancyMenuItemType::AppItem; }; QList apps; LXQtFancyMenuItemType type; }; LXQtFancyMenuAppMap(); ~LXQtFancyMenuAppMap(); void clear(); void clearFavorites(); bool rebuildModel(const XdgMenu &menu); void setFavorites(const QStringList& favorites); QStringList getFavorites() const; int getFavoriteIndex(const QString& desktopFile) const; inline int getFavoriteCount() const { return mCategories[0].apps.count(); } inline bool isFavorite(const QString& desktopFile) const { return getFavoriteIndex(desktopFile) != -1; } void addToFavorites(const QString& desktopFile); void removeFromFavorites(const QString& desktopFile); void moveFavoriteItem(int oldPos, int newPos); inline int getCategoriesCount() const { return mCategories.size(); } inline const Category& getCategoryAt(int index) { return mCategories.at(index); } inline int getTotalAppCount() const { return mAppSortedByName.size(); } AppItem *getAppAt(int index); QList getMatchingApps(const QString& query) const; private: void parseMenu(const QDomElement& menu, const QString &topLevelCategory); void parseAppLink(const QDomElement& app, const QString &topLevelCategory); void parseSeparator(const QDomElement &sep, const QString &topLevelCategory); AppItem *loadAppItem(const QString& desktopFile); private: QMap mAppSortedByDesktopFile; QList mAppSortedByName; QList mCategories; // Cache sort by name map access QList::const_iterator mCachedIterator; int mCachedIndex; }; #endif // LXQTFANCYMENUAPPMAP_H ================================================ FILE: plugin-fancymenu/lxqtfancymenuappmodel.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenuappmodel.h" #include "lxqtfancymenuappmap.h" #include #include static const QLatin1String FavoritesDragMimeType("application/x-lxqtfavoritesdragrow"); LXQtFancyMenuAppModel::LXQtFancyMenuAppModel(QObject *parent) : QAbstractListModel(parent) , mAppMap(nullptr) , mCurrentCategory(0) , mInSearch(false) { } int LXQtFancyMenuAppModel::rowCount(const QModelIndex &p) const { if(!mAppMap || p.isValid() || mCurrentCategory < 0 || mCurrentCategory >= mAppMap->getCategoriesCount()) return 0; if(mInSearch) return mSearchMatches.size(); if(mCurrentCategory == LXQtFancyMenuAppMap::AllAppsCategory) return mAppMap->getTotalAppCount(); //Special "All Applications" category return mAppMap->getCategoryAt(mCurrentCategory).apps.size(); } QVariant LXQtFancyMenuAppModel::data(const QModelIndex &idx, int role) const { if(!idx.isValid()) return QVariant(); const LXQtFancyMenuAppMap::AppItem* item = getAppAt(idx.row()); LXQtFancyMenuItemType type = getItemTypeAt(idx.row()); if(!item && type == LXQtFancyMenuItemType::AppItem) return QVariant(); if(!item) { if(role == LXQtFancyMenuItemIsSeparatorRole) return 1; return QVariant(); } switch (role) { case Qt::DisplayRole: return item->title; case Qt::EditRole: return item->desktopFile; case Qt::DecorationRole: return item->icon; case Qt::ToolTipRole: { return item->comment; } default: break; } return QVariant(); } Qt::ItemFlags LXQtFancyMenuAppModel::flags(const QModelIndex &idx) const { Qt::ItemFlags f = QAbstractListModel::flags(idx); if(mCurrentCategory == LXQtFancyMenuAppMap::FavoritesCategory) f.setFlag(Qt::ItemIsDropEnabled); //Allow drag-drop of favorites const LXQtFancyMenuAppMap::AppItem* item = getAppAt(idx.row()); LXQtFancyMenuItemType type = getItemTypeAt(idx.row()); if(!item || type == LXQtFancyMenuItemType::SeparatorItem) return f; if (idx.isValid()) f.setFlag(Qt::ItemIsDragEnabled); return f; } QStringList LXQtFancyMenuAppModel::mimeTypes() const { return {FavoritesDragMimeType}; } QMimeData *LXQtFancyMenuAppModel::mimeData(const QModelIndexList &indexes) const { QList urls; int row = -1; for(const QModelIndex& idx : indexes) { const LXQtFancyMenuAppMap::AppItem* item = getAppAt(idx.row()); if(!item) continue; urls << QUrl::fromLocalFile(item->desktopFile); if(row == -1) row = idx.row(); } QMimeData *mimeData = new QMimeData(); mimeData->setUrls(urls); if(row != -1) mimeData->setData(FavoritesDragMimeType, QByteArray::number(row)); return mimeData; } bool LXQtFancyMenuAppModel::dropMimeData(const QMimeData *data_, Qt::DropAction /*action*/, int row, int /*column*/, const QModelIndex &p) { if(mCurrentCategory != LXQtFancyMenuAppMap::FavoritesCategory) return false; auto urls = data_->urls(); if(urls.isEmpty()) return false; QString desktopFile =urls.first().toLocalFile(); int oldRow = mAppMap->getFavoriteIndex(desktopFile); if(oldRow == -1) return false; if(row == -1 && p.isValid()) { // Dropped onto item but this model is a flat list // If going upwards we drop above destination item row = p.row(); if(oldRow < p.row()) { // If going downwards we drop below destination item row++; } } if(row == -1) return false; // Compensate the fact that we first remove the item // so all indexes are shifted by -1, store original value int realRow = row; if(row > oldRow) row--; if(row == oldRow) return false; // No-op // realRow is needed because beginMoveRows() behaves differenlty than // QList<...>::move() on index counting. beginMoveRows(QModelIndex(), oldRow, oldRow, QModelIndex(), realRow); mAppMap->moveFavoriteItem(oldRow, row); endMoveRows(); emit favoritesChanged(); return true; } Qt::DropActions LXQtFancyMenuAppModel::supportedDragActions() const { return Qt::CopyAction | Qt::LinkAction | Qt::MoveAction; } void LXQtFancyMenuAppModel::reloadAppMap(bool end) { if(!end) beginResetModel(); else endResetModel(); } void LXQtFancyMenuAppModel::setCurrentCategory(int category) { beginResetModel(); mCurrentCategory = category; endResetModel(); } void LXQtFancyMenuAppModel::showSearchResults(const QList &matches) { beginResetModel(); mSearchMatches = matches; mInSearch = true; endResetModel(); } void LXQtFancyMenuAppModel::endSearch() { beginResetModel(); mSearchMatches.clear(); mSearchMatches.squeeze(); mInSearch = false; endResetModel(); } LXQtFancyMenuAppMap *LXQtFancyMenuAppModel::appMap() const { return mAppMap; } void LXQtFancyMenuAppModel::setAppMap(LXQtFancyMenuAppMap *newAppMap) { mAppMap = newAppMap; } const LXQtFancyMenuAppItem *LXQtFancyMenuAppModel::getAppAt(int idx) const { if(!mAppMap || idx < 0 || mCurrentCategory < 0 || mCurrentCategory >= mAppMap->getCategoriesCount()) return nullptr; if(mInSearch) return mSearchMatches.value(idx, nullptr); if(mCurrentCategory == LXQtFancyMenuAppMap::AllAppsCategory) return mAppMap->getAppAt(idx); //Special "All Applications" category const LXQtFancyMenuAppMap::Category& cat = mAppMap->getCategoryAt(mCurrentCategory); if(idx >= cat.apps.size()) return nullptr; const LXQtFancyMenuAppMap::Category::Item& item = cat.apps.at(idx); return item.appItem; } LXQtFancyMenuItemType LXQtFancyMenuAppModel::getItemTypeAt(int idx) const { if(!mAppMap || idx < 0 || mCurrentCategory < 0 || mCurrentCategory >= mAppMap->getCategoriesCount()) return LXQtFancyMenuItemType::AppItem; if(mInSearch) return LXQtFancyMenuItemType::AppItem; if(mCurrentCategory == LXQtFancyMenuAppMap::AllAppsCategory) return LXQtFancyMenuItemType::AppItem; //Special "All Applications" category const LXQtFancyMenuAppMap::Category& cat = mAppMap->getCategoryAt(mCurrentCategory); if(idx >= cat.apps.size()) return LXQtFancyMenuItemType::AppItem; const LXQtFancyMenuAppMap::Category::Item& item = cat.apps.at(idx); return item.type; } bool LXQtFancyMenuAppModel::isInSearch() const { return mInSearch; } ================================================ FILE: plugin-fancymenu/lxqtfancymenuappmodel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUAPPMODEL_H #define LXQTFANCYMENUAPPMODEL_H #include #include "lxqtfancymenutypes.h" class LXQtFancyMenuAppMap; struct LXQtFancyMenuAppItem; class LXQtFancyMenuAppModel : public QAbstractListModel { Q_OBJECT public: explicit LXQtFancyMenuAppModel(QObject *parent = nullptr); // Basic functionality: int rowCount(const QModelIndex &p = QModelIndex()) const override; QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override; // Drag support Qt::ItemFlags flags(const QModelIndex &idx) const override; virtual QStringList mimeTypes() const override; virtual QMimeData *mimeData(const QModelIndexList &indexes) const override; virtual bool dropMimeData(const QMimeData *data_, Qt::DropAction action, int row, int column, const QModelIndex &p) override; virtual Qt::DropActions supportedDragActions() const override; void reloadAppMap(bool end); void setCurrentCategory(int category); void showSearchResults(const QList &matches); void endSearch(); LXQtFancyMenuAppMap *appMap() const; void setAppMap(LXQtFancyMenuAppMap *newAppMap); const LXQtFancyMenuAppItem *getAppAt(int idx) const; LXQtFancyMenuItemType getItemTypeAt(int idx) const; bool isInSearch() const; signals: void favoritesChanged(); private: LXQtFancyMenuAppMap *mAppMap; int mCurrentCategory; QList mSearchMatches; bool mInSearch; }; #endif // LXQTFANCYMENUAPPMODEL_H ================================================ FILE: plugin-fancymenu/lxqtfancymenucategoriesmodel.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenucategoriesmodel.h" #include "lxqtfancymenuappmap.h" LXQtFancyMenuCategoriesModel::LXQtFancyMenuCategoriesModel(QObject *parent) : QAbstractListModel(parent) , mAppMap(nullptr) { } int LXQtFancyMenuCategoriesModel::rowCount(const QModelIndex &p) const { if(!mAppMap || p.isValid()) return 0; return mAppMap->getCategoriesCount(); } QVariant LXQtFancyMenuCategoriesModel::data(const QModelIndex &idx, int role) const { if (!mAppMap || !idx.isValid() || idx.row() >= mAppMap->getCategoriesCount()) return QVariant(); const LXQtFancyMenuAppMap::Category& item = mAppMap->getCategoryAt(idx.row()); switch (role) { case Qt::DisplayRole: return item.menuTitle; case Qt::EditRole: return item.menuName; case Qt::DecorationRole: return item.icon; case LXQtFancyMenuItemIsSeparatorRole: if(item.type == LXQtFancyMenuItemType::SeparatorItem) return 1; default: break; } return QVariant(); } Qt::ItemFlags LXQtFancyMenuCategoriesModel::flags(const QModelIndex &idx) const { if (!mAppMap || !idx.isValid() || idx.row() >= mAppMap->getCategoriesCount()) return Qt::NoItemFlags; const LXQtFancyMenuAppMap::Category& item = mAppMap->getCategoryAt(idx.row()); if(item.type == LXQtFancyMenuItemType::SeparatorItem) return Qt::NoItemFlags; return QAbstractListModel::flags(idx); } void LXQtFancyMenuCategoriesModel::reloadAppMap(bool end) { if(!end) beginResetModel(); else endResetModel(); } LXQtFancyMenuAppMap *LXQtFancyMenuCategoriesModel::appMap() const { return mAppMap; } void LXQtFancyMenuCategoriesModel::setAppMap(LXQtFancyMenuAppMap *newAppMap) { mAppMap = newAppMap; } ================================================ FILE: plugin-fancymenu/lxqtfancymenucategoriesmodel.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUCATEGORIESMODEL_H #define LXQTFANCYMENUCATEGORIESMODEL_H #include class LXQtFancyMenuAppMap; class LXQtFancyMenuCategoriesModel : public QAbstractListModel { Q_OBJECT public: explicit LXQtFancyMenuCategoriesModel(QObject *parent = nullptr); // Basic functionality: int rowCount(const QModelIndex &p = QModelIndex()) const override; QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override; // Separator support: Qt::ItemFlags flags(const QModelIndex &idx) const override; void reloadAppMap(bool end); LXQtFancyMenuAppMap *appMap() const; void setAppMap(LXQtFancyMenuAppMap *newAppMap); private: LXQtFancyMenuAppMap *mAppMap; }; #endif // LXQTFANCYMENUCATEGORIESMODEL_H ================================================ FILE: plugin-fancymenu/lxqtfancymenuconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenuconfiguration.h" #include "ui_lxqtfancymenuconfiguration.h" #include #include #include #include #include #include #include "lxqtfancymenutypes.h" LXQtFancyMenuConfiguration::LXQtFancyMenuConfiguration(PluginSettings *settings, GlobalKeyShortcut::Action * shortcut, const QString &defaultShortcut, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtFancyMenuConfiguration), mDefaultShortcut(defaultShortcut), mShortcut(shortcut), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("FancyMenuConfigurationWindow")); ui->setupUi(this); fillButtonPositionComboBox(); fillCategoryPositionComboBox(); QIcon folder{XdgIcon::fromTheme(QStringLiteral("folder"))}; ui->chooseMenuFilePB->setIcon(folder); ui->iconPB->setIcon(folder); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtFancyMenuConfiguration::dialogButtonsAction); loadSettings(); connect(ui->showTextCB, &QAbstractButton::toggled, this, &LXQtFancyMenuConfiguration::showTextChanged); connect(ui->textLE, &QLineEdit::textEdited, this, &LXQtFancyMenuConfiguration::textButtonChanged); connect(ui->chooseMenuFilePB, &QAbstractButton::clicked, this, &LXQtFancyMenuConfiguration::chooseMenuFile); connect(ui->menuFilePathLE, &QLineEdit::textChanged, this, [&] (QString const & file) { if (!mLockSettingChanges) this->settings().setValue(QLatin1String("menu_file"), file); }); connect(ui->iconCB, &QCheckBox::toggled, this, [this] (bool value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("ownIcon"), value); }); connect(ui->iconPB, &QAbstractButton::clicked, this, &LXQtFancyMenuConfiguration::chooseIcon); connect(ui->iconLE, &QLineEdit::textChanged, this, [&] (QString const & path) { if (!mLockSettingChanges) this->settings().setValue(QLatin1String("icon"), path); }); connect(ui->shortcutEd, &ShortcutSelector::shortcutGrabbed, this, &LXQtFancyMenuConfiguration::shortcutChanged); connect(ui->shortcutEd->addMenuAction(tr("Reset")), &QAction::triggered, this, &LXQtFancyMenuConfiguration::shortcutReset); connect(ui->customFontCB, &QAbstractButton::toggled, this, &LXQtFancyMenuConfiguration::customFontChanged); connect(ui->customFontSizeSB, &QSpinBox::valueChanged, this, &LXQtFancyMenuConfiguration::customFontSizeChanged); connect(ui->autoSelCB, &QAbstractButton::toggled, this, [this] (bool checked) { this->settings().setValue(QStringLiteral("autoSel"), checked); }); connect(ui->autoSelSB, &QSpinBox::valueChanged, this, [this] (int value) { this->settings().setValue(QStringLiteral("autoSelDelay"), value); }); connect(mShortcut, &GlobalKeyShortcut::Action::shortcutChanged, this, &LXQtFancyMenuConfiguration::globalShortcutChanged); connect(ui->filterClearCB, &QCheckBox::toggled, this, [this] (bool value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterClear"), value); }); connect(ui->buttRowPosCB, &QComboBox::activated, this, &LXQtFancyMenuConfiguration::buttonRowPositionChanged); connect(ui->categoryViewPosCB, &QComboBox::activated, this, &LXQtFancyMenuConfiguration::categoryPositionChanged); } LXQtFancyMenuConfiguration::~LXQtFancyMenuConfiguration() { delete ui; } void LXQtFancyMenuConfiguration::fillButtonPositionComboBox() { ui->buttRowPosCB->addItem(tr("Bottom"), LXQtFancyMenuButtonPosition::Bottom); ui->buttRowPosCB->addItem(tr("Top"), LXQtFancyMenuButtonPosition::Top); } void LXQtFancyMenuConfiguration::fillCategoryPositionComboBox() { ui->categoryViewPosCB->addItem(tr("Left"), LXQtFancyMenuCategoryPosition::Left); ui->categoryViewPosCB->addItem(tr("Right"), LXQtFancyMenuCategoryPosition::Right); } void LXQtFancyMenuConfiguration::loadSettings() { mLockSettingChanges = true; ui->iconCB->setChecked(settings().value(QStringLiteral("ownIcon"), false).toBool()); ui->iconLE->setText(settings().value(QStringLiteral("icon"), QLatin1String(LXQT_GRAPHICS_DIR"/helix.svg")).toString()); ui->showTextCB->setChecked(settings().value(QStringLiteral("showText"), false).toBool()); ui->textLE->setText(settings().value(QStringLiteral("text"), QString()).toString()); QString menuFile = settings().value(QStringLiteral("menu_file"), QString()).toString(); if (menuFile.isEmpty()) menuFile = XdgMenu::getMenuFileName(QLatin1String("panel-applications.menu")); else if (!menuFile.contains(QLatin1String("/"))) menuFile = XdgMenu::getMenuFileName(menuFile); ui->menuFilePathLE->setText(menuFile); if (QGuiApplication::platformName() != QStringLiteral("xcb")) { ui->shortcutGB->setEnabled(false); ui->shortcutGB->setToolTip(tr("Modify or add a shortcut to 'lxqt-qdbus openmenu'\nin the compositor settings under Wayland")); } ui->shortcutEd->setText(nullptr != mShortcut ? mShortcut->shortcut() : mDefaultShortcut); ui->customFontCB->setChecked(settings().value(QStringLiteral("customFont"), false).toBool()); LXQt::Settings lxqtSettings(QStringLiteral("lxqt")); //load system font size as init value QFont systemFont; lxqtSettings.beginGroup(QLatin1String("Qt")); systemFont.fromString(lxqtSettings.value(QStringLiteral("font"), this->font()).toString()); lxqtSettings.endGroup(); ui->customFontSizeSB->setValue(settings().value(QStringLiteral("customFontSize"), systemFont.pointSize()).toInt()); ui->filterClearCB->setChecked(settings().value(QStringLiteral("filterClear"), true).toBool()); ui->autoSelSB->setValue(settings().value(QStringLiteral("autoSelDelay"), 250).toInt()); ui->autoSelCB->setChecked(settings().value(QStringLiteral("autoSel"), false).toBool()); bool buttonsAtTop = settings().value(QStringLiteral("buttonsAtTop"), false).toBool(); int buttRowPosIdx = ui->buttRowPosCB->findData(buttonsAtTop ? LXQtFancyMenuButtonPosition::Top : LXQtFancyMenuButtonPosition::Bottom); ui->buttRowPosCB->setCurrentIndex(buttRowPosIdx); bool categoriesAtRight = settings().value(QStringLiteral("categoriesAtRight"), true).toBool(); int categoryPosIdx = ui->categoryViewPosCB->findData(categoriesAtRight ? LXQtFancyMenuCategoryPosition::Right : LXQtFancyMenuCategoryPosition::Left); ui->categoryViewPosCB->setCurrentIndex(categoryPosIdx); mLockSettingChanges = false; } void LXQtFancyMenuConfiguration::textButtonChanged(const QString &value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("text"), value); } void LXQtFancyMenuConfiguration::showTextChanged(bool value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("showText"), value); } void LXQtFancyMenuConfiguration::chooseIcon() { QFileInfo f{ui->iconLE->text()}; QDir dir = f.dir(); QFileDialog *d = new QFileDialog(this, tr("Choose icon file"), !f.filePath().isEmpty() && dir.exists() ? dir.path() : QLatin1String(LXQT_GRAPHICS_DIR), tr("Images (*.svg *.png)")); d->setWindowModality(Qt::WindowModal); d->setAttribute(Qt::WA_DeleteOnClose); connect(d, &QFileDialog::fileSelected, this, [&] (const QString &icon) { ui->iconLE->setText(icon); }); d->show(); } void LXQtFancyMenuConfiguration::chooseMenuFile() { QFileDialog *d = new QFileDialog(this, tr("Choose menu file"), QLatin1String("/etc/xdg/menus"), tr("Menu files (*.menu)")); d->setWindowModality(Qt::WindowModal); d->setAttribute(Qt::WA_DeleteOnClose); connect(d, &QFileDialog::fileSelected, this, [&] (const QString &file) { ui->menuFilePathLE->setText(file); }); d->show(); } void LXQtFancyMenuConfiguration::globalShortcutChanged(const QString &/*oldShortcut*/, const QString &newShortcut) { ui->shortcutEd->setText(newShortcut); } void LXQtFancyMenuConfiguration::shortcutChanged(const QString &value) { if (mShortcut) mShortcut->changeShortcut(value); } void LXQtFancyMenuConfiguration::shortcutReset() { shortcutChanged(mDefaultShortcut); } void LXQtFancyMenuConfiguration::customFontChanged(bool value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("customFont"), value); } void LXQtFancyMenuConfiguration::customFontSizeChanged(int value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("customFontSize"), value); } void LXQtFancyMenuConfiguration::buttonRowPositionChanged(int idx) { if (mLockSettingChanges) return; LXQtFancyMenuButtonPosition pos = LXQtFancyMenuButtonPosition(this->ui->buttRowPosCB->itemData(idx).toInt()); bool value = (pos == LXQtFancyMenuButtonPosition::Top); this->settings().setValue(QStringLiteral("buttonsAtTop"), value); } void LXQtFancyMenuConfiguration::categoryPositionChanged(int idx) { if (mLockSettingChanges) return; LXQtFancyMenuCategoryPosition pos = LXQtFancyMenuCategoryPosition(this->ui->categoryViewPosCB->itemData(idx).toInt()); bool value = (pos == LXQtFancyMenuCategoryPosition::Right); this->settings().setValue(QStringLiteral("categoriesAtRight"), value); } ================================================ FILE: plugin-fancymenu/lxqtfancymenuconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUCONFIGURATION_H #define LXQTFANCYMENUCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" class QAbstractButton; namespace Ui { class LXQtFancyMenuConfiguration; } namespace GlobalKeyShortcut { class Action; } class LXQtFancyMenuConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtFancyMenuConfiguration(PluginSettings *settings, GlobalKeyShortcut::Action *shortcut, const QString &defaultShortcut, QWidget *parent = nullptr); ~LXQtFancyMenuConfiguration(); private: void fillButtonPositionComboBox(); void fillCategoryPositionComboBox(); private: Ui::LXQtFancyMenuConfiguration *ui; QString mDefaultShortcut; GlobalKeyShortcut::Action * mShortcut; bool mLockSettingChanges; private slots: void globalShortcutChanged(const QString &oldShortcut, const QString &newShortcut); void shortcutChanged(const QString &value); /* Saves settings in conf file. */ void loadSettings(); void textButtonChanged(const QString &value); void showTextChanged(bool value); void chooseIcon(); void chooseMenuFile(); void shortcutReset(); void customFontChanged(bool value); void customFontSizeChanged(int value); void buttonRowPositionChanged(int idx); void categoryPositionChanged(int idx); }; #endif // LXQTFANCYMENUCONFIGURATION_H ================================================ FILE: plugin-fancymenu/lxqtfancymenuconfiguration.ui ================================================ LXQtFancyMenuConfiguration 0 0 537 544 Fancy Menu Settings General Icon: false false Button text: false true Custom font size: false pt 1 11 Auto-select after: false ms 50 1000 50 250 true Menu file Menu file: Keyboard Shortcut 200 0 Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Qt::Vertical 20 41 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset ShortcutSelector QToolButton
LXQtGlobalKeysUi/ShortcutSelector
customFontCB toggled(bool) customFontSizeSB setEnabled(bool) showTextCB toggled(bool) textLE setEnabled(bool) iconCB toggled(bool) iconLE setEnabled(bool) iconCB toggled(bool) iconPB setEnabled(bool) autoSelCB toggled(bool) autoSelSB setEnabled(bool)
================================================ FILE: plugin-fancymenu/lxqtfancymenutypes.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUTYPES_H #define LXQTFANCYMENUTYPES_H #include enum LXQtFancyMenuButtonPosition : bool { Bottom = 0, Top = 1 }; enum LXQtFancyMenuCategoryPosition : bool { Left = 0, Right = 1 }; enum class LXQtFancyMenuItemType { AppItem = 0, CategoryItem, SeparatorItem }; static constexpr const int LXQtFancyMenuItemIsSeparatorRole = Qt::UserRole + 1; #endif // LXQTFANCYMENUTYPES_H ================================================ FILE: plugin-fancymenu/lxqtfancymenuwindow.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtfancymenuwindow.h" #include "lxqtfancymenuappmap.h" #include "lxqtfancymenuappmodel.h" #include "lxqtfancymenucategoriesmodel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { class SingleActivateStyle : public QProxyStyle { public: using QProxyStyle::QProxyStyle; int styleHint(StyleHint hint, const QStyleOption * option = nullptr, const QWidget * widget = nullptr, QStyleHintReturn * returnData = nullptr) const override { if(hint == QStyle::SH_ItemView_ActivateItemOnSingleClick) return 1; return QProxyStyle::styleHint(hint, option, widget, returnData); } }; class SeparatorDelegate : public QStyledItemDelegate { public: SeparatorDelegate(QObject *parent) : QStyledItemDelegate(parent) {} static bool isSeparator(const QModelIndex &index) { return index.data(LXQtFancyMenuItemIsSeparatorRole).toInt() == 1; } protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { if (isSeparator(index)) { QRect rect = option.rect; if (const QAbstractItemView *view = qobject_cast(option.widget)) rect.setWidth(view->viewport()->width()); const int margin = 6; painter->save(); painter->setOpacity(0.4); painter->setPen(QPen(Qt::black)); painter->drawLine(rect.topLeft().x() + margin , rect.topLeft().y(), rect.topRight().x() - margin, rect.topRight().y()); painter->setPen(QPen(Qt::white)); painter->drawLine(rect.topLeft().x() + margin , rect.topLeft().y() + 1, rect.topRight().x() - margin, rect.topRight().y() + 1); painter->restore(); } else { QStyledItemDelegate::paint(painter, option, index); } } QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { if (isSeparator(index)) { return QSize(2, 2); } return QStyledItemDelegate::sizeHint(option, index); } }; } LXQtFancyMenuWindow::LXQtFancyMenuWindow(QWidget *parent) : QWidget{parent, Qt::Popup} { // Under some Wayland compositors, setting window flags in the c-tor of the base class // may not be enough for a correct positioning of the popup. setWindowFlags(Qt::Popup); mFocusedItem = FocusedItem::SearchEdit; SingleActivateStyle *s = new SingleActivateStyle; s->setParent(this); setStyle(s); mSearchTimer.setSingleShot(true); connect(&mSearchTimer, &QTimer::timeout, this, &LXQtFancyMenuWindow::doSearch); mSearchTimer.setInterval(350); // typing speed (not very fast) mAutoSelTimer.setSingleShot(true); connect(&mAutoSelTimer, &QTimer::timeout, this, &LXQtFancyMenuWindow::autoSelect); mSearchEdit = new QLineEdit; mSearchEdit->setPlaceholderText(tr("Search...")); mSearchEdit->setClearButtonEnabled(true); connect(mSearchEdit, &QLineEdit::textEdited, &mSearchTimer, qOverload<>(&QTimer::start)); mSettingsButton = new QToolButton; mSettingsButton->setIcon(XdgIcon::fromTheme(QStringLiteral("preferences-system"))); mSettingsButton->setText(tr("LXQt Configuration Center")); mSettingsButton->setToolTip(mSettingsButton->text()); connect(mSettingsButton, &QToolButton::clicked, this, &LXQtFancyMenuWindow::runSystemConfigDialog); mPowerButton = new QToolButton; mPowerButton->setIcon(XdgIcon::fromTheme(QStringLiteral("system-shutdown"))); mPowerButton->setText(tr("Leave")); mPowerButton->setToolTip(mPowerButton->text()); connect(mPowerButton, &QToolButton::clicked, this, &LXQtFancyMenuWindow::runPowerDialog); mAboutButton = new QToolButton; mAboutButton->setIcon(XdgIcon::fromTheme(QStringLiteral("lxqt-about"))); mAboutButton->setText(tr("About LXQt")); mAboutButton->setToolTip(mAboutButton->text()); connect(mAboutButton, &QToolButton::clicked, this, &LXQtFancyMenuWindow::runAboutgDialog); // NOTE: Qt 6.8.0 has a bug that does not allow context menus with the Qt::Popup flag. // As a workaround, we set the context menu policy to Qt::PreventContextMenu and handle // the RightButton releases in eventFilter. mAppView = new QListView; mAppView->setObjectName(QStringLiteral("AppView")); mAppView->setSelectionMode(QListView::SingleSelection); mAppView->setDragEnabled(true); mAppView->setMovement(QListView::Snap); mAppView->setDropIndicatorShown(true); mAppView->setContextMenuPolicy(Qt::PreventContextMenu); mAppView->setItemDelegate(new SeparatorDelegate(this)); // label for empty Favorites QVBoxLayout *appLayout = new QVBoxLayout(mAppView); mFavoritesLabel = new QLabel(tr("Add your favorites by right clicking items from categories.")); mFavoritesLabel->setAlignment(Qt::AlignCenter); mFavoritesLabel->setWordWrap(true); appLayout->addWidget(mFavoritesLabel); mCategoryView = new QListView; mCategoryView->setObjectName(QStringLiteral("CategoryView")); mCategoryView->setSelectionMode(QListView::SingleSelection); mCategoryView->setItemDelegate(new SeparatorDelegate(this)); // Meld category view with whole popup window // So remove its frame and do not auto-fill its background mCategoryView->setFrameShape(QFrame::NoFrame); mCategoryView->viewport()->setAutoFillBackground(false); mAppMap = new LXQtFancyMenuAppMap; mAppModel = new LXQtFancyMenuAppModel(this); mAppModel->setAppMap(mAppMap); mAppView->setModel(mAppModel); mCategoryModel = new LXQtFancyMenuCategoriesModel(this); mCategoryModel->setAppMap(mAppMap); mCategoryView->setModel(mCategoryModel); connect(mAppModel, &LXQtFancyMenuAppModel::favoritesChanged, this, &LXQtFancyMenuWindow::favoritesChanged); connect(mAppView, &QListView::clicked, this, &LXQtFancyMenuWindow::activateAppAtIndex); //connect(mAppView, &QListView::customContextMenuRequested, this, &LXQtFancyMenuWindow::onAppViewCustomMenu); connect(mCategoryView, &QListView::activated, this, &LXQtFancyMenuWindow::activateCategory); connect(mCategoryView->selectionModel(), &QItemSelectionModel::currentChanged, this, &LXQtFancyMenuWindow::activateCategory); mMainLayout = new QVBoxLayout(this); mMainLayout->addWidget(mSearchEdit); mViewLayout = new QHBoxLayout; mViewLayout->addWidget(mAppView, APP_VIEW_STRETCH); mViewLayout->addWidget(mCategoryView, CAT_VIEW_STRETCH); mMainLayout->addLayout(mViewLayout); mButtonsLayout = new QHBoxLayout; mButtonsLayout->addWidget(mAboutButton); mButtonsLayout->addStretch(); mButtonsLayout->addWidget(mSettingsButton); mButtonsLayout->addWidget(mPowerButton); mMainLayout->addLayout(mButtonsLayout); updateButtonIconSize(); setMinimumHeight(500); // Ensure all key presses go to search box setFocusProxy(mSearchEdit); mAppView->setFocusProxy(mSearchEdit); mCategoryView->setFocusProxy(mSearchEdit); // for auto-selection mAppView->viewport()->setMouseTracking(true); mAppView->viewport()->installEventFilter(this); mCategoryView->viewport()->setMouseTracking(true); mCategoryView->viewport()->installEventFilter(this); // Filter navigation keys mSearchEdit->installEventFilter(this); } LXQtFancyMenuWindow::~LXQtFancyMenuWindow() { mAppModel->setAppMap(nullptr); mCategoryModel->setAppMap(nullptr); delete mAppMap; mAppMap = nullptr; } QSize LXQtFancyMenuWindow::sizeHint() const { return size().expandedTo(minimumSizeHint()); } QSize LXQtFancyMenuWindow::minimumSizeHint() const { return QSize(450, 550); } bool LXQtFancyMenuWindow::rebuildMenu(const XdgMenu &menu) { mAppModel->reloadAppMap(false); mCategoryModel->reloadAppMap(false); mAppMap->rebuildModel(menu); mAppModel->reloadAppMap(true); mCategoryModel->reloadAppMap(true); setCurrentCategory(LXQtFancyMenuAppMap::FavoritesCategory); return true; } void LXQtFancyMenuWindow::activateCategory(const QModelIndex &idx) { setCurrentCategory(idx.row()); } void LXQtFancyMenuWindow::activateAppAtIndex(const QModelIndex &idx) { if(!idx.isValid()) return; auto *app = mAppModel->getAppAt(idx.row()); if(!app) return; app->desktopFileCache.startDetached(); hide(); } void LXQtFancyMenuWindow::activateCurrentApp() { QModelIndex idx = mAppView->currentIndex(); if(!idx.isValid()) idx = mAppModel->index(0); activateAppAtIndex(idx); } void LXQtFancyMenuWindow::runPowerDialog() { runCommandHelper(QLatin1String("lxqt-leave")); } void LXQtFancyMenuWindow::runSystemConfigDialog() { runCommandHelper(QLatin1String("lxqt-config")); } void LXQtFancyMenuWindow::runAboutgDialog() { runCommandHelper(QLatin1String("lxqt-about")); } void LXQtFancyMenuWindow::onAppViewCustomMenu(const QPoint& p) { QModelIndex idx = mAppView->indexAt(p); auto item = mAppModel->getAppAt(idx.row()); if(!item) return; XdgDesktopFile df = item->desktopFileCache; QString file = df.fileName(); QMenu menu; QAction *a; if (df.actions().count() > 0 && df.type() == XdgDesktopFile::Type::ApplicationType) { for (int i = 0; i < df.actions().count(); ++i) { QString actionString(df.actions().at(i)); a = menu.addAction(df.actionIcon(actionString), df.actionName(actionString)); connect(a, &QAction::triggered, this, [this, df, actionString] { df.actionActivate(actionString, QStringList()); hide(); }); } menu.addSeparator(); } a = menu.addAction(XdgIcon::fromTheme(QLatin1String("desktop")), tr("Add to desktop")); connect(a, &QAction::triggered, [file] { QString desktop = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopFile = desktop + QStringLiteral("/") + file.section(QStringLiteral("/"), -1); if (QFile::exists(desktopFile)) { QMessageBox::StandardButton btn = QMessageBox::question(nullptr, tr("Question"), tr("A file with the same name already exists.\nDo you want to overwrite it?")); if (btn == QMessageBox::No) return; if (!QFile::remove(desktopFile)) { QMessageBox::warning(nullptr, tr("Warning"), tr("The file cannot be overwritten.")); return; } } QFile::copy(file, desktopFile); }); a = menu.addAction(XdgIcon::fromTheme(QLatin1String("edit-copy")), tr("Copy")); connect(a, &QAction::triggered, this, [file] { QClipboard* clipboard = QApplication::clipboard(); QMimeData* data = new QMimeData(); data->setUrls({QUrl::fromLocalFile(file)}); clipboard->setMimeData(data); }); menu.addSeparator(); QString canonicalFile = QDir(file).canonicalPath(); if(mAppMap->isFavorite(canonicalFile)) { a = menu.addAction(XdgIcon::fromTheme(QLatin1String("bookmark-remove")), tr("Remove from Favorites")); connect(a, &QAction::triggered, this, [this, canonicalFile] { removeFromFavorites(canonicalFile); }); } else { a = menu.addAction(XdgIcon::fromTheme(QLatin1String("bookmark-new")), tr("Add to Favorites")); connect(a, &QAction::triggered, this, [this, canonicalFile] { addToFavorites(canonicalFile); }); } menu.exec(mAppView->viewport()->mapToGlobal(p)); } void LXQtFancyMenuWindow::setCurrentCategory(int cat) { QModelIndex idx = mCategoryModel->index(cat, 0); mCategoryView->setCurrentIndex(idx); mCategoryView->selectionModel()->select(idx, QItemSelectionModel::ClearAndSelect); mAppModel->setCurrentCategory(cat); bool showFavoritesLabel = false; if (cat != LXQtFancyMenuAppMap::AllAppsCategory) { // If user clicked elsewhere, reset search setSearchQuery(QString()); // show or hide the label for empty Favorites if (cat == LXQtFancyMenuAppMap::FavoritesCategory && mAppMap->getFavoriteCount() == 0) { showFavoritesLabel = true; } } mFavoritesLabel->setVisible(showFavoritesLabel); } bool LXQtFancyMenuWindow::eventFilter(QObject *watched, QEvent *e) { if(e->type() == QEvent::KeyPress && (watched == mSearchEdit || watched == mCategoryView->viewport() || watched == mAppView->viewport())) { /* Basically we take all keyboard events sent to: * * - Search QLineEdit * - App QListView's viewport() * - Category QListView's viewport() * * And we manually redirect them to the selected one. * Then event gets eaten up so it doesn't get processed * by it's original destination widget. * * If selected item is same as destination widget, no * redirection happens, we call default event filter * to let Qt manage it's internal state. */ QKeyEvent *ev = static_cast(e); if(ev->key() == Qt::Key_Return || ev->key() == Qt::Key_Enter) { if(mFocusedItem != FocusedItem::CategoryView) activateCurrentApp(); return true; } else if(ev->key() == Qt::Key_Up || ev->key() == Qt::Key_PageUp || ev->key() == Qt::Key_Down || ev->key() == Qt::Key_PageDown) { // Use Up/Down arrows to navigate app view if(mFocusedItem == FocusedItem::SearchEdit) { if(ev->key() == Qt::Key_Up || ev->key() == Qt::Key_PageUp) { // Already at top, nothing to do return QWidget::eventFilter(watched, e); } else { // Go down to app view, forward event mFocusedItem = FocusedItem::AppView; QCoreApplication::sendEvent(mAppView, ev); return true; } } else if(ev->key() == Qt::Key_Up || ev->key() == Qt::Key_PageUp) { if((mFocusedItem == FocusedItem::AppView && mAppView->currentIndex().row() == 0) || (mFocusedItem == FocusedItem::CategoryView && mCategoryView->currentIndex().row() == 0)) { // Go up to search edit, eat event mFocusedItem = FocusedItem::SearchEdit; return true; } } QWidget *dest = nullptr; if(mFocusedItem == FocusedItem::AppView) dest = mAppView; else if(mFocusedItem == FocusedItem::CategoryView) dest = mCategoryView; if(dest && dest != watched) { //Forward event QCoreApplication::sendEvent(dest, ev); return true; } } else if(ev->key() == Qt::Key_Left || ev->key() == Qt::Key_Right) { if(mFocusedItem != FocusedItem::SearchEdit) { // Switch between app view and category view if(mFocusedItem == FocusedItem::AppView) { mFocusedItem = FocusedItem::CategoryView; //Clear selection in app view to tell user it's now navigating categories mAppView->selectionModel()->clearSelection(); } else if(mFocusedItem == FocusedItem::CategoryView) { mFocusedItem = FocusedItem::AppView; // Select current index in app view QModelIndex idx = mAppView->currentIndex(); if(!idx.isValid()) idx = mAppModel->index(0); mAppView->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect); } // Eat event return true; } } else { // Normal keys go always to search edit mFocusedItem = FocusedItem::SearchEdit; if(watched != mSearchEdit) { // Forward event QCoreApplication::sendEvent(mSearchEdit, ev); return true; } } } else if (e->type() == QEvent::MouseButtonRelease && (watched == mAppView->viewport())) { QMouseEvent *ev = static_cast(e); if (ev->button() == Qt::RightButton) { QPoint p = ev->position().toPoint(); QTimer::singleShot(0, this, [this, p]() {onAppViewCustomMenu(p);}); } } else if (mAutoSel && (watched == mCategoryView->viewport() || watched == mAppView->viewport())) { if (e->type() == QEvent::MouseMove) mAutoSelTimer.start(); else if (e->type() == QEvent::Leave) mAutoSelTimer.stop(); } return QWidget::eventFilter(watched, e); } void LXQtFancyMenuWindow::doSearch() { setSearchQuery(mSearchEdit->text()); } void LXQtFancyMenuWindow::setSearchQuery(const QString &text) { // Do not set text if not changed otherwise cursor // gets moved to end of text, it's annoying if user // is editing in the middle of text if(mSearchEdit->text() != text) mSearchEdit->setText(text); if(!text.isEmpty()) { setCurrentCategory(LXQtFancyMenuAppMap::AllAppsCategory); auto apps = mAppMap->getMatchingApps(text); mAppModel->showSearchResults(apps); } else if(text.isEmpty() && mAppModel->isInSearch()) { mAppModel->endSearch(); } else { // No change return; } // Give focus to search edit mFocusedItem = FocusedItem::SearchEdit; // Select first app mAppView->selectionModel()->setCurrentIndex(mAppModel->index(0), QItemSelectionModel::ClearAndSelect); } void LXQtFancyMenuWindow::hideEvent(QHideEvent *e) { emit aboutToHide(); if(mFilterClear) setSearchQuery(QString()); // Clear search on hide // If search is not active, switch to Favorites if(mSearchEdit->text().isEmpty()) setCurrentCategory(LXQtFancyMenuAppMap::FavoritesCategory); mFocusedItem = FocusedItem::SearchEdit; QWidget::hideEvent(e); } void LXQtFancyMenuWindow::showEvent(QShowEvent *e) { // Resize the widget to fit the category view to its contents. // NOTE: The layout is fully calculated when the widget is shown; // hence resizing the widget here. auto model = mCategoryView->model(); if (model == nullptr) { QWidget::showEvent(e); return; } QRect r; for (int i = 0; i < model->rowCount(); ++i) { QModelIndex indx = model->index(i, 0); if (indx.isValid()) { r = r.united(mCategoryView->visualRect(indx)); } } QMargins m = mCategoryView->contentsMargins(); int difW = r.width() + m.left() + m.right() - mCategoryView->width(); int difH = r.height() + m.top() + m.bottom() - mCategoryView->height(); if (difW > 0 || difH > 0) { int newWidth = width(); int newHeight = height(); if (difW > 0) { // also take stretch factors into account newWidth += qreal((CAT_VIEW_STRETCH + APP_VIEW_STRETCH) * difW) / CAT_VIEW_STRETCH + 1 + 2 * mCategoryView->lineWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent); } if (difH > 0) { newHeight += difH + 2 * mCategoryView->lineWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent); } QSize newSize(newWidth, newHeight); // take care of small screens or huge fonts QRect sr; if (QWindow *win = windowHandle()) { if (QScreen *sc = win->screen()) { sr = sc->availableGeometry(); } } if (sr.isNull()) { if (QScreen *pScreen = QApplication::primaryScreen()) { sr = pScreen->availableGeometry(); } } if (!sr.isNull()) { newSize = newSize.boundedTo(sr.size()); } resize(newSize); } // Give focus to search edit mFocusedItem = FocusedItem::SearchEdit; // Select current index in app view QModelIndex idx = mAppView->currentIndex(); if(!idx.isValid()) idx = mAppModel->index(0); mAppView->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect); QWidget::showEvent(e); } void LXQtFancyMenuWindow::keyPressEvent(QKeyEvent *e) { // If search edit is not empty, clear it instead of closing popup if(!mSearchEdit->text().isEmpty() && e->matches(QKeySequence::Cancel)) { mSearchEdit->clear(); mSearchTimer.start(); e->accept(); return; } QWidget::keyPressEvent(e); } void LXQtFancyMenuWindow::runCommandHelper(const QString &cmd) { if(QProcess::startDetached(cmd, QStringList())) { hide(); } else { QMessageBox::warning(this, tr("No Executable"), tr("Cannot find %1 executable.").arg(cmd)); } } void LXQtFancyMenuWindow::addToFavorites(const QString &desktopFile) { mAppModel->reloadAppMap(false); mAppMap->addToFavorites(desktopFile); mAppModel->reloadAppMap(true); emit favoritesChanged(); } void LXQtFancyMenuWindow::removeFromFavorites(const QString &desktopFile) { mAppModel->reloadAppMap(false); mAppMap->removeFromFavorites(desktopFile); mAppModel->reloadAppMap(true); if (mAppMap->getFavoriteCount() == 0) { auto idx = mCategoryView->currentIndex(); if (idx.row() == LXQtFancyMenuAppMap::FavoritesCategory && mCategoryView->selectionModel()->isSelected(idx)) { mFavoritesLabel->show(); } } emit favoritesChanged(); } void LXQtFancyMenuWindow::setFilterClear(bool newFilterClear) { mFilterClear = newFilterClear; if(mFilterClear && !isVisible()) { // Apply immediately setSearchQuery(QString()); } } void LXQtFancyMenuWindow::setButtonPosition(LXQtFancyMenuButtonPosition pos) { mMainLayout->removeItem(mButtonsLayout); int idx = 0; if(pos == LXQtFancyMenuButtonPosition::Bottom) idx = -1; mMainLayout->insertLayout(idx, mButtonsLayout); } void LXQtFancyMenuWindow::setCategoryPosition(LXQtFancyMenuCategoryPosition pos) { mViewLayout->removeWidget(mCategoryView); int idx = 0; if(pos == LXQtFancyMenuCategoryPosition::Right) idx = -1; mViewLayout->insertWidget(idx, mCategoryView, CAT_VIEW_STRETCH); } void LXQtFancyMenuWindow::updateButtonIconSize() { int sz = style()->pixelMetric(QStyle::PM_LargeIconSize, nullptr, mSettingsButton); const QSize iconSize(sz, sz); mSettingsButton->setIconSize(iconSize); mPowerButton->setIconSize(iconSize); mAboutButton->setIconSize(iconSize); } void LXQtFancyMenuWindow::setSearchEditFocus() { mSearchEdit->setFocus(); } void LXQtFancyMenuWindow::setCustomFont(const QFont &f) { mAppView->setFont(f); mCategoryView->setFont(f); mSearchEdit->setFont(f); // We should resize the widget because the font may become smaller. // The size will be adjusted in showEvent() if needed. if (!isVisible()) { resize(minimumSizeHint()); } } QStringList LXQtFancyMenuWindow::favorites() const { return mAppMap->getFavorites(); } void LXQtFancyMenuWindow::setFavorites(const QStringList &newFavorites) { mAppModel->reloadAppMap(false); mAppMap->setFavorites(newFavorites); mAppModel->reloadAppMap(true); } void LXQtFancyMenuWindow::paintEvent(QPaintEvent *) { // enforce the stylesheet background color (if any) on all widget styles QPainter p(this); QStyleOption opt; opt.initFrom(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void LXQtFancyMenuWindow::autoSelect() { QModelIndex idx = mCategoryView->indexAt(mCategoryView->viewport()->mapFromGlobal(QCursor::pos())); if (idx.isValid()) { if (!SeparatorDelegate::isSeparator(idx) && !mCategoryView->selectionModel()->isSelected(idx)) { activateCategory(idx); mFocusedItem = FocusedItem::CategoryView; } } else { mFocusedItem = FocusedItem::AppView; idx = mAppView->indexAt(mAppView->viewport()->mapFromGlobal(QCursor::pos())); if (idx.isValid() && !SeparatorDelegate::isSeparator(idx) && !mAppView->selectionModel()->isSelected(idx)) { mAppView->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect); } } } ================================================ FILE: plugin-fancymenu/lxqtfancymenuwindow.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2023 LXQt team * Authors: * Filippo Gentile * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTFANCYMENUWINDOW_H #define LXQTFANCYMENUWINDOW_H #include #include #include "lxqtfancymenutypes.h" class QLineEdit; class QToolButton; class QLabel; class QListView; class QModelIndex; class QHBoxLayout; class QVBoxLayout; class XdgMenu; class LXQtFancyMenuAppMap; class LXQtFancyMenuAppModel; class LXQtFancyMenuCategoriesModel; class LXQtFancyMenuWindow : public QWidget { Q_OBJECT public: explicit LXQtFancyMenuWindow(QWidget *parent = nullptr); ~LXQtFancyMenuWindow(); virtual QSize sizeHint() const override; virtual QSize minimumSizeHint() const override; bool rebuildMenu(const XdgMenu &menu); void setCurrentCategory(int cat); bool eventFilter(QObject *watched, QEvent *e) override; QStringList favorites() const; void setFavorites(const QStringList &newFavorites); void setFilterClear(bool newFilterClear); void setButtonPosition(LXQtFancyMenuButtonPosition pos); void setCategoryPosition(LXQtFancyMenuCategoryPosition pos); void updateButtonIconSize(); void setSearchEditFocus(); void setCustomFont(const QFont& f); void setAutoSelection(bool autoSel) { mAutoSel = autoSel; if (!mAutoSel) mAutoSelTimer.stop(); } void setAutoSelectionDelay(int delay) { mAutoSelTimer.setInterval(delay); } signals: void aboutToShow(); void aboutToHide(); void favoritesChanged(); public slots: void doSearch(); void setSearchQuery(const QString& text); protected: void hideEvent(QHideEvent *e) override; void showEvent(QShowEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void paintEvent(QPaintEvent *e) override; private slots: void activateCategory(const QModelIndex& idx); void activateAppAtIndex(const QModelIndex& idx); void activateCurrentApp(); void runPowerDialog(); void runSystemConfigDialog(); void runAboutgDialog(); void onAppViewCustomMenu(const QPoint &p); void autoSelect(); private: void runCommandHelper(const QString& cmd); void addToFavorites(const QString& desktopFile); void removeFromFavorites(const QString& desktopFile); private: // Use 3:2 stretch factors so app view is slightly wider than category view static const int APP_VIEW_STRETCH = 3; static const int CAT_VIEW_STRETCH = 2; QVBoxLayout *mMainLayout; QHBoxLayout *mButtonsLayout; QHBoxLayout *mViewLayout; QToolButton *mSettingsButton; QToolButton *mPowerButton; QToolButton *mAboutButton; QLineEdit *mSearchEdit; QListView *mAppView; QListView *mCategoryView; QLabel *mFavoritesLabel; LXQtFancyMenuAppMap *mAppMap; LXQtFancyMenuAppModel *mAppModel; LXQtFancyMenuCategoriesModel *mCategoryModel; QTimer mSearchTimer; QTimer mAutoSelTimer; bool mAutoSel = false; bool mFilterClear = false; enum class FocusedItem { SearchEdit = 0, AppView, CategoryView }; FocusedItem mFocusedItem; }; #endif // LXQTFANCYMENUWINDOW_H ================================================ FILE: plugin-fancymenu/resources/fancymenu.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=start-here-lxqt #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-fancymenu/translations/fancymenu.desktop.yaml ================================================ Desktop Entry/Name: "Fancy Application Menu" Desktop Entry/Comment: "A menu of all your applications with favorites" ================================================ FILE: plugin-fancymenu/translations/fancymenu.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ar.desktop.yaml ================================================ Desktop Entry/Name: "قائمة التطبيقات الفاخرة" Desktop Entry/Comment: "قائمة بجميع تطبيقاتك مع المفضلة" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ar.ts ================================================ LXQtFancyMenu Show/hide main menu اعرض/أخفِ القائمة الرئيسية LXQtFancyMenuAppMapStrings Favorites المفضلة All Applications جميع التطبيقات LXQtFancyMenuConfiguration Fancy Menu Settings إعدادات القائمة المحسّنة General عام Icon: الأيقونة: Button text: زر كتابة: Custom font size: حجم خط مخصّص: pt من النقاط Auto-select after: التحديد التلقائي بعد: ms ملّي ثانية Menu file ملف القوائم Menu file: ملف القوائم: Keyboard Shortcut اختصار لوحة المفاتيح Click the button to record shortcut: انقر الزرّ لتسجيل اختصار: Search البحث Clear search upon showing menu امسح البحث عند عرض القائمة Layout تَخطِيط Buttons row position موقف صف الأزرار Categories position موقف الفئات Reset صفّر Bottom أسفل Top أعلى Left يسار Right يمين Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland قم بتعديل أو إضافة اختصار إلى 'lxqt-qdbus openmenu' في إعدادات المُركِّب ضمن Wayland Choose icon file اختر ملف أيقونة Images (*.svg *.png) الصور (‎*.svg *.png) Choose menu file اختر ملف القوائم Menu files (*.menu) ملفات القوائم (‎*.menu) LXQtFancyMenuWindow Search... ابحث… LXQt Configuration Center مركز إعدادات LXQt Leave اترك About LXQt حول LXQt Add your favorites by right clicking items from categories. أضف مفضلاتك عن طريق النقر بزر الماوس الأيمن على العناصر من الفئات. Add to desktop أضف إلى سطح المكتب Question سؤال A file with the same name already exists. Do you want to overwrite it? يوجد ملف بنفس الاسم بالفعل. هل تريد الكتابة عليه؟ Warning تحذير The file cannot be overwritten. لا يمكن الكتابة فوق الملف. Copy نسخ Remove from Favorites إزالة من المفضلة Add to Favorites اضافة الى المفضلة No Executable لا يوجد قابل للتنفيذ Cannot find <b>%1</b> executable. لا يمكن العثور على <b>%1</b> قابل للتنفيذ. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ast.ts ================================================ LXQtFancyMenu Show/hide main menu Amosar/anubrir menú principal LXQtFancyMenuAppMapStrings Favorites All Applications Toles aplicaciones LXQtFancyMenuConfiguration Fancy Menu Settings General Xenerales Icon: Iconu: Button text: Testu del botón: Custom font size: pt Auto-select after: ms Menu file Ficheru del menú Menu file: Ficheru del menú: Keyboard Shortcut Click the button to record shortcut: Search Guetar Clear search upon showing menu Layout Buttons row position Categories position Posición de les categoríes Reset Reafitar Bottom Top Left Right Choose icon file Images (*.svg *.png) Imáxenes (*.svg *.png) Choose menu file Menu files (*.menu) Ficheros del menú (*.menu) LXQtFancyMenuWindow Search... Guetar… LXQt Configuration Center Centru de configuración del LXQt Leave About LXQt Tocante al LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Copiar Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. Nun se pue alcontrar l’executable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_bg.desktop.yaml ================================================ Desktop Entry/Name: "Старт меню" Desktop Entry/Comment: "Меню с всички ваши приложения и предпочитания" ================================================ FILE: plugin-fancymenu/translations/fancymenu_bg.ts ================================================ LXQtFancyMenu Show/hide main menu Показване/скриване на менюто LXQtFancyMenuAppMapStrings Favorites Любими All Applications Всички програми LXQtFancyMenuConfiguration Fancy Menu Settings Настройки на Fancy меню General Общи Icon: Икона: Button text: Текст на бутона: Custom font size: Размер на шрифта: pt pt Auto-select after: Автоматичен избор след: ms ms Menu file Файл на менюто Menu file: Файл на меню: Keyboard Shortcut Клавишна комбинация Click the button to record shortcut: Натисни бутона за запис на комбинация: Search Търсене Clear search upon showing menu Изчистване на търсенето при показване на менюто Layout Оформление Buttons row position Позиция на реда на бутоните Categories position Позиция на категориите Reset Връщане стандартни настройки Bottom Отдолу Top Отгоре Left Отляво Right Отдясно Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Промяна или добавяне на кливишна комбинация за 'lxqt-qdbus openmenu' в настройките на композитора под Wayland Choose icon file Избиране файл на икона Images (*.svg *.png) Изображения (*.svg *.png) Choose menu file Избиране на файл на менюто Menu files (*.menu) Файлове на меню (*.menu) LXQtFancyMenuWindow Search... Търсене... LXQt Configuration Center LXQt Конфигурационен център Leave Напускане About LXQt Относно LXQt Add your favorites by right clicking items from categories. Добавете вашите предпочитани програми, като щракнете с десния бутон върху елементи от категориите. Add to desktop Добавяне към работния плот Question Въпрос A file with the same name already exists. Do you want to overwrite it? Вече съществува файл със същото име. Искате ли да го презапишете? Warning Предупреждение The file cannot be overwritten. Файлът не може да бъде презаписан. Copy Копиране Remove from Favorites Премахване от Любими Add to Favorites Добавяне към Любими No Executable Няма изпълним файл Cannot find <b>%1</b> executable. Не може да се намери изпълним файл <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ca.desktop.yaml ================================================ Desktop Entry/Name: "Menú d'aplicacions fantàstic" Desktop Entry/Comment: "Un menú de totes les aplicacions i les preferides" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ca.ts ================================================ LXQtFancyMenu Show/hide main menu Mostra o oculta el menú principal LXQtFancyMenuAppMapStrings Favorites Preferits All Applications Totes les aplicacions LXQtFancyMenuConfiguration Fancy Menu Settings Configuració de menú elegant General General Icon: Icona: Button text: Text del botó: Custom font size: Mida personalitzada de la lletra: pt pt Auto-select after: Selecciona automàticament després de: ms ms Menu file Fitxer del menú Menu file: Fitxer del menú: Keyboard Shortcut Drecera de teclat Click the button to record shortcut: Feu clic al botó per enregistrar la drecera: Search Cerca Clear search upon showing menu Neteja la cerca quan apareix el menú Layout Disposició Buttons row position Posició de la fila de botons Categories position Posició de les categories Reset Reinicialitza Bottom A baix Top A dalt Left A l'esquerra Right A la dreta Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Trieu el fitxer de la icona Images (*.svg *.png) Imatges (*.svg *.png) Choose menu file Trieu el fitxer del menú Menu files (*.menu) Fitxers de menús (*.menu) LXQtFancyMenuWindow Search... Cerca... LXQt Configuration Center Centre de configuració de l'LXQt Leave Surt About LXQt Quant a l'LXQt Add your favorites by right clicking items from categories. Afegiu els vostres preferits fent clic amb el botó dret als elements de les categories. Add to desktop Afegeix a l'escriptori Question Pregunta A file with the same name already exists. Do you want to overwrite it? Ja existeix un fitxer amb el mateix nom. Voleu sobreescriure'l? Warning Avís The file cannot be overwritten. No es pot sobreescriure el fitxer. Copy Copia Remove from Favorites Suprimeix dels preferits Add to Favorites Afegeix als preferits No Executable No executable Cannot find <b>%1</b> executable. No es pot trobar l'executable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_cs.desktop.yaml ================================================ Desktop Entry/Name: "Líbivá nabídka aplikací" Desktop Entry/Comment: "Nabídka se všemi vašimi aplikacemi s oblíbenými" ================================================ FILE: plugin-fancymenu/translations/fancymenu_cs.ts ================================================ LXQtFancyMenu Show/hide main menu Zobrazit/skrýt hlavní nabídku LXQtFancyMenuAppMapStrings Favorites Oblíbené All Applications Všechny aplikace LXQtFancyMenuConfiguration Fancy Menu Settings Nastavení nabídky General Obecné Icon: Ikona: Button text: Text tlačítka: Custom font size: Uživatelsky určená velikost písma: pt bodů Auto-select after: Vybrat automaticky po: ms ms Menu file Soubor s nabídkou Menu file: Soubor s nabídkou: Keyboard Shortcut Klávesová zkratka Click the button to record shortcut: Klávesovou zkratku zaznamenáte kliknutím na tlačítko: Search Hledat Clear search upon showing menu Při dalším zobrazení nabídky vyčistit hledání Layout Rozvržení Buttons row position Pozice řádku tlačítek Categories position Pozice kategorií Reset Vrátit na výchozí Bottom Dole Top Nahoře Left Nalevo Right Napravo Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Změnit nebo přidat zkratku pro „lxqt-qdbus openmenu“ v nastavení kompozitoru pod Wayland Choose icon file Vybrat soubor s ikonou Images (*.svg *.png) Obrázky (*.svg *.png) Choose menu file Vybrat soubor s nabídkou Menu files (*.menu) Soubory s nabídkami (*.menu) LXQtFancyMenuWindow Search... Hledat… LXQt Configuration Center Centrum nastavení LXQt Leave Opustit About LXQt O LXQt Add your favorites by right clicking items from categories. Přidejte své oblíbené položky klepnutím pravým tlačítkem myši na položky z kategorií. Add to desktop Přidat na plochu Question Dotaz A file with the same name already exists. Do you want to overwrite it? Stejnojmenný soubor už existuje. Chcete ho přepsat? Warning Varování The file cannot be overwritten. Soubor není možné přepsat. Copy Zkopírovat Remove from Favorites Odebrat z oblíbených Add to Favorites Přidat do oblíbených No Executable Žádný spustitelný soubor Cannot find <b>%1</b> executable. Nebylo možné nalézt spustitelný soubor <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_cy.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_da.ts ================================================ LXQtFancyMenu Show/hide main menu Vis/skjul hovedmenu LXQtFancyMenuAppMapStrings Favorites Favoritter All Applications Alle Programmer LXQtFancyMenuConfiguration Fancy Menu Settings Fancy Menu indstillinger General Generelt Icon: Ikon: Button text: Knaptekst: Custom font size: Brugerdefineret skriftstørrelse: pt pt Auto-select after: Vælg automatisk efter: ms ms Menu file Menufil Menu file: Menufil: Keyboard Shortcut Tastaturgenvej Click the button to record shortcut: Klik på knappen for at optage genvej: Search Søg Clear search upon showing menu Ryd søgning når menuen vises Layout Udformning Buttons row position Knappers rækkeposition Categories position Kategoriposition Reset Nulstil Bottom Bund Top Top Left Venstre Right Højre Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Rediger eller tilføj en genvej til 'lxqt-qdbus openmenu' i compositor-indstillingerne under Wayland Choose icon file Vælg ikonfil Images (*.svg *.png) Billeder (*.svg *.png) Choose menu file Vælg menufil Menu files (*.menu) Menufiler (*.menu) LXQtFancyMenuWindow Search... Søg... LXQt Configuration Center LXQt-indstillingscenter Leave Forlad About LXQt Om LXQt Add your favorites by right clicking items from categories. Tilføj dine favoritter ved at højreklikke på elementer fra kategorier. Add to desktop Tilføj til skrivebord Question Spørgsmål A file with the same name already exists. Do you want to overwrite it? Der findes allerede en fil med det samme navn. Vil du overskrive den? Warning Advarsel The file cannot be overwritten. Filen kan ikke overskrives. Copy Kopiér Remove from Favorites Fjern fra favoritter Add to Favorites Tilføj til favoritter No Executable Ingen kørbare Cannot find <b>%1</b> executable. Kan ikke finde <b>%1</b> kørbar. ================================================ FILE: plugin-fancymenu/translations/fancymenu_de.desktop.yaml ================================================ Desktop Entry/Name: "Fancy-Anwendungsmenü" Desktop Entry/Comment: "Ein Menü mit all Ihren Anwendungen und Favoriten" ================================================ FILE: plugin-fancymenu/translations/fancymenu_de.ts ================================================ LXQtFancyMenu Show/hide main menu Hauptmenü anzeigen/ausblenden LXQtFancyMenuAppMapStrings Favorites Favoriten All Applications Alle Anwendungen LXQtFancyMenuConfiguration Fancy Menu Settings Fancy-Menüeinstellungen General Allgemein Icon: Symbol: Button text: Schaltflächentext: Custom font size: Eigene Schriftgröße: pt pt Auto-select after: Automatische Auswahl nach: ms ms Menu file Menüdatei Menu file: Menüdatei: Keyboard Shortcut Tastenkürzel Click the button to record shortcut: Klicken Sie auf die Schaltfläche, um ein Tastenkürzel aufzunehmen: Search Suchen Clear search upon showing menu Suche bei Anzeige des Menüs löschen Layout Layout Buttons row position Position der Schaltflächenreihe Categories position Position der Kategorien Reset Zurücksetzen Bottom Unten Top Oben Left Links Right Rechts Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Symboldatei auswählen Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Menüdatei auswählen Menu files (*.menu) Menüdateien (*.menu) LXQtFancyMenuWindow Search... Suchen... LXQt Configuration Center LXQt-Konfigurationszentrum Leave Verlassen About LXQt Über LXQt Add your favorites by right clicking items from categories. Fügen Sie Ihre Favoriten hinzu, indem Sie einen Rechtsklick auf Elemente aus den Kategorien machen. Add to desktop Hinzufügen zum Arbeitsplatz Question Frage A file with the same name already exists. Do you want to overwrite it? Eine Datei mit dem gleichen Namen existiert bereits. Möchten Sie diese überschreiben? Warning Warnung The file cannot be overwritten. Die Datei kann nicht überschrieben werden. Copy Kopieren Remove from Favorites Aus den Favoriten entfernen Add to Favorites Zu den Favoriten hinzufügen No Executable Keine ausführbare Datei Cannot find <b>%1</b> executable. Kann ausführbare Datei <b>%1</b> nicht finden. ================================================ FILE: plugin-fancymenu/translations/fancymenu_el.desktop.yaml ================================================ Desktop Entry/Name: "Εξεζητημένο μενού εφαρμογών" Desktop Entry/Comment: "Ένα μενού όλων των εφαρμογών σας με αγαπημένες" ================================================ FILE: plugin-fancymenu/translations/fancymenu_el.ts ================================================ LXQtFancyMenu Show/hide main menu Εμφάνιση/απόκρυψη του κύριου μενού LXQtFancyMenuAppMapStrings Favorites Σελιδοδείκτες All Applications Όλες οι εφαρμογές LXQtFancyMenuConfiguration Fancy Menu Settings Ρυθμίσεις του Εντυπωσιακού μενού General Γενικά Icon: Εικονίδιο: Button text: Κείμενο κουμπιού: Custom font size: Προσαρμοσμένο μέγεθος γραμματοσειράς: pt σημ Auto-select after: Καθυστέρηση αυτόματης επιλογής: ms ms Menu file Αρχείο μενού Menu file: Αρχείο μενού: Keyboard Shortcut Συντόμευση πληκτρολογίου Click the button to record shortcut: Κλικ στο πλήκτρο για εγγραφή της συντόμευσης: Search Αναζήτηση Clear search upon showing menu Εκκαθάριση της αναζήτησης μετά από εμφάνιση του μενού Layout Διάταξη Buttons row position Θέση γραμμής κουμπιών Categories position Θέση κατηγοριών Reset Επαναφορά Bottom Βάση Top Κορυφή Left Αριστερά Right Δεξιά Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Τροποποιήστε ή προσθέστε μια συντόμευση για το 'lxqt-qdbus openmenu' στις ρυθμίσεις του συνθέτη στο Wayland Choose icon file Επιλέξτε το αρχείο του εικονιδίου Images (*.svg *.png) Εικόνες (*.svg *.png) Choose menu file Επιλογή αρχείου μενού Menu files (*.menu) Αρχεία μενού (*.menu) LXQtFancyMenuWindow Search... Αναζήτηση... LXQt Configuration Center Κέντρο διαμόρφωσης LXQt Leave Έξοδος About LXQt Περί του LXQt Add your favorites by right clicking items from categories. Προσθήκη σελιδοδεικτών με δεξί κλικ στα αντικείμενα στις κατηγορίες. Add to desktop Προσθήκη στην επιφάνεια εργασίας Question Ερώτηση A file with the same name already exists. Do you want to overwrite it? Ένα αρχείο με το ίδιο όνομα υπάρχει ήδη. Επιθυμείτε να το αντικαταστήσετε; Warning Προειδοποίηση The file cannot be overwritten. Το αρχείο δεν μπορεί να αντικατασταθεί. Copy Αντιγραφή Remove from Favorites Αφαίρεση από τους σελιδοδείκτες Add to Favorites Προσθήκη στους σελιδοδείκτες No Executable Μη εκτελέσιμο Cannot find <b>%1</b> executable. Αδύνατη η εύρεση του εκτελέσιμου <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Fancy Application Menu" Desktop Entry/Comment: "A menu of all your applications with favourites" ================================================ FILE: plugin-fancymenu/translations/fancymenu_en_GB.ts ================================================ LXQtFancyMenu Show/hide main menu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites Favourites All Applications All Applications LXQtFancyMenuConfiguration Fancy Menu Settings Fancy Menu Settings General General Icon: Icon: Button text: Button text: Custom font size: Custom font size: pt pt Auto-select after: Auto-select after: ms ms Menu file Menu file Menu file: Menu file: Keyboard Shortcut Keyboard Shortcut Click the button to record shortcut: Click the button to record shortcut: Search Search Clear search upon showing menu Clear search upon showing menu Layout Layout Buttons row position Buttons row position Categories position Categories position Reset Reset Bottom Bottom Top Top Left Left Right Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Choose icon file Images (*.svg *.png) Images (*.svg *.png) Choose menu file Choose menu file Menu files (*.menu) Menu files (*.menu) LXQtFancyMenuWindow Search... Search... LXQt Configuration Center LXQt Configuration Centre Leave Leave About LXQt About LXQt Add your favorites by right clicking items from categories. Add your favourites by right-clicking items from categories. Add to desktop Add to desktop Question Question A file with the same name already exists. Do you want to overwrite it? A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Remove from Favourites Add to Favorites Add to Favourites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_eo.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Ĝenerala Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menua dosiero Menu file: Keyboard Shortcut Klavkombinoj Click the button to record shortcut: Alklaku sur la butono por registi klavkombinon: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file lektu menuan dosieron Menu files (*.menu) Menuaj dosieroj (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_es.desktop.yaml ================================================ Desktop Entry/Name: "Menú elegante de aplicaciones" Desktop Entry/Comment: "Un menú de todas tus aplicaciones con favoritos" ================================================ FILE: plugin-fancymenu/translations/fancymenu_es.ts ================================================ LXQtFancyMenu Show/hide main menu Mostrar/ocultar el menú principal LXQtFancyMenuAppMapStrings Favorites Favoritos All Applications Todas las aplicaciones LXQtFancyMenuConfiguration Fancy Menu Settings Configuración del menú elegante General General Icon: Icono: Button text: Texto del botón: Custom font size: Tamaño de fuente personalizado: pt pt Auto-select after: Seleccionar automáticamente después de: ms ms Menu file Archivo de menú Menu file: Archivo de menú: Keyboard Shortcut Atajo de teclado Click the button to record shortcut: Presione el botón para registrar el atajo: Search Buscar Clear search upon showing menu Borrar la búsqueda al cerrar el menú Layout Disposición Buttons row position Posición de la fila de botones Categories position Posición de las categorías Reset Restablecer Bottom Abajo Top Arriba Left Izquierda Right Derecha Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Elija un archivo de icono Images (*.svg *.png) Imágenes (*.svg *.png) Choose menu file Escoja un archivo de menú Menu files (*.menu) Archivos de menú (*.menu) LXQtFancyMenuWindow Search... Buscar... LXQt Configuration Center Centro de configuración de LXQt Leave Salir About LXQt Acerca de LXQt Add your favorites by right clicking items from categories. Agregue sus favoritos haciendo clic derecho en los elementos de las categorías. Add to desktop Añadir al escritorio Question Pregunta A file with the same name already exists. Do you want to overwrite it? Ya existe un archivo con el mismo nombre. ¿Quiere sobrescribirlo? Warning Aviso The file cannot be overwritten. El archivo no puede sobrescribirse. Copy Copiar Remove from Favorites Quitar de Favoritos Add to Favorites Agregar a los favoritos No Executable Ningún ejecutable Cannot find <b>%1</b> executable. No se puede encontrar el ejecutable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_es_UY.ts ================================================ LXQtFancyMenu Show/hide main menu Mostrar/esconder el menú principal LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Archivo de menú Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Seleccionar archivo de menú Menu files (*.menu) Archivos de menú (*.menu) LXQtFancyMenuWindow Search... Buscar... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_es_VE.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Archivo de menú alterno Menu file: Keyboard Shortcut Tecla de acceso rapido Click the button to record shortcut: Pulsa en el boton para grabar el acceso rapido: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Seleccionar archivo de menú Menu files (*.menu) Archivos de menú (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_et.desktop.yaml ================================================ Desktop Entry/Name: "Rakenduste kaunismenüü" Desktop Entry/Comment: "Kõikide rakenduste menüü koos lemmikutega" ================================================ FILE: plugin-fancymenu/translations/fancymenu_et.ts ================================================ LXQtFancyMenu Show/hide main menu Näita või peida põhimenüü LXQtFancyMenuAppMapStrings Favorites Lemmikud All Applications Kõik rakendused LXQtFancyMenuConfiguration Fancy Menu Settings Kaunismenüü seadistused General Üldist Icon: Ikoon: Button text: Nupu tekst: Custom font size: Fondi suurus: pt pt Auto-select after: Vali automaatselt peale: ms ms Menu file Menüüfail Menu file: Faili asukoht: Keyboard Shortcut Kiirklahv Click the button to record shortcut: Kiirklahvi salvestamiseks klõpsi nuppu: Search Otsing Clear search upon showing menu Põhimenüü uuesti näitamisel kustuta otsingutulemused Layout Paigutus Buttons row position Nupurea asukoht Categories position Kategooriate asukoht Reset Lähtesta Bottom All Top Ülal Left Vasakul Right Paremal Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Muuda või lisa Waylandi kompositsiooniseadistustes otsetee valikule „lxqt-qdbus openmenu“ Choose icon file Vali ikooni fail Images (*.svg *.png) Pildid (*.svg *.png) Choose menu file Vali põhimenüü fail Menu files (*.menu) Menüüfailid (*.menu) LXQtFancyMenuWindow Search... Otsi... LXQt Configuration Center LXQt seadistuste haldus Leave Lahku About LXQt Teave LXQt kohta Add your favorites by right clicking items from categories. Parema hiireklõpsuga saad rakenduse lisada lemmikute hulka. Add to desktop Lisa töölauale Question Küsimus A file with the same name already exists. Do you want to overwrite it? Sellise nimega fail on juba olemas. Kas sa soovid seda üle kirjutada? Warning Hoiatus The file cannot be overwritten. Faili ülekirjutamine ei õnnestu. Copy Kopeeri Remove from Favorites Eemalda lemmikule hulgast Add to Favorites Lisa lemmikuks No Executable Pole käivitatav Cannot find <b>%1</b> executable. Ei leia käivitusfaili: <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_eu.desktop.yaml ================================================ Desktop Entry/Name: "Aplikazioen menu dotorea" Desktop Entry/Comment: "Zure aplikazio guztien menua gogokoekin" ================================================ FILE: plugin-fancymenu/translations/fancymenu_eu.ts ================================================ LXQtFancyMenu Show/hide main menu Erakutsi/ezkutatu menu nagusia LXQtFancyMenuAppMapStrings Favorites Gogokoak All Applications Aplikazio Guztiak LXQtFancyMenuConfiguration Fancy Menu Settings Menu dotoreen ezarpenak General Orokorra Icon: Ikonoa: Button text: Botoiaren testua: Custom font size: Letra tamaina pertsonalizatua: pt pt Auto-select after: Hautatu automatikoki ondoren: ms ms Menu file Menu fitxategia Menu file: Menu fitxategia: Keyboard Shortcut Teklatuko lasterbidea Click the button to record shortcut: Klikatu botoia lasterbidea grabatzeko: Search Bilatu Clear search upon showing menu Garbitu bilaketa menua erakustean Layout Diseinua Buttons row position Botoien errenkadaren posizioa Categories position Kategorien posizioa Reset Berrezarri Bottom Behean Top Goiena Left Ezkerra Right Eskuina Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Aukeratu ikono fitxategia Images (*.svg *.png) Irudiak (*.svg *.png) Choose menu file Aukeratu menu fitxategia Menu files (*.menu) Menu fitxategiak (*.menu) LXQtFancyMenuWindow Search... Bilatu... LXQt Configuration Center LXQt Konfigurazio Zentroa Leave Atera About LXQt LXQt-i buruz Add your favorites by right clicking items from categories. Gehitu gogokoenak kategorietako elementuen eskuineko botoiarekin klik eginez. Add to desktop Gehitu mahaigainean Question Galdera A file with the same name already exists. Do you want to overwrite it? Izen bereko fitxategi bat existitzen da dagoeneko. Gainidatzi nahi al duzu? Warning Abisua The file cannot be overwritten. Ezin da fitxategia gainidatzi. Copy Kopiatu Remove from Favorites Kendu Gogokoetatik Add to Favorites Gehitu Gogokoetara No Executable Ez Exekutagarri Cannot find <b>%1</b> executable. Ezin da <b>%1</b> exekutagarria aurkitu. ================================================ FILE: plugin-fancymenu/translations/fancymenu_fi.desktop.yaml ================================================ Desktop Entry/Name: "Hieno sovellusvalikko" Desktop Entry/Comment: "Valikko kaikista sovelluksistasi suosikkien kera" ================================================ FILE: plugin-fancymenu/translations/fancymenu_fi.ts ================================================ LXQtFancyMenu Show/hide main menu Näytä/piilota päävalikko LXQtFancyMenuAppMapStrings Favorites Suosikit All Applications Kaikki sovellukset LXQtFancyMenuConfiguration Fancy Menu Settings Hienon valikon asetukset General Yleiset Icon: Kuvake: Button text: Painikkeen teksti: Custom font size: Oma fonttikoko: pt pt Auto-select after: Automaattinen valinta viiveellä: ms ms Menu file Valikkotiedosto Menu file: Valikkotiedosto: Keyboard Shortcut Pikanäppäin Click the button to record shortcut: Napsauta painiketta nauhoittaaksesi pikanäppäimen: Search Haku Clear search upon showing menu Tyhjennä hakukenttä, kun päävalikko avataan Layout Asettelu Buttons row position Painikerivin sijainti Categories position Luokkien sijainti Reset Palauta Bottom Alhaalla Top Ylhäällä Left Vasemmalla Right Oikealla Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Valitse kuvake Images (*.svg *.png) Kuvat (*.svg *.png) Choose menu file Valitse valikkotiedosto Menu files (*.menu) Valikkotiedostot (*.menu) LXQtFancyMenuWindow Search... Etsi... LXQt Configuration Center LXQt:n asetuskeskus Leave Poistu About LXQt Tietoja LQXt:stä Add your favorites by right clicking items from categories. Lisää luokista suosikkeihisi hiiren oikealla. Add to desktop Lisää työpöydälle Question Kysymys A file with the same name already exists. Do you want to overwrite it? Samanniminen tiedosto on jo olemassa. Haluatko korvata sen? Warning Varoitus The file cannot be overwritten. Tiedostoa ei voida korvata. Copy Kopioi Remove from Favorites Poista suosikeista Add to Favorites Lisää suosikkeihin No Executable Ei ohjelmatiedosto(a) Cannot find <b>%1</b> executable. Ohjelmatiedostoa <b>%1</b> ei löydy. ================================================ FILE: plugin-fancymenu/translations/fancymenu_fr.desktop.yaml ================================================ Desktop Entry/Name: "Menu d'application fantaisie" Desktop Entry/Comment: "Un menu de toutes vos applications avec des favoris" ================================================ FILE: plugin-fancymenu/translations/fancymenu_fr.ts ================================================ LXQtFancyMenu Show/hide main menu Afficher/Cacher le menu principal LXQtFancyMenuAppMapStrings Favorites Favoris All Applications Toutes les Applications LXQtFancyMenuConfiguration Fancy Menu Settings Paramètres de Fancy Menu General Général Icon: Icône : Button text: Texte du bouton : Custom font size: Taille de police personnalisée : pt pt Auto-select after: Sélection auto après : ms ms Menu file Fichier du menu Menu file: Fichier du menu : Keyboard Shortcut Raccourci clavier Click the button to record shortcut: Cliquer sur le bouton pour enregistrer le raccourci : Search Recherche Clear search upon showing menu Remettre à zéro la recherche lors de l'affichage du menu Layout Disposition Buttons row position Position de la rangée de boutons Categories position Position des catégories Reset Réinitialiser Bottom Bas Top Haut Left Gauche Right Droite Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Choisir un fichier d'icône Images (*.svg *.png) Images (*.svg *.png) Choose menu file Choisir un fichier de menu Menu files (*.menu) Fichiers de menu (*.menu) LXQtFancyMenuWindow Search... Rechercher... LXQt Configuration Center Centre de configuration LXQt Leave Quitter About LXQt À propos de LXQt Add your favorites by right clicking items from categories. Ajoutez vos favoris avec un clic droit sur les éléments dans les catégories. Add to desktop Ajouter au bureau Question Question A file with the same name already exists. Do you want to overwrite it? Un fichier du même nom existe déjà. Voulez-vous l'écraser ? Warning Attention The file cannot be overwritten. Le fichier ne peut pas être écrasé. Copy Copier Remove from Favorites Retirer des favoris Add to Favorites Ajouter aux favoris No Executable Aucun exécutable Cannot find <b>%1</b> executable. Impossible de trouver l'exécutable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_gl.desktop.yaml ================================================ Desktop Entry/Name: "Menú de aplicacións elegante" Desktop Entry/Comment: "Un menú de todas as túas aplicacións con favoritos" ================================================ FILE: plugin-fancymenu/translations/fancymenu_gl.ts ================================================ LXQtFancyMenu Show/hide main menu Amosar/agochar o menú principal LXQtFancyMenuAppMapStrings Favorites Favoritos All Applications Todas as aplicacións LXQtFancyMenuConfiguration Fancy Menu Settings Configuración do menú elegante General Xeral Icon: Icona: Button text: Texto do botón: Custom font size: Tamaño personalizado da letra: pt pt Auto-select after: Selección automática despois de: ms ms Menu file Ficheiro do menú Menu file: Ficheiro de menú: Keyboard Shortcut Atallo de teclado Click the button to record shortcut: Prema o botón para rexistrar o atallo: Search Buscar Clear search upon showing menu Limpar a busca ao amosar o menú Layout Maquetación Buttons row position Posición da fila dos botóns Categories position Posición de categorías Reset Restabelecer Bottom Abaixo Top Arriba Left Esquerda Right Dereita Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Escoller o ficheiro da icona Images (*.svg *.png) Imaxes (*.svg *.png) Choose menu file Escoller o ficheiro de menú Menu files (*.menu) Ficheiros de menú (*.menu) LXQtFancyMenuWindow Search... Buscar... LXQt Configuration Center Centro de configuración LXQt Leave Saír About LXQt Acerca de LXQt Add your favorites by right clicking items from categories. Engade os teus favoritos facendo clic co botón dereito nos elementos das categorías. Add to desktop Engadir ao escritorio Question Pregunta A file with the same name already exists. Do you want to overwrite it? Xa existe un ficheiro co mesmo nome. Queres sobreescribilo? Warning Aviso The file cannot be overwritten. Non se pode sobrescribir o ficheiro. Copy Copiar Remove from Favorites Eliminar dos favoritos Add to Favorites Engadir a Favoritos No Executable Non Executable Cannot find <b>%1</b> executable. Non se pode atopar o executable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_he.desktop.yaml ================================================ Desktop Entry/Name: "תפריט יישומים מפואר" Desktop Entry/Comment: "תפריט לכל היישומים שלך עם מועדפים" ================================================ FILE: plugin-fancymenu/translations/fancymenu_he.ts ================================================ LXQtFancyMenu Show/hide main menu הצגת/הסתרת תפריט ראשי LXQtFancyMenuAppMapStrings Favorites מועדפים All Applications כל היישומים LXQtFancyMenuConfiguration Fancy Menu Settings הגדרות התפריט המפואר General כללי Icon: סמל: Button text: טקסט כפתור: Custom font size: גודל גופן מותאם: pt נק׳ Auto-select after: לבחור אוטומטית לאחר: ms מ״ש Menu file קובץ תפריט Menu file: קובץ תפריט: Keyboard Shortcut קיצור דרך של מקלדת Click the button to record shortcut: יש ללחוץ על הכפתור כדי להקליט קיצור דרך: Search חיפוש Clear search upon showing menu מחיקת החיפוש במהלך הצגת תפריט Layout פריסה Buttons row position מקום שורת כפתורים Categories position מקום קטגוריות Reset איפוס Bottom למטה Top למעלה Left משמאל Right מימין Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland אפשר לשנות או להוסיף קיצורי דרך ל־‚lxqt-qdbus openmenu’ בהגדרות הניהול החלונאי תחת Wayland Choose icon file בחירת קובץ סמל Images (*.svg *.png) תמונות ‎(*.svg *.png) Choose menu file בחירת קובץ תפריט Menu files (*.menu) קובצי תפריט ‎(*.menu) LXQtFancyMenuWindow Search... חיפוש… LXQt Configuration Center מרכז הגדרות LXQt Leave עזיבה About LXQt על LXQt Add your favorites by right clicking items from categories. אפשר להוסיף למועדפים שלך בלחיצה ימנית על פריטים מקטגוריות. Add to desktop הוספה לשולחן העבודה Question שאלה A file with the same name already exists. Do you want to overwrite it? כבר קיים קובץ בשם הזה. לשכתב אותו? Warning אזהרה The file cannot be overwritten. לא ניתן לשכתב את הקובץ. Copy העתקה Remove from Favorites הסרה מהמועדפים Add to Favorites הוספה למועדפים No Executable אין קובץ הפעלה Cannot find <b>%1</b> executable. לא ניתן למצוא את קובץ ההפעלה <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_hr.ts ================================================ LXQtFancyMenu Show/hide main menu Prikaži/sakrij glavni izbornik LXQtFancyMenuAppMapStrings Favorites Favoriti All Applications Sve aplikacije LXQtFancyMenuConfiguration Fancy Menu Settings Postavke elegantnog izbornika General Opće Icon: Ikona: Button text: Tekst gumba: Custom font size: Prilagođena veličina fonta: pt pt Auto-select after: Odaberi automatski nakon: ms ms Menu file Datoteka izbornika Menu file: Datoteka izbornika: Keyboard Shortcut Tipkovni prečac Click the button to record shortcut: Pritisni gumb za snimanje pračaca: Search Pretraga Clear search upon showing menu Ukloni pretragu pri prikazu izbornika Layout Raspored Buttons row position Položaj reda gumba Categories position Položaj kategorija Reset Resetiraj Bottom Dolje Top Gore Left Lijevo Right Desno Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Odaberi datoteku ikone Images (*.svg *.png) Slike (*.svg *.png) Choose menu file Odaberi datoteku izbornika Menu files (*.menu) Datoteke izbornika (*.menu) LXQtFancyMenuWindow Search... Traži … LXQt Configuration Center Centar LXQt konfiguracije Leave Napusti About LXQt O LXQt Add your favorites by right clicking items from categories. Dodaj svoje favorite klikom desne tipke miša na stavke iz kategorija. Add to desktop Dodaj na radnu površinu Question Pitanje A file with the same name already exists. Do you want to overwrite it? Datoteka s istim imenom već postoji. Želiš li je prepisati? Warning Upozorenje The file cannot be overwritten. Datoteka se ne može prepisati. Copy Kopiraj Remove from Favorites Ukloni iz favorita Add to Favorites Dodaj u favorite No Executable Nema izvršne datoteke Cannot find <b>%1</b> executable. Izvršna datoteka <b>%1</b> se ne može pronaći. ================================================ FILE: plugin-fancymenu/translations/fancymenu_hu.desktop.yaml ================================================ Desktop Entry/Name: "Díszes alkalmazásmenü" Desktop Entry/Comment: "Az összes alkalmazást tartalmazó menü kedvencekkel" ================================================ FILE: plugin-fancymenu/translations/fancymenu_hu.ts ================================================ LXQtFancyMenu Show/hide main menu Menü megjelenítése/elrejtése LXQtFancyMenuAppMapStrings Favorites Kedvencek All Applications Összes alkalmazás LXQtFancyMenuConfiguration Fancy Menu Settings A Díszes menü beállításai General Általános Icon: Ikon: Button text: Gombszöveg: Custom font size: Egyéni betűméret: pt pont Auto-select after: Automatikus kiválasztás ennyi idő után: ms ms Menu file Menüfájl Menu file: Menüfájl: Keyboard Shortcut Gyorsbillentyű Click the button to record shortcut: Gyorsbillentyű beállítása: Search Keresés Clear search upon showing menu Törölje a keresést a menü megjelenítésekor Layout Elrendezés Buttons row position Gombsor pozíciója Categories position Kategóriák pozíciója Reset Visszaállítás Bottom Alul Top Felül Left Bal Right Jobb Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Módosítsa vagy adja hozzá a 'lxqt-qdbus openmenu' gyorsbillentyűt a kompozitor beállításaiban Wayland alatt Choose icon file Ikon kiválasztása Images (*.svg *.png) Képek (*.svg *.png) Choose menu file Menüfájl kiválasztása Menu files (*.menu) Menüfájlok (*.menu) LXQtFancyMenuWindow Search... Keresés... LXQt Configuration Center LXQt Beállítóközpont Leave Kilépés About LXQt Az LXQt névjegye Add your favorites by right clicking items from categories. Kedvencek hozzáadása: kattintson jobb gombbal egy elemre a kategóriák közül. Add to desktop Hozzáadás asztalhoz Question Kérdés A file with the same name already exists. Do you want to overwrite it? Már létezik azonos nevű fájl. Felül szeretné írni? Warning Figyelmeztetés The file cannot be overwritten. A fájlt nem lehet felülírni. Copy Másolás Remove from Favorites Eltávolítás a Kedvencek közül Add to Favorites Hozzáadás a Kedvencekhez No Executable Nincs végrehajtható fájl Cannot find <b>%1</b> executable. Nem található a(z) <b>%1</b> végrehajtható fájl. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ia.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_id.ts ================================================ LXQtFancyMenu Show/hide main menu Tampilkan/sembunyikan menu utama LXQtFancyMenuAppMapStrings Favorites Favorit All Applications Semua Aplikasi LXQtFancyMenuConfiguration Fancy Menu Settings Pengaturan Menu Fancy General Umum Icon: Ikon: Button text: Teks tombol: Custom font size: Ukuran fonta kustom: pt pt Auto-select after: Pilih otomatis setelah: ms md Menu file Berkas menu Menu file: Berkas menu: Keyboard Shortcut Pintasan Keyboard Click the button to record shortcut: Klik tombol untuk merekam pintasan: Search Cari Clear search upon showing menu Bersihkan pencarian pada menu yang ditampilkan Layout Tata Letak Buttons row position Posisi baris tombol Categories position Posisi kategori Reset Atur ulang Bottom Bawah Top Atas Left Kiri Right Kanan Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Pilih berkas ikon Images (*.svg *.png) Gambar (*.svg *.png) Choose menu file Pilih berkas menu Menu files (*.menu) Berkas menu (*.menu) LXQtFancyMenuWindow Search... Cari... LXQt Configuration Center Pusat Konfigurasi LXQt Leave Tinggalkan About LXQt Tentang LXQt Add your favorites by right clicking items from categories. Tambahkan favorit Anda dengan klik kanan item dari kategori. Add to desktop Tambahkan ke desktop Question Pertanyaan A file with the same name already exists. Do you want to overwrite it? Berkas dengan nama yang sama sudah ada. Apakah Anda ingin menimpanya? Warning Peringatan The file cannot be overwritten. Berkas tidak dapat ditimpa. Copy Salin Remove from Favorites Hapus dari Favorit Add to Favorites Tambahkan ke Favorit No Executable Tidak Ada Berkas Eksekusi Cannot find <b>%1</b> executable. Tidak dapat menemukan berkas eksekusi <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_is.ts ================================================ LXQtFancyMenu Show/hide main menu Sýna/fela aðalvalmynd LXQtFancyMenuAppMapStrings Favorites Uppáhald All Applications Öll forrit LXQtFancyMenuConfiguration Fancy Menu Settings General Almennt Icon: Táknmynd: Button text: Texti á hnapp: Custom font size: Leturstærð: pt pt Auto-select after: Velja sjálfkrafa eftir: ms ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Leita Clear search upon showing menu Hreinsa leit þegar valmynd er sýnd Layout Útlit Buttons row position Categories position Reset Frumstilla Bottom Neðst Top Efst Left Vinstri Right Hægri Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_it.desktop.yaml ================================================ Desktop Entry/Name: "Menu delle applicazioni Fancy" Desktop Entry/Comment: "Un menu di tutte le applicazioni con preferiti" ================================================ FILE: plugin-fancymenu/translations/fancymenu_it.ts ================================================ LXQtFancyMenu Show/hide main menu Mostra/nascondi menu principale LXQtFancyMenuAppMapStrings Favorites Preferiti All Applications Tutte le applicazioni LXQtFancyMenuConfiguration Fancy Menu Settings Impostazioni Fancy menu General Generale Icon: Icona: Button text: Testo del pulsante: Custom font size: Dimensione personalizzata del carattere: pt Auto-select after: Selezione automatica dopo: ms ms Menu file File del menu Menu file: File del menu: Keyboard Shortcut Scorciatoia da tastiera Click the button to record shortcut: Fai clic sul pulsante per impostare una scorciatoia: Search Ricerca Clear search upon showing menu Cancella la ricerca quando viene visualizzato il menu Layout Disposizione Buttons row position Posizione della barra di pulsanti Categories position Posizione delle categorie Reset Ripristina Bottom In fondo Top In cima Left Sinistra Right Destra Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifica o aggiungi la scorciatoia per 'lxqt-qdbus openmenu' nelle impostazione del compositore sotto Wayland Choose icon file Seleziona file icona Images (*.svg *.png) File immagini (*.svg *.png) Choose menu file Selezione file del menu Menu files (*.menu) File di menu (*.menu) LXQtFancyMenuWindow Search... Cerca... LXQt Configuration Center Centro di configurazione LXQt Leave Esci About LXQt Informazioni su LXQt Add your favorites by right clicking items from categories. Aggiungi i tuoi preferiti da clic destro sugli elementi delle categorie. Add to desktop Aggiungi al desktop Question Domanda A file with the same name already exists. Do you want to overwrite it? Un file dello stesso nome esiste già. Sovrascriverlo? Warning Attenzione The file cannot be overwritten. Impossibile sovrascrivere il file. Copy Copia Remove from Favorites Rimuovi dai preferiti Add to Favorites Aggiungi ai preferiti No Executable Nessun eseguibile Cannot find <b>%1</b> executable. Impossible di trovare l'eseguibile <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ja.desktop.yaml ================================================ Desktop Entry/Name: "ファンシーアプリケーションメニュー" Desktop Entry/Comment: "お気に入りと全てのアプリケーションのメニューです" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ja.ts ================================================ LXQtFancyMenu Show/hide main menu アプリケーションメニューの表示/非表示 LXQtFancyMenuAppMapStrings Favorites お気に入り All Applications すべてのアプリケーション LXQtFancyMenuConfiguration Fancy Menu Settings ファンシーメニューの設定 General 全般 Icon: アイコン: Button text: ボタンの文字列: Custom font size: フォントサイズの指定: pt ポイント Auto-select after: 自動選択の待ち時間: ms ミリ秒 Menu file メニューファイル Menu file: メニューファイル: Keyboard Shortcut ショートカットキー Click the button to record shortcut: ショートカットを登録するにはボタンをクリックします: Search 検索 Clear search upon showing menu メニューを表示した時、検索フォームをクリアする Layout レイアウト Buttons row position ボタンの行位置 Categories position カテゴリの位置 Reset リセット Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland のコンポジター設定で「lxqt-qdbus openmenu」へのショートカットを変更または追加 Choose icon file アイコンファイルの選択 Images (*.svg *.png) 画像 (*.svg *.png) Choose menu file メニューファイルの選択 Menu files (*.menu) メニューファイル (*.menu) LXQtFancyMenuWindow Search... 検索... LXQt Configuration Center LXQt コンフィグレーションセンター Leave 離席 About LXQt LXQt について Add your favorites by right clicking items from categories. カテゴリの中から項目を右クリックでお気に入りに追加します。 Add to desktop デスクトップに追加 Question 質問 A file with the same name already exists. Do you want to overwrite it? 同じ名前のファイルが既に存在します。 上書きしますか? Warning 警告 The file cannot be overwritten. ファイルを上書き出来ません。 Copy コピー Remove from Favorites お気に入りから削除 Add to Favorites お気に入りに追加 No Executable 実行可能ファイルがありません Cannot find <b>%1</b> executable. 実行ファイル <b>%1</b> が見つかりません。 ================================================ FILE: plugin-fancymenu/translations/fancymenu_ka.desktop.yaml ================================================ Desktop Entry/Name: "ლამაზი აპლიკაციის მენიუ" Desktop Entry/Comment: "თქვენი ყველა აპლიკაციის მენიუ რჩეულების მხარდაჭერით" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ka.ts ================================================ LXQtFancyMenu Show/hide main menu მთავარი მენიუს ჩვენება/დამალვა LXQtFancyMenuAppMapStrings Favorites სანიშნეები All Applications ყველა აპლიკაცია LXQtFancyMenuConfiguration Fancy Menu Settings ლამაზი მენიუს მორგება General ზოგადი Icon: ხატულა: Button text: ღილაკის ტექსტი: Custom font size: მორგებული ფონტის ზომა: pt წრტ Auto-select after: ავტომონიშვნის დრო: ms მწმ Menu file მენიუს ფაილი Menu file: მენიუს ფაილი: Keyboard Shortcut კლავიატურის მალსახმობი Click the button to record shortcut: დააწკაპუნეთ ღილაკზე მალსახმობის ჩასაწერად: Search ძებნა Clear search upon showing menu ძებნის დახურვა მენიუს ჩვენებისას Layout განლაგება Buttons row position ღილაკის მწკრივის მდებარეობა Categories position კატეგორიების მდებარეობა Reset ჩამოყრა Bottom ქვემოთ Top ზემოთ Left მარცხნივ Right მარჯვნივ Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland დაამატეთ, ან შეცვალეთ მალსახმობი 'lxqt-qdbus openmenu'-ისთვის კომპოზიტორის მორგების ფანჯარაში Wayland-ში Choose icon file აირჩიეთ ხატულას ფაილი Images (*.svg *.png) გამოსახულებები (*.svg *.png) Choose menu file აირჩიეთ მენიუს ფაილი Menu files (*.menu) მენიუს ფაილები (*.menu) LXQtFancyMenuWindow Search... ძებნა... LXQt Configuration Center LXQt-ის მორგების ცენტრი Leave გასვლა About LXQt LXQt-ის შესახებ Add your favorites by right clicking items from categories. დაამატეთ თქვენი რჩეულები მათზე კატეგორიებში მარჯვენა წკაპით. Add to desktop სამუშაო მაგიდაზე დამატება Question კითხვა A file with the same name already exists. Do you want to overwrite it? ფაილი ამ სახელით უკვე არსებობს. გნებავთ, გადააწეროთ თავზე? Warning გაფრთხილება The file cannot be overwritten. ფაილის თავზე გადაწერა შეუძლებელია. Copy კოპირება Remove from Favorites რჩეულებიდან წაშლა Add to Favorites რჩეულებში დამატება No Executable გაშვებადი არაა Cannot find <b>%1</b> executable. გამშვები ფაილი <b>%1</b> აღმოჩენილი არაა. ================================================ FILE: plugin-fancymenu/translations/fancymenu_kk.ts ================================================ LXQtFancyMenu Show/hide main menu Басты мәзірді көрсету/жасыру LXQtFancyMenuAppMapStrings Favorites Таңдамалы All Applications Барлық қолданбалар LXQtFancyMenuConfiguration Fancy Menu Settings Сәнді мәзір баптаулары General Жалпы Icon: Таңбаша: Button text: Батырма мәтіні: Custom font size: Қаріп өлшемін таңдау: pt п Auto-select after: Автотаңдау, кейін: ms мс Menu file Мәзір файлы Menu file: Мәзір файлы: Keyboard Shortcut Пернетақта жарлығы Click the button to record shortcut: Пернетақта жарлығын жазып алу үшін батырманы басыңыз: Search Іздеу Clear search upon showing menu Мәзірді көрсеткен кезде іздеу өрісін тазарту Layout Жайма Buttons row position Батырмалардың қатарда орналасуы Categories position Санаттардың орналасуы Reset Тастау Bottom Төменде Top Жоғарыда Left Сол жақта Right Оң жақта Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland ортасындағы композитор баптауларында 'lxqt-qdbus openmenu' командасы үшін пернелер жарлығын қосу немесе өзгерту Choose icon file Таңбаша файлын таңдау Images (*.svg *.png) Суреттер (*.svg *.png) Choose menu file Мәзір файлын таңдау Menu files (*.menu) Мәзір файлдары (*.menu) LXQtFancyMenuWindow Search... Табу... LXQt Configuration Center LXQt баптаулар орталығы Leave Шығу About LXQt LXQt туралы Add your favorites by right clicking items from categories. Санатты тышқанның оң жағымен шерту оны таңдамалыларға қосады. Add to desktop Жұмыс үстеліне қосу Question Сұрақ A file with the same name already exists. Do you want to overwrite it? Осылай аталатын файл бар болып тұр. Оны үстінен жазу керек пе? Warning Ескерту The file cannot be overwritten. Файлды үстінен жазу мүмкін емес. Copy Көшіріп алу Remove from Favorites Таңдамалылардан өшіру Add to Favorites Таңдамалыларға қосу No Executable Орындалатын емес Cannot find <b>%1</b> executable. <b>%1</b> орындалатын файлы табылмады. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ko.desktop.yaml ================================================ Desktop Entry/Name: "고급 응용프로그램 메뉴" Desktop Entry/Comment: "즐겨찾기가 포함된 모든 응용프로그램의 메뉴" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ko.ts ================================================ LXQtFancyMenu Show/hide main menu 기본 메뉴 표시/숨김 LXQtFancyMenuAppMapStrings Favorites 즐겨찾기 All Applications 모든 응용프로그램 LXQtFancyMenuConfiguration Fancy Menu Settings 고급 메뉴 설정 General 일반 Icon: 아이콘: Button text: 버튼 텍스트: Custom font size: 사용자 지정 글꼴 크기: pt pt Auto-select after: 다음 이후 자동 선택: ms ms Menu file 메뉴 파일 Menu file: 메뉴 파일: Keyboard Shortcut 키보드 단축키 Click the button to record shortcut: 단축키를 기록하려면 버튼 클릭: Search 검색 Clear search upon showing menu 메뉴 표시 시 검색 지우기 Layout 레이아웃 Buttons row position 버튼 줄 위치 Categories position 범주 위치 Reset 재설정 Bottom 버튼 Top 상단 Left 좌측 Right 우측 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland의 컴포지터 설정에서 'lxqt-qdbus openmenu' 에 대한 바로가기를 수정하거나 추가하세요 Choose icon file 아이콘 파일 선택하기 Images (*.svg *.png) 이미지 (*.svg *.png) Choose menu file 메뉴 파일 선택하기 Menu files (*.menu) 메뉴 파일 (*.menu) LXQtFancyMenuWindow Search... 검색... LXQt Configuration Center LXQt 구성 센터 Leave 나가기 About LXQt LXQt 정보 Add your favorites by right clicking items from categories. 범주에서 항목을 마우스 오른쪽 버튼으로 클릭하여 즐겨찾기를 추가합니다. Add to desktop 바탕화면에 추가 Question 질문 A file with the same name already exists. Do you want to overwrite it? 같은 이름의 파일이 이미 있습니다. 덮어쓰시겠습니까? Warning 경고 The file cannot be overwritten. 파일을 덮어쓸 수 없습니다. Copy 복사 Remove from Favorites 즐겨찾기에서 제거하기 Add to Favorites 즐겨찾기에 추가하기 No Executable 실행파일 없음 Cannot find <b>%1</b> executable. <b>%1</b> 실행 파일을 찾을 수 없습니다. ================================================ FILE: plugin-fancymenu/translations/fancymenu_lg.desktop.yaml ================================================ Desktop Entry/Name: "Menyu eya puloguramu ey'ak'ensusso" Desktop Entry/Comment: "Menyu eno ekulaga puloguramu eziri ku sisitemu nga osobola\ \ okubaako ezimu z'oteeka w'on'oziraba mangu" ================================================ FILE: plugin-fancymenu/translations/fancymenu_lg.ts ================================================ LXQtFancyMenu Show/hide main menu Laga/kisa menyu eya bulijjo LXQtFancyMenuAppMapStrings Favorites By'ojjumbira All Applications Puloguramu zonna LXQtFancyMenuConfiguration Fancy Menu Settings Enteekateeka za menyu ey'ak'ensusso General Eby'awamu Icon: Kafaananyi: Button text: Ebigambo ebya ku ppeesa: Custom font size: Obunene bw'ennukuta: pt pt Auto-select after: Sisitemu eronde kino bwe wayitawo ebbanga lya: ms ms Menu file Fayiro omuva menyu Menu file: Fayiro omuva menyu: Keyboard Shortcut mapeesa agagonza emirimu Click the button to record shortcut: Nyiga ku mapeesa aganaagonzanga emirimu: Search Noonya Clear search upon showing menu Menyu olulabika olukalala lw'ebizuulidwa luveewo Layout Entegeka Buttons row position Amapeesa wegaba galabikira Categories position Ebiti webirabikira Reset Komyawo ebyasooka Bottom Wansi Top Waggulu Left Ku kkono Right Ku ddyo Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Kyusamu enyunzi oba kolawo empya mu 'lxqt-qdbus openmenu' ekisangibwa w'oteekateekera puloguramu ekwanaganya ebirabikira awakolerwa mu Wayland Choose icon file Londa fayiro ey'akafaananyi Images (*.svg *.png) Bifaananyi (*.svg *.png) Choose menu file Londa fayiro omuva menyu Menu files (*.menu) Fayiro ezirimu menyu (*.menu) LXQtFancyMenuWindow Search... Noonya... LXQt Configuration Center Entabiro y'enteekateeka eza LXQt Leave Mala About LXQt Ebifa ku LXQt Add your favorites by right clicking items from categories. Ky'olabye ku lukalala lw'ekiti okukiteeka ne ku lukalala lwa by'ojjumbira, kiteekeko akasonga onyige eppeesa ery'akasongesebwa erya ddyo. Add to desktop Teeka awakolerwa Question Kubuuza A file with the same name already exists. Do you want to overwrite it? Fayiro ey'erinnya eryo gy'eri. Oyagala okugigyawo ozewo eno? Warning Kulabula The file cannot be overwritten. Fayiro esobola okugyibwawo kuzzawo ndala. Copy Koppa Remove from Favorites Gigye mu by'ojjumbira Add to Favorites Gyongere ku by'ojjumbira No Executable Tewali puloguramu Cannot find <b>%1</b> executable. Puloguramu <b>%1</b> embuze. ================================================ FILE: plugin-fancymenu/translations/fancymenu_lt.desktop.yaml ================================================ Desktop Entry/Name: "Prašmatnus programų meniu" Desktop Entry/Comment: "Jūsų įprastų ir mėgstamų programų meniu" ================================================ FILE: plugin-fancymenu/translations/fancymenu_lt.ts ================================================ LXQtFancyMenu Show/hide main menu Rodyti/slėpti pagrindinį meniu LXQtFancyMenuAppMapStrings Favorites Mėgstamos All Applications Visos programos LXQtFancyMenuConfiguration Fancy Menu Settings Prašmatnaus meniu nustatymai General Bendra Icon: Piktograma: Button text: Mygtuko tekstas: Custom font size: Tinkintas šrifto dydis: pt taškų Auto-select after: Automatiškai pasirinkti po: ms ms Menu file Meniu failas Menu file: Meniu failas: Keyboard Shortcut Spartusis klavišas Click the button to record shortcut: Spustelėkite mygtuką, kad įrašytumėte spartųjį klavišą: Search Paieška Clear search upon showing menu Rodant meniu, išvalyti paiešką Layout Išdėstymas Buttons row position Mygtukų eilutės vieta Categories position Kategorijų vieta Reset Atstatyti Bottom Apačia Top Viršus Left Kairė Right Dešinė Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland „Wayland“ aplinkoje modifikuokite arba pridėkite spartųjį klavišą, skirtą „lxqt-qdbus openmenu“, naudodami tvarkytojo nustatymus Choose icon file Pasirinkite piktogramos failą Images (*.svg *.png) Paveikslai (*.svg *.png) Choose menu file Pasirinkite meniu failą Menu files (*.menu) Meniu failai (*.menu) LXQtFancyMenuWindow Search... Ieškoti... LXQt Configuration Center LXQt konfigūravimo centras Leave Išeiti About LXQt Apie LXQt Add your favorites by right clicking items from categories. Pridėkite mėgstamas programas spusteldami ant elementų kategorijose dešiniuoju pelės mygtuku. Add to desktop Pridėti į darbalaukį Question Klausimas A file with the same name already exists. Do you want to overwrite it? Failas tokiu pavadinimu jau yra. Ar norite jį perrašyti? Warning Įspėjimas The file cannot be overwritten. Failas negali būti perrašytas. Copy Kopijuoti Remove from Favorites Šalinti iš mėgstamų Add to Favorites Pridėti į mėgstamas No Executable Nėra vykdomojo Cannot find <b>%1</b> executable. Nepavyksta rasti <b>%1</b> vykdomojo. ================================================ FILE: plugin-fancymenu/translations/fancymenu_lv.ts ================================================ LXQtFancyMenu Show/hide main menu Rādīt/nerādīt galveno izvēlni LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Vispārīgie Icon: Ikona: Button text: Pogas teksts: Custom font size: Pielāgots šrifta izmērs: pt pnkt. Auto-select after: ms Menu file Izvēlnes fails Menu file: Izvēlnes fails: Keyboard Shortcut Tastatūras īsceļi Click the button to record shortcut: Nospiediet pogu, lai ierakstītu īsceļu: Search Meklēšana Clear search upon showing menu Notīrīt meklēšanas lauku, kad tiek rādīta izvēlne Layout Buttons row position Categories position Reset Atstatīt Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Izvēlēties ikonas failu Images (*.svg *.png) Attēli (*.svg *.png) Choose menu file Izvēlēties izvēlnes failu Menu files (*.menu) Izvēlnes faili (*.menu) LXQtFancyMenuWindow Search... Meklēt... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Likt uz darbvirsmas Question Jautājums A file with the same name already exists. Do you want to overwrite it? Fails ar šādu nosaukumu jau pastāv. Vēlaties tam pārrakstīt pa virsu? Warning Brīdinājums The file cannot be overwritten. Fails nevar tikt pārrakstīts (pa virsu). Copy Kopēt Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_nb_NO.ts ================================================ LXQtFancyMenu Show/hide main menu Vis eller skjul hovedmeny LXQtFancyMenuAppMapStrings Favorites Favoritter All Applications Alle programmer LXQtFancyMenuConfiguration Fancy Menu Settings General Generelt Icon: Ikon: Button text: Knapptekst: Custom font size: Selvvalgt skriftstørrelse: pt pt Auto-select after: ms Menu file Menyfil Menu file: Menyfil: Keyboard Shortcut Tastaturkommandoer Click the button to record shortcut: Klikk knappen for å registrere tastatursnarvei: Search Søk Clear search upon showing menu Fjern søk når meny vises Layout Buttons row position Categories position Reset Nullstill Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Velg ikonfil Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Velg menyfil Menu files (*.menu) Menyfiler (*.menu) LXQtFancyMenuWindow Search... Søk... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Legg til på skrivebordet Question Spørsmål A file with the same name already exists. Do you want to overwrite it? En fil ved samme navn finnes allerede. Ønsker du å overskrive den? Warning Advarsel The file cannot be overwritten. Filen kan ikke overskrives. Copy Kopier Remove from Favorites Fjern fra favoritter Add to Favorites Legg til i favoritter No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_nl.desktop.yaml ================================================ Desktop Entry/Name: "Stijlvol programmamenu" Desktop Entry/Comment: "Een menu met alle programma's en uw favorieten" ================================================ FILE: plugin-fancymenu/translations/fancymenu_nl.ts ================================================ LXQtFancyMenu Show/hide main menu Hoofdmenu tonen/verbergen LXQtFancyMenuAppMapStrings Favorites Favorieten All Applications Alle programma's LXQtFancyMenuConfiguration Fancy Menu Settings Fancy Menu-instellingen General Algemeen Icon: Pictogram: Button text: Knoptekst: Custom font size: Aangepaste tekstgrootte: pt pt Auto-select after: Automatisch kiezen na: ms ms Menu file Menubestand Menu file: Menubestand: Keyboard Shortcut Sneltoets Click the button to record shortcut: Klik op de knop om de sneltoets vast te leggen: Search Zoeken Clear search upon showing menu Leeg zoekveld tonen als het menu wordt geopend Layout Indeling Buttons row position Locatie van knoppenrij Categories position Locatie van categorieën Reset Standaardwaarden Bottom Onderaan Top Bovenaan Left Links Right Rechts Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Bewerk of voeg een snelkoppeling toe aan ‘lxqt-qdbus openmenu’ in de vensterbeheerinstellingen op Wayland Choose icon file Kies een pictogrambestand Images (*.svg *.png) Afbeeldingen (*.svg *.png) Choose menu file Kies een menubestand Menu files (*.menu) Menubestanden (*.menu) LXQtFancyMenuWindow Search... Zoeken… LXQt Configuration Center Instellingencentrum Leave Verlaten About LXQt Over LXQt Add your favorites by right clicking items from categories. Voeg items toe aan uw favorieten met behulp van het rechtermuisknopmenu. Add to desktop Op bureaublad plaatsen Question Vraag A file with the same name already exists. Do you want to overwrite it? Er is al een bestand met dezelfde naam. Wilt u dit overschrijven? Warning Waarschuwing The file cannot be overwritten. Dit bestand kan niet worden overschreven. Copy Kopiëren Remove from Favorites Verwijderen uit favorieten Add to Favorites Toevoegen aan favorieten No Executable Geen uitvoerbaar bestand Cannot find <b>%1</b> executable. Het uitvoerbare bestand <b>%1</b> is niet aangetroffen. ================================================ FILE: plugin-fancymenu/translations/fancymenu_oc.ts ================================================ LXQtFancyMenu Show/hide main menu Afichar/Amagar lo menú principal LXQtFancyMenuAppMapStrings Favorites Favorits All Applications Totas las aplicacions LXQtFancyMenuConfiguration Fancy Menu Settings Configuracion de menú elegant General General Icon: Icòna : Button text: Tèxt del boton : Custom font size: Talha de la poliça personalizada : pt pt Auto-select after: Seleccion auto aprèp : ms ms Menu file Fichièr de menú Menu file: Fichièr de menú : Keyboard Shortcut Acorchi de clavièr Click the button to record shortcut: Clicatz lo boton per enregistrar l’acorchi : Search Recercar Clear search upon showing menu Escafar la recèrca quand apareis lo menú Layout Agençament Buttons row position Posicion de la fila de botons Categories position Posicion de las categorias Reset Reïnicializar Bottom Bas Top Naut Left Esquèrra Right Drecha Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Causir un fichièr d’icòna Images (*.svg *.png) Imatges (*.svg *.png) Choose menu file Causir un fichièr de menú Menu files (*.menu) Fichièr de menú (*.menu) LXQtFancyMenuWindow Search... Cercar... LXQt Configuration Center Centre de configuracion de l’LXQt Leave Sortir About LXQt A prepaus de LXQt Add your favorites by right clicking items from categories. Ajustatz vòstres favorits en un clic suls elements dins las categorias. Add to desktop Apondre al burèu Question Question A file with the same name already exists. Do you want to overwrite it? Un fichièr amb aqueste nom existís ja. Lo volètz remplaçar ? Warning Avertiment The file cannot be overwritten. Lo fichièr pòt pas èsser remplaçat. Copy Copiar Remove from Favorites Tirar dels favorits Add to Favorites Apondre als favorits No Executable Non executable Cannot find <b>%1</b> executable. Impossibla de trobar l’executable <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਫੈਂਸੀ ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ" Desktop Entry/Comment: "ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਮਨਪਸੰਦ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦਾ ਮੇਨੂ ਹੈ" ================================================ FILE: plugin-fancymenu/translations/fancymenu_pa.ts ================================================ LXQtFancyMenu Show/hide main menu ਮੁੱਖ ਮੇਨੂ ਵੇਖਾਓ/ਓਹਲੇ ਕਰੋ LXQtFancyMenuAppMapStrings Favorites ਪਸੰਦੀਦਾ All Applications ਸਭ ਐਪਲੀਕੇਸ਼ਨਾਂ LXQtFancyMenuConfiguration Fancy Menu Settings ਫੈਂਸੀ ਮੇਨੂ ਸੈਟਿੰਗਾਂ General ਆਮ Icon: ਆਈਕਾਨ: Button text: ਬਟਨ ਲਿਖਤ: Custom font size: ਕਸਟਮ ਫ਼ੋਂਟ ਆਕਾਰ: pt ਪੁਆ. Auto-select after: ms Menu file ਮੇਨੂ ਫਾਇਲ Menu file: ਮੇਨੂ ਫਾਇਲ: Keyboard Shortcut ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ Click the button to record shortcut: ਸ਼ਾਰਟਕੱਟ ਰਿਕਾਰਡ ਕਰਨ ਦੌਰਾਨ ਬਟਨ ਨੂੰ ਕਲਿੱਕ ਕਰੋ: Search ਖੋਜੋ Clear search upon showing menu ਮੇਨੂ ਵੇਖਾਉਣ ਦੇ ਦੌਰਾਨ ਖੋਜ ਨੂੰ ਮਿਟਾਓ Layout ਖਾਕਾ Buttons row position ਬਟਨ ਕਤਾਰ ਸਥਿਤੀ Categories position ਕੈਟਗਰੀਆਂ ਦੀ ਸਥਿਤੀ Reset ਮੁੜ-ਸੈੱਟ ਕਰੋ Bottom ਹੇਠਾਂ Top ਉੱਤੇ Left ਖੱਬੇ Right ਸੱਜੇ Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file ਆਈਕਾਨ ਫਾਇਲ ਚੁਣੋ Images (*.svg *.png) ਚਿੱਤਰ (*.svg *.png) Choose menu file ਮੇਨੂ ਫਾਇਲ ਚੁਣੋ Menu files (*.menu) ਮੇਨੂ ਫਾਇਲਾਂ (*.menu) LXQtFancyMenuWindow Search... ਖੋਜੋ... LXQt Configuration Center LXQt ਸੰਰਚਨਾ ਸੈਂਟਰ Leave ਛੱਡੋ About LXQt LXQt ਬਾਰੇ Add your favorites by right clicking items from categories. Add to desktop ਡੈਸਕਟਾਪ ਵਿੱਚ ਜੋੜੋ Question ਸਵਾਲ A file with the same name already exists. Do you want to overwrite it? ਇਸੇ ਨਾਂ ਨਾਲ ਫਾਇਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂ ਦਹੈ। ਕੀ ਉਸ ਉੱਤੇ ਲਿਖਣਾ ਹੈ? Warning ਸਾਵਧਾਨ The file cannot be overwritten. ਫਾਇਲ ਉੱਤੇ ਲਿਖਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ। Copy ਕਾਪੀ ਕਰੋ Remove from Favorites ਪਸੰਦੀਦਾ ਵਿੱਚੋਂ ਹਟਾਓ Add to Favorites ਪਸੰਦੀਦਾ ਵਿੱਚ ਜੋੜੋ No Executable ਕੋਈ ਚੱਲਣਯੋਗ ਨਹੀਂ Cannot find <b>%1</b> executable. <b>%1</b> ਚੱਲਣਯੋਗ ਨੂੰ ਲੱਭਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ। ================================================ FILE: plugin-fancymenu/translations/fancymenu_pl.desktop.yaml ================================================ Desktop Entry/Name: "Wymyślne menu programów" Desktop Entry/Comment: "Menu wszystkich programów z ulubionymi" ================================================ FILE: plugin-fancymenu/translations/fancymenu_pl.ts ================================================ LXQtFancyMenu Show/hide main menu Pokaż/ukryj menu główne LXQtFancyMenuAppMapStrings Favorites Ulubione All Applications Wszystkie programy LXQtFancyMenuConfiguration Fancy Menu Settings Ustawienia wymyślnego menu General Ogólne Icon: Ikona: Button text: Tekst przycisku: Custom font size: Własny rozmiar czcionki: pt pt Auto-select after: Automatyczny wybór po: ms ms Menu file Plik menu Menu file: Plik menu: Keyboard Shortcut Skrót klawiaturowy Click the button to record shortcut: Wciśnij przycisk, aby ustawić skrót: Search Wyszukiwanie Clear search upon showing menu Wyczyść wyszukiwanie przed wyświetleniem menu Layout Układ Buttons row position Pozycja rzędu przycisków Categories position Pozycja kategorii Reset Zresetuj Bottom Dół Top Góra Left Lewo Right Prawo Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Zmodyfikuj lub dodaj skrót do „lxqt-qdbus openmenu” w ustawieniach kompozytora w Wayland Choose icon file Wybierz plik ikony Images (*.svg *.png) Obrazy (*.svg *.png) Choose menu file Wybierz plik menu Menu files (*.menu) Pliki menu (*.menu) LXQtFancyMenuWindow Search... Szukaj... LXQt Configuration Center Centrum konfiguracji LXQt Leave Opuść About LXQt Informacje o LXQt Add your favorites by right clicking items from categories. Dodaj swoje ulubione, klikając prawym przyciskiem myszy elementy z kategorii. Add to desktop Dodaj do pulpitu Question Pytanie A file with the same name already exists. Do you want to overwrite it? Plik o tej samej nazwie już istnieje. Czy chcesz go nadpisać? Warning Uwaga The file cannot be overwritten. Plik nie może zostać nadpisany. Copy Kopiuj Remove from Favorites Usuń z ulubionych Add to Favorites Dodaj do ulubionych No Executable Brak pliku wykonywalnego Cannot find <b>%1</b> executable. Nie można znaleźć pliku wykonywalnego <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_pt.desktop.yaml ================================================ Desktop Entry/Name: "Menu de aplicações elegante" Desktop Entry/Comment: "Um menu de todas as suas aplicações com favoritos" ================================================ FILE: plugin-fancymenu/translations/fancymenu_pt.ts ================================================ LXQtFancyMenu Show/hide main menu Mostrar/ocultar menu principal LXQtFancyMenuAppMapStrings Favorites Favoritos All Applications Todas as aplicações LXQtFancyMenuConfiguration Fancy Menu Settings Definições do menu General Geral Icon: Ícone: Button text: Texto do botão: Custom font size: Tipo de letra personalizado: pt pt Auto-select after: Seleção automática após: ms ms Menu file Ficheiro de menu Menu file: Ficheiro de menu: Keyboard Shortcut Tecla de atalho Click the button to record shortcut: Clique no botão para gravar o atalho: Search Pesquisar Clear search upon showing menu Limpar pesquisa ao mostrar o menu Layout Esquema Buttons row position Posição da linha de botões Categories position Posição das categorias Reset Repor Bottom Inferior Top Superior Left Esquerda Right Direita Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifique ou adicione um atalho a ‘lxqt-qdbus openmenu’ nas definições do compositor em Wayland Choose icon file Escolher ficheiro do ícone Images (*.svg *.png) Imagens (*.svg *.png) Choose menu file Escolher ficheiro do menu Menu files (*.menu) Ficheiros do menu (*.menu) LXQtFancyMenuWindow Search... Pesquisar... LXQt Configuration Center Centro de configuração do LXQt Leave Sair About LXQt Acerca do LXQt Add your favorites by right clicking items from categories. Adicione os seus favoritos clicando com o botão direito do rato nos itens das categorias. Add to desktop Adicionar ao ambiente de trabalho Question Questão A file with the same name already exists. Do you want to overwrite it? Já existe um ficheiro com este nome. Deseja substituir o ficheiro existente? Warning Aviso The file cannot be overwritten. Não foi possível substituir o ficheiro. Copy Copiar Remove from Favorites Remover dos favoritos Add to Favorites Adicionar aos favoritos No Executable Não executável Cannot find <b>%1</b> executable. Não foi possível encontrar o executável <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Menu de aplicativos sofisticado" Desktop Entry/Comment: "Um menu com todas os aplicativos e favoritos" ================================================ FILE: plugin-fancymenu/translations/fancymenu_pt_BR.ts ================================================ LXQtFancyMenu Show/hide main menu Exibir/ocultar o menu principal LXQtFancyMenuAppMapStrings Favorites Favoritos All Applications Todos os Aplicativos LXQtFancyMenuConfiguration Fancy Menu Settings Configurações do Fancy Menu General Geral Icon: Ícone: Button text: Texto do botão: Custom font size: Tamanho de fonte personalizado: pt pt Auto-select after: Selecionar automaticamente após: ms ms Menu file Arquivo de menu Menu file: Arquivo de menu: Keyboard Shortcut Atalho de teclado Click the button to record shortcut: Clique no botão para gravar o atalho: Search Pesquisar Clear search upon showing menu Limpar pesquisa ao mostrar o menu Layout Layout Buttons row position Posição da fileira de botões Categories position Posição das categorias Reset Redefinir Bottom De baixo Top De cima Left Esquerda Right Direita Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Escolher ícone Images (*.svg *.png) Imagens (*.svg *.png) Choose menu file Escolher arquivo de menu Menu files (*.menu) Arquivos de menu (*.menu) LXQtFancyMenuWindow Search... Pesquisar... LXQt Configuration Center Centro de Configuração do LXQt Leave Sair About LXQt Sobre o LXQt Add your favorites by right clicking items from categories. Adicione seus favoritos clicando com o botão direito do mouse nos itens das categorias. Add to desktop Adicionar à área de trabalho Question Questão A file with the same name already exists. Do you want to overwrite it? Já existe um arquivo com o mesmo nome. Você deseja sobrescrevê-lo? Warning Atenção The file cannot be overwritten. O arquivo não pode ser sobrescrito. Copy Copiar Remove from Favorites Remover dos Favoritos Add to Favorites Adicionar aos Favoritos No Executable Nenhum executável Cannot find <b>%1</b> executable. Não foi possível encontrar o executável <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ro_RO.ts ================================================ LXQtFancyMenu Show/hide main menu Afișează/Ascunde meniul principal LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General General Icon: Pictograma: Button text: Text pe butoane: Custom font size: Marime font particularizat: pt punct Auto-select after: ms Menu file Fișier meniu Menu file: Fisier meniu: Keyboard Shortcut Tastă rapidă Click the button to record shortcut: Apăsați butonul pentru a memora tasta rapidă: Search Cautare Clear search upon showing menu Șterge Căutarea când se afișează meniul Layout Buttons row position Categories position Reset Resetare Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Alege fisierul pictograma Images (*.svg *.png) Imagini (*.svg *.png) Choose menu file Selectați fișierul meniu Menu files (*.menu) Fișiere meniu (*.menu) LXQtFancyMenuWindow Search... Cautare ... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_ru.desktop.yaml ================================================ Desktop Entry/Name: "Модное меню приложений" Desktop Entry/Comment: "Меню всех ваших приложений с избранными" ================================================ FILE: plugin-fancymenu/translations/fancymenu_ru.ts ================================================ LXQtFancyMenu Show/hide main menu Показать/скрыть главное меню LXQtFancyMenuAppMapStrings Favorites Избранное All Applications Все приложения LXQtFancyMenuConfiguration Fancy Menu Settings Настройки модного меню General Общие Icon: Значок: Button text: Текст кнопки: Custom font size: Выбрать кегль: pt пт Auto-select after: Автовыбор после: ms мс Menu file Файл меню Menu file: Файл меню: Keyboard Shortcut Сочетание клавиш Click the button to record shortcut: Нажмите на кнопку для записи сочетания клавиш: Search Поиск Clear search upon showing menu Очищать поле поиска при показе меню Layout Разметка Buttons row position Расположение кнопок в ряду Categories position Расположение категорий Reset Сброс Bottom Внизу Top Сверху Left Слева Right Справа Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Измените или добавьте ярлык «lxqt-qdbus openmenu» в настройках композитора в Wayland Choose icon file Выберите файл значка Images (*.svg *.png) Изображения (*.svg *.png) Choose menu file Выбрать файл меню Menu files (*.menu) Файл меню (*.menu) LXQtFancyMenuWindow Search... Найти... LXQt Configuration Center Центр настройки LXQt Leave Выйти About LXQt О программе Add your favorites by right clicking items from categories. Нажатие правой кнопкой мыши по категории добавляет её в избранное. Add to desktop Добавить на рабочий стол Question Вопрос A file with the same name already exists. Do you want to overwrite it? Файл с тем же именем уже существует. Хотите перезаписать его? Warning Предупреждение The file cannot be overwritten. Файл не может быть перезаписан. Copy Копировать Remove from Favorites Убрать из Избранного Add to Favorites Добавить в Избранное No Executable Не исполняемый Cannot find <b>%1</b> executable. Исполняемый файл <b>%1</b> не найден. ================================================ FILE: plugin-fancymenu/translations/fancymenu_si.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sk.desktop.yaml ================================================ Desktop Entry/Name: "Menu aplikácii Fancy" Desktop Entry/Comment: "Menu všetkých vašich obľúbených aplikácii" ================================================ FILE: plugin-fancymenu/translations/fancymenu_sk_SK.ts ================================================ LXQtFancyMenu Show/hide main menu Zobraziť/skryť hlavné menu LXQtFancyMenuAppMapStrings Favorites Obľúbene All Applications Všetky aplikácie LXQtFancyMenuConfiguration Fancy Menu Settings Nastavenia pre elegantné menu General Všeobecné Icon: Ikona: Button text: Text tlačidla: Custom font size: Vlastná veľkosť písma: pt pt Auto-select after: Automatický výber po: ms ms Menu file Súbor menu Menu file: Súbor menu: Keyboard Shortcut Klávesová skratka Click the button to record shortcut: Kliknite na tlačidlo pre uloženie: Search Hľadať Clear search upon showing menu Po zobrazení menu vymazať históriu vyhľadávania Layout Rozloženie Buttons row position Pozícia riadku pre tlačidlá Categories position Pozícia kategórií Reset Vrátiť späť Bottom Dole Top Hore Left Vľavo Right Vpravo Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Vybrať súbor s ikonami Images (*.svg *.png) Obrázky (*.svg *.png) Choose menu file Vybrať súbor menu Menu files (*.menu) Súbory menu (*.menu) LXQtFancyMenuWindow Search... Hľadať... LXQt Configuration Center Centrum nastavení LXQt Leave Opustiť About LXQt O prostredí LXQt Add your favorites by right clicking items from categories. Pridajte svoje obľúbené položky kliknutím pravým tlačidlom myši na položky z kategórií. Add to desktop Pridať na plochu Question Otázka A file with the same name already exists. Do you want to overwrite it? Súbor s rovnakým názvom už existuje. Prajete si ho prepísať? Warning Upozornenie The file cannot be overwritten. Súbor nie je možné prepísať. Copy Kopírovať Remove from Favorites Odstrániť z obľúbených Add to Favorites Pridať k obľúbeným No Executable Žiadny spustiteľný súbor alebo program Cannot find <b>%1</b> executable. Neviem nájsť <b>%1</b> spustiteľný. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sl.ts ================================================ LXQtFancyMenu Show/hide main menu Prikaži/skrij glavni meni LXQtFancyMenuAppMapStrings Favorites Priljubljene All Applications Vsi programi LXQtFancyMenuConfiguration Fancy Menu Settings Nastavitve Fancy menija General Splošno Icon: Ikona: Button text: Besedilo gumba: Custom font size: Velikost pisave: pt pt Auto-select after: Samodejno izberi po: ms ms Menu file Datoteka z menijskimi vnosi Menu file: Lokacija datoteke: Keyboard Shortcut Tipkovna bližnjica Click the button to record shortcut: Kliknite gumb za nastavitev bližnjice: Search Iskanje Clear search upon showing menu Počisti iskanje ob vnovičnem odpiranju menija Layout Postavitev Buttons row position Lokacija vrstice z gumbi Categories position Lokacija kategorij Reset Ponastavi Bottom Spodaj Top Zgoraj Left Levo Right Desno Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Izberite ikono Images (*.svg *.png) Sličice (*.svg *.png) Choose menu file Izberite datoteko z menijem Menu files (*.menu) Menijske datoteke (*.menu) LXQtFancyMenuWindow Search... Išči... LXQt Configuration Center Nastavitveno središče za LXQt Leave Odjava About LXQt O LXQt Add your favorites by right clicking items from categories. Dodaj priljubljene z desnim klikom na predmete iz kategorij. Add to desktop Dodaj na namizje Question Vprašanje A file with the same name already exists. Do you want to overwrite it? Datoteka z istim imenom že obstaja. Ali jo želite prepisati? Warning Opozorilo The file cannot be overwritten. Datoteka ne more biti prepisana. Copy Kopiraj Remove from Favorites Odstrani iz priljubljenih Add to Favorites Dodaj med priljubljene No Executable Ni izvedljive datoteke Cannot find <b>%1</b> executable. Ni možno najti <b>%1</b> izvedljive datoteke. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sr@latin.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sr_BA.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Опште Icon: Button text: Custom font size: pt Auto-select after: ms Menu file Фајл менија Menu file: Keyboard Shortcut Пречица тастатуре Click the button to record shortcut: Кликните на тастер да снимите пречицу: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Изабери фајл менија Menu files (*.menu) Фајлови менија (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sr_RS.ts ================================================ LXQtFancyMenu Show/hide main menu Прикажи/сакриј мени LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General Опште Icon: Икона: Button text: Текст дугмета: Custom font size: Прилагођена величина фонта: pt pt Auto-select after: ms Menu file Фајл менија Menu file: Фајл менија: Keyboard Shortcut Пречица тастатуре Click the button to record shortcut: Кликните на дугме да снимите пречицу: Search Претражи Clear search upon showing menu Обриши претрагу по приказу менија Layout Buttons row position Categories position Reset Ресет Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Изабери икону фајла Images (*.svg *.png) Слике (*.svg *.png) Choose menu file Изабери фајл менија Menu files (*.menu) Фајлови менија (*.menu) LXQtFancyMenuWindow Search... Претражи... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Додај на десктоп Question Питање A file with the same name already exists. Do you want to overwrite it? Фајл са истим именом већ постоји. Желиш ли да га препишеш? Warning Упозорење The file cannot be overwritten. Овај фајл не може бити преписан. Copy Копирај Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_sv.desktop.yaml ================================================ Desktop Entry/Name: "Stilig programmeny" Desktop Entry/Comment: "En meny med alla dina program (inkl. favoriter)" ================================================ FILE: plugin-fancymenu/translations/fancymenu_sv.ts ================================================ LXQtFancyMenu Show/hide main menu Visa/dölj huvudmenyn LXQtFancyMenuAppMapStrings Favorites Favoriter All Applications Alla program LXQtFancyMenuConfiguration Fancy Menu Settings Inställningar för Fancy Menu General Allmänt Icon: Ikon: Button text: Knapptext: Custom font size: Anpassad teckenstorlek: pt pt Auto-select after: Välj automatiskt efter: ms ms Menu file Menyfil Menu file: Menyfil: Keyboard Shortcut Tangentbordsgenväg Click the button to record shortcut: Tryck på knappen för att registrera kortkommando: Search Sök Clear search upon showing menu Töm sökfältet när menyn öppnas Layout Layout Buttons row position Knappradens placering Categories position Kategoriernas placering Reset Återställ Bottom Under Top Över Left Vänster Right Höger Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifera eller lägg till en genväg till 'lxqt-qdbus openmenu' i compositor inställningarna under Wayland Choose icon file Välj en ikon Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Välj en menyfil Menu files (*.menu) Menyfiler (*.menu) LXQtFancyMenuWindow Search... Sök... LXQt Configuration Center Systeminställningar Leave Avsluta About LXQt Om LXQt Add your favorites by right clicking items from categories. Lägg till dina favoriter genom att högerklicka på objekt från kategorier. Add to desktop Lägg till på skrivbord Question Fråga A file with the same name already exists. Do you want to overwrite it? Det finns redan en fil med samma namn. Vill du ersätta den? Warning Varning The file cannot be overwritten. Filen kan inte överskrivas. Copy Kopiera Remove from Favorites Ta bort från favoriter Add to Favorites Lägg till i favoriter No Executable Ingen körbar fil Cannot find <b>%1</b> executable. Det går inte att hitta den körbara filen <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_th_TH.ts ================================================ LXQtFancyMenu Show/hide main menu LXQtFancyMenuAppMapStrings Favorites All Applications LXQtFancyMenuConfiguration Fancy Menu Settings General ทั่วไป Icon: Button text: Custom font size: pt Auto-select after: ms Menu file แฟ้มเมนู Menu file: Keyboard Shortcut ปุ่มลัด Click the button to record shortcut: กดปุ่มที่จะใช้เป็นปุ่มลัด: Search Clear search upon showing menu Layout Buttons row position Categories position Reset Bottom Top Left Right Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file เลือกแฟ้มเมนู Menu files (*.menu) แฟ้มเมนู (*.menu) LXQtFancyMenuWindow Search... LXQt Configuration Center Leave About LXQt Add your favorites by right clicking items from categories. Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Remove from Favorites Add to Favorites No Executable Cannot find <b>%1</b> executable. ================================================ FILE: plugin-fancymenu/translations/fancymenu_tr.desktop.yaml ================================================ Desktop Entry/Name: "Süslü Uygulama Menüsü" Desktop Entry/Comment: "Sık kullanılanlarla birlikte tüm uygulamalarınızın bir menüsü" ================================================ FILE: plugin-fancymenu/translations/fancymenu_tr.ts ================================================ LXQtFancyMenu Show/hide main menu Ana menüyü göster/gizle LXQtFancyMenuAppMapStrings Favorites Sık Kullanılanlar All Applications Tüm Uygulamalar LXQtFancyMenuConfiguration Fancy Menu Settings Fancy Menü ayarları General Genel Icon: Simge: Button text: Düğme metni: Custom font size: Özel yazıtipi boyutu: pt pt Auto-select after: Sonrasında otomatik seç: ms ms Menu file Menü dosyası Menu file: Menü dosyası: Keyboard Shortcut Klavye Kısayolu Click the button to record shortcut: Kısayolu kaydetmek için düğmeye tıklayın: Search Ara Clear search upon showing menu Menüyü gösterdikten sonra aramayı temizle Layout Düzen Buttons row position Düğmeler satır konumunda Categories position Kategoriler konumu Reset Sıfırla Bottom Alt Top Üst Left Sol Right Sağ Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland altındaki kompozitör ayarlarında 'lxqt-qdbus openmenu' kısayolunu değiştirin veya ekleyin Choose icon file Simge dosyasını seç Images (*.svg *.png) Resimler (*.svg *.png) Choose menu file Menü dosyası seç Menu files (*.menu) Menü dosyaları (*.menü) LXQtFancyMenuWindow Search... Ara... LXQt Configuration Center LXQt Yapılandırma Merkezi Leave Çık About LXQt LXQt Hakkında Add your favorites by right clicking items from categories. Kategorilerdeki ögelere sağ tıklayarak sık kullanılanlara ekleyin. Add to desktop Masaüstüne ekle Question Soru A file with the same name already exists. Do you want to overwrite it? Aynı isimde bir dosya zaten var. Üzerine yazmak ister misin? Warning Uyarı The file cannot be overwritten. Dosyanın üzerine yazılamaz. Copy Kopyala Remove from Favorites Sık Kullanılanlardan Kaldır Add to Favorites Sık Kullanılanlara Ekle No Executable Çalıştırılabilir Değil Cannot find <b>%1</b> executable. <b>%1</b> çalıştırılabilir dosyası bulunamıyor. ================================================ FILE: plugin-fancymenu/translations/fancymenu_uk.ts ================================================ LXQtFancyMenu Show/hide main menu Показати/сховати головне меню LXQtFancyMenuAppMapStrings Favorites Обране All Applications Усі застосунки LXQtFancyMenuConfiguration Fancy Menu Settings Меню налаштувань Fancy General Загальне Icon: Піктограма: Button text: Текст кнопки: Custom font size: Власний розмір шрифту: pt pt Auto-select after: Автовибір за: ms мс Menu file Файл меню Menu file: Файл меню: Keyboard Shortcut Клавіатурне скорочення Click the button to record shortcut: Натисніть кнопку, щоб змінити клавіатурне скорочення: Search Пошук Clear search upon showing menu Очищати пошук перед показом меню Layout Макет Buttons row position Розташування рядка кнопок Categories position Розташування категорій Reset Скинути Bottom Внизу Top Вгорі Left Ліворуч Right Праворуч Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Вибрати файл піктограми Images (*.svg *.png) Зображення (*.svg *.png) Choose menu file Оберіть файл меню Menu files (*.menu) Файли меню (*.menu) LXQtFancyMenuWindow Search... Пошук... LXQt Configuration Center Центр конфігурування LXQt Leave Залишити About LXQt Про LXQt Add your favorites by right clicking items from categories. Додайте обране, клацнувши правою кнопкою миші на елементи з категорій. Add to desktop Додати стільницю Question Питання A file with the same name already exists. Do you want to overwrite it? Файл з такою назвою вже існує. Хочете перезаписати його? Warning Попередження The file cannot be overwritten. Файл не можна перезаписати. Copy Копіювати Remove from Favorites Вилучити з обраного Add to Favorites Додати до обраного No Executable Не виконуваний Cannot find <b>%1</b> executable. Неможливо знайти виконуваний <b>%1</b>. ================================================ FILE: plugin-fancymenu/translations/fancymenu_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "高级应用程序菜单" Desktop Entry/Comment: "包含所有应用程序和收藏夹的菜单" ================================================ FILE: plugin-fancymenu/translations/fancymenu_zh_CN.ts ================================================ LXQtFancyMenu Show/hide main menu 显示/隐藏主菜单 LXQtFancyMenuAppMapStrings Favorites 喜爱 All Applications 全部应用 LXQtFancyMenuConfiguration Fancy Menu Settings 偏好目录设置 General 常规 Icon: 图标: Button text: 按钮文字: Custom font size: 自定义字体大小: pt 像素 Auto-select after: 在此行为后自动选择: ms 毫秒 Menu file 菜单文件 Menu file: 菜单文件: Keyboard Shortcut 键盘快捷键 Click the button to record shortcut: 按下键盘以设为快捷键: Search 搜索 Clear search upon showing menu 菜单出现后清除搜索框 Layout 布局 Buttons row position 按键排列位置 Categories position 目标类型 Reset 重置 Bottom 底部 Top 顶部 Left 左侧 Right 右侧 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file 选择图标文件 Images (*.svg *.png) 图像 (*.svg *.png) Choose menu file 选择菜单文件 Menu files (*.menu) 菜单文件 (*.menu) LXQtFancyMenuWindow Search... 搜索... LXQt Configuration Center LXQt设置中心 Leave 离开 About LXQt 关于LXQt Add your favorites by right clicking items from categories. 右键选项以加入喜爱。 Add to desktop 添加到桌面 Question 问题 A file with the same name already exists. Do you want to overwrite it? 已存在一个同名文件。 您想要覆盖它吗? Warning 警告 The file cannot be overwritten. 该文件无法被覆盖。 Copy 复制 Remove from Favorites 从喜爱中移除 Add to Favorites 加入喜爱 No Executable 非可执行文件 Cannot find <b>%1</b> executable. 找不到可执行文件<b>%1</b>。 ================================================ FILE: plugin-fancymenu/translations/fancymenu_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "華麗應用程式選單" Desktop Entry/Comment: "全部應用程式最愛項目的選單" ================================================ FILE: plugin-fancymenu/translations/fancymenu_zh_TW.ts ================================================ LXQtFancyMenu Show/hide main menu 顯示/隱藏 主選單 LXQtFancyMenuAppMapStrings Favorites 最愛項目 All Applications 全部應用程式 LXQtFancyMenuConfiguration Fancy Menu Settings Fancy 選單設定 General 通用 Icon: 圖示: Button text: 按鈕文字: Custom font size: 自訂字型大小: pt 像素 Auto-select after: 自動-選取 在其之後: ms 毫秒 Menu file 選單檔案 Menu file: 選單檔案: Keyboard Shortcut 快速鍵 Click the button to record shortcut: 點按按鈕並設定為快速鍵: Search 搜尋 Clear search upon showing menu 顯示選單時清除搜尋 Layout 配置型式 Buttons row position 按鍵橫列位置 Categories position 分類位置 Reset 重置 Bottom 下方 Top 上方 Left 左方 Right 右方 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland 修改或添加快速鍵至 'lxqt-qdbus openmenu' 在 Wayland 下的合成器設定中 Choose icon file 選擇圖示檔案 Images (*.svg *.png) 圖片 (*.svg *.png) Choose menu file 選擇選單檔案 Menu files (*.menu) 選單檔案 (*.menu) LXQtFancyMenuWindow Search... 搜尋... LXQt Configuration Center LXQt 設定中心 Leave 離開 About LXQt 關於 LXQt Add your favorites by right clicking items from categories. 從分類的項目用滑鼠右鍵點按來加入最愛項目。 Add to desktop 增加至桌面 Question 問題 A file with the same name already exists. Do you want to overwrite it? 已經有相同名稱的檔案。 確定要覆寫它嗎? Warning 警告 The file cannot be overwritten. 這個檔案無法被覆蓋。 Copy 複製 Remove from Favorites 從最愛項目中除移 Add to Favorites 加入至最愛項目 No Executable 無可執行 Cannot find <b>%1</b> executable. 查無 <b>%1</b> 可用執行。 ================================================ FILE: plugin-kbindicator/CMakeLists.txt ================================================ set(PLUGIN "kbindicator") set(HEADERS src/kbdstate.h src/settings.h src/content.h src/kbdlayout.h src/kbdinfo.h src/kbdkeeper.h src/kbdwatcher.h src/controls.h src/kbdstateconfig.h ) set(SOURCES kbindicator-plugin.cpp src/kbdstate.cpp src/settings.cpp src/content.cpp src/kbdkeeper.cpp src/kbdwatcher.cpp src/kbdstateconfig.cpp ) set(UIS src/kbdstateconfig.ui ) set(LIBRARIES ) find_package(XCB REQUIRED COMPONENTS XCB XKB) find_package(XKBCommon REQUIRED COMPONENTS XKBCommon X11) find_package(Qt6 ${QT_MINIMUM_VERSION} REQUIRED COMPONENTS Xml) include_directories(${XCB_INCLUDE_DIRS}) set(HEADERS ${HEADERS} src/x11/kbdlayout.h ) set(SOURCES ${SOURCES} src/x11/kbdlayout.cpp ) set(LIBRARIES ${LIBRARIES} ${XCB_LIBRARIES} XKBCommon::XKBCommon XKBCommon::X11 Qt6::Xml ) add_definitions(-DX11_ENABLED) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-kbindicator/kbindicator-plugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * 2007 Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include // For nativeInterface() #include "src/kbdstate.h" #include "../panel/ilxqtpanelplugin.h" class LXQtKbIndicatorPlugin: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ~LXQtKbIndicatorPlugin() override = default; ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const override { auto *x11Application = qGuiApp->nativeInterface(); if(!x11Application || !x11Application->connection()) { // Currently only X11 supported qWarning() << "Currently kbindicator plugin supports X11 only. Skipping."; return nullptr; } return new KbdState(startupInfo); } }; #include "kbindicator-plugin.moc" ================================================ FILE: plugin-kbindicator/resources/kbindicator.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=input-keyboard #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-kbindicator/src/content.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include #include #include "kbdstate.h" #include "content.h" Content::Content(bool layoutEnabled): QWidget(), m_layoutEnabled(layoutEnabled) { QBoxLayout *box = new QBoxLayout(QBoxLayout::LeftToRight); box->setContentsMargins(0, 0, 0, 0); box->setSpacing(0); setLayout(box); m_capsLock = new QLabel(tr("C", "Label for CapsLock indicator")); m_capsLock->setObjectName(QStringLiteral("CapsLockLabel")); m_capsLock->setAlignment(Qt::AlignCenter); m_capsLock->setToolTip(tr("CapsLock", "Tooltip for CapsLock indicator")); m_capsLock->installEventFilter(this); layout()->addWidget(m_capsLock); m_numLock = new QLabel(tr("N", "Label for NumLock indicator")); m_numLock->setObjectName(QStringLiteral("NumLockLabel")); m_numLock->setToolTip(tr("NumLock", "Tooltip for NumLock indicator")); m_numLock->setAlignment(Qt::AlignCenter); m_numLock->installEventFilter(this); layout()->addWidget(m_numLock); m_scrollLock = new QLabel(tr("S", "Label for ScrollLock indicator")); m_scrollLock->setObjectName(QStringLiteral("ScrollLockLabel")); m_scrollLock->setToolTip(tr("ScrollLock", "Tooltip for ScrollLock indicator")); m_scrollLock->setAlignment(Qt::AlignCenter); m_scrollLock->installEventFilter(this); layout()->addWidget(m_scrollLock); m_layout = new QToolButton; m_layout->setObjectName(QStringLiteral("LayoutLabel")); m_layout->setAutoRaise(true); connect(m_layout, &QAbstractButton::released, this, [this] { emit controlClicked(Controls::Layout); }); box->addWidget(m_layout, 0, Qt::AlignCenter); } Content::~Content() = default; bool Content::setup() { m_capsLock->setVisible(Settings::instance().showCapLock()); m_numLock->setVisible(Settings::instance().showNumLock()); m_scrollLock->setVisible(Settings::instance().showScrollLock()); m_layout->setVisible(m_layoutEnabled && Settings::instance().showLayout()); m_layoutFlagPattern = Settings::instance().layoutFlagPattern(); return true; } void Content::layoutChanged(const QString & sym, const QString & name, const QString & variant) { m_layout->setText(sym.toUpper()); QString flag_file; if (m_layoutFlagPattern.contains(QStringLiteral("%1"))) flag_file = m_layoutFlagPattern.arg(sym); if (flag_file.isEmpty() || !QFileInfo::exists(flag_file)) { m_layout->setToolButtonStyle(Qt::ToolButtonTextOnly); m_layout->setIcon({}); } else { m_layout->setIcon(QIcon{flag_file}); m_layout->setToolButtonStyle(m_layout->icon().pixmap(m_layout->iconSize()).isNull() ? Qt::ToolButtonTextOnly : Qt::ToolButtonIconOnly); } QString txt = QStringLiteral("\ \ \
%1: %3
%2: %4
").arg(tr("Layout")).arg(tr("Variant")).arg(name).arg(variant); m_layout->setToolTip(txt); } void Content::modifierStateChanged(Controls mod, bool active) { setEnabled(mod, active); } void Content::setEnabled(Controls cnt, bool enabled) { widget(cnt)->setEnabled(enabled); } QWidget* Content::widget(Controls cnt) const { switch(cnt){ case Caps: return m_capsLock; case Num: return m_numLock; case Scroll: return m_scrollLock; case Layout: return m_layout; } return nullptr; } bool Content::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::QEvent::MouseButtonRelease) { if (object == m_capsLock) emit controlClicked(Controls::Caps); else if (object == m_numLock) emit controlClicked(Controls::Num); else if (object == m_scrollLock) emit controlClicked(Controls::Scroll); } return QWidget::eventFilter(object, event); } void Content::showHorizontal() { qobject_cast(layout())->setDirection(QBoxLayout::LeftToRight); } void Content::showVertical() { qobject_cast(layout())->setDirection(QBoxLayout::TopToBottom); } ================================================ FILE: plugin-kbindicator/src/content.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _CONTENT_H_ #define _CONTENT_H_ #include #include "controls.h" class QLabel; class QToolButton; class Content : public QWidget { Q_OBJECT public: Content(bool layoutEnabled); ~Content(); public: void setEnabled(Controls cnt, bool enabled); QWidget* widget(Controls cnt) const; bool setup(); virtual bool eventFilter(QObject *object, QEvent *event); void showHorizontal(); void showVertical(); public slots: void layoutChanged(const QString & sym, const QString & name, const QString & variant); void modifierStateChanged(Controls mod, bool active); signals: void controlClicked(Controls cnt); private: bool m_layoutEnabled; QString m_layoutFlagPattern; QLabel *m_capsLock; QLabel *m_numLock; QLabel *m_scrollLock; QToolButton *m_layout; }; #endif ================================================ FILE: plugin-kbindicator/src/controls.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _CONTROLS_H_ #define _CONTROLS_H_ enum Controls { Caps, Num, Scroll, Layout }; #endif ================================================ FILE: plugin-kbindicator/src/kbdinfo.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KBDINFO_H_ #define _KBDINFO_H_ #include #include class KbdInfo { public: KbdInfo() {} struct Info { QString sym; QString name; QString variant; }; public: const QString & currentSym() const { return m_keyboardInfo[m_current].sym; } const QString & currentName() const { return m_keyboardInfo[m_current].name; } const QString & currentVariant() const { return m_keyboardInfo[m_current].variant; } int currentGroup() const { return m_current; } void setCurrentGroup(int group) { m_current = group; } uint size() const { return m_keyboardInfo.size(); } const Info & current() const { return m_keyboardInfo[m_current]; } void clear() { m_keyboardInfo.clear(); } void append(const Info & info) { m_keyboardInfo.append(info); } private: QList m_keyboardInfo; int m_current = 0; }; #endif ================================================ FILE: plugin-kbindicator/src/kbdkeeper.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include "kbdkeeper.h" //-------------------------------------------------------------------------------------------------- KbdKeeper::KbdKeeper(const KbdLayout & layout, KeeperType type): m_layout(layout), m_type(type) { m_layout.readKbdInfo(m_info); } KbdKeeper::~KbdKeeper() = default; bool KbdKeeper::setup() { connect(&m_layout, &KbdLayout::keyboardChanged, this, &KbdKeeper::keyboardChanged); connect(&m_layout, &KbdLayout::layoutChanged, this, &KbdKeeper::layoutChanged); connect(&m_layout, &KbdLayout::checkState, this, &KbdKeeper::checkState); return true; } void KbdKeeper::keyboardChanged() { m_layout.readKbdInfo(m_info); emit changed(); } void KbdKeeper::layoutChanged(uint group) { m_info.setCurrentGroup(group); emit changed(); } void KbdKeeper::checkState() {} void KbdKeeper::switchToNext() { uint index = m_info.currentGroup(); if (index < m_info.size() - 1) ++index; else index = 0; switchToGroup(index); } void KbdKeeper::switchToGroup(uint group) { m_layout.lockGroup(group); emit changed(); } //-------------------------------------------------------------------------------------------------- WinKbdKeeper::WinKbdKeeper(const KbdLayout & layout): KbdKeeper(layout, KeeperType::Window) {} WinKbdKeeper::~WinKbdKeeper() = default; void WinKbdKeeper::layoutChanged(uint group) { WId win = KX11Extras::activeWindow(); if (m_active == win){ m_mapping[win] = group; m_info.setCurrentGroup(group); } else { if (!m_mapping.contains(win)) m_mapping.insert(win, 0); m_layout.lockGroup(m_mapping[win]); m_active = win; m_info.setCurrentGroup(m_mapping[win]); } emit changed(); } void WinKbdKeeper::checkState() { WId win = KX11Extras::activeWindow(); if (!m_mapping.contains(win)) m_mapping.insert(win, 0); m_layout.lockGroup(m_mapping[win]); m_active = win; m_info.setCurrentGroup(m_mapping[win]); emit changed(); } void WinKbdKeeper::switchToGroup(uint group) { WId win = KX11Extras::activeWindow(); m_mapping[win] = group; m_layout.lockGroup(group); m_info.setCurrentGroup(group); emit changed(); } //-------------------------------------------------------------------------------------------------- AppKbdKeeper::AppKbdKeeper(const KbdLayout & layout): KbdKeeper(layout, KeeperType::Window) {} AppKbdKeeper::~AppKbdKeeper() = default; void AppKbdKeeper::layoutChanged(uint group) { KWindowInfo info = KWindowInfo(KX11Extras::activeWindow(), NET::Properties(), NET::WM2WindowClass); QString app = QString::fromUtf8(info.windowClassName()); if (m_active == app){ m_mapping[app] = group; m_info.setCurrentGroup(group); } else { if (!m_mapping.contains(app)) m_mapping.insert(app, 0); m_layout.lockGroup(m_mapping[app]); m_active = app; m_info.setCurrentGroup(m_mapping[app]); } emit changed(); } void AppKbdKeeper::checkState() { KWindowInfo info = KWindowInfo(KX11Extras::activeWindow(), NET::Properties(), NET::WM2WindowClass); QString app = QString::fromUtf8(info.windowClassName()); if (!m_mapping.contains(app)) m_mapping.insert(app, 0); m_layout.lockGroup(m_mapping[app]); m_active = app; m_info.setCurrentGroup(m_mapping[app]); emit changed(); } void AppKbdKeeper::switchToGroup(uint group) { KWindowInfo info = KWindowInfo(KX11Extras::activeWindow(), NET::Properties(), NET::WM2WindowClass); QString app = QString::fromUtf8(info.windowClassName()); m_mapping[app] = group; m_layout.lockGroup(group); m_info.setCurrentGroup(group); emit changed(); } ================================================ FILE: plugin-kbindicator/src/kbdkeeper.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KBDKEEPER_H_ #define _KBDKEEPER_H_ #include #include #include "kbdlayout.h" #include "kbdinfo.h" #include "settings.h" //-------------------------------------------------------------------------------------------------- class KbdKeeper: public QObject { Q_OBJECT public: KbdKeeper(const KbdLayout & layout, KeeperType type = KeeperType::Global); virtual ~KbdKeeper(); virtual bool setup(); const QString & sym() const { return m_info.currentSym(); } const QString & name() const { return m_info.currentName(); } const QString & variant() const { return m_info.currentVariant(); } KeeperType type() const { return m_type; } void switchToNext(); virtual void switchToGroup(uint group); protected slots: virtual void keyboardChanged(); virtual void layoutChanged(uint group); virtual void checkState(); signals: void changed(); protected: const KbdLayout & m_layout; KbdInfo m_info; KeeperType m_type; }; //-------------------------------------------------------------------------------------------------- class WinKbdKeeper: public KbdKeeper { Q_OBJECT public: WinKbdKeeper(const KbdLayout & layout); virtual ~WinKbdKeeper(); virtual void switchToGroup(uint group); protected slots: virtual void layoutChanged(uint group); virtual void checkState(); private: QHash m_mapping; WId m_active; }; //-------------------------------------------------------------------------------------------------- class AppKbdKeeper: public KbdKeeper { Q_OBJECT public: AppKbdKeeper(const KbdLayout & layout); virtual ~AppKbdKeeper(); virtual void switchToGroup(uint group); protected slots: virtual void layoutChanged(uint group); virtual void checkState(); private: QHash m_mapping; QString m_active; }; #endif ================================================ FILE: plugin-kbindicator/src/kbdlayout.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KBDLAYOUT_H_ #define _KBDLAYOUT_H_ #ifdef X11_ENABLED #include "x11/kbdlayout.h" typedef X11Kbd KbdLayout; #endif #endif ================================================ FILE: plugin-kbindicator/src/kbdstate.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include "kbdstate.h" #include "kbdkeeper.h" #include "kbdstateconfig.h" #include KbdState::KbdState(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), m_content(m_watcher.isLayoutEnabled()) { Settings::instance().init(settings()); connect(&m_content, &Content::controlClicked, &m_watcher, &KbdWatcher::controlClicked); connect(&m_watcher, &KbdWatcher::layoutChanged, &m_content, &Content::layoutChanged); connect(&m_watcher, &KbdWatcher::modifierStateChanged, &m_content, &Content::modifierStateChanged); settingsChanged(); } KbdState::~KbdState() = default; void KbdState::settingsChanged() { m_content.setup(); m_watcher.setup(); } QDialog *KbdState::configureDialog() { return new KbdStateConfig(&m_content); } void KbdState::realign() { if (panel()->isHorizontal()){ m_content.setMinimumSize(0, panel()->iconSize()); m_content.showHorizontal(); } else { m_content.setMinimumSize(panel()->iconSize(), 0); m_content.showVertical(); } } ================================================ FILE: plugin-kbindicator/src/kbdstate.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KDBSTATE_H_ #define _KDBSTATE_H_ #include "../panel/ilxqtpanelplugin.h" #include "settings.h" #include "content.h" #include "kbdwatcher.h" class QLabel; class KbdState : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: KbdState(const ILXQtPanelPluginStartupInfo &startupInfo); virtual ~KbdState(); virtual QString themeId() const { return QStringLiteral("KbIndicator"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } virtual bool isSeparate() const { return false; } virtual QWidget *widget() { return &m_content; } QDialog *configureDialog(); virtual void realign(); const Settings & prefs() const { return m_settings; } Settings & prefs() { return m_settings; } protected slots: virtual void settingsChanged(); private: Settings m_settings; KbdWatcher m_watcher; Content m_content; }; #endif ================================================ FILE: plugin-kbindicator/src/kbdstateconfig.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include "kbdstateconfig.h" #include "ui_kbdstateconfig.h" #include "settings.h" KbdStateConfig::KbdStateConfig(QWidget *parent) : QDialog(parent), m_ui(new Ui::KbdStateConfig) { setAttribute(Qt::WA_DeleteOnClose); m_ui->setupUi(this); connect(m_ui->showCaps, &QCheckBox::clicked, this, &KbdStateConfig::save); connect(m_ui->showNum, &QCheckBox::clicked, this, &KbdStateConfig::save); connect(m_ui->showScroll, &QCheckBox::clicked, this, &KbdStateConfig::save); connect(m_ui->showLayout, &QGroupBox::clicked, this, &KbdStateConfig::save); connect(m_ui->layoutFlagPattern, &QLineEdit::textEdited, this, &KbdStateConfig::save); connect(m_ui->modes, &QButtonGroup::buttonClicked, this, [this] { KbdStateConfig::save(); }); connect(m_ui->btns, &QDialogButtonBox::clicked, this, [this](QAbstractButton *btn){ if (m_ui->btns->buttonRole(btn) == QDialogButtonBox::ResetRole){ Settings::instance().restore(); load(); } }); connect(m_ui->configureLayouts, &QPushButton::clicked, this, &KbdStateConfig::configureLayouts); load(); } KbdStateConfig::~KbdStateConfig() { delete m_ui; } void KbdStateConfig::load() { Settings & sets = Settings::instance(); m_ui->showCaps->setChecked(sets.showCapLock()); m_ui->showNum->setChecked(sets.showNumLock()); m_ui->showScroll->setChecked(sets.showScrollLock()); m_ui->showLayout->setChecked(sets.showLayout()); m_ui->layoutFlagPattern->setText(sets.layoutFlagPattern()); switch(sets.keeperType()){ case KeeperType::Global: m_ui->switchGlobal->setChecked(true); break; case KeeperType::Window: m_ui->switchWindow->setChecked(true); break; case KeeperType::Application: m_ui->switchApplication->setChecked(true); break; } } void KbdStateConfig::save() { Settings & sets = Settings::instance(); sets.setShowCapLock(m_ui->showCaps->isChecked()); sets.setShowNumLock(m_ui->showNum->isChecked()); sets.setShowScrollLock(m_ui->showScroll->isChecked()); sets.setShowLayout(m_ui->showLayout->isChecked()); sets.setLayoutFlagPattern(m_ui->layoutFlagPattern->text()); if (m_ui->switchGlobal->isChecked()) sets.setKeeperType(KeeperType::Global); if (m_ui->switchWindow->isChecked()) sets.setKeeperType(KeeperType::Window); if (m_ui->switchApplication->isChecked()) sets.setKeeperType(KeeperType::Application); } void KbdStateConfig::configureLayouts() { QProcess::startDetached(QL1S("lxqt-config-input"), QStringList() << QL1S("--show-page") << QL1S("Keyboard Layout")); } ================================================ FILE: plugin-kbindicator/src/kbdstateconfig.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KBDSTATECONFIG_H_ #define _KBDSTATECONFIG_H_ #include namespace Ui { class KbdStateConfig; } class KbdStateConfig : public QDialog { Q_OBJECT public: explicit KbdStateConfig(QWidget *parent = nullptr); ~KbdStateConfig(); private: void save(); void load(); void configureLayouts(); private: Ui::KbdStateConfig *m_ui; }; #endif ================================================ FILE: plugin-kbindicator/src/kbdstateconfig.ui ================================================ KbdStateConfig 0 0 384 408 Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator true false Switching policy Global modes Window modes Application modes Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset btns accepted() KbdStateConfig accept() btns rejected() KbdStateConfig reject() ================================================ FILE: plugin-kbindicator/src/kbdwatcher.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "kbdwatcher.h" KbdWatcher::KbdWatcher() { connect(&m_layout, &KbdLayout::modifierChanged, this, &KbdWatcher::modifierStateChanged); m_layout.init(); } void KbdWatcher::setup() { emit modifierStateChanged(Controls::Caps, m_layout.isModifierLocked(Controls::Caps)); emit modifierStateChanged(Controls::Num, m_layout.isModifierLocked(Controls::Num)); emit modifierStateChanged(Controls::Scroll, m_layout.isModifierLocked(Controls::Scroll)); if (!m_keeper || m_keeper->type() != Settings::instance().keeperType()){ createKeeper(Settings::instance().keeperType()); } else { keeperChanged(); } } void KbdWatcher::createKeeper(KeeperType type) { switch(type) { case KeeperType::Global: m_keeper.reset(new KbdKeeper(m_layout)); break; case KeeperType::Window: m_keeper.reset(new WinKbdKeeper(m_layout)); break; case KeeperType::Application: m_keeper.reset(new AppKbdKeeper(m_layout)); break; } connect(m_keeper.get(), &KbdKeeper::changed, this, &KbdWatcher::keeperChanged); m_keeper->setup(); keeperChanged(); } void KbdWatcher::keeperChanged() { emit layoutChanged(m_keeper->sym(), m_keeper->name(), m_keeper->variant()); } void KbdWatcher::controlClicked(Controls cnt) { switch(cnt){ case Controls::Layout: m_keeper->switchToNext(); break; default: m_layout.lockModifier(cnt, !m_layout.isModifierLocked(cnt)); break; } } ================================================ FILE: plugin-kbindicator/src/kbdwatcher.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _KBDWATCHER_H_ #define _KBDWATCHER_H_ #include "kbdlayout.h" #include "controls.h" #include "kbdkeeper.h" class KbdKeeper; class KbdWatcher: public QObject { Q_OBJECT public: KbdWatcher(); void setup(); const KbdLayout & kbdLayout() const { return m_layout; } bool isLayoutEnabled() const { return m_layout.isEnabled(); } public slots: void controlClicked(Controls cnt); signals: void layoutChanged(const QString & sym, const QString & name, const QString & variant); void modifierStateChanged(Controls mod, bool active); private: void createKeeper(KeeperType type); private slots: void keeperChanged(); private: KbdLayout m_layout; std::unique_ptr m_keeper; }; #endif ================================================ FILE: plugin-kbindicator/src/settings.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "settings.h" Settings::Settings() = default; Settings &Settings::instance() { static Settings _instance; return _instance; } void Settings::init(PluginSettings *settings) { m_settings = settings; } bool Settings::showCapLock() const { return m_settings->value(QStringLiteral("show_caps_lock"), true).toBool(); } bool Settings::showNumLock() const { return m_settings->value(QStringLiteral("show_num_lock"), true).toBool(); } bool Settings::showScrollLock() const { return m_settings->value(QStringLiteral("show_scroll_lock"), true).toBool(); } bool Settings::showLayout() const { return m_settings->value(QStringLiteral("show_layout"), true).toBool(); } QString Settings::layoutFlagPattern() const { return m_settings->value(QStringLiteral("layout_flag_pattern")).toString(); } void Settings::setShowCapLock(bool show) { m_settings->setValue(QStringLiteral("show_caps_lock"), show); } void Settings::setShowNumLock(bool show) { m_settings->setValue(QStringLiteral("show_num_lock"), show); } void Settings::setShowScrollLock(bool show) { m_settings->setValue(QStringLiteral("show_scroll_lock"), show); } void Settings::setShowLayout(bool show) { m_settings->setValue(QStringLiteral("show_layout"), show); } void Settings::setLayoutFlagPattern(const QString & layoutFlagPattern) { m_settings->setValue(QStringLiteral("layout_flag_pattern"), layoutFlagPattern); } KeeperType Settings::keeperType() const { QString type = m_settings->value(QStringLiteral("keeper_type"), QStringLiteral("global")).toString(); if(type == QLatin1String("global")) return KeeperType::Global; if(type == QLatin1String("window")) return KeeperType::Window; if(type == QLatin1String("application")) return KeeperType::Application; return KeeperType::Application; } void Settings::setKeeperType(KeeperType type) const { switch (type) { case KeeperType::Global: m_settings->setValue(QStringLiteral("keeper_type"), QStringLiteral("global")); break; case KeeperType::Window: m_settings->setValue(QStringLiteral("keeper_type"), QStringLiteral("window")); break; case KeeperType::Application: m_settings->setValue(QStringLiteral("keeper_type"), QStringLiteral("application")); break; } } void Settings::restore() { m_settings->loadFromCache(); } ================================================ FILE: plugin-kbindicator/src/settings.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _SETTINGS_H_ #define _SETTINGS_H_ #include "../panel/pluginsettings.h" enum class KeeperType { Global, Window, Application }; class Settings { public: Settings(); static Settings &instance(); void init(PluginSettings *settings); public: bool showCapLock() const; bool showNumLock() const; bool showScrollLock() const; bool showLayout() const; QString layoutFlagPattern() const; KeeperType keeperType() const; void restore(); public: void setShowCapLock(bool show); void setShowNumLock(bool show); void setShowScrollLock(bool show); void setShowLayout(bool show); void setLayoutFlagPattern(const QString & layoutFlagPattern); void setKeeperType(KeeperType type) const; private: PluginSettings *m_settings{nullptr}; }; #endif ================================================ FILE: plugin-kbindicator/src/x11/kbdlayout.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include "kbdlayout.h" #include #include // Note: We need to override "explicit" as this is a C++ keyword. But it is // used as variable name in xkb.h. This is causing a failure in C++ compile // time. // Similar bug here: https://bugs.freedesktop.org/show_bug.cgi?id=74080 #define explicit _explicit #include #undef explicit #include "../kbdinfo.h" #include "../controls.h" namespace pimpl { struct LangInfo { QString name; QString syn; QString variant; }; class X11Kbd: public QAbstractNativeEventFilter { public: X11Kbd(::X11Kbd *pub): m_pub(pub) {} bool init() { m_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); m_connection = xcb_connect(nullptr, nullptr); if (!m_connection || xcb_connection_has_error(m_connection)){ qWarning() << "Couldn't connect to X server: error code" << (m_connection ? xcb_connection_has_error(m_connection) : -1); return false; } xkb_x11_setup_xkb_extension(m_connection, XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION, XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS, nullptr, nullptr, &m_eventType, nullptr ); m_deviceId = xkb_x11_get_core_keyboard_device_id(m_connection); qApp->installNativeEventFilter(this); readState(); return true; } ~X11Kbd() override { xkb_state_unref(m_state); xkb_keymap_unref(m_keymap); xcb_disconnect(m_connection); xkb_context_unref(m_context); } bool isEnabled() const { return true; } bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) override { if (eventType != "xcb_generic_event_t") return false; xcb_generic_event_t *event = static_cast(message); if ((event->response_type & ~0x80) == m_eventType){ xcb_xkb_state_notify_event_t *sevent = reinterpret_cast(event); switch(sevent->xkbType){ case XCB_XKB_STATE_NOTIFY: xkb_state_update_mask(m_state, sevent->baseMods, sevent->latchedMods, sevent->lockedMods, sevent->baseGroup, sevent->latchedGroup, sevent->lockedGroup ); if(sevent->changed & XCB_XKB_STATE_PART_GROUP_STATE){ emit m_pub->layoutChanged(sevent->group); return true; } if(sevent->changed & XCB_XKB_STATE_PART_MODIFIER_LOCK){ for(auto i = m_modifiers.cbegin() ; i != m_modifiers.cend(); ++i) { const auto& cnt = i.key(); bool oldState = m_modifiers[cnt]; bool newState = xkb_state_led_name_is_active(m_state, modName(cnt)); if(oldState != newState){ m_modifiers[cnt] = newState; emit m_pub->modifierChanged(cnt, newState); } } } break; case XCB_XKB_NEW_KEYBOARD_NOTIFY: readState(); break; } } emit m_pub->checkState(); return false; } void readKbdInfo(KbdInfo & info) const { info.clear(); xkb_layout_index_t count = xkb_keymap_num_layouts(m_keymap); for(xkb_layout_index_t i = 0; i < count; ++i){ QString name = QString::fromUtf8(xkb_keymap_layout_get_name(m_keymap, i)); const LangInfo & linfo = names(name); info.append({linfo.syn, linfo.name, linfo.variant}); if (xkb_state_layout_index_is_active(m_state, i, XKB_STATE_LAYOUT_EFFECTIVE)) info.setCurrentGroup(i); } } void lockGroup(uint group) { xcb_void_cookie_t cookie = xcb_xkb_latch_lock_state(m_connection, m_deviceId, 0, 0, 1, group, 0, 0, 0); xcb_generic_error_t *error = xcb_request_check(m_connection, cookie); if (error){ qWarning() << "Lock group error: " << error->error_code; } } void lockModifier(Controls cnt, bool locked) { quint8 mask = fetchMask(cnt); quint8 curMask = locked ? mask : 0; xcb_void_cookie_t cookie = xcb_xkb_latch_lock_state(m_connection, m_deviceId, mask, curMask, 0, 0, 0, 0, 0); xcb_generic_error_t *error = xcb_request_check(m_connection, cookie); if (error){ qWarning() << "Lock group error: " << error->error_code; } } bool isModifierLocked(Controls cnt) const { return m_modifiers[cnt]; } private: quint8 fetchMask(Controls cnt) const { static QHash masks; if (masks.contains(cnt)) return masks[cnt]; xkb_mod_index_t index = xkb_keymap_led_get_index(m_keymap, modName(cnt)); xcb_generic_error_t *error = nullptr; quint8 mask = 0; xcb_xkb_get_indicator_map_cookie_t cookie = xcb_xkb_get_indicator_map(m_connection, m_deviceId, 1 << index); xcb_xkb_get_indicator_map_reply_t *reply = xcb_xkb_get_indicator_map_reply(m_connection, cookie, &error); if (!reply || error){ qWarning() << "Cannot fetch mask " << error->error_code; return mask; } xcb_xkb_indicator_map_t *map = xcb_xkb_get_indicator_map_maps(reply); mask = map->mods; masks[cnt] = mask; free(reply); return mask; } const char * modName(Controls cnt) const { switch(cnt){ case Controls::Caps: return XKB_LED_NAME_CAPS; case Controls::Num: return XKB_LED_NAME_NUM; case Controls::Scroll: return XKB_LED_NAME_SCROLL; default: return nullptr; } } void readState() { if (m_keymap) xkb_keymap_unref(m_keymap); m_keymap = xkb_x11_keymap_new_from_device(m_context, m_connection, m_deviceId, (xkb_keymap_compile_flags)0); if (m_state) xkb_state_unref(m_state); m_state = xkb_x11_state_new_from_device(m_keymap, m_connection, m_deviceId); for(auto i = m_modifiers.cbegin(); i != m_modifiers.cend(); ++i) { m_modifiers[i.key()] = xkb_state_led_name_is_active(m_state, modName(i.key())); } emit m_pub->keyboardChanged(); } const LangInfo & names(const QString & langName) const { static LangInfo def{QStringLiteral("Unknown"), QStringLiteral("??"), QStringLiteral("None")}; static QHash names; if (names.empty()){ if(QFile::exists(QStringLiteral("/usr/share/X11/xkb/rules/evdev.xml"))){ QDomDocument doc; QFile file(QStringLiteral("/usr/share/X11/xkb/rules/evdev.xml")); if (file.open(QIODevice::ReadOnly)){ if (doc.setContent(&file)) { QDomElement docElem = doc.documentElement(); auto layout= docElem.firstChildElement(QStringLiteral("layoutList")); for(int i = 0; i < layout.childNodes().count(); ++i){ auto conf = layout.childNodes().at(i).firstChildElement(QStringLiteral("configItem")); names.insert( conf.firstChildElement(QStringLiteral("description")).firstChild().toText().data(), { conf.firstChildElement(QStringLiteral("description")).firstChild().toText().data(), conf.firstChildElement(QStringLiteral("name")).firstChild().toText().data(), QStringLiteral("None") } ); auto variants = layout.childNodes().at(i).firstChildElement(QStringLiteral("variantList")); for(int j = 0; j < variants.childNodes().count(); ++j){ auto var = variants.childNodes().at(j).firstChildElement(QStringLiteral("configItem")); names.insert( var.firstChildElement(QStringLiteral("description")).firstChild().toText().data(), { conf.firstChildElement(QStringLiteral("description")).firstChild().toText().data(), conf.firstChildElement(QStringLiteral("name")).firstChild().toText().data(), var.firstChildElement(QStringLiteral("name")).firstChild().toText().data() } ); } } } file.close(); } } } if (names.contains(langName)) return names[langName]; return def; } private: struct xkb_context *m_context = nullptr; xcb_connection_t *m_connection = nullptr; int32_t m_deviceId = 0; uint8_t m_eventType = 0; xkb_state *m_state = nullptr; xkb_keymap *m_keymap = nullptr; ::X11Kbd *m_pub; QHash m_modifiers = { {Controls::Caps, false}, {Controls::Num, false}, {Controls::Scroll, false}, }; }; } X11Kbd::X11Kbd(): m_priv(new pimpl::X11Kbd(this)) {} X11Kbd::~X11Kbd() = default; bool X11Kbd::init() { return m_priv->init(); } bool X11Kbd::isEnabled() const { return true; } void X11Kbd::readKbdInfo(KbdInfo & info) const { m_priv->readKbdInfo(info); } void X11Kbd::lockGroup(uint layId) const { m_priv->lockGroup(layId); } void X11Kbd::lockModifier(Controls cnt, bool locked) { m_priv->lockModifier(cnt, locked); } bool X11Kbd::isModifierLocked(Controls cnt) const { return m_priv->isModifierLocked(cnt); } ================================================ FILE: plugin-kbindicator/src/x11/kbdlayout.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Dmitriy Zhukov * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef _X11KBD_H_ #define _X11KBD_H_ #include #include "../controls.h" class KbdInfo; namespace pimpl { class X11Kbd; } class X11Kbd: public QObject { Q_OBJECT public: X11Kbd(); virtual ~X11Kbd(); bool init(); bool isEnabled() const; void readKbdInfo(KbdInfo & info) const; void lockGroup(uint layId) const; void lockModifier(Controls cnt, bool locked); bool isModifierLocked(Controls cnt) const; signals: void layoutChanged(uint layId); void modifierChanged(Controls cnt, bool locked); void checkState(); void keyboardChanged(); private: std::unique_ptr m_priv; }; #endif ================================================ FILE: plugin-kbindicator/translations/kbindicator.desktop.yaml ================================================ Desktop Entry/Name: "Keyboard State Indicator" Desktop Entry/Comment: "Keyboard state indicator and switcher plugin (X11 only)" ================================================ FILE: plugin-kbindicator/translations/kbindicator.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_ar.desktop.yaml ================================================ Desktop Entry/Name: "مؤشر حالة لوحة المفاتيح" Desktop Entry/Comment: "مؤشر حالة لوحة المفاتيح وتبديل اللغات (X11 فقط)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ar.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator قافل الحالة N Label for NumLock indicator N NumLock Tooltip for NumLock indicator قافل الأرقام S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator قافل التمرير Layout التخطيط Variant التنويعة KbdStateConfig Keyboard State Settings إعدادات حالة لوحة المفاتيح Lock Indicators مؤشّرات القفل Show Caps Lock اعرض قافل الحالة Show Num Lock اعرض قافل الأرقام Show Scroll Lock اعرض قافل التمرير Keyboard Layout Indicator مؤشّر تخطيط لوحة المفاتيح Switching policy سياسة التبديل Flags path pattern: نمط مسار الإشارات: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg نمط مسار الملف لأعلام الدول. يجب أن تحتوي على <strong>%1</strong> الذي يتم استبداله برمز الدولة ISO المكون من حرفين (الأحرف الصغيرة).<br><br>مثال: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts اضبط التخطيطات Global عمومي Window حسب النافذة Application حسب التطبيق ================================================ FILE: plugin-kbindicator/translations/kbindicator_arn.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_ast.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_bg.desktop.yaml ================================================ Desktop Entry/Name: "Индикатор на състоянието на клавиатурата" Desktop Entry/Comment: "Индикатор за състоянието на клавиатурата и плъгин за превключвател (само за X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_bg.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Подредба Variant Вариант KbdStateConfig Keyboard State Settings Настройки на клавиатурата Lock Indicators Индикатори на Lock Show Caps Lock Показване на Caps Lock Show Num Lock Показване на Num Lock Show Scroll Lock Показване на Scroll Lock Keyboard Layout Indicator Индикатор на подредбата Switching policy Политика на превключване Flags path pattern: Местоположение на флагове: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Местоположение на държавните флагове. Шаблонът трябва да съдържа <strong>%1</strong>, което се замества с ISO кода на държавата. <br><br>Например: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Настройване на подредбата Global Системно Window Прозорец Application Приложение ================================================ FILE: plugin-kbindicator/translations/kbindicator_ca.desktop.yaml ================================================ Desktop Entry/Name: "Indicador d'estat del teclat" Desktop Entry/Comment: "Indicador d'estat del teclat i connector del commutador (només X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ca.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Bloq Maj N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Bloq Núm S Label for ScrollLock indicator D ScrollLock Tooltip for ScrollLock indicator Bloq Despl Layout Disposició Variant Variant KbdStateConfig Keyboard State Settings Ajusts de l'estat del teclat Lock Indicators Indicadors de bloqueig Show Caps Lock Mostra el bloqueig de majúscules Show Num Lock Mostra el bloqueig de teclat numèric Show Scroll Lock Mostra el bloqueig de desplaçament Keyboard Layout Indicator Indicador de la disposició de teclat Switching policy Política d'intercanvi Flags path pattern: Patró del camí de les banderes: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Patró del camí del fitxer per a les banderes de països. Ha de contenir <strong>%1</strong>el qual és substituït pel codi ISO de dues lletres del país (en minúscules).<br><br>Exemple: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configura les disposicions Global Global Window Finestra Application Aplicació ================================================ FILE: plugin-kbindicator/translations/kbindicator_cs.desktop.yaml ================================================ Desktop Entry/Name: "Ukazatel klávesnice" Desktop Entry/Comment: "Přídavný modul zobrazující kontrolky klávesnice a pro změnu rozložení" ================================================ FILE: plugin-kbindicator/translations/kbindicator_cs.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Psaní velkými písmeny (CapsLock) N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Zamknutí číselné klávesnice (NumLock) S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Zamknutí posunování obrazu (ScrollLock) Layout Rozvržení Variant Varianta KbdStateConfig Keyboard State Settings Nastavení pro stav klávesnice Lock Indicators Kontrolky zámků Show Caps Lock Ukazovat CapsLock Show Num Lock Ukazovat NumLock Show Scroll Lock Ukazovat ScrollLock Keyboard Layout Indicator Ukazovat rozvržení klávesnice Switching policy Dosah přepínání Flags path pattern: Vzor popisu umístění vlajek: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Vzor popisu umístění vlajek zemí. Je třeba, aby obsahoval <strong>%1</strong>, což je nahrazeno dvěma písmeny ISO kódu země (malá písmena).<br><br>Příklad: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Nastavit rozvržení Global Pro všechno Window Pro stávající okno Application Pro stávající aplikaci ================================================ FILE: plugin-kbindicator/translations/kbindicator_cy.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_da.desktop.yaml ================================================ Desktop Entry/Name: "Tastaturtilstand-indikator" Desktop Entry/Comment: "Tastaturtilstand indikator- og skifte-udvidelsesmodul" ================================================ FILE: plugin-kbindicator/translations/kbindicator_da.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Layout Variant Variant KbdStateConfig Keyboard State Settings Indstillinger for tastaturtilstand Lock Indicators Lås-indikatorer Show Caps Lock Vis Caps Lock Show Num Lock Vis Num Lock Show Scroll Lock Vis Scroll Lock Keyboard Layout Indicator Indikator for tastaturlayout Switching policy Skifter politik Flags path pattern: Stimønster for flag: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Filstimønster til sprogflag. Skal indeholde <strong>%1</strong> som erstattes af ISO-sprogkoden på 2 bogstaver (med småt).<br><br>Eksempel: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Indstil layouts Global Global Window Vindue Application Program ================================================ FILE: plugin-kbindicator/translations/kbindicator_de.desktop.yaml ================================================ Desktop Entry/Name: "Tastatur-LED-Anzeige" Desktop Entry/Comment: "Plugin zum Anzeigen der Tastatur-LEDs und Umschalten des Layouts (nur X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_de.ts ================================================ Content C Label for CapsLock indicator This capital letter is printed on my keyboard. C CapsLock Tooltip for CapsLock indicator Feststelltaste N Label for NumLock indicator This digit is printed on my keyboard. N NumLock Tooltip for NumLock indicator Num-Taste S Label for ScrollLock indicator From the word "Rollen". S ScrollLock Tooltip for ScrollLock indicator Rollen-Taste Layout Belegung Variant Variante KbdStateConfig Keyboard State Settings Tastaturstatuseinstellungen Lock Indicators Schalteranzeigen Show Caps Lock Feststelltaste anzeigen Show Num Lock Num-Taste anzeigen Show Scroll Lock Rollen-Taste anzeigen Keyboard Layout Indicator Tastaturbelegungsindikator Switching policy Umschaltregelung Flags path pattern: Muster für Flaggendateipfad: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Dateipfad für Länderflaggen. Muss <strong>%1</strong> enthalten, das mit dem ISO-Ländercode (in Kleinbuchstaben) ersetzt wird.<br><br>Beispiel: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Belegungen konfigurieren Global Global Window Fenster Application Anwendung ================================================ FILE: plugin-kbindicator/translations/kbindicator_el.desktop.yaml ================================================ Desktop Entry/Name: "Ένδειξη κατάστασης πληκτρολογίου" Desktop Entry/Comment: "Πρόσθετο ένδειξης της κατάστασης του πληκτρολογίου και εναλλαγής (μόνο X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_el.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Διάταξη Variant Παραλλαγή KbdStateConfig Show Caps Lock Εμφάνιση του κλειδώματος κεφαλαίων Show Num Lock Εμφάνιση του κλειδώματος του αριθμητικού πληκτρολογίου Show Scroll Lock Εμφάνιση του κλειδώματος της κύλισης Keyboard State Settings Ρυθμίσεις κατάστασης του πληκτρολογίου Lock Indicators Δείκτες κλειδώματος Keyboard Layout Indicator Δείκτης διάταξης του πληκτρολογίου Switching policy Πολιτική εναλλαγής Global Καθολικό Window Παράθυρο Application Εφαρμογή Flags path pattern: Σχηματομορφή διαδρομής σημαιών: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Σχηματομορφή διαδρομής αρχείου για της σημαίες χωρών. Πρέπει να περιέχει το <strong>%1</strong> το οποίο θα αντικατασταθεί από τα δυο γράμματα του κωδικού ISO της χώρας (πεζά).<br><br>Παράδειγμα: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Διαμόρφωση των διατάξεων ================================================ FILE: plugin-kbindicator/translations/kbindicator_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Keyboard State Indicator" Desktop Entry/Comment: "Keyboard state indicator and switcher plugin (X11 only)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_en_GB.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Layout Variant Variant KbdStateConfig Keyboard State Settings Keyboard State Settings Lock Indicators Lock Indicators Show Caps Lock Show Caps Lock Show Num Lock Show Num Lock Show Scroll Lock Show Scroll Lock Keyboard Layout Indicator Keyboard Layout Indicator Switching policy Switching policy Flags path pattern: Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configure layouts Global Global Window Window Application Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_es.desktop.yaml ================================================ Desktop Entry/Name: "Indicador de estado del teclado" Desktop Entry/Comment: "Complemento para mostrar y cambiar de estado del teclado" ================================================ FILE: plugin-kbindicator/translations/kbindicator_es.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Bloqueo de mayúsculas N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Bloqueo numérico S Label for ScrollLock indicator D ScrollLock Tooltip for ScrollLock indicator Bloqueo de desplazamiento Layout Distribución Variant Variante KbdStateConfig Keyboard State Settings Configuración del estado del teclado Lock Indicators Bloquear los indicadores Show Caps Lock Mostrar el bloqueo de mayúsculas Show Num Lock Mostrar el bloqueo numérico Show Scroll Lock Mostrar el bloqueo de desplazamiento Keyboard Layout Indicator Indicador de la distribución del teclado Switching policy Política de intercambio Flags path pattern: Patrón de la ruta de las banderas: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Patrón de la ruta de las banderas de países. Debe contener <strong>%1</strong>, que será sustituido por el código ISO de dos letras del país (en minúsculas).<br><br>Ejemplo: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configurar las distribuciones Global Global Window Ventana Application Aplicación ================================================ FILE: plugin-kbindicator/translations/kbindicator_et.desktop.yaml ================================================ Desktop Entry/Name: "Klaviatuuri olek" Desktop Entry/Comment: "Klaviatuuri oleku näitaja ning paigutuste vahetaja (vaid X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_et.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock ehk suurtähelukk N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock ehk numbrilukk S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock ehk kerimislukk Layout Paigutus Variant Alamvariant KbdStateConfig Keyboard State Settings Klaviatuuri oleku seadistused Lock Indicators Lukuklahvide oleku näidikud Show Caps Lock Näita CapsLock klahvi ehk suurtähelukku olekut Show Num Lock Näita NumLock klahvi ehk numbriluku olekut Show Scroll Lock Näita ScrollLock klahvi ehk kerimisluku olekut Keyboard Layout Indicator Näita klaviatuuripaigutuse tunnust Switching policy Klaviatuuripaigutuste vahetamise reeglid Flags path pattern: Lipufailide asukohad: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Failide asukoha muster. Peab sisaldama <strong>%1</strong>, mis asendatakse ISO 3166-1 alpha-2 riigikoodiga (kahetäheline kood väiketähtedes).<br><br>Näiteks: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Seadista klaviatuuripaigutusi Global Üldised Window Aknakohased Application Rakenduse kohased ================================================ FILE: plugin-kbindicator/translations/kbindicator_fi.desktop.yaml ================================================ Desktop Entry/Name: "Näppäimistön tilan ilmaisin" Desktop Entry/Comment: "Näppäimistön tilan ilmaisin/vaihtaja (vain X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_fi.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Asettelu Variant Variaatio KbdStateConfig Keyboard State Settings Näppäimistön tila-asetukset Lock Indicators Lukkoilmaisimet Show Caps Lock Näytä Caps Lock Show Num Lock Näytä Num Lock Show Scroll Lock Näytä Scroll Lock Keyboard Layout Indicator Näppäimistön asetteluilmaisin Switching policy Vaihtokäytäntö Flags path pattern: Lippujen polkukuvio: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Kuvio maiden lippujen tiedostopolulle. Täytyy sisältää <strong>%1</strong>, joka korvataan kaksikirjaimisella ISO-maakoodilla (pienet kirjaimet).<br><br>Esimerkki: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Määritä asettelut Global Järjestelmänlaajuinen Window Ikkunakohtainen Application Sovelluskohtainen ================================================ FILE: plugin-kbindicator/translations/kbindicator_fr.desktop.yaml ================================================ Desktop Entry/Name: "Indicateur d’état du clavier" Desktop Entry/Comment: "Plugin d’indicateur et de changement d’état du clavier (X11 uniquement)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_fr.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Verr Maj N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Verr Num S Label for ScrollLock indicator D ScrollLock Tooltip for ScrollLock indicator Verr Défil Layout Disposition Variant Variant KbdStateConfig Keyboard State Settings Paramétrage de l'état du clavier Lock Indicators Indicateurs de verrouillage Show Caps Lock Allumer Verr Maj Show Num Lock Allumer Ver Num Show Scroll Lock Allumer Verr Défil Keyboard Layout Indicator Indicateur de la disposition du clavier Switching policy Changement de règles Global Global Window Fenêtre Application Application Flags path pattern: Modèle de chemin vers les drapeaux : File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Modèle de chemin de fichier pour les drapeaux de pays. Doit contenir <strong>%1</strong> qui est remplacé par le code de pays ISO à deux lettres (minuscules). <br><br> Exemple : /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configurer les dispositions ================================================ FILE: plugin-kbindicator/translations/kbindicator_gl.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Bloq Maiús N Label for NumLock indicator NumLock Tooltip for NumLock indicator Bloq Núm S Label for ScrollLock indicator D ScrollLock Tooltip for ScrollLock indicator Bloq Despr Layout Disposición Variant Variante KbdStateConfig Keyboard State Settings Axustes do estado do teclado Lock Indicators Indicadores de bloqueo Show Caps Lock Amosar o bloqueo de maiúsculas Show Num Lock Amosar o bloqueo do teclado numérico Show Scroll Lock Amosar o bloqueo do desprazamento Keyboard Layout Indicator Indicador da disposición do teclado Switching policy Política de intercambio Flags path pattern: Patrón do camiño das bandeiras: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configurar as disposicións Global Window Xanela Application Aplicación ================================================ FILE: plugin-kbindicator/translations/kbindicator_he.desktop.yaml ================================================ Desktop Entry/Name: "מחוון מצב מקלדת" Desktop Entry/Comment: "תוסף מחוון מצב המקלדת ומחליף מצבים (X11 בלבד)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_he.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout פריסה Variant הגוון KbdStateConfig Keyboard State Settings הגדרות מצב מקלדת Lock Indicators מחווני נעילה Show Caps Lock הצגת Caps Lock Show Num Lock הצגת Num Lock Show Scroll Lock הצגת Scroll Lock Keyboard Layout Indicator מחוון פריסות מקלדת Switching policy מדיניות החלפה Flags path pattern: תבנית נתיבי דגלים: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg תבנית נתיבי קבצים לדגלי מדינות. חייב להכיל <strong>%1</strong> שיוחלף בקוד של שתי אותיות (קטנות) מתקן ISO לייצוג המדינה.<br><br>למשל: ‎/usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts הגדרת פריסות Global גלובלי Window חלון Application יישום ================================================ FILE: plugin-kbindicator/translations/kbindicator_hr.desktop.yaml ================================================ Desktop Entry/Name: "Indikator stanja tipkovnice" Desktop Entry/Comment: "Priključak za indikatora stanja tipkovnice i za prebacivanje između rasporeda tipkovnice (samo X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_hr.ts ================================================ Content C Label for CapsLock indicator V CapsLock Tooltip for CapsLock indicator Prekidač velikih slova N Label for NumLock indicator B NumLock Tooltip for NumLock indicator Prekidač brojčane tipkovnice S Label for ScrollLock indicator K ScrollLock Tooltip for ScrollLock indicator Prekidač klizanja Layout Raspored Variant Varijanta KbdStateConfig Keyboard State Settings Stanje tipkovnice – Postavke Lock Indicators Indikatori za tipke Show Caps Lock Prikaži prekidač velikih slova Show Num Lock Prikaži prekidač brojčane tipkovnice Show Scroll Lock Prikaži prekidač klizanja Keyboard Layout Indicator Indikator za raspored tipkovnice Switching policy Politika prebacivanja Global Globalno Window Prozor Application Program Flags path pattern: Uzorak staze zastava: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Uzorak staze datoteka za zastave zemlje. Mora sadržavati <strong>%1</strong>, što se zamijenjuje dvoslovnim ISO kodom države (mala slova).<br><br>Primjer: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Konfiguriraj rasporede ================================================ FILE: plugin-kbindicator/translations/kbindicator_hu.desktop.yaml ================================================ Desktop Entry/Name: "Billentyűzetállapot megjelenítő" Desktop Entry/Comment: "Bővítmény a billentyűállapot kijelzésére és a kiosztás megváltoztatására (Csak X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_hu.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Kiosztás Variant Változat KbdStateConfig Keyboard State Settings Billentyűzetállapot-beállítások Lock Indicators Jelzőállapot Show Caps Lock Caps Lock megjelenítése Show Num Lock Num Lock megjelenítése Show Scroll Lock Scroll Lock megjelenítése Keyboard Layout Indicator Billentyűzetkiosztás jelző Switching policy Szolgáltatásváltás Flags path pattern: Zászlóútvonal mintája: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Országzászló-fájlútvonal mintája. Tartalmaznia kell a <strong>%1</strong> részt, amely a kétbetűs ISO országkódra (kisbetűs) lesz lecserélve.<br><br>Példa: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Kiosztás beállítása Global Globális Window Ablak Application Alkalmazás ================================================ FILE: plugin-kbindicator/translations/kbindicator_id.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Tata letak Variant Varian KbdStateConfig Keyboard State Settings Pengaturan Papan Tik Lock Indicators Indikator Lock Show Caps Lock Tampilkan Caps Lock Show Num Lock Tampilkan Num Lock Show Scroll Lock Tampilkan Scroll Lock Keyboard Layout Indicator Indikator Tata Latak Papan Tik Switching policy Perubahan aturan Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Konfigurasi tata latak Global Global Window Jendela Application Aplikasi ================================================ FILE: plugin-kbindicator/translations/kbindicator_it.desktop.yaml ================================================ Desktop Entry/Name: "Indicatore di stato della tastiera" Desktop Entry/Comment: "Mostra lo stato e la mappatura della tastiera (solo X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_it.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Blocco maiuscolo N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Blocco numeri S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Blocco scorrimento Layout Mappatura Variant Variante KbdStateConfig Keyboard State Settings Preferenze Lock Indicators Indicatori di blocco Show Caps Lock Mostra blocco maiuscolo Show Num Lock Mostra blocco numeri Show Scroll Lock Mostra blocco scorrimento Keyboard Layout Indicator Mostra mappatura Switching policy Cambio mappatura Flags path pattern: Schema percorso bandiere: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Schema percorso per le bandiere dei paesi. Deve contenere <strong>%1</strong> che sarà sostituito dal codice ISO del paese (in minuscolo).<br><br>Esempio: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configura la mappatura Global Globale Window Finestra Application Applicazione ================================================ FILE: plugin-kbindicator/translations/kbindicator_ja.desktop.yaml ================================================ Desktop Entry/Name: "キーボード状態インジケーター" Desktop Entry/Comment: "キーボードのロック状態やレイアウトの表示と切替をします (X11 のみ)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ja.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Caps Lock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Num Lock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Scroll Lock Layout レイアウト Variant バリアント KbdStateConfig Keyboard State Settings キーボード状態の設定 Lock Indicators ロックインジケーター Show Caps Lock Caps Lock を表示する Show Num Lock Num Lock を表示する Show Scroll Lock Scroll Lock を表示する Keyboard Layout Indicator キーボードレイアウトインジケーター Switching policy 切り替えのポリシー Global 全体 Window ウィンドウ Application アプリケーション Flags path pattern: 旗のパス: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg 国旗のファイルパスのパターンです。必ず含む <strong>%1</strong> が 2 文字の ISO 国名コード (小文字) で置き換えられます。<br><br>例: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts レイアウトの設定 ================================================ FILE: plugin-kbindicator/translations/kbindicator_ka.desktop.yaml ================================================ Desktop Entry/Name: "კლავიატურის მდგომარეობის მაჩვენებელი" Desktop Entry/Comment: "კლავიატურის მდგომარეობის ჩვენების და გადართვის დამატება (მხოლოდ X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ka.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout განლაგება Variant ვარიანტი KbdStateConfig Keyboard State Settings კლავიატურის მდგომარეობის მორგება Lock Indicators დაბლოკვის მაჩვენებლები Show Caps Lock CapsLock-ის ჩვენება Show Num Lock NumLock-ის ჩვენება Show Scroll Lock ScrollLock-ის ჩვენება Keyboard Layout Indicator კლავიატურის განლაგების მაჩვენებელი Switching policy გადართვის პოლიტიკა Flags path pattern: ალმების ბილიკის ნიმუში: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg ფაილის ბილიკის ნიმუში ქვეყნის ალმებისთვის. უნდა შეიცავდეს <strong>%1</strong>-ს, რომელიც ჩანაცვლდება ქვეყნის ორასოიანი ISO კოდით (პატარა ასოებით.<br><br>მაგალითად: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts განლაგებების მორგება Global გლობალური Window ფანჯარა Application აპლიკაცია ================================================ FILE: plugin-kbindicator/translations/kbindicator_kab.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_kk.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Caps Lock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Num Lock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Scroll Lock Layout Жайма Variant Нұсқа KbdStateConfig Keyboard State Settings Пернетақта күйінің баптаулары Lock Indicators Блоктау индикаторлары Show Caps Lock Caps Lock көрсету Show Num Lock Num Lock көрсету Show Scroll Lock Scroll Lock көрсету Keyboard Layout Indicator Пернетақта жаймасының индикаторы Switching policy Ауыстыру саясаты Flags path pattern: Жалаушалар жолының үлгісі: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Ел жалаушаларына арналған файл жолының үлгісі. Оның құрамында екі әріпті ISO ел кодымен (кіші әріптермен) алмастырылатын <strong>%1</strong> болуы тиіс.<br><br>Мысалы: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Жаймаларды баптау Global Глобалды Window Терезе Application Қолданба ================================================ FILE: plugin-kbindicator/translations/kbindicator_ko.desktop.yaml ================================================ Desktop Entry/Name: "키보드 상태 표시기" Desktop Entry/Comment: "키보드 상태 표시기 및 전환기 플러그인 (X11 전용)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ko.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout 레이아웃 Variant 종류 KbdStateConfig Keyboard State Settings 키보드 상태 설정 Lock Indicators 잠금 표시기 Show Caps Lock Caps Lock 표시 Show Num Lock Num Lock 표시 Show Scroll Lock Scroll Lock 표시 Keyboard Layout Indicator 키보드 자판 표시기 Switching policy 정책 전환 Flags path pattern: 플래그 경로 패턴: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg 국가 플래그의 파일 경로 패턴입니다. 두 글자로 된 ISO 국가 코드(소문자)로 대체되는 <strong>%1</strong>을 포함해야 합니다.<br><br>예: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts 레이아웃 구성하기 Global 전역 Window Application 응용 프로그램 ================================================ FILE: plugin-kbindicator/translations/kbindicator_lg.desktop.yaml ================================================ Desktop Entry/Name: "Akalabiriza nkola ya mapeesa agawandisibwa" Desktop Entry/Comment: "Kano kakulaga enkola etegekedwa ku mapeesa agawandisibwa era ne kakusobozesa okukyusa mapeesa g'okozesa (ku X11 kwokka)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_lg.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Ntereeza y'amapeesa Variant Enyuka ezigy'ongedwako KbdStateConfig Keyboard State Settings Enteekateeka z'endabiriza y'amapeesa agawandisibwa Lock Indicators Okulaga ebitegekedwa butajjululuka Show Caps Lock Laga oba Caps Lock kweri Show Num Lock Laga oba Num Lock kweri Show Scroll Lock Laga oba Scroll Lock kweri Keyboard Layout Indicator Teekawo akalaga ntereeza y'amapeesa ekozesebwa Switching policy Entereeza y'amapeesa agawandisibwa gy'okyusiza w'ekolera Flags path pattern: Ekkubo erigguka ku tterekero omuli fayiro za bendera: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Lino ly'ekkubo erigguka ku tterekero omuli fayiro z'ebifaananyi by'amawanga omusibuka entereeza z'amapeesa. Ekiwandikibwa wano kyetaagako ka <strong>%1</strong> nga wekali puloguramu ejjakuzawo endagiriro y'eggwanga eyagiwebwa ISO (mu nnukuta ntono).<br><br>Okugeza: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Tegeka ntereeza z'amapeesa agawandisibwa Global Wonna Window Mu ddirisa mw'osangidwa okolera wokka Application Mu maddirisa ga puloguramu gy'osangidwa okoleramu mwokka ================================================ FILE: plugin-kbindicator/translations/kbindicator_lt.desktop.yaml ================================================ Desktop Entry/Name: "Klaviatūros būsenos indikatorius" Desktop Entry/Comment: "Klaviatūros būsenos ir išdėstymų perjungimo įskiepis (tik X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_lt.ts ================================================ Content C Label for CapsLock indicator D CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator S NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator L ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Išdėstymas Variant Variantas KbdStateConfig Keyboard State Settings Klaviatūros būsenos nustatymai Lock Indicators Užrakinimo indikatoriai Show Caps Lock Rodyti Caps Lock (Didž) Show Num Lock Rodyti Num Lock (Skaitm) Show Scroll Lock Rodyti Scroll Lock (Slinkti) Keyboard Layout Indicator Klaviatūros išdėstymų indikatorius Switching policy Perjungimo politika Flags path pattern: Vėliavų kelio šablonas: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Šalių vėliavų failų šablonas. Jame privalo būti <strong>%1</strong>, kas savo ruožtu bus pakeista dviem ISO šalies kodo raidėmis (mažosiomis).<br><br>Pavyzdys: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Konfigūruoti išdėstymus Global Visuotinai Window Langas Application Programa ================================================ FILE: plugin-kbindicator/translations/kbindicator_lv.desktop.yaml ================================================ Desktop Entry/Name: "Tastatūras stāvokļa indikators" Desktop Entry/Comment: "Tastatūras stāvokļa (izkārtojumu pārslēdža) indikators un\ \ spraudnis" ================================================ FILE: plugin-kbindicator/translations/kbindicator_lv.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Izkārtojums Variant Variants KbdStateConfig Keyboard State Settings Tastatūras stāvokļa iestatījumi Lock Indicators Piestiprināt indikatorus Show Caps Lock Rādīt Caps Lock Show Num Lock Rādīt Num Lock Show Scroll Lock Rādīt Scroll Lock Keyboard Layout Indicator Tastatūras izkārtojuma indikators Switching policy Pārslēgšanas politika Flags path pattern: Ceļa pie karoga šablons/veidnis: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Faila ceļa pie valstu karogiem šablons. Jāsatur <strong>%1</strong>, ko aizstāj ar divu burtu ISO valsts kodu (mazie burti).<br><br> Piemērs: /usr/share/ikonas-Karogi-svg/country-squared/%1.svg Configure layouts Izkārtojumu iestatīšana Global Globāli Window Logs Application Lietotne/programma ================================================ FILE: plugin-kbindicator/translations/kbindicator_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Tastaturtilstandsindikator" Desktop Entry/Comment: "Tastaturindikator og bytter" ================================================ FILE: plugin-kbindicator/translations/kbindicator_nb_NO.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Tastaturspråk Variant KbdStateConfig Keyboard State Settings Innstillinger for tastaturtilstand Lock Indicators Indikatorer for låsetaster Show Caps Lock Vis CapsLock Show Num Lock Vis NumLock Show Scroll Lock Vis ScrollLock Keyboard Layout Indicator Indikator for tastaturlayout Switching policy Bytt tastaturspråk Flags path pattern: Stimønster for flagg: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Filstimønster for språkflagg. Må inneholde <strong>%1</strong>som erstattes av ISO-kode på to (små) bokstaver.<br><br>Eksempel: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Still inn tastaturlayout Global Over alt Window Per vindu Application Per program ================================================ FILE: plugin-kbindicator/translations/kbindicator_nl.desktop.yaml ================================================ Desktop Entry/Name: "Toetsenbordstatusindicator" Desktop Entry/Comment: "Toon de toetsenbordstatus en schakel tussen indelingen (werkt alleen op X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_nl.ts ================================================ Content C Label for CapsLock indicator This capital letter is printed on my keyboard. C N Label for NumLock indicator This digit is printed on my keyboard. N S Label for ScrollLock indicator From the word "Rollen". S CapsLock Tooltip for CapsLock indicator CapsLock NumLock Tooltip for NumLock indicator NumLock ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Indeling Variant Variant KbdStateConfig Keyboard State Settings Toetsenbordstatus-instellingen Lock Indicators 'Lock'-indicatoren Show Caps Lock CapsLock tonen Show Num Lock NumLock tonen Show Scroll Lock ScrollLock tonen Keyboard Layout Indicator Toetsenbordindelingindicator Switching policy Schakelbeleid Flags path pattern: Patroon van vlaglocatie: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Patroon omtrent de bestandslocatie van vlaggen. De locatie dient <strong>%1</strong> te bevatten, wat vervangen zal worden door de tweeletterige ISO-landcode (kleine letters).<br><br>Voorbeeld: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Indelingen instellen Global Systeembreed Window Venster Application Programma ================================================ FILE: plugin-kbindicator/translations/kbindicator_oc.ts ================================================ Content C Label for CapsLock indicator M CapsLock Tooltip for CapsLock indicator Ver. Maj. N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Ver. Num. S Label for ScrollLock indicator D ScrollLock Tooltip for ScrollLock indicator Ver. Def. Layout Disposicion Variant Varianta KbdStateConfig Keyboard State Settings Lock Indicators Indicador de verrolhatge Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Fenèstra Application Aplicacion ================================================ FILE: plugin-kbindicator/translations/kbindicator_pa.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator N NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Layout ਖਾਕਾ Variant KbdStateConfig Keyboard State Settings ਕੀਬੋਰਡ ਹਾਲਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator ਕੀਬੋਰਡ ਖਾਤਾ ਸੰਕੇਤਕ Switching policy ਬਦਲਣ ਦੀ ਨੀਤੀ Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts ਖਾਕਿਆਂ ਦੀ ਸੰਰਚਨਾ Global ਗਲੋਬਲ Window ਵਿੰਡੋ Application ਐਪਲੀਕੇਸ਼ਨ ================================================ FILE: plugin-kbindicator/translations/kbindicator_pl.desktop.yaml ================================================ Desktop Entry/Name: "Wskaźnik stanu klawiatury" Desktop Entry/Comment: "Wskaźnik i przełącznik stanu klawiatury (tylko X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_pl.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Caps Lock N Label for NumLock indicator Num Lock NumLock Tooltip for NumLock indicator Num Lock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Scroll Lock Layout Układ Variant Wariant KbdStateConfig Keyboard State Settings Ustawienia stanu klawiatury Lock Indicators Wskaźniki blokady Show Caps Lock Pokazuj Caps Lock Show Num Lock Pokazuj Num Lock Show Scroll Lock Pokazuj Scroll Lock Keyboard Layout Indicator Wskaźnik układu klawiatury Switching policy Zasady przełączania Flags path pattern: Ścieżka pliku flag: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Ścieżka do plików z flagami. Musi zawierać <strong>%1</strong>, które jest zastępowane przez kod kraju ISO (małe litery).<br><br>Przykład: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Konfiguruj układy Global Globalnie Window Okno Application Program ================================================ FILE: plugin-kbindicator/translations/kbindicator_pt.desktop.yaml ================================================ Desktop Entry/Name: "Indicador de estado do teclado" Desktop Entry/Comment: "Plugin indicador/comutador do teclado (apenas X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_pt.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Disposição Variant Variante KbdStateConfig Keyboard State Settings Configurações do estado do teclado Lock Indicators Indicadores Show Caps Lock Mostrar CapsLock Show Num Lock Mostrar NumLock Show Scroll Lock Mostrar ScrollLock Keyboard Layout Indicator Indicador de disposição do teclado Switching policy Política de troca Global Global Window Janela Application Aplicação Flags path pattern: Caminho para a bandeira: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Padrão dos caminhos para as bandeiras dos países. Tem que conter <strong>%1</strong>, que será substituído pelas duas letras ISO do código do país (minúsculas). <br><br>Exemplo: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Configurar disposição ================================================ FILE: plugin-kbindicator/translations/kbindicator_ru.desktop.yaml ================================================ Desktop Entry/Name: "Индикатор раскладки клавиатуры" Desktop Entry/Comment: "Индикатор и плагин переключателя раскладки клавиатуры(Только для X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_ru.ts ================================================ Content C Label for CapsLock indicator Метка для индикатора CapsLock C CapsLock Tooltip for CapsLock indicator Подсказка для индикатора CapsLock CapsLock N Label for NumLock indicator Метка для индикатора NumLock N NumLock Tooltip for NumLock indicator Подсказка для индикатора NumLock NumLock S Label for ScrollLock indicator Метка для индикатора ScrollLock S ScrollLock Tooltip for ScrollLock indicator Подсказка для индикатора ScrollLock ScrollLock Layout Раскладка Variant Вариант KbdStateConfig Keyboard State Settings Настройки состояния клавиатуры Lock Indicators Закрепить индикаторы Show Caps Lock Показывать Caps Lock Show Num Lock Показывать Num Lock Show Scroll Lock Показывать Scroll Lock Keyboard Layout Indicator Индикатор раскладки клавиатуры Switching policy Правило переключения Flags path pattern: Шаблон пути к флагам: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Шаблон пути к файлам с флагами стран. Должен содержать строку <strong>%1</strong>,которая будет заменяться на двубуквенный код страны (в нижнем регистре) согласно ISO.<br><br>Пример: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Настроить раскладки Global Глобально Window Окно Application Приложение ================================================ FILE: plugin-kbindicator/translations/kbindicator_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-kbindicator/translations/kbindicator_si.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator Layout Variant KbdStateConfig Keyboard State Settings Lock Indicators Show Caps Lock Show Num Lock Show Scroll Lock Keyboard Layout Indicator Switching policy Flags path pattern: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Global Window Application ================================================ FILE: plugin-kbindicator/translations/kbindicator_sk.desktop.yaml ================================================ Desktop Entry/Name: "Klávesnice" Desktop Entry/Comment: "Zásuvný modul stavu a prepínača klávesnice (iba X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_sk_SK.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Písanie veľkými písmenami (CapsLock) N Label for NumLock indicator N NumLock Tooltip for NumLock indicator Uzamknutie číselnej klávesnice (NumLock) S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Zamknúť posúvanie obrazu (ScrollLock) Layout Rozvrhnutie Variant Variant KbdStateConfig Keyboard State Settings Nastavenie stavu klávesnice Lock Indicators Indikovať zámky Show Caps Lock Ukazovať CapsLock Show Num Lock Ukazovať NumLock Show Scroll Lock Ukazovať ScrollLock Keyboard Layout Indicator Ukazovať rozloženie klávesnice Switching policy Pravidlo pre prepínanie Flags path pattern: Vzor cesty k vlajke: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Vzor cesty súboru pre vlajky krajín. Musí obsahovať <strong>%1</strong>, nahradené dvoma písmenami ISO kódu krajiny (malé písmená).<br><br>Príklad: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Nastaviť rozloženie Global Globálne Window Okno Application Aplikácie ================================================ FILE: plugin-kbindicator/translations/kbindicator_sr.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Распоред Variant Варијанта KbdStateConfig Keyboard State Settings Поставке стања тастатуре Lock Indicators Индикатори закључавања Show Caps Lock Прикажи Caps Lock Show Num Lock Прикажи Num Lock Show Scroll Lock Прикажи Scroll Lock Keyboard Layout Indicator Индикатор показатеља тастатуре Switching policy Политика пребацивања Flags path pattern: Шаблон путање заставице: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Шаблон путање датотеке за заставе земаља. Мора да садржи <strong>%1</strong> који је замењен са 2 слова ISO кода државе (малим словима. <br><br>На пример: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Подеси распореде Global Глобално Window Прозор Application Апликација ================================================ FILE: plugin-kbindicator/translations/kbindicator_sv.desktop.yaml ================================================ Desktop Entry/Name: "Låstangentsindikator" Desktop Entry/Comment: "Indikerar status för låstangenter och layout-väljare (X11-insticksprogram)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_sv.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator Caps Lock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator Scroll Lock Layout Utseende Variant Variant KbdStateConfig Keyboard State Settings Tangentbordets inställningar Lock Indicators Låsindikatorer Show Caps Lock Visa CapsLock Show Num Lock Visa NumLock Show Scroll Lock Visa Scroll Lock Keyboard Layout Indicator Indikator för tangentbordlayout Switching policy Bytesprincip Flags path pattern: Flaggsökvägsmönster: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Filsökvägsmönster för landsflaggor. Måste innehålla <strong>%1</strong> som ersätts av ISO-landskoden på två bokstäver (små bokstäver).<br><br>Exempel: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Anpassa layouter Global Allmänna Window Fönster Application Program ================================================ FILE: plugin-kbindicator/translations/kbindicator_tr.desktop.yaml ================================================ Desktop Entry/Name: "Klavye Durumu Göstergesi" Desktop Entry/Comment: "Klavye durum göstergesi ve değiştirici eklentisi (yalnızca X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_tr.ts ================================================ Content C Label for CapsLock indicator B CapsLock Tooltip for CapsLock indicator N Label for NumLock indicator S NumLock Tooltip for NumLock indicator S Label for ScrollLock indicator K ScrollLock Tooltip for ScrollLock indicator Layout Düzen Variant Klavye KbdStateConfig Keyboard State Settings Klavye durum ayarları Lock Indicators Göstergeler Show Caps Lock Büyük Harfi Göster Show Num Lock Sayısal Tuş Takımını Göster Show Scroll Lock Kaydırma Kilidini Göster Keyboard Layout Indicator Klavye Düzeni Göstergesi Switching policy Değiştirme politikası Flags path pattern: Dil bayrağı yolu: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Ülke bayrakları dosya yoludur. İki harfli ISO ülke kodu (küçük harf) ile değiştirilecek <strong>%1</strong> karakteri içermelidir.<br><br>Örnek: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Düzeni yapılandır Global Evrensel Window Pencere Application Uygulama ================================================ FILE: plugin-kbindicator/translations/kbindicator_uk.desktop.yaml ================================================ Desktop Entry/Name: "Покажчик стану клавіатури" Desktop Entry/Comment: "Модуль покажчика стану клавіатури та перемикання (лише X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_uk.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator CapsLock N Label for NumLock indicator N NumLock Tooltip for NumLock indicator NumLock S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator ScrollLock Layout Розкладка Variant Варіант KbdStateConfig Keyboard State Settings Налаштування стану клавіатури Lock Indicators Прикріпити покажчики Show Caps Lock Показати Caps Lock Show Num Lock Показати Num Lock Show Scroll Lock Показати Scroll Lock Keyboard Layout Indicator Покажчик розкладки клавіатури Switching policy Правила перемикання Flags path pattern: Шаблону шляху до прапорів: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg Шаблон шляху до файлу для прапорів країн. Повинен містити <strong>%1</strong>, який замінено двобуквеним кодом країни ISO (маленькі букви).<br><br>Приклад: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts Налаштування розкладок Global Глобально Window Вікно Application Програма ================================================ FILE: plugin-kbindicator/translations/kbindicator_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "键盘状态指示器" Desktop Entry/Comment: "键盘状态指示器与切换器插件" ================================================ FILE: plugin-kbindicator/translations/kbindicator_zh_CN.ts ================================================ Content C Label for CapsLock indicator CapsLock Tooltip for CapsLock indicator 大写锁定 N Label for NumLock indicator NumLock Tooltip for NumLock indicator 数字键锁定 S Label for ScrollLock indicator ScrollLock Tooltip for ScrollLock indicator 滚动锁定 Layout 布局 Variant 变种 KbdStateConfig Keyboard State Settings 键盘状态设置 Lock Indicators 锁定指示器 Show Caps Lock 显示大写锁定 Show Num Lock 显示数字键锁定 Show Scroll Lock 显示滚动锁定 Keyboard Layout Indicator 键盘布局指示器 Switching policy 切换策略 Flags path pattern: 国旗路径型式: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg 国旗文件的路径模式。必须包含 <strong>%1</strong> ,它会被由两个小写字母表示的 ISO 国家码替换。<br><br>示例: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts 設定配置 Global 全局 Window 窗口 Application 应用程序 ================================================ FILE: plugin-kbindicator/translations/kbindicator_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "鍵盤狀態指示器" Desktop Entry/Comment: "鍵盤狀態指示器及切換外掛(僅 X11)" ================================================ FILE: plugin-kbindicator/translations/kbindicator_zh_TW.ts ================================================ Content C Label for CapsLock indicator C CapsLock Tooltip for CapsLock indicator 大寫鎖定鍵 N Label for NumLock indicator N NumLock Tooltip for NumLock indicator 數字鎖定鍵 S Label for ScrollLock indicator S ScrollLock Tooltip for ScrollLock indicator 捲動鎖定 Layout 配置 Variant 變型 KbdStateConfig Keyboard State Settings 鍵盤狀態指示器設定 Lock Indicators 鎖定鍵指示器 Show Caps Lock 顯示大寫鎖定狀態 Show Num Lock 顯示數字鎖定狀態 Show Scroll Lock 顯示捲動鎖定狀態 Keyboard Layout Indicator 鍵盤配置指示器 Switching policy 切換原則 Flags path pattern: 旗幟圖檔路徑: File path pattern for country flags. Must contain <strong>%1</strong> which is replaced by the two letter ISO country code (lower case).<br><br>Example: /usr/share/iso-flags-svg/country-squared/%1.svg 旗幟圖樣檔案路徑。必須包含 <strong>%1</strong>,由兩個字母的 ISO 國家代碼所取代。<br><br>例如: /usr/share/iso-flags-svg/country-squared/%1.svg Configure layouts 設定鍵盤配置 Global 整體 Window 視窗 Application 應用程式 ================================================ FILE: plugin-mainmenu/CMakeLists.txt ================================================ set(PLUGIN "mainmenu") set(HEADERS actionview.h lxqtmainmenu.h menustyle.h lxqtmainmenuconfiguration.h ) set(SOURCES actionview.cpp lxqtmainmenu.cpp menustyle.cpp lxqtmainmenuconfiguration.cpp ) set(UIS lxqtmainmenuconfiguration.ui ) set(LIBRARIES lxqt lxqt-globalkeys lxqt-globalkeys-ui Qt6::Xml Qt6::DBus ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-mainmenu/actionview.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2016 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "actionview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //============================== FilterProxyModel::FilterProxyModel(QObject* parent) : QSortFilterProxyModel(parent) { setSortCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); } FilterProxyModel::~FilterProxyModel() = default; bool FilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { if (filterStr_.isEmpty()) return true; if (QStandardItemModel* srcModel = static_cast(sourceModel())) { QModelIndex index = srcModel->index(source_row, 0, source_parent); if (QStandardItem * item = srcModel->itemFromIndex(index)) { XdgAction * action = qobject_cast(qvariant_cast(item->data(ActionView::ActionRole))); if (action) { const XdgDesktopFile& df = action->desktopFile(); if (df.name().contains(filterStr_, filterCaseSensitivity())) return true; QStringList list = df.expandExecString(); if (!list.isEmpty()) { if (list.at(0).contains(filterStr_, filterCaseSensitivity())) return true; } } } } return false; } //============================== namespace { class SingleActivateStyle : public QProxyStyle { public: using QProxyStyle::QProxyStyle; int styleHint(StyleHint hint, const QStyleOption * option = nullptr, const QWidget * widget = nullptr, QStyleHintReturn * returnData = nullptr) const override { if(hint == QStyle::SH_ItemView_ActivateItemOnSingleClick) return 1; return QProxyStyle::styleHint(hint, option, widget, returnData); } }; class DelayedIconDelegate : public QStyledItemDelegate { public: DelayedIconDelegate(QObject * parent = nullptr) : QStyledItemDelegate(parent) { } void setMaxItemWidth(int max) { mMaxItemWidth = max; } QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override { QIcon icon = index.data(Qt::DecorationRole).value(); //the XdgCachedMenuAction/XdgAction does load the icon upon showing its menu if (icon.isNull()) { XdgAction * action = qobject_cast(qvariant_cast(index.data(ActionView::ActionRole))); if (action != nullptr) { action->updateIcon(); const_cast(index.model())->setData(index, action->icon(), Qt::DecorationRole); } } QSize s = QStyledItemDelegate::sizeHint(option, index); s.setWidth(std::min(mMaxItemWidth, s.width())); return s; } private: int mMaxItemWidth = 300; }; } //============================== ActionView::ActionView(QWidget * parent /*= nullptr*/) : QListView(parent) , mModel{new QStandardItemModel{this}} , mProxy{new FilterProxyModel{this}} , mMaxItemsToShow(10) { setEditTriggers(QAbstractItemView::NoEditTriggers); setSizeAdjustPolicy(AdjustToContents); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setSelectionBehavior(SelectRows); setSelectionMode(SingleSelection); SingleActivateStyle * s = new SingleActivateStyle; s->setParent(this); setStyle(s); mProxy->setSourceModel(mModel); mProxy->setDynamicSortFilter(true); mProxy->setFilterRole(FilterRole); mProxy->setFilterCaseSensitivity(Qt::CaseInsensitive); mProxy->sort(0); { std::unique_ptr guard{selectionModel()}; setModel(mProxy); } { std::unique_ptr guard{itemDelegate()}; setItemDelegate(new DelayedIconDelegate{this}); } connect(this, &QAbstractItemView::activated, this, &ActionView::onActivated); } void ActionView::ActionView::clear() { for (int i = mModel->rowCount() - 1; i >= 0; --i) { mModel->removeRow(i); } } void ActionView::addAction(QAction * action) { QStandardItem * item = new QStandardItem; item->setData(QVariant::fromValue(action), ActionRole); item->setFont(action->font()); //Note: XdgCachedMenuAction has delayed icon loading... we are loading the icon //in QStyledItemDelegate:sizeHint if necessary item->setIcon(action->icon()); item->setText(action->text()); item->setToolTip(action->toolTip()); QString all = action->text(); all += QLatin1Char('\n'); all += action->toolTip(); item->setData(all, FilterRole); mModel->appendRow(item); connect(action, &QObject::destroyed, this, &ActionView::onActionDestroyed); } bool ActionView::existsAction(QAction const * action) const { bool exists = false; for (int row = mModel->rowCount() - 1; 0 <= row; --row) { const QModelIndex index = mModel->index(row, 0); if (action->text() == mModel->data(index, Qt::DisplayRole) && action->toolTip() == mModel->data(index, Qt::ToolTipRole) ) { exists = true; break; } } return exists; } void ActionView::fillActions(QMenu * menu) { clear(); fillActionsRecursive(menu); } void ActionView::setFilter(QString const & filter) { mProxy->setFilterString(filter); const int count = mProxy->rowCount(); if (0 < count) { if (count > mMaxItemsToShow) { setCurrentIndex(mProxy->index(mMaxItemsToShow - 1, 0)); verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum); } else { setCurrentIndex(mProxy->index(count - 1, 0)); } } } void ActionView::setMaxItemsToShow(int max) { mMaxItemsToShow = max; } void ActionView::setMaxItemWidth(int max) { dynamic_cast(itemDelegate())->setMaxItemWidth(max); } void ActionView::activateCurrent() { QModelIndex const index = currentIndex(); if (index.isValid()) emit activated(index); } QSize ActionView::viewportSizeHint() const { const int count = mProxy->rowCount(); QSize s{0, 0}; if (0 < count) { const bool scrollable = mMaxItemsToShow < count; s.setWidth(sizeHintForColumn(0) + (scrollable ? verticalScrollBar()->sizeHint().width() : 0)); s.setHeight(sizeHintForRow(0) * (scrollable ? mMaxItemsToShow : count)); } return s; } QSize ActionView::minimumSizeHint() const { return QSize{0, 0}; } void ActionView::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) mDragStartPosition = event->position().toPoint(); QListView::mousePressEvent(event); } void ActionView::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->position().toPoint() - mDragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; XdgAction *a = qobject_cast(indexAt(mDragStartPosition).data(ActionView::ActionRole).value()); if (!a) return; QList urls; urls << QUrl::fromLocalFile(a->desktopFile().fileName()); QMimeData *mimeData = new QMimeData(); mimeData->setUrls(urls); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction | Qt::LinkAction); emit requestShowHideMenu(); } void ActionView::onActivated(QModelIndex const & index) { QAction * action = qvariant_cast(model()->data(index, ActionRole)); Q_ASSERT(nullptr != action); action->trigger(); } void ActionView::onActionDestroyed() { QObject * const action = sender(); Q_ASSERT(nullptr != action); for (int i = mModel->rowCount() - 1; 0 <= i; --i) { QStandardItem * item = mModel->item(i); if (action == item->data(ActionRole).value()) { mModel->removeRow(i); break; } } } void ActionView::fillActionsRecursive(QMenu * menu) { const auto actions = menu->actions(); for (auto const & action : actions) { if (QMenu * sub_menu = action->menu()) { fillActionsRecursive(sub_menu); //recursion } else if (nullptr == qobject_cast(action) && !action->isSeparator()) { //real menu action -> app if (!existsAction(action)) addAction(action); } } } ================================================ FILE: plugin-mainmenu/actionview.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2016 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #if !defined(ACTION_VIEW_H) #define ACTION_VIEW_H #include #include class QStandardItemModel; //============================== #include class FilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: explicit FilterProxyModel(QObject* parent = nullptr); virtual ~FilterProxyModel(); void setFilterString(const QString& str) { if (filterStr_ == str) return; #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0) beginFilterChange(); filterStr_ = str; endFilterChange(); #else filterStr_ = str; invalidateFilter(); #endif } protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; private: QString filterStr_; }; //============================== class ActionView : public QListView { Q_OBJECT public: enum Role { ActionRole = Qt::UserRole , FilterRole = ActionRole + 1 }; public: ActionView(QWidget * parent = nullptr); /*! \brief Remove all items from model */ void clear(); /*! \brief Add action proxy to the underlying model */ void addAction(QAction * action); /*! \brief Check if action already exists in the view/model. * * \note The equality is evaluated just on text() & toolTip() */ bool existsAction(QAction const * action) const; /*! \brief Fill the view with all actions from \param menu */ void fillActions(QMenu * menu); /*! \brief Sets the filter for entries to be presented */ void setFilter(QString const & filter); /*! \brief Set the maximum number of items/results to show */ void setMaxItemsToShow(int max); /*! \brief Set the maximum width of item to show */ void setMaxItemWidth(int max); public slots: /*! \brief Trigger action on currently active item */ void activateCurrent(); protected: virtual QSize viewportSizeHint() const override; virtual QSize minimumSizeHint() const override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; signals: void requestShowHideMenu(); private slots: void onActivated(QModelIndex const & index); void onActionDestroyed(); private: void fillActionsRecursive(QMenu * menu); private: QStandardItemModel * mModel; QPoint mDragStartPosition; FilterProxyModel * mProxy; int mMaxItemsToShow; }; #endif //ACTION_VIEW_H ================================================ FILE: plugin-mainmenu/lxqtmainmenu.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtmainmenu.h" #include "lxqtmainmenuconfiguration.h" #include "../panel/lxqtpanel.h" #include "actionview.h" #include #include #include #include #include #include #include #include #include #include // for find_if() #include #include #include #include #include #include #include #include #include #include #define DEFAULT_SHORTCUT "Alt+F1" LXQtMainMenu::LXQtMainMenu(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mMenu(nullptr), mShortcut(nullptr), mSearchEditAction{new QWidgetAction{this}}, mSearchViewAction{new QWidgetAction{this}}, mMakeDirtyAction{new QAction{this}}, mFilterMenu(true), mFilterShow(true), mFilterClear(false), mFilterShowHideMenu(true), mHeavyMenuChanges(false) { mDelayedPopup.setSingleShot(true); mDelayedPopup.setInterval(200); connect(&mDelayedPopup, &QTimer::timeout, this, &LXQtMainMenu::showHideMenu); mHideTimer.setSingleShot(true); mHideTimer.setInterval(250); mSearchTimer.setSingleShot(true); connect(&mSearchTimer, &QTimer::timeout, this, &LXQtMainMenu::searchMenu); mSearchTimer.setInterval(350); // typing speed (not very fast) mButton.setAutoRaise(true); mButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); //Notes: //1. installing event filter to parent widget to avoid infinite loop // (while setting icon we also need to set the style) //2. delaying of installEventFilter because in c-tor mButton has no parent widget // (parent is assigned in panel's logic after widget() call) QTimer::singleShot(0, mButton.parentWidget(), [this] { Q_ASSERT(mButton.parentWidget()); mButton.parentWidget()->installEventFilter(this); }); connect(&mButton, &QToolButton::clicked, this, &LXQtMainMenu::showHideMenu); mSearchView = new ActionView; mSearchView->setVisible(false); // NOTE: Qt 6.8.0 has a bug that does not allow context menus with the Qt::Popup flag. // As a workaround, we at least fully handle the the RightButton releases in eventFilter. mSearchView->setContextMenuPolicy(Qt::CustomContextMenu); mSearchView->viewport()->installEventFilter(this); connect(mSearchView, &QAbstractItemView::activated, this, &LXQtMainMenu::showHideMenu); connect(mSearchView, &ActionView::requestShowHideMenu, this, &LXQtMainMenu::showHideMenu); connect(mSearchView, &QWidget::customContextMenuRequested, this, std::bind(&LXQtMainMenu::onRequestingCustomMenu, this, std::placeholders::_1, mSearchView)); mSearchViewAction->setDefaultWidget(mSearchView); mSearchEdit = new QLineEdit; mSearchEdit->setClearButtonEnabled(true); mSearchEdit->setPlaceholderText(LXQtMainMenu::tr("Search...")); connect(mSearchEdit, &QLineEdit::textChanged, this, [this] (QString const &) { mSearchTimer.start(); }); connect(mSearchEdit, &QLineEdit::returnPressed, mSearchView, &ActionView::activateCurrent); mSearchEditAction->setDefaultWidget(mSearchEdit); QTimer::singleShot(0, this, [this] { settingsChanged(); }); mShortcut = GlobalKeyShortcut::Client::instance()->addAction(QString{}, QStringLiteral("/panel/%1/show_hide").arg(settings()->group()), LXQtMainMenu::tr("Show/hide main menu"), this); if (mShortcut) { connect(mShortcut, &GlobalKeyShortcut::Action::shortcutChanged, this, [this](const QString &, const QString & shortcut) { mShortcutSeq = shortcut; }); connect(mShortcut, &GlobalKeyShortcut::Action::registrationFinished, this, [this] { if (mShortcut->shortcut().isEmpty()) mShortcut->changeShortcut(QStringLiteral(DEFAULT_SHORTCUT)); else mShortcutSeq = mShortcut->shortcut(); }); connect(mShortcut, &GlobalKeyShortcut::Action::activated, this, [this] { if (!mHideTimer.isActive()) // Delay this a little -- if we don't do this, search field // won't be able to capture focus // See and // mDelayedPopup.start(); }); } } /************************************************ ************************************************/ LXQtMainMenu::~LXQtMainMenu() { mButton.parentWidget()->removeEventFilter(this); if (mMenu) { mMenu->removeAction(mSearchEditAction); mMenu->removeAction(mSearchViewAction); delete mMenu; } } /************************************************ ************************************************/ void LXQtMainMenu::showHideMenu() { if (mMenu && mMenu->isVisible()) mMenu->hide(); else showMenu(); } /************************************************ ************************************************/ void LXQtMainMenu::showMenu() { if (!mMenu) return; willShowWindow(mMenu); // Just using Qt`s activateWindow() won't work on some WMs like Kwin. // Solution is to execute menu 1ms later using timer mMenu->popup(calculatePopupWindowPos(mMenu->sizeHint()).topLeft()); if (mFilterMenu || mFilterShow) { //Note: part of the workadound for https://bugreports.qt.io/browse/QTBUG-52021 mSearchEdit->setReadOnly(false); //the setReadOnly also changes the cursor, override it back to normal mSearchEdit->unsetCursor(); mSearchEdit->setFocus(); } } /************************************************ ************************************************/ void LXQtMainMenu::settingsChanged() { setButtonIcon(); if (settings()->value(QStringLiteral("showText"), false).toBool()) { mButton.setText(settings()->value(QStringLiteral("text"), QStringLiteral("Start")).toString()); mButton.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { mButton.setText(QLatin1String("")); mButton.setToolButtonStyle(Qt::ToolButtonIconOnly); } mLogDir = settings()->value(QStringLiteral("log_dir"), QString()).toString(); QString menu_file = settings()->value(QStringLiteral("menu_file"), QString()).toString(); if (menu_file.isEmpty()) menu_file = XdgMenu::getMenuFileName(); else if (!menu_file.contains(QLatin1String("/"))) menu_file = XdgMenu::getMenuFileName(menu_file); if (mMenuFile != menu_file) { mMenuFile = menu_file; mXdgMenu.setEnvironments(QStringList() << QStringLiteral("X-LXQT") << QStringLiteral("LXQt")); mXdgMenu.setLogDir(mLogDir); bool res = mXdgMenu.read(mMenuFile); connect(&mXdgMenu, &XdgMenu::changed, this, &LXQtMainMenu::buildMenu); if (res) { QTimer::singleShot(1000, this, &LXQtMainMenu::buildMenu); } else { QMessageBox::warning(nullptr, QStringLiteral("Parse error"), mXdgMenu.errorString()); return; } } setMenuFontSize(); //clear the search to not leaving the menu in wrong state mSearchEdit->setText(QString{}); mFilterMenu = settings()->value(QStringLiteral("filterMenu"), true).toBool(); mFilterShow = settings()->value(QStringLiteral("filterShow"), true).toBool(); mFilterClear = settings()->value(QStringLiteral("filterClear"), false).toBool(); mFilterShowHideMenu = settings()->value(QStringLiteral("filterShowHideMenu"), true).toBool(); if (mMenu) { mSearchEdit->setVisible(mFilterMenu || mFilterShow); mSearchEditAction->setVisible(mFilterMenu || mFilterShow); if (mFilterClear && !mMenu->isVisible()) mSearchEdit->clear(); } mSearchView->setMaxItemsToShow(settings()->value(QStringLiteral("filterShowMaxItems"), 10).toInt()); mSearchView->setMaxItemWidth(settings()->value(QStringLiteral("filterShowMaxWidth"), 300).toInt()); realign(); } static bool filterMenu(QMenu * menu, QString const & filter) { bool has_visible = false; const auto actions = menu->actions(); for (auto const & action : actions) { if (QMenu * sub_menu = action->menu()) { action->setVisible(filterMenu(sub_menu, filter)/*recursion*/); has_visible |= action->isVisible(); } else if (nullptr != qobject_cast(action)) { //our searching widget has_visible = true; } else if (!action->isSeparator()) { //real menu action -> app bool visible(filter.isEmpty() || action->text().contains(filter, Qt::CaseInsensitive) || action->toolTip().contains(filter, Qt::CaseInsensitive)); action->setVisible(visible); has_visible |= action->isVisible(); } } return has_visible; } static void showHideMenuEntries(QMenu * menu, bool show) { //show/hide the top menu entries const auto actions = menu->actions(); for (auto const & action : actions) { if (nullptr == qobject_cast(action)) { action->setVisible(show); } } } static void setTranslucentMenus(QMenu * menu) { menu->setAttribute(Qt::WA_TranslucentBackground); const auto actions = menu->actions(); for (auto const & action : actions) { if (QMenu * sub_menu = action->menu()) { setTranslucentMenus(sub_menu); } } } /************************************************ ************************************************/ void LXQtMainMenu::searchMenu() { const QString text = mSearchEdit->text(); if (mFilterShow) { mHeavyMenuChanges = true; const bool shown = !text.isEmpty(); if (mFilterShowHideMenu) showHideMenuEntries(mMenu, !shown); if (shown) mSearchView->setFilter(text); mSearchView->setVisible(shown); mSearchViewAction->setVisible(shown); //TODO: how to force the menu to recalculate it's size in a more elegant way? mMenu->addAction(mMakeDirtyAction); mMenu->removeAction(mMakeDirtyAction); mHeavyMenuChanges = false; } if (mFilterMenu && !(mFilterShow && mFilterShowHideMenu)) filterMenu(mMenu, text); } /************************************************ ************************************************/ void LXQtMainMenu::setSearchFocus(QAction *action) { if (mFilterMenu || mFilterShow) { if(action == mSearchEditAction) mSearchEdit->setFocus(); else mSearchEdit->clearFocus(); } } static void menuInstallEventFilter(QMenu * menu, QObject * watcher) { for (auto const & action : const_cast const &&>(menu->actions())) { if (action->menu()) menuInstallEventFilter(action->menu(), watcher); // recursion } menu->installEventFilter(watcher); } /************************************************ ************************************************/ void LXQtMainMenu::buildMenu() { if(mMenu) { mMenu->removeAction(mSearchEditAction); mMenu->removeAction(mSearchViewAction); delete mMenu; } mMenu = new XdgMenuWidget(mXdgMenu, QLatin1String(""), &mButton); addContextMenu(mMenu); mMenu->setObjectName(QStringLiteral("TopLevelMainMenu")); setTranslucentMenus(mMenu); // Note: the QWidget::ensurePolished() workarounds problem with transparent // QLineEdit (mSearchEditAction) in menu with Breeze style // https://bugs.kde.org/show_bug.cgi?id=368048 mMenu->ensurePolished(); mMenu->setStyle(&mTopMenuStyle); mMenu->addSeparator(); menuInstallEventFilter(mMenu, this); connect(mMenu, &QMenu::aboutToHide, &mHideTimer, QOverload<>::of(&QTimer::start)); connect(mMenu, &QMenu::aboutToShow, &mHideTimer, &QTimer::stop); mMenu->addSeparator(); mMenu->addAction(mSearchViewAction); mMenu->addAction(mSearchEditAction); connect(mMenu, &QMenu::hovered, this, &LXQtMainMenu::setSearchFocus); //Note: setting readOnly to true to avoid wake-ups upon the Qt's internal "blink" cursor timer //(if the readOnly is not set, the "blink" timer is active also in case the menu is not shown -> //QWidgetLineControl::updateNeeded is performed w/o any need) //https://bugreports.qt.io/browse/QTBUG-52021 connect(mMenu, &QMenu::aboutToHide, mSearchEdit, [this] { mSearchEdit->setReadOnly(true); if (mFilterClear) mSearchEdit->clear(); }); mSearchEdit->setVisible(mFilterMenu || mFilterShow); mSearchEditAction->setVisible(mFilterMenu || mFilterShow); mSearchView->fillActions(mMenu); searchMenu(); setMenuFontSize(); } /************************************************ ************************************************/ void LXQtMainMenu::addContextMenu(QMenu *menu) { const auto actions = menu->actions(); for (auto const & action : actions) { if (action->menu()) { // NOTE: Qt 6.8.0 has a bug that does not allow context menus with the Qt::Popup flag. // As a workaround, we at least fully handle the the RightButton releases in eventFilter. action->menu()->setContextMenuPolicy(Qt::CustomContextMenu); connect(action->menu(), &QWidget::customContextMenuRequested, this, std::bind(&LXQtMainMenu::onRequestingCustomMenu, this, std::placeholders::_1, action->menu())); addContextMenu(action->menu()); } } } void LXQtMainMenu::onRequestingCustomMenu(const QPoint& p, QObject * sender) { QMenu *parentMenu = qobject_cast(sender); ActionView *parentView = qobject_cast(sender); QAction *action; QPoint globalPos; if (parentView != nullptr) { action = parentView->currentIndex().data(ActionView::ActionRole).value(); if (action == nullptr) return; globalPos = parentView->mapToGlobal(p); } else if (parentMenu != nullptr) { action = parentMenu->activeAction(); if (action == nullptr) action = parentMenu->actionAt(p); if (action == nullptr || action->menu() != nullptr || action->isSeparator()) return; globalPos = parentMenu->mapToGlobal(parentMenu->actionGeometry(action).center()); } else { return; } XdgAction *xdgAction = qobject_cast(action); if (xdgAction == nullptr) return; const XdgDesktopFile& df = xdgAction->desktopFile(); QString file = df.fileName(); QMenu menu; QAction *a; if (df.actions().count() > 0 && df.type() == XdgDesktopFile::Type::ApplicationType) { for (int i = 0; i < df.actions().count(); ++i) { QString actionString(df.actions().at(i)); a = menu.addAction(df.actionIcon(actionString), df.actionName(actionString)); connect(a, &QAction::triggered, this, [this, df, actionString] { df.actionActivate(actionString, QStringList()); mMenu->hide(); }); } menu.addSeparator(); } a = menu.addAction(XdgIcon::fromTheme(QLatin1String("desktop")), tr("Add to desktop")); connect(a, &QAction::triggered, [file] { QString desktop = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopFile = desktop + QStringLiteral("/") + file.section(QStringLiteral("/"), -1); if (QFile::exists(desktopFile)) { QMessageBox::StandardButton btn = QMessageBox::question(nullptr, tr("Question"), tr("A file with the same name already exists.\nDo you want to overwrite it?")); if (btn == QMessageBox::No) return; if (!QFile::remove(desktopFile)) { QMessageBox::warning(nullptr, tr("Warning"), tr("The file cannot be overwritten.")); return; } } QFile::copy(file, desktopFile); }); a = menu.addAction(XdgIcon::fromTheme(QLatin1String("edit-copy")), tr("Copy")); connect(a, &QAction::triggered, this, [file] { QClipboard* clipboard = QApplication::clipboard(); QMimeData* data = new QMimeData(); data->setData(QStringLiteral("text/uri-list"), QUrl::fromLocalFile(file).toEncoded() + QByteArray("\r\n")); clipboard->setMimeData(data); }); menu.exec(globalPos); } /************************************************ ************************************************/ void LXQtMainMenu::setMenuFontSize() { if (!mMenu) return; QFont menuFont = mButton.font(); bool customFont = settings()->value(QStringLiteral("customFont"), false).toBool(); if(customFont) { menuFont = mMenu->font(); menuFont.setPointSize(settings()->value(QStringLiteral("customFontSize")).toInt()); } if (mMenu->font() != menuFont) { mMenu->setFont(menuFont); const QList subMenuList = mMenu->findChildren(); for (QMenu* const subMenu : subMenuList) { subMenu->setFont(menuFont); } mSearchEdit->setFont(menuFont); mSearchView->setFont(menuFont); } // icon size the same as the font height if a custom font is selected, // otherwise use the default size int icon_size = (customFont ? QFontMetrics(menuFont).height() : MenuStyle::DEFAULT_ICON_SIZE); mTopMenuStyle.setIconSize(icon_size); // get the size back from the style (this will resolve DEFAULT_ICON_SIZE // to an actual pixel size if necessary) icon_size = mTopMenuStyle.pixelMetric(QStyle::PM_SmallIconSize); mSearchView->setIconSize(QSize{icon_size, icon_size}); } /************************************************ ************************************************/ void LXQtMainMenu::setButtonIcon() { if (settings()->value(QStringLiteral("ownIcon"), false).toBool()) { mButton.setStyleSheet(QStringLiteral("#MainMenu { qproperty-icon: url(%1); }") .arg(settings()->value(QLatin1String("icon"), QLatin1String(LXQT_GRAPHICS_DIR "/helix.svg")).toString())); } else { mButton.setStyleSheet(QString()); } } /************************************************ ************************************************/ QDialog *LXQtMainMenu::configureDialog() { return new LXQtMainMenuConfiguration(settings(), mShortcut, QStringLiteral(DEFAULT_SHORTCUT)); } /************************************************ ************************************************/ // functor used to match a QAction by prefix struct MatchAction { MatchAction(QString key):key_(key) {} bool operator()(QAction* action) { return action->text().startsWith(key_, Qt::CaseInsensitive); } QString key_; }; bool LXQtMainMenu::eventFilter(QObject *obj, QEvent *event) { if(obj == mButton.parentWidget()) { // the application is given a new QStyle if(event->type() == QEvent::StyleChange) { setMenuFontSize(); setButtonIcon(); } } else if(QMenu* menu = qobject_cast(obj)) { if(event->type() == QEvent::KeyRelease) { QKeyEvent* keyEvent = static_cast(event); // if our shortcut key is pressed while the menu is open, close the menu if (!mShortcutSeq.isEmpty()) { static const auto key_meta = QMetaEnum::fromType(); QFlags mod = keyEvent->modifiers(); QList keys = {static_cast(keyEvent->key())}; switch (keyEvent->key()) { case Qt::Key_Alt: mod &= ~Qt::AltModifier; break; case Qt::Key_Control: mod &= ~Qt::ControlModifier; break; case Qt::Key_Shift: mod &= ~Qt::ShiftModifier; break; case Qt::Key_Meta: keys << Qt::Key_Super_L << Qt::Key_Super_R; [[fallthrough]]; case Qt::Key_Super_L: case Qt::Key_Super_R: mod &= ~Qt::MetaModifier; break; } for (const auto & key : std::as_const(keys)) { const QString press = QKeySequence{static_cast(mod)}.toString() % QString::fromLatin1(key_meta.valueToKey(key)).remove(0, 4); if (press == mShortcutSeq) { mMenu->hide(); // close the app menu return true; } } } // go to the menu item which starts with the pressed key if there is an active action. QString key = keyEvent->text(); if(key.isEmpty()) return false; QAction* action = menu->activeAction(); if(action !=nullptr) { QList actions = menu->actions(); QList::iterator it = std::find(actions.begin(), actions.end(), action); it = std::find_if(it + 1, actions.end(), MatchAction(key)); if(it == actions.end()) it = std::find_if(actions.begin(), it, MatchAction(key)); if(it != actions.end()) menu->setActiveAction(*it); } } if (obj == mMenu) { if (event->type() == QEvent::Resize) { QResizeEvent * e = dynamic_cast(event); if (e->oldSize().isValid() && e->oldSize() != e->size()) { mMenu->move(calculatePopupWindowPos(e->size()).topLeft()); } } else if (event->type() == QEvent::KeyPress) { QKeyEvent * e = dynamic_cast(event); if (Qt::Key_Escape == e->key()) { if (!mSearchEdit->text().isEmpty()) { mSearchEdit->setText(QString{}); //filter out this to not close the menu return true; } } } else if (QEvent::ActionChanged == event->type() || QEvent::ActionAdded == event->type()) { //filter this if we are performing heavy changes to reduce flicker if (mHeavyMenuChanges) return true; } } } if (event->type() == QEvent::MouseButtonRelease) { QMenu * menu = qobject_cast(obj); QObject * sender = (obj == mSearchView->viewport() ? static_cast(mSearchView) : (menu != nullptr ? menu : nullptr)); QMouseEvent * e = static_cast(event); if (sender != nullptr && e->button() == Qt::RightButton) { QPoint p = e->position().toPoint(); if (mSearchView == sender) { const auto & index = mSearchView->indexAt(p); if (index != mSearchView->currentIndex()) mSearchView->setCurrentIndex(index); } else if (menu != nullptr) { const auto & action = menu->actionAt(p); if (menu->activeAction() != action) menu->setActiveAction(action); } QTimer::singleShot(0, this, [this, sender, p]() {onRequestingCustomMenu(p, sender);}); e->accept(); return true; } } return false; } #undef DEFAULT_SHORTCUT ================================================ FILE: plugin-mainmenu/lxqtmainmenu.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_MAINMENU_H #define LXQT_MAINMENU_H #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include #include "menustyle.h" class QMenu; class QWidgetAction; class QLineEdit; class ActionView; class LXQtBar; namespace LXQt { class PowerManager; class ScreenSaver; } namespace GlobalKeyShortcut { class Action; } class LXQtMainMenu : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtMainMenu(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtMainMenu(); QString themeId() const { return QStringLiteral("MainMenu"); } virtual ILXQtPanelPlugin::Flags flags() const { return HaveConfigDialog ; } QWidget *widget() { return &mButton; } QDialog *configureDialog(); bool isSeparate() const { return true; } protected: bool eventFilter(QObject *obj, QEvent *event); private: void setMenuFontSize(); void setButtonIcon(); void addContextMenu(QMenu *menu); private: QToolButton mButton; QString mLogDir; QMenu* mMenu; GlobalKeyShortcut::Action *mShortcut; MenuStyle mTopMenuStyle; QWidgetAction * mSearchEditAction; QLineEdit * mSearchEdit; QWidgetAction * mSearchViewAction; ActionView * mSearchView; QAction * mMakeDirtyAction; bool mFilterMenu; //!< searching should perform hiding nonmatching items in menu bool mFilterShow; //!< searching should list matching items in top menu bool mFilterClear; //!< search field should be cleared upon showing the menu bool mFilterShowHideMenu; //!< while searching all (original) menu entries should be hidden bool mHeavyMenuChanges; //!< flag for filtering some mMenu events while heavy changes are performed XdgMenu mXdgMenu; QTimer mDelayedPopup; QTimer mHideTimer; QTimer mSearchTimer; QString mShortcutSeq; QString mMenuFile; protected slots: virtual void settingsChanged(); void buildMenu(); private slots: void showMenu(); void showHideMenu(); void searchMenu(); void setSearchFocus(QAction *action); void onRequestingCustomMenu(const QPoint& p, QObject * sender); }; class LXQtMainMenuPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtMainMenu(startupInfo);} }; #endif ================================================ FILE: plugin-mainmenu/lxqtmainmenuconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtmainmenuconfiguration.h" #include "ui_lxqtmainmenuconfiguration.h" #include #include #include #include #include #include LXQtMainMenuConfiguration::LXQtMainMenuConfiguration(PluginSettings *settings, GlobalKeyShortcut::Action * shortcut, const QString &defaultShortcut, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtMainMenuConfiguration), mDefaultShortcut(defaultShortcut), mShortcut(shortcut), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("MainMenuConfigurationWindow")); ui->setupUi(this); QIcon folder{XdgIcon::fromTheme(QStringLiteral("folder"))}; ui->chooseMenuFilePB->setIcon(folder); ui->iconPB->setIcon(folder); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtMainMenuConfiguration::dialogButtonsAction); loadSettings(); connect(ui->showTextCB, &QAbstractButton::toggled, this, &LXQtMainMenuConfiguration::showTextChanged); connect(ui->textLE, &QLineEdit::textEdited, this, &LXQtMainMenuConfiguration::textButtonChanged); connect(ui->chooseMenuFilePB, &QAbstractButton::clicked, this, &LXQtMainMenuConfiguration::chooseMenuFile); connect(ui->menuFilePathLE, &QLineEdit::textChanged, this, [&] (QString const & file) { if (!mLockSettingChanges) this->settings().setValue(QLatin1String("menu_file"), file); }); connect(ui->iconCB, &QCheckBox::toggled, this, [this] (bool value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("ownIcon"), value); }); connect(ui->iconPB, &QAbstractButton::clicked, this, &LXQtMainMenuConfiguration::chooseIcon); connect(ui->iconLE, &QLineEdit::textChanged, this, [&] (QString const & path) { if (!mLockSettingChanges) this->settings().setValue(QLatin1String("icon"), path); }); connect(ui->shortcutEd, &ShortcutSelector::shortcutGrabbed, this, &LXQtMainMenuConfiguration::shortcutChanged); connect(ui->shortcutEd->addMenuAction(tr("Reset")), &QAction::triggered, this, &LXQtMainMenuConfiguration::shortcutReset); connect(ui->customFontCB, &QAbstractButton::toggled, this, &LXQtMainMenuConfiguration::customFontChanged); connect(ui->customFontSizeSB, static_cast(&QSpinBox::valueChanged), this, &LXQtMainMenuConfiguration::customFontSizeChanged); connect(mShortcut, &GlobalKeyShortcut::Action::shortcutChanged, this, &LXQtMainMenuConfiguration::globalShortcutChanged); connect(ui->filterMenuCB, &QCheckBox::toggled, this, [this] (bool value) { ui->filterClearCB->setEnabled(value || ui->filterShowCB->isChecked()); if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterMenu"), value); }); connect(ui->filterShowCB, &QCheckBox::toggled, this, [this] (bool value) { ui->filterClearCB->setEnabled(value || ui->filterMenuCB->isChecked()); if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterShow"), value); }); connect(ui->filterShowMaxItemsSB, &QSpinBox::valueChanged, this, [this] (int value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterShowMaxItems"), value); }); connect(ui->filterShowMaxWidthSB, &QSpinBox::valueChanged, this, [this] (int value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterShowMaxWidth"), value); }); connect(ui->filterShowHideMenuCB, &QCheckBox::toggled, this, [this] (bool value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterShowHideMenu"), value); }); connect(ui->filterClearCB, &QCheckBox::toggled, this, [this] (bool value) { if (!mLockSettingChanges) this->settings().setValue(QStringLiteral("filterClear"), value); }); } LXQtMainMenuConfiguration::~LXQtMainMenuConfiguration() { delete ui; } void LXQtMainMenuConfiguration::loadSettings() { mLockSettingChanges = true; ui->iconCB->setChecked(settings().value(QStringLiteral("ownIcon"), false).toBool()); ui->iconLE->setText(settings().value(QStringLiteral("icon"), QLatin1String(LXQT_GRAPHICS_DIR"/helix.svg")).toString()); ui->showTextCB->setChecked(settings().value(QStringLiteral("showText"), false).toBool()); ui->textLE->setText(settings().value(QStringLiteral("text"), QString()).toString()); QString menuFile = settings().value(QStringLiteral("menu_file"), QString()).toString(); if (menuFile.isEmpty()) menuFile = XdgMenu::getMenuFileName(); else if (!menuFile.contains(QLatin1String("/"))) menuFile = XdgMenu::getMenuFileName(menuFile); ui->menuFilePathLE->setText(menuFile); if (QGuiApplication::platformName() != QStringLiteral("xcb")) { ui->shortcutGB->setEnabled(false); ui->shortcutGB->setToolTip(tr("Modify or add a shortcut to 'lxqt-qdbus openmenu'\nin the compositor settings under Wayland")); } ui->shortcutEd->setText(nullptr != mShortcut ? mShortcut->shortcut() : mDefaultShortcut); ui->customFontCB->setChecked(settings().value(QStringLiteral("customFont"), false).toBool()); LXQt::Settings lxqtSettings(QStringLiteral("lxqt")); //load system font size as init value QFont systemFont; lxqtSettings.beginGroup(QLatin1String("Qt")); systemFont.fromString(lxqtSettings.value(QStringLiteral("font"), this->font()).toString()); lxqtSettings.endGroup(); ui->customFontSizeSB->setValue(settings().value(QStringLiteral("customFontSize"), systemFont.pointSize()).toInt()); const bool filter_menu = settings().value(QStringLiteral("filterMenu"), true).toBool(); ui->filterMenuCB->setChecked(filter_menu); const bool filter_show = settings().value(QStringLiteral("filterShow"), true).toBool(); ui->filterShowCB->setChecked(filter_show); ui->filterShowMaxItemsL->setEnabled(filter_show); ui->filterShowMaxItemsSB->setEnabled(filter_show); ui->filterShowMaxItemsSB->setValue(settings().value(QStringLiteral("filterShowMaxItems"), 10).toInt()); ui->filterShowMaxWidthL->setEnabled(filter_show); ui->filterShowMaxWidthSB->setEnabled(filter_show); ui->filterShowMaxWidthSB->setValue(settings().value(QStringLiteral("filterShowMaxWidth"), 300).toInt()); ui->filterShowHideMenuCB->setEnabled(filter_show); ui->filterShowHideMenuCB->setChecked(settings().value(QStringLiteral("filterShowHideMenu"), true).toBool()); ui->filterClearCB->setChecked(settings().value(QStringLiteral("filterClear"), false).toBool()); ui->filterClearCB->setEnabled(filter_menu || filter_show); mLockSettingChanges = false; } void LXQtMainMenuConfiguration::textButtonChanged(const QString &value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("text"), value); } void LXQtMainMenuConfiguration::showTextChanged(bool value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("showText"), value); } void LXQtMainMenuConfiguration::chooseIcon() { QFileInfo f{ui->iconLE->text()}; QDir dir = f.dir(); QFileDialog *d = new QFileDialog(this, tr("Choose icon file"), !f.filePath().isEmpty() && dir.exists() ? dir.path() : QLatin1String(LXQT_GRAPHICS_DIR), tr("Images (*.svg *.png)")); d->setWindowModality(Qt::WindowModal); d->setAttribute(Qt::WA_DeleteOnClose); connect(d, &QFileDialog::fileSelected, this, [&] (const QString &icon) { ui->iconLE->setText(icon); }); d->show(); } void LXQtMainMenuConfiguration::chooseMenuFile() { QFileDialog *d = new QFileDialog(this, tr("Choose menu file"), QLatin1String("/etc/xdg/menus"), tr("Menu files (*.menu)")); d->setWindowModality(Qt::WindowModal); d->setAttribute(Qt::WA_DeleteOnClose); connect(d, &QFileDialog::fileSelected, this, [&] (const QString &file) { ui->menuFilePathLE->setText(file); }); d->show(); } void LXQtMainMenuConfiguration::globalShortcutChanged(const QString &/*oldShortcut*/, const QString &newShortcut) { ui->shortcutEd->setText(newShortcut); } void LXQtMainMenuConfiguration::shortcutChanged(const QString &value) { if (mShortcut) mShortcut->changeShortcut(value); } void LXQtMainMenuConfiguration::shortcutReset() { shortcutChanged(mDefaultShortcut); } void LXQtMainMenuConfiguration::customFontChanged(bool value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("customFont"), value); } void LXQtMainMenuConfiguration::customFontSizeChanged(int value) { if (!mLockSettingChanges) settings().setValue(QStringLiteral("customFontSize"), value); } ================================================ FILE: plugin-mainmenu/lxqtmainmenuconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTMAINMENUCONFIGURATION_H #define LXQTMAINMENUCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" class QAbstractButton; namespace Ui { class LXQtMainMenuConfiguration; } namespace GlobalKeyShortcut { class Action; } class LXQtMainMenuConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtMainMenuConfiguration(PluginSettings *settings, GlobalKeyShortcut::Action *shortcut, const QString &defaultShortcut, QWidget *parent = nullptr); ~LXQtMainMenuConfiguration(); private: Ui::LXQtMainMenuConfiguration *ui; QString mDefaultShortcut; GlobalKeyShortcut::Action * mShortcut; bool mLockSettingChanges; private slots: void globalShortcutChanged(const QString &oldShortcut, const QString &newShortcut); void shortcutChanged(const QString &value); /* Saves settings in conf file. */ void loadSettings(); void textButtonChanged(const QString &value); void showTextChanged(bool value); void chooseIcon(); void chooseMenuFile(); void shortcutReset(); void customFontChanged(bool value); void customFontSizeChanged(int value); }; #endif // LXQTMAINMENUCONFIGURATION_H ================================================ FILE: plugin-mainmenu/lxqtmainmenuconfiguration.ui ================================================ LXQtMainMenuConfiguration 0 0 481 501 Main Menu Settings General Icon: false false Button text: false true Custom font size: false pt 1 11 true Menu file Menu file: Keyboard Shortcut Click the button to record shortcut: 200 0 Search Filter menu entries Show matching entries: Maximum visible items: 20 Max. item width: px 40 1000 Hide menu entries while searching Clear search upon showing menu Qt::Vertical 20 41 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset ShortcutSelector QToolButton
LXQtGlobalKeysUi/ShortcutSelector
customFontCB toggled(bool) customFontSizeSB setEnabled(bool) showTextCB toggled(bool) textLE setEnabled(bool) iconCB toggled(bool) iconLE setEnabled(bool) iconCB toggled(bool) iconPB setEnabled(bool) filterShowCB toggled(bool) filterShowMaxItemsSB setEnabled(bool) filterShowCB toggled(bool) filterShowMaxItemsL setEnabled(bool) filterShowCB toggled(bool) filterShowMaxWidthSB setEnabled(bool) filterShowCB toggled(bool) filterShowMaxWidthL setEnabled(bool) filterShowCB toggled(bool) filterShowHideMenuCB setEnabled(bool)
================================================ FILE: plugin-mainmenu/menustyle.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "menustyle.h" #include /************************************************ ************************************************/ MenuStyle::MenuStyle(): QProxyStyle() { mIconSize = DEFAULT_ICON_SIZE; } /************************************************ ************************************************/ int MenuStyle::pixelMetric(PixelMetric metric, const QStyleOption * option, const QWidget * widget) const { if (metric == QStyle::PM_SmallIconSize && mIconSize != DEFAULT_ICON_SIZE) return mIconSize; return QProxyStyle::pixelMetric(metric, option, widget); } /************************************************ ************************************************/ int MenuStyle::styleHint(StyleHint hint, const QStyleOption * option, const QWidget* widget, QStyleHintReturn* returnData) const { // By default, the popup menu will be closed when Alt key // is pressed. If SH_MenuBar_AltKeyNavigation style hint returns // false, this behavior can be suppressed so let's do it. if(hint == QStyle::SH_MenuBar_AltKeyNavigation) return 0; return QProxyStyle::styleHint(hint, option, widget, returnData); } ================================================ FILE: plugin-mainmenu/menustyle.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef MENUSTYLE_H #define MENUSTYLE_H #include class MenuStyle : public QProxyStyle { Q_OBJECT public: // reserved value which gets the icon size from the parent style static constexpr int DEFAULT_ICON_SIZE = -1; explicit MenuStyle(); int pixelMetric(PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0 ) const; int styleHint(StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const; int iconSize() const { return mIconSize; } void setIconSize(int value) { mIconSize = value; } private: int mIconSize; }; #endif // MENUSTYLE_H ================================================ FILE: plugin-mainmenu/resources/mainmenu.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=start-here-lxqt #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-mainmenu/translations/mainmenu.desktop.yaml ================================================ Desktop Entry/Name: "Application Menu" Desktop Entry/Comment: "A menu of all your applications" ================================================ FILE: plugin-mainmenu/translations/mainmenu.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ar.desktop.yaml ================================================ Desktop Entry/Name: "قائمة التّطبيقات" Desktop Entry/Comment: "قائمة لكلّ تطبيقاتك" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ar.ts ================================================ LXQtMainMenu Search... ابحث… Show/hide main menu اعرض/أخفِ القائمة الرئيسية Add to desktop أضف إلى سطح المكتب Question سؤال A file with the same name already exists. Do you want to overwrite it? يوجد ملف بنفس الاسم بالفعل. هل تريد الكتابة عليه؟ Warning تحذير The file cannot be overwritten. لا يمكن الكتابة فوق الملف. Copy نسخ LXQtMainMenuConfiguration General عام Main Menu Settings إعدادات القائمة الرئيسية Icon: الأيقونة: Button text: زر كتابة: Custom font size: حجم خط مخصّص: pt معدود! من النقاط Menu file ملف القوائم Menu file: ملف القوائم: Search البحث Max. item width: أقصى عرض للعنصر: Show matching entries: اعرض المدخلات المتطابقة: Maximum visible items: أقصى عدد للعناصر الظاهرة: Filter menu entries رشّح مدخلات القائمة px بكسل Hide menu entries while searching أخفِ مدخلات القائمة أثناء البحث Clear search upon showing menu امسح البحث عند عرض القائمة Keyboard Shortcut اختصار لوحة المفاتيح Click the button to record shortcut: انقر الزرّ لتسجيل اختصار: Reset صفّر Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file اختر ملف أيقونة Images (*.svg *.png) الصور (‎*.svg *.png) Choose menu file اختر ملف القوائم Menu files (*.menu) ملفات القوائم (‎*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_arn.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ast.ts ================================================ LXQtMainMenu Search... Guetar... Show/hide main menu Amosar/anubrir menú principal Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Copiar LXQtMainMenuConfiguration General Xenerales Main Menu Settings Icon: Iconu: Button text: Testu del botón: Custom font size: pt Menu file Ficheru de menú Menu file: Ficheru de menú: Search Guetar Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_bg.desktop.yaml ================================================ Desktop Entry/Name: "Стартово меню" Desktop Entry/Comment: "Стартово меню с всички ваши приложения" ================================================ FILE: plugin-mainmenu/translations/mainmenu_bg.ts ================================================ LXQtMainMenu Search... Търсене... Show/hide main menu Показване/скриване на менюто Add to desktop Добавяне към работен плот Question Въпрос A file with the same name already exists. Do you want to overwrite it? Вече съществува файл със същото име. Искате ли да го презапишете? Warning Предупреждение The file cannot be overwritten. Файлът не може да бъде презаписан. Copy Копиране LXQtMainMenuConfiguration General Общи Main Menu Settings Настройки на главното меню Icon: Икона: Button text: Текст на бутона: Custom font size: Размер на шрифта: pt pt Menu file Конфигурационен файл на менюто Menu file: Файл: Search Търсене Max. item width: Максимална ширина на поле: Show matching entries: Показване на съвпаденията: Maximum visible items: Максимум видими полета: Filter menu entries Филтриране на полетата на менюто px px Hide menu entries while searching Скриване на елементите на полето при търсене Clear search upon showing menu Изчистване на търсенето при показване на менюто Keyboard Shortcut Клавишна комбинация Click the button to record shortcut: Натиснете бутона за запис на комбинация: Reset Връщане стандартни настройки Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Променете или добавете клавишна комбинация за „lxqt-qdbus openmenu“ в настройките на композитора под Wayland Choose icon file Избиране файл на икона Images (*.svg *.png) Изображения (*.svg *.png) Choose menu file Избиране на конфигурационен файл на менюто Menu files (*.menu) Файлове на меню (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ca.desktop.yaml ================================================ Desktop Entry/Name: "Menú d'aplicacions" Desktop Entry/Comment: "Un menú de totes les aplicacions" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ca.ts ================================================ LXQtMainMenu Search... Cerca... Show/hide main menu Mostra o oculta el menú principal Add to desktop Afegeix a l'escriptori Question Pregunta A file with the same name already exists. Do you want to overwrite it? Ja existeix un fitxer amb el mateix nom. Voleu sobreescriure'l? Warning Avís The file cannot be overwritten. No es pot sobreescriure el fitxer. Copy Copia LXQtMainMenuConfiguration General General Main Menu Settings Ajusts del menú principal Icon: Icona: Button text: Text del botó: Custom font size: Mida personalitzada de la lletra: pt pt Menu file Fitxer del menú Menu file: Fitxer del menú: Search Cerca Max. item width: Amplada màx. de l'ítem: Show matching entries: Mostra les entrades coincidents: Maximum visible items: Nombre màxim d'ítems visibles: Filter menu entries Filtra les entrades del menú px px Hide menu entries while searching Oculta les entrades del menú mentre se cerca Clear search upon showing menu Neteja la cerca quan apareix el menú Keyboard Shortcut Drecera de teclat Click the button to record shortcut: Feu clic al botó per enregistrar la drecera: Reset Restableix Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Trieu el fitxer de la icona Images (*.svg *.png) Imatges (*.svg *.png) Choose menu file Trieu el fitxer del menú Menu files (*.menu) Fitxers de menús (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_cs.desktop.yaml ================================================ Desktop Entry/Name: "Nabídka aplikací" Desktop Entry/Comment: "Nabídka se všemi nainstalovanými aplikacemi" ================================================ FILE: plugin-mainmenu/translations/mainmenu_cs.ts ================================================ LXQtMainMenu Search... Hledat… Show/hide main menu Zobrazit/skrýt hlavní nabídku Add to desktop Přidat na plochu Question Dotaz A file with the same name already exists. Do you want to overwrite it? Stejnojmenný soubor už existuje. Chcete ho přepsat? Warning Varování The file cannot be overwritten. Soubor není možné přepsat. Copy Zkopírovat LXQtMainMenuConfiguration General Obecné Main Menu Settings Nastavení hlavní nabídky Icon: Ikona: Button text: Text tlačítka: Custom font size: Uživatelsky určená velikost písma: pt bodů Menu file Soubor s nabídkou Menu file: Soubor s nabídkou: Search Hledat Max. item width: Největší šířka položky: Show matching entries: Zobrazit odpovídající položky: Maximum visible items: Nejvýše viditelných položek: Filter menu entries Filtrovat položky nabídky px px Hide menu entries while searching Při hledání skrýt položky nabídky Clear search upon showing menu Při dalším zobrazení nabídky vyčistit hledání Keyboard Shortcut Klávesová zkratka Click the button to record shortcut: Klávesovou zkratku zaznamenáte kliknutím na tlačítko: Reset Vrátit na výchozí Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Změnit nebo přidat zkratku na „lxqt-qdbus openmenu“ v nastaveních kompozitoru pod Wayland Choose icon file Vybrat soubor s ikonou Images (*.svg *.png) Obrázky (*.svg *.png) Choose menu file Vybrat soubor s nabídkou Menu files (*.menu) Soubory s nabídkami (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_cy.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_da.desktop.yaml ================================================ Desktop Entry/Name: "Programmenu" Desktop Entry/Comment: "En menu med alle dine programmer" ================================================ FILE: plugin-mainmenu/translations/mainmenu_da.ts ================================================ LXQtMainMenu Search... Søg... Show/hide main menu Vis/skjul hovedmenu Add to desktop Tilføj til skrivebord Question Spørgsmål A file with the same name already exists. Do you want to overwrite it? Der findes allerede en fil med det samme navn. Vil du overskrive den? Warning Advarsel The file cannot be overwritten. Filen kan ikke overskrives. Copy Kopiér LXQtMainMenuConfiguration General Generelt Main Menu Settings Indstillinger for hovedmenu Icon: Ikon: Button text: Knaptekst: Custom font size: Brugerdefineret skriftstørrelse: pt pt Menu file Menufil Menu file: Menufil: Search Søg Max. item width: Maks. bredde for objekt: Show matching entries: Vis tilhørende punkter: Maximum visible items: Maksimum synlige objekter: Filter menu entries Filtrér menupunkter px px Hide menu entries while searching Skjul menupunkter under søgning Clear search upon showing menu Ryd søgning når menuen vises Keyboard Shortcut Tastaturgenvej Click the button to record shortcut: Klik på knappen for at optage genvej: Reset Nulstil Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Vælg ikon-fil Images (*.svg *.png) Billeder (*.svg *.png) Choose menu file Vælg menufil Menu files (*.menu) Menufiler (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_de.desktop.yaml ================================================ Desktop Entry/Name: "Anwendungsmenü" Desktop Entry/Comment: "Menübasierter Anwendungsstarter" ================================================ FILE: plugin-mainmenu/translations/mainmenu_de.ts ================================================ LXQtMainMenu Search... Suchen... Show/hide main menu Hauptmenü anzeigen/ausblenden Add to desktop Hinzufügen zum Arbeitsplatz Question Frage A file with the same name already exists. Do you want to overwrite it? Eine Datei mit dem gleichen Namen existiert bereits. Möchten Sie diese überschreiben? Warning Warnung The file cannot be overwritten. Die Datei kann nicht überschrieben werden. Copy Kopieren LXQtMainMenuConfiguration Main Menu Settings Hauptmenü-Einstellungen General Allgemein Icon: Symbol: Button text: Schaltflächentext: Custom font size: Eigene Schriftgröße: pt pt Menu file Menüdatei Menu file: Menüdatei: Keyboard Shortcut Tastenkürzel Click the button to record shortcut: Klicken Sie auf die Schaltfläche, um ein Tastenkürzel aufzunehmen: Search Suchen Max. item width: Max. Elementbreite: Show matching entries: Passende Einträge anzeigen: Maximum visible items: Maximal sichtbare Einträge: Filter menu entries Menüeinträge filtern px px Hide menu entries while searching Menüeinträge beim Suchen ausblenden Clear search upon showing menu Suche bei Anzeige des Menüs löschen Reset Zurücksetzen Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Symboldatei auswählen Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Menüdatei auswählen Menu files (*.menu) Menüdateien (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_el.desktop.yaml ================================================ Desktop Entry/Name: "Μενού εφαρμογών" Desktop Entry/Comment: "Ένα μενού για όλες σας τις εφαρμογές" ================================================ FILE: plugin-mainmenu/translations/mainmenu_el.ts ================================================ LXQtMainMenu Search... Αναζήτηση... Show/hide main menu Εμφάνιση/απόκρυψη του κύριου μενού Add to desktop Προσθήκη στην επιφάνεια εργασίας Question Ερώτηση A file with the same name already exists. Do you want to overwrite it? Ένα αρχείο με το ίδιο όνομα υπάρχει ήδη. Επιθυμείτε να το αντικαταστήσετε; Warning Προειδοποίηση The file cannot be overwritten. Το αρχείο δεν μπορεί να αντικατασταθεί. Copy Αντιγραφή LXQtMainMenuConfiguration General Γενικά Main Menu Settings Ρυθμίσεις του κύριου μενού Icon: Εικονίδιο: Button text: Κείμενο κουμπιού: Custom font size: Προσαρμοσμένο μέγεθος γραμματοσειράς: pt σημ Menu file Αρχείο μενού Menu file: Αρχείο μενού: Search Αναζήτηση Max. item width: Μεγ. πλάτος αντικειμένου: Show matching entries: Εμφάνιση των ταιριαστών καταχωρήσεων: Maximum visible items: Μέγιστος αριθμός ορατών αντικείμενων: Filter menu entries Φιλτράρισμα καταχωρήσεων του μενού px εικ Hide menu entries while searching Απόκρυψη των καταχωρήσεων του μενού κατά την αναζήτηση Clear search upon showing menu Εκκαθάριση της αναζήτησης μετά από εμφάνιση του μενού Keyboard Shortcut Συντόμευση πληκτρολογίου Click the button to record shortcut: Κλικ στο πλήκτρο για εγγραφή της συντόμευσης: Reset Επαναφορά Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Τροποποιήστε ή προσθέστε μια συντόμευση για το 'lxqt-qdbus openmenu' στις ρυθμίσεις του συνθέτη, στο Wayland Choose icon file Επιλέξτε το αρχείο του εικονιδίου Images (*.svg *.png) Εικόνες (*.svg *.png) Choose menu file Επιλογή αρχείου μενού Menu files (*.menu) Αρχεία μενού (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Application Menu" Desktop Entry/Comment: "A menu of all your applications" ================================================ FILE: plugin-mainmenu/translations/mainmenu_en_GB.ts ================================================ LXQtMainMenu Search... Search... Show/hide main menu Show/hide main menu Add to desktop Add to desktop Question Question A file with the same name already exists. Do you want to overwrite it? A file with the same name already exists. Do you want to overwrite it? Warning Warning The file cannot be overwritten. The file cannot be overwritten. Copy Copy LXQtMainMenuConfiguration General General Main Menu Settings Main Menu Settings Icon: Icon: Button text: Button text: Custom font size: Custom font size: pt pt Menu file Menu file Menu file: Menu file: Search Search Max. item width: Max. item width: Show matching entries: Show matching entries: Maximum visible items: Maximum visible items: Filter menu entries Filter menu entries px px Hide menu entries while searching Hide menu entries while searching Clear search upon showing menu Clear search upon showing menu Keyboard Shortcut Keyboard Shortcut Click the button to record shortcut: Click the button to record shortcut: Reset Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Choose icon file Images (*.svg *.png) Images (*.svg *.png) Choose menu file Choose menu file Menu files (*.menu) Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_eo.desktop.yaml ================================================ Desktop Entry/Name: "Menuo de aplikaĵoj" Desktop Entry/Comment: "Lanĉilo de aplikaĵoj baziĝita sur menuo" ================================================ FILE: plugin-mainmenu/translations/mainmenu_eo.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Ĝenerala Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menua dosiero Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Klavkombinoj Click the button to record shortcut: Alklaku sur la butono por registi klavkombinon: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file lektu menuan dosieron Menu files (*.menu) Menuaj dosieroj (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_es.desktop.yaml ================================================ Desktop Entry/Name: "Menú de aplicaciones" Desktop Entry/Comment: "Un menú con todas las aplicaciones" ================================================ FILE: plugin-mainmenu/translations/mainmenu_es.ts ================================================ LXQtMainMenu Search... Buscar... Show/hide main menu Mostrar/ocultar el menú principal Add to desktop Añadir al escritorio Question Pregunta A file with the same name already exists. Do you want to overwrite it? Ya existe un archivo con el mismo nombre. ¿Quiere sobrescribirlo? Warning Aviso The file cannot be overwritten. El archivo no puede ser sobrescrito. Copy Copiar LXQtMainMenuConfiguration General General Main Menu Settings Configuración del menú principal Icon: Icono: Button text: Texto del botón: Custom font size: Tamaño de fuente personalizado: pt pt Menu file Archivo de menú Menu file: Archivo de menú: Search Buscar Max. item width: Ancho máximo del elemento: Show matching entries: Mostrar entradas coincidentes: Maximum visible items: Número máximo de elementos visibles: Filter menu entries Filtrar las entradas del menú px px Hide menu entries while searching Ocultar las entradas del menú al buscar Clear search upon showing menu Borrar la búsqueda al cerrar el menú Keyboard Shortcut Atajo de teclado Click the button to record shortcut: Presione el botón para registrar el atajo: Reset Reiniciar Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Elija un archivo de icono Images (*.svg *.png) Imágenes (*.svg *.png) Choose menu file Escoja un archivo de menú Menu files (*.menu) Archivos de menú (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_es_UY.ts ================================================ LXQtMainMenu Search... Buscar... Show/hide main menu Mostrar/esconder el menú principal Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Archivo de menú Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Seleccionar archivo de menú Menu files (*.menu) Archivos de menú (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Menu de aplicaciones" Desktop Entry/Comment: "Menu para lanzar las aplicaciones instaladas graficas" ================================================ FILE: plugin-mainmenu/translations/mainmenu_es_VE.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Archivo de menú alterno Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Tecla de acceso rapido Click the button to record shortcut: Pulsa en el boton para grabar el acceso rapido: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Seleccionar archivo de menú Menu files (*.menu) Archivos de menú (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_et.desktop.yaml ================================================ Desktop Entry/Name: "Rakenduste menüü" Desktop Entry/Comment: "Menüü, kus leiduvad kõik sinu rakendused" ================================================ FILE: plugin-mainmenu/translations/mainmenu_et.ts ================================================ LXQtMainMenu Search... Otsi... Show/hide main menu Näita või peida põhimenüüd Add to desktop Lisa töölauale Question Küsimus A file with the same name already exists. Do you want to overwrite it? Sellise nimega fail on juba olemas. Kas sa soovid seda üle kirjutada? Warning Hoiatus The file cannot be overwritten. Faili ülekirjutamine ei õnnestu. Copy Kopeeri LXQtMainMenuConfiguration General Üldist Main Menu Settings Põhimenüü seadistused Icon: Ikoon: Button text: Nupu tekst: Custom font size: Fondi suurus: pt pt Menu file Menüüfail Menu file: Faili asukoht: Search Kust otsime Max. item width: Tulemuste suurim laius: Show matching entries: Näita otsingutulemusi: Maximum visible items: Kirjete arv: Filter menu entries Filtreeri menüükirjeid px px Hide menu entries while searching Otsingu ajal peida tulemused Clear search upon showing menu Põhimenüü uuesti näitamisel kustuta otsingutulemused Keyboard Shortcut Kiirklahv Click the button to record shortcut: Kiirklahvi salvestamiseks klõpsi nuppu: Reset Lähtesta Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland „lxqt-qdbus openmenu“ käsu viidet saad muuta või lisada Waylandi komposiitori seadistustest Choose icon file Vali ikooni fail Images (*.svg *.png) Pildid (*.svg *.png) Choose menu file Vali põhimenüü fail Menu files (*.menu) Menüüfailid (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_eu.desktop.yaml ================================================ Desktop Entry/Name: "Aplikazio menua" Desktop Entry/Comment: "Menu bidezko aplikazio-abiarazlea" ================================================ FILE: plugin-mainmenu/translations/mainmenu_eu.ts ================================================ LXQtMainMenu Search... Bilatu... Show/hide main menu Erakutsi/ezkutatu menu nagusia Add to desktop Gehitu mahaigainean Question Galdera A file with the same name already exists. Do you want to overwrite it? Izen bereko fitxategi bat existitzen da dagoeneko. Gainidatzi nahi al duzu? Warning Abisua The file cannot be overwritten. Ezin da fitxategia gainidatzi. Copy Kopiatu LXQtMainMenuConfiguration General Orokorra Main Menu Settings Menu Nagusiaren Ezarpenak Icon: Ikonoa: Button text: Botoiaren testua: Custom font size: Letra tamaina pertsonalizatua: pt pt Menu file Menu fitxategia Menu file: Menu fitxategia: Search Bilatu Max. item width: Max. elementuaren zabalera: Show matching entries: Erakutsi bat datozen sarrerak: Maximum visible items: Gehienezko elementu ikusgai: Filter menu entries Iragazi menuko sarrerak px px Hide menu entries while searching Ezkutatu menuko sarrerak bilatzen ari zaren bitartean Clear search upon showing menu Garbitu bilaketa menua erakustean Keyboard Shortcut Teklatuko lasterbidea Click the button to record shortcut: Klikatu botoia lasterbidea grabatzeko: Reset Berrezarri Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Aukeratu ikono fitxategia Images (*.svg *.png) Irudiak (*.svg *.png) Choose menu file Aukeratu menu fitxategia Menu files (*.menu) Menu fitxategiak (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_fi.desktop.yaml ================================================ Desktop Entry/Name: "Sovellusvalikko" Desktop Entry/Comment: "Valikkopohjainen sovelluskäynnistin" ================================================ FILE: plugin-mainmenu/translations/mainmenu_fi.ts ================================================ LXQtMainMenu Search... Etsi... Show/hide main menu Näytä/piilota päävalikko Add to desktop Lisää työpöydälle Question Kysymys A file with the same name already exists. Do you want to overwrite it? Samanniminen tiedosto on jo olemassa. Haluatko korvata sen? Warning Varoitus The file cannot be overwritten. Tiedostoa ei voida korvata. Copy Kopioi LXQtMainMenuConfiguration General Yleiset Main Menu Settings Päävalikon asetukset Icon: Kuvake: Button text: Painikkeen teksti: Custom font size: Oma fonttikoko: pt pt Menu file Valikkotiedosto Menu file: Valikkotiedosto: Search Haku Max. item width: Tuloksien leveys: Show matching entries: Hakutuloksien näyttäminen: Maximum visible items: Enintään: Filter menu entries Näytä vain hakutuloksien kategoriat px px Hide menu entries while searching Älä näytä kategorioita haun aikana Clear search upon showing menu Tyhjennä hakukenttä, kun päävalikko avataan Keyboard Shortcut Pikanäppäin Click the button to record shortcut: Napsauta painiketta nauhoittaaksesi pikanäppäimen: Reset Resetoi Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Valitse kuvake Images (*.svg *.png) Kuvat (*.svg *.png) Choose menu file Valitse valikkotiedosto Menu files (*.menu) Valikkotiedostot (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_fr.desktop.yaml ================================================ Desktop Entry/Name: "Menu d'application" Desktop Entry/Comment: "Lanceur d'application sous forme de menu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_fr.ts ================================================ LXQtMainMenu Search... Rechercher... Show/hide main menu Afficher/Cacher le menu principal Add to desktop Ajouter au bureau Question Question A file with the same name already exists. Do you want to overwrite it? Un fichier du même nom existe déjà. Voulez-vous l'écraser ? Warning Attention The file cannot be overwritten. Le fichier ne peut pas être écrasé. Copy Copier LXQtMainMenuConfiguration General Général Main Menu Settings Paramétres du menu principal Icon: Icône : Button text: Texte du bouton : Custom font size: Taille de police personnalisée : pt pt Menu file Fichier du menu Menu file: Fichier du menu : Search Recherche Max. item width: Largeur maxi d'une entrée : Show matching entries: Afficher les entrées correspondantes : Maximum visible items: Nombre maximum d'éléments visibles : Filter menu entries Filtrer les entrées de menu px px Hide menu entries while searching Masquer les entrées du menu pendant la recherche Clear search upon showing menu Remettre à zéro la recherche lors de l'affichage du menu Keyboard Shortcut Raccourci clavier Click the button to record shortcut: Cliquer sur le bouton pour enregistrer le raccourci : Reset Réinitialiser Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Choisir un fichier d'icône Images (*.svg *.png) Images (*.svg *.png) Choose menu file Choisir un fichier de menu Menu files (*.menu) Fichiers de menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_gl.ts ================================================ LXQtMainMenu Search... Buscar... Show/hide main menu Amosar/agochar o menú principal Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Xeral Main Menu Settings Axustes do menú principal Icon: Icona: Button text: Texto do botón: Custom font size: Tamaño personalizado da letra: pt Menu file Ficheiro do menú Menu file: Ficheiro de menú: Search Buscar Max. item width: Largura máxima do elemento: Show matching entries: Amosar as entradas coincidentes: Maximum visible items: Número máximo de elementos visíbeis: Filter menu entries Filtrar as entradas do menú px Hide menu entries while searching Agochar as entradas do menú nas buscas Clear search upon showing menu Limpar a busca ao amosar o menú Keyboard Shortcut Atallo de teclado Click the button to record shortcut: Prema o botón para rexistrar o atallo: Reset Restabelecer Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Escoller o ficheiro da icona Images (*.svg *.png) Imaxes (*.svg *.png) Choose menu file Escoller o ficheiro de menú Menu files (*.menu) Ficheiros de menú (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_he.desktop.yaml ================================================ Desktop Entry/Name: "תפריט יישומים" Desktop Entry/Comment: "תפריט לכל היישומים שלך" ================================================ FILE: plugin-mainmenu/translations/mainmenu_he.ts ================================================ LXQtMainMenu Search... חיפוש… Show/hide main menu הצגת/הסתרת תפריט ראשי Add to desktop הוספה לשולחן העבודה Question שאלה A file with the same name already exists. Do you want to overwrite it? כבר קיים קובץ בשם הזה. לשכתב אותו? Warning אזהרה The file cannot be overwritten. לא ניתן לשכתב את הקובץ. Copy העתקה LXQtMainMenuConfiguration General כללי Main Menu Settings הגדרות תפריט ראשי Icon: סמל: Button text: טקסט כפתור: Custom font size: גודל גופן מותאם: pt נק׳ Menu file קובץ תפריט Menu file: קובץ תפריט: Search חיפוש Max. item width: רוחב פריט מרבי: Show matching entries: הצגת רשומות תואמות: Maximum visible items: כמות הפריטים הגלויים המרבית: Filter menu entries סינון פריטי תפריט px פיקסלים Hide menu entries while searching הסתרת רשומות תפריט בעת החיפוש Clear search upon showing menu מחיקת החיפוש במהלך הצגת תפריט Keyboard Shortcut קיצור דרך של מקלדת Click the button to record shortcut: יש ללחוץ על הכפתור כדי להקליט קיצור דרך: Reset איפוס Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland שינוי או הוספת קיצור דרך אל ‚lxqt-qdbus openmenu’ בהגדרות הניהול החלונאי תחת Wayland Choose icon file בחירת קובץ סמל Images (*.svg *.png) תמונות ‎(*.svg *.png) Choose menu file בחירת קובץ תפריט Menu files (*.menu) קובצי תפריט ‎(*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_hr.desktop.yaml ================================================ Desktop Entry/Name: "Izbornik programa" Desktop Entry/Comment: "Izbornik svih programa" ================================================ FILE: plugin-mainmenu/translations/mainmenu_hr.ts ================================================ LXQtMainMenu Search... Traži … Show/hide main menu Prikaži/sakrij glavni izbornik Add to desktop Dodaj na radnu površinu Question Pitanje A file with the same name already exists. Do you want to overwrite it? Datoteka s istim imenom već postoji. Želiš li je prepisati? Warning Upozorenje The file cannot be overwritten. Datoteka se ne može prepisati. Copy Kopiraj LXQtMainMenuConfiguration General Opće Main Menu Settings Glavni izbornik – Postavke Icon: Ikona: Button text: Tekst gumba: Custom font size: Prilagođena veličina fonta: pt pt Menu file Datoteka izbornika Menu file: Datoteka izbornika: Keyboard Shortcut Tipkovni prečac Click the button to record shortcut: Pritisni gumb za snimanje pračaca: Search Pretraga Max. item width: Maks. širina elementa: Show matching entries: Prikaži poklapajuće unose: Maximum visible items: Maks. broj vidljivih elemenata: Filter menu entries Filtriraj unose izbornika px px Hide menu entries while searching Sakrij unose izbornika tijekom pretrage Clear search upon showing menu Ukloni pretragu pri prikazu izbornika Reset Resetiraj Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Odaberi datoteku ikone Images (*.svg *.png) Slike (*.svg *.png) Choose menu file Odaberi datoteku izbornika Menu files (*.menu) Datoteke izbornika (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_hu.desktop.yaml ================================================ Desktop Entry/Name: "Alkalmazásmenü" Desktop Entry/Comment: "Egy menü az alkalmazások indításához" ================================================ FILE: plugin-mainmenu/translations/mainmenu_hu.ts ================================================ LXQtMainMenu Search... Keresés... Show/hide main menu Menü megjelenítése/elrejtése Add to desktop Hozzáadás asztalhoz Question Kérdés A file with the same name already exists. Do you want to overwrite it? Már létezik azonos nevű fájl. Felül szeretné írni? Warning Figyelmeztetés The file cannot be overwritten. A fájlt nem lehet felülírni. Copy Másolás LXQtMainMenuConfiguration General Általános Main Menu Settings Menü beállítások Icon: Ikon: Button text: Gombszöveg: Custom font size: Egyéni betűméret: pt pont Menu file Menüfájl Menu file: Menüfájl: Search Keresés Max. item width: Maximum elemszélesség: Show matching entries: Egyezések: Maximum visible items: Maximálisan látható elemek: Filter menu entries Menüelemek keresése px px Hide menu entries while searching Kereséskor menü elrejtése Clear search upon showing menu Törölje a keresést a menü megjelenítésekor Keyboard Shortcut Gyorsbillentyű Click the button to record shortcut: Gyorsbillentyű beállítása: Reset Visszaállítás Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Ikon kiválasztása Images (*.svg *.png) Képek (*.svg *.png) Choose menu file Menüfájl kiválasztása Menu files (*.menu) Menüfájlok (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ia.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_id.desktop.yaml ================================================ Desktop Entry/Name: "Menu aplikasi" Desktop Entry/Comment: "Peluncur aplikasi berbasis menu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_id.ts ================================================ LXQtMainMenu Search... Cari... Show/hide main menu Tampilkan/sembunyikan menu utama Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Umum Main Menu Settings Pengaturan Menu Utama Icon: Ikon: Button text: Teks tombol: Custom font size: Ukuran fonta kustom: pt pt Menu file Berkas menu Menu file: Berkas menu: Search Cari Max. item width: Maks. lebar item: Show matching entries: Tampilkan entri yang cocok: Maximum visible items: Maksimal item yang terlihat: Filter menu entries Filter entri menu px px Hide menu entries while searching Sembunyikan entri menu saat pencarian Clear search upon showing menu Bersihkan pencarian pada menu yang ditampilkan Keyboard Shortcut Pintasan Keyboard Click the button to record shortcut: Klik tombol untuk merekam pintasan: Reset Atur ulang Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Pilih berkas ikon Images (*.svg *.png) Gambar (*.svg *.png) Choose menu file Pilih berkas menu Menu files (*.menu) Berkas menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_is.ts ================================================ LXQtMainMenu Search... Leita... Show/hide main menu Sýna/fela aðalvalmynd Add to desktop Bæta við skjáborðið Question Spurning A file with the same name already exists. Do you want to overwrite it? Skrá með sama nafni er þegar til Viltu skrifa yfir hana? Warning Aðvörun The file cannot be overwritten. Ekki er hægt að skrifa yfir skrána. Copy Afrita LXQtMainMenuConfiguration General Almennt Main Menu Settings Stillingar aðalvalmyndar Icon: Táknmynd: Button text: Texti á hnapp: Custom font size: Sérvalin leturstærð: pt pt Menu file Valmyndarskrá Menu file: Valmyndarskrá: Search Leita Max. item width: Hámarksbreidd: Show matching entries: Sýna samsvarandi færslur: Maximum visible items: Hámark sýnilegra hluta: Filter menu entries Síaðar valmyndarfærslur px pt Hide menu entries while searching Fela valmyndafærslur í leit Clear search upon showing menu Hreinsa leit þegar valmynd er sýnd Keyboard Shortcut Lyklaborðsskammval Click the button to record shortcut: Sláðu á lykilinn til að skrá nýtt skammval: Reset Frumstilla Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Velja Táknmynd Images (*.svg *.png) Myndir (*.svg *.png) Choose menu file Veldu valmyndaskrá Menu files (*.menu) Valmyndaskrár (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_it.desktop.yaml ================================================ Desktop Entry/Name: "Menu delle applicazioni" Desktop Entry/Comment: "Un menu di tutte le applicazioni installate" ================================================ FILE: plugin-mainmenu/translations/mainmenu_it.ts ================================================ LXQtMainMenu Search... Cerca... Show/hide main menu Mostra/nascondi menu principale Add to desktop Aggiungi al desktop Question Domanda A file with the same name already exists. Do you want to overwrite it? Un file dello stesso nome esiste già. Sovrascriverlo? Warning Attenzione The file cannot be overwritten. Impossibile sovrascrivere il file. Copy Copia LXQtMainMenuConfiguration General Generale Main Menu Settings Impostazioni del menu principale di LXQt Icon: Icona: Button text: Testo del pulsante: Custom font size: Dimensione personalizzata del carattere: pt Menu file File del menu Menu file: File del menu: Search Ricerca Max. item width: Dimensione massima: Show matching entries: Mostra risultati: Maximum visible items: Numero massimo: Filter menu entries Filtra le categorie px px Hide menu entries while searching Nascondi menu durante la ricerca Clear search upon showing menu Cancella la ricerca quando viene visualizzato il menu Keyboard Shortcut Scorciatoia da tastiera Click the button to record shortcut: Fai clic sul pulsante per impostare una scorciatoia: Reset Ripristina Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifica o aggiungi una scorciatoia per 'lxqt-qdbus openmenu' nelle impostazioni del compositore in Wayland Choose icon file Seleziona file icona Images (*.svg *.png) File immagini (*.svg *.png) Choose menu file Selezione file del menu Menu files (*.menu) File di menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ja.desktop.yaml ================================================ Desktop Entry/Name: "アプリケーションメニュー" Desktop Entry/Comment: "アプリケーションをメニューに表示します" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ja.ts ================================================ LXQtMainMenu Search... 検索... Show/hide main menu アプリケーションメニューの表示/非表示 Add to desktop デスクトップに追加 Question 質問 A file with the same name already exists. Do you want to overwrite it? 同じ名前のファイルが既に存在します。 上書きしますか? Warning 警告 The file cannot be overwritten. ファイルを上書き出来ません。 Copy コピー LXQtMainMenuConfiguration General 全般 Main Menu Settings アプリケーションメニューの設定 Icon: アイコン: Button text: ボタンの文字列: Custom font size: フォントサイズの指定: pt ポイント Menu file メニューファイル Menu file: メニューファイル: Search 検索 Max. item width: アイテムの表示最大幅: Show matching entries: 一致するエントリ名を表示する: Maximum visible items: アイテムの表示最大数: Filter menu entries メニューエントリを絞り込む px ピクセル Hide menu entries while searching 検索中はメニューエントリを隠す Clear search upon showing menu メニューを表示した時、検索フォームをクリアする Keyboard Shortcut ショートカットキー Click the button to record shortcut: ショートカットを登録するにはボタンをクリックします: Reset リセット Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland のコンポジター設定「lxqt-qdbus openmenu」 へのショートカットを変更または追加 Choose icon file アイコンファイルの選択 Images (*.svg *.png) 画像 (*.svg *.png) Choose menu file メニューファイルの選択 Menu files (*.menu) メニューファイル (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ka.desktop.yaml ================================================ Desktop Entry/Name: "აპლიკაციის მენიუ" Desktop Entry/Comment: "თქვენი ყველა აპლიკაციის მენიუ" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ka.ts ================================================ LXQtMainMenu Search... ძებნა... Show/hide main menu მთავარი მენიუს ჩვენება/დამალვა Add to desktop სამუშაო მაგიდაზე დამატება Question კითხვა A file with the same name already exists. Do you want to overwrite it? ფაილი ამ სახელით უკვე არსებობს. გნებავთ, გადააწეროთ თავზე? Warning გაფრთხილება The file cannot be overwritten. ფაილის თავზე გადაწერა შეუძლებელია. Copy კოპირება LXQtMainMenuConfiguration General ზოგადი Main Menu Settings მთავარი მენიუს მორგება Icon: ხატულა: Button text: ღილაკის ტექსტი: Custom font size: მორგებული ფონტის ზომა: pt წრტ Menu file მენიუს ფაილი Menu file: მენიუს ფაილი: Search ძებნა Max. item width: მაქს. ელემენტის სიგანე: Show matching entries: შესაბამისი ჩანაწერების ჩვენება: Maximum visible items: მაქსიმალური ხილული ელემენტი: Filter menu entries მენიუს ელემენტების გაფილტვრა px პქს Hide menu entries while searching მენიუს პუნქტების დამალვა ძებნისას Clear search upon showing menu ძებნის დახურვა მენიუს ჩვენებისას Keyboard Shortcut კლავიატურის მალსახმობი Click the button to record shortcut: დააწკაპუნეთ ღილაკზე მალსახმობის ჩასაწერად: Reset ჩამოყრა Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland შეცვალეთ, ან დაამატეთ მალსახმობი ბრძანებისთვის 'lxqt-qdbus openmenu' კომპოზიტორის მორგების ფანჯარაში Wayland-ის ქვეშ Choose icon file აირჩიეთ ხატულას ფაილი Images (*.svg *.png) გამოსახულებები (*.svg *.png) Choose menu file აირჩიეთ მენიუს ფაილი Menu files (*.menu) მენიუს ფაილები (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_kab.ts ================================================ LXQtMainMenu Search... Nadi... Show/hide main menu Add to desktop Rnu ɣer tnarit Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Nɣel LXQtMainMenuConfiguration General Amatu Main Menu Settings Icon: Tignit: Button text: Aḍris n tqeffalt: Custom font size: pt Menu file Menu file: Search Nadi Max. item width: Show matching entries: Maximum visible items: Filter menu entries px px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Inegzumen n unasiw Click the button to record shortcut: Reset Ales Choose icon file Fren afaylu n tegnit Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_kk.desktop.yaml ================================================ Desktop Entry/Name: "Қолданбалар мәзірі" Desktop Entry/Comment: "Барлық қолданбаларыңыздың мәзірі" ================================================ FILE: plugin-mainmenu/translations/mainmenu_kk.ts ================================================ LXQtMainMenu Search... Табу... Show/hide main menu Басты мәзірді көрсету/жасыру Add to desktop Жұмыс үстеліне қосу Question Сұрақ A file with the same name already exists. Do you want to overwrite it? Осылай аталатын файл бар болып тұр. Оны үстінен жазу керек пе? Warning Ескерту The file cannot be overwritten. Файлды үстінен жазу мүмкін емес. Copy Көшіріп алу LXQtMainMenuConfiguration General Жалпы Main Menu Settings Басты мәзір баптаулары Icon: Таңбаша: Button text: Батырма мәтіні: Custom font size: Қаріп өлшемін таңдау: pt п Menu file Мәзір файлы Menu file: Мәзір файлы: Search Іздеу Max. item width: Нәрсенің макс. ені: Show matching entries: Сәйкес келетін жазбаларды көрсету: Maximum visible items: Көрінетін нәрселердің макс. саны: Filter menu entries Мәзір элементтерін сүзгілеу px пикс Hide menu entries while searching Іздеу кезінде мәзір нәрселерін жасыру Clear search upon showing menu Мәзірді көрсеткен кезде іздеу өрісін тазарту Keyboard Shortcut Пернетақта жарлығы Click the button to record shortcut: Пернетақта жарлығын жазып алу үшін батырманы басыңыз: Reset Тастау Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland 'lxqt-qdbus openmenu' үшін жарлықты өзгерту немесе қосу композитор баптауларында, Wayland астында болады Choose icon file Таңбаша файлын таңдау Images (*.svg *.png) Суреттер (*.svg *.png) Choose menu file Мәзір файлын таңдау Menu files (*.menu) Мәзір файлдары (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ko.desktop.yaml ================================================ Desktop Entry/Name: "프로그램 메뉴" Desktop Entry/Comment: "사용자의 모든 응용 프로그램 메뉴" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ko.ts ================================================ LXQtMainMenu Search... 검색... Show/hide main menu 메뉴 표시/숨김 Add to desktop 바탕화면에 추가 Question 질문 A file with the same name already exists. Do you want to overwrite it? 같은 이름의 파일이 이미 있습니다. 덮어쓰시겠습니까? Warning 경고 The file cannot be overwritten. 파일을 덮어쓸 수 없습니다. Copy 복사 LXQtMainMenuConfiguration General 일반 Main Menu Settings 기본 메뉴 설정 Icon: 아이콘: Button text: 버튼 텍스트: Custom font size: 사용자 지정 글꼴 크기: pt pt Menu file 메뉴 파일 Menu file: 메뉴 파일: Search 검색 Max. item width: 최대 항목 너비: Show matching entries: 일치하는 항목 표시: Maximum visible items: 최대 표시 항목: Filter menu entries 필터 메뉴 항목 px 픽셀 Hide menu entries while searching 검색하는 동안 메뉴 항목 숨김 Clear search upon showing menu 메뉴 표시 시 검색 지우기 Keyboard Shortcut 키보드 단축키 Click the button to record shortcut: 단축키를 기록하려면 버튼 클릭: Reset 재설정 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland의 컴포지터 설정에서 'lxqt-qdbus openmenu' 에 대한 바로가기를 수정하거나 추가하세요 Choose icon file 아이콘 파일 선택하기 Images (*.svg *.png) 이미지 (*.svg *.png) Choose menu file 메뉴 파일 선택하기 Menu files (*.menu) 메뉴 파일 (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_lg.desktop.yaml ================================================ Desktop Entry/Name: "Menyu eya puloguramu" Desktop Entry/Comment: "Menyu ekulaga puloguramu eziri ku sisitemu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_lg.ts ================================================ LXQtMainMenu Search... Noonya... Show/hide main menu Laga/kisa menyu enkulu Add to desktop Teeka awakolerwa Question Kubuuza A file with the same name already exists. Do you want to overwrite it? Waliwo fayiro erina erinnya lino. Oyagala egyibwewo waddewo eno empya? Warning Kulabula The file cannot be overwritten. Fayiro tesobola okugyibwawo kuzzawo empya. Copy Koppa LXQtMainMenuConfiguration General Ebikola wonna Main Menu Settings Enteekateeka ya menyu enkulu Icon: Kafaananyi: Button text: Bigambo ku ppeesa: Custom font size: Tegeka bunene bw'ennukuta: pt pt Menu file Fayiro eya menyu Menu file: Fayiro omuva menyu: Search Eby'okunoonya Max. item width: Kkomo ly'obugazi bw'ebiragibwa: Show matching entries: Laga ebifaananyiza ekinoonyezebwa: Maximum visible items: Bungi bw'ebizuulidwa ebiba birabikirawo: Filter menu entries Sunsulanga ebiri ku menyu px px Hide menu entries while searching Kisa ebiri ku menyu nga okunoonya kukyabindabinda Clear search upon showing menu Olulaga menyu gyawo olukalala lw'ebizuulidwa Keyboard Shortcut Mapeesa agaleeta menyu Click the button to record shortcut: Nyiga mapeesa g'oyagala galeetenga menyu: Reset Zaawo ebyasooka Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Londa fayiro ey'akafaananyi Images (*.svg *.png) Bifaananayi (*.svg *.png) Choose menu file Londa fayiro omuva menyu Menu files (*.menu) Fayiro eza menyu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_lt.desktop.yaml ================================================ Desktop Entry/Name: "Programų meniu" Desktop Entry/Comment: "Programų paleidimo meniu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_lt.ts ================================================ LXQtMainMenu Search... Ieškoti... Show/hide main menu Rodyti/slėpti pagrindinį meniu Add to desktop Pridėti į darbalaukį Question Klausimas A file with the same name already exists. Do you want to overwrite it? Failas tokiu pavadinimu jau yra. Ar norite jį perrašyti? Warning Įspėjimas The file cannot be overwritten. Failas negali būti perrašytas. Copy Kopijuoti LXQtMainMenuConfiguration General Bendra Main Menu Settings Pagrindinio meniu nustatymai Icon: Piktograma: Button text: Mygtuko tekstas: Custom font size: Tinkintas šrifto dydis: pt taškų Menu file Meniu failas Menu file: Meniu failas: Search Paieška Max. item width: Didžiausias elemento plotis: Show matching entries: Rodyti atitinkančius įrašus: Maximum visible items: Daugiausia matomų elementų: Filter menu entries Filtruoti meniu įrašus px pikselių Hide menu entries while searching Slėpti meniu įrašus, kol ieškoma Clear search upon showing menu Rodant meniu, išvalyti paiešką Keyboard Shortcut Spartusis klavišas Click the button to record shortcut: Spustelėkite mygtuką, kad įrašytumėte spartųjį klavišą: Reset Atstatyti Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Pasirinkite piktogramos failą Images (*.svg *.png) Paveikslai (*.svg *.png) Choose menu file Pasirinkite meniu failą Menu files (*.menu) Meniu failai (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_lv.desktop.yaml ================================================ Desktop Entry/Name: "Lietotņu/programmu izvēlne" Desktop Entry/Comment: "Visu jūsu lietotņu izvēlne" ================================================ FILE: plugin-mainmenu/translations/mainmenu_lv.ts ================================================ LXQtMainMenu Search... Meklēt... Show/hide main menu Rādīt/nerādīt galveno izvēlni Add to desktop Likt uz darbvirsmas Question Jautājums A file with the same name already exists. Do you want to overwrite it? Fails ar šādu nosaukumu jau pastāv. Vēlaties tam pārrakstīt pa virsu? Warning Brīdinājums The file cannot be overwritten. Fails nevar tikt pārrakstīts (pa virsu). Copy Kopēt LXQtMainMenuConfiguration General Vispārīgie Main Menu Settings Galvenās izvēlnes iestatījumi Icon: Ikona: Button text: Pogas teksts: Custom font size: Pielāgots šrifta izmērs: pt pnkt. Menu file Izvēlnes fails Menu file: Izvēlnes fails: Search Meklēšana Max. item width: Maksimālais vienības platums: Show matching entries: Parādīt sakrītošos ierakstus/punktus: Maximum visible items: Redzamo elementu maks. skaits: Filter menu entries Filtrēt izvēlnes elementus/punktus px pikseļi Hide menu entries while searching Nerādīt izvēlnes punktus/elementus meklēšanas laikā Clear search upon showing menu Notīrīt meklēšanas lauku, kad tiek rādīta izvēlne Keyboard Shortcut Tastatūras īsceļi Click the button to record shortcut: Nospiediet pogu, lai ierakstītu īsceļu: Reset Atstatīt Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Izvēlēties ikonas failu Images (*.svg *.png) Attēli (*.svg *.png) Choose menu file Izvēlēties izvēlnes failu Menu files (*.menu) Izvēlnes faili (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Programmeny" Desktop Entry/Comment: "En meny for alle programmene dine" ================================================ FILE: plugin-mainmenu/translations/mainmenu_nb_NO.ts ================================================ LXQtMainMenu Search... Søk... Show/hide main menu Vis eller skjul hovedmeny Add to desktop Legg til på skrivebordet Question Spørsmål A file with the same name already exists. Do you want to overwrite it? En fil ved samme navn finnes allerede. Ønsker du å overskrive den? Warning Advarsel The file cannot be overwritten. Filen kan ikke overskrives. Copy Kopier LXQtMainMenuConfiguration General Generelt Main Menu Settings Hovedmenyinnstillinger Icon: Ikon: Button text: Knapptekst: Custom font size: Selvvalgt skriftstørrelse: pt pt Menu file Menyfil Menu file: Menyfil: Search Søk Max. item width: Maks. elementbredde: Show matching entries: Vis matchende oppføringer: Maximum visible items: Maks. synlige elementer: Filter menu entries Filtrer menyoppføringer px px Hide menu entries while searching Skjul menyoppføringer under søk Clear search upon showing menu Tøm søkefelt når menyen vises Keyboard Shortcut Tastatursnarvei Click the button to record shortcut: Klikk knappen for å registrere tastatursnarvei: Reset Nullstill Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Velg ikonfil Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Velg menyfil Menu files (*.menu) Menyfiler (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_nl.desktop.yaml ================================================ Desktop Entry/Name: "Programmamenu" Desktop Entry/Comment: "Een menu met al uw programma's" ================================================ FILE: plugin-mainmenu/translations/mainmenu_nl.ts ================================================ LXQtMainMenu Search... Zoeken… Show/hide main menu Hoofdmenu tonen/verbergen Add to desktop Op bureaublad plaatsen Question Vraag A file with the same name already exists. Do you want to overwrite it? Er is al een bestand met dezelfde naam. Wilt u dit overschrijven? Warning Waarschuwing The file cannot be overwritten. Dit bestand kan niet worden overschreven. Copy Kopiëren LXQtMainMenuConfiguration Main Menu Settings Hoofdmenu-instellingen General Algemeen Icon: Pictogram: Button text: Knoptekst: Custom font size: Aangepaste tekstgrootte: pt pt Menu file Menubestand Menu file: Menubestand: Keyboard Shortcut Sneltoets Click the button to record shortcut: Klik op de knop om de sneltoets vast te leggen: Search Zoeken Max. item width: Maximale itembreedte: Show matching entries: Overeenkomende onderdelen tonen: Maximum visible items: Maximaal aantal getoonde items: Filter menu entries Menu-items filteren px px Hide menu entries while searching Menu-items verbergen tijdens zoeken Clear search upon showing menu Leeg zoekveld tonen als het menu wordt geopend Reset Standaardwaarden Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Bewerk of voeg een snelkoppeling toe voor 'lxqt-qdbus openmenu' in de vensterbeheerderinstellingen van Wayland Choose icon file Kies een pictogrambestand Images (*.svg *.png) Afbeeldingen (*.svg *.png) Choose menu file Kies een menubestand Menu files (*.menu) Menubestanden (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_oc.desktop.yaml ================================================ Desktop Entry/Name: "Menú d’aplicacion" Desktop Entry/Comment: "Un menú de totas las aplicacions" ================================================ FILE: plugin-mainmenu/translations/mainmenu_oc.ts ================================================ LXQtMainMenu Search... Cercar... Show/hide main menu Afichar/Amagar lo menú principal Add to desktop Apondre al burèu Question Question A file with the same name already exists. Do you want to overwrite it? Un fichièr amb aqueste nom existís ja. Lo volètz remplaçar ? Warning Avertiment The file cannot be overwritten. Lo fichièr pòt pas èsser remplaçat. Copy Copiar LXQtMainMenuConfiguration General General Main Menu Settings Paramètres menú principal Icon: Icòna : Button text: Tèxt del boton : Custom font size: Talha de la poliça personalizada : pt pt Menu file Fichièr de menú Menu file: Fichièr de menú : Search Recercar Max. item width: Largor maxi d’una entrada : Show matching entries: Mostrar las entradas correspondentas : Maximum visible items: Nombre maximum d’elements visibles : Filter menu entries Filtrar las entradas de menú px px Hide menu entries while searching Rescondre las entradas del menú pendent la recèrca Clear search upon showing menu Escafar la recèrca quand apareis lo menú Keyboard Shortcut Acorchi de clavièr Click the button to record shortcut: Clicatz lo boton per enregistrar l’acorchi : Reset Reïnicializar Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Causir un fichièr d’icòna Images (*.svg *.png) Imatges (*.svg *.png) Choose menu file Causir un fichièr de menú Menu files (*.menu) Fichièr de menú (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਐਪਲੀਕੇਸ਼ਨ ਮੇਨੂ" Desktop Entry/Comment: "ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦਾ ਮੇਨੂ ਹੈ" ================================================ FILE: plugin-mainmenu/translations/mainmenu_pa.ts ================================================ LXQtMainMenu Search... ਖੋਜੋ... Show/hide main menu ਮੁੱਖ ਮੇਨੂ ਵੇਖਾਓ/ਓਹਲੇ ਕਰੋ Add to desktop ਡੈਸਕਟਾਪ ਵਿੱਚ ਜੋੜੋ Question ਸਵਾਲ A file with the same name already exists. Do you want to overwrite it? ਇਸੇ ਨਾਂ ਨਾਲ ਫਾਇਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂ ਦਹੈ। ਕੀ ਉਸ ਉੱਤੇ ਲਿਖਣਾ ਹੈ? Warning ਸਾਵਧਾਨ The file cannot be overwritten. ਫਾਇਲ ਉੱਤੇ ਲਿਖਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ। Copy ਕਾਪੀ ਕਰੋ LXQtMainMenuConfiguration General ਆਮ Main Menu Settings ਮੁੱਖ ਮੇਨੂ ਸੈਟਿੰਗਾਂ Icon: ਆਈਕਾਨ: Button text: ਬਟਨ ਲਿਖਤ: Custom font size: ਕਸਟਮ ਫ਼ੋਂਟ ਆਕਾਰ: pt ਪੁਆ. Menu file ਮੇਨੂ ਫਾਇਲ Menu file: ਮੇਨੂ ਫਾਇਲ: Search ਖੋਜੋ Max. item width: ਵੱਧ ਤੋਂ ਵੱਧ ਆਈਟਮ ਚੌੜਾਈ: Show matching entries: ਮਿਲਦੀਆਂ ਐਂਟਰੀਆਂ ਵੇਖਾਓ: Maximum visible items: ਵੱਧ ਤੋਂ ਵੱਧ ਦਿਸਣ ਵਾਲੀਆਂ ਆਈਟਮਾਂ: Filter menu entries ਮੇਨੂ ਆਈਟਮਾਂ ਫਿਲਟਰ ਕਰੋ px ਪਿਕਸਲ Hide menu entries while searching ਖੋਜਣ ਦੇ ਦੌਰਾਨ ਮੇਨੂ ਐਂਟਰੀਆਂ ਨੂੰ ਲੁਕਾਓ Clear search upon showing menu ਮੇਨੂ ਵੇਖਾਉਣ ਦੇ ਦੌਰਾਨ ਖੋਜ ਨੂੰ ਮਿਟਾਓ Keyboard Shortcut ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ Click the button to record shortcut: ਸ਼ਾਰਟਕੱਟ ਰਿਕਾਰਡ ਕਰਨ ਦੌਰਾਨ ਬਟਨ ਨੂੰ ਕਲਿੱਕ ਕਰੋ: Reset ਮੁੜ-ਸੈੱਟ ਕਰੋ Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file ਆਈਕਾਨ ਫਾਇਲ ਚੁਣੋ Images (*.svg *.png) ਚਿੱਤਰ (*.svg *.png) Choose menu file ਮੇਨੂ ਫਾਇਲ ਚੁਣੋ Menu files (*.menu) ਮੇਨੂ ਫਾਇਲਾਂ (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_pl.desktop.yaml ================================================ Desktop Entry/Name: "Menu programów" Desktop Entry/Comment: "Menu pozwalające na uruchomienie i wyszukiwanie wszystkich programów" ================================================ FILE: plugin-mainmenu/translations/mainmenu_pl.ts ================================================ LXQtMainMenu Search... Szukaj... Show/hide main menu Pokaż/ukryj menu główne Add to desktop Dodaj do pulpitu Question Pytanie A file with the same name already exists. Do you want to overwrite it? Plik o tej samej nazwie już istnieje. Czy chcesz go nadpisać? Warning Uwaga The file cannot be overwritten. Plik nie może zostać nadpisany. Copy Kopiuj LXQtMainMenuConfiguration General Ogólne Main Menu Settings Ustawienia menu głównego Icon: Ikona: Button text: Tekst przycisku: Custom font size: Własny rozmiar czcionki: pt pt Menu file Plik menu Menu file: Plik menu: Search Wyszukiwanie Max. item width: Maksymalna szerokość elementu: Show matching entries: Pokazuj pasujące elementy: Maximum visible items: Widoczne pozycje (maks.): Filter menu entries Filtruj pozycje menu px px Hide menu entries while searching Ukryj pozycje menu podczas wyszukiwania Clear search upon showing menu Wyczyść wyszukiwanie przed wyświetleniem menu Keyboard Shortcut Skrót klawiatury Click the button to record shortcut: Wciśnij przycisk aby ustawić skrót: Reset Zresetuj Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Zmodyfikuj lub dodaj skrót do „lxqt-qdbus openmenu” w ustawieniach kompozytora w Wayland Choose icon file Wybierz plik ikony Images (*.svg *.png) Obrazy (*.svg *.png) Choose menu file Wybierz plik menu Menu files (*.menu) Pliki menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_pt.desktop.yaml ================================================ Desktop Entry/Name: "Menu de aplicações" Desktop Entry/Comment: "Lançador de aplicações baseado no menu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_pt.ts ================================================ LXQtMainMenu Search... Pesquisar... Show/hide main menu Mostrar/ocultar menu principal Add to desktop Adicionar ao ambiente de trabalho Question Questão A file with the same name already exists. Do you want to overwrite it? Já existe um ficheiro com este nome. Deseja substituir o ficheiro existente? Warning Aviso The file cannot be overwritten. Não foi possível substituir o ficheiro. Copy Copiar LXQtMainMenuConfiguration General Geral Main Menu Settings Definições do Menu principal Icon: Ícone: Button text: Texto do botão: Custom font size: Tipo de letra personalizado: pt pt Menu file Ficheiro de menu Menu file: Ficheiro de menu: Search Pesquisar Max. item width: Largura máxima do item: Show matching entries: Mostrar entradas coincidentes: Maximum visible items: N.º máximo de itens visíveis: Filter menu entries Filtrar entradas de menu px px Hide menu entries while searching Ocultar entradas de menu ao pesquisar Clear search upon showing menu Limpar pesquisa ao mostrar o menu Keyboard Shortcut Atalho de teclado Click the button to record shortcut: Clique no botão para registar o atalho: Reset Repor Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifique ou adicione um atalho para 'lxqt-qdbus openmenu' nas definições do compositor no Wayland Choose icon file Escolher ficheiro de ícone Images (*.svg *.png) Imagens (*.svg *.png) Choose menu file Escolher ficheiro de menu Menu files (*.menu) Ficheiros de menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Menu de aplicativos" Desktop Entry/Comment: "Lançador de aplicativos baseado em menu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_pt_BR.ts ================================================ LXQtMainMenu Search... Pesquisar... Show/hide main menu Exibir/ocultar o menu principal Add to desktop Adicionar à área de trabalho Question Questão A file with the same name already exists. Do you want to overwrite it? Já existe um arquivo com o mesmo nome. Você deseja sobrescrevê-lo? Warning Atenção The file cannot be overwritten. O arquivo não pode ser sobrescrito. Copy Copiar LXQtMainMenuConfiguration General Geral Main Menu Settings Configurações do menu principal Icon: Ícone: Button text: Texto do botão: Custom font size: Tamanho de fonte personalizado: pt pt Menu file Arquivo de menu Menu file: Arquivo de menu: Search Pesquisar Max. item width: Largura máx. do item: Show matching entries: Exibir entradas correspondentes: Maximum visible items: Número máximo de itens: Filter menu entries Filtrar entradas do menu px px Hide menu entries while searching Ocultar entradas do menu enquanto pesquisa Clear search upon showing menu Limpar pesquisa ao mostrar o menu Keyboard Shortcut Atalho de teclado Click the button to record shortcut: Clique no botão para gravar o atalho: Reset Redefinir Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Escolher ícone Images (*.svg *.png) Imagens (*.svg *.png) Choose menu file Escolher arquivo de menu Menu files (*.menu) Arquivos de menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ro_RO.desktop.yaml ================================================ Desktop Entry/Name: "Meniu aplicații" Desktop Entry/Comment: "Lansator de aplicații bazat pe meniuri" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ro_RO.ts ================================================ LXQtMainMenu Search... Cautare ... Show/hide main menu Afișează/Ascunde meniul principal Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General General Main Menu Settings Setari pentru Meniul Principal Icon: Pictograma: Button text: Text pe butoane: Custom font size: Marime font particularizat: pt punct Menu file Fișier meniu Menu file: Fisier meniu: Search Cautare Max. item width: Lățime maxima obiect: Show matching entries: Arata valorile identice: Maximum visible items: Numar maxim de obiecte vizibile: Filter menu entries Intrări pentru meniul Filtre px pixel Hide menu entries while searching Ascunde intrările din meniu în timpul Căutării Clear search upon showing menu Șterge Căutarea când se afișează meniul Keyboard Shortcut Tastă rapidă Click the button to record shortcut: Apăsați butonul pentru a memora tasta rapidă: Reset Resetare Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Alege fisierul pictograma Images (*.svg *.png) Imagini (*.svg *.png) Choose menu file Selectați fișierul meniu Menu files (*.menu) Fișiere meniu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_ru.desktop.yaml ================================================ Desktop Entry/Name: "Меню приложений" Desktop Entry/Comment: "Меню всех ваших программ" ================================================ FILE: plugin-mainmenu/translations/mainmenu_ru.ts ================================================ LXQtMainMenu Search... Найти... Show/hide main menu Показать/скрыть главное меню Add to desktop Добавить на рабочий стол Question Вопрос A file with the same name already exists. Do you want to overwrite it? Файл с тем же именем уже существует. Хотите перезаписать его? Warning Предупреждение The file cannot be overwritten. Файл не может быть перезаписан. Copy Копировать LXQtMainMenuConfiguration Main Menu Settings Настройки Главного Меню General Общие Icon: Значок: Button text: Текст кнопки: Custom font size: Выбрать кегль: pt п Menu file Файл меню Menu file: Файл меню: Search Поиск Max. item width: Макс. ширина элемента: Show matching entries: Показывать совпадающие пункты: Maximum visible items: Макс. видимых элементов: Filter menu entries Фильтровать пункты меню px пикс Hide menu entries while searching Скрыть пункты меню во время поиска Clear search upon showing menu Очищать поле поиска при показе меню Keyboard Shortcut Сочетание клавиш Click the button to record shortcut: Нажмите на кнопку для записи сочетания клавиш: Reset Сброс Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Измените или добавьте ярлык «lxqt-qdbus openmenu» в настройках композитора в Wayland Choose icon file Выберите файл значка Images (*.svg *.png) Изображения (*.svg *.png) Choose menu file Выбрать файл меню Menu files (*.menu) Файл меню (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-mainmenu/translations/mainmenu_si.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sk.desktop.yaml ================================================ Desktop Entry/Name: "Menu aplikácií" Desktop Entry/Comment: "Spúšťanie aplikácií z menu" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sk_SK.ts ================================================ LXQtMainMenu Search... Hľadať... Show/hide main menu Zobraziť/skryť hlavné menu Add to desktop Pridať na plochu Question Otázka A file with the same name already exists. Do you want to overwrite it? Súbor s rovnakým názvom už existuje. Prajete si ho prepísať? Warning Upozornenie The file cannot be overwritten. Súbor nie je možné prepísať. Copy Kopírovať LXQtMainMenuConfiguration General Všeobecné Main Menu Settings Nastavenia hlavného menu Icon: Ikonka: Button text: Text tlačidla: Custom font size: Vlastná veľkosť písma: pt pt Menu file Súbor menu Menu file: Súbor menu: Search Hľadať Max. item width: Max. šírka položiek: Show matching entries: Zobraziť zodpovedajúce položky: Maximum visible items: Maximum viditeľných položiek: Filter menu entries Filtrovať položky menu px px Hide menu entries while searching Pri vyhľadávaní skryť položky menu Clear search upon showing menu Po zobrazení menu vymazať históriu vyhľadávania Keyboard Shortcut Klávesová skratka Click the button to record shortcut: Kliknite na tlačidlo pre uloženie: Reset Vrátiť späť Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Vybrať ikonu súboru Images (*.svg *.png) Obrázky (*.svg *.png) Choose menu file Vybrať súbor menu Menu files (*.menu) Súbory menu (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sl.desktop.yaml ================================================ Desktop Entry/Name: "Programski meni" Desktop Entry/Comment: "Zaganjalnik programov, temelječ na meniju" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sl.ts ================================================ LXQtMainMenu Search... Išči... Show/hide main menu Prikaži/skrij glavni meni Add to desktop Dodaj na namizje Question Vprašanje A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy Kopiraj LXQtMainMenuConfiguration General Splošno Main Menu Settings Nastavitve glavnega menija Icon: Ikona: Button text: Besedilo gumba: Custom font size: Velikost pisave: pt pt Menu file Datoteka z menijskimi vnosi Menu file: Lokacija datoteke: Search Iskanje Max. item width: Maks. širina vnosa: Show matching entries: Prikaz ujemanj iskanja: Maximum visible items: Največje število elementov: Filter menu entries Ne išči po kategorijah px px Hide menu entries while searching Med iskanjem ne kaži kategorij Clear search upon showing menu Počisti iskanje ob vnovičnem odpiranju menija Keyboard Shortcut Tipkovna bližnjica Click the button to record shortcut: Kliknite gumb za nastavitev bližnjice: Reset Ponastavi Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Izberite ikono Images (*.svg *.png) Sličice (*.svg *.png) Choose menu file Izberite datoteko z menijem Menu files (*.menu) Menijske datoteke (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr.desktop.yaml ================================================ Desktop Entry/Name: "Мени програма" Desktop Entry/Comment: "Мени покретача програма" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Мени програма" Desktop Entry/Comment: "Мени покретача програма" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Meni programa" Desktop Entry/Comment: "Meni pokretača programa" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Meni programa" Desktop Entry/Comment: "Meni pokretača programa" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr@latin.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Main Menu Settings Icon: Button text: Custom font size: pt Menu file Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Click the button to record shortcut: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Menu files (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr_BA.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General Опште Main Menu Settings Icon: Button text: Custom font size: pt Menu file Фајл менија Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut Пречица тастатуре Click the button to record shortcut: Кликните на тастер да снимите пречицу: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file Изабери фајл менија Menu files (*.menu) Фајлови менија (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sr_RS.ts ================================================ LXQtMainMenu Search... Претражи... Show/hide main menu Прикажи/сакриј мени Add to desktop Додај на десктоп Question Питање A file with the same name already exists. Do you want to overwrite it? Фајл са истим именом већ постоји. Желиш ли да га препишеш? Warning Упозорење The file cannot be overwritten. Овај фајл не може бити преписан. Copy Копирај LXQtMainMenuConfiguration General Опште Main Menu Settings Поставке главног менија Icon: Икона: Button text: Текст дугмета: Custom font size: Прилагођена величина фонта: pt pt Menu file Фајл менија Menu file: Фајл менија: Search Претражи Max. item width: Максимална ширина предмета: Show matching entries: Прикажи одговарајуће уносе: Maximum visible items: Максимум видљивих ствари: Filter menu entries Филтрирај уносе менија px px Hide menu entries while searching Сакриј уносе менија током претраживања Clear search upon showing menu Обриши претрагу по приказу менија Keyboard Shortcut Пречица тастатуре Click the button to record shortcut: Кликните на дугме да снимите пречицу: Reset Ресет Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Изабери икону фајла Images (*.svg *.png) Слике (*.svg *.png) Choose menu file Изабери фајл менија Menu files (*.menu) Фајлови менија (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_sv.desktop.yaml ================================================ Desktop Entry/Name: "Programmeny" Desktop Entry/Comment: "En meny med alla dina program" ================================================ FILE: plugin-mainmenu/translations/mainmenu_sv.ts ================================================ LXQtMainMenu Search... Sök... Show/hide main menu Visa/dölj huvudmeny Add to desktop Lägg till på skrivbordet Question Fråga A file with the same name already exists. Do you want to overwrite it? Det finns redan en fil med samma namn. Vill du ersätta den? Warning Varning The file cannot be overwritten. Filen kan inte överskrivas. Copy Kopiera LXQtMainMenuConfiguration General Allmänt Main Menu Settings Inställningar för huvudmenyn Icon: Ikon: Button text: Knapptext: Custom font size: Anpassad teckenstorlek: pt pt Menu file Menyfil Menu file: Menyfil: Search Sök Max. item width: Max. bredd på sökresultat: Show matching entries: Visa matchande träffar: Maximum visible items: Max. listade träffar: Filter menu entries Filtrera menyposter px px Hide menu entries while searching Dölj menyposter vid sökning Clear search upon showing menu Töm sökfältet när menyn öppnas Keyboard Shortcut Tangentbordsgenväg Click the button to record shortcut: Tryck på knappen för att registrera kortkommando: Reset Återställ Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Modifera eller lägg till en genväg till 'lxqt-qdbus openmenu' i compositor inställningarna under Wayland Choose icon file Välj en ikon Images (*.svg *.png) Bilder (*.svg *.png) Choose menu file Välj en menyfil Menu files (*.menu) Menyfiler (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_th.desktop.yaml ================================================ Desktop Entry/Name: "เมนูโปรแกรม" Desktop Entry/Comment: "ปุ่มเรียกโปรแกรมพื้นฐานทางเมนู" ================================================ FILE: plugin-mainmenu/translations/mainmenu_th_TH.ts ================================================ LXQtMainMenu Search... Show/hide main menu Add to desktop Question A file with the same name already exists. Do you want to overwrite it? Warning The file cannot be overwritten. Copy LXQtMainMenuConfiguration General ทั่วไป Main Menu Settings Icon: Button text: Custom font size: pt Menu file แฟ้มเมนู Menu file: Search Max. item width: Show matching entries: Maximum visible items: Filter menu entries px Hide menu entries while searching Clear search upon showing menu Keyboard Shortcut ปุ่มลัด Click the button to record shortcut: กดปุ่มที่จะใช้เป็นปุ่มลัด: Reset Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Images (*.svg *.png) Choose menu file เลือกแฟ้มเมนู Menu files (*.menu) แฟ้มเมนู (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_tr.desktop.yaml ================================================ Desktop Entry/Name: "Uygulama menüsü" Desktop Entry/Comment: "Menü temelli uygulama çalıştırıcı" ================================================ FILE: plugin-mainmenu/translations/mainmenu_tr.ts ================================================ LXQtMainMenu Search... Ara... Show/hide main menu Ana menüyü göster/gizle Add to desktop Masaüstüne ekle Question Soru A file with the same name already exists. Do you want to overwrite it? Aynı isimde bir dosya zaten var. Üzerine yazmak ister misin? Warning Uyarı The file cannot be overwritten. Dosyanın üzerine yazılamaz. Copy Kopyala LXQtMainMenuConfiguration General Genel Main Menu Settings Ana Menü ayarları Icon: Simge: Button text: Düğme metni: Custom font size: Özel yazıtipi boyutu: pt pt Menu file Menü dosyası Menu file: Menü dosyası: Search Ara Max. item width: En fazla öge genişliği: Show matching entries: Eşleşen girdileri göster: Maximum visible items: En fazla görünür öge: Filter menu entries Menü girdilerini süz px px Hide menu entries while searching Arama yaparken menü girdilerini gizle Clear search upon showing menu Menüyü gösterdikten sonra aramayı temizle Keyboard Shortcut Klavye Kısayolu Click the button to record shortcut: Kısayolu kaydetmek için düğmeye tıklayın: Reset Sıfırla Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Wayland altındaki kompozitör ayarlarında 'lxqt-qdbus openmenu' kısayolunu değiştirin veya ekleyin Choose icon file Simge dosyasını seç Images (*.svg *.png) Resimler (*.svg *.png) Choose menu file Menü dosyası seç Menu files (*.menu) Menü dosyaları (*.menü) ================================================ FILE: plugin-mainmenu/translations/mainmenu_uk.desktop.yaml ================================================ Desktop Entry/Name: "Меню програм" Desktop Entry/Comment: "Меню з усіма програмами" ================================================ FILE: plugin-mainmenu/translations/mainmenu_uk.ts ================================================ LXQtMainMenu Search... Пошук... Show/hide main menu Показати/сховати головне меню Add to desktop Додати стільницю Question Питання A file with the same name already exists. Do you want to overwrite it? Файл з такою назвою вже існує. Хочете перезаписати його? Warning Попередження The file cannot be overwritten. Файл не можна перезаписати. Copy Копіювати LXQtMainMenuConfiguration General Загальне Main Menu Settings Налаштування головного меню Icon: Піктограма: Button text: Текст кнопки: Custom font size: Власний розмір шрифту: pt pt Menu file Файл меню Menu file: Файл меню: Search Пошук Max. item width: Найбільша довжина елемента: Show matching entries: Показати відповідні входження: Maximum visible items: Показати максимально: Filter menu entries Фільтрувати меню входжень px px Hide menu entries while searching Приховати меню входжень під час пошуку Clear search upon showing menu Очищати пошук перед показом меню Keyboard Shortcut Клавіатурне скорочення Click the button to record shortcut: Натисніть кнопку, щоб змінити клавіатурне скорочення: Reset Скинути Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file Вибрати файл піктограми Images (*.svg *.png) Зображення (*.svg *.png) Choose menu file Оберіть файл меню Menu files (*.menu) Файли меню (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "程序菜单" Desktop Entry/Comment: "基于菜单的程序启动器" ================================================ FILE: plugin-mainmenu/translations/mainmenu_zh_CN.ts ================================================ LXQtMainMenu Search... 搜索... Show/hide main menu 显示/隐藏主菜单 Add to desktop 添加到桌面 Question 问题 A file with the same name already exists. Do you want to overwrite it? 已存在一个同名文件。 您想要覆盖它吗? Warning 警告 The file cannot be overwritten. 该文件无法被覆盖。 Copy 复制 LXQtMainMenuConfiguration General 常规 Main Menu Settings 主菜单设置 Icon: 图标: Button text: 按钮文字: Custom font size: 自定义字体大小: pt Menu file 菜单文件 Menu file: 菜单文件: Search 搜索 Max. item width: 最大物件宽度: Show matching entries: 显示匹配的快捷方式: Maximum visible items: 最大可见项目数: Filter menu entries 过滤菜单快捷方式 px Hide menu entries while searching 搜索时隐藏菜单快捷方式 Clear search upon showing menu 清除显示菜单上的搜索 Keyboard Shortcut 键盘快捷键 Click the button to record shortcut: 单击按钮记录快捷键: Reset 重置 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland Choose icon file 选择图标文件 Images (*.svg *.png) 图像 (*.svg *.png) Choose menu file 选择菜单文件 Menu files (*.menu) 菜单文件 (*.menu) ================================================ FILE: plugin-mainmenu/translations/mainmenu_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "應用程式選單" Desktop Entry/Comment: "全部應用程式的選單" ================================================ FILE: plugin-mainmenu/translations/mainmenu_zh_TW.ts ================================================ LXQtMainMenu Search... 搜尋... Show/hide main menu 顯示/隱藏 主選單 Add to desktop 加到桌面 Question 問題 A file with the same name already exists. Do you want to overwrite it? 已經有同樣名稱的檔案。 確定要覆蓋它嗎? Warning 警告 The file cannot be overwritten. 這個檔案無法被覆蓋。 Copy 複製 LXQtMainMenuConfiguration General 通用 Main Menu Settings 主選單設定 Icon: 圖示: Button text: 按鈕文字: Custom font size: 自訂字型大小: pt 像素 Menu file 選單檔案 Menu file: 選單檔案: Search 搜尋 Max. item width: 最大物件寬度: Show matching entries: 顯示符合項目: Maximum visible items: 最大可見物件: Filter menu entries 篩選選單項目 px 像素 Hide menu entries while searching 搜尋時隱藏選單項目 Clear search upon showing menu 顯示選單時清除搜尋 Keyboard Shortcut 快速鍵 Click the button to record shortcut: 點按按鈕來錄製快速鍵: Reset 重置 Modify or add a shortcut to 'lxqt-qdbus openmenu' in the compositor settings under Wayland 修改或添增快速鍵至 'lxqt-qdbus openmenu" 在 Wayland 下的合成器設定中 Choose icon file 選擇圖示檔案 Images (*.svg *.png) 圖片 (*.svg *.png) Choose menu file 選擇選單文件 Menu files (*.menu) 選單檔案 (*.menu) ================================================ FILE: plugin-mount/CMakeLists.txt ================================================ set(PLUGIN "mount") set(HEADERS lxqtmountplugin.h configuration.h button.h menudiskitem.h popup.h actions/deviceaction.h actions/deviceaction_info.h actions/deviceaction_menu.h actions/deviceaction_nothing.h actions/ejectaction.h actions/ejectaction_optical.h actions/ejectaction_nothing.h ) set(SOURCES lxqtmountplugin.cpp configuration.cpp button.cpp menudiskitem.cpp popup.cpp actions/deviceaction.cpp actions/deviceaction_info.cpp actions/deviceaction_menu.cpp actions/deviceaction_nothing.cpp actions/ejectaction.cpp actions/ejectaction_optical.cpp actions/ejectaction_nothing.cpp ) set(UIS configuration.ui ) find_package(KF6Solid ${QT_MINIMUM_VERSION} REQUIRED) set(LIBRARIES Qt6Xdg lxqt-globalkeys KF6::Solid) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-mount/actions/deviceaction.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "deviceaction.h" #include "deviceaction_info.h" #include "deviceaction_menu.h" #include "deviceaction_nothing.h" #include "../menudiskitem.h" #include "../lxqtmountplugin.h" #include #define ACT_NOTHING "nothing" #define ACT_INFO "showInfo" #define ACT_MENU "showMenu" #define ACT_NOTHING_UPPER QStringLiteral(ACT_NOTHING).toUpper() #define ACT_INFO_UPPER QStringLiteral(ACT_INFO).toUpper() #define ACT_MENU_UPPER QStringLiteral(ACT_MENU).toUpper() DeviceAction::DeviceAction(LXQtMountPlugin *plugin, QObject *parent) : QObject(parent) , mPlugin(plugin) { } DeviceAction::~DeviceAction() = default; DeviceAction *DeviceAction::create(ActionId id, LXQtMountPlugin *plugin, QObject *parent) { switch (id) { case ActionNothing: return new DeviceActionNothing(plugin, parent); case ActionInfo: return new DeviceActionInfo(plugin, parent); case ActionMenu: return new DeviceActionMenu(plugin, parent); } return nullptr; } QString DeviceAction::actionIdToString(DeviceAction::ActionId id) { switch (id) { case ActionNothing: return QStringLiteral(ACT_NOTHING); case ActionInfo: return QStringLiteral(ACT_INFO); case ActionMenu: return QStringLiteral(ACT_MENU); } return QStringLiteral(ACT_INFO); } void DeviceAction::onDeviceAdded(Solid::Device device) { mKnownDeviceDescriptions[device.udi()] = device.description(); doDeviceAdded(device); } void DeviceAction::onDeviceRemoved(Solid::Device device) { doDeviceRemoved(device); mKnownDeviceDescriptions.remove(device.udi()); } DeviceAction::ActionId DeviceAction::stringToActionId(const QString &string, ActionId defaultValue) { QString s = string.toUpper(); if (s == ACT_NOTHING_UPPER) return ActionNothing; if (s == ACT_INFO_UPPER) return ActionInfo; if (s == ACT_MENU_UPPER) return ActionMenu; return defaultValue; } ================================================ FILE: plugin-mount/actions/deviceaction.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_DEVICEACTION_H #define LXQT_PLUGIN_MOUNT_DEVICEACTION_H #include #include #include class LXQtMountPlugin; class DeviceAction: public QObject { Q_OBJECT public: enum ActionId { ActionNothing, ActionInfo, ActionMenu }; virtual ~DeviceAction(); virtual ActionId Type() const throw () = 0; static DeviceAction *create(ActionId id, LXQtMountPlugin *plugin, QObject *parent = nullptr); static ActionId stringToActionId(const QString &string, ActionId defaultValue); static QString actionIdToString(ActionId id); public slots: void onDeviceAdded(Solid::Device device); void onDeviceRemoved(Solid::Device device); protected: explicit DeviceAction(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual void doDeviceAdded(Solid::Device device) = 0; virtual void doDeviceRemoved(Solid::Device device) = 0; LXQtMountPlugin *mPlugin; QMap mKnownDeviceDescriptions; }; #endif // DEVICEACTION_H ================================================ FILE: plugin-mount/actions/deviceaction_info.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "../lxqtmountplugin.h" #include "deviceaction_info.h" #include DeviceActionInfo::DeviceActionInfo(LXQtMountPlugin *plugin, QObject *parent): DeviceAction(plugin, parent) { } void DeviceActionInfo::doDeviceAdded(Solid::Device device) { showMessage(tr("The device \"%1\" is connected.").arg(device.description())); } void DeviceActionInfo::doDeviceRemoved(Solid::Device device) { showMessage(tr("The device \"%1\" is removed.").arg(device.description().isEmpty() ? mKnownDeviceDescriptions[device.udi()] : device.description())); } void DeviceActionInfo::showMessage(const QString &text) { LXQt::Notification::notify(tr("Removable media/devices manager"), text, mPlugin->icon().name()); } ================================================ FILE: plugin-mount/actions/deviceaction_info.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_DEVICEACTION_INFO_H #define LXQT_PLUGIN_MOUNT_DEVICEACTION_INFO_H #include "deviceaction.h" #include #include class Popup; class DeviceActionInfo : public DeviceAction { Q_OBJECT public: explicit DeviceActionInfo(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual ActionId Type() const throw () { return ActionInfo; } protected: void doDeviceAdded(Solid::Device device); void doDeviceRemoved(Solid::Device device); private: void showMessage(const QString &text); }; #endif // DEVICEACTION_INFO_H ================================================ FILE: plugin-mount/actions/deviceaction_menu.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "deviceaction_menu.h" #include "../lxqtmountplugin.h" #include "../popup.h" DeviceActionMenu::DeviceActionMenu(LXQtMountPlugin *plugin, QObject *parent): DeviceAction(plugin, parent) { mPopup = plugin->popup(); mHideTimer.setSingleShot(true); mHideTimer.setInterval(5000); connect(&mHideTimer, &QTimer::timeout, mPopup, &Popup::hide); } void DeviceActionMenu::doDeviceAdded(Solid::Device /*device*/) { mHideTimer.start(); mPopup->show(); } void DeviceActionMenu::doDeviceRemoved(Solid::Device /*device*/) { } ================================================ FILE: plugin-mount/actions/deviceaction_menu.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_DEVICEACTION_MENU_H #define LXQT_PLUGIN_MOUNT_DEVICEACTION_MENU_H #include "deviceaction.h" #include #include class Popup; class DeviceActionMenu : public DeviceAction { Q_OBJECT public: explicit DeviceActionMenu(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual ActionId Type() const throw () { return ActionMenu; } protected: void doDeviceAdded(Solid::Device device); void doDeviceRemoved(Solid::Device device); private: Popup *mPopup; QTimer mHideTimer; }; #endif // DEVICEACTIONMENU_H ================================================ FILE: plugin-mount/actions/deviceaction_nothing.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "deviceaction_nothing.h" DeviceActionNothing::DeviceActionNothing(LXQtMountPlugin *plugin, QObject *parent): DeviceAction(plugin, parent) { } void DeviceActionNothing::doDeviceAdded(Solid::Device /*device*/) { } void DeviceActionNothing::doDeviceRemoved(Solid::Device /*device*/) { } ================================================ FILE: plugin-mount/actions/deviceaction_nothing.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_DEVICEACTION_NOTHING_H #define LXQT_PLUGIN_MOUNT_DEVICEACTION_NOTHING_H #include "deviceaction.h" #include class DeviceActionNothing : public DeviceAction { Q_OBJECT public: explicit DeviceActionNothing(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual ActionId Type() const throw () { return ActionNothing; }; protected: void doDeviceAdded(Solid::Device device); void doDeviceRemoved(Solid::Device device); }; #endif // DEVICEACTIONNOTHING_H ================================================ FILE: plugin-mount/actions/ejectaction.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "ejectaction.h" #include "ejectaction_nothing.h" #include "ejectaction_optical.h" #include "../lxqtmountplugin.h" #define ACT_NOTHING "nothing" #define ACT_EJECT_OPTICAL "ejectOpticalDrives" #define ACT_NOTHING_UPPER QStringLiteral(ACT_NOTHING).toUpper() #define ACT_EJECT_OPTICAL_UPPER QStringLiteral(ACT_EJECT_OPTICAL).toUpper() EjectAction::EjectAction(LXQtMountPlugin *plugin, QObject *parent) : QObject(parent) , mPlugin(plugin) { } EjectAction::~EjectAction() = default; EjectAction *EjectAction::create(ActionId id, LXQtMountPlugin *plugin, QObject *parent) { switch (id) { case ActionNothing: return new EjectActionNothing(plugin, parent); case ActionOptical: return new EjectActionOptical(plugin, parent); } return nullptr; } QString EjectAction::actionIdToString(EjectAction::ActionId id) { switch (id) { case ActionNothing: return QStringLiteral(ACT_NOTHING); case ActionOptical: return QStringLiteral(ACT_EJECT_OPTICAL); } return QStringLiteral(ACT_NOTHING); } void EjectAction::onEjectPressed(void) { doEjectPressed(); } EjectAction::ActionId EjectAction::stringToActionId(const QString &string, ActionId defaultValue) { QString s = string.toUpper(); if (s == ACT_NOTHING_UPPER) return ActionNothing; if (s == ACT_EJECT_OPTICAL_UPPER) return ActionOptical; return defaultValue; } ================================================ FILE: plugin-mount/actions/ejectaction.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_EJECTACTION_H #define LXQT_PLUGIN_MOUNT_EJECTACTION_H #include #include #include class LXQtMountPlugin; class EjectAction: public QObject { Q_OBJECT public: enum ActionId { ActionNothing, ActionOptical }; virtual ~EjectAction(); virtual ActionId Type() const throw () = 0; static EjectAction *create(ActionId id, LXQtMountPlugin *plugin, QObject *parent = nullptr); static ActionId stringToActionId(const QString &string, ActionId defaultValue); static QString actionIdToString(ActionId id); public slots: void onEjectPressed(void); protected: explicit EjectAction(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual void doEjectPressed() = 0; LXQtMountPlugin *mPlugin; }; #endif // EJECTACTION_H ================================================ FILE: plugin-mount/actions/ejectaction_nothing.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "ejectaction_nothing.h" EjectActionNothing::EjectActionNothing(LXQtMountPlugin *plugin, QObject *parent): EjectAction(plugin, parent) { } void EjectActionNothing::doEjectPressed(void) { } ================================================ FILE: plugin-mount/actions/ejectaction_nothing.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_EJECTACTION_NOTHING_H #define LXQT_PLUGIN_MOUNT_EJECTACTION_NOTHING_H #include "ejectaction.h" #include class EjectActionNothing : public EjectAction { Q_OBJECT public: explicit EjectActionNothing(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual ActionId Type() const throw () { return ActionNothing; }; protected: void doEjectPressed(void); }; #endif // EJECTACTION_NOTHING_H ================================================ FILE: plugin-mount/actions/ejectaction_optical.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "../lxqtmountplugin.h" #include "ejectaction_optical.h" #include #include #include #include #include //#include EjectActionOptical::EjectActionOptical(LXQtMountPlugin *plugin, QObject *parent): EjectAction(plugin, parent) { } void EjectActionOptical::doEjectPressed(void) { for (const Solid::Device& device : Solid::Device::listFromType(Solid::DeviceInterface::OpticalDrive)) { Solid::Device it; if (device.isValid()) { it = device; //qDebug() << "device : " << it.udi() << "\n"; // search for parent drive for (; !it.udi().isEmpty(); it = it.parent()) if (it.is()) it.as()->eject(); } } LXQt::Notification::notify(tr("Removable media/devices manager"), tr("Ejected all optical drives"), mPlugin->icon().name()); } ================================================ FILE: plugin-mount/actions/ejectaction_optical.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * Authors: * Oleksandr Ostrenko * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_EJECTACTION_OPTICAL_H #define LXQT_PLUGIN_MOUNT_EJECTACTION_OPTICAL_H #include "ejectaction.h" #include class EjectActionOptical : public EjectAction { Q_OBJECT public: explicit EjectActionOptical(LXQtMountPlugin *plugin, QObject *parent = nullptr); virtual ActionId Type() const throw () { return ActionOptical; } protected: void doEjectPressed(void); }; #endif // EJECTACTION_OPTICAL_H ================================================ FILE: plugin-mount/button.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "button.h" #include Button::Button(QWidget * parent) : QToolButton(parent) { //Note: don't use the QStringLiteral here as it is causing a SEGFAULT in static finalization time //(the string is released upon our *.so removal, but the reference is still in held in libqtxdg...) setIcon(XdgIcon::fromTheme(QLatin1String("drive-removable-media"))); setToolTip(tr("Removable media/devices manager")); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setAutoRaise(true); } Button::~Button() = default; ================================================ FILE: plugin-mount/button.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_BUTTON_H #define LXQT_PLUGIN_MOUNT_BUTTON_H #include class Button : public QToolButton { Q_OBJECT public: Button(QWidget *parent = nullptr); ~Button(); }; #endif ================================================ FILE: plugin-mount/configuration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "configuration.h" #include "ui_configuration.h" #include #include Configuration::Configuration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::Configuration), mLockSettingChanges(false) { ui->setupUi(this); // Set size policies QSizePolicy sp = ui->devAddedLabel->sizePolicy(); sp.setHorizontalStretch(1); ui->devAddedLabel->setSizePolicy(sp); sp = ui->devAddedCombo->sizePolicy(); sp.setHorizontalStretch(1); ui->devAddedCombo->setSizePolicy(sp); sp = ui->ejectPressedLabel->sizePolicy(); sp.setHorizontalStretch(1); ui->ejectPressedLabel->setSizePolicy(sp); sp = ui->ejectPressedCombo->sizePolicy(); sp.setHorizontalStretch(1); ui->ejectPressedCombo->setSizePolicy(sp); // Fill combo boxes if (QGuiApplication::platformName() != QStringLiteral("wayland")) { // WARNING: The popup menu does not work consistently under Wayland. // See LXQtMountPlugin::settingsChanged() for an explanation. ui->devAddedCombo->addItem(tr("Popup menu"), QLatin1String(ACT_SHOW_MENU)); } ui->devAddedCombo->addItem(tr("Show info"), QLatin1String(ACT_SHOW_INFO)); ui->devAddedCombo->addItem(tr("Do nothing"), QLatin1String(ACT_NOTHING)); ui->ejectPressedCombo->addItem(tr("Do nothing"), QLatin1String(ACT_NOTHING)); ui->ejectPressedCombo->addItem(tr("Eject All Optical Drives"), QLatin1String(ACT_EJECT_OPTICAL)); adjustSize(); loadSettings(); connect(ui->devAddedCombo, static_cast(&QComboBox::currentIndexChanged), this, &Configuration::devAddedChanged); connect(ui->ejectPressedCombo, static_cast(&QComboBox::currentIndexChanged), this, &Configuration::ejectPressedChanged); connect(ui->buttons, &QDialogButtonBox::clicked, this, &Configuration::dialogButtonsAction); } Configuration::~Configuration() { delete ui; } void Configuration::loadSettings() { mLockSettingChanges = true; int defaultIndex = QGuiApplication::platformName() == QStringLiteral("wayland") ? 0 : 1; QVariant value = settings().value(QLatin1String(CFG_KEY_ACTION), QLatin1String(ACT_SHOW_INFO)); setComboboxIndexByData(ui->devAddedCombo, value, defaultIndex); value = settings().value(QLatin1String(CFG_EJECT_ACTION), QLatin1String(ACT_NOTHING)); setComboboxIndexByData(ui->ejectPressedCombo, value, defaultIndex); mLockSettingChanges = false; } void Configuration::devAddedChanged(int index) { if (!mLockSettingChanges) { QString s = ui->devAddedCombo->itemData(index).toString(); settings().setValue(QLatin1String(CFG_KEY_ACTION), s); } } void Configuration::ejectPressedChanged(int index) { if (!mLockSettingChanges) { QString s = ui->ejectPressedCombo->itemData(index).toString(); settings().setValue(QLatin1String(CFG_EJECT_ACTION), s); } } ================================================ FILE: plugin-mount/configuration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_CONFIGURATION_H #define LXQT_PLUGIN_MOUNT_CONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #define CFG_KEY_ACTION "newDeviceAction" #define CFG_EJECT_ACTION "ejectAction" #define ACT_SHOW_MENU "showMenu" #define ACT_SHOW_INFO "showInfo" #define ACT_NOTHING "nothing" #define ACT_EJECT_OPTICAL "ejectOpticalDrives" namespace Ui { class Configuration; } class Configuration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit Configuration(PluginSettings *settings, QWidget *parent = nullptr); ~Configuration(); protected slots: virtual void loadSettings(); void devAddedChanged(int index); void ejectPressedChanged(int index); private: Ui::Configuration *ui; bool mLockSettingChanges; }; #endif // LXQTMOUNTCONFIGURATION_H ================================================ FILE: plugin-mount/configuration.ui ================================================ Configuration 0 0 607 170 Removable Media Settings Behavior QFormLayout::AllNonFixedFieldsGrow Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Qt::Vertical 10 10 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() Configuration accept() buttons rejected() Configuration reject() ================================================ FILE: plugin-mount/lxqtmountplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "lxqtmountplugin.h" #include "configuration.h" #include #include #include #define DEFAULT_EJECT_SHORTCUT "XF86Eject" LXQtMountPlugin::LXQtMountPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mPopup(nullptr), mDeviceAction(nullptr), mEjectAction(nullptr), mKeyEject(nullptr) { mButton = new Button; mPopup = new Popup(this); connect(mButton, &QToolButton::clicked, mPopup, &Popup::showHide); connect(mPopup, &Popup::visibilityChanged, mButton, &QToolButton::setDown); // Note: postpone creation of the mDeviceAction to not fire it in startup time QTimer::singleShot(0, this, &LXQtMountPlugin::settingsChanged); } LXQtMountPlugin::~LXQtMountPlugin() { delete mButton; delete mPopup; } void LXQtMountPlugin::shortcutRegistered() { GlobalKeyShortcut::Action * const shortcut = qobject_cast(sender()); if (shortcut == mKeyEject) { disconnect(mKeyEject, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtMountPlugin::shortcutRegistered); if (mKeyEject->shortcut().isEmpty()) { mKeyEject->changeShortcut(QStringLiteral(DEFAULT_EJECT_SHORTCUT)); if (mKeyEject->shortcut().isEmpty()) { // QString errorMsg = tr("Failed to register shortcut \"%1\""); // errorMsg = errorMsg.arg(DEFAULT_EJECT_SHORTCUT); // LXQt::Notification::notify(tr("Removable media/devices manager"), errorMsg, "media-eject"); LXQt::Notification::notify(tr("Removable media/devices manager: Global shortcut '%1' cannot be registered").arg(QStringLiteral(DEFAULT_EJECT_SHORTCUT))); } } } } QDialog *LXQtMountPlugin::configureDialog() { if (mPopup) mPopup->hide(); Configuration *configWindow = new Configuration(settings()); configWindow->setAttribute(Qt::WA_DeleteOnClose, true); return configWindow; } void LXQtMountPlugin::realign() { //nothing to do } void LXQtMountPlugin::settingsChanged() { QString s = settings()->value(QLatin1String(CFG_KEY_ACTION)).toString(); DeviceAction::ActionId devActionId = DeviceAction::stringToActionId(s, DeviceAction::ActionMenu); if (devActionId == DeviceAction::ActionMenu && QGuiApplication::platformName() == QStringLiteral("wayland")) { // WARNING: Wayland considers the popup as a standalone window until the first input // interaction happens with the panel. To avoid this inconsistent behavior, the // automatic showing of the popup is disabled on Wayland. devActionId = DeviceAction::ActionInfo; } if (mDeviceAction == nullptr || mDeviceAction->Type() != devActionId) { delete mDeviceAction; mDeviceAction = DeviceAction::create(devActionId, this, this); connect(mPopup, &Popup::deviceAdded, mDeviceAction, &DeviceAction::onDeviceAdded); connect(mPopup, &Popup::deviceRemoved, mDeviceAction, &DeviceAction::onDeviceRemoved); } if(mKeyEject == nullptr) { mKeyEject = GlobalKeyShortcut::Client::instance()->addAction(QString(), QStringLiteral("/panel/%1/eject").arg(settings()->group()), tr("Eject removable media"), this); if(mKeyEject) { connect(mKeyEject, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtMountPlugin::shortcutRegistered); } } s = settings()->value(QLatin1String(CFG_EJECT_ACTION)).toString(); EjectAction::ActionId ejActionId = EjectAction::stringToActionId(s, EjectAction::ActionNothing); if ((mEjectAction == nullptr || mEjectAction->Type() != ejActionId) && mKeyEject) { if(mEjectAction) mKeyEject->disconnect(mEjectAction); delete mEjectAction; mEjectAction = EjectAction::create(ejActionId, this, this); connect(mKeyEject, &GlobalKeyShortcut::Action::activated, mEjectAction, &EjectAction::onEjectPressed); } } ================================================ FILE: plugin-mount/lxqtmountplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTMOUNTPLUGIN_H #define LXQTMOUNTPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include "../panel/lxqtpanel.h" #include "button.h" #include "popup.h" #include "actions/deviceaction.h" #include "actions/ejectaction.h" #include namespace GlobalKeyShortcut { class Action; } /*! \author Petr Vanek */ class LXQtMountPlugin : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtMountPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtMountPlugin(); virtual QWidget *widget() { return mButton; } virtual QString themeId() const { return QLatin1String("LXQtMount"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } Popup *popup() { return mPopup; } QIcon icon() { return mButton->icon(); }; QDialog *configureDialog(); public slots: void realign(); protected slots: virtual void settingsChanged(); void shortcutRegistered(); private: Button *mButton; Popup *mPopup; DeviceAction *mDeviceAction; EjectAction *mEjectAction; GlobalKeyShortcut::Action *mKeyEject; }; class LXQtMountPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtMountPlugin(startupInfo); } }; #endif ================================================ FILE: plugin-mount/menudiskitem.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "menudiskitem.h" #include "popup.h" #include #include #include #include #include #include #include #include #include #include MenuDiskItem::MenuDiskItem(Solid::Device device, Popup *popup): QFrame(popup), mPopup(popup), mDevice(device), mDiskButton(nullptr), mEjectButton(nullptr), mDiskButtonClicked(false), mEjectButtonClicked(false) { Solid::StorageAccess * const iface = device.as(); Q_ASSERT(nullptr != iface); mDiskButton = new QToolButton(this); mDiskButton->setObjectName(QStringLiteral("DiskButton")); mDiskButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mDiskButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); connect(mDiskButton, &QToolButton::clicked, this, &MenuDiskItem::diskButtonClicked); mEjectButton = new QToolButton(this); mEjectButton->setObjectName(QStringLiteral("EjectButton")); mEjectButton->setIcon(XdgIcon::fromTheme(QStringLiteral("media-eject"))); connect(mEjectButton, &QToolButton::clicked, this, &MenuDiskItem::ejectButtonClicked); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(mDiskButton); layout->addWidget(mEjectButton); layout->setContentsMargins(QMargins()); layout->setSpacing(0); setLayout(layout); connect(iface, &Solid::StorageAccess::setupDone, this, &MenuDiskItem::onMounted); connect(iface, &Solid::StorageAccess::teardownDone, this, &MenuDiskItem::onUnmounted); connect(iface, &Solid::StorageAccess::accessibilityChanged, this, [this] (bool /*accessible*/, QString const &) { updateMountStatus(); }); updateMountStatus(); } MenuDiskItem::~MenuDiskItem() = default; void MenuDiskItem::setMountStatus() { if (mDevice.isValid()) { mEjectButton->setEnabled(mDevice.as()->isAccessible() || !opticalParent().udi().isEmpty()); } } void MenuDiskItem::updateMountStatus() { //Note: don't use the QStringLiteral here as it is causing a SEGFAULT in static finalization time //(the string is released upon our *.so removal, but the reference is still in held in libqtxdg...) static const QIcon icon = XdgIcon::fromTheme(mDevice.icon(), QLatin1String("drive-removable-media")); if (mDevice.isValid()) { mDiskButton->setIcon(icon); mDiskButton->setText(mDevice.description()); setMountStatus(); } else emit invalid(mDevice.udi()); } Solid::Device MenuDiskItem::opticalParent() const { Solid::Device it; if (mDevice.isValid()) { it = mDevice; // search for parent drive for (; !it.udi().isEmpty(); it = it.parent()) if (it.is()) break; } return it; } void MenuDiskItem::diskButtonClicked() { mDiskButtonClicked = true; Solid::StorageAccess* di = mDevice.as(); if (!di->isAccessible()) di->setup(); else onMounted(Solid::NoError, QString(), mDevice.udi()); mPopup->hide(); } void MenuDiskItem::ejectButtonClicked() { mEjectButtonClicked = true; Solid::StorageAccess* di = mDevice.as(); if (di->isAccessible()) di->teardown(); else onUnmounted(Solid::NoError, QString(), mDevice.udi()); mPopup->hide(); } void MenuDiskItem::onMounted(Solid::ErrorType error, QVariant resultData, const QString & /*udi*/) { if (mDiskButtonClicked) { mDiskButtonClicked = false; if (Solid::NoError == error) QDesktopServices::openUrl(QUrl(mDevice.as()->filePath())); else { QString errorMsg = tr("Mounting of \"%1\" failed: %2"); errorMsg = errorMsg.arg(mDevice.description(), resultData.toString()); LXQt::Notification::notify(tr("Removable media/devices manager"), errorMsg, mDevice.icon()); } } } void MenuDiskItem::onUnmounted(Solid::ErrorType error, QVariant resultData, const QString & /*udi*/) { if (mEjectButtonClicked) { mEjectButtonClicked = false; if (Solid::NoError == error) { Solid::Device opt_parent = opticalParent(); if (!opt_parent.udi().isEmpty()) opt_parent.as()->eject(); } else { QString errorMsg = tr("Unmounting of \"%1\" failed: %2"); errorMsg = errorMsg.arg(mDevice.description(), resultData.toString()); LXQt::Notification::notify(tr("Removable media/devices manager"), errorMsg, mDevice.icon()); } } } ================================================ FILE: plugin-mount/menudiskitem.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_MENUDISKITEM_H #define LXQT_PLUGIN_MOUNT_MENUDISKITEM_H #include #include #include #include class Popup; class MenuDiskItem : public QFrame { Q_OBJECT public: explicit MenuDiskItem(Solid::Device device, Popup *popup); ~MenuDiskItem(); QString deviceUdi() const { return mDevice.udi(); } void setMountStatus(); private: void updateMountStatus(); Solid::Device opticalParent() const; signals: void invalid(QString const & udi); private slots: void diskButtonClicked(); void ejectButtonClicked(); void onMounted(Solid::ErrorType error, QVariant resultData, const QString &udi); void onUnmounted(Solid::ErrorType error, QVariant resultData, const QString &udi); private: Popup *mPopup; Solid::Device mDevice; QToolButton *mDiskButton; QToolButton *mEjectButton; bool mDiskButtonClicked; bool mEjectButtonClicked; }; #endif // MENUDISKITEM_H ================================================ FILE: plugin-mount/popup.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011-2013 Razor team * Authors: * Petr Vanek * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "popup.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include // Paulo: I'm not sure what this is for static bool hasRemovableParent(Solid::Device device) { // qDebug() << "access:" << device.udi(); for ( ; !device.udi().isEmpty(); device = device.parent()) { Solid::StorageDrive* drive = device.as(); if (drive && drive->isRemovable()) { // qDebug() << "removable parent drive:" << device.udi(); return true; } } return false; } Popup::Popup(ILXQtPanelPlugin * plugin, QWidget* parent): QDialog(parent, Qt::Window | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint), mPlugin(plugin), mPlaceholder(nullptr), mDisplayCount(0) { setObjectName(QStringLiteral("LXQtMountPopup")); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setLayout(new QVBoxLayout(this)); layout()->setContentsMargins(QMargins()); setAttribute(Qt::WA_AlwaysShowToolTips); mPlaceholder = new QLabel(tr("No devices are available"), this); mPlaceholder->setObjectName(QStringLiteral("NoDiskLabel")); layout()->addWidget(mPlaceholder); //Perform the potential long time operation after object construction //Note: can't use QTimer::singleShot with lambda in pre QT 5.4 code QTimer * aux_timer = new QTimer; connect(aux_timer, &QTimer::timeout, this, [this, aux_timer] { delete aux_timer; //cleanup const auto devices = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess); for (const Solid::Device& device : devices) if (hasRemovableParent(device)) addItem(device); }); aux_timer->setSingleShot(true); aux_timer->start(0); connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, this, &Popup::onDeviceAdded); connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, this, &Popup::onDeviceRemoved); } void Popup::showHide() { if (isHidden()) { mPlugin->willShowWindow(this); show(); } else close(); } void Popup::onDeviceAdded(QString const & udi) { Solid::Device device(udi); if (device.is() && hasRemovableParent(device)) addItem(device); } void Popup::onDeviceRemoved(QString const & udi) { MenuDiskItem* item = nullptr; const int size = layout()->count() - 1; for (int i = size; 0 <= i; --i) { QWidget *w = layout()->itemAt(i)->widget(); if (w == mPlaceholder) continue; MenuDiskItem *it = static_cast(w); if (udi == it->deviceUdi()) { item = it; break; } } if (item != nullptr) { layout()->removeWidget(item); item->deleteLater(); --mDisplayCount; if (mDisplayCount == 0) mPlaceholder->show(); emit deviceRemoved(Solid::Device{udi}); } } void Popup::showEvent(QShowEvent *event) { // NOTE: This is a workaround for the lack of "Solid::StorageAccess::accessibilityChanged" // when an encrypted volume is mounted by GLib/GIO. const int size = layout()->count() - 1; for (int i = size; 0 <= i; --i) { QWidget *w = layout()->itemAt(i)->widget(); if (w == mPlaceholder) continue; if (MenuDiskItem *it = static_cast(w)) { it->setMountStatus(); } } mPlaceholder->setVisible(mDisplayCount == 0); realign(); setFocus(); activateWindow(); QWidget::showEvent(event); emit visibilityChanged(true); } void Popup::hideEvent(QHideEvent *event) { QWidget::hideEvent(event); emit visibilityChanged(false); } void Popup::addItem(Solid::Device device) { MenuDiskItem *item = new MenuDiskItem(device, this); connect(item, &MenuDiskItem::invalid, this, &Popup::onDeviceRemoved); item->setVisible(true); layout()->addWidget(item); mDisplayCount++; if (mDisplayCount != 0) mPlaceholder->hide(); if (isVisible()) realign(); emit deviceAdded(device); } void Popup::realign() { adjustSize(); setGeometry(mPlugin->calculatePopupWindowPos(sizeHint())); } ================================================ FILE: plugin-mount/popup.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011-2013 Razor team * Authors: * Petr Vanek * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PLUGIN_MOUNT_POPUP_H #define LXQT_PLUGIN_MOUNT_POPUP_H #include "menudiskitem.h" #include #include #include class ILXQtPanelPlugin; class Popup: public QDialog { Q_OBJECT public: explicit Popup(ILXQtPanelPlugin * plugin, QWidget* parent = nullptr); void realign(); public slots: void showHide(); private slots: void onDeviceAdded(QString const & udi); void onDeviceRemoved(QString const & udi); signals: void visibilityChanged(bool visible); /*! * \brief Signal emitted when new device added into the popup * (device which we are interested in) */ void deviceAdded(Solid::Device device); /*! * \brief Signal emitted when device is removed from the popup * (device which we are interested in) */ void deviceRemoved(Solid::Device device); protected: void showEvent(QShowEvent *event); void hideEvent(QHideEvent *event); private: ILXQtPanelPlugin * mPlugin; QLabel *mPlaceholder; int mDisplayCount; void addItem(Solid::Device device); }; #endif // POPUP_H ================================================ FILE: plugin-mount/resources/mount.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=drive-removable-media #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-mount/translations/mount.desktop.yaml ================================================ Desktop Entry/Name: "Removable Media" Desktop Entry/Comment: "Easy mounting and unmounting of USB and optical drives" ================================================ FILE: plugin-mount/translations/mount.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_ar.desktop.yaml ================================================ Desktop Entry/Name: "الوسائط المنفصلة" Desktop Entry/Comment: "لضمّ أو إزالة ضمّ أصابع USB أو الأجهزة البصريّة" ================================================ FILE: plugin-mount/translations/mount_ar.ts ================================================ Button Removable media/devices manager مدير الأجهزة/الوسائط المنفصلة Configuration Removable Media Settings إعدادات الوسيط المنفصل Behavior السلوك When a device is connected: عند توصيل جهاز: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html> <head/> <body> <p> قم بتشغيل الإجراء التالي عند الضغط على اختصار الإخراج (<span style = "font-weight: 600؛"> XF86Eject </span> افتراضيًا) </p> </body> </html> When eject button is pressed: عند الضغط على زر الإخراج: Popup menu أبثِق قائمة Show info اعرض معلوماته Do nothing لا تفعل شيئا Eject All Optical Drives أخرج جميع محركات الأقراص الضوئية DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. وُصل الجهاز <b><nobr>”%1“</nobr></b>. The device <b><nobr>"%1"</nobr></b> is removed. أُزيل الجهاز <b><nobr>”%1“</nobr></b>. Removable media/devices manager مدير الأجهزة/الوسائط المنفصلة EjectActionOptical Removable media/devices manager مدير الأجهزة/الوسائط المنفصلة Ejected all optical drives أخرج جميع محركات الأقراص الضوئية LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered إدارة الوسائط / الأجهزة القابلة للإزالة: لا يمكن تسجيل الاختصار العام '%1' Eject removable media إخراج الوسائط القابلة للإزالة MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 فشل ضمّ <b><nobr>”%1“</nobr></b>:‏ %2 Removable media/devices manager مدير الأجهزة/الوسائط المنفصلة Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 فشل إلغاء ضمّ <strong><nobr>”%1“</nobr></strong>:‏ %2 Popup No devices are available لا أجهزة متوفرة ================================================ FILE: plugin-mount/translations/mount_arn.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_ast.ts ================================================ Button Removable media/devices manager Xestor de preseos/medios estrayibles Configuration Removable Media Settings Axustes de medios estrayibles Behavior Comportamientu When a device is connected: Al coneutar un preséu: Popup menu Amosar un menú emerxente Show info Amosar la información Do nothing Nun facer nada DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Coneutóse'l preséu <b><nobr>«%1»</nobr></b>. The device <b><nobr>"%1"</nobr></b> is removed. Estráxose'l preséu <b><nobr>«%1»</nobr></b>. Removable media/devices manager Xestor de preseos/medios estrayibles MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 El montaxe de <b><nobr>«%1»</nobr></b> falló: %2 Removable media/devices manager Xestor de preseos/medios estrayibles Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 El desmontaxe de <strong><nobr>«%1»</nobr></strong> falló: %2 Popup No devices are available Nun hai preseos disponibles ================================================ FILE: plugin-mount/translations/mount_bg.desktop.yaml ================================================ Desktop Entry/Name: "Сменяеми устройства" Desktop Entry/Comment: "Лесно монтиране и демонтиране на USB и оптични устройства" ================================================ FILE: plugin-mount/translations/mount_bg.ts ================================================ Button Removable media/devices manager Управление на сменяеми устройства и носители Configuration Removable Media Settings Настройки на сменяеми устройства Behavior Поведение When a device is connected: При свързване на устройство: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Изпълняване на следното действие при натискане на иконата за изваждане е натисната (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: При натискане на бутона за извеждане на устройство: Popup menu Изскачащо меню Show info Показване на информация Do nothing Без извършване на действие Eject All Optical Drives Извеждане на всички оптични устройства DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Устройство <b><nobr>"%1"</nobr></b> е свързано. The device <b><nobr>"%1"</nobr></b> is removed. Устройство <b><nobr>"%1"</nobr></b> е премахнато. Removable media/devices manager Управление на сменяеми устройства и носители EjectActionOptical Removable media/devices manager Управление на сменяеми устройства и носители Ejected all optical drives Всички оптични устройства са извадени LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Управление на сменяеми устройства: Комбинация '%1' не може да се регистрира Eject removable media Изваждане на сменяем носител MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Монтиране на <b><nobr>"%1"</nobr></b> неуспешно: %2 Removable media/devices manager Управление на сменяеми устройства Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Демонтиране на <b><nobr>"%1"</nobr></b> неуспешно: %2 Popup No devices are available Не са налични устройства ================================================ FILE: plugin-mount/translations/mount_ca.desktop.yaml ================================================ Desktop Entry/Name: "Mitjans extraïbles" Desktop Entry/Comment: "Muntatge i desmuntatge fàcil d'unitats USB i òptiques" ================================================ FILE: plugin-mount/translations/mount_ca.ts ================================================ Button Removable media/devices manager Gestor de mitjans/dispositius extraïbles Configuration Removable Media Settings Ajusts dels mitjans extraïbles Behavior Comportament When a device is connected: Quan es connecta un dispositiu: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Activa l'acció següent quan es prem la drecera d'expulsió(<span style=" font-weight:600;">XF86Eject</span>per defecte)</p></body></html> When eject button is pressed: Quan es prem el botó d'expulsió: Popup menu Menú emergent Show info Mostra la informació Do nothing No facis res Eject All Optical Drives Expulsa totes les unitats òptiques DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. El dispositiu <b><nobr>"%1"</nobr></b> està connectat. The device <b><nobr>"%1"</nobr></b> is removed. El dispositiu <b><nobr>"%1"</nobr></b> està extret. Removable media/devices manager Gestor de mitjans/dispositius extraïbles EjectActionOptical Removable media/devices manager Gestor de mitjans/dispositius extraïbles Ejected all optical drives S'han expulsat totes les unitats òptiques LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestor de mitjans o dispositius extraïbles: no es pot registrar la drecera global '%1' Eject removable media Expulsa els suports extraïbles MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 El muntatge de <b><nobr>"%1"</nobr></b> ha fallat: %2 Removable media/devices manager Gestor de mitjans/dispositius extraïbles Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 El desmuntatge de <strong><nobr>"%1"</nobr></strong> ha fallat: %2 Popup No devices are available No hi ha disponible cap dispositiu ================================================ FILE: plugin-mount/translations/mount_cs.desktop.yaml ================================================ Desktop Entry/Name: "Vyjímatelná média" Desktop Entry/Comment: "Správa vyjímatelných úložných zařízení (USB, optických, …)" ================================================ FILE: plugin-mount/translations/mount_cs.ts ================================================ Button Removable media/devices manager Správa vyjímatelných médií/zařízení Configuration Removable Media Settings Nastavení vyjímatelných médií Behavior Chování When a device is connected: Když je zařízení připojeno: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Po stisknutí zkratky pro vysunutí spustit následující akci (výchozí je <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Při stisku tlačítka pro vysunutí: Popup menu Zobrazit vyskakovací nabídku Show info Ukázat informace Do nothing Nedělat nic Eject All Optical Drives Vysunout disky ze všech optických jednotek DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Zařízení <b><nobr>„%1“</nobr></b> je připojeno. The device <b><nobr>"%1"</nobr></b> is removed. Zařízení <b><nobr>„%1“</nobr></b> je odebráno. Removable media/devices manager Správa vyjímatelných médií/zařízení EjectActionOptical Removable media/devices manager Správa vyjímatelných médií/zařízení Ejected all optical drives Vysunuty disky ze všech optických jednotek LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Správa vyjímatelných médií/zařízení: Globální zkratku „%1“ není možné zaregistrovat Eject removable media Vysunout vyjímatelná média MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Připojení <b><nobr>„%1“</nobr></b> se nezdařilo: %2 Removable media/devices manager Správa vyjímatelných médií/zařízení Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Odpojení <strong><nobr>„%1“</nobr></strong> se nezdařilo: %2 Popup No devices are available Nejsou k dispozici žádná zařízení ================================================ FILE: plugin-mount/translations/mount_cy.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_da.desktop.yaml ================================================ Desktop Entry/Name: "Flytbare medier" Desktop Entry/Comment: "Nem montering og afmontering af USB- og optiske drev" ================================================ FILE: plugin-mount/translations/mount_da.ts ================================================ Button Removable media/devices manager Håndtering af flytbare medier/enheder Configuration Removable Media Settings Medieindstillinger for flytbare medier Behavior Opførsel When a device is connected: Når en enhed er forbundet: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Udfører den følgende handling når skub-ud genvejen bliver brugt (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html When eject button is pressed: Når der trykkes på skub ud-knappen: Popup menu Pop op-menu Show info Vis information Do nothing Gør intet Eject All Optical Drives Skub alle optiske drev ud DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Enheden <b><nobr>"%1"</nobr></b> er forbundet. The device <b><nobr>"%1"</nobr></b> is removed. Enheden <b><nobr>"%1"</nobr></b> er fjernet. Removable media/devices manager Håndtering af flytbare medier/enheder EjectActionOptical Removable media/devices manager Håndtering af flytbare medier/enheder Ejected all optical drives Skub alle optiske drev ud LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Håndtering af flytbare medier/enheder: Global genvej '%1' kan ikke registreres Eject removable media Skub flytbare medie ud MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Montering af <b><nobr>"%1"</nobr></b> mislykkedes: %2 Removable media/devices manager Håndtering af flytbare medier/enheder Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Afmontering af <strong><nobr>"%1"</nobr></strong> mislykkedes: %2 Popup No devices are available Ingen tilgængelig enheder ================================================ FILE: plugin-mount/translations/mount_de.desktop.yaml ================================================ Desktop Entry/Name: "Wechseldatenträger" Desktop Entry/Comment: "Wechseldatenträgerverwaltung (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_de.ts ================================================ Button Removable media/devices manager Verwaltung für Wechseldatenträger/Geräte Configuration Removable Media Settings Wechseldatenträgereinstellungen Behavior Verhalten When a device is connected: Wenn ein Gerät verbunden ist: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Auslösen der folgenden Aktion wenn Auswurf-Verknüpfung gedrückt wurde (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Wenn die Auswurftaste gedrückt wird: Popup menu Aufklapp-Menü Show info Info anzeigen Do nothing Nichts tun Eject All Optical Drives Alle optischen Laufwerke auswerfen DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Das Gerät <b><nobr>"%1"</nobr></b> wurde verbunden. The device <b><nobr>"%1"</nobr></b> is removed. Das Gerät <b><nobr>"%1"</nobr></b> wurde entfernt. Removable media/devices manager Verwaltung entfernbarer Medien/Geräte EjectActionOptical Removable media/devices manager Verwaltung für Wechseldatenträger/Geräte Ejected all optical drives Alle optischen Laufwerke ausgeworfen LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Verwaltung für Wechseldatenträger/Geräte: Standardverknüpfung '%1' kann nicht registriert werden Eject removable media Wechseldatenträger auswerfen MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Das Einbinden von <b><nobr>"%1"</nobr></b> ist fehlgeschlagen: %2 Removable media/devices manager Verwaltung entfernbarer Medien/Geräte Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Das Aushängen von <strong><nobr>"%1"</nobr></strong> ist fehlgeschlagen: %2 Popup No devices are available Keine Geräte verfügbar ================================================ FILE: plugin-mount/translations/mount_el.desktop.yaml ================================================ Desktop Entry/Name: "Αφαιρούμενα μέσα" Desktop Entry/Comment: "Εύκολη προσάρτηση και αποπροσάρτηση USB και οπτικών δίσκων" ================================================ FILE: plugin-mount/translations/mount_el.ts ================================================ Button Removable media/devices manager Διαχειριστής αφαιρούμενων μέσων/συσκευών Configuration Removable Media Settings Ρυθμίσεις αφαιρούμενων μέσων Behavior Συμπεριφορά When a device is connected: Κατά την σύνδεση μιας συσκευής: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Ενεργοποίηση της παρακάτω ενέργειας με το πάτημα της συντόμευσης εξαγωγής (<span style=" font-weight:600;">XF86Eject</span> εξ ορισμού)</p></body></html> When eject button is pressed: Κατά το πάτημα του κουμπιού εξαγωγής: Popup menu Αναδυόμενο μενού Show info Εμφάνιση πληροφοριών Do nothing Καμία ενέργεια Eject All Optical Drives Εξαγωγή όλων των οπτικών οδηγών DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Συνδέθηκε η συσκευή <b><nobr>"%1"</nobr></b>. The device <b><nobr>"%1"</nobr></b> is removed. Αφαιρέθηκε η συσκευή <b><nobr>"%1"</nobr></b>. Removable media/devices manager Διαχειριστής αφαιρούμενων μέσων/συσκευών EjectActionOptical Removable media/devices manager Διαχειριστής αφαιρούμενων μέσων/συσκευών Ejected all optical drives Έγινε εξαγωγή όλων των οπτικών οδηγών LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Διαχειριστής αφαιρούμενων μέσων/συσκευών: Η καθολική συντόμευση '%1' δεν μπορεί να καταχωρηθεί Eject removable media Εξαγωγή του αφαιρούμενου μέσου MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Η προσάρτηση του <b><nobr>«%1»</nobr></b> απέτυχε: %2 Removable media/devices manager Διαχειριστής αφαιρούμενων μέσων/συσκευών Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Η αποπροσάρτηση του <strong><nobr>"%1"</nobr></strong> απέτυχε: %2 Popup No devices are available Καμία διαθέσιμη συσκευή ================================================ FILE: plugin-mount/translations/mount_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Removable Media" Desktop Entry/Comment: "Easy mounting and unmounting of USB and optical drives" ================================================ FILE: plugin-mount/translations/mount_en_GB.ts ================================================ Button Removable media/devices manager Removable media/devices manager Configuration Removable Media Settings Removable Media Settings Behavior Behaviour When a device is connected: When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: When eject button is pressed: Popup menu Popup menu Show info Show info Do nothing Do nothing Eject All Optical Drives Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager Removable media/devices manager EjectActionOptical Removable media/devices manager Removable media/devices manager Ejected all optical drives Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available No devices are available ================================================ FILE: plugin-mount/translations/mount_eo.desktop.yaml ================================================ Desktop Entry/Name: "Demetebla datumportilo" Desktop Entry/Comment: "Traktilo de demeteblaj aparatoj (USB, KD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_eo.ts ================================================ Button Removable media/devices manager Mastrumilo de demeteblaj aparatoj Configuration Removable Media Settings Behavior Konduto When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Ŝprucfenestra menuo Show info Montri informojn Do nothing Fari nenion Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. La aparato <b><nobr>"%1"</nobr></b> estas konektita. The device <b><nobr>"%1"</nobr></b> is removed. La aparato <b><nobr>"%1"</nobr></b> estas demetita. Removable media/devices manager Mastrumilo de demeteblaj aparatoj EjectActionOptical Removable media/devices manager Mastrumilo de demeteblaj aparatoj Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Mastrumilo de demeteblaj aparatoj Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_es.desktop.yaml ================================================ Desktop Entry/Name: "Medios removibles" Desktop Entry/Comment: "Montaje y desmontaje fácil de unidades USB y ópticas" ================================================ FILE: plugin-mount/translations/mount_es.ts ================================================ Button Removable media/devices manager Gestor de soportes y dispositivos extraíbles Configuration Removable Media Settings Configuración de soportes extraíbles Behavior Comportamiento When a device is connected: Al conectar un dispositivo: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Desencadenar la acción siguiente al presionar el atajo de expulsión (<span style=" font-weight:600;">XF86Eject</span> de manera predeterminada)</p></body></html> When eject button is pressed: Al pulsar el botón de expulsión: Popup menu Menú emergente Show info Mostrar información Do nothing No hacer nada Eject All Optical Drives Expulsar todas las unidades ópticas DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Se ha conectado el dispositivo <b><nobr>«%1»</nobr></b>. The device <b><nobr>"%1"</nobr></b> is removed. Se ha extraído el dispositivo <b><nobr>«%1»</nobr></b>. Removable media/devices manager Gestor de soportes y dispositivos extraíbles EjectActionOptical Removable media/devices manager Gestor de soportes y dispositivos extraíbles Ejected all optical drives Se han expulsado todas las unidades ópticas LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestor de soportes y dispositivos extraíbles: no se puede registrar el atajo global «%1» Eject removable media Expulsar soporte extraíble MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Ha fallado el montaje de <b><nobr>«%1»</nobr></b>: %2 Removable media/devices manager Gestor de soportes y dispositivos extraíbles Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Ha fallado el desmontaje de <strong><nobr>«%1»</nobr></strong>: %2 Popup No devices are available No hay dispositivos disponibles ================================================ FILE: plugin-mount/translations/mount_es_UY.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Dispositivos" Desktop Entry/Comment: "Manejador de dispositivos removibles (USB, DVD, CAM, ..)" ================================================ FILE: plugin-mount/translations/mount_es_VE.ts ================================================ Button Removable media/devices manager Administrador de medios y dispositivos Configuration Removable Media Settings Behavior Comportamiento When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Menú emergente Show info Mostrar información Do nothing No hacer nada Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. El dispositivo <b><nobr>"%1"</nobr></b> está conectado. The device <b><nobr>"%1"</nobr></b> is removed. El dispositivo <b><nobr>"%1"</nobr></b> fue quitado. Removable media/devices manager Administrador de medios y dispositivos EjectActionOptical Removable media/devices manager Administrador de medios y dispositivos Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Administrador de medios y dispositivos Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_et.desktop.yaml ================================================ Desktop Entry/Name: "Eemaldatavad seadmed ja andmekandjad" Desktop Entry/Comment: "Optiliste sedamete ja USB-põhiste andemekandajate lihtne haldus\ \ (haakimine, avamine, eemaldamine)" ================================================ FILE: plugin-mount/translations/mount_et.ts ================================================ Button Removable media/devices manager Eemaldatavate andmekandjate ja seadmete haldur Configuration Removable Media Settings Eemaldatavate andmekandjate seadistused Behavior Tegevused When a device is connected: Seadme ühendamisel: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Väljasta-nupu vajutamisel käivita järgnev toiming (vaikimisi <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Väljasta-nupu vajutamisel: Popup menu Näita valikuakent Show info Näita teavet Do nothing Ära tee midagi Eject All Optical Drives Väljasta kõik optilised seadmed DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Seade <b><nobr>„%1“</nobr></b> on ühendatud. The device <b><nobr>"%1"</nobr></b> is removed. Seade <b><nobr>„%1“</nobr></b> on eemaldatud. Removable media/devices manager Eemaldatavate andmekandjate ja seadete haldur EjectActionOptical Removable media/devices manager Eemaldatavate andmekandjate ja seadete haldur Ejected all optical drives Väljastasin kõik plaadid LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eemaldatavate andmekandjate ja seadete haldur: üldist kiirklahvi „%1“ ei õnnestu salvestada Eject removable media Eemalda andmekandja MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>„%1“</nobr></b> haakimine ei õnnestunud: %2 Removable media/devices manager Eemaldatavate andmekandjate ja seadete haldur Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <b><nobr>„%1“</nobr></b> lahutamine ei õnnestunud: %2 Popup No devices are available Seadmeid ei leidu ================================================ FILE: plugin-mount/translations/mount_eu.desktop.yaml ================================================ Desktop Entry/Name: "Gailu aldagarria" Desktop Entry/Comment: "Gailu aldagarrien maneiatzailea (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_eu.ts ================================================ Button Removable media/devices manager Kendu daitekeen euskarri/gailuen kudeatzailea Configuration Removable Media Settings Media aldagarrien ezarpenak Behavior Portaera When a device is connected: Gailu bat konektatuta dagoenean: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Aktibatu ekintza hau kanporatzeko lasterbidea sakatzen denean (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Ateratzeko botoia sakatzen denean: Popup menu Laster-menua Show info Erakutsi informazioa Do nothing Ez egin ezer Eject All Optical Drives Atera Unitate optiko guztiak DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. <b><nobr>"%1"</nobr></b>Gailua konektatuta. The device <b><nobr>"%1"</nobr></b> is removed. <b><nobr>"%1"</nobr></b>gailua kenduta. Removable media/devices manager Eduki/gailu aldagarrien kudeatzailea EjectActionOptical Removable media/devices manager Kendu daitezkeen euskarri/gailu kudeatzailea Ejected all optical drives Unitate optiko guztiak kanporatu ditu LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Kendu daitezkeen euskarri/gailuen kudeatzailea: '%1' lasterbide orokorra ezin da erregistratu Eject removable media Atera daitekeen euskarri aldagarria MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Huts egin du <b><nobr>"%1"</nobr></b> muntatu: %2 Removable media/devices manager Kendu daitezkeen euskarri/gailu kudeatzailea Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Huts egin du <strong><nobr>"%1"</nobr></strong> desmuntatu: %2 Popup No devices are available Ez dago gailurik erabilgarri ================================================ FILE: plugin-mount/translations/mount_fi.desktop.yaml ================================================ Desktop Entry/Name: "Irrotettavat laitteet ja mediat" Desktop Entry/Comment: "Irrotettavien laitteiden ja medioiden käsittelijä (USB, CD, DVD...)" ================================================ FILE: plugin-mount/translations/mount_fi.ts ================================================ Button Removable media/devices manager Irrotettavien laitteiden ja levyjen hallinta Configuration Removable Media Settings Irrotettavan tallennustilan asetukset Behavior Toiminta When a device is connected: Kun laite kytketään: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Suorita seuraava toiminto 'eject' nappia painettaessa (<span style=" font-weight:600;">XF86Eject</span> oletuksena)</p></body></html> When eject button is pressed: Eject-painiketta painettaessa: Popup menu Näytä valikko Show info Näytä ilmoitus Do nothing Älä tee mitään Eject All Optical Drives Poista kaikki optiset levyt DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Laite <b><nobr>"%1"</nobr></b> on liitetty. The device <b><nobr>"%1"</nobr></b> is removed. Laite <b><nobr>"%1"</nobr></b> on irrotettu. Removable media/devices manager Irrotettavien laitteiden ja levyjen hallinta EjectActionOptical Removable media/devices manager Irrotettavien laitteiden ja levyjen hallinta Ejected all optical drives Kaikki optiset levyt poistettu LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Irrotettavien laitteiden ja levyjen hallinta: Globaalia pikavalintaa '%1' ei voida rekisteröidä Eject removable media Poista irrotettava tallennustila MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Laitteen <b><nobr>"%1"</nobr></b> liittäminen epäonnistui: %2 Removable media/devices manager Irrotettavien laitteiden ja levyjen hallinta Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Laitteen <strong><nobr>"%1"</nobr></strong> irrottaminen epäonnistui: %2 Popup No devices are available Ei laitteita ================================================ FILE: plugin-mount/translations/mount_fr.desktop.yaml ================================================ Desktop Entry/Name: "Média amovible" Desktop Entry/Comment: "Gestionnaire de médias amovibles (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_fr.ts ================================================ Button Removable media/devices manager Gestionnaire de médias/périphériques amovibles Configuration Removable Media Settings Paramètres des médias amovibles Behavior Comportement When a device is connected: Lorsqu'un appareil est connecté : <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Déclencher l'action suivante lorsque vous appuyez sur le raccourci d'éjection (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Lorsque le bouton d'éjection est enfoncé : Popup menu Menu pop-up Show info Afficher les infos Do nothing Ne rien faire Eject All Optical Drives Éjecter tous les lecteurs optiques DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Le périphérique <b><nobr>"%1"</nobr></b> est connecté. The device <b><nobr>"%1"</nobr></b> is removed. Le périphérique <b><nobr>"%1"</nobr></b> a été retiré. Removable media/devices manager Gestionnaire de médias/périphériques amovibles EjectActionOptical Removable media/devices manager Gestionnaire de médias/périphériques amovibles Ejected all optical drives Éjectr tous les lecteurs optiques LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestionnaire de supports/périphériques amovibles : le raccourci global '%1' ne peut pas être enregistré Eject removable media Éjecter le support amovible MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Le montage de <b><nobr>"%1"</nobr></b> a échoué : %2 Removable media/devices manager Gestionnaire de médias/périphériques amovibles Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Le démontage de <strong><nobr>"%1"</nobr></strong> a échoué : %2 Popup No devices are available Aucun périphérique disponible ================================================ FILE: plugin-mount/translations/mount_gl.ts ================================================ Button Removable media/devices manager Administrador de medios/dispositivos extraíbeis Configuration Removable Media Settings Axustes de medios extraíbeis Behavior Comportamento When a device is connected: Cando se conecta un dispositivo: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Menú emerxente Show info Amosar información Do nothing Non facer nada Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Conectouse o dispositivo <b><nobr>«%1»</nobr></b>. The device <b><nobr>"%1"</nobr></b> is removed. Retirouse o dispositivo <b><nobr>«%1»</nobr></b>. Removable media/devices manager Administrador de medios/dispositivos extraíbeis EjectActionOptical Removable media/devices manager Administrador de medios/dispositivos extraíbeis Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Produciuse un fallo na montaxe de <b><nobr>«%1»</nobr></b>: %2 Removable media/devices manager Administrador de medios/dispositivos extraíbeis Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Produciuse un fallo na desmontaxe de <strong><nobr>«%1»</nobr></strong>: %2 Popup No devices are available Non hai dispositivos dispoñíbeis ================================================ FILE: plugin-mount/translations/mount_he.desktop.yaml ================================================ Desktop Entry/Name: "מדיה נתיקה" Desktop Entry/Comment: "עיגון וניתוק של USB וכוננים אופטיים בקלות" ================================================ FILE: plugin-mount/translations/mount_he.ts ================================================ Button Removable media/devices manager מנהל התקנים/מדיה נתיקים Configuration Removable Media Settings הגדרות מדיה נתיקה Behavior התנהגות When a device is connected: כאשר מכשיר מחובר: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>להריץ את הפעולה הבאה עם לחיצה על מקש הקיצור לשליפה (<span style=" font-weight:600;">XF86Eject</span> כבררת מחדל)</p></body></html> When eject button is pressed: כאשר כפתור השליפה נלחץ: Popup menu להקפיץ תפריט Show info להציג מידע Do nothing לא לעשות כלום Eject All Optical Drives לשלוף את כל הכוננים האופטיים DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. ההתקן <b><nobr>”%1„</nobr></b> מחובר. The device <b><nobr>"%1"</nobr></b> is removed. ההתקן <b><nobr>”%1„</nobr></b> נשלף. Removable media/devices manager מנהל התקנים/מדיה נתיקים EjectActionOptical Removable media/devices manager מנהל התקנים/אמצעים נתיקים Ejected all optical drives שליפת כל הכוננים האופטיים LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered מנהל התקנים/אמצעים נתיקים: לא ניתן לרשום את קיצור הדרך הגלובלי ‚%1’ Eject removable media שליפת אמצעי נתיק MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 העיגון של <b><nobr>”%1„</nobr></b> נכשל: %2 Removable media/devices manager מנהל התקנים/מדיה נתיקים Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 ניתוק העיגון של <strong><nobr>”%1„</nobr></strong> נכשל: %2 Popup No devices are available אין התקנים זמינים ================================================ FILE: plugin-mount/translations/mount_hr.desktop.yaml ================================================ Desktop Entry/Name: "Prijenosni mediji" Desktop Entry/Comment: "Pokretanje i uklanjanje prijenosnih medija" ================================================ FILE: plugin-mount/translations/mount_hr.ts ================================================ Button Removable media/devices manager Upravljač prijenosnih medija/uređaja Configuration Removable Media Settings Prijenosni mediji – Postavke Behavior Ponašanje When a device is connected: Kad se jedan uređaj priključi: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Pokreni sljedeću radnju kad se pritisne prečac za izbacivanje (standardno se koristi <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Kad se pritisne gumb za izbacivanje: Popup menu Otvori skočni izbornik Show info Prikaži informacije Do nothing Ne čini ništa Eject All Optical Drives Izbaci sve optičke diskove DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Uređaj <b><nobr>„%1”</nobr></b> je spojen. The device <b><nobr>"%1"</nobr></b> is removed. Uređaj <b><nobr>„%1”</nobr></b> je uklonjen. Removable media/devices manager Upravljač prijenosnih medija/uređaja EjectActionOptical Removable media/devices manager Upravljač prijenosnih medija/uređaja Ejected all optical drives Svi optički diskovi su izbačeni LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Upravljač prijenosnih medija/uređaja: Globalni prečac „%1” se ne može registrirati Eject removable media Izbaci prijenosne medije MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Neuspjelo pokretanje medija/uređaja <b><nobr>„%1”</nobr></b>: %2 Removable media/devices manager Upravljač prijenosnih medija/uređaja Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Neuspjelo uklanjanje medija/uređaja <b><nobr>„%1”</nobr></b>: %2 Popup No devices are available Nema dostupnih uređaja ================================================ FILE: plugin-mount/translations/mount_hu.desktop.yaml ================================================ Desktop Entry/Name: "Cserélhetőeszköz-kezelő" Desktop Entry/Comment: "USB és optikai meghajtók egyszerű fel- és lecsatlakoztatása" ================================================ FILE: plugin-mount/translations/mount_hu.ts ================================================ Button Removable media/devices manager Cserélhetőeszköz-kezelő Configuration Removable Media Settings Cserélhetőeszköz-kezelő beállításai Behavior Működés When a device is connected: Ha egy eszköz csatlakoztatva van: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>A következő művelet aktiválása a kiadó gyorsbillentyű (<span style=" font-weight:600;">XF86Eject</span> alapértelmezés szerint) megnyomásakor</p></body></html> When eject button is pressed: A kiadás gomb megnyomásakor: Popup menu Felugró menü Show info Információ megjelenítése Do nothing Ne tegyen semmit Eject All Optical Drives Összes optikai meghajtó kiadása DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. A(z) <b><nobr>„%1”</nobr></b> eszköz csatlakoztatva. The device <b><nobr>"%1"</nobr></b> is removed. A(z) <b><nobr>„%1”</nobr></b> eszköz eltávolítva. Removable media/devices manager Cserélhetőeszköz-kezelő EjectActionOptical Removable media/devices manager Cserélhető adathordozók/eszközök kezelője Ejected all optical drives Az összes optikai meghajtó kiadva LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Cserélhetőeszköz-kezelő: A '%1' globális gyorsbillentyű nem regisztrálható Eject removable media Eltávolítható adathordozó kiadása MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 A <strong><nobr>"%1"</nobr></strong> csatolása sikertelen: %2 Removable media/devices manager Cserélhetőeszköz-kezelő Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 A <strong><nobr>"%1"</nobr></strong> lecsatolása sikertelen: %2 Popup No devices are available Nincs elérhető eszköz ================================================ FILE: plugin-mount/translations/mount_ia.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_id.ts ================================================ Button Removable media/devices manager Pengelola media/perangkat yang dapat dilepas Configuration Removable Media Settings Pengaturan Media yang dapat dilepas Behavior Perilaku When a device is connected: Ketika perangkat terhubung: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Menu popup Show info Lihat info Do nothing Tidak melakukan apapun Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Perangkat <b><nobr>"%1"</nobr></b> telah tersambung. The device <b><nobr>"%1"</nobr></b> is removed. Perangkat <b><nobr>"%1"</nobr></b> telah dicopot. Removable media/devices manager Pengelola media/perangkat yang dapat dilepas EjectActionOptical Removable media/devices manager Pengelola media/perangkat yang dapat dilepas Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Memuat <b><nobr>"%1"</nobr></b> gagal: %2 Removable media/devices manager Pengelola media/perangkat yang dapat dilepas Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Melepas kaitan <strong><nobr>"%1"</nobr></strong> gagal: %2 Popup No devices are available Tidak ada perangkat yang tersedia ================================================ FILE: plugin-mount/translations/mount_it.desktop.yaml ================================================ Desktop Entry/Name: "Dispositivi rimovibili" Desktop Entry/Comment: "Gestore dei dispositivi rimovibili (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_it.ts ================================================ Button Removable media/devices manager Gestore dei supporti/dispositivi rimovibili Configuration Removable Media Settings Impostazioni dispositivi rimovibili Behavior Comportamento When a device is connected: Quando un device è connesso: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Eseguire la seguente azione con la scorciatoia per espellere (<span style=" font-weight:600;">Predefinito XF86Eject</span>)</p></body></html> When eject button is pressed: Se pressato pulsante di espulsione: Popup menu Menu a comparsa Show info Mostra informazioni Do nothing Non fare nulla Eject All Optical Drives Espelli tutti dispositivi ottici DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Il dispositivo <b><nobr>"%1"</nobr></b> è connesso. The device <b><nobr>"%1"</nobr></b> is removed. Il dispositivo <b><nobr>"%1"</nobr></b> è stato rimosso. Removable media/devices manager Gestore dei supporti/dispositivi rimovibili EjectActionOptical Removable media/devices manager Gestore dei supporti/dispositivi rimovibili Ejected all optical drives Espelli tutti dischi ottici LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestore dispositivi rimovibili: Impossibile registrare scorciatoia globale '%1' Eject removable media Espelli dispositivo rimovibile MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Accesso a <b><nobr>"%1"</nobr></b> non riuscito: %2 Removable media/devices manager Gestore dei supporti/dispositivi rimovibili Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Smontaggio di <strong><nobr>"%1"</nobr></strong> non riuscito: %2 Popup No devices are available Non è disponibile alcun dispositivo ================================================ FILE: plugin-mount/translations/mount_ja.desktop.yaml ================================================ Desktop Entry/Name: "リムーバブルメディア" Desktop Entry/Comment: "USB や光学ドライブのマウントやアンマウントを簡単にします" ================================================ FILE: plugin-mount/translations/mount_ja.ts ================================================ Button Removable media/devices manager リムーバブル メディア/デバイスの管理 Configuration Removable Media Settings リムーバブルメディアの設定 Behavior 動作 When a device is connected: デバイスが接続された時: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>取り出しのショートカットが押された時 (既定では <span style=" font-weight:600;">XF86Eject</span>) 次の動作が起きます</p></body></html> When eject button is pressed: [取り出し] ボタンが押された時: Popup menu メニューのポップアップ Show info 情報の表示 Do nothing 何もしない Eject All Optical Drives すべての光学式ドライブを取り出す DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. デバイス <b><nobr>"%1"</nobr></b> が接続されました。 The device <b><nobr>"%1"</nobr></b> is removed. デバイス <b><nobr>"%1"</nobr></b> が取り外されました。 Removable media/devices manager リムーバブル メディア/デバイスの管理 EjectActionOptical Removable media/devices manager リムーバブル メディア/デバイスの管理 Ejected all optical drives すべての光学式ドライブを取り出しました LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered リムーバブル メディア/デバイスの管理: グローバルショートカット '%1' を登録できません Eject removable media リムーバブルメディアを取り出す MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b> のマウントに失敗しました: %2 Removable media/devices manager リムーバブル メディア/デバイスの管理 Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>"%1"</nobr></strong> のアンマウントに失敗しました: %2 Popup No devices are available 使用可能なデバイスがありません ================================================ FILE: plugin-mount/translations/mount_ka.desktop.yaml ================================================ Desktop Entry/Name: "მოხსნადი მედია" Desktop Entry/Comment: "ადვილად მიმაგრება და მოხსნა USB და ოპტიკური დისკებისთვის" ================================================ FILE: plugin-mount/translations/mount_ka.ts ================================================ Button Removable media/devices manager მოხსნადი მედიის/მოწყობილობების მმართველი Configuration Removable Media Settings მოხსნადი მედიის მორგება Behavior ქცევა When a device is connected: როცა მოწყობილობა მიერთებულია: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>გაეშვება შემდეგი ქმედება, როცა დააწვებით ამოღების მალსახმობს (<span style=" font-weight:600;">XF86Eject</span> ნაგულისხმევად)</p></body></html> When eject button is pressed: როცა დააწვებით ამოღების ღილაკს: Popup menu მხტუნარა მენიუ Show info ინფორმაციის ჩვენება Do nothing არაფრის კეთება Eject All Optical Drives ყველა ოპტიკური დისკის ამოღება DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. მოწყობილობა <b><nobr>"%1"</nobr></b> მიერთებულია. The device <b><nobr>"%1"</nobr></b> is removed. მოწყობილობა <b><nobr>"%1"</nobr></b> გამოაერთეს. Removable media/devices manager მოხსნადი მედიის/მოწყობილობების მმართველი EjectActionOptical Removable media/devices manager მოხსნადი მედიის/მოწყობილობების მმართველი Ejected all optical drives ყველა ოპტიკური დისკი გამოღებულია LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered მოხსნადი მედიის/მოწყობილობების მმართველი: გლობალური მალსახმობის '%1' რეგისტრაცია შეუძლებელია Eject removable media მოხსნადი მოწყობილობის ამოღება MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b>-ის მიმაგრება ჩავარდა: %2 Removable media/devices manager მოხსნადი მედიის/მოწყობილობების მმართველი Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>"%1"</nobr></strong>-ის მიმაგრების გაუქმება ჩავარდა: %2 Popup No devices are available მოწყობილობები ხელმისაწვდომი არაა ================================================ FILE: plugin-mount/translations/mount_kab.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-mount/translations/mount_kab.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_kk.desktop.yaml ================================================ Desktop Entry/Name: "Ауыстырмалы тасушылар" Desktop Entry/Comment: "USB мен оптикалық тасушыларды ыңғайлы қосу және ажырату" ================================================ FILE: plugin-mount/translations/mount_kk.ts ================================================ Button Removable media/devices manager Ауыстырылатын тасушылар/құрылғылар менеджері Configuration Removable Media Settings Ауыстырылатын тасушылар баптаулары Behavior Мінез-құлығы When a device is connected: Құрылғы қосылғанда: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Шығару жарлығы басылғанда келесі әрекетті іске қосу (әдетте <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Шығару батырмасы басылғанда: Popup menu Қалқымалы мәзір Show info Ақпаратты көрсету Do nothing Ештеңе істемеу Eject All Optical Drives Барлық оптикалық диск жетектерін шығару DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. <b><nobr>"%1"</nobr></b> құрылғысы қосылды. The device <b><nobr>"%1"</nobr></b> is removed. <b><nobr>"%1"</nobr></b> құрылғысы өшірілді. Removable media/devices manager Ауыстырылатын тасушылар/құрылғылар менеджері EjectActionOptical Removable media/devices manager Ауыстырылатын тасушылар/құрылғылар менеджері Ejected all optical drives Барлық оптикалық диск жетектері шығарылды LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Ауыстырылатын тасушылар/құрылғылар менеджері: '%1' глобалды жарлығын тіркеу мүмкін емес Eject removable media Ауыстырылатын тасушыны шығару MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b> тіркеу сәтсіз аяқталды: %2 Removable media/devices manager Ауыстырылатын тасушылар/құрылғылар менеджері Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>"%1"</nobr></strong> тіркеуден шығару сәтсіз аяқталды: %2 Popup No devices are available Қолжетімді құрылғылар жоқ ================================================ FILE: plugin-mount/translations/mount_ko.desktop.yaml ================================================ Desktop Entry/Name: "이동식 미디어" Desktop Entry/Comment: "USB 및 광학 드라이브의 간편한 마운트 및 마운트 해제" ================================================ FILE: plugin-mount/translations/mount_ko.ts ================================================ Button Removable media/devices manager 이동식 미디어/장비 관리 도구 Configuration Removable Media Settings 이동식 미디어 설정 Behavior 동작 When a device is connected: 장비를 연결했을 때: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>꺼내기 단축키를 누르면 다음 작업을 트리거합니다 (기본적으로 <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: 꺼내기 버튼을 누르면: Popup menu 메뉴 팝업 Show info 정보 표시 Do nothing 아무것도 안 하기 Eject All Optical Drives 모든 광학 드라이브 꺼내기 DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. 장비 <b><nobr>"%1"</nobr></b>에 연결했습니다. The device <b><nobr>"%1"</nobr></b> is removed. 장비 <b><nobr>"%1"</nobr></b> 의 연결이 해제되었습니다. Removable media/devices manager 이동식 미디어/장비 관리 도구 EjectActionOptical Removable media/devices manager 이동식 미디어/장치 관리자 Ejected all optical drives 모든 광학 드라이브 배출됨 LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered 이동식 미디어/장치 관리자: 전역 단축키 '%1' 등록할 수 없음 Eject removable media 이동식 미디어 꺼내기 MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 마운팅 <b><nobr>"%1"</nobr></b> 실패: %2 Removable media/devices manager 이동식 미디어/장비 관리 도구 Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 언마운팅 <strong><nobr>"%1"</nobr></strong> 실패: %2 Popup No devices are available 사용할 장비가 없습니다 ================================================ FILE: plugin-mount/translations/mount_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ebitereka data ebyetongovu" Desktop Entry/Comment: "Ekigonza okuwanga n'okuwangulako bufulaasi ne Disiki eza CD oba DVD" ================================================ FILE: plugin-mount/translations/mount_lg.ts ================================================ Button Removable media/devices manager Ekiteekateeka ebitereka data ebyetongovu Configuration Removable Media Settings Enteekateeka z'ebitereka data ebyetongovu Behavior Ekikolebwa When a device is connected: Ekitereka data ekyetongovu bwe kiyungibwa ku kompyuta: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Ekibeerawo bw'onyiga eppeesa ery'okufulumya ekitereka data (Ekya bulijjo kwe kutandika <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Bw'onyiga eppeesa ery'okufulumya ekitereka data: Popup menu Menyu eboneka Show info Akaboozi akalaga ebifa ku kitereka data kaboneka Do nothing Tewaba kikolebwa Eject All Optical Drives CD ne DVD zonna zifuluma DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Ekitereka data <b><nobr>"%1"</nobr></b> kiwangidwa. The device <b><nobr>"%1"</nobr></b> is removed. Ekitereka data <b><nobr>"%1"</nobr></b> kiwangudwa. Removable media/devices manager Ekiteekateeka ebitereka data ebyetongovu EjectActionOptical Removable media/devices manager Ekiteekateeka ebitereka data ebyetongovu Ejected all optical drives CD ne DVD zonna zifulumizidwa LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Ekiteekateeka ebitereka data ebyetongovu: Mapeesa '%1' agagonza emirimu tekisoboka okugakazza Eject removable media Fulumya ebitereka data ebyetongovu MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Okuwanga <b><nobr>"%1"</nobr></b> kugaanye: %2 Removable media/devices manager Ekiteekateeka ebitereka data ebyetongovu Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Okuwangula <strong><nobr>"%1"</nobr></strong> kugaanye: %2 Popup No devices are available Tewali bitereka data ebyetongovu ================================================ FILE: plugin-mount/translations/mount_lt.desktop.yaml ================================================ Desktop Entry/Name: "Keičiamosios laikmenos" Desktop Entry/Comment: "Lengvas USB ir optinių diskų prijungimas ir atjungimas" ================================================ FILE: plugin-mount/translations/mount_lt.ts ================================================ Button Removable media/devices manager Keičiamųjų laikmenų/įrenginių tvarkytuvė Configuration Removable Media Settings Keičiamųjų laikmenų nustatymai Behavior Elgsena When a device is connected: Prijungus įrenginį: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Paspaudus išstūmimo spartųjį klavišą, inicijuoti šį veiksmą (pagal numatymą, <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Paspaudus išstūmimo mygtuką: Popup menu Iškylantysis meniu Show info Rodyti informaciją Do nothing Nieko nedaryti Eject All Optical Drives Išstumti visus optinius diskus DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Įrenginys <b><nobr>"%1"</nobr></b> yra prijungtas. The device <b><nobr>"%1"</nobr></b> is removed. Įrenginys <b><nobr>„%1“</nobr></b> yra pašalintas. Removable media/devices manager Keičiamųjų laikmenų/įrenginių tvarkytuvė EjectActionOptical Removable media/devices manager Keičiamųjų laikmenų/įrenginių tvarkytuvė Ejected all optical drives Išstumti visi optiniai diskai LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Keičiamųjų laikmenų/įrenginių tvarkytuvė: Visuotinis spartusis klavišas „%1“ negali būti registruotas Eject removable media Išstumti keičiamąją laikmeną MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>„%1“</nobr></b> prijungimas patyrė nesėkmę: %2 Removable media/devices manager Keičiamųjų laikmenų/įrenginių tvarkytuvė Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>„%1“</nobr></strong> atjungimas patyrė nesėkmę: %2 Popup No devices are available Nėra prieinamų įrenginių ================================================ FILE: plugin-mount/translations/mount_lv.desktop.yaml ================================================ Desktop Entry/Name: "Noņemamās ierīces" Desktop Entry/Comment: "Viegla USB un CD/DVD montāža un demontāža" ================================================ FILE: plugin-mount/translations/mount_lv.ts ================================================ Button Removable media/devices manager Noņemamo datu nesēju/ierīču pārvaldnieks Configuration Removable Media Settings Noņemamo ierīču iestatījumi Behavior Uzvedība When a device is connected: Kad ierīce ir pievienota: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p > Veikt šādu darbību, kad tiek nospiesta izgrūšanas saīsne (<span style=" font-weight:600;"> XF86Eject</span> pēc noklusējuma)</p></body></html> When eject button is pressed: Kad tiek nospiesta izgrūšanas poga: Popup menu Parādīt izvēlni Show info Parādīt info Do nothing Nedarīt neko Eject All Optical Drives Izstumt visus optiskos diskus DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Ierīce <b><nobr>"%1"</nobr></b> ir piemontēta. The device <b><nobr>"%1"</nobr></b> is removed. Ierīce <b><nobr>"%1"</nobr></b> ir nomontēta. Removable media/devices manager Noņemamo datu nesēju/ierīču pārvaldnieks EjectActionOptical Removable media/devices manager Noņemamo datu nesēju / ierīču pārvaldnieks Ejected all optical drives Izstumt visus optiskos diskus LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Noņemamo datu nesēju / ierīču pārvaldnieks: globālo saīsni '%1 ' nevar reģistrēt Eject removable media Izgrūst/nomontēt noņemamos datu nesējus MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b> neizdevās piemontēt: %2 Removable media/devices manager Noņemamo datu nesēju/ierīču pārvaldnieks Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <b><nobr>"%1"</nobr></b> neizdevās nomontēt: %2 Popup No devices are available Nav pieejamu ierīču ================================================ FILE: plugin-mount/translations/mount_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Flyttbart media" Desktop Entry/Comment: "Enkel montering og avmontering av USB- og optiske enheter" ================================================ FILE: plugin-mount/translations/mount_nb_NO.ts ================================================ Button Removable media/devices manager Håndterer for flyttbare medium/enheter Configuration Removable Media Settings Innstillinger for uttagbare media Behavior Virkemåte When a device is connected: Når en enhet er koblet til: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Utløs følgende handling når snarvei for å løse ut trykkes (<span style=" font-weight:600;">XF86Eject</span> som standard)</p></body></html> When eject button is pressed: Når knappen for å løse ut trykkes: Popup menu Sprettoppmeny Show info Vis info Do nothing Gjør ingenting Eject All Optical Drives Løs ut alle optiske stasjoner DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Enheten <b><nobr>"%1"</nobr></b> er tilkoblet. The device <b><nobr>"%1"</nobr></b> is removed. Enheten <b><nobr>"%1"</nobr></b> ble fjernet. Removable media/devices manager Håndterer for flyttbare medium/enheter EjectActionOptical Removable media/devices manager Håndterer for flyttbare medium/enheter Ejected all optical drives Løs ut alle optiske stasjoner LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Håndterer for flyttbare medium/enheter: «%1» kan ikke registreres som snarvei brukt på hele systemet Eject removable media Løs ut flyttbare medier MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Monteringen av <b><nobr>"%1"</nobr></b> mislyktes: %2 Removable media/devices manager Håndterer for flyttbare medium/enheter Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Avmonteringen av <strong><nobr>"%1"</nobr></strong> mislyktes: %2 Popup No devices are available Ingen enheter er tilgjengelige ================================================ FILE: plugin-mount/translations/mount_nl.desktop.yaml ================================================ Desktop Entry/Name: "Verwijderbare schijven" Desktop Entry/Comment: "Beheer verwijderbare schijven (usb, cd, dvd, etc.)" ================================================ FILE: plugin-mount/translations/mount_nl.ts ================================================ Button Removable media/devices manager Verwijderbare schijven/apparaten beheren Configuration Removable Media Settings Verwijderbare schijven-instellingen Behavior Gedrag When a device is connected: Zodra een apparaat verbonden is: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Voer de volgende actie uit als de uitwerpsneltoets wordt ingedrukt (standaard: <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Na indrukken van uitwerpsneltoets: Popup menu Uitklapmenu Show info Informatie tonen Do nothing Niets doen Eject All Optical Drives Alle optische schijven uitwerpen DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. <b><nobr>'%1'</nobr></b> is verbonden. The device <b><nobr>"%1"</nobr></b> is removed. <b><nobr>'%1'</nobr></b> is verwijderd. Removable media/devices manager Verwijderbare schijven/apparaten beheren EjectActionOptical Removable media/devices manager Verwijderbare schijven/apparaten beheren Ejected all optical drives Alle optische schijven zijn uitgeworpen LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Verwijderbare schijven-beheerder: de sneltoets '%1' kan niet worden vastgelegd Eject removable media Verwijderbare schijf uitwerpen MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Het aankoppelen van <b><nobr>'%1'</nobr></b> is mislukt: %2 Removable media/devices manager Verwijderbare schijven/apparaten beheren Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Het ontkoppelen van <strong><nobr>'%1"</nobr></strong> is mislukt: %2 Popup No devices are available Er zijn geen apparaten beschikbaar ================================================ FILE: plugin-mount/translations/mount_oc.desktop.yaml ================================================ Desktop Entry/Name: "Mèdia amovible" Desktop Entry/Comment: "Montatge e desmontatge facil de mèdia USB e lectors optics" ================================================ FILE: plugin-mount/translations/mount_oc.ts ================================================ Button Removable media/devices manager Gestionari dels mèdias/periferics amovibles Configuration Removable Media Settings Paramètres dels mèdias amovibles Behavior Compòrtament When a device is connected: Quand es connectat un periferic : <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Activar l'accion seguenta quand la tòca d'ejeccion es quichada (<span style=" font-weight:600;">XF86Eject</span> per defaut)</p></body></html> When eject button is pressed: Quand lo boton d’ejeccion es quichat : Popup menu Menú sorgissent Show info Afichar las informacions Do nothing Far pas res Eject All Optical Drives Ejectar totes los lectors optics DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Lo periferic <b><nobr>« %1 »</nobr></b> es connectat. The device <b><nobr>"%1"</nobr></b> is removed. Lo periferic <b><nobr>« %1 »</nobr></b> es levat. Removable media/devices manager Gestionari dels mèdias/periferics amovibles EjectActionOptical Removable media/devices manager Gestionari dels mèdias/periferics amovibles Ejected all optical drives Ejectar totes los lectors optics LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestionari dels mèdias/periferics amovibles : acorchi global « %1 » se podiá pas enregistrar Eject removable media Ejectar lo supòrt amovible MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Mo montatge de <b><nobr>« %1 »</nobr></b> a fracassat : %2 Removable media/devices manager Gestionari dels mèdias/periferics amovibles Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Lo desmontatge de <strong><nobr>« %1 »</nobr></strong> a fracassat : %2 Popup No devices are available Cap de periferic pas disponible ================================================ FILE: plugin-mount/translations/mount_pa.ts ================================================ Button Removable media/devices manager ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ/ਡਿਵਾਈਸ ਮੈਨੇਜਰ Configuration Removable Media Settings ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ ਲਈ ਸੈਟਿੰਗਾਂ Behavior ਰਵੱਈਆ When a device is connected: ਜਦੋ ਡਿਵਾਈਸ ਕਨੈਕਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: ਜਦੋਂ ਬਾਹਰ ਕੱਢੋ ਬਟਨ ਦਬਾਇਆ ਜਾਂਦਾ ਹੈ: Popup menu ਪੌਪ ਮੇਨੂ Show info ਜਾਣਕਾਰੀ ਵੇਖਾਓ Do nothing ਕੁਝ ਨਾ ਕਰੋ Eject All Optical Drives ਸਾਰੇ ਓਪਟੀਕਲ ਡਰਾਇਵ ਬਾਹਰ ਕੱਢੋ DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. ਡਿਵਾਈਸ <b><nobr>"%1"</nobr></b> ਕਨੈਕਟ ਹੈ। The device <b><nobr>"%1"</nobr></b> is removed. ਡਿਵਾਈਸ <b><nobr>"%1"</nobr></b> ਹਟਾਇਆ ਹੈ। Removable media/devices manager ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ/ਡਿਵਾਈਸ ਮੈਨੇਜਰ EjectActionOptical Removable media/devices manager ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ/ਡਿਵਾਈਸ ਮੈਨੇਜਰ Ejected all optical drives ਸਾਰੇ ਓਪਟੀਕਲ ਡਰਾਇਵਾਂ ਨੂੰ ਹਟਾਇਆ ਗਿਆ LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ/ਡਿਵਾਈਸ ਮੈਨੇਜਰ: ਗਲੋਬਲ ਸ਼ਾਰਟਕੱਟ '%1' ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ Eject removable media ਹਟਾਉਣਯੋਗ ਮੀਡੀਏ ਨੂੰ ਹਟਾਓ MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b> ਨੂੰ ਮਾਊਂਟ ਕਰਨ ਲਈ ਫੇਲ੍ਹ: %2 Removable media/devices manager ਹਟਾਉਣਯੋਗ ਮੀਡੀਆ/ਡਿਵਾਈਸ ਮੈਨੇਜਰ Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>"%1"</nobr></strong> ਨੂੰ ਅਣ-ਮਾਊਂਟ ਕਰਨ ਲਈ ਫੇਲ੍ਹ: %2 Popup No devices are available ਕੋਈ ਡਿਵਾਈਸ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ================================================ FILE: plugin-mount/translations/mount_pl.desktop.yaml ================================================ Desktop Entry/Name: "Menedżer urządzeń" Desktop Entry/Comment: "Menedżer urządzeń wymiennych" ================================================ FILE: plugin-mount/translations/mount_pl.ts ================================================ Button Removable media/devices manager Menedżer nośników wymiennych Configuration Removable Media Settings Ustawienia nośników wymiennych Behavior Zachowanie When a device is connected: Po podłączeniu urządzenia: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Uruchom następujące działanie po naciśnięciu skrótu wysuwania (domyślnie <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: Po naciśnięciu przycisku wysuwania: Popup menu Wyskakujące menu Show info Pokaż informacje Do nothing Nic nie rób Eject All Optical Drives Wysuń wszystkie nośniki optyczne DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Nośnik <b><nobr>"%1"</nobr></b> jest podłączony. The device <b><nobr>"%1"</nobr></b> is removed. Nośnik <b><nobr>"%1"</nobr></b> jest odłączony. Removable media/devices manager Menedżer nośników wymiennych EjectActionOptical Removable media/devices manager Menedżer nośników wymiennych Ejected all optical drives Wysunięto wszystkie nośniki optyczne LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Menedżer nośników wymiennych: Globalny skrót '% 1' nie może zostać zarejestrowany Eject removable media Wysuń nośniki wymienne MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Montowanie <b><nobr>"%1"</nobr></b> nie powiodło się: %2 Removable media/devices manager Menedżer nośników wymiennych Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Odmontowanie <strong><nobr>"%1"</nobr></strong> nie powiodło się: %2 Popup No devices are available Brak dostępnych urządzeń ================================================ FILE: plugin-mount/translations/mount_pt.desktop.yaml ================================================ Desktop Entry/Name: "Discos amovíveis" Desktop Entry/Comment: "Montar e desmontar discos óticos e unidades USB" ================================================ FILE: plugin-mount/translations/mount_pt.ts ================================================ Button Removable media/devices manager Gestor de discos e unidades amovíveis Configuration Removable Media Settings Definições de discos amovíveis Behavior Comportamento When a device is connected: Ao conectar um dispositivo: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Acione a seguinte ação quando o atalho de ejeção é pressionado (<span style=" font-weight:600;">XF86Eject</span> por padrão)</p></body></html> When eject button is pressed: Ao premir o botão Ejetar: Popup menu Mostrar menu Show info Mostrar informações Do nothing Nada fazer Eject All Optical Drives Ejetar todas as unidades óticas DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. O dispositivo <b><nobr>"%1"</nobr></b> está conectado. The device <b><nobr>"%1"</nobr></b> is removed. O dispositivo <b><nobr>"%1"</nobr></b> foi removido. Removable media/devices manager Gestor de discos e unidades amovíveis EjectActionOptical Removable media/devices manager Gestor de discos e unidades amovíveis Ejected all optical drives Todas as unidades óticas foram ejetadas LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gestor de discos e unidades amovíveis: não foi possível registar o atalho '%1' Eject removable media Ejetar unidades amovíveis MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Erro ao montar <b><nobr>"%1"</nobr></b>: %2 Removable media/devices manager Gestor de discos e unidades amovíveis Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Erro ao desmontar <strong><nobr>"%1"</nobr></strong>: %2 Popup No devices are available Não existem dispositivos ================================================ FILE: plugin-mount/translations/mount_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Mídia removível" Desktop Entry/Comment: "Manipulador de mídia removível (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_pt_BR.ts ================================================ Button Removable media/devices manager Gerenciador de mídias/dispositivos removíveis Configuration Removable Media Settings Configurações de mídia removível Behavior Comportamento When a device is connected: Quando um dispositivo está conectado: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> html><head/><body><p>Acione a seguinte ação quando o atalho de ejeção for pressionado (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Quando o botão de ejeção é pressionado: Popup menu Menu popup Show info Exibir informações Do nothing Não fazer nada Eject All Optical Drives Ejetar Todas as Unidades Ópticas DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. O dispositivo <b><nobr>"%1"</nobr></b> foi conectado. The device <b><nobr>"%1"</nobr></b> is removed. O dispositivo <b><nobr>"%1"</nobr></b> foi removido. Removable media/devices manager Gerenciador de mídias/dispositivos removíveis EjectActionOptical Removable media/devices manager Gerenciador de mídias/dispositivos removíveis Ejected all optical drives Todas as unidades ópticas ejetadas LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Gerenciador de mídias/dispositivos removíveis: O atalho global '%1' não pode ser registrado Eject removable media Ejetar mídia removível MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 A montagem do <b><nobr>"%1"</nobr></b> falhou : %2 Removable media/devices manager Gerenciador de mídias/dispositivos removíveis Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 A desmontagem do <strong><nobr>"%1"</nobr></strong> falhou: %2 Popup No devices are available Nenhum dispositivo está disponível ================================================ FILE: plugin-mount/translations/mount_ro.desktop.yaml ================================================ Desktop Entry/Name: "Dispozitive detașabile" Desktop Entry/Comment: "Administrator de dispozitive detașabile (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_ro_RO.ts ================================================ Button Removable media/devices manager Administrator medii/dispozitive detașabile Configuration Removable Media Settings Setări ale dispozitivelor detașabile Behavior Comportament When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Meniu pop-up Show info Afișează informații Do nothing Nicio acțiune Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Dispozitivul <b><nobr>"%1"</nobr></b> este conectat. The device <b><nobr>"%1"</nobr></b> is removed. Dispozitivul <b><nobr>"%1"</nobr></b> este eliminat. Removable media/devices manager Administrator medii/dispozitive detașabile EjectActionOptical Removable media/devices manager Administrator medii/dispozitive detașabile Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Administrator medii/dispozitive detașabile Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available Nu sunt dispozitive disponibile ================================================ FILE: plugin-mount/translations/mount_ru.desktop.yaml ================================================ Desktop Entry/Name: "Съёмные устройства" Desktop Entry/Comment: "Простое подключение и отключение USB и оптических приводов" ================================================ FILE: plugin-mount/translations/mount_ru.ts ================================================ Button Removable media/devices manager Диспетчер съёмных носителей/устройств Configuration Removable Media Settings Настройки съёмных устройств Behavior Поведение When a device is connected: При подключении устройства: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Вызывать следующее действие при нажатии на кнопку «Извлечь» (по умолчанию: <span style=" font-weight:600;">XF86Eject</span>)</p></body></html> When eject button is pressed: При нажатии на кнопку «извлечь»: Popup menu Показать меню Show info Показать информацию Do nothing Ничего не делать Eject All Optical Drives Извлечь все оптические приводы DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Устройство <b><nobr>«%1»</nobr></b> подключено. The device <b><nobr>"%1"</nobr></b> is removed. Устройство <b><nobr>«%1»</nobr></b> отключено. Removable media/devices manager Диспетчер отключаемых медиа/устройств EjectActionOptical Removable media/devices manager Менеджер сменных носителей/устройств Ejected all optical drives Извлечь все оптические приводы LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Менеджер сменных носителей/устройств: не удалось зарегистрировать глобальную горячую комбинацию клавиш «%1» Eject removable media Извлечь сменные носители MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Подключение <b><nobr>"%1"</nobr></b> не удалось: %2 Removable media/devices manager Диспетчер отключаемых медиа/устройств Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Ошибка при отключении <strong><nobr>"%1"</nobr></strong>: %2 Popup No devices are available Нет доступных устройств ================================================ FILE: plugin-mount/translations/mount_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-mount/translations/mount_si.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_sk.desktop.yaml ================================================ Desktop Entry/Name: "Prenosné médiá" Desktop Entry/Comment: "Práca s prenosnými médiami (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_sk_SK.ts ================================================ Button Removable media/devices manager Správca prenosných médií a zariadení Configuration Removable Media Settings Nastavenia vymeniteľných médií Behavior Správanie When a device is connected: Keď je zariadenie pripojené: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Po stlačení skratky pre vysunutie sa vykoná nasledovná činnosť (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Pri stlačení tlačidla na vysunutie: Popup menu Zobraziť menu Show info Zobraziť informácie Do nothing Nerobiť nič Eject All Optical Drives Vysunúť disky všetkých optických jednotiek DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Zariadenie <b><nobr>„%1“</nobr></b> je pripojené. The device <b><nobr>"%1"</nobr></b> is removed. Zariadenie <b><nobr>„%1“</nobr></b> bolo odstránené. Removable media/devices manager Správca prenosných médií a zariadení EjectActionOptical Removable media/devices manager Správca prenosných médií a zariadení Ejected all optical drives Vysunúť disky zo všetkých optických jednotiek LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Správca prenosných médií a zariadení: Globálnu skratku „%1“ nie je možné zaregistrovať Eject removable media Vysunúť prenosné zariadenia MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Pripojenie zariadenia a <b><nobr>"%1"</nobr></b> zlyhalo: %2 Removable media/devices manager Správca prenosných médií a zariadení Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Odpojenie zariadenia <strong><nobr>"%1"</nobr></strong> zlyhalo: %2 Popup No devices are available K dispozícii nie je žiadne zariadenie ================================================ FILE: plugin-mount/translations/mount_sl.desktop.yaml ================================================ Desktop Entry/Name: "Odstranljivi nosilci" Desktop Entry/Comment: "Upravljalnik odstranljivih nosilcev (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_sl.ts ================================================ Button Removable media/devices manager Upravljalnik odstranljivih nosilcev Configuration Removable Media Settings Nastavitve odstranljivih nosilcev Behavior Samodejna dejanja When a device is connected: Ko je naprava priklopljena: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Ko je pritisnjen gumb za izmet: Popup menu Prikaži meni Show info Prikaži informacije Do nothing Ne naredi nič Eject All Optical Drives Izvrži vse optične pogone DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Naprava <b><nobr>"%1"</nobr></b> je priključena. The device <b><nobr>"%1"</nobr></b> is removed. Naprava <b><nobr>"%1"</nobr></b> je odstranjena. Removable media/devices manager Upravljalnik odstranljivih nosilcev EjectActionOptical Removable media/devices manager Upravljalnik odstranljivih nosilcev Ejected all optical drives Vsi optični pogoni so bili izvrženi LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Priklop naprave <b><nobr>"%1"</nobr></b> je spodletel: %2 Removable media/devices manager Upravljalnik odstranljivih nosilcev Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Naprave <strong><nobr>"%1"</nobr></strong> ni mogoče izvreči: %2 Popup No devices are available Nobene naprave ni na voljo ================================================ FILE: plugin-mount/translations/mount_sr.desktop.yaml ================================================ Desktop Entry/Name: "Уклоњиви медији" Desktop Entry/Comment: "Руковаоц уклоњивим медијима (УСБ, ЦД, ДВД...)" ================================================ FILE: plugin-mount/translations/mount_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Уклоњиви медији" Desktop Entry/Comment: "Руковаоц уклоњивим медијима (УСБ, ЦД, ДВД...)" ================================================ FILE: plugin-mount/translations/mount_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Uklonjivi mediji" Desktop Entry/Comment: "Rukovaoc uklonjivim medijima (USB, CD, DVD...)" ================================================ FILE: plugin-mount/translations/mount_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Uklonjivi mediji" Desktop Entry/Comment: "Rukovaoc uklonjivim medijima (USB, CD, DVD...)" ================================================ FILE: plugin-mount/translations/mount_sr@latin.ts ================================================ Button Removable media/devices manager Configuration Removable Media Settings Behavior When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu Show info Do nothing Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. The device <b><nobr>"%1"</nobr></b> is removed. Removable media/devices manager EjectActionOptical Removable media/devices manager Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_sr_BA.ts ================================================ Button Removable media/devices manager Менаџер уклоњивих медија/уређаја Configuration Removable Media Settings Behavior Понашање When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu прикажи мени Show info прикажи инфо Do nothing не ради ништа Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Уређај <b><nobr>„%1“</nobr></b> је прикључен. The device <b><nobr>"%1"</nobr></b> is removed. Уређај <b><nobr>„%1“</nobr></b> је уклоњен. Removable media/devices manager Менаџер уклоњивих медија/уређаја EjectActionOptical Removable media/devices manager Менаџер уклоњивих медија/уређаја Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager Менаџер уклоњивих медија/уређаја Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_sr_RS.ts ================================================ Button Removable media/devices manager Менаџер уклоњивих медија/уређаја Configuration Removable Media Settings Подешавања уклоњивих медија Behavior Понашање When a device is connected: Када је уређај повезан: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Активирај следећу радњу када се притисне пречица за избацивање (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Када је дугме за избацивање притиснуто: Popup menu Прикажи мени Show info Прикажи инфо Do nothing Не ради ништа Eject All Optical Drives Избаци све оптичке уређаје DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Уређај <b><nobr>„%1“</nobr></b> је прикључен. The device <b><nobr>"%1"</nobr></b> is removed. Уређај <b><nobr>„%1“</nobr></b> је уклоњен. Removable media/devices manager Менаџер уклоњивих медија/уређаја EjectActionOptical Removable media/devices manager Менаџер уклоњивих медија/уређаја Ejected all optical drives Избаци све оптичке уређаје LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Менаџер уклоњивих медија/уређаја: Глобална пречица '%1' не може бити регистрована Eject removable media Избаци уклоњиви медиј MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Повезивање <b><nobr>"%1"</nobr></b> није успело: %2 Removable media/devices manager Менаџер уклоњивих медија/уређаја Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Уклањање <strong><nobr>"%1"</nobr></strong> није успело: %2 Popup No devices are available Нема доступних уређаја ================================================ FILE: plugin-mount/translations/mount_sv.desktop.yaml ================================================ Desktop Entry/Name: "Flyttbar media" Desktop Entry/Comment: "Smidig montering och avmontering av USB- och optiska enheter" ================================================ FILE: plugin-mount/translations/mount_sv.ts ================================================ Button Removable media/devices manager Hanterare för flyttbara enheter Configuration Removable Media Settings Inställning för flyttbar media Behavior Beteende When a device is connected: När en enhet är ansluten: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Framkalla följande handling när utmatningsgenvägen används (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Vid tryck på utmatningsknappen: Popup menu Popup-meny Show info Visa info Do nothing Gör ingenting Eject All Optical Drives Mata ut alla optiska enheter DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Enheten <b><nobr>"%1"</nobr></b> är ansluten. The device <b><nobr>"%1"</nobr></b> is removed. Enheten <b><nobr>"%1"</nobr></b> är borttagen. Removable media/devices manager Hantering av flyttbara enheter EjectActionOptical Removable media/devices manager Hantering av flyttbara enheter Ejected all optical drives Mata ut alla optiska enheter LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Hantering av flyttbara enheter: Global genväg '%1' kan ej registreras Eject removable media Mata ut flyttbar media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Montering av <b><nobr>"%1"</nobr></b> misslyckades: %2 Removable media/devices manager Hantering av flyttbara enheter Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Avmonteringen av <strong><nobr>"%1"</nobr></strong> misslyckades: %2 Popup No devices are available Inga tillgängliga enheter ================================================ FILE: plugin-mount/translations/mount_th.desktop.yaml ================================================ Desktop Entry/Name: "สื่อที่สามารถถอดเสียบได้" Desktop Entry/Comment: "ตัวจัดการสื่อที่สามารถถอดเสียบได้ (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_th_TH.ts ================================================ Button Removable media/devices manager ตัดจัดการสื่อ/อุปกรณ์แบบถอดเสียบ Configuration Removable Media Settings Behavior พฤติกรรม When a device is connected: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Popup menu เมนูผุดขึ้น Show info แสดงข้อมูล Do nothing ไม่ต้องทำอะไร Eject All Optical Drives DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. อุปกรณ์ <b><nobr>"%1"</nobr></b> ถูกเชื่อมต่อแล้ว The device <b><nobr>"%1"</nobr></b> is removed. อุปกรณ์ <b><nobr>"%1"</nobr></b> ถูกถอดออกแล้ว Removable media/devices manager ตัดจัดการสื่อ/อุปกรณ์แบบถอดเสียบ EjectActionOptical Removable media/devices manager ตัดจัดการสื่อ/อุปกรณ์แบบถอดเสียบ Ejected all optical drives LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Eject removable media MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Removable media/devices manager ตัดจัดการสื่อ/อุปกรณ์แบบถอดเสียบ Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Popup No devices are available ================================================ FILE: plugin-mount/translations/mount_tr.desktop.yaml ================================================ Desktop Entry/Name: "Çıkarılabilir aygıt" Desktop Entry/Comment: "Çıkarılabilir aygıt yöneticisi (USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_tr.ts ================================================ Button Removable media/devices manager Çıkarılabilir ortam/aygıt yönetici Configuration Removable Media Settings Çıkarılabilir Ortam Ayarları Behavior Davranış When a device is connected: Bir aygıt bağlandığında: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Çıkarma kısayoluna basıldığında aşağıdaki eylemi tetikleyin<span style=" font-weight:600;">XF86Eject</span>(by default)</p></body></html> When eject button is pressed: Çıkarma tuşuna basıldığında: Popup menu Açılır menü Show info Bilgi görüntüle Do nothing Hiç bir şey yapma Eject All Optical Drives Tüm Optik Sürücüleri Çıkarın DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. <b><nobr>"%1"</nobr></b> aygıtı bağlandı. The device <b><nobr>"%1"</nobr></b> is removed. <b><nobr>"%1"</nobr></b> aygıtı çıkartıldı. Removable media/devices manager Çıkarılabilir ortam/aygıt yönetici EjectActionOptical Removable media/devices manager Çıkarılabilir ortam/aygıt yöneticisi Ejected all optical drives Tüm optik sürücüler çıkarıldı LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Çıkarılabilir medya/cihaz yöneticisi: '% 1' genel kısayol olarak kaydedilemez Eject removable media Çıkarılabilir medyayı çıkar MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 <b><nobr>"%1"</nobr></b> bağlanırken hata oluştu: %2 Removable media/devices manager Çıkarılabilir ortam/aygıt yönetici Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 <strong><nobr>"%1"</nobr></strong> ayrılırken hata oluştu: %2 Popup No devices are available Kullanılabilir aygıt yok ================================================ FILE: plugin-mount/translations/mount_uk.desktop.yaml ================================================ Desktop Entry/Name: "Знімні носії" Desktop Entry/Comment: "Легке керування знімними носіями (USB, CD, DVD тощо)" ================================================ FILE: plugin-mount/translations/mount_uk.ts ================================================ Button Removable media/devices manager Керування знімними носіями Configuration Removable Media Settings Налаштування знімних носіїв Behavior Поведінка When a device is connected: Коли пристрій під'єднано: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>Виконати цю дію, коли натиснено ярлик від'єднання (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> When eject button is pressed: Коли натиснено кнопку від'єднання: Popup menu Вигулькне меню Show info Показати інформацію Do nothing Нічого не робити Eject All Optical Drives Від'єднати всі оптичні носії DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. Пристрій <b><nobr>"%1"</nobr></b> під'єднано. The device <b><nobr>"%1"</nobr></b> is removed. Пристрій <b><nobr>"%1"</nobr></b> від’єднано. Removable media/devices manager Керування знімними носіями EjectActionOptical Removable media/devices manager Керування знімними медіа/пристроями Ejected all optical drives Від'єднати всі оптичні напокичувачі LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered Менеджер знімних медіапристроїв: Глобальний ярлик '%1' не може бути зарєєстрований Eject removable media Від'єднати знімний носій MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 Монтування <b><nobr>"%1"</nobr></b> не вдалося: %2 Removable media/devices manager Керування знімними носіями Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 Відмонтування <strong><nobr>"%1"</nobr></strong> не вдалося %2 Popup No devices are available Немає доступних пристроїв ================================================ FILE: plugin-mount/translations/mount_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "移动存储" Desktop Entry/Comment: "移动存储处理(USB, CD, DVD, ...)" ================================================ FILE: plugin-mount/translations/mount_zh_CN.ts ================================================ Button Removable media/devices manager 可移动媒体管理器 Configuration Removable Media Settings 可移动媒体设置 Behavior 行为 When a device is connected: 连接设备时: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html> <head /> <body> <p>在按下弹出快捷键时触发以下操作(默认为<span style =" font-weight:600;"> XF86Eject </ span>)</ p> </正文> </ html> When eject button is pressed: 当弹出按钮被按下时: Popup menu 弹出菜单 Show info 显示信息 Do nothing 什么都不做 Eject All Optical Drives 弹出所有光盘驱动器 DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. 设备 <b><nobr>“%1”</nobr></b> 已连接。 The device <b><nobr>"%1"</nobr></b> is removed. 设备 <b><nobr>“%1”</nobr></b> 已移除。 Removable media/devices manager 可移动媒体管理器 EjectActionOptical Removable media/devices manager 可移动媒体/设备管理器 Ejected all optical drives 被弹出的所有光盘驱动器 LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered 可移动媒体/设备管理器:全局快捷键 '%1' 无法被注册 Eject removable media 弹出可移动媒体 MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 挂载<b><nobr>“%1”</nobr></b>失败:%2 Removable media/devices manager 可移动媒体管理器 Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 卸载<strong><nobr>“%1”</nobr></strong>失败:%2 Popup No devices are available 没有可用设备 ================================================ FILE: plugin-mount/translations/mount_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "可卸除式裝置" Desktop Entry/Comment: "可卸除式裝置管理(USB、光碟...)" ================================================ FILE: plugin-mount/translations/mount_zh_TW.ts ================================================ Button Removable media/devices manager 可卸除式裝置管理員 Configuration Removable Media Settings 可卸除式裝置設定 Behavior 行為 When a device is connected: 當設備已連結: <html><head/><body><p>Trigger the following action when eject shortcut is pressed (<span style=" font-weight:600;">XF86Eject</span> by default)</p></body></html> <html><head/><body><p>當退出按鈕(預設為<span style=" font-weight:600;">XF86Eject</span>)按下時觸發動作</p></body></html> When eject button is pressed: 當退出按鈕按下時: Popup menu 彈出式選單 Show info 顯示資訊 Do nothing 什麼都不做 Eject All Optical Drives 退出全部光碟 DeviceActionInfo The device <b><nobr>"%1"</nobr></b> is connected. 裝置 <b><nobr>"%1"</nobr></b> 已連接。 The device <b><nobr>"%1"</nobr></b> is removed. 裝置 <b><nobr>"%1"</nobr></b> 已卸除。 Removable media/devices manager 可卸除式裝置管理員 EjectActionOptical Removable media/devices manager 可卸除式裝置管理員 Ejected all optical drives 退出全部光碟 LXQtMountPlugin Removable media/devices manager: Global shortcut '%1' cannot be registered 可卸除式裝置管理員:整體快捷鍵 "%1" 無法註冊 Eject removable media 退出可卸除式裝置 MenuDiskItem Mounting of <b><nobr>"%1"</nobr></b> failed: %2 掛載 <b><nobr>"%1"</nobr></b> 失敗:%2 Removable media/devices manager 可卸除式裝置管理員 Unmounting of <strong><nobr>"%1"</nobr></strong> failed: %2 卸載 <strong><nobr>"%1"</nobr></strong> 失敗:%2 Popup No devices are available 沒有可用裝置 ================================================ FILE: plugin-networkmonitor/CMakeLists.txt ================================================ set(PLUGIN "networkmonitor") set(HEADERS lxqtnetworkmonitorplugin.h lxqtnetworkmonitor.h lxqtnetworkmonitorconfiguration.h ) set(SOURCES lxqtnetworkmonitorplugin.cpp lxqtnetworkmonitor.cpp lxqtnetworkmonitorconfiguration.cpp ) set(UIS lxqtnetworkmonitorconfiguration.ui ) set(RESOURCES resources.qrc ) set(LIBRARIES ${STATGRAB_LIB}) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitor.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtnetworkmonitor.h" #include "lxqtnetworkmonitorconfiguration.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include extern "C" { #include } #ifdef __sg_public // since libstatgrab 0.90 this macro is defined, so we use it for version check #define STATGRAB_NEWER_THAN_0_90 1 #endif LXQtNetworkMonitor::LXQtNetworkMonitor(ILXQtPanelPlugin *plugin, QWidget* parent): QFrame(parent), mPlugin(plugin) { QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(&m_stuff); setLayout(layout); /* Initialise statgrab */ #ifdef STATGRAB_NEWER_THAN_0_90 sg_init(0); #else sg_init(); #endif m_iconList << QStringLiteral("modem") << QStringLiteral("monitor") << QStringLiteral("network") << QStringLiteral("wireless"); startTimer(800); settingsChanged(); } LXQtNetworkMonitor::~LXQtNetworkMonitor() = default; void LXQtNetworkMonitor::resizeEvent(QResizeEvent *) { m_stuff.setMinimumWidth(m_pic.width() + 2); m_stuff.setMinimumHeight(m_pic.height() + 2); update(); } void LXQtNetworkMonitor::timerEvent(QTimerEvent * /*event*/) { bool matched = false; #ifdef STATGRAB_NEWER_THAN_0_90 size_t num_network_stats; size_t x; #else int num_network_stats; int x; #endif sg_network_io_stats *network_stats = sg_get_network_io_stats_diff(&num_network_stats); for (x = 0; x < num_network_stats; x++) { if (m_interface == QString::fromLocal8Bit(network_stats->interface_name)) { if (network_stats->rx != 0 && network_stats->tx != 0) { m_pic.load(iconName(QStringLiteral("transmit-receive"))); } else if (network_stats->rx != 0 && network_stats->tx == 0) { m_pic.load(iconName(QStringLiteral("receive"))); } else if (network_stats->rx == 0 && network_stats->tx != 0) { m_pic.load(iconName(QStringLiteral("transmit"))); } else { m_pic.load(iconName(QStringLiteral("idle"))); } matched = true; break; } network_stats++; } if (!matched) { m_pic.load(iconName(QStringLiteral("error"))); } update(); } void LXQtNetworkMonitor::paintEvent(QPaintEvent *) { QPainter p(this); QRectF r = rect(); int leftOffset = (r.width() - m_pic.width() + 2) / 2; int topOffset = (r.height() - m_pic.height() + 2) / 2; p.drawPixmap(leftOffset, topOffset, m_pic); } bool LXQtNetworkMonitor::event(QEvent *event) { if (event->type() == QEvent::ToolTip) { #ifdef STATGRAB_NEWER_THAN_0_90 size_t num_network_stats; size_t x; #else int num_network_stats; int x; #endif sg_network_io_stats *network_stats = sg_get_network_io_stats(&num_network_stats); for (x = 0; x < num_network_stats; x++) { if (m_interface == QString::fromLocal8Bit(network_stats->interface_name)) { setToolTip(tr("Network interface %1").arg(m_interface) + QStringLiteral("
") + tr("Transmitted %1").arg(convertUnits(network_stats->tx)) + QStringLiteral("
") + tr("Received %1").arg(convertUnits(network_stats->rx)) ); } network_stats++; } } return QFrame::event(event); } //void LXQtNetworkMonitor::showConfigureDialog() //{ // LXQtNetworkMonitorConfiguration *confWindow = // this->findChild("LXQtNetworkMonitorConfigurationWindow"); // if (!confWindow) // { // confWindow = new LXQtNetworkMonitorConfiguration(settings(), this); // } // confWindow->show(); // confWindow->raise(); // confWindow->activateWindow(); //} void LXQtNetworkMonitor::settingsChanged() { m_iconIndex = mPlugin->settings()->value(QStringLiteral("icon"), 1).toInt(); m_interface = mPlugin->settings()->value(QStringLiteral("interface")).toString(); if (m_interface.isEmpty()) { #ifdef STATGRAB_NEWER_THAN_0_90 size_t count; #else int count; #endif sg_network_iface_stats* stats = sg_get_network_iface_stats(&count); if (count > 0) m_interface = QString(QLatin1String(stats[0].interface_name)); } m_pic.load(iconName(QStringLiteral("error"))); } QString LXQtNetworkMonitor::convertUnits(double num) { QString unit = tr("B"); QStringList units = QStringList(tr("KiB")) << tr("MiB") << tr("GiB") << tr("TiB") << tr("PiB"); for (QStringListIterator iter(units); num >= 1024 && iter.hasNext();) { num /= 1024; unit = iter.next(); } return QString::number(num, 'f', 2) + QLatin1Char(' ') + unit; } ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitor.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTNETWORKMONITOR_H #define LXQTNETWORKMONITOR_H #include class ILXQtPanelPlugin; /*! TODO: How to define cable is not connected? */ class LXQtNetworkMonitor: public QFrame { Q_OBJECT public: LXQtNetworkMonitor(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~LXQtNetworkMonitor(); virtual void settingsChanged(); protected: void virtual timerEvent(QTimerEvent *event); void virtual paintEvent(QPaintEvent * event); void virtual resizeEvent(QResizeEvent *); bool virtual event(QEvent *event); private: static QString convertUnits(double num); QString iconName(const QString& state) const { return QStringLiteral(":/images/knemo-%1-%2.png") .arg(m_iconList[m_iconIndex], state); } QWidget m_stuff; QStringList m_iconList; int m_iconIndex; QString m_interface; QPixmap m_pic; ILXQtPanelPlugin *mPlugin; }; #endif // LXQTNETWORKMONITOR_H ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitorconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtnetworkmonitorconfiguration.h" #include "ui_lxqtnetworkmonitorconfiguration.h" #include extern "C" { #include } #ifdef __sg_public // since libstatgrab 0.90 this macro is defined, so we use it for version check #define STATGRAB_NEWER_THAN_0_90 1 #endif LXQtNetworkMonitorConfiguration::LXQtNetworkMonitorConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtNetworkMonitorConfiguration), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("NetworkMonitorConfigurationWindow")); ui->setupUi(this); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtNetworkMonitorConfiguration::dialogButtonsAction); connect(ui->iconCB, &QComboBox::currentIndexChanged, this, &LXQtNetworkMonitorConfiguration::saveSettings); connect(ui->interfaceCB, &QComboBox::currentIndexChanged, this, &LXQtNetworkMonitorConfiguration::saveSettings); loadSettings(); } LXQtNetworkMonitorConfiguration::~LXQtNetworkMonitorConfiguration() { delete ui; } void LXQtNetworkMonitorConfiguration::saveSettings() { if (!mLockSettingChanges) { settings().setValue(QStringLiteral("icon"), ui->iconCB->currentIndex()); settings().setValue(QStringLiteral("interface"), ui->interfaceCB->currentText()); } } void LXQtNetworkMonitorConfiguration::loadSettings() { mLockSettingChanges = true; ui->iconCB->setCurrentIndex(settings().value(QStringLiteral("icon"), 1).toInt()); int count; #ifdef STATGRAB_NEWER_THAN_0_90 size_t ret_count; sg_network_iface_stats* stats = sg_get_network_iface_stats(&ret_count); count = (int)ret_count; #else sg_network_iface_stats* stats = sg_get_network_iface_stats(&count); #endif for (int ix = 0; ix < count; ix++) ui->interfaceCB->addItem(QLatin1String(stats[ix].interface_name)); QString interface = settings().value(QStringLiteral("interface")).toString(); ui->interfaceCB->setCurrentIndex(std::max(std::min(0, count - 1), ui->interfaceCB->findText(interface))); mLockSettingChanges = false; } ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitorconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTNETWORKMONITORCONFIGURATION_H #define LXQTNETWORKMONITORCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" class QAbstractButton; namespace Ui { class LXQtNetworkMonitorConfiguration; } class LXQtNetworkMonitorConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtNetworkMonitorConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtNetworkMonitorConfiguration(); private: Ui::LXQtNetworkMonitorConfiguration *ui; bool mLockSettingChanges; private slots: /* Saves settings in conf file. */ void saveSettings(); void loadSettings(); }; #endif // LXQTNETWORKMONITORCONFIGURATION_H ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitorconfiguration.ui ================================================ LXQtNetworkMonitorConfiguration 0 0 285 191 Network Monitor Settings General Icon Modem :/images/knemo-modem-idle.png:/images/knemo-modem-idle.png Monitor :/images/knemo-monitor-idle.png:/images/knemo-monitor-idle.png Network :/images/knemo-network-idle.png:/images/knemo-network-idle.png Wireless :/images/knemo-wireless-idle.png:/images/knemo-wireless-idle.png Interface 0 0 true Qt::Vertical 20 41 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitorplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtnetworkmonitorplugin.h" #include "lxqtnetworkmonitor.h" #include "lxqtnetworkmonitorconfiguration.h" LXQtNetworkMonitorPlugin::LXQtNetworkMonitorPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mWidget(new LXQtNetworkMonitor(this)) { } LXQtNetworkMonitorPlugin::~LXQtNetworkMonitorPlugin() { delete mWidget; } QWidget *LXQtNetworkMonitorPlugin::widget() { return mWidget; } QDialog *LXQtNetworkMonitorPlugin::configureDialog() { return new LXQtNetworkMonitorConfiguration(settings()); } void LXQtNetworkMonitorPlugin::settingsChanged() { mWidget->settingsChanged(); } ================================================ FILE: plugin-networkmonitor/lxqtnetworkmonitorplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTNETWORKMONITORPLUGIN_H #define LXQTNETWORKMONITORPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include class LXQtNetworkMonitor; class LXQtNetworkMonitorPlugin: public QObject, public ILXQtPanelPlugin { Q_OBJECT public: explicit LXQtNetworkMonitorPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtNetworkMonitorPlugin(); virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("NetworkMonitor"); } bool isSeparate() const { return false; } QDialog *configureDialog(); protected: virtual void settingsChanged(); private: LXQtNetworkMonitor *mWidget; }; class LXQtNetworkMonitorPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtNetworkMonitorPlugin(startupInfo); } }; #endif // LXQTNETWORKMONITORPLUGIN_H ================================================ FILE: plugin-networkmonitor/resources/networkmonitor.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin #Icon=network-transmit-receive Icon=network-wired ================================================ FILE: plugin-networkmonitor/resources.qrc ================================================ images/knemo-modem-error.png images/knemo-modem-idle.png images/knemo-modem-offline.png images/knemo-modem-receive.png images/knemo-modem-transmit-receive.png images/knemo-modem-transmit.png images/knemo-monitor-error.png images/knemo-monitor-idle.png images/knemo-monitor-offline.png images/knemo-monitor-receive.png images/knemo-monitor-transmit-receive.png images/knemo-monitor-transmit.png images/knemo-network-error.png images/knemo-network-idle.png images/knemo-network-offline.png images/knemo-network-receive.png images/knemo-network-transmit-receive.png images/knemo-network-transmit.png images/knemo-wireless-error.png images/knemo-wireless-idle.png images/knemo-wireless-offline.png images/knemo-wireless-receive.png images/knemo-wireless-transmit-receive.png images/knemo-wireless-transmit.png ================================================ FILE: plugin-networkmonitor/translations/networkmonitor.desktop.yaml ================================================ Desktop Entry/Name: "Network Monitor" Desktop Entry/Comment: "Displays network status and activity" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ar.desktop.yaml ================================================ Desktop Entry/Name: "مرقاب الشّبكة" Desktop Entry/Comment: "تعرض حالة الشّبكة ونشاطها" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ar.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> واجهة الشبكة <b>%1</b> Transmitted %1 نُقلت %1 Received %1 استُقبلت %1 B بايت KiB ك.بايت MiB م.بايت GiB غ.بايت TiB ت.بايت PiB ب.بايت LXQtNetworkMonitorConfiguration Network Monitor Settings إعدادات مرقاب الشبكة General عام Interface الواجهة Modem مودم Monitor شاشة Network شبكة Wireless لاسلكي Icon الأيقونة ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_arn.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ast.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_bg.desktop.yaml ================================================ Desktop Entry/Name: "Наблюдение на мрежата" Desktop Entry/Comment: "Показва състоянието и активността на мрежата" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_bg.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Мрежов адаптер <b>%1</b> Transmitted %1 Изпратени %1 Received %1 Свалени %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Настройки на монитора на мрежата General Общи Interface Адаптер Modem Модем Monitor Монитор Network Мрежа Wireless Безжична Icon Икона ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ca.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de xarxes" Desktop Entry/Comment: "Mostra l'estat i l'activitat de la xarxa" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ca.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfície de xarxa <b>%1</b> Transmitted %1 S'han transmès %1 Received %1 S'han rebut %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Ajusts del monitor de la xarxa General General Interface Interfície Modem Mòdem Monitor Monitor Network Xarxa Wireless Sense fil Icon Icona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_cs.desktop.yaml ================================================ Desktop Entry/Name: "Monitor sítě" Desktop Entry/Comment: "Zobrazuje stav a aktivity sítě" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_cs.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Síťové rozhraní <b>%1</b> Transmitted %1 Odesláno %1 Received %1 Přijato %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Nastavení sledování sítě General Obecné Interface Rozhraní Modem Modem Monitor Sledování Network Síť Wireless Bezdrátové Icon Ikona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_cy.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_da.desktop.yaml ================================================ Desktop Entry/Name: "Netværksovervågning" Desktop Entry/Comment: "Viser netværksstatus og aktivitet" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_da.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Netværksgrænseflade <b>%1</b> Transmitted %1 Sendt %1 Received %1 Modtaget %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Indstillinger for netværksovervågning General Generelt Interface Grænseflade Modem Modem Monitor Monitor Network Netværk Wireless Trådløs Icon Ikon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_de.desktop.yaml ================================================ Desktop Entry/Name: "Netzwerkmonitor" Desktop Entry/Comment: "Informationen zu Status und Aktivität des Netzwerks" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_de.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Netzwerkschnittstelle <b>%1</b> Transmitted %1 Gesendet %1 Received %1 Empfangen %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Einstellungen des Netzwerkmonitors General Allgemein Interface Schnittstelle Modem Modem Monitor Bildschirm Network Netzwerk Wireless Drahtlos Icon Symbol ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_el.desktop.yaml ================================================ Desktop Entry/Name: "Επόπτης δικτύου" Desktop Entry/Comment: "Εμφάνιση της κατάστασης και της δραστηριότητας του δικτύου" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_el.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Διεπαφή δικτύου <b>%1</b> Transmitted %1 Διαβιβασμένα %1 Received %1 Ειλημμένα %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Ρυθμίσεις του επόπτη δικτύου General Γενικά Interface Διεπαφή Modem Αποδιαμορφωτής Monitor Εποπτεία Network Δίκτυο Wireless Ασύρματο Icon Εικονίδιο ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Network Monitor" Desktop Entry/Comment: "Displays network status and activity" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_en_GB.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Network interface <b>%1</b> Transmitted %1 Transmitted %1 Received %1 Received %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Network Monitor Settings General General Interface Interface Modem Modem Monitor Monitor Network Network Wireless Wireless Icon Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_eo.desktop.yaml ================================================ Desktop Entry/Name: "Ret-observilo" Desktop Entry/Comment: "Elmontras ret-staton kaj -aktivecon" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_eo.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Reta interfaco <b>%1</b> Transmitted %1 Sendita %1 Received %1 Ricevita %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Agordoj por ret-observilo General Ĝenerala Interface Interfaco Modem Modemo Monitor Observilo Network Reto Wireless Sendrata Icon Bildsimbolo ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_es.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de redes" Desktop Entry/Comment: "Muestra el estado y la actividad de la red" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_es.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfaz de red <b>%1</b> Transmitted %1 Transmitidos %1 Received %1 Recibidos %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Configuración del monitor de redes General General Interface Interfaz Modem Módem Monitor Monitor Network Red Wireless Conexión inalámbrica Icon Icono ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_et.desktop.yaml ================================================ Desktop Entry/Name: "Võrguhaldur" Desktop Entry/Comment: "Vaata võrgu olekut ja liikluse mahtu" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_et.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Võrguliides <b>%1</b> Transmitted %1 Saadetud %1 Received %1 Vastu võetud %1 B baiti KiB kilobaiti MiB megabaiti GiB gigabaiti TiB terabaiti PiB petabaiti LXQtNetworkMonitorConfiguration Network Monitor Settings Võrguhalduri seadistused General Põhiseadistused Interface Võrguliides Modem Modem Monitor Monitor Network Võrk Wireless Traadita võrk Icon Ikoon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_eu.desktop.yaml ================================================ Desktop Entry/Name: "Sarearen monitorea" Desktop Entry/Comment: "Bistaratu sarearen egoera eta aktibitatea" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_eu.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> <b>%1</b> sareko interfazea Transmitted %1 %1 transmitituta Received %1 %1 jasota B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Network Monitor ezarpenak General Orokorra Interface Interfazea Modem Modema Monitor Monitorea Network Sarea Wireless Hari gabekoa Icon Ikonoa ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_fi.desktop.yaml ================================================ Desktop Entry/Name: "Verkkoseuranta" Desktop Entry/Comment: "Näyttää verkon tilan ja aktiviteetin" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_fi.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Verkkoliitäntä <b>%1</b> Transmitted %1 Siirretty %1 Received %1 Vastaanotettu %1 B t KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Verkkoseurannan astukset General Yleiset Interface Liitäntä Modem Modeemi Monitor Monitori Network Verkko Wireless Langaton Icon Kuvake ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_fr.desktop.yaml ================================================ Desktop Entry/Name: "Moniteur Réseau" Desktop Entry/Comment: "Affiche le statut et l'activité du réseau" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_fr.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interface réseau <b>%1</b> Transmitted %1 Transmis %1 Received %1 Reçu %1 B o KiB Ko MiB Mo GiB Go TiB To PiB Po LXQtNetworkMonitorConfiguration Network Monitor Settings Paramètres du moniteur réseau General Général Interface Interface Modem Modem Monitor Moniteur Network Réseau Wireless Sans-Fil Icon Icône ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_gl.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interface de rede <b>%1</b> Transmitted %1 Enviados %1 Received %1 Recibidos %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Axustes do monitor de rede General Xeral Interface Modem Módem Monitor Network Rede Wireless Sen fíos Icon Icona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_he.desktop.yaml ================================================ Desktop Entry/Name: "צג הרשת" Desktop Entry/Comment: "מציג את מצב ופעילות הרשת" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_he.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> מנשק רשת <b>%1</b> Transmitted %1 נשלחו %1 Received %1 התקבלו %1 B ב׳ KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings הגדרות צג רשת General כללי Interface מנשק Modem מודם Monitor צג Network רשת Wireless אלחוטי Icon סמל ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_hi.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_hr.desktop.yaml ================================================ Desktop Entry/Name: "Praćenje mreže" Desktop Entry/Comment: "Prikazuje stanje i aktivonst mreže" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_hr.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Mrežno sučelje <b>%1</b> Transmitted %1 Preneseno %1 Received %1 Primljeno %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Praćenje mreže – Postavke General Opće Interface Sučelje Modem Modem Monitor Monitor Network Mreža Wireless Bežično Icon Ikona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_hu.desktop.yaml ================================================ Desktop Entry/Name: "Hálózatfigyelő" Desktop Entry/Comment: "Megjeleníti a hálózat állapotát és aktivitását" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_hu.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Hálózati eszköz <b>%1</b> Transmitted %1 Küldött %1 Received %1 Fogadott %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Hálózatfigyelő beállítások General Általános Interface Eszköz Modem Modem Monitor Network Hálózat Wireless Vezeték nélküli Icon Ikon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_id.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Antarmuka jaringan <b>%1</b> Transmitted %1 Dikirim %1 Received %1 Diterima %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Pengaturan Monitor Jaringan General Umum Interface Antarmuka Modem Modem Monitor Monitor Network Jaringan Wireless Nirkabel Icon Ikon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_is.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Netviðmót Transmitted %1 Sent %1 Received %1 Móttekið %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Stillingar Neteftirlits General Almennt Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_it.desktop.yaml ================================================ Desktop Entry/Name: "Monitor di rete" Desktop Entry/Comment: "Mostra stato e attività della rete" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_it.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfaccia di rete <b>%1</b> Transmitted %1 Trasmessi %1 Received %1 Ricevuti %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Impostazioni monitor di rete General Generale Interface Interfaccia Modem Modem Monitor Monitor Network Rete Wireless Senza fili Icon Icona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ja.desktop.yaml ================================================ Desktop Entry/Name: "ネットワークモニター" Desktop Entry/Comment: "ネットワークの状態や動作状況を表示します" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ja.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> ネットワークインターフェース <b>%1</b> Transmitted %1 送信済 %1 Received %1 受信済 %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings ネットワークモニターの設定 General 全般 Interface インターフェース Modem モデム Monitor モニター Network ネットワーク Wireless 無線 Icon アイコン ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ka.desktop.yaml ================================================ Desktop Entry/Name: "ქსელის მონიტორი" Desktop Entry/Comment: "აჩვენებს ქსელის სტატუსს და აქტივობა" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ka.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> ქსელის ინტერფეისი <b>%1</b> Transmitted %1 გადაცემულია %1 Received %1 მიღებულია %1 B KiB კიბ MiB მიბ GiB გიბ TiB ტიბ PiB პიბ LXQtNetworkMonitorConfiguration Network Monitor Settings ქსელის მონიტორის მორგება General ზოგადი Interface ინტერფეისი Modem მოდემი Monitor მონიტორი Network ქსელი Wireless უსადენო Icon ხატულა ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_kab.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_kab.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Agrudem Modem Monitor Network Aẓeṭṭa Wireless Icon Tignit ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_kk.desktop.yaml ================================================ Desktop Entry/Name: "Желі бақылаушысы" Desktop Entry/Comment: "Желілік күйді және белсенділікті көрсетеді" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_kk.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Желілік интерфейс <b>%1</b> Transmitted %1 Жіберілді %1 Received %1 Қабылданды %1 B Б KiB КиБ MiB МиБ GiB ГиБ TiB ТиБ PiB ПиБ LXQtNetworkMonitorConfiguration Network Monitor Settings Желілік монитор баптаулары General Жалпы Interface Интерфейс Modem Модем Monitor Монитор Network Желі Wireless Сымсыз Icon Таңбаша ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ko.desktop.yaml ================================================ Desktop Entry/Name: "네트워크 모니터" Desktop Entry/Comment: "네트워크 상태 및 활동을 표시합니다" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ko.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> 네트워크 인터페이스 <b>%1</b> Transmitted %1 %1 전송됨 Received %1 %1 수신됨 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings 네트워크 모니터 설정 General 일반 Interface 인터페이스 Modem 모뎀 Monitor 모니터 Network 네트워크 Wireless 무선 Icon 아이콘 ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kalabiriza Kayungirizi" Desktop Entry/Comment: "Kano kalaga ebifa ku kayungirizi" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lg.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Mukutu gwa kayungirizi <b>%1</b> Transmitted %1 Gwakasindika %1 Received %1 Gwakayingiza %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Enteekateeka za kalabiriza kayungirizi General Eby'awamu Interface Mukutu Modem Modemu Monitor Ntimbe Network Kayungirizi Wireless Kayungirizi etakozesa waya Icon Kafaananyi ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lt.desktop.yaml ================================================ Desktop Entry/Name: "Tinklo prižiūryklė" Desktop Entry/Comment: "Rodo tinklo būseną ir veiklą" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lt.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Tinklo sąsaja <b>%1</b> Transmitted %1 Persiųsta %1 Received %1 Gauta %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Tinklo prižiūryklės nustatymai General Bendra Interface Sąsaja Modem Modemas Monitor Monitorius Network Tinklas Wireless Belaidis Icon Piktograma ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lv.desktop.yaml ================================================ Desktop Entry/Name: "Tīkla vērotājs" Desktop Entry/Comment: "Rāda tīkla statusu un aktivitātes" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_lv.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Tīkla saskarne <b>%1</b> Transmitted %1 Nosūtīts %1 Received %1 Saņemts %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Tīkla vērotāja iestatījumi General Vispārīgie Interface Saskarne Modem Modems Monitor Vērotājs/monitors Network Tīkls Wireless Bezvadu Icon Ikona/piktogramma ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Nettverksmonitor" Desktop Entry/Comment: "Viser nettverksstatus og aktivitet" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_nb_NO.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Nettverksgrensesnitt <b>%1</b> Transmitted %1 Sendt %1 Received %1 Mottatt %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Nettverkovervåkingsinnstillinger General Generelt Interface Grensesnitt Modem Monitor Skjerm Network Nettverk Wireless Trådløst Icon Ikon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_nl.desktop.yaml ================================================ Desktop Entry/Name: "Netwerkmonitor" Desktop Entry/Comment: "Toont netwerkstatus en -activiteit" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_nl.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Netwerkkaart <b>%1</b> Transmitted %1 Verstuurd %1 Received %1 Ontvangen %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Netwerkmonitor-instellingen General Algemeen Interface Netwerkkaart Modem Modem Monitor Monitor Network Netwerk Wireless Draadloos Icon Pictogram ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_oc.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de rets" Desktop Entry/Comment: "Aficha l’estat e activitat del ret" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_oc.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfàcia ret <b>%1</b> Transmitted %1 Transmés %1 Received %1 Recebut %1 B o KiB Ko MiB Mo GiB Go TiB To PiB Po LXQtNetworkMonitorConfiguration Network Monitor Settings Paramètres del monitor ret General General Interface Interfàcia Modem Modèm Monitor Monitor Network Ret Wireless Sens fial Icon Icòna ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਨੈੱਟਵਰਕ ਨਿਗਰਾਨ" Desktop Entry/Comment: "ਨੈੱਟਵਰਕ ਦੀ ਸਥਿਤੀ ਅਤੇ ਸਰਗਰਮੀ ਦਿਖਾਉਂਦਾ ਹੈ" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pa.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> ਨੈੱਟਵਰਕ ਇੰਟਰਫੇਸ <b>%1</b> Transmitted %1 ਭੇਜੇ %1 Received %1 ਮਿਲੇ %1 B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings ਨੈੱਟਵਰਕ ਨਿਗਰਾਨ ਸੈਟਿੰਗਾਂ General ਆਮ Interface ਇੰਟਰਫੇਸ Modem ਮਾਡਮ Monitor ਮਾਨੀਟਰ Network ਨੈੱਟਵਰਕ Wireless ਬੇਤਾਰ Icon ਆਈਕਾਨ ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pl.desktop.yaml ================================================ Desktop Entry/Name: "Monitorowanie sieci" Desktop Entry/Comment: "Wyświetla stan i aktywność sieci" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pl.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfejs sieci <b>%1</b> Transmitted %1 Przesłano %1 Received %1 Otrzymano %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Ustawienia monitora sieci General Ogólne Interface Interfejs Modem Modem Monitor Monitor Network Sieć Wireless Bezprzewodowe Icon Ikona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pt.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de rede" Desktop Entry/Comment: "Mostra o estado e atividade da rede" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pt.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interface de rede <b>%1</b> Transmitted %1 Enviados %1 Received %1 Recebidos %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Definições do Monitor de rede General Geral Interface Interface Modem Modem Monitor Monitorizar Network Rede Wireless Rede sem fios Icon Ícone ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Monitor de Rede" Desktop Entry/Comment: "Mostra atividade e estado da rede" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_pt_BR.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interface de rede <b>%1</b> Transmitted %1 Transmitido(s) %1 Received %1 Recebido(s) %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Configurações do monitor de rede General Geral Interface Modem Monitor Monitor Network Rede Wireless Sem fio Icon Ícone ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ro_RO.desktop.yaml ================================================ Desktop Entry/Name: "Monitor rețea" Desktop Entry/Comment: "Afisează starea și activitatea rețelei" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ro_RO.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Interfață rețea <b>%1</b> Transmitted %1 Transmis %1 Received %1 Recepționat %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Setări monitorizare rețea General General Interface Interfață Modem Modem Monitor Monitorizare Network Rețea Wireless Wireless Icon Pictogramă ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ru.desktop.yaml ================================================ Desktop Entry/Name: "Сетевой Монитор" Desktop Entry/Comment: "Отображает сетевой статус и активность" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_ru.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Сетевой интерфейс <b>%1</b> Transmitted %1 Передано %1 Received %1 Получено %1 B Б KiB КиБ MiB МиБ GiB ГиБ TiB ТиБ PiB ПиБ LXQtNetworkMonitorConfiguration Network Monitor Settings Настройки сетевого монитора General Общие Interface Интерфейс Modem Модем Monitor Монитор Network Сеть Wireless Беспроводная сеть Icon Значок ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_si.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Transmitted %1 Received %1 B KiB MiB GiB TiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General Interface Modem Monitor Network Wireless Icon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sk.desktop.yaml ================================================ Desktop Entry/Name: "Monitor siete" Desktop Entry/Comment: "Zobrazuje stav siete a sieťové aktivity" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sk_SK.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Sieťové rozhranie <b>%1</b> Transmitted %1 Odoslané %1 Received %1 Prijaté %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Nastavenie sledovania siete General Všeobecné Interface Rozhranie Modem Modem Monitor Monitor Network Sieť Wireless Bezdrôtové Icon Ikona ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sr.desktop.yaml ================================================ Desktop Entry/Name: "Мрежни монитор" Desktop Entry/Comment: "Приказује статус мреже и активност" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sr.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Мрежни интерфејс <b>%1</b> Transmitted %1 Пренесено %1 Received %1 Примљено %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Подешавање мрежног монитора General Опште Interface Интерфејс Modem Модем Monitor Монитор Network Мрежа Wireless Бежични Icon Икона ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sr@ijekavian.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Мрежни интерфејс <b>%1</b> Transmitted %1 Пренесено %1 Received %1 Примљено %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Поставке мрежног монитора General Опште Interface Интерфејс Modem Модем Monitor Монитор Network Мрежа Wireless Бежични Icon Икона ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Meni pokretača programa" Desktop Entry/Comment: "Automatsko suspendovanje" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sv.desktop.yaml ================================================ Desktop Entry/Name: "Nätverksövervakare" Desktop Entry/Comment: "Information om nätverkets status och aktivitet" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_sv.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Nätverksgränssnitt <b>%1</b> Transmitted %1 Överfört %1 Received %1 Mottagit %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings Inställningar för nätverksövervakaren General Allmänt Interface Gränssnitt Modem Modem Monitor Bildskärm Network Nätverk Wireless Trådlös Icon Ikon ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_th.desktop.yaml ================================================ Desktop Entry/Name: "เฝ้าสังเกตเครือข่าย" Desktop Entry/Comment: "เฝ้าสังเกตเครือข่าย" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_th_TH.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> ส่วนติดต่อเครือข่าย <b>%1</b> Transmitted %1 ส่ง %1 Received %1 รับ %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB PiB LXQtNetworkMonitorConfiguration Network Monitor Settings General ทั่วไป Interface ส่วนติดต่อ Modem โมเด็ม Monitor เฝ้าสังเกต Network เครือข่าย Wireless ไรัสาย Icon ไอคอน ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_tr.desktop.yaml ================================================ Desktop Entry/Name: "Ağ izleme" Desktop Entry/Comment: "Ağ iletişimi izleme ve yönetme" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_tr.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Ağ arayüzü <b>%1</b> Transmitted %1 Gönderilen %1 Received %1 Alınan %1 B B KiB KB MiB MB GiB GB TiB TB PiB PB LXQtNetworkMonitorConfiguration Network Monitor Settings Ağ İzleme ayarları General Genel Interface Arayüz Modem Modem Monitor Ekran Network Wireless Kablosuz Icon Simge ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_uk.desktop.yaml ================================================ Desktop Entry/Name: "Монітор мережі" Desktop Entry/Comment: "Показує стан та активність мережі" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_uk.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> Мережевий адаптер <b>%1</b> Transmitted %1 Передано %1 Received %1 Прийнято %1 B Б KiB КіБ MiB МіБ GiB ГіБ TiB ТіБ PiB ПіБ LXQtNetworkMonitorConfiguration Network Monitor Settings Налаштуванян монітору мережі General Загальне Interface Адаптер Modem Модем Monitor Монітор Network Мережевий Wireless Бездротовий Icon Піктограма ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "网络监视器" Desktop Entry/Comment: "显示网络的状态与活动" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_zh_CN.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> 网络接口 <b>%1</b> Transmitted %1 已传输 %1 Received %1 已接收 %1 B B KiB KiB MiB MiB GiB GiB TiB TiB PiB TiB LXQtNetworkMonitorConfiguration Network Monitor Settings 网络监测器设置 General 常规 Interface 接口 Modem 调制解调器 Monitor 监测器 Network 网络 Wireless 无线 Icon 图标 ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "網路監視器" Desktop Entry/Comment: "顯示網路狀態與活動" ================================================ FILE: plugin-networkmonitor/translations/networkmonitor_zh_TW.ts ================================================ LXQtNetworkMonitor Network interface <b>%1</b> 網路介面 <b>%1</b> Transmitted %1 傳送 %1 Received %1 接收 %1 B B KiB KB MiB MB GiB GB TiB TB PiB PB LXQtNetworkMonitorConfiguration Network Monitor Settings 網路監示器設定 General 通則 Interface 介面 Modem 數據機 Monitor 監示器 Network 網路 Wireless 無線 Icon 圖示 ================================================ FILE: plugin-qeyes/CMakeLists.txt ================================================ set(PLUGIN "qeyes") set(HEADERS qeyes.h qeyesimagewidget.h qeyesvectorwidget.h qeyeswidget.h qeyesconfigdialog.h ) set(SOURCES qeyes.cpp qeyesimagewidget.cpp qeyesvectorwidget.cpp qeyeswidget.cpp qeyesconfigdialog.cpp ) set(LIBRARIES ${LIBRARIES} ) add_subdirectory(types) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-qeyes/qeyes.cpp ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "../panel/pluginsettings.h" #include "qeyesconfigdialog.h" #include "qeyes.h" ILXQtPanelPlugin *QEyesPluginLibrary::instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new QEyesPlugin(startupInfo); } QEyesPlugin::QEyesPlugin(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo) { w0 = new QWidget(); l = new QVBoxLayout(); l->setSpacing(0); l->setContentsMargins (0, 0, 0, 0); w0->setLayout(l); w = new QEyesVectorWidget(); l->addWidget(w); w->setTransparent(true); vectorEyes = true; settingsChanged(); realign(); } void QEyesPlugin::realign() { const auto g = panel()->globalGeometry(); if (panel()->isHorizontal()) { w->setMinimumHeight(g.height() / 2); w->setMinimumWidth(0.8 * g.height() * w->getNumEyes() ); } else { w->setMinimumWidth(g.width() / 2); w->setMinimumHeight(g.width()); } w->update(); } static bool loadImage(QString path, QEyesImageWidget *w) { QFile file(path + QStringLiteral("/config")); file.open(QIODevice::ReadOnly); QTextStream in(&file); QString eye, pupil; int num=1, wall=1; while(!in.atEnd()) { QString line = in.readLine(); QStringList fields = line.split(QLatin1String("=")); const auto name = fields.at(0).trimmed(); auto value = fields.at(1).trimmed(); if (value.size() > 1 && value.at(0) == QChar(QLatin1Char('"'))) value = value.mid(1, value.size() - 2); if (name == QStringLiteral("wall-thickness")) { wall = value.toInt(); } else if (name == QStringLiteral("eye-pixmap")) { eye = path + QStringLiteral("/") + value; } else if (name == QStringLiteral("pupil-pixmap")) { pupil = path + QStringLiteral("/") + value; } else if (name.trimmed() == QStringLiteral("num-eyes")) { num = value.toInt(); } } return w->load(eye, pupil, wall, num); } void QEyesPlugin::settingsChanged() { PluginSettings *_settings = settings(); const auto type = _settings->value(QStringLiteral("eye_type"), internalEye).toString(); if (type == internalEye && !vectorEyes) { l->removeWidget(w); delete w; w = new QEyesVectorWidget(); l->addWidget(w); w->setTransparent(true); vectorEyes = true; } else if (type != internalEye && vectorEyes) { l->removeWidget(w); delete w; w = new QEyesImageWidget(); l->addWidget(w); w->setTransparent(true); vectorEyes = false; } if (type != internalEye && !vectorEyes) { if (!loadImage(type, dynamic_cast(w))) { l->removeWidget(w); delete w; w = new QEyesVectorWidget(); l->addWidget(w); w->setTransparent(true); vectorEyes = true; _settings->setValue(QStringLiteral("eye_type"), internalEye); std::cerr << "ERROR: crash during load image\n" ; } } w->setNumEyes(_settings->value(QStringLiteral("num_eyes"), QLatin1String("2")).toInt()); realign(); } QDialog * QEyesPlugin::configureDialog() { return new QEyesConfigDialog(settings(), this); } const QString QEyesPlugin::internalEye = QStringLiteral(""); ================================================ FILE: plugin-qeyes/qeyes.h ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "../panel/ilxqtpanelplugin.h" #include "qeyesvectorwidget.h" #include "qeyesimagewidget.h" class QEyesPlugin : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: QEyesPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); virtual QWidget *widget() override { return w0; } virtual QString themeId() const override{ return QStringLiteral("QEyesPlugin"); } virtual void realign() override; virtual Flags flags() const override { return HaveConfigDialog ; } virtual QDialog * configureDialog() override; virtual void settingsChanged() override; static const QString internalEye; private: QWidget *w0; QVBoxLayout *l; QAbstractEyesWidget *w; bool vectorEyes = true; }; class QEyesPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const; }; ================================================ FILE: plugin-qeyes/qeyesconfigdialog.cpp ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include "qeyesconfigdialog.h" #include "qeyes.h" QEyesConfigDialog::QEyesConfigDialog(PluginSettings *sts, ILXQtPanelPlugin *plugin_, QWidget *parent) : QDialog(parent), _settings(sts), plugin(plugin_) { auto l1 = new QGridLayout(); setLayout(l1); auto f = new QGroupBox(tr("Appearance")); l1->addWidget(f, 10, 10, 10, 11); auto l = new QGridLayout(); f->setLayout(l); l->addWidget(new QLabel(tr("Number of eyes")), 10, 10); numEyesWidget = new QSpinBox(); l->addWidget(numEyesWidget, 10, 20); numEyesWidget->setMaximum(10); numEyesWidget->setMinimum(1); l->addWidget(new QLabel(tr("Type")), 20, 10); typesWidget = new QComboBox(); l->addWidget(typesWidget, 20, 20); auto b = new QPushButton(tr("Close")); l1->addWidget(b, 50, 10); connect(b, &QPushButton::clicked, this, &QEyesConfigDialog::updateAndClose); b->setDefault(true); b = new QPushButton(tr("Reset")); l1->addWidget(b, 50, 20); connect(b, &QPushButton::clicked, this, &QEyesConfigDialog::resetValue); setWindowTitle(tr("QEyes Settings")); connect(numEyesWidget, qOverload(&QSpinBox::valueChanged), this, &QEyesConfigDialog::updateValues); connect(typesWidget, qOverload(&QComboBox::currentIndexChanged), this, &QEyesConfigDialog::updateValues); } void QEyesConfigDialog::showEvent(QShowEvent *) { old_num_eyes = _settings->value(QStringLiteral("num_eyes"), QStringLiteral("2")).toInt(); old_type_eyes = _settings->value(QStringLiteral("eye_type"), QEyesPlugin::internalEye).toString(); buildList(); bool found = false; for (const auto &item : std::as_const(types)) { if (old_type_eyes == item) { found = true; break; } } if (!found) old_type_eyes = QEyesPlugin::internalEye; typesWidget->blockSignals(true); numEyesWidget->blockSignals(true); typesWidget->clear(); typesWidget->addItem(tr("QEyes default")); for (auto it = types.constBegin(), end = types.constEnd(); it != end; it++) { typesWidget->addItem(it.key()); } resetValue(); adjustSize(); typesWidget->blockSignals(false); numEyesWidget->blockSignals(false); } void QEyesConfigDialog::resetValue() { int actIndex = 0; int c = 1; // 0 is for (const auto &item : std::as_const(types)) { if (old_type_eyes == item) actIndex = c; c++; } typesWidget->setCurrentIndex(actIndex); numEyesWidget->setValue(old_num_eyes); } void QEyesConfigDialog::updateValues(int) { _settings->setValue(QStringLiteral("num_eyes"), numEyesWidget->value()); if (typesWidget->currentIndex() == 0 || !types.contains(typesWidget->currentText())) { _settings->setValue(QStringLiteral("eye_type"), QEyesPlugin::internalEye); } else { _settings->setValue(QStringLiteral("eye_type"), types[typesWidget->currentText()]); } _settings->sync(); plugin->settingsChanged(); } void QEyesConfigDialog::updateAndClose() { updateValues(0); done(QDialog::Accepted); } void QEyesConfigDialog::buildList() { types.clear(); for (const char *root : { LXQT_SHARE_DIR "/panel/qeyes-types/", "$HOMEDATA" }) { if (!strcmp(root, "$HOMEDATA")) { static char buf[1024]; if (!getenv("XDG_DATA_HOME")) continue; snprintf(buf, 1023, "%s/lxqt/panel/qeyes-types/", getenv("XDG_DATA_HOME")); root = buf; } auto dir = QDir(QLatin1String(root)); auto list = dir.entryList(); for (auto const & path : list) { const auto fn = QString(QLatin1String(root) + QStringLiteral("/") + path + QStringLiteral("/config")); QFileInfo f(fn); if (fn == QStringLiteral(".") || fn == QStringLiteral("..")) continue; if (!f.exists()) continue; if (!f.isFile()) continue; types[path] = QString(QLatin1String(root) + QStringLiteral("/") + path); } } } ================================================ FILE: plugin-qeyes/qeyesconfigdialog.h ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include "../panel/pluginsettings.h" #include "../panel/ilxqtpanelplugin.h" class QEyesConfigDialog : public QDialog { private: Q_OBJECT public: QEyesConfigDialog(PluginSettings *_settings, ILXQtPanelPlugin *plugin, QWidget *parent = nullptr); private: QSpinBox *numEyesWidget; QComboBox *typesWidget; PluginSettings *_settings; QMap types; ILXQtPanelPlugin *plugin; void buildList(); void resetValue(); void updateAndClose(); int old_num_eyes; QString old_type_eyes; void showEvent(QShowEvent *) override; public slots: void updateValues(int); }; ================================================ FILE: plugin-qeyes/qeyesimagewidget.cpp ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include "qeyesimagewidget.h" bool ImageStretcher::load(const QString& fn) { if (fn.endsWith(QString::fromUtf8(".svg"), Qt::CaseInsensitive)) { svg = true; if (!svgrender.load(fn)) return false; } else { if (!origImage.load(fn)) return false; svg = false; } stretchedImage = QPixmap(); return true; } QPixmap & ImageStretcher::ImageStretcher::getImage(int w, int h) { if (w == stretchedImage.width() && h == stretchedImage.height()) return stretchedImage; if (svg) { stretchedImage = QPixmap(w, h); stretchedImage.fill(QColor(0, 0, 0, 0)); QPainter painter(&stretchedImage); svgrender.render(&painter, stretchedImage.rect()); } else { stretchedImage = origImage.scaled(w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } return stretchedImage; } int ImageStretcher::origWidth() { if (svg) return svgrender.viewBox().width(); else return origImage.width(); } int ImageStretcher::origHeight() { if (svg) return svgrender.viewBox().height(); else return origImage.height(); } int ImageStretcher::stretchedWidth() { return stretchedImage.width(); } int ImageStretcher::stretchedHeight() { return stretchedImage.height(); } void QEyesImageWidget::drawEye(QPainter &painter, int x, int y, int dx, int dy) { painter.drawPixmap(x, y, background.getImage(dx, dy)); } void QEyesImageWidget::drawPupil(QPainter &painter, int x, int y) { auto & img = pupil.getImage( pupil.origWidth() * background.stretchedWidth() / background.origWidth(), pupil.origHeight() * background.stretchedHeight() / background.origHeight()); painter.drawPixmap(x - img.width() / 2, y - img.height() / 2, img); } void QEyesImageWidget::eyeBorder(float &bx, float &by) { bx = borderXStretched; by = borderYStretched; } bool QEyesImageWidget::load(const QString &eye, const QString &pupil_, int wall, int num) { if (num < 1 || num > 10) return false; borderY = borderX = wall; if (!pupil.load(pupil_)) return false; if (!background.load(eye)) return false; numEyes = num; return true; } void QEyesImageWidget::paintEvent(QPaintEvent *event) { if (width() != oldWidth || height() != oldHeight) { const auto dx = width() / numEyes; background.getImage(dx, height()); borderYStretched = borderY * background.stretchedHeight() / background.origHeight(); borderXStretched = borderX * background.stretchedWidth() / background.origWidth(); oldWidth = width(); oldHeight = height(); } QAbstractEyesWidget::paintEvent(event); } ================================================ FILE: plugin-qeyes/qeyesimagewidget.h ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #pragma once #include #include "qeyeswidget.h" class ImageStretcher { bool svg; QSvgRenderer svgrender; QPixmap origImage, stretchedImage; public: bool load(const QString &fn); QPixmap &getImage(int w, int h); int origWidth(); int origHeight(); int stretchedWidth(); int stretchedHeight(); }; class QEyesImageWidget : public QAbstractEyesWidget { private: void drawEye(QPainter &painter, int x, int y, int dx, int dy) override; void drawPupil(QPainter &painter, int x, int y) override; virtual void eyeBorder(float &bx, float &by) override; void paintEvent(QPaintEvent *event) override; ImageStretcher pupil, background; int oldWidth = -1, oldHeight = -1; float borderY = 0, borderXStretched = 0; float borderX = 0, borderYStretched = 0; public: //QEyesImageWidget(const QString &path = QString(), QWidget *parent = nullptr); QEyesImageWidget(QWidget *parent = nullptr) : QAbstractEyesWidget(parent) {} bool load(const QString &eye, const QString &pupil, int wall, int num); }; ================================================ FILE: plugin-qeyes/qeyesplugin.desktop ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=user-desktop Name=QEye Comment=QEye ================================================ FILE: plugin-qeyes/qeyesvectorwidget.cpp ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "qeyesvectorwidget.h" QEyesVectorWidget::QEyesVectorWidget(QWidget *parent) : QAbstractEyesWidget(parent) {} void QEyesVectorWidget::drawEye(QPainter &painter, int x, int y, int dx, int dy) { float w = width() / numEyes < height() ? width() / numEyes: height(); w *= lineWidth; if (w < lineMinWidth) w = lineMinWidth; painter.setPen(borderColor); auto pen = painter.pen(); pen.setWidth(w); painter.setPen(pen); QRadialGradient grad(x + dx / 2.0, y + dy / 2.0, std::max(dx, dy)); grad.setColorAt(0, centerColor); grad.setColorAt(1, peripheralColor); painter.setBrush(grad); painter.drawEllipse(x + w, y + w, dx - 2.0 * w, dy - 2.0 * w); } void QEyesVectorWidget::drawPupil(QPainter &painter, int x, int y) { float w = width() / numEyes < height() ? width() / numEyes: height(); w *= lineWidth; if (w < lineMinWidth) w = lineMinWidth; const auto psize = w * pupilSize; auto pen = painter.pen(); pen.setWidth(1); painter.setBrush(QColor(pupilColor)); painter.setPen(QColor(pupilColor)); painter.drawEllipse(QPoint(x, y), (int)(psize / 2.0), (int)(psize / 2.0)); } void QEyesVectorWidget::eyeBorder(float &bx, float &by) { float w = width() / numEyes < height() ? width() / numEyes: height(); w *= lineWidth; if (w < lineMinWidth) w = lineMinWidth; const auto psize = w * pupilSize; bx = by = 1.5 * w + psize/2; } ================================================ FILE: plugin-qeyes/qeyesvectorwidget.h ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #pragma once #include "qeyeswidget.h" class QEyesVectorWidget : public QAbstractEyesWidget { Q_OBJECT float lineWidth = 0.08f; int lineMinWidth = 1; float pupilSize = 3.0f; /* relative to line width */ QString borderColor = QString::fromUtf8("black"); QString pupilColor = QString::fromUtf8("black"); QString centerColor = QString::fromUtf8("white"); QString peripheralColor = QString::fromUtf8("light-gray"); virtual void drawEye(QPainter &painter, int x, int y, int dx, int dy) override; virtual void drawPupil(QPainter &painter, int x, int y) override; virtual void eyeBorder(float &bx, float &by) override; public: QEyesVectorWidget(QWidget *parent = nullptr); void setBorderColor(const QString &color) { borderColor = color; } void setCenterColor(const QString &color) { centerColor = color; } void setPupilColor(const QString &color) { pupilColor = color; } void setPeripheralColor(const QString &color) { peripheralColor = color; } }; ================================================ FILE: plugin-qeyes/qeyeswidget.cpp ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include "qeyeswidget.h" QAbstractEyesWidget::QAbstractEyesWidget(QWidget *parent) : QWidget(parent) { connect(&timer, &QTimer::timeout, this, &QAbstractEyesWidget::timeout); setMouseTracking(true); if (!underMouse()) { timer.setInterval(timerTimeout); timer.start(); } //setContextMenuPolicy(Qt::CustomContextMenu); //connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), // this, SLOT(showContextMenu(const QPoint &))); } QAbstractEyesWidget::~QAbstractEyesWidget() { timer.stop(); } void QAbstractEyesWidget::leaveEvent(QEvent *) { timer.setInterval(timerTimeout); timer.start(); } void QAbstractEyesWidget::enterEvent(QEnterEvent *) { timer.stop(); } void QAbstractEyesWidget::mouseMoveEvent(QMouseEvent *) { repaint(); } void QAbstractEyesWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); if (!transparent) { painter.fillRect(0, 0, width(), height(), bgColor); } else { painter.fillRect(0, 0, width(), height(), Qt::transparent); } const auto dx = 1.0 * width() / numEyes; for (int i = 0 ; i < numEyes ; i++) drawEye(painter, i * dx, 0, dx+0.9, height()); const auto pos = mapFromGlobal(QCursor::pos()); float borderX, borderY; eyeBorder(borderX, borderY); for (int i = 0 ; i < numEyes ; i++) { /* center of the eye */ const auto x0 = i * dx + dx / 2 ; const auto y0 = height() / 2; /* radius of the ellipse */ const float ry = height() / 2 - borderY; const float rx = dx / 2 - borderX; /* angle */ const float dx = pos.x() - x0; const float dy = pos.y() - y0; /* * dy y ry sin(alpha) * ---- = --- = ---- * ------------- * dx x rx cos(alpha) * * * dy / ry sin(alpha) * --------- = ------------- = tan(alpha) * dx / rx cos(alpha) * * * alpha = atan2( dy/rx, dx/rx) * */ const auto alpha = atan2(dy/ry, dx/rx); /* pupil center */ auto y = ry * sin(alpha); auto x = rx * cos(alpha); /* * if the cursor is inside the eye, the pupil position is * the cursor */ if (y <= 0 && dy <= 0 && dy > y) y = dy; else if (y >= 0 && dy >= 0 && dy < y) y = dy; if (x <= 0 && dx <= 0 && dx > x) x = dx; else if (x >= 0 && dx >= 0 && dx < x) x = dx; //painter.drawEllipse(QPoint(x0 + x, y0 + y), psize / 2, psize / 2); drawPupil(painter, x0 +x, y0 + y); } } void QAbstractEyesWidget::timeout() { const auto pos = mapFromGlobal(QCursor::pos()); if (pos == previousPos) return; previousPos = pos; update(); } ================================================ FILE: plugin-qeyes/qeyeswidget.h ================================================ /* * qeyes - an xeyes clone * * Copyright (C) 2022 Goffredo Baroncelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #pragma once #include #include #include #include class QAbstractEyesWidget : public QWidget { Q_OBJECT QTimer timer; QPoint previousPos; int timerTimeout = 100; /* unit ms */ QString bgColor = QString::fromUtf8("white"); bool transparent = false; private slots: void timeout(); protected: int numEyes = 3; private: void leaveEvent(QEvent *) override; void enterEvent(QEnterEvent *) override; void mouseMoveEvent(QMouseEvent *) override; protected: virtual void drawEye(QPainter &painter, int x, int y, int dx, int dy) = 0; virtual void drawPupil(QPainter &painter, int x, int y) = 0; virtual void eyeBorder(float &bx, float &by) = 0; void paintEvent(QPaintEvent *event) override; public: QAbstractEyesWidget(QWidget *parent = nullptr); ~QAbstractEyesWidget(); void setNumEyes(int n) { numEyes = n; } int getNumEyes() { return numEyes; } void setBGColor(const QString &color) { bgColor = color; } void setTransparent(bool t = true) { transparent = t; } }; ================================================ FILE: plugin-qeyes/resources/qeyes.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=qeyes ================================================ FILE: plugin-qeyes/translations/qeyes.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "A follow the mouse demo" ================================================ FILE: plugin-qeyes/translations/qeyes.ts ================================================ QEyesConfigDialog Appearance Number of eyes Type Close Reset QEyes Settings QEyes default ================================================ FILE: plugin-qeyes/translations/qeyes_ar.desktop.yaml ================================================ Desktop Entry/Name: "كيو آيز" Desktop Entry/Comment: "اتبع العرض التوضيحي للماوس" ================================================ FILE: plugin-qeyes/translations/qeyes_ar.ts ================================================ QEyesConfigDialog Appearance مظهر Number of eyes عدد العيون Type كتابة Close أغلق Reset إعادة ضبط QEyes Settings إعداد كيو آيز QEyes default إعداد كيو آيز الافتراضي ================================================ FILE: plugin-qeyes/translations/qeyes_bg.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Следвайте демонстрацията на мишката" ================================================ FILE: plugin-qeyes/translations/qeyes_bg.ts ================================================ QEyesConfigDialog Appearance Външен вид Number of eyes Брой на очите Type Тип Close Затваряне Reset Рестартиране QEyes Settings Настройки на QEyes QEyes default QEyes по подразбиране ================================================ FILE: plugin-qeyes/translations/qeyes_ca.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Una demostració de seguir el ratolí" ================================================ FILE: plugin-qeyes/translations/qeyes_ca.ts ================================================ QEyesConfigDialog Appearance Aparença Number of eyes Nombre d'ulls Type Tipus Close Tanca Reset Restableix QEyes Settings Configuració del QEyes QEyes default QEyes per defecte ================================================ FILE: plugin-qeyes/translations/qeyes_cs.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Demo „následovat myš“" ================================================ FILE: plugin-qeyes/translations/qeyes_cs.ts ================================================ QEyesConfigDialog Appearance Vzhled Number of eyes Počet očí Type Typ Close Zavřít Reset Vrátit na výchozí QEyes Settings Nastavení pro QEyes QEyes default Výchozí pro QEyes ================================================ FILE: plugin-qeyes/translations/qeyes_da.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "En følg musemarkør demo" ================================================ FILE: plugin-qeyes/translations/qeyes_da.ts ================================================ QEyesConfigDialog Appearance Udseende Number of eyes Antal øjne Type Type Close Luk Reset Nulstil QEyes Settings QEyes indstillinger QEyes default QEyes standard ================================================ FILE: plugin-qeyes/translations/qeyes_de.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Eine Demo zum Folgen der Maus" ================================================ FILE: plugin-qeyes/translations/qeyes_de.ts ================================================ QEyesConfigDialog Appearance Erscheinungsbild Number of eyes Anzahl der Augen Type Typ Close Schließen Reset Zurücksetzen QEyes Settings QEyes-Einstellung QEyes default QEyes-Vorgabe ================================================ FILE: plugin-qeyes/translations/qeyes_el.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Μια επίδειξη παρακολούθησης του ποντικιού" ================================================ FILE: plugin-qeyes/translations/qeyes_el.ts ================================================ QEyesConfigDialog Appearance Εμφάνιση Number of eyes Αριθμός ματιών+ Type Τύπος Close Κλείσιμο Reset Επαναφορά QEyes Settings Ρύθμιση QEyes QEyes default QEyes προεπιλογή ================================================ FILE: plugin-qeyes/translations/qeyes_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "A follow the mouse demo" ================================================ FILE: plugin-qeyes/translations/qeyes_en_GB.ts ================================================ QEyesConfigDialog Appearance Appearance Number of eyes Number of eyes Type Type Close Close Reset Reset QEyes Settings QEyes Settings QEyes default QEyes default ================================================ FILE: plugin-qeyes/translations/qeyes_et.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Hiirekursori jälgimist näitav demorakendus" ================================================ FILE: plugin-qeyes/translations/qeyes_et.ts ================================================ QEyesConfigDialog Appearance Välimus Number of eyes Silmade arv Type Tüüp Close Sulge Reset Lähtesta QEyes Settings QEyes seadistused QEyes default QEyes vaikeseadistused ================================================ FILE: plugin-qeyes/translations/qeyes_fi.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Hiirtä seuraava testisovellus" ================================================ FILE: plugin-qeyes/translations/qeyes_fi.ts ================================================ QEyesConfigDialog Appearance Ulkoasu Number of eyes Silmien määrä Type Tyyppi Close Sulje Reset Palauta QEyes Settings QEyesin asetukset QEyes default QEyesin oletus ================================================ FILE: plugin-qeyes/translations/qeyes_fr.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Une démonstration de suivi de la souris" ================================================ FILE: plugin-qeyes/translations/qeyes_fr.ts ================================================ QEyesConfigDialog Appearance Apparence Number of eyes Nombre d'yeux Type Type Close Fermer Reset Réinitialiser QEyes Settings Réglage de QEyes QEyes default QEyes par défaut ================================================ FILE: plugin-qeyes/translations/qeyes_he.desktop.yaml ================================================ Desktop Entry/Name: "Qעיניים" Desktop Entry/Comment: "הדגמת מעקב אחר העכבר" ================================================ FILE: plugin-qeyes/translations/qeyes_he.ts ================================================ QEyesConfigDialog Appearance מראה Number of eyes מספר העיניים Type סוג Close סגירה Reset איפוס QEyes Settings הגדרות Qעיניים QEyes default ברירת מחדל ל־Qעיניים ================================================ FILE: plugin-qeyes/translations/qeyes_hu.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Egérmutatót követő bemutató" ================================================ FILE: plugin-qeyes/translations/qeyes_hu.ts ================================================ QEyesConfigDialog Appearance Megjelenés Number of eyes A szemek száma Type Típus Close Bezárás Reset Visszaállítás QEyes Settings QEyes beállításai QEyes default QEyes alapértelmezés ================================================ FILE: plugin-qeyes/translations/qeyes_it.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Seguire il Mouse - Demo" ================================================ FILE: plugin-qeyes/translations/qeyes_it.ts ================================================ QEyesConfigDialog Appearance Aspetto Number of eyes Numeri di occhi Type Tipo Close Chiudi Reset Ripristina QEyes Settings Impostazioni QEyes QEyes default QEyes predefinito ================================================ FILE: plugin-qeyes/translations/qeyes_ja.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "マウスカーソルを追いかけるデモです" ================================================ FILE: plugin-qeyes/translations/qeyes_ka.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "თაგუნას გაყოლის დემონსტრაცია" ================================================ FILE: plugin-qeyes/translations/qeyes_ka.ts ================================================ QEyesConfigDialog Appearance გარეგნობა Number of eyes თვალების რაოდენობა Type ტიპი Close დახურვა Reset ჩამოყრა QEyes Settings QEyes-ის მორგება QEyes default QEyes-ის ნაგულისხმევი ================================================ FILE: plugin-qeyes/translations/qeyes_kab.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "" ================================================ FILE: plugin-qeyes/translations/qeyes_kab.ts ================================================ QEyesConfigDialog Appearance Number of eyes Type Close Reset QEyes Settings QEyes default ================================================ FILE: plugin-qeyes/translations/qeyes_kk.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Тышқан курсоры соңынан ерудің мысалы" ================================================ FILE: plugin-qeyes/translations/qeyes_kk.ts ================================================ QEyesConfigDialog Appearance Сыртқы түрі Number of eyes Көздер саны Type Түрі Close Жабу Reset Тастау QEyes Settings QEyes баптаулары QEyes default QEyes әдепкісі ================================================ FILE: plugin-qeyes/translations/qeyes_ko.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "마우스 데모 따라하기" ================================================ FILE: plugin-qeyes/translations/qeyes_ko.ts ================================================ QEyesConfigDialog Appearance 모양새 Number of eyes 눈의 개수 Type 유형 Close 닫기 Reset 재설정 QEyes Settings QEyes 설정 QEyes default QEyes 기본값 ================================================ FILE: plugin-qeyes/translations/qeyes_lg.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Puloguramu egezesa enkola y'akasongesebwa" ================================================ FILE: plugin-qeyes/translations/qeyes_lg.ts ================================================ QEyesConfigDialog Appearance Endabika Number of eyes Obungi bw'amaaso Type Kika Close Gala Reset Za bugya QEyes Settings Enteekateeka ya QEyes QEyes default Enteekateeka ya QEyes ensangwawo ================================================ FILE: plugin-qeyes/translations/qeyes_lt.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Sekimo paskui pelę demonstracija" ================================================ FILE: plugin-qeyes/translations/qeyes_lt.ts ================================================ QEyesConfigDialog Appearance Išvaizda Number of eyes Akių skaičius Type Tipas Close Užverti Reset Atstatyti QEyes Settings QEyes nustatymas QEyes default QEyes numatytoji reikšmė ================================================ FILE: plugin-qeyes/translations/qeyes_nl.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Een volg-de-muistest" ================================================ FILE: plugin-qeyes/translations/qeyes_nl.ts ================================================ QEyesConfigDialog Appearance Vormgeving Number of eyes Aantal ogen Type Soort Close Sluiten Reset Standaardwaarden QEyes Settings QEyes-instellingen QEyes default QEyes-standaardwaarden ================================================ FILE: plugin-qeyes/translations/qeyes_oc.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Una demonstracion de seguiment de la mirga" ================================================ FILE: plugin-qeyes/translations/qeyes_oc.ts ================================================ QEyesConfigDialog Appearance Aparéncia Number of eyes Nombre d’uèlhs Type Tipe Close Tampar Reset Reïnicializar QEyes Settings Paramètres de QEyes QEyes default QEyes per defaut ================================================ FILE: plugin-qeyes/translations/qeyes_pa.ts ================================================ QEyesConfigDialog Appearance ਦਿੱਖ Number of eyes ਅੱਖਾਂ ਦੀ ਗਿਣਤੀ Type ਕਿਸਮ Close ਬੰਦ ਕਰੋ Reset ਮੁੜ-ਸੈੱਟ QEyes Settings QEyes ਸੈਟਿੰਗ QEyes default QEyes ਡਿਫਾਲਟ ================================================ FILE: plugin-qeyes/translations/qeyes_pl.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Pokaz podążania za myszką" ================================================ FILE: plugin-qeyes/translations/qeyes_pl.ts ================================================ QEyesConfigDialog Appearance Wygląd Number of eyes Liczba oczu Type Typ Close Zamknij Reset Zresetuj QEyes Settings Ustawienie QEyes QEyes default Domyślne QEyes ================================================ FILE: plugin-qeyes/translations/qeyes_pt.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Uma demonstração de seguir o rato" ================================================ FILE: plugin-qeyes/translations/qeyes_pt.ts ================================================ QEyesConfigDialog Appearance Aparência Number of eyes Número de olhos Type Tipo Close Fechar Reset Repor QEyes Settings Definição QEyes QEyes default QEyes predefinido ================================================ FILE: plugin-qeyes/translations/qeyes_ru.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Демонстрация следования за мышью" ================================================ FILE: plugin-qeyes/translations/qeyes_ru.ts ================================================ QEyesConfigDialog Appearance Внешний вид Number of eyes Число глаз Type Тип Close Закрыть Reset Сброс QEyes Settings Настройка QEyes QEyes default Стандартно для QEyes ================================================ FILE: plugin-qeyes/translations/qeyes_sk.desktop.yaml ================================================ Desktop Entry/Name: "QOko" Desktop Entry/Comment: "Nasleduj myš" ================================================ FILE: plugin-qeyes/translations/qeyes_sk.ts ================================================ QEyesConfigDialog Appearance Vzhľad Number of eyes Počet očí Type Písať Close Zatvoriť Reset Obnoviť QEyes Settings Nasavenia QEyes QEyes default Predvolené nastavenia QEyes ================================================ FILE: plugin-qeyes/translations/qeyes_sr.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Прати демонстрацију миша" ================================================ FILE: plugin-qeyes/translations/qeyes_sr.ts ================================================ QEyesConfigDialog Appearance Приказ Number of eyes Број очију Type Тип Close Затвори Reset Ресетуј QEyes Settings QEyes подешавање QEyes default QEyes подразумевано ================================================ FILE: plugin-qeyes/translations/qeyes_sv.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Nyfikna ögon som följer muspekaren" ================================================ FILE: plugin-qeyes/translations/qeyes_sv.ts ================================================ QEyesConfigDialog Appearance Utseende Number of eyes Antal ögon Type Typ Close Stäng Reset Återställ QEyes Settings QEyes-inställningar QEyes default QEyes standard ================================================ FILE: plugin-qeyes/translations/qeyes_tr.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "Fareyi izle demosu" ================================================ FILE: plugin-qeyes/translations/qeyes_tr.ts ================================================ QEyesConfigDialog Appearance Görünüm Number of eyes Göz sayısı Type Tür Close Kapat Reset Sıfırla QEyes Settings QEyes ayarı QEyes default QEyes öntanımlı ================================================ FILE: plugin-qeyes/translations/qeyes_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "鼠标跟随演示程序" ================================================ FILE: plugin-qeyes/translations/qeyes_zh_CN.ts ================================================ QEyesConfigDialog Appearance 外观 Number of eyes 眼睛数量 Type 类型 Close 关闭 Reset 重置 QEyes Settings QEyes设置 QEyes default QEyes默认值 ================================================ FILE: plugin-qeyes/translations/qeyes_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "QEyes" Desktop Entry/Comment: "跟隨游標呈現眼球轉動" ================================================ FILE: plugin-qeyes/translations/qeyes_zh_TW.ts ================================================ QEyesConfigDialog Appearance 外觀 Number of eyes 眼球數量 Type 類型 Close 關閉 Reset 重設 QEyes Settings QEyes 設定 QEyes default QEyes 預設 ================================================ FILE: plugin-qeyes/types/Bizarre/config ================================================ wall-thickness=2 num-eyes = 3 eye-pixmap = "Bizarre-eye.png" pupil-pixmap = "Bizarre-pupil.png" ================================================ FILE: plugin-qeyes/types/Bloodshot/config ================================================ wall-thickness = 5 num-eyes = 2 eye-pixmap = "Bloodshot-eye.png" pupil-pixmap = "Bloodshot-pupil.png" ================================================ FILE: plugin-qeyes/types/Brown-EyedGirl/config ================================================ wall-thickness = 10 num-eyes = 2 eye-pixmap = "brown-eye.png" pupil-pixmap = "brown-pupil.png" ================================================ FILE: plugin-qeyes/types/CMakeLists.txt ================================================ install(DIRECTORY . DESTINATION "${LXQT_SHARE_DIR}/panel/qeyes-types" COMPONENT Runtime PATTERN "CMake*" EXCLUDE PATTERN "cmake*" EXCLUDE PATTERN "Makefile" EXCLUDE ) ================================================ FILE: plugin-qeyes/types/Crystal/config ================================================ wall-thickness = 3 num-eyes = 2 eye-pixmap = "crystal-eye.svg" pupil-pixmap = "crystal-pupil.svg" ================================================ FILE: plugin-qeyes/types/Default/config ================================================ wall-thickness = 6 num-eyes = 2 eye-pixmap = "Default-eye.png" pupil-pixmap = "Default-pupil.png" ================================================ FILE: plugin-qeyes/types/Default-tiny/config ================================================ wall-thickness = 3 num-eyes = 2 eye-pixmap = "Default-tiny-eye.png" pupil-pixmap = "Default-tiny-pupil.png" ================================================ FILE: plugin-qeyes/types/Digital/config ================================================ wall-thickness=2 num-eyes = 4 eye-pixmap = "Digital-eye.png" pupil-pixmap = "Digital-pupil.png" ================================================ FILE: plugin-qeyes/types/EyelashLarge/config ================================================ wall-thickness = 19 num-eyes = 2 eye-pixmap = "eye.png" pupil-pixmap = "pupil.png" ================================================ FILE: plugin-qeyes/types/Green-EyedGirl/config ================================================ wall-thickness = 10 num-eyes = 2 eye-pixmap = "green-eye.png" pupil-pixmap = "green-pupil.png" ================================================ FILE: plugin-qeyes/types/Horrid/config ================================================ wall-thickness = 6 num-eyes = 1 eye-pixmap = "horrid_eye.png" pupil-pixmap = "horrid_pupil.png" ================================================ FILE: plugin-qeyes/types/Pink-EyedGirl/config ================================================ wall-thickness = 10 num-eyes = 2 eye-pixmap = "pink-eye.png" pupil-pixmap = "pink-pupil.png" ================================================ FILE: plugin-qeyes/types/PumpkinMonster/config ================================================ wall-thickness = 8 num-eyes = 2 eye-pixmap = "eye.png" pupil-pixmap = "pupil.png" ================================================ FILE: plugin-qeyes/types/README ================================================ These type of eye are grabbed from the project gnome-applet and its derived mate-applet. The only exception is the Crystal 'eye' which is grabbed from https://commons.wikimedia.org/wiki/File:Crystal128-xeyes.svg ================================================ FILE: plugin-qeyes/types/Tango/config ================================================ wall-thickness = 4 num-eyes = 2 eye-pixmap = "tango-eye.png" pupil-pixmap = "tango-pupil.png" ================================================ FILE: plugin-quicklaunch/CMakeLists.txt ================================================ set(PLUGIN "quicklaunch") set(HEADERS lxqtquicklaunchplugin.h lxqtquicklaunch.h quicklaunchbutton.h quicklaunchaction.h ) set(SOURCES lxqtquicklaunchplugin.cpp lxqtquicklaunch.cpp quicklaunchbutton.cpp quicklaunchaction.cpp ) set(LIBRARIES Qt6Xdg ) include_directories( ${LXQT_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}/../panel" ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-quicklaunch/lxqtquicklaunch.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2012 Razor team * Authors: * Petr Vanek * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtquicklaunch.h" #include "quicklaunchbutton.h" #include "quicklaunchaction.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "../panel/pluginsettings.h" #include LXQtQuickLaunch::LXQtQuickLaunch(ILXQtPanelPlugin *plugin, QWidget* parent) : QFrame(parent), mPlugin(plugin), mPlaceHolder(nullptr) { setAcceptDrops(true); mLayout = new LXQt::GridLayout(this); setLayout(mLayout); QString desktop; QString file; QString execname; QString exec; QString icon; const auto apps = mPlugin->settings()->readArray(QStringLiteral("apps")); for (const QMap &app : apps) { desktop = app.value(QStringLiteral("desktop"), QString()).toString(); file = app.value(QStringLiteral("file"), QString()).toString(); if (!desktop.isEmpty()) { XdgDesktopFile xdg; if (!xdg.load(desktop)) { qDebug() << "XdgDesktopFile" << desktop << "is not valid"; continue; } if (!xdg.isSuitable()) { qDebug() << "XdgDesktopFile" << desktop << "is not applicable"; continue; } addButton(new QuickLaunchAction(&xdg, this)); } else if (! file.isEmpty()) { addButton(new QuickLaunchAction(file, this)); } else { execname = app.value(QStringLiteral("name"), QString()).toString(); exec = app.value(QStringLiteral("exec"), QString()).toString(); icon = app.value(QStringLiteral("icon"), QString()).toString(); if (icon.isNull()) { qDebug() << "Icon" << icon << "is not valid (isNull). Skipped."; continue; } addButton(new QuickLaunchAction(execname, exec, icon, this)); } } // for if (mLayout->isEmpty()) showPlaceHolder(); realign(); } LXQtQuickLaunch::~LXQtQuickLaunch() = default; int LXQtQuickLaunch::indexOfButton(QuickLaunchButton* button) const { return mLayout->indexOf(button); } int LXQtQuickLaunch::countOfButtons() const { return mLayout->count(); } void LXQtQuickLaunch::realign() { mLayout->setEnabled(false); ILXQtPanel *panel = mPlugin->panel(); if (mPlaceHolder) { mLayout->setColumnCount(1); mLayout->setRowCount(1); } else { if (panel->isHorizontal()) { mLayout->setRowCount(panel->lineCount()); mLayout->setColumnCount(0); } else { mLayout->setColumnCount(panel->lineCount()); mLayout->setRowCount(0); } } mLayout->setEnabled(true); } void LXQtQuickLaunch::addButton(QuickLaunchAction* action) { mLayout->setEnabled(false); QuickLaunchButton* btn = new QuickLaunchButton(action, mPlugin, this); mLayout->addWidget(btn); connect(btn, &QuickLaunchButton::switchButtons, this, &LXQtQuickLaunch::switchButtons); connect(btn, &QuickLaunchButton::buttonDeleted, this, &LXQtQuickLaunch::buttonDeleted); connect(btn, &QuickLaunchButton::movedLeft, this, &LXQtQuickLaunch::buttonMoveLeft); connect(btn, &QuickLaunchButton::movedRight, this, &LXQtQuickLaunch::buttonMoveRight); if (mPlaceHolder) { mLayout->removeWidget(mPlaceHolder); delete mPlaceHolder; mPlaceHolder = nullptr; } mLayout->setEnabled(true); realign(); } void LXQtQuickLaunch::dragEnterEvent(QDragEnterEvent *e) { if (mPlugin->panel()->isLocked()) { e->ignore(); return; } // Getting URL from mainmenu... if (e->mimeData()->hasUrls()) { e->acceptProposedAction(); return; } if (e->source() && e->source()->parent() == this) { e->acceptProposedAction(); } } void LXQtQuickLaunch::dropEvent(QDropEvent *e) { if (mPlugin->panel()->isLocked()) { e->ignore(); return; } const auto & urls = e->mimeData()->urls(); const QSet uniqueUrls{urls.cbegin(), urls.cend()}; for (const QUrl &url : uniqueUrls) { QString fileName(url.isLocalFile() ? url.toLocalFile() : url.url()); QFileInfo fi(fileName); XdgDesktopFile xdg; if (xdg.load(fileName)) { if (xdg.isSuitable()) addButton(new QuickLaunchAction(&xdg, this)); } else if (fi.exists() && fi.isExecutable() && !fi.isDir()) { addButton(new QuickLaunchAction(fileName, fileName, QLatin1String(""), this)); } else if (fi.exists()) { addButton(new QuickLaunchAction(fileName, this)); } else { qWarning() << "XdgDesktopFile" << fileName << "is not valid"; QMessageBox::information(this, tr("Drop Error"), tr("File/URL '%1' cannot be embedded into QuickLaunch for now").arg(fileName) ); } } saveSettings(); } void LXQtQuickLaunch::switchButtons(QuickLaunchButton *button1, QuickLaunchButton *button2) { if (button1 == button2) return; int n1 = mLayout->indexOf(button1); int n2 = mLayout->indexOf(button2); int l = std::min(n1, n2); int m = std::max(n1, n2); mLayout->moveItem(l, m); mLayout->moveItem(m-1, l); saveSettings(); } void LXQtQuickLaunch::buttonDeleted() { QuickLaunchButton *btn = qobject_cast(sender()); if (!btn) return; mLayout->removeWidget(btn); btn->deleteLater(); saveSettings(); if (mLayout->isEmpty()) showPlaceHolder(); realign(); } void LXQtQuickLaunch::buttonMoveLeft() { QuickLaunchButton *btn = qobject_cast(sender()); if (!btn) return; int index = indexOfButton(btn); if (index > 0) { mLayout->moveItem(index, index - 1); saveSettings(); } } void LXQtQuickLaunch::buttonMoveRight() { QuickLaunchButton *btn1 = qobject_cast(sender()); if (!btn1) return; int index = indexOfButton(btn1); if (index < countOfButtons() - 1) { mLayout->moveItem(index, index + 1); saveSettings(); } } void LXQtQuickLaunch::saveSettings() { PluginSettings *settings = mPlugin->settings(); settings->remove(QStringLiteral("apps")); QList > hashList; int size = mLayout->count(); for (int j = 0; j < size; ++j) { QuickLaunchButton *b = qobject_cast(mLayout->itemAt(j)->widget()); if (!b) continue; // convert QHash to QMap QMap map; QHashIterator it(b->settingsMap()); while (it.hasNext()) { it.next(); map[it.key()] = it.value(); } hashList << map; } settings->setArray(QStringLiteral("apps"), hashList); } void LXQtQuickLaunch::showPlaceHolder() { if (!mPlaceHolder) { mPlaceHolder = new QLabel(this); mPlaceHolder->setAlignment(Qt::AlignCenter); mPlaceHolder->setObjectName(QStringLiteral("QuickLaunchPlaceHolder")); mPlaceHolder->setText(tr("Drop application\nicons here")); } mLayout->addWidget(mPlaceHolder); } ================================================ FILE: plugin-quicklaunch/lxqtquicklaunch.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2012 Razor team * Authors: * Petr Vanek * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTQUICKLAUNCH_H #define LXQTQUICKLAUNCH_H #include "../panel/lxqtpanel.h" #include #include class XdgDesktopFile; class QuickLaunchAction; class QDragEnterEvent; class QuickLaunchButton; class QSettings; class QLabel; namespace LXQt { class GridLayout; } /*! \brief Loader for "quick launcher" icons in the panel. \author Petr Vanek */ class LXQtQuickLaunch : public QFrame { Q_OBJECT public: LXQtQuickLaunch(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~LXQtQuickLaunch(); int indexOfButton(QuickLaunchButton* button) const; int countOfButtons() const; void realign(); private: LXQt::GridLayout *mLayout; ILXQtPanelPlugin *mPlugin; QLabel *mPlaceHolder; void dragEnterEvent(QDragEnterEvent *e); void dropEvent(QDropEvent *e); void saveSettings(); void showPlaceHolder(); private slots: void addButton(QuickLaunchAction* action); void switchButtons(QuickLaunchButton *button1, QuickLaunchButton *button2); void buttonDeleted(); void buttonMoveLeft(); void buttonMoveRight(); }; #endif ================================================ FILE: plugin-quicklaunch/lxqtquicklaunchplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtquicklaunchplugin.h" #include "lxqtquicklaunch.h" LXQtQuickLaunchPlugin::LXQtQuickLaunchPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mWidget(new LXQtQuickLaunch(this)) { } LXQtQuickLaunchPlugin::~LXQtQuickLaunchPlugin() { delete mWidget; } QWidget *LXQtQuickLaunchPlugin::widget() { return mWidget; } void LXQtQuickLaunchPlugin::realign() { mWidget->realign(); } ================================================ FILE: plugin-quicklaunch/lxqtquicklaunchplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTQUICKLAUNCHPLUGIN_H #define LXQTQUICKLAUNCHPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include class LXQtQuickLaunch; class LXQtQuickLaunchPlugin: public QObject, public ILXQtPanelPlugin { Q_OBJECT public: explicit LXQtQuickLaunchPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtQuickLaunchPlugin(); virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("QuickLaunch"); } virtual Flags flags() const { return NeedsHandle; } void realign(); bool isSeparate() const { return true; } private: LXQtQuickLaunch *mWidget; }; class LXQtQuickLaunchPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtQuickLaunchPlugin(startupInfo); } }; #endif // LXQTQUICKLAUNCHPLUGIN_H ================================================ FILE: plugin-quicklaunch/quicklaunchaction.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "quicklaunchaction.h" #include #include #include #include #include #include #include #include #include QuickLaunchAction::QuickLaunchAction(const QString & name, const QString & exec, const QString & icon, QWidget * parent) : QAction(name, parent), m_valid(true) { m_type = ActionLegacy; m_settingsMap[QStringLiteral("name")] = name; m_settingsMap[QStringLiteral("exec")] = exec; m_settingsMap[QStringLiteral("icon")] = icon; // Since the keys "desktop" and "file" have priority over the above keys // (see LXQtQuickLaunch::LXQtQuickLaunch), we prevent their reading // from another config file by setting them to empty strings here. m_settingsMap[QStringLiteral("desktop")] = QString(); m_settingsMap[QStringLiteral("file")] = QString(); if (icon == QLatin1String("") || icon.isNull()) setIcon(XdgIcon::defaultApplicationIcon()); else setIcon(QIcon(icon)); setData(exec); connect(this, &QAction::triggered, this, [this] { execAction(); }); } QuickLaunchAction::QuickLaunchAction(const XdgDesktopFile * xdg, QWidget * parent) : QAction(parent), m_valid(true) { m_type = ActionXdg; m_settingsMap[QStringLiteral("desktop")] = xdg->fileName(); QString title(xdg->localizedValue(QStringLiteral("Name")).toString()); QString gn(xdg->localizedValue(QStringLiteral("GenericName")).toString()); if (!gn.isEmpty()) title += QLatin1String(" (") + gn + QLatin1String(")"); setText(title); setIcon(xdg->icon(XdgIcon::defaultApplicationIcon())); setData(xdg->fileName()); connect(this, &QAction::triggered, this, [this] { execAction(); }); // populate the additional actions for (auto const & action : const_cast(xdg->actions())) { QAction * act = new QAction{xdg->actionIcon(action), xdg->actionName(action), this}; act->setData(action); connect(act, &QAction::triggered, this, [this, act] { execAction(act->data().toString()); }); m_additionalActions.push_back(act); } } QuickLaunchAction::QuickLaunchAction(const QString & fileName, QWidget * parent) : QAction(parent), m_valid(true) { m_type = ActionFile; setText(fileName); setData(fileName); m_settingsMap[QStringLiteral("file")] = fileName; // prevent reading of "desktop" from another config file m_settingsMap[QStringLiteral("desktop")] = QString(); QFileInfo fi(fileName); if (fi.isDir()) { QFileIconProvider ip; setIcon(ip.icon(fi)); } else { QMimeDatabase db; XdgMimeType mi(db.mimeTypeForFile(fi)); setIcon(mi.icon()); } connect(this, &QAction::triggered, this, [this] { execAction(); }); } void QuickLaunchAction::execAction(QString additionalAction) { QString exec(data().toString()); qDebug() << "execAction" << exec; switch (m_type) { case ActionLegacy: { QStringList args = QProcess::splitCommand(exec); QProcess::startDetached(args.takeFirst(), args); break; } case ActionXdg: { XdgDesktopFile xdg; if(xdg.load(exec)) { if (additionalAction.isEmpty()) xdg.startDetached(); else xdg.actionActivate(additionalAction, QStringList{}); } break; } case ActionFile: QDesktopServices::openUrl(QUrl(exec)); break; } } void QuickLaunchAction::updateXdgAction() { if (m_valid && m_type == ActionXdg) { XdgDesktopFile xdg; if (xdg.load(data().toString()) && xdg.isSuitable()) { QString title(xdg.localizedValue(QStringLiteral("Name")).toString()); QString gn(xdg.localizedValue(QStringLiteral("GenericName")).toString()); if (!gn.isEmpty()) title += QLatin1String(" (") + gn + QLatin1String(")"); setText(title); setIcon(xdg.icon(XdgIcon::defaultApplicationIcon())); qDeleteAll (m_additionalActions); m_additionalActions.clear(); for (auto const & action : const_cast(xdg.actions())) { QAction * act = new QAction{xdg.actionIcon(action), xdg.actionName(action), this}; act->setData(action); connect(act, &QAction::triggered, this, [this, act] { execAction(act->data().toString()); }); m_additionalActions.push_back(act); } } else { qDebug() << "XdgDesktopFile" << data() << "is not valid or applicable"; } } } ================================================ FILE: plugin-quicklaunch/quicklaunchaction.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef QUICKLAUNCHACTION_H #define QUICKLAUNCHACTION_H #include class XdgDesktopFile; /*! \brief Special action representation for LXQtQuickLaunch plugin. It supports XDG desktop files or "legacy" launching of specified apps. All process management is handled internally. \author Petr Vanek */ class QuickLaunchAction : public QAction { Q_OBJECT public: enum ActionType { ActionLegacy, ActionXdg, ActionFile }; /*! Constructor for "legacy" launchers. \warning The XDG way is preferred this is only for older or non-standard apps \param name a name to display in tooltip \param exec a executable with path \param icon a valid QIcon */ QuickLaunchAction(const QString & name, const QString & exec, const QString & icon, QWidget * parent); /*! Constructor for XDG desktop handlers. */ QuickLaunchAction(const XdgDesktopFile * xdg, QWidget * parent); /*! Constructor for regular files */ QuickLaunchAction(const QString & fileName, QWidget * parent); //! Returns true if the action is valid (contains all required properties). bool isValid() const { return m_valid; } //! Returns the action type (legacy, Xdg, file). int type() const { return m_type; } QHash settingsMap() { return m_settingsMap; } /*! Returns list of additional actions to present for user (in menu). * Currently there are only "Addititional application actions" for the ActionXdg type * (the [Desktop Action %s] in .desktop files) */ QList additionalActions() const { return m_additionalActions; } /*! Updates the Xdg action by reloading its desktop file. * Does nothing if the desktop file is not loadable or suitable. */ void updateXdgAction(); public slots: void execAction(QString additionalAction = QString{}); private: ActionType m_type; QString m_data; bool m_valid; QHash m_settingsMap; QList m_additionalActions; }; #endif ================================================ FILE: plugin-quicklaunch/quicklaunchbutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "quicklaunchbutton.h" #include "lxqtquicklaunch.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include #include #define MIMETYPE "x-lxqt/quicklaunch-button" QuickLaunchButton::QuickLaunchButton(QuickLaunchAction * act, ILXQtPanelPlugin * plugin, QWidget * parent) : QToolButton(parent), mAct(act), mPlugin(plugin) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setAcceptDrops(true); setAutoRaise(true); setDefaultAction(mAct); mAct->setParent(this); const QString dndStr = QStringLiteral(" ") + tr("(Ctrl + DND)"); mMoveLeftAct = new QAction(XdgIcon::fromTheme(QStringLiteral("go-previous")), tr("Move left") + dndStr, this); connect(mMoveLeftAct, &QAction::triggered, this, &QuickLaunchButton::movedLeft); mMoveRightAct = new QAction(XdgIcon::fromTheme(QStringLiteral("go-next")), tr("Move right") + dndStr, this); connect(mMoveRightAct, &QAction::triggered, this, &QuickLaunchButton::movedRight); mDeleteAct = new QAction(XdgIcon::fromTheme(QStringLiteral("dialog-close")), tr("Remove from quicklaunch"), this); connect(mDeleteAct, &QAction::triggered, this, &QuickLaunchButton::selfRemove); mMenu = new QMenu(this); mMenu->addAction(mAct); mMenu->addActions(mAct->additionalActions()); mFirstSep = mMenu->addSeparator(); if (mAct->type() == QuickLaunchAction::ActionType::ActionXdg) { auto updateAct = new QAction(XdgIcon::fromTheme(QStringLiteral("view-refresh")), tr("Refresh"), this); connect(updateAct, &QAction::triggered, this, [this] { const auto actions = mMenu->actions(); for (const auto &action : actions) { if (action->isSeparator()) // mFirstSep { break; } mMenu->removeAction(action); } mAct->updateXdgAction(); mMenu->insertAction(mFirstSep, mAct); const auto extraActions = mAct->additionalActions(); for (const auto &action : extraActions) { mMenu->insertAction(mFirstSep, action); } }); mMenu->addAction(updateAct); } mMenu->addAction(mMoveLeftAct); mMenu->addAction(mMoveRightAct); mMenu->addSeparator(); mMenu->addAction(mDeleteAct); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QuickLaunchButton::customContextMenuRequested, this, &QuickLaunchButton::this_customContextMenuRequested); } QuickLaunchButton::~QuickLaunchButton() = default; QHash QuickLaunchButton::settingsMap() { Q_ASSERT(mAct); return mAct->settingsMap(); } void QuickLaunchButton::this_customContextMenuRequested(const QPoint & /*pos*/) { LXQtQuickLaunch *panel = qobject_cast(parent()); mMoveLeftAct->setEnabled(!mPlugin->panel()->isLocked() && panel && panel->indexOfButton(this) > 0); mMoveRightAct->setEnabled(!mPlugin->panel()->isLocked() && panel && panel->indexOfButton(this) < panel->countOfButtons() - 1); mDeleteAct->setEnabled(!mPlugin->panel()->isLocked()); mPlugin->willShowWindow(mMenu); mMenu->popup(mPlugin->panel()->calculatePopupWindowPos(mapToGlobal(QPoint(0, 0)), mMenu->sizeHint()).topLeft()); } void QuickLaunchButton::selfRemove() { emit buttonDeleted(); } void QuickLaunchButton::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton && e->modifiers() == Qt::ControlModifier) { mDragStart = e->position().toPoint(); return; } QToolButton::mousePressEvent(e); } void QuickLaunchButton::mouseMoveEvent(QMouseEvent *e) { if (mPlugin->panel()->isLocked() || !(e->buttons() & Qt::LeftButton)) { return; } if ((e->position().toPoint() - mDragStart).manhattanLength() < QApplication::startDragDistance()) { return; } if (e->modifiers() != Qt::ControlModifier) { return; } QPointer drag = new QDrag(this); ButtonMimeData *mimeData = new ButtonMimeData(); mimeData->setButton(this); drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); // Icon was dropped outside the panel, remove button if (drag && !drag->target()) { selfRemove(); } } void QuickLaunchButton::dragMoveEvent(QDragMoveEvent * e) { if (!mPlugin->panel()->isLocked() && e->mimeData()->hasFormat(QStringLiteral(MIMETYPE))) e->acceptProposedAction(); else e->ignore(); } void QuickLaunchButton::dragEnterEvent(QDragEnterEvent *e) { if (!mPlugin->panel()->isLocked()) { const ButtonMimeData *mimeData = qobject_cast(e->mimeData()); if (mimeData && mimeData->button()) { emit switchButtons(mimeData->button(), this); } } } ================================================ FILE: plugin-quicklaunch/quicklaunchbutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2012 Razor team * Authors: * Petr Vanek * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTQUICKLAUNCHBUTTON_H #define LXQTQUICKLAUNCHBUTTON_H #include "quicklaunchaction.h" #include #include class ILXQtPanelPlugin; class QuickLaunchButton : public QToolButton { Q_OBJECT public: QuickLaunchButton(QuickLaunchAction * act, ILXQtPanelPlugin * plugin, QWidget* parent = nullptr); ~QuickLaunchButton(); QHash settingsMap(); signals: void buttonDeleted(); void switchButtons(QuickLaunchButton *from, QuickLaunchButton *to); void movedLeft(); void movedRight(); protected: void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void dragEnterEvent(QDragEnterEvent *e); void dragMoveEvent(QDragMoveEvent * e); private: QuickLaunchAction *mAct; ILXQtPanelPlugin * mPlugin; QAction *mFirstSep; QAction *mDeleteAct; QAction *mMoveLeftAct; QAction *mMoveRightAct; QMenu *mMenu; QPoint mDragStart; private slots: void this_customContextMenuRequested(const QPoint & pos); void selfRemove(); }; class ButtonMimeData: public QMimeData { Q_OBJECT public: ButtonMimeData(): QMimeData(), mButton(0) { } QuickLaunchButton *button() const { return mButton; } void setButton(QuickLaunchButton *button) { mButton = button; } private: QuickLaunchButton *mButton; }; #endif ================================================ FILE: plugin-quicklaunch/resources/quicklaunch.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=quickopen #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-quicklaunch/translations/quicklaunch.desktop.yaml ================================================ Desktop Entry/Name: "Quick Launch" Desktop Entry/Comment: "Easy access to your favourite applications" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ar.desktop.yaml ================================================ Desktop Entry/Name: "إطلاق سريع" Desktop Entry/Comment: "نفاذ مباشر لتطبيقاتك المفضّلة" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ar.ts ================================================ LXQtQuickLaunch Drop Error خطأ في الإفلات File/URL '%1' cannot be embedded into QuickLaunch for now يتعذر الآن تضمين العنوان/المسار ”%1“ إلى المُطلق السريع Drop application icons here أفلِت أيقونات التطبيقات هنا QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left انقل يسارا Move right انقل يمينا Remove from quicklaunch أزِل من المُطلق السريع Refresh إعادة تحميل ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_arn.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ast.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_bg.desktop.yaml ================================================ Desktop Entry/Name: "Бързо стартиране" Desktop Entry/Comment: "Лесен достъп до вашите приложения" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_bg.ts ================================================ LXQtQuickLaunch Drop Error Грешка при прехвърляне File/URL '%1' cannot be embedded into QuickLaunch for now Файл/Адрес '%1' не може да се вкара в стартера Drop application icons here Завлечете с мишката иконата на приложението тук QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Преместване наляво Move right Преместване надясно Remove from quicklaunch Премахване от стартера Refresh Опресняване ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ca.desktop.yaml ================================================ Desktop Entry/Name: "Llançament ràpid" Desktop Entry/Comment: "Accés fàcil a les aplicacions preferides" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ca.ts ================================================ LXQtQuickLaunch Drop Error Error d'arrossegament File/URL '%1' cannot be embedded into QuickLaunch for now El fitxer o l'URL «%1» no pot ser incrustada de moment a QuickLaunch Drop application icons here Arrossegueu aquí les icones de les aplicacions QuickLaunchButton (Ctrl + DND) (Ctrl + arrossega i deixa) Move left Mou a l'esquerra Move right Mou a la dreta Remove from quicklaunch Suprimeix de QuickLaunch Refresh Actualitza ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_cs.desktop.yaml ================================================ Desktop Entry/Name: "Rychlé spouštění" Desktop Entry/Comment: "Snadný přístup k vaším oblíbeným aplikacím" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_cs.ts ================================================ LXQtQuickLaunch Drop Error Chyba při upuštění sem File/URL '%1' cannot be embedded into QuickLaunch for now Soubor/URL „%1“ proteď nelze vložit do rychlého spouštění Drop application icons here Sem přetáhněte ikony aplikací QuickLaunchButton (Ctrl + DND) (Ctrl + táhni a pusť) Move left Posunout vlevo Move right Posunout vpravo Remove from quicklaunch Odebrat z rychlého spouštění Refresh Načíst znovu ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_cy.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_da.desktop.yaml ================================================ Desktop Entry/Name: "Hurtigstart" Desktop Entry/Comment: "Nem adgang til dine favoritprogrammer" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_da.ts ================================================ LXQtQuickLaunch Drop Error Fejl ved slip File/URL '%1' cannot be embedded into QuickLaunch for now Filen/URL'en '%1' kan ikke indlejres i hurtigstart på nuværende tidspunkt Drop application icons here Slip programikoner her QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Flyt mod venstre Move right Flyt mod højre Remove from quicklaunch Fjern fra hurtigstart Refresh Opdater ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_de.desktop.yaml ================================================ Desktop Entry/Name: "Schnellstarter" Desktop Entry/Comment: "Starten Sie Ihre Lieblingsanwendungen" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_de.ts ================================================ LXQtQuickLaunch Drop Error Fehler beim Ablegen File/URL '%1' cannot be embedded into QuickLaunch for now Datei/URL '%1' kann momentan nicht in die Schnellstartleiste eingebettet werden Drop application icons here Anwendungsymbole hierhin ziehen QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Nach links verschieben Move right Nach rechts verschieben Remove from quicklaunch Aus der Schnellstartleiste entfernen Refresh Auffrischen ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_el.desktop.yaml ================================================ Desktop Entry/Name: "Γρήγορη εκκίνηση" Desktop Entry/Comment: "Εύκολη πρόσβαση στις αγαπημένες σας εφαρμογές" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_el.ts ================================================ LXQtQuickLaunch Drop Error Σφάλμα εναπόθεσης File/URL '%1' cannot be embedded into QuickLaunch for now Το αρχείο/η διεύθυνση "%1" δεν μπορεί να ενσωματωθεί για την ώρα στη γρήγορη εκκίνηση Drop application icons here Εναποθέστε εδώ εικονίδια εφαρμογών QuickLaunchButton (Ctrl + DND) (Ctrl + Μεταφορά και απόθεση) Move left Μετακίνηση αριστερά Move right Μετακίνηση δεξιά Remove from quicklaunch Αφαίρεση από τη γρήγορη εκκίνηση Refresh Ανανέωση ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Quick Launch" Desktop Entry/Comment: "Easy access to your favourite applications" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_en_GB.ts ================================================ LXQtQuickLaunch Drop Error Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here Drop application icons here QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Move left Move right Move right Remove from quicklaunch Remove from quicklaunch Refresh Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_eo.desktop.yaml ================================================ Desktop Entry/Name: "Rapidlanĉo" Desktop Entry/Comment: "Lanĉu viajn preferatajn aplikaĵojn" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_eo.ts ================================================ LXQtQuickLaunch Drop Error Eraro dum forigado File/URL '%1' cannot be embedded into QuickLaunch for now Dosiero/URL '%1' ne povas esti enkorpigita en rapidlanĉilo nun Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Movi maldekstren Move right Movi dekstren Remove from quicklaunch Forigi el rapidlanĉilo Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_es.desktop.yaml ================================================ Desktop Entry/Name: "Lanzador rápido" Desktop Entry/Comment: "Acceso rápido a sus aplicaciones favoritas" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_es.ts ================================================ LXQtQuickLaunch Drop Error Error al soltar File/URL '%1' cannot be embedded into QuickLaunch for now El archivo/URL «%1» no puede incrustarse de momento en el inicio rápido Drop application icons here Soltar iconos de aplicaciones aquí QuickLaunchButton (Ctrl + DND) (Ctrl + arrastrar y colocar) Move left Mover a la izquierda Move right Mover a la derecha Remove from quicklaunch Quitar del inicio rápido Refresh Recargar ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Lanzadores" Desktop Entry/Comment: "Iconos lanzadores de tus aplicaciones favoritas" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_es_VE.ts ================================================ LXQtQuickLaunch Drop Error Error al remover File/URL '%1' cannot be embedded into QuickLaunch for now Archivo/URL '%1' no puede ser empotrado en la barra de lanzadores por ahora Drop application icons here Ponga los iconos de las aplicaciones aquí QuickLaunchButton (Ctrl + DND) Move left Mover a la izquierda Move right Mover a la derecha Remove from quicklaunch Remover de la barra de lanzadores Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_et.desktop.yaml ================================================ Desktop Entry/Name: "Kiirkäivitaja" Desktop Entry/Comment: "Lihtne ligipääs sinu põhilistele rakendustele" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_et.ts ================================================ LXQtQuickLaunch Drop Error Viga kustutamisel File/URL '%1' cannot be embedded into QuickLaunch for now Faili või urli „%1“ ei saa hetkel lisada kiirkäivitajasse Drop application icons here Lohista siia rakenduse ikoone QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Liiguta vasakule Move right Liiguta paremale Remove from quicklaunch Eemalda kiirkäivitajast Refresh Värskenda ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_eu.desktop.yaml ================================================ Desktop Entry/Name: "Abio azkarra" Desktop Entry/Comment: "Zure gogoko aplikazioetarako sarbide erraza" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_eu.ts ================================================ LXQtQuickLaunch Drop Error Jaregin errorea File/URL '%1' cannot be embedded into QuickLaunch for now '%1' fitxategia/URLa ezin da QuickLaunch-en txertatu oraingoz Drop application icons here Jarri aplikazioa ikonoak hemen QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Mugitu ezkerrera Move right Mugitu eskuinera Remove from quicklaunch Kendu abiarazte azkarretik Refresh Freskatu ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_fi.desktop.yaml ================================================ Desktop Entry/Name: "Pikakäynnistys" Desktop Entry/Comment: "Käynnistä suosikkisovelluksesi" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_fi.ts ================================================ LXQtQuickLaunch Drop Error Pudotusvirhe File/URL '%1' cannot be embedded into QuickLaunch for now Tiedostoa/osoitetta '%1' ei toistaiseksi voi asettaa pikakäynnistykseen Drop application icons here Pudota ohjelman kuvake tähän QuickLaunchButton (Ctrl + DND) (Ctrl + Raahaa ja pudota) Move left Siirrä vasemmalle Move right Siirrä oikealle Remove from quicklaunch Poista pikakäynnistyksestä Refresh Päivitä kuvakkeet ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_fr.desktop.yaml ================================================ Desktop Entry/Name: "Lancement rapide" Desktop Entry/Comment: "Lancer votre application favorite" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_fr.ts ================================================ LXQtQuickLaunch Drop Error Ne pas tenir compte de l'erreur File/URL '%1' cannot be embedded into QuickLaunch for now Le fichier/l'URL '%1' ne peut pas être inclus dans le lancement rapide pour l'instant Drop application icons here Déposer les icônes d'application ici QuickLaunchButton (Ctrl + DND) (Ctrl + Glisser-déposer) Move left Déplacer à gauche Move right Déplacer à droite Remove from quicklaunch Enlever du lancement rapide Refresh Rafraîchir ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_gl.ts ================================================ LXQtQuickLaunch Drop Error Produciuse un erro ao arrastrar File/URL '%1' cannot be embedded into QuickLaunch for now O ficheiro/URL «%1» non pode ser incrustado, polo de agora, no inicio rápido Drop application icons here Arrastre cara a aquí as iconas das aplicacións QuickLaunchButton (Ctrl + DND) Move left Mover á esquerda Move right Mover á dereita Remove from quicklaunch Retirar o lanzador rápido Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_he.desktop.yaml ================================================ Desktop Entry/Name: "הפעלה מהירה" Desktop Entry/Comment: "גישה פשוטה ליישומים המועדפים עליך" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_he.ts ================================================ LXQtQuickLaunch Drop Error שגיאת השלכה File/URL '%1' cannot be embedded into QuickLaunch for now לא ניתן להטמיע את הקובץ/הכתובת ‚%1’ לתוך QuickLaunch כרגע Drop application icons here יש להשליך סמלי יישומים לכאן QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left הזזה שמאלה Move right הזזה ימינה Remove from quicklaunch הסרה מ־quicklaunch Refresh רענון ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_hr.desktop.yaml ================================================ Desktop Entry/Name: "Brzo pokretanje" Desktop Entry/Comment: "Brz pristup omiljenim programima" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_hr.ts ================================================ LXQtQuickLaunch Drop Error Greška ispuštanja File/URL '%1' cannot be embedded into QuickLaunch for now Datoteku/URL „%1” za sada nije moguće ugraditi u Brzo pokretanje Drop application icons here Ispusti ikone programa ovdje QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Pomakni lijevo Move right Pomakni desno Remove from quicklaunch Ukloni iz brzog pokretanja Refresh Aktualiziraj ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_hu.desktop.yaml ================================================ Desktop Entry/Name: "Gyorsindító" Desktop Entry/Comment: "A kedvenc alkalmazásainak indítása" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_hu.ts ================================================ LXQtQuickLaunch Drop Error Ejtési hiba File/URL '%1' cannot be embedded into QuickLaunch for now A(z) „%1” fájl vagy URL nem ágyazható be a Gyorsindítóba Drop application icons here Rakjon ide indító ikonokat QuickLaunchButton (Ctrl + DND) (Ctrl + húzás) Move left Balra Move right Jobbra Remove from quicklaunch Eltávolítás a gyorsindítóról Refresh Újratöltés ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ia.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_id.desktop.yaml ================================================ Desktop Entry/Name: "Quicklaunch" Desktop Entry/Comment: "Luncurkan aplikasi favorit anda" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_id.ts ================================================ LXQtQuickLaunch Drop Error Salah Menjatuhkan File/URL '%1' cannot be embedded into QuickLaunch for now Berkas/URL '%1' tidak dapat disematkan kedalam QuickLaunch untuk saat ini Drop application icons here Jatuhkan ikon aplikasi disini QuickLaunchButton (Ctrl + DND) Move left Pindah kekiri Move right Pindah kekanan Remove from quicklaunch Hapus dari quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_it.desktop.yaml ================================================ Desktop Entry/Name: "Avvio rapido" Desktop Entry/Comment: "Avvia le applicazioni preferite" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_it.ts ================================================ LXQtQuickLaunch Drop Error Errore di rilascio File/URL '%1' cannot be embedded into QuickLaunch for now Il file/URL '%1' al momento non può essere inserito in Avvio rapido Drop application icons here Trascina qui le icone delle applicazioni QuickLaunchButton (Ctrl + DND) (Ctrl + trascina) Move left Sposta a sinistra Move right Sposta a destra Remove from quicklaunch Rimuovi da Avvio rapido Refresh Ricarica ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ja.desktop.yaml ================================================ Desktop Entry/Name: "クイック起動" Desktop Entry/Comment: "お気に入りのアプリケーションの起動を簡単にします" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ja.ts ================================================ LXQtQuickLaunch Drop Error ドロップエラー File/URL '%1' cannot be embedded into QuickLaunch for now 現時点では、ファイル/URL '%1' はクイック起動に入れられません Drop application icons here ここにアプリケーション アイコンをドロップします QuickLaunchButton (Ctrl + DND) (Ctrl + ドラッグ&ドロップ) Move left 左へ移動 Move right 右へ移動 Remove from quicklaunch クイック起動から削除 Refresh 再読込み ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ka.desktop.yaml ================================================ Desktop Entry/Name: "სწრაფი გაშვება" Desktop Entry/Comment: "იოლი წვდომა თქვენს რჩეულ აპლიკაციებთან" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ka.ts ================================================ LXQtQuickLaunch Drop Error დაგდების შეცდომა File/URL '%1' cannot be embedded into QuickLaunch for now ფაილის/ URL-ის '%1' ჩაშენება QuickLaunch-ში ახლა შეუძლებელია Drop application icons here დაყარეთ აპლიკაციის ხატულები აქ QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left მარცხნივ გადატანა Move right მარჯვნივ გადატანა Remove from quicklaunch წაშლა quicklaunch-დან Refresh განახლება ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_kab.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Smutti ɣer zelmaḍ Move right Smutti ɣer yeffus Remove from quicklaunch Kkes-it seg quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_kk.ts ================================================ LXQtQuickLaunch Drop Error Тастау қатесі File/URL '%1' cannot be embedded into QuickLaunch for now '%1' файлы/URL-адресі әзірше жылдам іске қосуға ендіріле алмайды Drop application icons here Бағдарлама таңбашаларын осында тастаңыз QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Солға жылжыту Move right Оңға жылжыту Remove from quicklaunch Жылдам іске қосудан өшіру Refresh Жаңарту ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ko.desktop.yaml ================================================ Desktop Entry/Name: "빠른 실행" Desktop Entry/Comment: "즐겨찾는 응용 프로그램에 쉽게 액세스할 수 있습니다" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ko.ts ================================================ LXQtQuickLaunch Drop Error 드롭 오류 File/URL '%1' cannot be embedded into QuickLaunch for now File/URL '%1'의 QuickLaunch 임베딩이 지금은 불가능합니다 Drop application icons here 즐겨쓰는 프로그램 아이콘 넣기 QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left 왼쪽으로 Move right 오른쪽으로 Remove from quicklaunch quicklaunch에서 빼기 Refresh 새로 고침 ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ttandikiro Ery'amangu" Desktop Entry/Comment: "Kano kakusobozesa okutandika mangu puloguramu z'ojjumbira" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lg.ts ================================================ LXQtQuickLaunch Drop Error Okuteekawo kulemye File/URL '%1' cannot be embedded into QuickLaunch for now Tekisoboka kakano okuteeka URL eya fayiro '%1' ku ttandikiro Drop application icons here Teeka wano obufaananyi bwa puloguramu QuickLaunchButton (Ctrl + DND) (Ctrl + walula) Move left Sembeza ku kkono Move right Sembeza ku ddyo Remove from quicklaunch Gigye mu ttandikiro Refresh Gizze bujja ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lt.desktop.yaml ================================================ Desktop Entry/Name: "Spartusis paleidimas" Desktop Entry/Comment: "Lengva prieiga prie jūsų mėgstamų programų" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lt.ts ================================================ LXQtQuickLaunch Drop Error Vilkimo klaida File/URL '%1' cannot be embedded into QuickLaunch for now Failas/URL „%1“ dabar negali būti įtaisytas į spartųjį paleidimą Drop application icons here Vilkite programų piktogramas čia QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Perkelti kairėn Move right Perkelti dešinėn Remove from quicklaunch Šalinti iš sparčiojo paleidimo Refresh Įkelti iš naujo ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lv.desktop.yaml ================================================ Desktop Entry/Name: "Ātrā palaišana" Desktop Entry/Comment: "Viegla piekļuve jūsu iecienītākajām lietotnēm" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_lv.ts ================================================ LXQtQuickLaunch Drop Error Pārvilkšanas kļūme File/URL '%1' cannot be embedded into QuickLaunch for now Fails/URL '%1' pašreiz nevar tik ieligzdots ātrajā palaidējā QuickLaunch Drop application icons here Pārvelciet lietotņu ikonas uz šejieni QuickLaunchButton (Ctrl + DND) (Ctrl + Pārvilkt) Move left Pa kreisi virzīt Move right Pa labi virzīt Remove from quicklaunch Noņemt no ātrpalaidēja Quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Hurtigstart" Desktop Entry/Comment: "Enkel tilgang til dine favorittprogrammer" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_nb_NO.ts ================================================ LXQtQuickLaunch Drop Error Slippfeil File/URL '%1' cannot be embedded into QuickLaunch for now Filen/URLen '%1' kan ikke bli lagt til hurtigstarteren nå Drop application icons here Slipp program- ikoner her QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Flytt til venstre Move right Flytt til høyre Remove from quicklaunch Fjern fra hurtigstarteren Refresh Gjenoppfrisk ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_nl.desktop.yaml ================================================ Desktop Entry/Name: "Snelstartbalk" Desktop Entry/Comment: "Start uw favoriete programma's met één muisklik" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_nl.ts ================================================ LXQtQuickLaunch Drop Error Sleepfout File/URL '%1' cannot be embedded into QuickLaunch for now ‘%1’ kan vooralsnog niet worden toegevoegd aan de snelstartbalk Drop application icons here Sleep programma- pictogrammen hierheen QuickLaunchButton (Ctrl + DND) (Ctrl + slepen) Move left Naar links verplaatsen Move right Naar rechts verplaatsen Remove from quicklaunch Verwijderen van snelstartbalk Refresh Herladen ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_oc.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Tirar de l’aviada rapida Refresh Actualizar ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pa.ts ================================================ LXQtQuickLaunch Drop Error ਡਰੌਪ ਗਲਤੀ File/URL '%1' cannot be embedded into QuickLaunch for now ਫਾਇਲ/URL '%1' ਨੂੰ ਫ਼ੌਰੀ-ਲਾਂਚ ਵਿੱਚ ਹੁਣ ਜੋੜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ Drop application icons here ਐਪਲੀਕਸ਼ਨ ਆਈਕਾਨ ਇੱਥੇ ਰੱਖੋ QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left ਖੱਬੇ ਭੇਜੋ Move right ਸੱਜੇ ਭੇਜੋ Remove from quicklaunch ਫ਼ੌਰਨ-ਲਾਂਚ ਵਿੱਚੋਂ ਹਟਾਓ Refresh ਤਾਜ਼ਾ ਕਰੋ ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pl.desktop.yaml ================================================ Desktop Entry/Name: "Szybkie uruchamianie" Desktop Entry/Comment: "Szybki dostęp do ulubionych programów" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pl.ts ================================================ LXQtQuickLaunch Drop Error Błąd upuszczania File/URL '%1' cannot be embedded into QuickLaunch for now Plik/adres '%1' nie może zostać teraz umieszczony w szybkim uruchamianiu Drop application icons here Upuść ikony programów tutaj QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Przesuń w lewo Move right Przesuń w prawo Remove from quicklaunch Usuń z szybkiego uruchamiania Refresh Odśwież ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pt.desktop.yaml ================================================ Desktop Entry/Name: "Inicio rápido" Desktop Entry/Comment: "Acesso rápido as suas aplicações preferidas" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pt.ts ================================================ LXQtQuickLaunch Drop Error Erro ao largar File/URL '%1' cannot be embedded into QuickLaunch for now Ficheiro/URL '%1' ainda não pode ser incorporado no Início rápido Drop application icons here Largue aqui os ícones da aplicação QuickLaunchButton (Ctrl + DND) (Ctrl + Arrastar e largar) Move left Mover para esquerda Move right Mover para direita Remove from quicklaunch Remover de Início rápido Refresh Atualizar ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Lançador rápido" Desktop Entry/Comment: "Lance seus aplicativos favoritos" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_pt_BR.ts ================================================ LXQtQuickLaunch Drop Error Erro na colocação File/URL '%1' cannot be embedded into QuickLaunch for now O arquivo/URL '%1' não pôde ser incorporado ao lançador rápido por enquanto Drop application icons here Arraste ícones de aplicativos para cá QuickLaunchButton (Ctrl + DND) (Ctrl + Arrastar e Soltar) Move left Mover para a esquerda Move right Mover para a direita Remove from quicklaunch Remover do lançador rápido Refresh Atualizar ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ro.desktop.yaml ================================================ Desktop Entry/Name: "Quick launch" Desktop Entry/Comment: "Lansează aplicațiile favorite" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ro_RO.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Fișierul/URL-ul '%1' nu poate fi inclus în lista de lansare rapidă momentan Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Mută spre stânga Move right Mută spre dreapta Remove from quicklaunch Îndepărtează din lista pentru lansare rapidă Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ru.desktop.yaml ================================================ Desktop Entry/Name: "Быстрый запуск" Desktop Entry/Comment: "Простой доступ к вашим любимым приложениям" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_ru.ts ================================================ LXQtQuickLaunch Drop Error Ошибка при перетаскивании File/URL '%1' cannot be embedded into QuickLaunch for now Файл/URL-адрес «%1» сейчас нельзя встроить в быстрый запуск Drop application icons here Перетащите значки приложений сюда QuickLaunchButton (Ctrl + DND) (Ctrl + Перетащить) Move left Сдвинуть влево Move right Сдвинуть вправо Remove from quicklaunch Удалить из быстрого запуска Refresh Обновить ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_si.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sk.desktop.yaml ================================================ Desktop Entry/Name: "Rýchle spustenie" Desktop Entry/Comment: "Spúšťanie vašich obľúbených aplikácií" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sk_SK.ts ================================================ LXQtQuickLaunch Drop Error Chyba File/URL '%1' cannot be embedded into QuickLaunch for now Súbor/URL „%1“ momentálne nie je možné vložiť do rýchleho spustenia Drop application icons here Sem pretiahnite ikonu aplikácie QuickLaunchButton (Ctrl + DND) (Ctrl + ťahanie) Move left Presunúť vľavo Move right Presunúť vpravo Remove from quicklaunch Odstrániť z rýchleho spustenia Refresh Obnoviť ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sl.desktop.yaml ================================================ Desktop Entry/Name: "Hitri zagon" Desktop Entry/Comment: "Zaženite svoje priljubljene programe" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sl.ts ================================================ LXQtQuickLaunch Drop Error Napaka pri dodajanju File/URL '%1' cannot be embedded into QuickLaunch for now Elementa »%1« trenutno ni mogoče vstaviti v hitri zagon Drop application icons here Povlecite ikone za hitri zagon sem QuickLaunchButton (Ctrl + DND) Move left Premakni levo Move right Premakni desno Remove from quicklaunch Odstrani iz hitrega zagona Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr.desktop.yaml ================================================ Desktop Entry/Name: "Брзо покретање" Desktop Entry/Comment: "Покреће ваше омиљене програме" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Брзо покретање" Desktop Entry/Comment: "Покреће ваше омиљене програме" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Brzo pokretanje" Desktop Entry/Comment: "Pokreće vaše omiljene programe" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Brzo pokretanje" Desktop Entry/Comment: "Pokreće vaše omiljene programe" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr@latin.ts ================================================ LXQtQuickLaunch Drop Error File/URL '%1' cannot be embedded into QuickLaunch for now Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Move right Remove from quicklaunch Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr_BA.ts ================================================ LXQtQuickLaunch Drop Error Грешка испуштања File/URL '%1' cannot be embedded into QuickLaunch for now Фајл/УРЛ „%1“ не може бити уграђен у Брзо Покретање за сада Drop application icons here QuickLaunchButton (Ctrl + DND) Move left Помјери лијево Move right Помјери десно Remove from quicklaunch Уклони са брзог покретања Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sr_RS.ts ================================================ LXQtQuickLaunch Drop Error Грешка испуштања File/URL '%1' cannot be embedded into QuickLaunch for now Фајл/УРЛ „%1“ не може бити уграђен у Брзо Покретање за сада Drop application icons here Испусти апликацију иконе овде QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Помери лево Move right Помери десно Remove from quicklaunch Уклони са брзог покретања Refresh Освежи ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sv.desktop.yaml ================================================ Desktop Entry/Name: "Programgenväg" Desktop Entry/Comment: "Snabb åtkomst till dina favoritprogram" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_sv.ts ================================================ LXQtQuickLaunch Drop Error Fel vid släpp File/URL '%1' cannot be embedded into QuickLaunch for now Filen/URL:n '%1' kan inte tillsättas som programgenväg Drop application icons here Släpp hit en programikon QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Flytta åt vänster Move right Flytta åt höger Remove from quicklaunch Ta bort programgenväg Refresh Uppdatera ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_th.desktop.yaml ================================================ Desktop Entry/Name: "ตัวเรียกโปรแกรมด่วน" Desktop Entry/Comment: "เรียกใช้งานโปรแกรมที่ชื่นชอบของคุณ" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_th_TH.ts ================================================ LXQtQuickLaunch Drop Error การหย่อนขัดข้อง File/URL '%1' cannot be embedded into QuickLaunch for now แฟ้ม/URL '%1' ไม่สามารถฝังตัวไปยังตัวเรียกโปรแกรมด่วนได้ในตอนนี้ Drop application icons here QuickLaunchButton (Ctrl + DND) Move left ย้ายไปทางซ้าย Move right ย้ายไปทางขวา Remove from quicklaunch ลบออกจากตัวเรียกโปรแกรมด่วน Refresh ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_tr.desktop.yaml ================================================ Desktop Entry/Name: "Hızlı çalıştırıcı" Desktop Entry/Comment: "Sık kullanılan uygulamalarınızı çalıştırın" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_tr.ts ================================================ LXQtQuickLaunch Drop Error Bırakma Hatası File/URL '%1' cannot be embedded into QuickLaunch for now Şimdilik '%1' dosyası/bağlantısı Hızlı Başlatıcı' ya eklenemiyor Drop application icons here Uygulama simgesini buraya bırakın QuickLaunchButton (Ctrl + DND) (Ctrl + DND) Move left Sola kaydır Move right Sağa kaydır Remove from quicklaunch Hızlı başlatıcıdan kaldır Refresh Yenile ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_uk.desktop.yaml ================================================ Desktop Entry/Name: "Швидкий запуск" Desktop Entry/Comment: "Простий доступ до улюблених застосунків" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_uk.ts ================================================ LXQtQuickLaunch Drop Error Помилка розміщення File/URL '%1' cannot be embedded into QuickLaunch for now Файл/URL '%1' зараз не вдається додати до швидкого запуску Drop application icons here Перетягніть піктограми програм сюди QuickLaunchButton (Ctrl + DND) (Ctrl + перетягнути) Move left Посунути ліворуч Move right Посунути праворуч Remove from quicklaunch Вилучити зі швидкого запуску Refresh Оновити ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "快速启动" Desktop Entry/Comment: "启动常用程序" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_zh_CN.ts ================================================ LXQtQuickLaunch Drop Error 拖放错误 File/URL '%1' cannot be embedded into QuickLaunch for now 文件/URL '%1' 暂时无法被嵌入到快速启动 Drop application icons here 移动应用程序图标至此 QuickLaunchButton (Ctrl + DND) (Ctrl + 拖拽) Move left 左移 Move right 右移 Remove from quicklaunch 从快速启动删除 Refresh 刷新 ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "快速啟動" Desktop Entry/Comment: "易於存取最愛的應用程式" ================================================ FILE: plugin-quicklaunch/translations/quicklaunch_zh_TW.ts ================================================ LXQtQuickLaunch Drop Error 放置錯誤 File/URL '%1' cannot be embedded into QuickLaunch for now 檔案位址 '%1' 現在不可嵌入至快速啟動 Drop application icons here 在此放置 應用程式圖示 QuickLaunchButton (Ctrl + DND) (Ctrl + 拖放) Move left 往左移動 Move right 往右移動 Remove from quicklaunch 從快速啟動中移除 Refresh 重新整理 ================================================ FILE: plugin-sensors/CMakeLists.txt ================================================ set(PLUGIN "sensors") set(HEADERS lxqtsensorsplugin.h chip.h feature.h lxqtsensors.h lxqtsensorsconfiguration.h sensors.h ) set(SOURCES lxqtsensorsplugin.cpp chip.cpp feature.cpp lxqtsensors.cpp lxqtsensorsconfiguration.cpp sensors.cpp ) set(UIS lxqtsensorsconfiguration.ui ) set(LIBRARIES ${SENSORS_LIB}) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-sensors/chip.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "chip.h" #include Chip::Chip(const sensors_chip_name* sensorsChipName) : mSensorsChipName(sensorsChipName) { const int BUF_SIZE = 256; char buf[BUF_SIZE]; if (sensors_snprintf_chip_name(buf, BUF_SIZE, mSensorsChipName) > 0) { mName = QString::fromLatin1(buf); } qDebug() << "Detected chip:" << mName; const sensors_feature* feature; int featureNr = 0; while ((feature = sensors_get_features(mSensorsChipName, &featureNr))) { mFeatures.push_back(Feature(mSensorsChipName, feature)); } } const QString& Chip::getName() const { return mName; } const QList& Chip::getFeatures() const { return mFeatures; } ================================================ FILE: plugin-sensors/chip.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef CHIP_H #define CHIP_H #include "feature.h" #include "sensors.h" #include #include /** * @brief Chip class is providing RAII-style for lm_sensors library */ class Chip { public: Chip(const sensors_chip_name*); const QString& getName() const; const QList& getFeatures() const; private: // Do not try to change these chip names, as they point to internal structures of lm_sensors! const sensors_chip_name* mSensorsChipName; // "Printable" chip name QString mName; QList mFeatures; }; #endif // CHIP_H ================================================ FILE: plugin-sensors/feature.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "feature.h" #include Feature::Feature(const sensors_chip_name* sensorsChipName, const sensors_feature* sensorsFeature) : mSensorsChipName(sensorsChipName), mSensorsFeature(sensorsFeature) { char *featureLabel = nullptr; if ((featureLabel = sensors_get_label(mSensorsChipName, mSensorsFeature))) { mLabel = QString::fromUtf8(featureLabel); free(featureLabel); } qDebug() << "Detected feature:" << QString::fromLatin1(sensorsFeature->name) << "(" << mLabel << ")"; } const QString& Feature::getLabel() const { return mLabel; } double Feature::getValue(sensors_subfeature_type subfeature_type) const { double result = 0; const sensors_subfeature *subfeature; // Find feature subfeature = sensors_get_subfeature(mSensorsChipName, mSensorsFeature, subfeature_type); if (subfeature) { sensors_get_value(mSensorsChipName, subfeature->number, &result); } return result; } sensors_feature_type Feature::getType() const { return mSensorsFeature->type; } ================================================ FILE: plugin-sensors/feature.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef FEATURE_H #define FEATURE_H #include #include #include /** * @brief Feature class is providing RAII-style for lm_sensors library */ class Feature { public: Feature(const sensors_chip_name*, const sensors_feature*); const QString& getName() const; const QString& getLabel() const; double getValue(sensors_subfeature_type) const; sensors_feature_type getType() const; private: // Do not try to change these chip names, as they point to internal structures of lm_sensors! const sensors_chip_name* mSensorsChipName; const sensors_feature* mSensorsFeature; // "Printable" feature label QString mLabel; QList mSubFeatures; }; #endif // CHIP_H ================================================ FILE: plugin-sensors/lxqtsensors.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsensors.h" #include "lxqtsensorsconfiguration.h" #include "../panel/ilxqtpanelplugin.h" #include "../panel/ilxqtpanel.h" #include #include #include #include static constexpr double DEFAULT_MAX = 200; // 200 Celsius LXQtSensors::LXQtSensors(ILXQtPanelPlugin *plugin, QWidget* parent): QFrame(parent), mPlugin(plugin), mSettings(plugin->settings()) { mDetectedChips = mSensors.getDetectedChips(); /** * We have all needed data to initialize default settings, we have to do it here as later * we are using them. */ initDefaultSettings(); // Add GUI elements ProgressBar* pg = nullptr; mLayout = new QBoxLayout(QBoxLayout::LeftToRight, this); mLayout->setSpacing(0); mLayout->setContentsMargins(0, 0, 0, 0); QString chipFeatureLabel; mSettings->beginGroup(QStringLiteral("chips")); for (int i = 0; i < mDetectedChips.size(); ++i) { mSettings->beginGroup(mDetectedChips[i].getName()); const QList& features = mDetectedChips[i].getFeatures(); for (int j = 0; j < features.size(); ++j) { if (features[j].getType() == SENSORS_FEATURE_TEMP) { chipFeatureLabel = features[j].getLabel(); mSettings->beginGroup(chipFeatureLabel); pg = new ProgressBar(this); pg->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // Hide progress bar if it is not enabled if (!mSettings->value(QStringLiteral("enabled")).toBool()) { pg->hide(); } pg->setToolTip(chipFeatureLabel); pg->setTextVisible(false); pg->setSensorColor(mSettings->value(QStringLiteral("color")).toString()); mTemperatureProgressBars.push_back(pg); mLayout->addWidget(pg); mSettings->endGroup(); } } mSettings->endGroup(); } mSettings->endGroup(); // Fit plugin to current panel realign(); // Updated sensors readings to display actual values at start updateSensorReadings(); // Run timer that will be updating sensor readings connect(&mUpdateSensorReadingsTimer, &QTimer::timeout, this, &LXQtSensors::updateSensorReadings); mUpdateSensorReadingsTimer.start(mSettings->value(QStringLiteral("updateInterval")).toInt() * 1000); // Run timer that will be showin warning mWarningAboutHighTemperatureTimer.setInterval(500); connect(&mWarningAboutHighTemperatureTimer, &QTimer::timeout, this, &LXQtSensors::warningAboutHighTemperature); if (mSettings->value(QStringLiteral("warningAboutHighTemperature")).toBool()) { mWarningAboutHighTemperatureTimer.start(); } } LXQtSensors::~LXQtSensors() = default; void LXQtSensors::updateSensorReadings() { QString tooltip; double critTemp = 0; double maxTemp = 0; double minTemp = 0; double curTemp = 0; bool highTemperature = false; // Iterator for temperature progress bars QList::iterator temperatureProgressBarsIt = mTemperatureProgressBars.begin(); const bool use_fahrenheit = mSettings->value(QStringLiteral("useFahrenheitScale")).toBool(); const bool warn_high = mSettings->value(QStringLiteral("warningAboutHighTemperature")).toBool(); const double default_max = use_fahrenheit ? celsiusToFahrenheit(DEFAULT_MAX) : DEFAULT_MAX; for (int i = 0; i < mDetectedChips.size(); ++i) { const QList& features = mDetectedChips[i].getFeatures(); for (int j = 0; j < features.size(); ++j) { if (features[j].getType() == SENSORS_FEATURE_TEMP) { tooltip = features[j].getLabel() + QStringLiteral(" (") + QChar(0x00B0); critTemp = features[j].getValue(SENSORS_SUBFEATURE_TEMP_CRIT); maxTemp = features[j].getValue(SENSORS_SUBFEATURE_TEMP_MAX); minTemp = features[j].getValue(SENSORS_SUBFEATURE_TEMP_MIN); curTemp = features[j].getValue(SENSORS_SUBFEATURE_TEMP_INPUT); double temp_to_check = maxTemp == 0.0 ? critTemp : maxTemp; // Check if temperature is too high if (temp_to_check != 0.0 && curTemp >= temp_to_check) { if (warn_high) { // Add current progress bar to the "warning container" mHighTemperatureProgressBars.insert(*temperatureProgressBarsIt); } highTemperature = true; } else { mHighTemperatureProgressBars.remove(*temperatureProgressBarsIt); highTemperature = false; } if (use_fahrenheit) { critTemp = celsiusToFahrenheit(critTemp); maxTemp = celsiusToFahrenheit(maxTemp); minTemp = celsiusToFahrenheit(minTemp); curTemp = celsiusToFahrenheit(curTemp); tooltip += QLatin1String("F)"); } else { tooltip += QLatin1String("C)"); } // Set maximum temperature (*temperatureProgressBarsIt)->setMaximum(critTemp == 0.0 ? default_max : critTemp); // Set minimum temperature (*temperatureProgressBarsIt)->setMinimum(minTemp); // Set current temperature (*temperatureProgressBarsIt)->setValue(curTemp); tooltip += QLatin1String("

Crit: "); tooltip += QString::number((*temperatureProgressBarsIt)->maximum()); tooltip += QLatin1String("
Max: "); tooltip += QString::number(int(maxTemp)); tooltip += QLatin1String("
Cur: "); // Mark high temperature in the tooltip if (highTemperature) { tooltip += QLatin1String(""); tooltip += QString::number((*temperatureProgressBarsIt)->value()); tooltip += QLatin1String(" !"); } else { tooltip += QString::number((*temperatureProgressBarsIt)->value()); } tooltip += QLatin1String("
Min: "); tooltip += QString::number((*temperatureProgressBarsIt)->minimum()); (*temperatureProgressBarsIt)->setToolTip(tooltip); // Go to the next temperature progress bar ++temperatureProgressBarsIt; } } } update(); } void LXQtSensors::warningAboutHighTemperature() { // Iterator for temperature progress bars QSet::iterator temperatureProgressBarsIt = mHighTemperatureProgressBars.begin(); int curValue; int maxValue; for (; temperatureProgressBarsIt != mHighTemperatureProgressBars.end(); ++temperatureProgressBarsIt) { curValue = (*temperatureProgressBarsIt)->value(); maxValue = (*temperatureProgressBarsIt)->maximum(); if (maxValue > curValue) { (*temperatureProgressBarsIt)->setValue(maxValue); } else { (*temperatureProgressBarsIt)->setValue((*temperatureProgressBarsIt)->minimum()); } } update(); } void LXQtSensors::settingsChanged() { mUpdateSensorReadingsTimer.setInterval(mSettings->value(QStringLiteral("updateInterval")).toInt() * 1000); // Iterator for temperature progress bars QList::iterator temperatureProgressBarsIt = mTemperatureProgressBars.begin(); mSettings->beginGroup(QStringLiteral("chips")); for (int i = 0; i < mDetectedChips.size(); ++i) { mSettings->beginGroup(mDetectedChips[i].getName()); const QList& features = mDetectedChips[i].getFeatures(); for (int j = 0; j < features.size(); ++j) { if (features[j].getType() == SENSORS_FEATURE_TEMP) { mSettings->beginGroup(features[j].getLabel()); if (mSettings->value(QStringLiteral("enabled")).toBool()) { (*temperatureProgressBarsIt)->show(); } else { (*temperatureProgressBarsIt)->hide(); } (*temperatureProgressBarsIt)->setSensorColor(mSettings->value(QStringLiteral("color")).toString()); mSettings->endGroup(); // Go to the next temperature progress bar ++temperatureProgressBarsIt; } } mSettings->endGroup(); } mSettings->endGroup(); if (mSettings->value(QStringLiteral("warningAboutHighTemperature")).toBool()) { // Update sensors readings to get the list of high temperature progress bars updateSensorReadings(); if (!mWarningAboutHighTemperatureTimer.isActive()) mWarningAboutHighTemperatureTimer.start(); } else if (mWarningAboutHighTemperatureTimer.isActive()) { mWarningAboutHighTemperatureTimer.stop(); // Update sensors readings to set progress bar values to "normal" height updateSensorReadings(); } realign(); update(); } void LXQtSensors::realign() { // Default values for LXQtPanel::PositionBottom or LXQtPanel::PositionTop Qt::Orientation cur_orient = Qt::Vertical; Qt::LayoutDirection cur_layout_dir = Qt::LeftToRight; if (mPlugin->panel()->isHorizontal()) { mLayout->setDirection(QBoxLayout::LeftToRight); } else { mLayout->setDirection(QBoxLayout::TopToBottom); } switch (mPlugin->panel()->position()) { case ILXQtPanel::PositionLeft: cur_orient = Qt::Horizontal; break; case ILXQtPanel::PositionRight: cur_orient = Qt::Horizontal; cur_layout_dir = Qt::RightToLeft; break; default: break; } for (int i = 0; i < mTemperatureProgressBars.size(); ++i) { mTemperatureProgressBars[i]->setOrientation(cur_orient); mTemperatureProgressBars[i]->setLayoutDirection(cur_layout_dir); if (mPlugin->panel()->isHorizontal()) { mTemperatureProgressBars[i]->setFixedWidth(mPlugin->settings()->value(QStringLiteral("tempBarWidth")).toInt()); mTemperatureProgressBars[i]->setFixedHeight(QWIDGETSIZE_MAX); } else { mTemperatureProgressBars[i]->setFixedHeight(mPlugin->settings()->value(QStringLiteral("tempBarWidth")).toInt()); mTemperatureProgressBars[i]->setFixedWidth(QWIDGETSIZE_MAX); } } } double LXQtSensors::celsiusToFahrenheit(double celsius) { // Fahrenheit = 32 * (9/5) * Celsius return 32 + 1.8 * celsius; } void LXQtSensors::initDefaultSettings() { if (!mSettings->contains(QStringLiteral("updateInterval"))) { mSettings->setValue(QStringLiteral("updateInterval"), 1); } if (!mSettings->contains(QStringLiteral("tempBarWidth"))) { mSettings->setValue(QStringLiteral("tempBarWidth"), 8); } if (!mSettings->contains(QStringLiteral("useFahrenheitScale"))) { mSettings->setValue(QStringLiteral("useFahrenheitScale"), false); } mSettings->beginGroup(QStringLiteral("chips")); // Initialize default sensors settings for (int i = 0; i < mDetectedChips.size(); ++i) { mSettings->beginGroup(mDetectedChips[i].getName()); const QList& features = mDetectedChips[i].getFeatures(); for (int j = 0; j < features.size(); ++j) { if (features[j].getType() == SENSORS_FEATURE_TEMP) { mSettings->beginGroup(features[j].getLabel()); if (!mSettings->contains(QStringLiteral("enabled"))) { mSettings->setValue(QStringLiteral("enabled"), true); } if (!mSettings->contains(QStringLiteral("color"))) { // This is the default from QtDesigner mSettings->setValue(QStringLiteral("color"), QColor(qRgb(98, 140, 178)).name()); } mSettings->endGroup(); } } mSettings->endGroup(); } mSettings->endGroup(); if (!mSettings->contains(QStringLiteral("warningAboutHighTemperature"))) { mSettings->setValue(QStringLiteral("warningAboutHighTemperature"), true); } } ProgressBar::ProgressBar(QWidget *parent): QProgressBar(parent) { } QSize ProgressBar::sizeHint() const { return QSize(20, 20); } void ProgressBar::setSensorColor(const QString &colorName) { // NOTE: Only a style sheet guarantees that custom colors are applied // because not all widget styles use palettes to draw progress bars. static const QString ss = QStringLiteral("QProgressBar{background-color: %1; border-radius: 2px; border: 1px solid %2;}" "QProgressBar::chunk{background-color: %3; border-radius: 1px;}"); QPalette pal = palette(); QColor base = pal.color(QPalette::Base); QColor outline = pal.color(QPalette::Text); outline.setRgbF(0.5 * base.redF() + 0.5 * outline.redF(), 0.5 * base.greenF() + 0.5 * outline.greenF(), 0.5 * base.blueF() + 0.5 * outline.blueF()); setStyleSheet(ss.arg(base.name(), outline.name(), colorName)); } ================================================ FILE: plugin-sensors/lxqtsensors.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSENSORS_H #define LXQTSENSORS_H #include "sensors.h" #include "../panel/pluginsettings.h" #include #include #include #include class ProgressBar: public QProgressBar { Q_OBJECT public: ProgressBar(QWidget *parent = nullptr); QSize sizeHint() const; void setSensorColor(const QString &colorName); }; class QSettings; class ILXQtPanelPlugin; class QBoxLayout; class LXQtSensors : public QFrame { Q_OBJECT public: LXQtSensors(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~LXQtSensors(); void settingsChanged(); void realign(); public slots: void updateSensorReadings(); void warningAboutHighTemperature(); private: ILXQtPanelPlugin *mPlugin; QBoxLayout *mLayout; QTimer mUpdateSensorReadingsTimer; QTimer mWarningAboutHighTemperatureTimer; Sensors mSensors; QList mDetectedChips; QList mTemperatureProgressBars; // With set we can handle updates in very easy way :) QSet mHighTemperatureProgressBars; double celsiusToFahrenheit(double celsius); void initDefaultSettings(); PluginSettings *mSettings; }; #endif // LXQTSENSORS_H ================================================ FILE: plugin-sensors/lxqtsensorsconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsensorsconfiguration.h" #include "ui_lxqtsensorsconfiguration.h" #include #include #include #include #include LXQtSensorsConfiguration::LXQtSensorsConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtSensorsConfiguration), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("SensorsConfigurationWindow")); ui->setupUi(this); // We load settings here cause we have to set up dynamic widgets loadSettings(); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtSensorsConfiguration::dialogButtonsAction); connect(ui->updateIntervalSB, &QSpinBox::valueChanged, this, &LXQtSensorsConfiguration::saveSettings); connect(ui->tempBarWidthSB, &QSpinBox::valueChanged, this, &LXQtSensorsConfiguration::saveSettings); connect(ui->detectedChipsCB, &QComboBox::activated, this, &LXQtSensorsConfiguration::detectedChipSelected); connect(ui->celsiusTempScaleRB, &QRadioButton::toggled, this, &LXQtSensorsConfiguration::saveSettings); // We don't need signal from the other radio box as celsiusTempScaleRB will send one //connect(ui->fahrenheitTempScaleRB, SIGNAL(toggled(bool)), this, SLOT(saveSettings())); connect(ui->warningAboutHighTemperatureChB, &QCheckBox::toggled, this, &LXQtSensorsConfiguration::saveSettings); /** * Signals for enable/disable and bar color change are set in the loadSettings method because * we are creating them dynamically. */ } LXQtSensorsConfiguration::~LXQtSensorsConfiguration() { delete ui; } void LXQtSensorsConfiguration::loadSettings() { mLockSettingChanges = true; ui->updateIntervalSB->setValue(settings().value(QStringLiteral("updateInterval")).toInt()); ui->tempBarWidthSB->setValue(settings().value(QStringLiteral("tempBarWidth")).toInt()); if (settings().value(QStringLiteral("useFahrenheitScale")).toBool()) { ui->fahrenheitTempScaleRB->setChecked(true); } // In case of reloading settings we have to clear GUI elements ui->detectedChipsCB->clear(); settings().beginGroup(QStringLiteral("chips")); QStringList chipNames = settings().childGroups(); for (int i = 0; i < chipNames.size(); ++i) { ui->detectedChipsCB->addItem(chipNames[i]); } settings().endGroup(); // Load feature for the first chip if exist if (chipNames.size() > 0) { detectedChipSelected(0); } ui->warningAboutHighTemperatureChB->setChecked( settings().value(QStringLiteral("warningAboutHighTemperature")).toBool()); mLockSettingChanges = false; } void LXQtSensorsConfiguration::saveSettings() { if (mLockSettingChanges) return; settings().setValue(QStringLiteral("updateInterval"), ui->updateIntervalSB->value()); settings().setValue(QStringLiteral("tempBarWidth"), ui->tempBarWidthSB->value()); if (ui->fahrenheitTempScaleRB->isChecked()) { settings().setValue(QStringLiteral("useFahrenheitScale"), true); } else { settings().setValue(QStringLiteral("useFahrenheitScale"), false); } settings().beginGroup(QStringLiteral("chips")); QStringList chipNames = settings().childGroups(); if (chipNames.size()) { QStringList chipFeatureLabels; QPushButton* colorButton = nullptr; QCheckBox* enabledCheckbox = nullptr; settings().beginGroup(chipNames[ui->detectedChipsCB->currentIndex()]); chipFeatureLabels = settings().childGroups(); for (int j = 0; j < chipFeatureLabels.size(); ++j) { settings().beginGroup(chipFeatureLabels[j]); enabledCheckbox = qobject_cast(ui->chipFeaturesT->cellWidget(j, 0)); // We know what we are doing so we don't have to check if enabledCheckbox == 0 settings().setValue(QStringLiteral("enabled"), enabledCheckbox->isChecked()); colorButton = qobject_cast(ui->chipFeaturesT->cellWidget(j, 2)); // We know what we are doing so we don't have to check if colorButton == 0 settings().setValue( QStringLiteral("color"), colorButton->palette().color(QPalette::Normal, QPalette::Button).name()); settings().endGroup(); } settings().endGroup(); } settings().endGroup(); settings().setValue(QStringLiteral("warningAboutHighTemperature"), ui->warningAboutHighTemperatureChB->isChecked()); } void LXQtSensorsConfiguration::changeProgressBarColor() { QAbstractButton* btn = qobject_cast(sender()); if (btn) { QPalette pal = btn->palette(); QColor color = QColorDialog::getColor(pal.color(QPalette::Normal, QPalette::Button), this); if (color.isValid()) { pal.setColor(QPalette::Normal, QPalette::Button, color); btn->setPalette(pal); saveSettings(); } } else { qDebug() << "LXQtSensorsConfiguration::changeProgressBarColor():" << "invalid button cast"; } } void LXQtSensorsConfiguration::detectedChipSelected(int index) { settings().beginGroup(QStringLiteral("chips")); QStringList chipNames = settings().childGroups(); QStringList chipFeatureLabels; QPushButton* colorButton = nullptr; QCheckBox* enabledCheckbox = nullptr; QTableWidgetItem *chipFeatureLabel = nullptr; if (index < chipNames.size()) { qDebug() << "Selected chip: " << ui->detectedChipsCB->currentText(); // In case of reloading settings we have to clear GUI elements ui->chipFeaturesT->setRowCount(0); // Add detected chips and features QStringList chipFeaturesLabels; chipFeaturesLabels << tr("Enabled") << tr("Label") << tr("Color"); ui->chipFeaturesT->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->chipFeaturesT->setHorizontalHeaderLabels(chipFeaturesLabels); settings().beginGroup(chipNames[index]); chipFeatureLabels = settings().childGroups(); for (int j = 0; j < chipFeatureLabels.size(); ++j) { settings().beginGroup(chipFeatureLabels[j]); ui->chipFeaturesT->insertRow(j); enabledCheckbox = new QCheckBox(ui->chipFeaturesT); enabledCheckbox->setChecked(settings().value(QStringLiteral("enabled")).toBool()); // Connect here after the setChecked call because we don't want to send signal #if (QT_VERSION >= QT_VERSION_CHECK(6,7,0)) connect(enabledCheckbox, &QCheckBox::checkStateChanged, this, &LXQtSensorsConfiguration::saveSettings); #else connect(enabledCheckbox, &QCheckBox::stateChanged, this, &LXQtSensorsConfiguration::saveSettings); #endif ui->chipFeaturesT->setCellWidget(j, 0, enabledCheckbox); chipFeatureLabel = new QTableWidgetItem(chipFeatureLabels[j]); chipFeatureLabel->setFlags(Qt::ItemIsEnabled); ui->chipFeaturesT->setItem(j, 1, chipFeatureLabel); colorButton = new QPushButton(ui->chipFeaturesT); connect(colorButton, &QPushButton::clicked, this, &LXQtSensorsConfiguration::changeProgressBarColor); QPalette pal = colorButton->palette(); pal.setColor(QPalette::Normal, QPalette::Button, QColor(settings().value(QStringLiteral("color")).toString())); colorButton->setPalette(pal); ui->chipFeaturesT->setCellWidget(j, 2, colorButton); settings().endGroup(); } settings().endGroup(); } else { qDebug() << "Invalid chip index: " << index; } settings().endGroup(); } ================================================ FILE: plugin-sensors/lxqtsensorsconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSENSORSCONFIGURATION_H #define LXQTSENSORSCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #include #include #include namespace Ui { class LXQtSensorsConfiguration; } class LXQtSensorsConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtSensorsConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtSensorsConfiguration(); private: Ui::LXQtSensorsConfiguration *ui; bool mLockSettingChanges; /* Read settings from conf file and put data into controls. */ void loadSettings(); private slots: /* Saves settings in conf file. */ void saveSettings(); void changeProgressBarColor(); void detectedChipSelected(int index); }; #endif // LXQTSENSORSCONFIGURATION_H ================================================ FILE: plugin-sensors/lxqtsensorsconfiguration.ui ================================================ LXQtSensorsConfiguration 0 0 271 284 Sensors Settings QTabWidget::Rounded 0 true Common 0 0 Update interval (seconds) true 1 300 Temperature bar width 1 8 Blink status bars when the temperature is too high Qt::LeftToRight Warning about high temperature true false Temperature scale Celsius true Fahrenheit fahrenheitTempScaleRB celsiusTempScaleRB Qt::Vertical 20 40 Sensors Detected chips: -1 true Chip features: 3 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() LXQtSensorsConfiguration accept() buttons rejected() LXQtSensorsConfiguration reject() ================================================ FILE: plugin-sensors/lxqtsensorsplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsensorsplugin.h" #include "lxqtsensors.h" #include "lxqtsensorsconfiguration.h" LXQtSensorsPlugin::LXQtSensorsPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mWidget(new LXQtSensors(this)) { } LXQtSensorsPlugin::~LXQtSensorsPlugin() { delete mWidget; } QWidget *LXQtSensorsPlugin::widget() { return mWidget; } QDialog *LXQtSensorsPlugin::configureDialog() { return new LXQtSensorsConfiguration(settings()); } void LXQtSensorsPlugin::realign() { mWidget->realign(); } void LXQtSensorsPlugin::settingsChanged() { mWidget->settingsChanged(); } ================================================ FILE: plugin-sensors/lxqtsensorsplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSENSORSPLUGIN_H #define LXQTSENSORSPLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include class LXQtSensors; class LXQtSensorsPlugin: public QObject, public ILXQtPanelPlugin { Q_OBJECT public: explicit LXQtSensorsPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtSensorsPlugin(); virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("Sensors"); } bool isSeparate() const { return true; } QDialog *configureDialog(); void realign(); protected: virtual void settingsChanged(); private: LXQtSensors *mWidget; }; class LXQtSensorsPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtSensorsPlugin(startupInfo); } }; #endif // LXQTSENSORSPLUGIN_H ================================================ FILE: plugin-sensors/resources/sensors.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=temperature-normal ================================================ FILE: plugin-sensors/sensors.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "sensors.h" #include QList Sensors::mDetectedChips = QList(); int Sensors::mInstanceCounter = 0; bool Sensors::mSensorsInitialized = false; Sensors::Sensors() { // Increase instance counter ++mInstanceCounter; if (!mSensorsInitialized && sensors_init(nullptr) == 0) { // Sensors initialized mSensorsInitialized = true; sensors_chip_name const * chipName; int chipNr = 0; while ((chipName = sensors_get_detected_chips(nullptr, &chipNr)) != nullptr) { mDetectedChips.push_back(chipName); } qDebug() << "lm_sensors library initialized"; } } Sensors::~Sensors() { // Decrease instance counter --mInstanceCounter; if (mInstanceCounter == 0 && mSensorsInitialized) { mDetectedChips.clear(); mSensorsInitialized = false; sensors_cleanup(); qDebug() << "lm_sensors library cleanup"; } } const QList& Sensors::getDetectedChips() const { return mDetectedChips; } ================================================ FILE: plugin-sensors/sensors.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Łukasz Twarduś * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SENSORS_H #define SENSORS_H #include "chip.h" #include #include class Chip; /** * @brief Sensors class is providing RAII-style for lm_sensors library */ class Sensors { public: Sensors(); ~Sensors(); const QList& getDetectedChips() const; private: static QList mDetectedChips; /** * lm_sensors library can be initialized only once so this will tell us when to init * and when to clean up. */ static int mInstanceCounter; static bool mSensorsInitialized; }; #endif // SENSORS_H ================================================ FILE: plugin-sensors/translations/sensors.desktop.yaml ================================================ Desktop Entry/Name: "Sensors" Desktop Entry/Comment: "View readings from hardware sensors" ================================================ FILE: plugin-sensors/translations/sensors.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_ar.desktop.yaml ================================================ Desktop Entry/Name: "مجسّات" Desktop Entry/Comment: "تعرض قراءات من مجسّات العتاد" ================================================ FILE: plugin-sensors/translations/sensors_ar.ts ================================================ LXQtSensorsConfiguration Sensors Settings إعدادات المجسّات Common عام Update interval (seconds) فترة التحديث (بالثواني) Temperature bar width عرض شريط درجة الحرارة Temperature scale مقياس درجة الحرارة Celsius سيليزي Fahrenheit فهرنهايتي Blink status bars when the temperature is too high وميض أشرطة الحالة عندما تكون درجة الحرارة مرتفعة للغاية Warning about high temperature حذّرني إن كانت درجة الحرارة مرتفعة Sensors المجسّات Detected chips: الرقاقات المُكتشفة: Chip features: ميزات الرقاقة: Enabled مفعّلة Label اللصيقة Color اللون ================================================ FILE: plugin-sensors/translations/sensors_arn.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_ast.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_bg.desktop.yaml ================================================ Desktop Entry/Name: "Сензори" Desktop Entry/Comment: "Показване на данни от откритите сензори" ================================================ FILE: plugin-sensors/translations/sensors_bg.ts ================================================ LXQtSensorsConfiguration Sensors Settings Настройки на сензорен монитор Common Общи Update interval (seconds) Интервал на опресняване (s) Temperature bar width Ширина на плота на температурата Temperature scale Температурна скала Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Мигане на сензорния плот, когато температурата е много висока Warning about high temperature Предупреждение за висока температура Sensors Сензори Detected chips: Открити сензори: Chip features: Функции: Enabled Активиран Label Етикет Color Цвят ================================================ FILE: plugin-sensors/translations/sensors_ca.desktop.yaml ================================================ Desktop Entry/Name: "Sensors" Desktop Entry/Comment: "Vegeu les lectures dels sensors de maquinari" ================================================ FILE: plugin-sensors/translations/sensors_ca.ts ================================================ LXQtSensorsConfiguration Sensors Settings Ajusts dels sensors Common Comú Update interval (seconds) Interval d'actualització (segons) Temperature bar width Amplada de la barra de la temperatura Temperature scale Escala de la temperatura Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Fes parpellejar les barres d'estat quan la temperatura sigui molt alta Warning about high temperature Advertència quant a temperatures elevades Sensors Sensors Detected chips: Xips detectats: Chip features: Característiques del xip: Enabled Habilitat Label Etiqueta Color Color ================================================ FILE: plugin-sensors/translations/sensors_cs.desktop.yaml ================================================ Desktop Entry/Name: "Senzory" Desktop Entry/Comment: "Zobrazit hodnoty ze senzorů v hardware" ================================================ FILE: plugin-sensors/translations/sensors_cs.ts ================================================ LXQtSensorsConfiguration Sensors Settings Nastavení senzorů Common Společné Update interval (seconds) Interval aktualizace stavu (v sekundách) Temperature bar width Šířka pruhu s teplotou Temperature scale Teplotní stupnice Celsius Celsia Fahrenheit Fahrenheita Blink status bars when the temperature is too high Při příliš vysoké teplotě signalizovat blikáním pruhu ukazatele stavu Warning about high temperature Varování při vysoké teplotě Sensors Senzory Detected chips: Zjištěné čipy: Chip features: Funkce čipu: Enabled Povoleno Label Označení Color Barva ================================================ FILE: plugin-sensors/translations/sensors_cy.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_da.desktop.yaml ================================================ Desktop Entry/Name: "Sensorer" Desktop Entry/Comment: "Vis målinger fra maskinel-sensorer" ================================================ FILE: plugin-sensors/translations/sensors_da.ts ================================================ LXQtSensorsConfiguration Sensors Settings Indstillinger for sensorer Common Fælles Update interval (seconds) Genopfriskningsinterval (sekunder) Temperature bar width Temperaturbjælkens bredde Temperature scale Temperaturskala Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Få statuslinjerne til at blinke når temperaturen er for høj Warning about high temperature Advarsel om høj temperatur Sensors Sensorer Detected chips: Fundne chips: Chip features: Chip-funktioner: Enabled Aktiveret Label Etiket Color Farve ================================================ FILE: plugin-sensors/translations/sensors_de.desktop.yaml ================================================ Desktop Entry/Name: "Sensoren" Desktop Entry/Comment: "Messwerte der Hardware-Sensoren anzeigen" ================================================ FILE: plugin-sensors/translations/sensors_de.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensor-Einstellungen Common Allgemein Update interval (seconds) Aktualisierungsintervall (Sekunden) Temperature bar width Temperaturbalkenbreite Temperature scale Temperaturskala Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Blinkende Statusleisten bei zu hoher Temperatur Warning about high temperature Warnung wegen hoher Temperatur Sensors Sensoren Detected chips: Erkannte Chips: Chip features: Chipeigenschaften: Enabled Aktiviert Label Bezeichnung Color Farbe ================================================ FILE: plugin-sensors/translations/sensors_el.desktop.yaml ================================================ Desktop Entry/Name: "Αισθητήρες" Desktop Entry/Comment: "Προβολή ενδείξεων των αισθητήρων υλικού" ================================================ FILE: plugin-sensors/translations/sensors_el.ts ================================================ LXQtSensorsConfiguration Sensors Settings Ρυθμίσεις αισθητήρων Common Κοινές επιλογές Update interval (seconds) Διάστημα ανανέωσης (δευτερόλεπτα) Temperature bar width Πλάτος γραμμής θερμοκρασίας Temperature scale Κλίμακα θερμοκρασίας Celsius Κελσίου Fahrenheit Φαρενάιτ Blink status bars when the temperature is too high Αναβόσβημα των ράβδων κατάστασης όταν η θερμοκρασία είναι πολύ υψηλή Warning about high temperature Προειδοποίηση υψηλής θερμοκρασίας Sensors Αισθητήρες Detected chips: Ανιχνευμένα κυκλώματα: Chip features: Χαρακτηριστικά κυκλώματος: Enabled Ενεργοποιημένο Label Ετικέτα Color Χρώμα ================================================ FILE: plugin-sensors/translations/sensors_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Sensors" Desktop Entry/Comment: "View readings from hardware sensors" ================================================ FILE: plugin-sensors/translations/sensors_en_GB.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensors Settings Common Common Update interval (seconds) Update interval (seconds) Temperature bar width Temperature bar width Temperature scale Temperature scale Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Blink status bars when the temperature is too high Warning about high temperature Warning about high temperature Sensors Sensors Detected chips: Detected chips: Chip features: Chip features: Enabled Enabled Label Label Color Colour ================================================ FILE: plugin-sensors/translations/sensors_eo.desktop.yaml ================================================ Desktop Entry/Name: "Sentiloj" Desktop Entry/Comment: "Vidi legojn de sentiloj (aktuale lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_es.desktop.yaml ================================================ Desktop Entry/Name: "Sensores" Desktop Entry/Comment: "Vea las lecturas de los sensores del hardware" ================================================ FILE: plugin-sensors/translations/sensors_es.ts ================================================ LXQtSensorsConfiguration Sensors Settings Configuración de sensores Common Común Update interval (seconds) Intervalo de actualización (segundos) Temperature bar width Ancho de la barra de temperatura Temperature scale Escala de temperatura Celsius Fahrenheit Blink status bars when the temperature is too high Hacer destellos en las barra de estado si la temperatura es muy alta Warning about high temperature Advertir cuando la temperatura este alta Sensors Sensores Detected chips: Chips detectados: Chip features: Características del chip: Enabled Habilitado Label Etiqueta Color Color ================================================ FILE: plugin-sensors/translations/sensors_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Sensores" Desktop Entry/Comment: "Ver las lecturas desde los sensores (actualmente lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_es_VE.ts ================================================ LXQtSensorsConfiguration Sensors Settings Configuración de Sensores Common Comunes Update interval (seconds) Intervalo de actualizacion (segundos) Temperature bar width Ancho de la barra indicadora Temperature scale Escala de temperatura Celsius Celcios Fahrenheit Fahrenheit Blink status bars when the temperature is too high Parpadear las barras de estado cuando la temperatura sea demasiado alta Warning about high temperature Advertir acerca de altas temperaturas Sensors Sensores Detected chips: Chips detectados Chip features: Chips caracteristicas: Enabled Habilitado Label Etiqueta Color Color ================================================ FILE: plugin-sensors/translations/sensors_et.desktop.yaml ================================================ Desktop Entry/Name: "Andurid" Desktop Entry/Comment: "Vaata sinu arvuti raudvara andurite näite" ================================================ FILE: plugin-sensors/translations/sensors_et.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensorite seadistused Common Üldised seadistused Update interval (seconds) Uuenduse välp (sekundites) Temperature bar width Temperatuurigraafiku laius Temperature scale Temperatuurigraafiku skaala Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Liiga kõrge temperatuuri puhul anna vilgutamisega märku Warning about high temperature Süsteem on liiga kuum Sensors Sensorid Detected chips: Tuvastatud kiibid: Chip features: Kiibi omadused: Enabled Kasutusel Label Silt Color Värv ================================================ FILE: plugin-sensors/translations/sensors_eu.desktop.yaml ================================================ Desktop Entry/Name: "Sentsoreak" Desktop Entry/Comment: "Ikusi hardware-sentsoreen irakurketak (unean lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_eu.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sentsoreen ezarpenak Common Komuna Update interval (seconds) Eguneraketa tartea (segundoak) Temperature bar width Tenperatura-barraren zabalera Temperature scale Tenperaturaren eskala Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Klikatu egoera-barrak tenperatura ere dagoenean Warning about high temperature Tenperatura altuari buruzko abisua Sensors Sentsoreak Detected chips: Detektatutako txipak: Chip features: Txiparen ezaugarriak: Enabled Gaituta Label Etiketa Color Kolorea ================================================ FILE: plugin-sensors/translations/sensors_fi.desktop.yaml ================================================ Desktop Entry/Name: "Sensorit" Desktop Entry/Comment: "Katso laitteistosensorien tuottamia lukuja (tällä hetkellä lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_fi.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensorien asetukset Common Yleistä Update interval (seconds) Päivitysväli (sekunneissa) Temperature bar width Lämpötilapalkin leveys Temperature scale Lämpötila-asteikko Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Välkytä tilapalkkeja kun lämpötila on liian korkea Warning about high temperature Varoitus korkeasta lämpötilasta Sensors Sensorit Detected chips: Tunnistetut piirit: Chip features: Piirin ominaisuudet: Enabled Käytössä Label Nimike Color Väri ================================================ FILE: plugin-sensors/translations/sensors_fr.desktop.yaml ================================================ Desktop Entry/Name: "Capteurs" Desktop Entry/Comment: "Voir les mesures effectuées par les capteurs" ================================================ FILE: plugin-sensors/translations/sensors_fr.ts ================================================ LXQtSensorsConfiguration Sensors Settings Paramétrages des capteurs Common Commun Update interval (seconds) Intervalle de mise à jour (secondes) Temperature bar width Largeur de la barre de température Temperature scale Échelle de température Celsius °C Fahrenheit °F Blink status bars when the temperature is too high Barres d’état clignotantes lorsque la température est trop élevée Warning about high temperature Signaler une température trop élevée Sensors Capteurs Detected chips: Puces détectées : Chip features: Caractéristiques de la puce : Enabled Activé Label Nom Color Couleur ================================================ FILE: plugin-sensors/translations/sensors_gl.ts ================================================ LXQtSensorsConfiguration Sensors Settings Axustes dos sensores Common Común Update interval (seconds) Intervalo de actualización (segundos) Temperature bar width Largura da barra de temperaturas Temperature scale Escala de temperaturas Celsius Fahrenheit Blink status bars when the temperature is too high As barras de estado escintilan cando a temperatura é demasiado alta Warning about high temperature Avisar cando a temperatura sexa elevada Sensors Sensores Detected chips: Chips detectados: Chip features: Funcionalidades do chip: Enabled Activado Label Etiqueta Color Cor ================================================ FILE: plugin-sensors/translations/sensors_he.desktop.yaml ================================================ Desktop Entry/Name: "חיישנים" Desktop Entry/Comment: "הצגת קריאות מחיישני חומרה" ================================================ FILE: plugin-sensors/translations/sensors_he.ts ================================================ LXQtSensorsConfiguration Sensors Settings הגדרות חיישנים Common משותף Update interval (seconds) מרווח בין עדכונים (שניות) Temperature bar width רוחב סרגל מעלות Temperature scale סולם מעלות Celsius צלזיוס Fahrenheit פרנהייט Blink status bars when the temperature is too high להבהב את שורות המצב כשהטמפרטורה גבוהה מדי Warning about high temperature אזהרה על מעלות גבוהות Sensors חיישנים Detected chips: שבבים שהתגלו: Chip features: תכונות שבב: Enabled מופעל Label תווית Color צבע ================================================ FILE: plugin-sensors/translations/sensors_hr.desktop.yaml ================================================ Desktop Entry/Name: "Senzori" Desktop Entry/Comment: "Prikaz stanja uređaja" ================================================ FILE: plugin-sensors/translations/sensors_hr.ts ================================================ LXQtSensorsConfiguration Sensors Settings Senzori – Postavke Common Uobičajene Update interval (seconds) Interval aktualiziranja (sekunde) Temperature bar width Duljina trake temperature Temperature scale Temperaturna ljestvica Celsius Celzijeva Fahrenheit Fahrenheitova Blink status bars when the temperature is too high Traka stanja treperi kad je temperatura previsoka Warning about high temperature Upozori na visoku temperaturu Sensors Senzori Detected chips: Nađeni čipovi: Chip features: Funkcije čipova: Enabled Aktivirano Label Oznaka Color Boja ================================================ FILE: plugin-sensors/translations/sensors_hu.desktop.yaml ================================================ Desktop Entry/Name: "Érzékelők" Desktop Entry/Comment: "Megjeleníti a gépbe épített érzékelők értékeit" ================================================ FILE: plugin-sensors/translations/sensors_hu.ts ================================================ LXQtSensorsConfiguration Sensors Settings Érzékelők beállítása Common Általános Update interval (seconds) Frissítési időköz (másodperc) Temperature bar width Sáv szélessége Temperature scale Mértékegység Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Villogjon az állapotsáv, ha a hőmérséklet túl magas Warning about high temperature Magas hőfoknál figyelmeztetés Sensors Érzékelők Detected chips: Észlelt érzékelők: Chip features: Érzékelő jellemzői: Enabled Engedélyezve Label Felirat Color Szín ================================================ FILE: plugin-sensors/translations/sensors_id.ts ================================================ LXQtSensorsConfiguration Sensors Settings Pengaturan Sensor Common Umum Update interval (seconds) Interval pembaruan (detik) Temperature bar width Lebar bilah suhu Temperature scale Skala suhu Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Kedip status bar apabila suhunya terlalu tinggi Warning about high temperature Peringatan tentang suhu tinggi Sensors Sensor Detected chips: Chip Terdeteksi: Chip features: Fitur chip: Enabled Diaktifkan Label Label Color Warna ================================================ FILE: plugin-sensors/translations/sensors_is.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_it.desktop.yaml ================================================ Desktop Entry/Name: "Sensori" Desktop Entry/Comment: "Visualizza i valori rilevati dai sensori hardware (attualmente lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_it.ts ================================================ LXQtSensorsConfiguration Sensors Settings Impostazioni sensori Common Generali Update interval (seconds) Intervallo di aggiornamento (secondi) Temperature bar width Larghezza della barra della temperatura Temperature scale Scala della temperatura Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Fai lampeggiare le barre di stato quando la temperatura è troppo alta Warning about high temperature Avvertimento per la temperatura elevata Sensors Sensori Detected chips: Chip rilevati: Chip features: Caratteristiche del chip: Enabled Attivato Label Etichetta Color Colore ================================================ FILE: plugin-sensors/translations/sensors_ja.desktop.yaml ================================================ Desktop Entry/Name: "センサー" Desktop Entry/Comment: "ハードウェアセンサー(温度など)からの測定値を表示します" ================================================ FILE: plugin-sensors/translations/sensors_ja.ts ================================================ LXQtSensorsConfiguration Sensors Settings センサーの設定 Common 共通 Update interval (seconds) 更新間隔(秒) Temperature bar width 温度バーの幅 Temperature scale 温度の単位 Celsius 摂氏 (℃) Fahrenheit 華氏 (℉) Blink status bars when the temperature is too high 温度が高すぎる時にステータスバーを点滅します Warning about high temperature 高温時に警告する Sensors センサー Detected chips: 検出されたチップ: Chip features: チップの機能: Enabled 有効 Label ラベル Color ================================================ FILE: plugin-sensors/translations/sensors_ka.desktop.yaml ================================================ Desktop Entry/Name: "სენსორები" Desktop Entry/Comment: "იხილეთ მონაცემები აპარატურული სენსორებიდან" ================================================ FILE: plugin-sensors/translations/sensors_ka.ts ================================================ LXQtSensorsConfiguration Sensors Settings სენსორების მორგება Common საერთო Update interval (seconds) განახლების ინტერვალი (წამი) Temperature bar width ტემპერატურის ზოლის სიგანე Temperature scale ტემპერატურის შკალა Celsius ცელსიუსი Fahrenheit ფარენჰეიტი Blink status bars when the temperature is too high სტატუსის პანელების ციმციმი, როცა ტემპერატურა ძალიან მაღალია Warning about high temperature გაფრთხილება მაღალი ტემპერატურის შესახებ Sensors სენსორები Detected chips: აღმოჩენილი სენსორები: Chip features: სენსორის თვისებები: Enabled ჩართულია Label ჭდე Color ფერი ================================================ FILE: plugin-sensors/translations/sensors_kab.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius °C Fahrenheit °F Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Tabzimt Color Ini ================================================ FILE: plugin-sensors/translations/sensors_kk.desktop.yaml ================================================ Desktop Entry/Name: "Сенсорлар" Desktop Entry/Comment: "Құрылғылық сенсорлардың деректерін қарау" ================================================ FILE: plugin-sensors/translations/sensors_kk.ts ================================================ LXQtSensorsConfiguration Sensors Settings Сенсорлар баптаулары Common Жалпы Update interval (seconds) Жаңарту аралығы (секунд) Temperature bar width Температура жолағының ені Temperature scale Температура шкаласы Celsius Цельсий Fahrenheit Фаренгейт Blink status bars when the temperature is too high Температура тым жоғары болғанда күй жолақтарын жыпылықтату Warning about high temperature Жоғары температура туралы ескерту Sensors Сенсорлар Detected chips: Табылған чиптер: Chip features: Чип мүмкіндіктері: Enabled Іске қосылған Label Белгі Color Түс ================================================ FILE: plugin-sensors/translations/sensors_ko.desktop.yaml ================================================ Desktop Entry/Name: "센서" Desktop Entry/Comment: "하드웨어 센서에서 판독값을 봅니다" ================================================ FILE: plugin-sensors/translations/sensors_ko.ts ================================================ LXQtSensorsConfiguration Sensors Settings 센서 설정 Common 공용 Update interval (seconds) 업데이트 간격(초) Temperature bar width 온도 막대 폭 Temperature scale 온도 눈금 Celsius 섭씨 Fahrenheit 화씨 Blink status bars when the temperature is too high 온도가 너무 높으면 상태 표시줄 깜박임 Warning about high temperature 고온에 대한 경고 Sensors 센서 Detected chips: 감지된 칩: Chip features: 칩 기능: Enabled 활성화됨 Label 레이블 Color 색상 ================================================ FILE: plugin-sensors/translations/sensors_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ebirabiriza" Desktop Entry/Comment: "Kano kalaga obubaka obuva ku birabiriza byuma ebitalibimu ebya kompyuta" ================================================ FILE: plugin-sensors/translations/sensors_lg.ts ================================================ LXQtSensorsConfiguration Sensors Settings Entekateeka z'ebirabiriza Common Eby'awamu Update interval (seconds) Bwangu bw'okukebera obubaka (sikonda) Temperature bar width Bugazi bw'enkumbo za buli kikebedwa Temperature scale Ebipimo by'ebbugumu Celsius °C Fahrenheit °F Blink status bars when the temperature is too high Okulabula akatundu katandika okutemya Warning about high temperature Ebbugumu bwe liyitirira wabewo okulabula Sensors Ebirabiriza Detected chips: Ebirabiriza ebizuulidwa ku sisitemu: Chip features: Ebifa ku birabiriza ebizuulidwa: Enabled Kiwulirizibwa Label Linnya Color Langi y'olukumbo ================================================ FILE: plugin-sensors/translations/sensors_lt.desktop.yaml ================================================ Desktop Entry/Name: "Jutikliai" Desktop Entry/Comment: "Rodo aparatinės įrangos jutiklių duomenis" ================================================ FILE: plugin-sensors/translations/sensors_lt.ts ================================================ LXQtSensorsConfiguration Sensors Settings Jutiklių nustatymai Common Bendra Update interval (seconds) Atnaujinimo intervalas (sek.) Temperature bar width Temperatūros juostos plotis Temperature scale Temperatūros skalė Celsius Celsijus Fahrenheit Farenheitas Blink status bars when the temperature is too high Mirksėti būsenos juostomis, kai tempertūra yra per aukšta Warning about high temperature Įspėti apie aukštą temperatūrą Sensors Jutikliai Detected chips: Aptikti lustai: Chip features: Lusto ypatybės: Enabled Įjungta Label Etiketė Color Spalva ================================================ FILE: plugin-sensors/translations/sensors_lv.desktop.yaml ================================================ Desktop Entry/Name: "Sensori" Desktop Entry/Comment: "Skatīt aparatūras sensoru rādījumus" ================================================ FILE: plugin-sensors/translations/sensors_lv.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensoru iestatījumi Common Kopējie Update interval (seconds) Atsvaidzināšanas intervāls (sekundes) Temperature bar width Temperatūras stabiņa platums Temperature scale Temperatūras skala Celsius Celsija Fahrenheit Fārenheita Blink status bars when the temperature is too high Statusa stabiņus/joslas mirgot/mirkšķināt, kad temperatūra pārāk augsta Warning about high temperature Brīdinājums par augstu temperatūru Sensors Sensori Detected chips: Identificētie čipi: Chip features: Čipu iespējas: Enabled Iespējots/ieslēgts Label Birka/etiķete Color Krāsa ================================================ FILE: plugin-sensors/translations/sensors_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Sensorer" Desktop Entry/Comment: "Viser målinger fra maskinvaresensorer" ================================================ FILE: plugin-sensors/translations/sensors_nb_NO.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensorinnstillinger Common Felles Update interval (seconds) Oppdateringsintervall (sekunder) Temperature bar width Temperaturindikatorens bredde Temperature scale Temperaturskala Celsius Fahrenheit Blink status bars when the temperature is too high Blinkende statuslinjer når temperaturen er for høy Warning about high temperature Advarsel ved høy temperatur Sensors Sensorer Detected chips: Oppdagede kretser: Chip features: Kretsers egenskaper: Enabled Label Etikett Color Farge ================================================ FILE: plugin-sensors/translations/sensors_nl.desktop.yaml ================================================ Desktop Entry/Name: "Sensoren" Desktop Entry/Comment: "Bekijk metingen van hardwaresensoren" ================================================ FILE: plugin-sensors/translations/sensors_nl.ts ================================================ LXQtSensorsConfiguration Sensors Settings Sensoren-instellingen Common Algemeen Update interval (seconds) Bijwerktussenpoos (in seconden) Temperature bar width Breedte van temperatuurbalk Temperature scale Temperatuurschaal Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Statusbalk laten knipperen als de temperatuur te hoog is Warning about high temperature Waarschuwing bij hoge temperatuur Sensors Sensoren Detected chips: Gedetecteerde chips: Chip features: Chipeigenschappen: Enabled Ingeschakeld Label Label Color Kleur ================================================ FILE: plugin-sensors/translations/sensors_oc.ts ================================================ LXQtSensorsConfiguration Sensors Settings Paramètres dels captadors Common Comun Update interval (seconds) Interval de mesa a jorn (segondas) Temperature bar width Largor de la barra de temperatura Temperature scale Escala de temperatura Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Barras d’estat que parpelejant quand la temperatura es tròp elevada Warning about high temperature Avertir d’una temperatura tròp elevada Sensors Captadors Detected chips: Piuses detectadas : Chip features: Caracteristicas de la piuse : Enabled Activat Label Etiqueta Color Color ================================================ FILE: plugin-sensors/translations/sensors_pa.ts ================================================ LXQtSensorsConfiguration Sensors Settings ਸੈਂਸਰ ਸੈਟਿੰਗਾਂ Common ਆਮ Update interval (seconds) ਅੱਪਡੇਟ ਦਾ ਅੰਤਰਾਲ (ਸਕਿੰਟ) Temperature bar width ਤਾਪਮਾਨ ਪੱਟੀ ਦੀ ਚੌੜਾਈ Temperature scale ਤਾਪਮਾਨ ਸਕੇਲ Celsius ਸੈਲਸੀਅਸ Fahrenheit ਫਾਹਰਨਹੀਟ Blink status bars when the temperature is too high ਜੇ ਤਾਪਮਾਨ ਬਹੁਤ ਜਿਆਦਾ ਹੋੇ ਤਾਂ ਸਥਿਤੀ ਪੱਟੀ ਨੂੰ ਝਪਕਾਓ Warning about high temperature ਵੱਧ ਤਾਪਮਾਨ ਬਾਰੇ ਸਾਵਧਾਨ Sensors ਸੈਂਸਰ Detected chips: ਖੋਜੀਆਂ ਚਿੱਪਾਂ: Chip features: ਚਿੱਪ ਦੇ ਫੀਚਰ: Enabled ਸਮਰੱਥ ਹੈ Label ਲੇਬਲ Color ਰੰਗ ================================================ FILE: plugin-sensors/translations/sensors_pl.desktop.yaml ================================================ Desktop Entry/Name: "Czujniki" Desktop Entry/Comment: "Wyświetla wskazania z czujników sprzętowych" ================================================ FILE: plugin-sensors/translations/sensors_pl.ts ================================================ LXQtSensorsConfiguration Sensors Settings Ustawienia czujników Common Ogólne Update interval (seconds) Częstotliwość odświeżania (sekundy) Temperature bar width Szerokość paska stanu temperatury Temperature scale Skala temperatury Celsius Celsjusz Fahrenheit Fahrenheit Blink status bars when the temperature is too high Migaj paskiem stanu, jeżeli temperatura jest zbyt wysoka Warning about high temperature Ostrzeżenie o wysokiej temperaturze Sensors Czujniki Detected chips: Wykryte chipy: Chip features: Cechy chipu: Enabled Włączone Label Etykieta Color Kolor ================================================ FILE: plugin-sensors/translations/sensors_pt.desktop.yaml ================================================ Desktop Entry/Name: "Sensores" Desktop Entry/Comment: "Consultar as leituras dos sensores" ================================================ FILE: plugin-sensors/translations/sensors_pt.ts ================================================ LXQtSensorsConfiguration Sensors Settings Definições de sensores Common Geral Update interval (seconds) Intervalo de atualização (segundos) Temperature bar width Largura da barra de temperatura Temperature scale Unidade de medida Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Barra de estado intermitente se a temperatura for muito alta Warning about high temperature Avisar se a temperatura for alta Sensors Sensores Detected chips: Circuitos detetados: Chip features: Funcionalidades do circuito: Enabled Ativo Label Texto Color Cor ================================================ FILE: plugin-sensors/translations/sensors_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Sensores" Desktop Entry/Comment: "Visualizar as leituras dos sensores de hardware (atualmente do lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_pt_BR.ts ================================================ LXQtSensorsConfiguration Sensors Settings Configurações dos sensores Common Comum Update interval (seconds) Intervalo de atualização (segundos) Temperature bar width Largura da barra de temperatura Temperature scale Escala de temperatura Celsius Celso Fahrenheit Blink status bars when the temperature is too high Piscar barra de status quando a temperatura está muito alta Warning about high temperature Aviso sobre alta temperatura Sensors Sensores Detected chips: Chips detectados: Chip features: Características do chips: Enabled Habilitado Label Rótulo Color Cor ================================================ FILE: plugin-sensors/translations/sensors_ro.desktop.yaml ================================================ Desktop Entry/Name: "Senzori" Desktop Entry/Comment: "Vizualizează citirile senzorilor hardware (momentan lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_ro_RO.ts ================================================ LXQtSensorsConfiguration Sensors Settings Setări pentru Senzori Common Comun Update interval (seconds) Interval de actualizare (secunde) Temperature bar width Lățimea barei de temperaturi Temperature scale Scara de temperatura Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Avertizare pentru temperaturi înalte Sensors Senzori Detected chips: Cipuri detectate: Chip features: Caracteristici cip: Enabled Activat Label Etichetă Color Culoare ================================================ FILE: plugin-sensors/translations/sensors_ru.desktop.yaml ================================================ Desktop Entry/Name: "Сенсоры" Desktop Entry/Comment: "Посмотреть данные с аппаратных сенсоров" ================================================ FILE: plugin-sensors/translations/sensors_ru.ts ================================================ LXQtSensorsConfiguration Sensors Settings Настройки сенсоров Common Общие Update interval (seconds) Период обновления (секунды) Temperature bar width Ширина температурной шкалы Temperature scale Температурная шкала Celsius По Цельсию Fahrenheit По Фаренгейту Blink status bars when the temperature is too high Мигать индикатором состояния при слишком высокой температуре Warning about high temperature Предупреждать о высокой температуре Sensors Сенсоры Detected chips: Обнаруженые чипы: Chip features: Возможности чипов: Enabled Включён Label Метка Color Цвет ================================================ FILE: plugin-sensors/translations/sensors_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-sensors/translations/sensors_si.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common Update interval (seconds) Temperature bar width Temperature scale Celsius Fahrenheit Blink status bars when the temperature is too high Warning about high temperature Sensors Detected chips: Chip features: Enabled Label Color ================================================ FILE: plugin-sensors/translations/sensors_sk.desktop.yaml ================================================ Desktop Entry/Name: "Senzory" Desktop Entry/Comment: "Zobrazuje hodnoty z hardvérových senzorov" ================================================ FILE: plugin-sensors/translations/sensors_sk_SK.ts ================================================ LXQtSensorsConfiguration Sensors Settings Nastavenie senzorov Common Spoločné Update interval (seconds) Interval obnovovania (v sekundách) Temperature bar width Šírka prúžku s teplotou Temperature scale Stupnica teploty Celsius Celzius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Pri príliš vysokej teplote signalizovať blikaním Warning about high temperature Varovanie pri vysokej teplote Sensors Senzory Detected chips: Zistené čipy: Chip features: Funkcia čipov: Enabled Aktivované Label Štítok Color Farba ================================================ FILE: plugin-sensors/translations/sensors_sl.desktop.yaml ================================================ Desktop Entry/Name: "Senzorji" Desktop Entry/Comment: "Oglejte si meritve senzorjev za strojno opremo (trenutno lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_sr.ts ================================================ LXQtSensorsConfiguration Sensors Settings Подешавања сензора Common Типични Update interval (seconds) Ажурирај интервал (секунде) Temperature bar width Ширина температурне траке Temperature scale Температурна скала Celsius Целзијус Fahrenheit Фаренхајт Blink status bars when the temperature is too high Трепћуће статусне траке када је температура превисока Warning about high temperature Упозорење о високој температури Sensors Сензори Detected chips: Детектовани чипови: Chip features: Карактеристике чипа: Enabled Омогућено Label Ознака Color Боја ================================================ FILE: plugin-sensors/translations/sensors_sv.desktop.yaml ================================================ Desktop Entry/Name: "Sensorer" Desktop Entry/Comment: "Visa avläsningar från maskinsensorer" ================================================ FILE: plugin-sensors/translations/sensors_sv.ts ================================================ LXQtSensorsConfiguration Sensors Settings Hanterar sensorer Common Allmänt Update interval (seconds) Uppdateringsfrekvens (sek) Temperature bar width Temperaturfältets bredd Temperature scale Temperaturskala Celsius Celsius Fahrenheit Fahrenheit Blink status bars when the temperature is too high Programmets statusindikator blinkar när temperaturen blir för hög Warning about high temperature Varna vid hög temperatur Sensors Sensorer Detected chips: Funna chippar: Chip features: Egenskaper: Enabled Aktiv Label Etikett Color Färg ================================================ FILE: plugin-sensors/translations/sensors_th.desktop.yaml ================================================ Desktop Entry/Name: "ตัวตรวจจับ" Desktop Entry/Comment: "ดูข้อมูลที่ตัวตรวจจับฮาร์ดแวร์อ่านได้ (lm_sensors โดยปัจจุบัน)" ================================================ FILE: plugin-sensors/translations/sensors_th_TH.ts ================================================ LXQtSensorsConfiguration Sensors Settings Common ทั่วไป Update interval (seconds) ทิ้งระยะการปรับข้อมูล (วินาที) Temperature bar width ความกว้างแถบแสดงอุณหภูมิ Temperature scale หน่วยของอุณหภูมิ Celsius เซลเซียส Fahrenheit ฟาห์เรนไฮต์ Blink status bars when the temperature is too high Warning about high temperature การเตือนเกี่ยวกับอุณภูมิที่สูงเกินไป Sensors ตัวตรวจจับ Detected chips: ชิปที่พบ: Chip features: คุณสมบัติชิป: Enabled เปิดใช้ Label ป้าย Color สี ================================================ FILE: plugin-sensors/translations/sensors_tr.desktop.yaml ================================================ Desktop Entry/Name: "Algılayıcılar" Desktop Entry/Comment: "Donanım algılayıcılarının okudukları değerleri görüntüleyin (şimdilik lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_tr.ts ================================================ LXQtSensorsConfiguration Sensors Settings Algılayıcı Ayarları Common Genel Update interval (seconds) Güncelleme aralığı (saniye) Temperature bar width Isı çubuğu genişliği Temperature scale Isı Ölçeği Celsius Santigrat Fahrenheit Fahrenayt Blink status bars when the temperature is too high Sıcaklık çok yüksek olduğunda durum çubukları yanıp söner Warning about high temperature Yüksek ısı uyarısı Sensors Algılayıcılar Detected chips: Algılanan çip: Chip features: Çip özellikleri: Enabled Etkin Label Etiket Color Renk ================================================ FILE: plugin-sensors/translations/sensors_uk.desktop.yaml ================================================ Desktop Entry/Name: "Сенсори" Desktop Entry/Comment: "Показати дані апаратних сенсорів (lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_uk.ts ================================================ LXQtSensorsConfiguration Sensors Settings Налаштування сенсорів Common Загальне Update interval (seconds) Період поновлення (в секундах) Temperature bar width Ширина планки температури Temperature scale Шкала температури Celsius Цельсія Fahrenheit Фаренгейта Blink status bars when the temperature is too high Мигтіти панелями стану, коли температура зависока Warning about high temperature Попереджати про високу температуру Sensors Сенсори Detected chips: Виявлені чіпи: Chip features: Особливості мікросхеми: Enabled Включено Label Мітка Color Колір ================================================ FILE: plugin-sensors/translations/sensors_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "传感器" Desktop Entry/Comment: "查看硬件传感器数据(当前是 lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_zh_CN.ts ================================================ LXQtSensorsConfiguration Sensors Settings 传感器设置 Common 常规 Update interval (seconds) 更新间隔(秒) Temperature bar width 温度条宽度 Temperature scale 温标 Celsius 摄氏度 Fahrenheit 华氏度 Blink status bars when the temperature is too high 当温度过高时闪烁状态栏 Warning about high temperature 高温警告 Sensors 传感器 Detected chips: 检测到的芯片: Chip features: 芯片功能: Enabled 已启用 Label 标注 Color 颜色 ================================================ FILE: plugin-sensors/translations/sensors_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "感應器" Desktop Entry/Comment: "從硬體感應器中檢視(現在為 lm_sensors)" ================================================ FILE: plugin-sensors/translations/sensors_zh_TW.ts ================================================ LXQtSensorsConfiguration Sensors Settings 感應器設定 Common 常規 Update interval (seconds) 更新間隔(秒) Temperature bar width 溫度計寬度 Temperature scale 溫標 Celsius 攝氏 Fahrenheit 華式 Blink status bars when the temperature is too high 當溫度過高時閃爍狀態欄 Warning about high temperature 高溫警告 Sensors 感應器 Detected chips: 偵測晶片: Chip features: 晶片資訊: Enabled 允許 Label 標籤 Color 顏色 ================================================ FILE: plugin-showdesktop/CMakeLists.txt ================================================ set(PLUGIN "showdesktop") set(HEADERS showdesktop.h ) set(SOURCES showdesktop.cpp ) set(LIBRARIES ${LIBRARIES} lxqt-globalkeys Qt6Xdg ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-showdesktop/resources/showdesktop.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=user-desktop #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-showdesktop/showdesktop.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include #include #include "showdesktop.h" #include "../panel/pluginsettings.h" #include "../panel/lxqtpanelapplication.h" #include "../panel/backends/ilxqtabstractwmiface.h" #define DEFAULT_SHORTCUT "Control+Alt+D" ShowDesktop::ShowDesktop(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo) { m_key = GlobalKeyShortcut::Client::instance()->addAction(QString(), QStringLiteral("/panel/%1/show_hide").arg(settings()->group()), tr("Show desktop"), this); if (m_key) { connect(m_key, &GlobalKeyShortcut::Action::registrationFinished, this, &ShowDesktop::shortcutRegistered); connect(m_key, &GlobalKeyShortcut::Action::activated, this, &ShowDesktop::toggleShowingDesktop); } QAction * act = new QAction(XdgIcon::fromTheme(QStringLiteral("user-desktop")), tr("Show Desktop"), this); connect(act, &QAction::triggered, this, &ShowDesktop::toggleShowingDesktop); mDNDTimer.setSingleShot(true); connect(&mDNDTimer, &QTimer::timeout, this, &ShowDesktop::toggleShowingDesktop, Qt::QueuedConnection); mDNDTimer.setInterval(700); mButton.setDefaultAction(act); mButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mButton.setAutoRaise(true); mButton.installEventFilter(this); mButton.setAcceptDrops(true); } bool ShowDesktop::eventFilter(QObject * watched, QEvent * event) { if (watched == &mButton) { if (event->type() == QEvent::DragEnter) { mDNDTimer.start(); } else if (event->type() == QEvent::DragLeave) { mDNDTimer.stop(); } return false; } return QObject::eventFilter(watched, event); } void ShowDesktop::shortcutRegistered() { if (m_key->shortcut().isEmpty()) { m_key->changeShortcut(QStringLiteral(DEFAULT_SHORTCUT)); if (m_key->shortcut().isEmpty()) { LXQt::Notification::notify(tr("Show Desktop: Global shortcut '%1' cannot be registered").arg(QStringLiteral(DEFAULT_SHORTCUT))); } } } void ShowDesktop::toggleShowingDesktop() { LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a->getWMBackend(); wmBackend->showDesktop(!wmBackend->isShowingDesktop()); } #undef DEFAULT_SHORTCUT ================================================ FILE: plugin-showdesktop/showdesktop.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Petr Vanek * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SHOWDESKTOP_H #define SHOWDESKTOP_H #include "../panel/ilxqtpanelplugin.h" #include #include namespace GlobalKeyShortcut { class Action; } class ShowDesktop : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: ShowDesktop(const ILXQtPanelPluginStartupInfo &startupInfo); virtual QWidget *widget() override { return &mButton; } virtual QString themeId() const override { return QStringLiteral("ShowDesktop"); } virtual bool eventFilter(QObject * watched, QEvent * event) override; private: GlobalKeyShortcut::Action * m_key; private slots: void toggleShowingDesktop(); void shortcutRegistered(); private: QTimer mDNDTimer; QToolButton mButton; }; class ShowDesktopLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new ShowDesktop(startupInfo); } }; #endif ================================================ FILE: plugin-showdesktop/translations/showdesktop.desktop.yaml ================================================ Desktop Entry/Name: "Show Desktop" Desktop Entry/Comment: "Minimize all windows and show the desktop" ================================================ FILE: plugin-showdesktop/translations/showdesktop.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_ar.desktop.yaml ================================================ Desktop Entry/Name: "أظهر سطح المكتب" Desktop Entry/Comment: "تصغّر كلّ النّوافذ وتُظهر سطح المكتب" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ar.ts ================================================ ShowDesktop Show desktop اعرض سطح المكتب Show Desktop: Global shortcut '%1' cannot be registered عرض سطح المكتب: تعذر تسجيل الاختصار العمومي ”%1“ Show Desktop اعرض سطح المكتب ================================================ FILE: plugin-showdesktop/translations/showdesktop_arn.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_ast.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_bg.desktop.yaml ================================================ Desktop Entry/Name: "Показване на работния плот" Desktop Entry/Comment: "Минимизиране на всички прозорци и показване на работния плот" ================================================ FILE: plugin-showdesktop/translations/showdesktop_bg.ts ================================================ ShowDesktop Show desktop Показване на работния плот Show Desktop: Global shortcut '%1' cannot be registered Клавишните комбинации '%1' не могат да бъдат регистрирани Show Desktop Показване на работния плот ================================================ FILE: plugin-showdesktop/translations/showdesktop_ca.desktop.yaml ================================================ Desktop Entry/Name: "Mostra l'escriptori" Desktop Entry/Comment: "Minimitza totes les finestres i mostra l'escriptori" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ca.ts ================================================ ShowDesktop Show desktop Mostra l'escriptori Show Desktop: Global shortcut '%1' cannot be registered Mostra l'escriptori: La drecera global '%1' no es pot registrar Show Desktop Mostra l'escriptori ================================================ FILE: plugin-showdesktop/translations/showdesktop_cs.desktop.yaml ================================================ Desktop Entry/Name: "Ukázat plochu" Desktop Entry/Comment: "Minimalizovat všechna okna a ukázat plochu" ================================================ FILE: plugin-showdesktop/translations/showdesktop_cs.ts ================================================ ShowDesktop Show desktop Ukázat plochu Show Desktop: Global shortcut '%1' cannot be registered Ukázat plochu: Globální zkratku „%1“ nelze zaregistrovat Show Desktop Ukázat plochu ================================================ FILE: plugin-showdesktop/translations/showdesktop_cy.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_da.desktop.yaml ================================================ Desktop Entry/Name: "Vis skrivebord" Desktop Entry/Comment: "Minimer alle vinduer og vis skrivebordet" ================================================ FILE: plugin-showdesktop/translations/showdesktop_da.ts ================================================ ShowDesktop Show desktop Vis skrivebord Show Desktop: Global shortcut '%1' cannot be registered Vis skrivebord: Den global genvej '%1' kan ikke registreres Show Desktop Vis skrivebord ================================================ FILE: plugin-showdesktop/translations/showdesktop_de.desktop.yaml ================================================ Desktop Entry/Name: "Arbeitsfläche anzeigen" Desktop Entry/Comment: "Alle Fenster minimieren und die Arbeitsfläche anzeigen" ================================================ FILE: plugin-showdesktop/translations/showdesktop_de.ts ================================================ ShowDesktop Show desktop Arbeitsfläche anzeigen Show Desktop Arbeitsfläche anzeigen Show Desktop: Global shortcut '%1' cannot be registered Arbeitsfläche anzeigen: Globales Tastaturkürzel '%1' kann nicht registriert werden ================================================ FILE: plugin-showdesktop/translations/showdesktop_el.desktop.yaml ================================================ Desktop Entry/Name: "Εμφάνιση επιφάνειας εργασίας" Desktop Entry/Comment: "Ελαχιστοποίηση όλων των παραθύρων και εμφάνιση της επιφάνειας εργασίας" ================================================ FILE: plugin-showdesktop/translations/showdesktop_el.ts ================================================ ShowDesktop Show desktop Εμφάνιση της επιφάνειας εργασίας Show Desktop: Global shortcut '%1' cannot be registered Εμφάνιση της επιφάνειας εργασίας: Δεν είναι δυνατή η καταχώριση της καθολικής συντόμευσης «%1» Show Desktop Εμφάνιση της επιφάνειας εργασίας ================================================ FILE: plugin-showdesktop/translations/showdesktop_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Show Desktop" Desktop Entry/Comment: "Minimise all windows and show the desktop" ================================================ FILE: plugin-showdesktop/translations/showdesktop_en_GB.ts ================================================ ShowDesktop Show desktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop: Global shortcut '%1' cannot be registered Show Desktop Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_eo.desktop.yaml ================================================ Desktop Entry/Name: "Montri labortablon" Desktop Entry/Comment: "Malmaksimigi ĉiujn fenestrojn kaj montri la labortablon" ================================================ FILE: plugin-showdesktop/translations/showdesktop_eo.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Montri labortablon: ĉiea klavkombino '%1' ne registreblas Show Desktop Montri labortablon ================================================ FILE: plugin-showdesktop/translations/showdesktop_es.desktop.yaml ================================================ Desktop Entry/Name: "Mostrar el escritorio" Desktop Entry/Comment: "Minimiza todas las ventanas y muestra el escritorio" ================================================ FILE: plugin-showdesktop/translations/showdesktop_es.ts ================================================ ShowDesktop Show desktop Mostrar el escritorio Show Desktop: Global shortcut '%1' cannot be registered Mostrar el escritorio: El atajo global '%1' no puede ser registrado Show Desktop Mostrar el escritorio ================================================ FILE: plugin-showdesktop/translations/showdesktop_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Mostrar Escritorio" Desktop Entry/Comment: "Minimiza todas las ventanas de todos los escritorios" ================================================ FILE: plugin-showdesktop/translations/showdesktop_es_VE.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Mostrar escritorio: Acceso de teclado global '%1' no puede registrarse Show Desktop Mostrar Escritorio ================================================ FILE: plugin-showdesktop/translations/showdesktop_et.desktop.yaml ================================================ Desktop Entry/Name: "Näita töölauda" Desktop Entry/Comment: "Nupule vajutamine lappab kõik aknad kokku ning näitab töölauda" ================================================ FILE: plugin-showdesktop/translations/showdesktop_et.ts ================================================ ShowDesktop Show desktop Näita töölauda Show Desktop: Global shortcut '%1' cannot be registered Näita töölauda: üldist kiirklahvi „%1“ ei õnnestu salvestada Show Desktop Näita töölauda ================================================ FILE: plugin-showdesktop/translations/showdesktop_eu.desktop.yaml ================================================ Desktop Entry/Name: "Erakutsi mahaigaina" Desktop Entry/Comment: "Minimizatu leiho guztiak eta erakutsi mahaigaina" ================================================ FILE: plugin-showdesktop/translations/showdesktop_eu.ts ================================================ ShowDesktop Show desktop Erakutsi mahaigaina Show Desktop: Global shortcut '%1' cannot be registered Erakutsi mahaigaina: Ezin da '%1' lasterbide globala erregistratu Show Desktop Erakutsi mahaigaina ================================================ FILE: plugin-showdesktop/translations/showdesktop_fi.desktop.yaml ================================================ Desktop Entry/Name: "Näytä työpöytä" Desktop Entry/Comment: "Pienennä kaikki ikkunat ja näytä työpöytä" ================================================ FILE: plugin-showdesktop/translations/showdesktop_fi.ts ================================================ ShowDesktop Show desktop Näytä työpöytä Show Desktop: Global shortcut '%1' cannot be registered Näytä työpöytä: globaalia pikanäppäintä '%1' ei voi rekisteröidä Show Desktop Näytä työpöytä ================================================ FILE: plugin-showdesktop/translations/showdesktop_fr.desktop.yaml ================================================ Desktop Entry/Name: "Montrer le bureau" Desktop Entry/Comment: "Minimiser toutes les fenêtres et montrer le bureau" ================================================ FILE: plugin-showdesktop/translations/showdesktop_fr.ts ================================================ ShowDesktop Show desktop Montrer le bureau Show Desktop: Global shortcut '%1' cannot be registered Montrer le bureau : le raccourci global '%1' ne peut pas être défini Show Desktop Montrer le bureau ================================================ FILE: plugin-showdesktop/translations/showdesktop_gl.ts ================================================ ShowDesktop Show desktop Amosar o escritorio Show Desktop: Global shortcut '%1' cannot be registered Amosar o escritorio: Non é posíbel rexistrar o atallo global «%1» Show Desktop Amosar o escritorio ================================================ FILE: plugin-showdesktop/translations/showdesktop_he.desktop.yaml ================================================ Desktop Entry/Name: "הצגת שולחן עבודה" Desktop Entry/Comment: "מזעור כל החלונות והצגת שולחן העבודה" ================================================ FILE: plugin-showdesktop/translations/showdesktop_he.ts ================================================ ShowDesktop Show desktop הצגת שולחן עבודה Show Desktop: Global shortcut '%1' cannot be registered הצגת שולחן עבודה: לא ניתן לרשום את קיצור הדרך הגלובלי ‚%1’ Show Desktop הצגת שולחן עבודה ================================================ FILE: plugin-showdesktop/translations/showdesktop_hr.desktop.yaml ================================================ Desktop Entry/Name: "Prikaži radnu površinu" Desktop Entry/Comment: "Sakrij sve prozore i prikaži radnu površinu" ================================================ FILE: plugin-showdesktop/translations/showdesktop_hr.ts ================================================ ShowDesktop Show desktop Prikaži radnu površinu Show Desktop: Global shortcut '%1' cannot be registered Prikaži radnu površinu: Nije moguće registrirati globalni prečac „%1” Show Desktop Prikaži radnu površinu ================================================ FILE: plugin-showdesktop/translations/showdesktop_hu.desktop.yaml ================================================ Desktop Entry/Name: "Asztal megjelenítése" Desktop Entry/Comment: "Minimalizálja az összes ablakot és megjeleníti az asztalt" ================================================ FILE: plugin-showdesktop/translations/showdesktop_hu.ts ================================================ ShowDesktop Show desktop Asztal megjelenítése Show Desktop: Global shortcut '%1' cannot be registered Asztal megjelenítése: A(z) '%1' gyorsbillentyű nem beállítható Show Desktop Asztal megjelenítése ================================================ FILE: plugin-showdesktop/translations/showdesktop_ia.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_id.ts ================================================ ShowDesktop Show desktop Tampilkan desktop Show Desktop: Global shortcut '%1' cannot be registered Tampilkan Desktop: Pintasan global '%1' tidak dapat didaftarkan Show Desktop Tampilkan Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_id_ID.desktop.yaml ================================================ Desktop Entry/Name: "Tampilkan Desktop" Desktop Entry/Comment: "Kecilkan seluruh jendela dan tampilkan desktop" ================================================ FILE: plugin-showdesktop/translations/showdesktop_is.ts ================================================ ShowDesktop Show desktop Sýna skjáborð Show Desktop: Global shortcut '%1' cannot be registered Sýna skjáborð: Ekki er hægt að nota '%1' sem almennan lykil Show Desktop Sýna skjáborð ================================================ FILE: plugin-showdesktop/translations/showdesktop_it.desktop.yaml ================================================ Desktop Entry/Name: "Mostra scrivania" Desktop Entry/Comment: "Minimizza tutte le finestre e mostra la scrivania" ================================================ FILE: plugin-showdesktop/translations/showdesktop_it.ts ================================================ ShowDesktop Show desktop Mostra scrivania Show Desktop: Global shortcut '%1' cannot be registered Mostra scrivania: la scorciatoia globale '%1' non può essere registrata Show Desktop Mostra scrivania ================================================ FILE: plugin-showdesktop/translations/showdesktop_ja.desktop.yaml ================================================ Desktop Entry/Name: "デスクトップ表示" Desktop Entry/Comment: "すべてのウィンドウを最小化してデスクトップを表示します" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ja.ts ================================================ ShowDesktop Show desktop デスクトップの表示 Show Desktop: Global shortcut '%1' cannot be registered デスクトップの表示: グローバルなショートカット '%1' は登録できません Show Desktop デスクトップを表示します ================================================ FILE: plugin-showdesktop/translations/showdesktop_ka.desktop.yaml ================================================ Desktop Entry/Name: "სამუშაო მაგიდის ჩვენება" Desktop Entry/Comment: "ყველა ფანჯრის ჩაკეცვა და სამუშაო მაგიდის ჩვენება" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ka.ts ================================================ ShowDesktop Show desktop სამუშაო მაგიდის ჩვენება Show Desktop: Global shortcut '%1' cannot be registered სამუშაო მაგიდის ჩვენება: გლობალური მალსახმობის '%1' რეგისტრაცია შეუძლებელია Show Desktop სამუშაო მაგიდის ჩვენება ================================================ FILE: plugin-showdesktop/translations/showdesktop_kab.ts ================================================ ShowDesktop Show desktop Sken-d tanarit Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_kk.desktop.yaml ================================================ Desktop Entry/Name: "Жұмыс үстелін көрсету" Desktop Entry/Comment: "Барлық терезелерді қайырып, жұмыс үстелін көрсету" ================================================ FILE: plugin-showdesktop/translations/showdesktop_kk.ts ================================================ ShowDesktop Show desktop Жұмыс үстелін көрсету Show Desktop: Global shortcut '%1' cannot be registered Жұмыс үстелін көрсету: '%1' глобалды пернетақта жарлығын тіркеу мүмкін емес Show Desktop Жұмыс үстелін көрсету ================================================ FILE: plugin-showdesktop/translations/showdesktop_ko.desktop.yaml ================================================ Desktop Entry/Name: "바탕화면 표시" Desktop Entry/Comment: "모든 창을 최소화하고 바탕 화면을 표시합니다" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ko.ts ================================================ ShowDesktop Show desktop 바탕화면 표시 Show Desktop: Global shortcut '%1' cannot be registered 바탕화면 표시: '%1' 전역 단축키를 등록할 수 없습니다 Show Desktop 바탕화면 표시 ================================================ FILE: plugin-showdesktop/translations/showdesktop_lg.desktop.yaml ================================================ Desktop Entry/Name: "Yerula awakolerwa" Desktop Entry/Comment: "Kano kakisa n'okukomyawo amadirisa gonna agabeera galabika\ \ awakolerwa" ================================================ FILE: plugin-showdesktop/translations/showdesktop_lg.ts ================================================ ShowDesktop Show desktop Yerula awakolerwa Show Desktop: Global shortcut '%1' cannot be registered Yerula awakolerwa: Tekisibose okutegeka mapeesa agagonza emirimu '%1' Show Desktop Yerula Awakolerwa ================================================ FILE: plugin-showdesktop/translations/showdesktop_lt.desktop.yaml ================================================ Desktop Entry/Name: "Darbalaukio rodymas" Desktop Entry/Comment: "Suskleidžia visus langus ir rodo darbalaukį" ================================================ FILE: plugin-showdesktop/translations/showdesktop_lt.ts ================================================ ShowDesktop Show desktop Rodyti darbalaukį Show Desktop: Global shortcut '%1' cannot be registered Rodyti darbalaukį: Visuotinis spartusis klavišas „%1“ negali būti užregistruotas Show Desktop Rodyti darbalaukį ================================================ FILE: plugin-showdesktop/translations/showdesktop_lv.desktop.yaml ================================================ Desktop Entry/Name: "Parādīt darbvirsmu" Desktop Entry/Comment: "Minimizēt visus logus un parādīt darbvirsmu" ================================================ FILE: plugin-showdesktop/translations/showdesktop_lv.ts ================================================ ShowDesktop Show desktop Parādīt darbvirsmu Show Desktop: Global shortcut '%1' cannot be registered Rādīt darbvirsmu: globālā saīsne '%1 ' nevar tikt reģistrēta Show Desktop Parādīt darbvirsmu ================================================ FILE: plugin-showdesktop/translations/showdesktop_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Vis skrivebordet" Desktop Entry/Comment: "Minimer alle vinduer og vis skrivebordet" ================================================ FILE: plugin-showdesktop/translations/showdesktop_nb_NO.ts ================================================ ShowDesktop Show desktop Vis skrivebord Show Desktop: Global shortcut '%1' cannot be registered Vis skrivebord: Global tastatursnarvei '%1' kan ikke registreres Show Desktop Vis skrivebord ================================================ FILE: plugin-showdesktop/translations/showdesktop_nl.desktop.yaml ================================================ Desktop Entry/Name: "Bureaublad tonen" Desktop Entry/Comment: "Minimaliseer alle vensters en toon het bureaublad" ================================================ FILE: plugin-showdesktop/translations/showdesktop_nl.ts ================================================ ShowDesktop Show desktop Bureaublad tonen Show Desktop: Global shortcut '%1' cannot be registered Bureaublad tonen: de algemene sneltoets '%1' kan niet worden vastgelegd Show Desktop Bureaublad tonen ================================================ FILE: plugin-showdesktop/translations/showdesktop_oc.desktop.yaml ================================================ Desktop Entry/Name: "Mostrar lo burèu" Desktop Entry/Comment: "Minimizar totas las fenèstras e mostrar lo burèu" ================================================ FILE: plugin-showdesktop/translations/showdesktop_oc.ts ================================================ ShowDesktop Show desktop Mostrar lo burèu Show Desktop: Global shortcut '%1' cannot be registered Mostrar lo burèu : l’acorchi global « %1 » se podiá pas enregistrar Show Desktop Mostrar lo burèu ================================================ FILE: plugin-showdesktop/translations/showdesktop_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਡੈਸਕਟਾਪ ਵੇਖਾਓ" Desktop Entry/Comment: "ਸਾਰੀਆਂ ਵਿੰਡੋ ਘੱਟੋ-ਘੱਟ ਕਰੋ ਅਤੇ ਡੈਸਕਟਾਪ ਵੇਖਾਓ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_pa.ts ================================================ ShowDesktop Show desktop ਡੈਸਕਟਾਪ ਵੇਖਾਓ Show Desktop: Global shortcut '%1' cannot be registered ਡੈਸਕਟਾਪ ਵੇਖਓ: ਗਲੋਬਲ ਸ਼ਾਰਟਕੱਟ '%1' ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ Show Desktop ਡੈਸਕਟਾਪ ਵੇਖਾਓ ================================================ FILE: plugin-showdesktop/translations/showdesktop_pl.desktop.yaml ================================================ Desktop Entry/Name: "Pokaż pulpit" Desktop Entry/Comment: "Minimalizuje wszystkie okna i pokazuje pulpit" ================================================ FILE: plugin-showdesktop/translations/showdesktop_pl.ts ================================================ ShowDesktop Show desktop Pokaż pulpit Show Desktop: Global shortcut '%1' cannot be registered Pokaż pulpit: globalny skrót '%1' nie może zostać zarejestrowany Show Desktop Pokaż pulpit ================================================ FILE: plugin-showdesktop/translations/showdesktop_pt.desktop.yaml ================================================ Desktop Entry/Name: "Mostrar área de trabalho" Desktop Entry/Comment: "Minimizar janelas e mostrar a área de trabalho" ================================================ FILE: plugin-showdesktop/translations/showdesktop_pt.ts ================================================ ShowDesktop Show desktop Mostrar ambiente de trabalho Show Desktop: Global shortcut '%1' cannot be registered Mostrar ambiente de trabalho: não foi possível registar o atalho global '%1' Show Desktop Mostrar ambiente de trabalho ================================================ FILE: plugin-showdesktop/translations/showdesktop_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Exibir a área de trabalho" Desktop Entry/Comment: "Minimizar todas as janelas e exibir a área de trabalho" ================================================ FILE: plugin-showdesktop/translations/showdesktop_pt_BR.ts ================================================ ShowDesktop Show desktop Mostrar área de trabalho Show Desktop: Global shortcut '%1' cannot be registered Exibir Área De Trabalho: Atalho Global '%1' não pode ser registrado Show Desktop Exibir Área de Trabalho ================================================ FILE: plugin-showdesktop/translations/showdesktop_ro_RO.desktop.yaml ================================================ Desktop Entry/Name: "Arată desktopul" Desktop Entry/Comment: "Minimizează toate ferestrele și arată desktopul" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ro_RO.ts ================================================ ShowDesktop Show desktop Afișează Spațiul de birou (Desktop) Show Desktop: Global shortcut '%1' cannot be registered Arata Desktop: Scurtătura globala '%1' nu poate fi inregistrata Show Desktop Afișează desktopul ================================================ FILE: plugin-showdesktop/translations/showdesktop_ru.desktop.yaml ================================================ Desktop Entry/Name: "Показать рабочий стол" Desktop Entry/Comment: "Свернуть все окна и показать рабочий стол" ================================================ FILE: plugin-showdesktop/translations/showdesktop_ru.ts ================================================ ShowDesktop Show desktop Показать рабочий стол Show Desktop: Global shortcut '%1' cannot be registered Показать рабочий стол: глобальное сочетание клавиш «%1» нельзя зарегистрировать Show Desktop Показать рабочий стол ================================================ FILE: plugin-showdesktop/translations/showdesktop_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-showdesktop/translations/showdesktop_si.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_sk.desktop.yaml ================================================ Desktop Entry/Name: "Zobraziť plochu" Desktop Entry/Comment: "Minimalizuje všetky okná a zobrazí plochu" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sk_SK.ts ================================================ ShowDesktop Show desktop Ukázať plochu Show Desktop: Global shortcut '%1' cannot be registered Ukázať plochu: Globálna klávesová skratka '%1' sa nedá použiť Show Desktop Zobraziť plochu ================================================ FILE: plugin-showdesktop/translations/showdesktop_sl.desktop.yaml ================================================ Desktop Entry/Name: "Pokaži namizje" Desktop Entry/Comment: "Pomanjšajte vsa okna, da se pokaže namizje" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sl.ts ================================================ ShowDesktop Show desktop Pokaži namizje Show Desktop: Global shortcut '%1' cannot be registered Prikaži namizje: globalne bližnjice '%1' ni mogoče registrirati Show Desktop Pokaži namizje ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr.desktop.yaml ================================================ Desktop Entry/Name: "Приказ површи" Desktop Entry/Comment: "Минимизуј све прозоре и прикажи радну површ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Приказ површи" Desktop Entry/Comment: "Минимизуј све прозоре и прикажи радну површ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Prikaz površi" Desktop Entry/Comment: "Minimizuj sve prozore i prikaži radnu površ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Prikaz površi" Desktop Entry/Comment: "Minimizuj sve prozore i prikaži radnu površ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr@latin.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr_BA.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered Show Desktop Прикажи радну површ ================================================ FILE: plugin-showdesktop/translations/showdesktop_sr_RS.ts ================================================ ShowDesktop Show desktop Прикажи десктоп Show Desktop: Global shortcut '%1' cannot be registered Прикажи десктоп: Глобална пречица '%1' се не може регистровати Show Desktop Прикажи десктоп ================================================ FILE: plugin-showdesktop/translations/showdesktop_sv.desktop.yaml ================================================ Desktop Entry/Name: "Visa skrivbord" Desktop Entry/Comment: "Minimera alla fönster och visa skrivbordet" ================================================ FILE: plugin-showdesktop/translations/showdesktop_sv.ts ================================================ ShowDesktop Show desktop Visa skrivbord Show Desktop: Global shortcut '%1' cannot be registered Visa skrivbord: Almänna kortkommandot '%1' kan inte registreras Show Desktop Visa skrivbord ================================================ FILE: plugin-showdesktop/translations/showdesktop_th.desktop.yaml ================================================ Desktop Entry/Name: "แสดงพื้นโต๊ะ" Desktop Entry/Comment: "ย่อเก็บหน้าต่างทั้งหมดและแสดงพื้นโต๊ะ" ================================================ FILE: plugin-showdesktop/translations/showdesktop_th_TH.ts ================================================ ShowDesktop Show desktop Show Desktop: Global shortcut '%1' cannot be registered แสดงพื้นโต๊ะ: ไม่สามารถตั้ง '%1' เป็นปุ่มลัดส่วนกลางได้ Show Desktop แสดงพื้นโต๊ะ ================================================ FILE: plugin-showdesktop/translations/showdesktop_tr.desktop.yaml ================================================ Desktop Entry/Name: "Masaüstünü Göster" Desktop Entry/Comment: "Tüm pencereleri küçült ve masaüstünü göster" ================================================ FILE: plugin-showdesktop/translations/showdesktop_tr.ts ================================================ ShowDesktop Show desktop Masaüstünü göster Show Desktop: Global shortcut '%1' cannot be registered Masaüstünü Göster: '%1' genel kısayolu kaydedilemiyor Show Desktop Masaüstünü Göster ================================================ FILE: plugin-showdesktop/translations/showdesktop_uk.desktop.yaml ================================================ Desktop Entry/Name: "Показати стільницю" Desktop Entry/Comment: "Згорнути всі вікна та показати стільницю" ================================================ FILE: plugin-showdesktop/translations/showdesktop_uk.ts ================================================ ShowDesktop Show desktop Показати стільницю Show Desktop: Global shortcut '%1' cannot be registered Показати стільницю: Не вдалося зареєструвати глобальне скорочення '%1' Show Desktop Показати стільницю ================================================ FILE: plugin-showdesktop/translations/showdesktop_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "显示桌面" Desktop Entry/Comment: "最小化所有窗口并显示桌面" ================================================ FILE: plugin-showdesktop/translations/showdesktop_zh_CN.ts ================================================ ShowDesktop Show desktop 显示桌面 Show Desktop: Global shortcut '%1' cannot be registered 显示桌面:无法注册全局快捷键'%1' Show Desktop 显示桌面 ================================================ FILE: plugin-showdesktop/translations/showdesktop_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "顯示桌面" Desktop Entry/Comment: "將全部視窗縮到最小並顯示桌面" ================================================ FILE: plugin-showdesktop/translations/showdesktop_zh_TW.ts ================================================ ShowDesktop Show desktop 顯示桌面 Show Desktop: Global shortcut '%1' cannot be registered 顯示桌面:整體快速鍵 '%1' 無法註冊 Show Desktop 顯示桌面 ================================================ FILE: plugin-spacer/CMakeLists.txt ================================================ set(PLUGIN "spacer") set(HEADERS spacer.h spacerconfiguration.h ) set(SOURCES spacer.cpp spacerconfiguration.cpp ) set(UIS spacerconfiguration.ui ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-spacer/resources/spacer.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=bookmark-new #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-spacer/spacer.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "spacer.h" #include "spacerconfiguration.h" #include void SpacerWidget::setType(QString const & type) { if (type != mType) { mType = type; QEvent e{QEvent::ThemeChange}; QApplication::sendEvent(this, &e); } } void SpacerWidget::setOrientation(QString const & orientation) { if (orientation != mOrientation) { mOrientation = orientation; QEvent e{QEvent::ThemeChange}; QApplication::sendEvent(this, &e); } } /************************************************ ************************************************/ Spacer::Spacer(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject() , ILXQtPanelPlugin(startupInfo) , mSize(8) , mExpandable(false) { settingsChanged(); } /************************************************ ************************************************/ void Spacer::settingsChanged() { mSize = settings()->value(QStringLiteral("size"), 8).toInt(); const bool old_expandable = mExpandable; mExpandable = settings()->value(QStringLiteral("expandable"), false).toBool(); mSpacer.setType(settings()->value(QStringLiteral("spaceType"), SpacerConfiguration::msTypes[0]).toString()); setSizes(); if (old_expandable != mExpandable) pluginFlagsChanged(); } /************************************************ ************************************************/ QDialog *Spacer::configureDialog() { return new SpacerConfiguration(settings()); } /************************************************ ************************************************/ void Spacer::setSizes() { if (mExpandable) { mSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mSpacer.setMinimumSize({1, 1}); mSpacer.setMaximumSize({QWIDGETSIZE_MAX, QWIDGETSIZE_MAX}); mSpacer.setOrientation(panel()->isHorizontal() ? QStringLiteral("horizontal") : QStringLiteral("vertical")); } else { if (panel()->isHorizontal()) { mSpacer.setOrientation(QStringLiteral("horizontal")); mSpacer.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); mSpacer.setFixedWidth(mSize); mSpacer.setMinimumHeight(0); mSpacer.setMaximumHeight(QWIDGETSIZE_MAX); } else { mSpacer.setOrientation(QStringLiteral("vertical")); mSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); mSpacer.setFixedHeight(mSize); mSpacer.setMinimumWidth(0); mSpacer.setMaximumWidth(QWIDGETSIZE_MAX); } } } /************************************************ ************************************************/ void Spacer::realign() { setSizes(); } ================================================ FILE: plugin-spacer/spacer.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SPACER_H #define SPACER_H #include "../panel/ilxqtpanelplugin.h" #include class SpacerWidget : public QFrame { Q_OBJECT Q_PROPERTY(QString type READ getType) Q_PROPERTY(QString orientation READ getOrientation) public: const QString& getType() const throw () { return mType; } void setType(QString const & type); const QString& getOrientation() const throw () { return mOrientation; } void setOrientation(QString const & orientation); private: QString mType; QString mOrientation; }; class Spacer : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: Spacer(const ILXQtPanelPluginStartupInfo &startupInfo); virtual QWidget *widget() override { return &mSpacer; } virtual QString themeId() const override { return QStringLiteral("Spacer"); } bool isSeparate() const override { return true; } bool isExpandable() const override { return mExpandable; } virtual ILXQtPanelPlugin::Flags flags() const override { return HaveConfigDialog; } QDialog *configureDialog() override; virtual void realign() override; private slots: virtual void settingsChanged() override; private: void setSizes(); private: SpacerWidget mSpacer; int mSize; bool mExpandable; }; class SpacerPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new Spacer(startupInfo);} }; #endif ================================================ FILE: plugin-spacer/spacerconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "spacerconfiguration.h" #include "ui_spacerconfiguration.h" //Note: strings can't actually be translated here (in static initialization time) // the QT_TR_NOOP here is just for qt translate tools to get the strings for translation const QStringList SpacerConfiguration::msTypes = { QStringLiteral(QT_TR_NOOP("lined")) , QStringLiteral(QT_TR_NOOP("dotted")) , QStringLiteral(QT_TR_NOOP("invisible")) }; SpacerConfiguration::SpacerConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::SpacerConfiguration) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("SpacerConfigurationWindow")); ui->setupUi(this); //Note: translation is needed here in runtime (translator is attached already) for (auto const & type : msTypes) ui->typeCB->addItem(tr(type.toStdString().c_str()), type); loadSettings(); connect(ui->sizeSB, static_cast(&QSpinBox::valueChanged), this, &SpacerConfiguration::sizeChanged); connect(ui->typeCB, static_cast(&QComboBox::currentIndexChanged), this, &SpacerConfiguration::typeChanged); //Note: if there will be more than 2 radio buttons for width/size type, this simple setting logic will break connect(ui->sizeExpandRB, &QAbstractButton::toggled, this, &SpacerConfiguration::widthTypeChanged); } SpacerConfiguration::~SpacerConfiguration() { delete ui; } void SpacerConfiguration::loadSettings() { ui->sizeSB->setValue(settings().value(QStringLiteral("size"), 8).toInt()); ui->typeCB->setCurrentIndex(ui->typeCB->findData(settings().value(QStringLiteral("spaceType"), msTypes[0]).toString())); const bool expandable = settings().value(QStringLiteral("expandable"), false).toBool(); ui->sizeExpandRB->setChecked(expandable); ui->sizeFixedRB->setChecked(!expandable); ui->sizeSB->setDisabled(expandable); } void SpacerConfiguration::sizeChanged(int value) { settings().setValue(QStringLiteral("size"), value); } void SpacerConfiguration::typeChanged(int index) { settings().setValue(QStringLiteral("spaceType"), ui->typeCB->itemData(index, Qt::UserRole)); } void SpacerConfiguration::widthTypeChanged(bool expandableChecked) { settings().setValue(QStringLiteral("expandable"), expandableChecked); } ================================================ FILE: plugin-spacer/spacerconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef SPACERCONFIGURATION_H #define SPACERCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" class QAbstractButton; namespace Ui { class SpacerConfiguration; } class SpacerConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit SpacerConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~SpacerConfiguration(); public: static const QStringList msTypes; private: Ui::SpacerConfiguration *ui; private slots: /* Saves settings in conf file. */ void loadSettings(); void sizeChanged(int value); void typeChanged(int index); void widthTypeChanged(bool expandableChecked); }; #endif // SPACERCONFIGURATION_H ================================================ FILE: plugin-spacer/spacerconfiguration.ui ================================================ SpacerConfiguration 0 0 289 135 Spacer Settings Space width: fixed 4 2048 8 expandable Space type: false Qt::Horizontal QDialogButtonBox::Close buttons clicked(QAbstractButton*) SpacerConfiguration close() sizeFixedRB toggled(bool) sizeSB setEnabled(bool) ================================================ FILE: plugin-spacer/translations/spacer.desktop.yaml ================================================ Desktop Entry/Name: "Spacer" Desktop Entry/Comment: "Space between widgets" ================================================ FILE: plugin-spacer/translations/spacer.ts ================================================ SpacerConfiguration Spacer Settings Space width: Space type: fixed expandable lined dotted invisible ================================================ FILE: plugin-spacer/translations/spacer_ar.desktop.yaml ================================================ Desktop Entry/Name: "مُباعد" Desktop Entry/Comment: "مساحة بين الودجات" ================================================ FILE: plugin-spacer/translations/spacer_ar.ts ================================================ SpacerConfiguration Spacer Settings إعدادات المُباعد Space width: عرض المُباعد: Space type: نوع المُباعد: fixed ثابت expandable يتوسّع lined خطّي dotted منقّط invisible مخفي ================================================ FILE: plugin-spacer/translations/spacer_arn.ts ================================================ SpacerConfiguration Spacer Settings Space width: Space type: fixed expandable lined dotted invisible ================================================ FILE: plugin-spacer/translations/spacer_ast.ts ================================================ SpacerConfiguration Spacer Settings Axustes del espaciador Space width: Anchor: Space type: Triba: fixed fixu expandable espandible lined lliniáu dotted puntiáu invisible invisible ================================================ FILE: plugin-spacer/translations/spacer_bg.desktop.yaml ================================================ Desktop Entry/Name: "Разделител" Desktop Entry/Comment: "Създаване на разстояние и разграничител между приставките" ================================================ FILE: plugin-spacer/translations/spacer_bg.ts ================================================ SpacerConfiguration Spacer Settings Настройки Разделител Space width: Ширина: Space type: Тип: fixed Фиксирана expandable Разширяема lined Линия dotted Точки invisible Невидима ================================================ FILE: plugin-spacer/translations/spacer_ca.desktop.yaml ================================================ Desktop Entry/Name: "Espaiador" Desktop Entry/Comment: "Espai entre estris" ================================================ FILE: plugin-spacer/translations/spacer_ca.ts ================================================ SpacerConfiguration Spacer Settings Configuració de l'espaiador Space width: Amplada de l'espai: Space type: Tipus d'espai: fixed fix expandable ampliable lined línia dotted puntejat invisible invisible ================================================ FILE: plugin-spacer/translations/spacer_cs.desktop.yaml ================================================ Desktop Entry/Name: "Výplň" Desktop Entry/Comment: "Pro vytvoření mezery mezi ovládacími prvky" ================================================ FILE: plugin-spacer/translations/spacer_cs.ts ================================================ SpacerConfiguration Spacer Settings Nastavení výplně Space width: Šířka výplně: Space type: Typ výplně: fixed pevné velikosti expandable zvětšovatelná lined linkovaná dotted tečkovaná invisible neviditelná ================================================ FILE: plugin-spacer/translations/spacer_cy.ts ================================================ SpacerConfiguration Spacer Settings Space width: Space type: fixed expandable lined dotted invisible ================================================ FILE: plugin-spacer/translations/spacer_da.desktop.yaml ================================================ Desktop Entry/Name: "Afstandstykke" Desktop Entry/Comment: "Afstand mellem kontroller" ================================================ FILE: plugin-spacer/translations/spacer_da.ts ================================================ SpacerConfiguration Spacer Settings Indstillinger for afstandsstykke Space width: Afstandsbredde: Space type: Afstandstype: fixed fast expandable kan udviddes lined linjeret dotted prikket invisible usynlig ================================================ FILE: plugin-spacer/translations/spacer_de.desktop.yaml ================================================ Desktop Entry/Name: "Platzhalter" Desktop Entry/Comment: "Stellt den Abstand zwischen den Widgets ein" ================================================ FILE: plugin-spacer/translations/spacer_de.ts ================================================ SpacerConfiguration Spacer Settings Abstandhaltereinstellungen Space width: Abstandsbreite: Space type: Abstandstyp: fixed fest expandable erweiterbar lined liniert dotted punktiert invisible unsichtbar ================================================ FILE: plugin-spacer/translations/spacer_el.desktop.yaml ================================================ Desktop Entry/Name: "Διάστημα" Desktop Entry/Comment: "Διάστημα μεταξύ των γραφικών συστατικών" ================================================ FILE: plugin-spacer/translations/spacer_el.ts ================================================ SpacerConfiguration Spacer Settings Ρυθμίσεις διαστήματος Space width: Πλάτος διαστήματος: Space type: Τύπος διαστήματος: fixed σταθερό expandable επεκτάσιμο lined γραμμωτό dotted διάστικτο invisible αόρατο ================================================ FILE: plugin-spacer/translations/spacer_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Spacer" Desktop Entry/Comment: "Space between widgets" ================================================ FILE: plugin-spacer/translations/spacer_en_GB.ts ================================================ SpacerConfiguration Spacer Settings Spacer Settings Space width: Space width: Space type: Space type: fixed fixed expandable expandable lined lined dotted dotted invisible invisible ================================================ FILE: plugin-spacer/translations/spacer_es.desktop.yaml ================================================ Desktop Entry/Name: "Espaciador" Desktop Entry/Comment: "Espacio entre miniaplicaciones" ================================================ FILE: plugin-spacer/translations/spacer_es.ts ================================================ SpacerConfiguration Spacer Settings Configuración del espaciador Space width: Ancho del espacio: Space type: Tipo de espacio: fixed fijo expandable expandible lined línea dotted punteado invisible invisible ================================================ FILE: plugin-spacer/translations/spacer_et.desktop.yaml ================================================ Desktop Entry/Name: "Eraldaja" Desktop Entry/Comment: "Tee ruumi vidinate vahele" ================================================ FILE: plugin-spacer/translations/spacer_et.ts ================================================ SpacerConfiguration Spacer Settings Eraldaja seadistused Space width: Eraldusbloki laius: Space type: Eraldusbloki tüüp: fixed fikseeritud laius expandable laienev lined joon dotted punktiirjoon invisible nähtamatu ================================================ FILE: plugin-spacer/translations/spacer_fi.desktop.yaml ================================================ Desktop Entry/Name: "Erotin" Desktop Entry/Comment: "Lisätila pienoisohjelmien välissä" ================================================ FILE: plugin-spacer/translations/spacer_fi.ts ================================================ SpacerConfiguration Spacer Settings Erottimen asetukset Space width: Erotusleveys: Space type: Erotustyyppi: fixed pysyvä expandable laajentuva lined kiinteä viiva dotted pisteviiva invisible näkymätön ================================================ FILE: plugin-spacer/translations/spacer_fr.desktop.yaml ================================================ Desktop Entry/Name: "Espaceur" Desktop Entry/Comment: "Fixe un espacement entre les widgets" ================================================ FILE: plugin-spacer/translations/spacer_fr.ts ================================================ SpacerConfiguration Spacer Settings Réglages du séparateur Space width: Largeur d'espace : Space type: Type d'espace : fixed Attaché expandable Extensible lined doublé dotted pointillé invisible caché ================================================ FILE: plugin-spacer/translations/spacer_gl.ts ================================================ SpacerConfiguration Spacer Settings Axustes do espazador Space width: Largura do espazo: Space type: Tipo de espazo: fixed fixo expandable expansíbel lined raia dotted punteado invisible invisíbel ================================================ FILE: plugin-spacer/translations/spacer_he.desktop.yaml ================================================ Desktop Entry/Name: "מרווח" Desktop Entry/Comment: "רווח בין וידג׳טים" ================================================ FILE: plugin-spacer/translations/spacer_he.ts ================================================ SpacerConfiguration Spacer Settings הגדרות מרווח Space width: רוחב הרווח: Space type: סוג רווח: fixed קבוע expandable מתרחב lined בקו dotted בנקודות invisible מוסתר ================================================ FILE: plugin-spacer/translations/spacer_hr.desktop.yaml ================================================ Desktop Entry/Name: "Razmaci" Desktop Entry/Comment: "Postavljanje razmaka izmađu programčića" ================================================ FILE: plugin-spacer/translations/spacer_hr.ts ================================================ SpacerConfiguration Spacer Settings Razmaci – Postavke Space width: Širina razmaka: Space type: Vrsta razmaka: fixed fiksna expandable proširiva lined crta dotted točkast invisible nevidljiv ================================================ FILE: plugin-spacer/translations/spacer_hu.desktop.yaml ================================================ Desktop Entry/Name: "Távtartó" Desktop Entry/Comment: "Elemek közötti távolságtartó" ================================================ FILE: plugin-spacer/translations/spacer_hu.ts ================================================ SpacerConfiguration Spacer Settings Távtartó beállítása Space width: Távolság: Space type: Típus: fixed rögzített expandable bővíthető lined vonal dotted pontok invisible láthatatlan ================================================ FILE: plugin-spacer/translations/spacer_id.ts ================================================ SpacerConfiguration Spacer Settings Pengaturan Pemisah Space width: Lebar pemisah: Space type: Tipe pemisah: fixed tetap expandable dapat diperluas lined bergaris dotted titik invisible tidak terlihat ================================================ FILE: plugin-spacer/translations/spacer_it.desktop.yaml ================================================ Desktop Entry/Name: "Spaziatore" Desktop Entry/Comment: "Aggiunge uno spazio fra gli elementi" ================================================ FILE: plugin-spacer/translations/spacer_it.ts ================================================ SpacerConfiguration Spacer Settings Impostazioni spaziatore Space width: Larghezza: Space type: Tipo: fixed Fisso expandable dinamico lined linea dotted puntini invisible invisibile ================================================ FILE: plugin-spacer/translations/spacer_ja.desktop.yaml ================================================ Desktop Entry/Name: "スペーサー" Desktop Entry/Comment: "ウィジェット間に空間を開けます" ================================================ FILE: plugin-spacer/translations/spacer_ja.ts ================================================ SpacerConfiguration Spacer Settings スペーサーの設定 Space width: スペースの幅: Space type: スペースの種類: fixed 固定 expandable 自動拡張 lined 直線 dotted 点線 invisible 非表示 ================================================ FILE: plugin-spacer/translations/spacer_ka.desktop.yaml ================================================ Desktop Entry/Name: "გამყოფი" Desktop Entry/Comment: "სივრცე ვიჯეტებს შორის" ================================================ FILE: plugin-spacer/translations/spacer_ka.ts ================================================ SpacerConfiguration Spacer Settings გამყოფის მორგება Space width: გამყოფის სიგანე: Space type: გამყოფის ტიპი: fixed ფიქსირებული expandable გაფართოებადი lined წირეებით dotted წერტილებით invisible უხილავი ================================================ FILE: plugin-spacer/translations/spacer_kab.ts ================================================ SpacerConfiguration Spacer Settings Space width: Space type: fixed expandable lined dotted invisible ================================================ FILE: plugin-spacer/translations/spacer_kk.ts ================================================ SpacerConfiguration Spacer Settings Ажыратқыш баптаулары Space width: Ажыратқыш ені: Space type: Ажыратқыш түрі: fixed бекітілген expandable кеңейтілетін lined сызық dotted нүктелі invisible жасырын ================================================ FILE: plugin-spacer/translations/spacer_ko.desktop.yaml ================================================ Desktop Entry/Name: "공간도구" Desktop Entry/Comment: "위젯 사이의 공간" ================================================ FILE: plugin-spacer/translations/spacer_ko.ts ================================================ SpacerConfiguration Spacer Settings 공간도구 설정 Space width: 공간 너비: Space type: 공간 유형: fixed 고정됨 expandable 확장가능함 lined 줄이 쳐짐 dotted 점점이 찍힘 invisible 보이지 않음 ================================================ FILE: plugin-spacer/translations/spacer_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kabanga" Desktop Entry/Comment: "Kano kateekawo akabanga okwawula obutundu bwa ku lubaawo obulala" ================================================ FILE: plugin-spacer/translations/spacer_lg.ts ================================================ SpacerConfiguration Spacer Settings Enteekateeka z'akabanga Space width: Obugazi bw'akabanga: Space type: Endabika y'akabanga: fixed tebukyuka expandable bukyuka lined kateekawo lukoloboze dotted kateekawo butonnyeze invisible bbanga gyereere ================================================ FILE: plugin-spacer/translations/spacer_lt.desktop.yaml ================================================ Desktop Entry/Name: "Tarpiklis" Desktop Entry/Comment: "Tarpas tarp valdiklių" ================================================ FILE: plugin-spacer/translations/spacer_lt.ts ================================================ SpacerConfiguration Spacer Settings Tarpiklio nustatymai Space width: Tarpo plotis: Space type: Tarpo tipas: fixed fiksuotas expandable išplečiamas lined linijinis dotted taškuotas invisible nematomas ================================================ FILE: plugin-spacer/translations/spacer_lv.desktop.yaml ================================================ Desktop Entry/Name: "Atdalītājs" Desktop Entry/Comment: "Atstarpe starp logrīkiem/vidžetiem" ================================================ FILE: plugin-spacer/translations/spacer_lv.ts ================================================ SpacerConfiguration Spacer Settings Atdalītāja iestatījumi Space width: Atdalītāja platums: Space type: Atdalītāja tips: fixed fiksēts expandable paplašināms/stiepjams lined līnijots dotted punktots invisible neredzams ================================================ FILE: plugin-spacer/translations/spacer_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Mellomrom" Desktop Entry/Comment: "Plass mellom miniprogrammer" ================================================ FILE: plugin-spacer/translations/spacer_nb_NO.ts ================================================ SpacerConfiguration Spacer Settings Tomromsinnstillinger Space width: Tomromsbredde: Space type: Tomromstype: fixed fast expandable utvidbar lined linjert dotted prikkete invisible usynlig ================================================ FILE: plugin-spacer/translations/spacer_nl.desktop.yaml ================================================ Desktop Entry/Name: "Tussenruimte" Desktop Entry/Comment: "Ruimte tussen bedieningselementen" ================================================ FILE: plugin-spacer/translations/spacer_nl.ts ================================================ SpacerConfiguration Spacer Settings Tussenruimte-instellingen Space width: Breedte: Space type: Soort: fixed vast expandable uitbreidbaar lined lijn dotted puntjes invisible onzichtbaar ================================================ FILE: plugin-spacer/translations/spacer_oc.ts ================================================ SpacerConfiguration Spacer Settings Reglatge del separador Space width: Largor de l’espaci : Space type: Tipe d’espaci : fixed fixe expandable espandible lined doblat dotted puntejat invisible amagat ================================================ FILE: plugin-spacer/translations/spacer_pa.ts ================================================ SpacerConfiguration Spacer Settings ਸਪੇਸਰ ਸੈਟਿੰਗਾਂ Space width: ਸਪੇਸ ਚੌੜਾਈ: Space type: ਸਪੇਸ ਦੀ ਕਿਸਮ: fixed ਸਥਿਰ expandable ਫੈਲਣਯੋਗ lined ਲਾਈਨ dotted ਬਿੰਦੀਦਾਰ invisible ਅਦਿੱਖ ================================================ FILE: plugin-spacer/translations/spacer_pl.desktop.yaml ================================================ Desktop Entry/Name: "Odstęp" Desktop Entry/Comment: "Odstęp między elementami" ================================================ FILE: plugin-spacer/translations/spacer_pl.ts ================================================ SpacerConfiguration Spacer Settings Ustawienia odstępu Space width: Szerokość odstępu: Space type: Rodzaj odstępu: fixed stały expandable rozszerzalny lined linia dotted punkty invisible niewidoczny ================================================ FILE: plugin-spacer/translations/spacer_pt.desktop.yaml ================================================ Desktop Entry/Name: "Espaçamento" Desktop Entry/Comment: "Espaço entre os widgets" ================================================ FILE: plugin-spacer/translations/spacer_pt.ts ================================================ SpacerConfiguration Spacer Settings Configurações do espaçador Space width: Largura do espaço: Space type: Tipo de espaço: fixed fixo expandable expansível lined linha dotted pontilhado invisible invisível ================================================ FILE: plugin-spacer/translations/spacer_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Espaçador" Desktop Entry/Comment: "Espaço entre widgets" ================================================ FILE: plugin-spacer/translations/spacer_pt_BR.ts ================================================ SpacerConfiguration Spacer Settings Configurações do espaçador Space width: Largura do espaço: Space type: Tipo de espaço: fixed fixo expandable expansível lined em linhas dotted pontilhado invisible invisível ================================================ FILE: plugin-spacer/translations/spacer_ru.desktop.yaml ================================================ Desktop Entry/Name: "Разделитель" Desktop Entry/Comment: "Промежуток между виджетами" ================================================ FILE: plugin-spacer/translations/spacer_ru.ts ================================================ SpacerConfiguration Spacer Settings Настройки разделителя Space width: Ширина разделителя: Space type: Тип разделителя: fixed фиксированный expandable расширяемый lined линия dotted точками invisible невидимый ================================================ FILE: plugin-spacer/translations/spacer_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-spacer/translations/spacer_si.ts ================================================ SpacerConfiguration Spacer Settings Space width: Space type: fixed expandable lined dotted invisible ================================================ FILE: plugin-spacer/translations/spacer_sk.desktop.yaml ================================================ Desktop Entry/Name: "Výplň" Desktop Entry/Comment: "Medzera medzi prvkami" ================================================ FILE: plugin-spacer/translations/spacer_sk.ts ================================================ SpacerConfiguration Spacer Settings Nastavenie výplne Space width: Šírka výplne: Space type: Typ výplne: fixed Pevné veľkosti expandable Rozšíriteľná lined linkovaná dotted bodkovaná invisible neviditeľný ================================================ FILE: plugin-spacer/translations/spacer_sr.ts ================================================ SpacerConfiguration Spacer Settings Подешавања размака Space width: Ширина размака: Space type: Тип размака: fixed фиксан expandable проширив lined постројен dotted тачкаст invisible невидљив ================================================ FILE: plugin-spacer/translations/spacer_sv.desktop.yaml ================================================ Desktop Entry/Name: "Avskiljare" Desktop Entry/Comment: "Sätt avstånd mellan grafiska komponenter" ================================================ FILE: plugin-spacer/translations/spacer_sv.ts ================================================ SpacerConfiguration Spacer Settings Hantera avskiljare Space width: Mellanrum: Space type: Avskiljartyp: fixed fixerat expandable utökbart lined streckad dotted prickad invisible osynlig ================================================ FILE: plugin-spacer/translations/spacer_tr.desktop.yaml ================================================ Desktop Entry/Name: "Boşluk" Desktop Entry/Comment: "Widget'lar arasındaki boşluk" ================================================ FILE: plugin-spacer/translations/spacer_tr.ts ================================================ SpacerConfiguration Spacer Settings Ayraç Ayarları Space width: Boşluk genişliği: Space type: Boşluk türü: fixed sabit expandable genişletilebilir lined çizgili dotted noktalı invisible görünmez ================================================ FILE: plugin-spacer/translations/spacer_uk.desktop.yaml ================================================ Desktop Entry/Name: "Розділювач" Desktop Entry/Comment: "Розділювач між віджетами" ================================================ FILE: plugin-spacer/translations/spacer_uk.ts ================================================ SpacerConfiguration Spacer Settings Налаштування розділювача Space width: Ширина розділювача: Space type: Тип розділювача: fixed сталий expandable розтягуваний lined лінійований dotted пунктирний invisible невидимий ================================================ FILE: plugin-spacer/translations/spacer_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "间隔" Desktop Entry/Comment: "小部件之间的间隔" ================================================ FILE: plugin-spacer/translations/spacer_zh_CN.ts ================================================ SpacerConfiguration Spacer Settings 间隔设置 Space width: 间隔宽度: Space type: 间隔类型: fixed 固定 expandable 扩展 lined 线状 dotted 点状 invisible 无形 ================================================ FILE: plugin-spacer/translations/spacer_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "間隔" Desktop Entry/Comment: "小工具之間放置間隔" ================================================ FILE: plugin-spacer/translations/spacer_zh_TW.ts ================================================ SpacerConfiguration Spacer Settings 間隔設定 Space width: 間隔寬度: Space type: 間隔類型: fixed 固定 expandable 延展 lined 線狀 dotted 點狀 invisible 無現形 ================================================ FILE: plugin-statusnotifier/CMakeLists.txt ================================================ set(PLUGIN "statusnotifier") find_package(dbusmenu-lxqt REQUIRED) find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS Concurrent) set(HEADERS statusnotifier.h statusnotifierconfiguration.h dbustypes.h statusnotifierbutton.h statusnotifieriteminterface.h statusnotifierwatcher.h statusnotifierwidget.h sniasync.h statusnotifierproxy.h ) set(SOURCES statusnotifier.cpp statusnotifierconfiguration.cpp dbustypes.cpp statusnotifierbutton.cpp statusnotifieriteminterface.cpp statusnotifierwatcher.cpp statusnotifierwidget.cpp sniasync.cpp statusnotifierproxy.cpp ) set(UIS statusnotifierconfiguration.ui ) qt6_add_dbus_adaptor(DBUS_SOURCES org.kde.StatusNotifierItem.xml statusnotifieriteminterface.h StatusNotifierItemInterface ) set_source_files_properties(${DBUS_SOURCES} PROPERTIES SKIP_AUTOGEN ON) list(APPEND SOURCES "${DBUS_SOURCES}") set(LIBRARIES dbusmenu-lxqt Qt6::Concurrent ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-statusnotifier/dbustypes.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "dbustypes.h" // Marshall the IconPixmap data into a D-Bus argument QDBusArgument &operator<<(QDBusArgument &argument, const IconPixmap &icon) { argument.beginStructure(); argument << icon.width; argument << icon.height; argument << icon.bytes; argument.endStructure(); return argument; } // Retrieve the ImageStruct data from the D-Bus argument const QDBusArgument &operator>>(const QDBusArgument &argument, IconPixmap &icon) { argument.beginStructure(); argument >> icon.width; argument >> icon.height; argument >> icon.bytes; argument.endStructure(); return argument; } // Marshall the ToolTip data into a D-Bus argument QDBusArgument &operator<<(QDBusArgument &argument, const ToolTip &toolTip) { argument.beginStructure(); argument << toolTip.iconName; argument << toolTip.iconPixmap; argument << toolTip.title; argument << toolTip.description; argument.endStructure(); return argument; } // Retrieve the ToolTip data from the D-Bus argument const QDBusArgument &operator>>(const QDBusArgument &argument, ToolTip &toolTip) { argument.beginStructure(); argument >> toolTip.iconName; argument >> toolTip.iconPixmap; argument >> toolTip.title; argument >> toolTip.description; argument.endStructure(); return argument; } ================================================ FILE: plugin-statusnotifier/dbustypes.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #ifndef DBUSTYPES_H #define DBUSTYPES_H struct IconPixmap { int width; int height; QByteArray bytes; }; typedef QList IconPixmapList; struct ToolTip { QString iconName; QList iconPixmap; QString title; QString description; }; QDBusArgument &operator<<(QDBusArgument &argument, const IconPixmap &icon); const QDBusArgument &operator>>(const QDBusArgument &argument, IconPixmap &icon); QDBusArgument &operator<<(QDBusArgument &argument, const ToolTip &toolTip); const QDBusArgument &operator>>(const QDBusArgument &argument, ToolTip &toolTip); Q_DECLARE_METATYPE(IconPixmap) Q_DECLARE_METATYPE(ToolTip) #endif // DBUSTYPES_H ================================================ FILE: plugin-statusnotifier/org.kde.StatusNotifierItem.xml ================================================ ================================================ FILE: plugin-statusnotifier/resources/statusnotifier.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=go-bottom ================================================ FILE: plugin-statusnotifier/sniasync.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "sniasync.h" SniAsync::SniAsync(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent/* = 0*/) : QObject(parent) , mSni{service, path, connection} { //forward StatusNotifierItem signals connect(&mSni, &org::kde::StatusNotifierItem::NewAttentionIcon, this, &SniAsync::NewAttentionIcon); connect(&mSni, &org::kde::StatusNotifierItem::NewIcon, this, &SniAsync::NewIcon); connect(&mSni, &org::kde::StatusNotifierItem::NewOverlayIcon, this, &SniAsync::NewOverlayIcon); connect(&mSni, &org::kde::StatusNotifierItem::NewStatus, this, &SniAsync::NewStatus); connect(&mSni, &org::kde::StatusNotifierItem::NewTitle, this, &SniAsync::NewTitle); connect(&mSni, &org::kde::StatusNotifierItem::NewToolTip, this, &SniAsync::NewToolTip); } QDBusPendingReply SniAsync::asyncPropGet(QString const & property) { QDBusMessage msg = QDBusMessage::createMethodCall(mSni.service(), mSni.path(), QLatin1String("org.freedesktop.DBus.Properties"), QLatin1String("Get")); msg << mSni.interface() << property; return mSni.connection().asyncCall(msg); } ================================================ FILE: plugin-statusnotifier/sniasync.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Palo Kisa * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #if !defined(SNIASYNC_H) #define SNIASYNC_H #include "statusnotifieriteminterface.h" template struct remove_class_type { using type = void; using arg_type = void; }; // bluff template struct remove_class_type { using type = R(ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template struct remove_class_type { using type = R(ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template class call_sig_helper { template static decltype(&L1::operator()) test(int); template static void test(...); //bluff public: using type = decltype(test(0)); }; template struct call_signature : public remove_class_type::type> {}; template struct call_signature { using type = R (ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template struct call_signature { using type = R (ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template struct call_signature { using type = R (ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template struct call_signature { using type = R(ArgTypes...); using arg_type = std::tuple_element_t<0, std::tuple>; }; template struct is_valid_signature : public std::false_type {}; template struct is_valid_signature : public std::true_type {}; class SniAsync : public QObject { Q_OBJECT public: SniAsync(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); template inline void propertyGetAsync(QString const &name, F finished) { static const std::vector ignored_errors = { QStringLiteral("org.freedesktop.DBus.Error.UnknownProperty") , QStringLiteral("org.freedesktop.DBus.Error.InvalidArgs") , QStringLiteral("org.freedesktop.DBus.Error.Failed") }; static_assert(is_valid_signature::type>::value, "need callable (lambda, *function, callable obj) (Arg) -> void"); connect(new QDBusPendingCallWatcher{asyncPropGet(name), this}, &QDBusPendingCallWatcher::finished, this, [this, finished, name] (QDBusPendingCallWatcher * call) { QDBusPendingReply reply = *call; if (reply.isError() && ignored_errors.cend() == std::find(ignored_errors.cbegin(), ignored_errors.cend(), reply.error().name())) qDebug().noquote().nospace() << "Error on DBus request(" << mSni.service() << ',' << mSni.path() << ',' << name << "): " << reply.error(); finished(qdbus_cast::arg_type>(reply.value())); call->deleteLater(); } ); } //exposed methods from org::kde::StatusNotifierItem inline QString service() const { return mSni.service(); } public slots: //Forwarded slots from org::kde::StatusNotifierItem inline QDBusPendingReply<> Activate(int x, int y) { return mSni.Activate(x, y); } inline QDBusPendingReply<> ContextMenu(int x, int y) { return mSni.ContextMenu(x, y); } inline QDBusPendingReply<> Scroll(int delta, const QString &orientation) { return mSni.Scroll(delta, orientation); } inline QDBusPendingReply<> SecondaryActivate(int x, int y) { return mSni.SecondaryActivate(x, y); } signals: //Forwarded signals from org::kde::StatusNotifierItem void NewAttentionIcon(); void NewIcon(); void NewOverlayIcon(); void NewStatus(const QString &status); void NewTitle(); void NewToolTip(); private: QDBusPendingReply asyncPropGet(QString const & property); private: org::kde::StatusNotifierItem mSni; }; #endif ================================================ FILE: plugin-statusnotifier/statusnotifier.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifier.h" StatusNotifier::StatusNotifier(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject(), ILXQtPanelPlugin(startupInfo) { m_widget = new StatusNotifierWidget(this); } QDialog *StatusNotifier::configureDialog() { auto dialog = new StatusNotifierConfiguration(settings()); dialog->addItems(m_widget->itemTitles()); return dialog; } void StatusNotifier::realign() { m_widget->realign(); } ================================================ FILE: plugin-statusnotifier/statusnotifier.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef STATUSNOTIFIER_PLUGIN_H #define STATUSNOTIFIER_PLUGIN_H #include "../panel/ilxqtpanelplugin.h" #include "statusnotifierwidget.h" #include "statusnotifierconfiguration.h" class StatusNotifier : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: StatusNotifier(const ILXQtPanelPluginStartupInfo &startupInfo); bool isSeparate() const override { return true; } void realign() override; QString themeId() const override { return QStringLiteral("StatusNotifier"); } Flags flags() const override { return HaveConfigDialog | NeedsHandle; } QWidget *widget() override { return m_widget; } QDialog *configureDialog() override; void settingsChanged() override { m_widget->settingsChanged(); } private: StatusNotifierWidget *m_widget; }; class StatusNotifierLibrary : public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new StatusNotifier(startupInfo); } }; #endif // STATUSNOTIFIER_PLUGIN_H ================================================ FILE: plugin-statusnotifier/statusnotifierbutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifierbutton.h" #include #include #include #include "../panel/ilxqtpanelplugin.h" #include "sniasync.h" #include namespace { /*! \brief specialized DBusMenuImporter to correctly create actions' icons based * on name */ class MenuImporter : public DBusMenuImporter { public: using DBusMenuImporter::DBusMenuImporter; protected: QIcon iconForName(const QString & name) override { return XdgIcon::fromTheme(name); } }; } StatusNotifierButton::StatusNotifierButton(QString service, QString objectPath, ILXQtPanelPlugin* plugin, QWidget *parent) : QToolButton(parent), mMenu(nullptr), mStatus(Passive), mFallbackIcon(QIcon::fromTheme(QLatin1String("application-x-executable"))), mPlugin(plugin), mAutoHide(false) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setAutoRaise(true); interface = new SniAsync(service, objectPath, QDBusConnection::sessionBus(), this); connect(interface, &SniAsync::NewIcon, this, &StatusNotifierButton::newIcon); connect(interface, &SniAsync::NewOverlayIcon, this, &StatusNotifierButton::newOverlayIcon); connect(interface, &SniAsync::NewAttentionIcon, this, &StatusNotifierButton::newAttentionIcon); connect(interface, &SniAsync::NewToolTip, this, &StatusNotifierButton::newToolTip); connect(interface, &SniAsync::NewStatus, this, &StatusNotifierButton::newStatus); // get the title only at the start because that title is used // for deciding about (auto-)hiding interface->propertyGetAsync(QLatin1String("Title"), [this] (QString value) { mTitle = value; QTimer::singleShot(0, this, [this]() { // wait for the c-tor Q_EMIT titleFound(mTitle); }); }); interface->propertyGetAsync(QLatin1String("Menu"), [this] (QDBusObjectPath path) { if (!path.path().isEmpty()) { mMenu = (new MenuImporter{interface->service(), path.path(), this})->menu(); mMenu->setObjectName(QLatin1String("StatusNotifierMenu")); } }); interface->propertyGetAsync(QLatin1String("Status"), [this] (QString status) { newStatus(status); }); interface->propertyGetAsync(QLatin1String("IconThemePath"), [this] (QString value) { //do the logic of icons after we've got the theme path refetchIcon(Active, value); refetchIcon(Passive, value); refetchIcon(NeedsAttention, value); }); newToolTip(); // The timer that hides an auto-hiding button after it gets attention: mHideTimer.setSingleShot(true); mHideTimer.setInterval(300000); connect(&mHideTimer, &QTimer::timeout, this, [this] { hide(); Q_EMIT attentionChanged(); }); } StatusNotifierButton::~StatusNotifierButton() { delete interface; } void StatusNotifierButton::newIcon() { if (!icon().isNull() && icon().name() != QLatin1String("application-x-executable")) onNeedingAttention(); interface->propertyGetAsync(QLatin1String("IconThemePath"), [this] (QString value) { refetchIcon(Passive, value); }); } void StatusNotifierButton::newOverlayIcon() { onNeedingAttention(); interface->propertyGetAsync(QLatin1String("IconThemePath"), [this] (QString value) { refetchIcon(Active, value); }); } void StatusNotifierButton::newAttentionIcon() { onNeedingAttention(); interface->propertyGetAsync(QLatin1String("IconThemePath"), [this] (QString value) { refetchIcon(NeedsAttention, value); }); } void StatusNotifierButton::refetchIcon(Status status, const QString& themePath) { QString nameProperty, pixmapProperty; if (status == Active) { nameProperty = QLatin1String("OverlayIconName"); pixmapProperty = QLatin1String("OverlayIconPixmap"); } else if (status == NeedsAttention) { nameProperty = QLatin1String("AttentionIconName"); pixmapProperty = QLatin1String("AttentionIconPixmap"); } else // status == Passive { nameProperty = QLatin1String("IconName"); pixmapProperty = QLatin1String("IconPixmap"); } interface->propertyGetAsync(nameProperty, [this, status, pixmapProperty, themePath] (QString iconName) { if (!iconName.isEmpty()) { QIcon nextIcon = QIcon::fromTheme(iconName); if (nextIcon.isNull()) { QDir themeDir(themePath); if (themeDir.exists()) { bool hasExtension = iconName.endsWith(QStringLiteral(".png")) || iconName.endsWith(QStringLiteral(".svg")) || iconName.endsWith(QStringLiteral(".xpm")); if (hasExtension) { // extension is included if (themeDir.exists(iconName)) nextIcon.addFile(themeDir.filePath(iconName)); } else { if (themeDir.exists(iconName + QStringLiteral(".png"))) nextIcon.addFile(themeDir.filePath(iconName + QStringLiteral(".png"))); if (themeDir.exists(iconName + QStringLiteral(".svg"))) nextIcon.addFile(themeDir.filePath(iconName + QStringLiteral(".svg"))); if (themeDir.exists(iconName + QStringLiteral(".xpm"))) nextIcon.addFile(themeDir.filePath(iconName + QStringLiteral(".xpm"))); } if (themeDir.cd(QStringLiteral("hicolor")) || (themeDir.cd(QStringLiteral("icons")) && themeDir.cd(QStringLiteral("hicolor")))) { const QStringList sizes = themeDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); for (const QString &dir : sizes) { const QStringList dirs = QDir(themeDir.filePath(dir)).entryList(QDir::AllDirs | QDir::NoDotAndDotDot); for (const QString &innerDir : dirs) { QString path = themeDir.absolutePath() + QLatin1Char('/') + dir + QLatin1Char('/') + innerDir + QLatin1Char('/') + iconName; if (hasExtension) { // extension is included if (QFile::exists(path)) nextIcon.addFile(path); } else { if (QFile::exists(path + QStringLiteral(".png"))) nextIcon.addFile(path + QStringLiteral(".png")); if (QFile::exists(path + QStringLiteral(".svg"))) nextIcon.addFile(path + QStringLiteral(".svg")); if (QFile::exists(path + QStringLiteral(".xpm"))) nextIcon.addFile(path + QStringLiteral(".xpm")); } } } } } } switch (status) { case Active: mOverlayIcon = nextIcon; break; case NeedsAttention: mAttentionIcon = nextIcon; break; case Passive: mIcon = nextIcon; break; } resetIcon(); } else { interface->propertyGetAsync(pixmapProperty, [this, status, pixmapProperty] (IconPixmapList iconPixmaps) { if (iconPixmaps.empty()) return; QIcon nextIcon; for (IconPixmap iconPixmap: iconPixmaps) { if (!iconPixmap.bytes.isNull()) { QImage image((uchar*) iconPixmap.bytes.data(), iconPixmap.width, iconPixmap.height, QImage::Format_ARGB32); const uchar *end = image.constBits() + image.sizeInBytes(); uchar *dest = reinterpret_cast(iconPixmap.bytes.data()); for (const uchar *src = image.constBits(); src < end; src += 4, dest += 4) qToUnaligned(qToBigEndian(qFromUnaligned(src)), dest); nextIcon.addPixmap(QPixmap::fromImage(image)); } } switch (status) { case Active: mOverlayIcon = nextIcon; break; case NeedsAttention: mAttentionIcon = nextIcon; break; case Passive: mIcon = nextIcon; break; } resetIcon(); }); } }); } void StatusNotifierButton::newToolTip() { interface->propertyGetAsync(QLatin1String("ToolTip"), [this] (ToolTip tooltip) { QString toolTipTitle = tooltip.title; if (!toolTipTitle.isEmpty()) setToolTip(toolTipTitle); else interface->propertyGetAsync(QLatin1String("Title"), [this] (QString title) { // we should get here only in case the ToolTip.title was empty if (!title.isEmpty()) setToolTip(title); }); }); } void StatusNotifierButton::newStatus(QString status) { Status newStatus; if (status == QLatin1String("Passive")) newStatus = Passive; else if (status == QLatin1String("Active")) newStatus = Active; else newStatus = NeedsAttention; if (mStatus == newStatus) return; mStatus = newStatus; if (mStatus == NeedsAttention) onNeedingAttention(); resetIcon(); } void StatusNotifierButton::contextMenuEvent(QContextMenuEvent* /*event*/) { //XXX: avoid showing of parent's context menu, we are (optionally) providing context menu on mouseReleaseEvent //QWidget::contextMenuEvent(event); } void StatusNotifierButton::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) interface->Activate(QCursor::pos().x(), QCursor::pos().y()); else if (event->button() == Qt::MiddleButton) interface->SecondaryActivate(QCursor::pos().x(), QCursor::pos().y()); else if (Qt::RightButton == event->button()) { if (mMenu) { mPlugin->willShowWindow(mMenu); mMenu->popup(mPlugin->panel()->calculatePopupWindowPos(QCursor::pos(), mMenu->sizeHint()).topLeft()); } else interface->ContextMenu(QCursor::pos().x(), QCursor::pos().y()); } QToolButton::mouseReleaseEvent(event); } void StatusNotifierButton::wheelEvent(QWheelEvent *event) { QPoint angleDelta = event->angleDelta(); Qt::Orientation orient = (qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int delta = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); interface->Scroll(delta, QStringLiteral("vertical")); } void StatusNotifierButton::resetIcon() { if (mStatus == Active && !mOverlayIcon.isNull()) setIcon(mOverlayIcon); else if (mStatus == NeedsAttention && !mAttentionIcon.isNull()) setIcon(mAttentionIcon); else if (!mIcon.isNull()) // mStatus == Passive setIcon(mIcon); else if (!mOverlayIcon.isNull()) setIcon(mOverlayIcon); else if (!mAttentionIcon.isNull()) setIcon(mAttentionIcon); else setIcon(mFallbackIcon); } void StatusNotifierButton::setAutoHide(bool autoHide, int minutes, bool forcedVisible) { if (autoHide) mHideTimer.setInterval(std::clamp(minutes, 1, 60) * 60000); if (mAutoHide != autoHide) { mAutoHide = autoHide; setVisible(!mAutoHide || forcedVisible); if (!mAutoHide) mHideTimer.stop(); } } void StatusNotifierButton::onNeedingAttention() { if (mAutoHide) { show(); mHideTimer.start(); Q_EMIT attentionChanged(); } } bool StatusNotifierButton::hasAttention() const { return mHideTimer.isActive(); } ================================================ FILE: plugin-statusnotifier/statusnotifierbutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef STATUSNOTIFIERBUTTON_H #define STATUSNOTIFIERBUTTON_H #include #include #include #include #include #include #include #include class ILXQtPanelPlugin; class SniAsync; class StatusNotifierButton : public QToolButton { Q_OBJECT public: StatusNotifierButton(QString service, QString objectPath, ILXQtPanelPlugin* plugin, QWidget *parent = nullptr); ~StatusNotifierButton(); enum Status { Passive, Active, NeedsAttention }; QString title() const { return mTitle; } bool hasAttention() const; void setAutoHide(bool autoHide, int minutes = 5, bool forcedVisible = false); signals: void titleFound(const QString &title); void attentionChanged(); public slots: void newIcon(); void newAttentionIcon(); void newOverlayIcon(); void newToolTip(); void newStatus(QString status); private: void onNeedingAttention(); SniAsync *interface; QMenu *mMenu; Status mStatus; QIcon mIcon, mOverlayIcon, mAttentionIcon, mFallbackIcon; ILXQtPanelPlugin* mPlugin; QString mTitle; bool mAutoHide; QTimer mHideTimer; protected: void contextMenuEvent(QContextMenuEvent * event); void mouseReleaseEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); void refetchIcon(Status status, const QString& themePath); void resetIcon(); }; #endif // STATUSNOTIFIERBUTTON_H ================================================ FILE: plugin-statusnotifier/statusnotifierconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifierconfiguration.h" #include "ui_statusnotifierconfiguration.h" #include #include StatusNotifierConfiguration::StatusNotifierConfiguration(PluginSettings *settings, QWidget *parent): LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::StatusNotifierConfiguration) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("StatusNotifierConfigurationWindow")); ui->setupUi(this); if (QPushButton *closeBtn = ui->buttons->button(QDialogButtonBox::Close)) closeBtn->setDefault(true); connect(ui->buttons, &QDialogButtonBox::clicked, this, &StatusNotifierConfiguration::dialogButtonsAction); ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionsClickable(false); ui->tableWidget->sortByColumn(0, Qt::AscendingOrder); loadSettings(); connect(ui->orderCB, &QCheckBox::toggled, this, &StatusNotifierConfiguration::saveSettings); connect(ui->attentionSB, &QAbstractSpinBox::editingFinished, this, &StatusNotifierConfiguration::saveSettings); } StatusNotifierConfiguration::~StatusNotifierConfiguration() { delete ui; } void StatusNotifierConfiguration::loadSettings() { ui->orderCB->setChecked(settings().value(QStringLiteral("reverseOrder"), false).toBool()); ui->attentionSB->setValue(settings().value(QStringLiteral("attentionPeriod"), 5).toInt()); mAutoHideList = settings().value(QStringLiteral("autoHideList")).toStringList(); mHideList = settings().value(QStringLiteral("hideList")).toStringList(); } void StatusNotifierConfiguration::saveSettings() { settings().setValue(QStringLiteral("reverseOrder"), ui->orderCB->isChecked()); settings().setValue(QStringLiteral("attentionPeriod"), ui->attentionSB->value()); settings().setValue(QStringLiteral("autoHideList"), mAutoHideList); settings().setValue(QStringLiteral("hideList"), mHideList); } void StatusNotifierConfiguration::addItems(const QStringList &items) { ui->tableWidget->setRowCount(items.size()); ui->tableWidget->setSortingEnabled(false); int index = 0; for (const auto &item : items) { // first column QTableWidgetItem *widgetItem = new QTableWidgetItem(item); widgetItem->setFlags(widgetItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsSelectable); ui->tableWidget->setItem(index, 0, widgetItem); // second column QComboBox *cb = new QComboBox(); cb->addItems(QStringList() << tr("Always show") << tr("Auto-hide") << tr("Always hide")); if (mAutoHideList.contains(item)) cb->setCurrentIndex(1); else if (mHideList.contains(item)) cb->setCurrentIndex(2); connect(cb, &QComboBox::currentIndexChanged, this, [this, item] (int indx) { if (indx == 0) { mAutoHideList.removeAll(item); mHideList.removeAll(item); } else if (indx == 1) { mHideList.removeAll(item); if (!mAutoHideList.contains(item)) mAutoHideList << item; } else if (indx == 2) { mAutoHideList.removeAll(item); if (!mHideList.contains(item)) mHideList << item; } saveSettings(); }); ui->tableWidget->setCellWidget(index, 1, cb); ++ index; } ui->tableWidget->setSortingEnabled(true); ui->tableWidget->horizontalHeader()->setSortIndicatorShown(false); ui->tableWidget->setCurrentCell(0, 1); } void StatusNotifierConfiguration::dialogButtonsAction(QAbstractButton *btn) { LXQtPanelPluginConfigDialog::dialogButtonsAction(btn); // also, apply the changes to the visibilities list if the Reset button is clicked QDialogButtonBox *box = qobject_cast(btn->parent()); if (box && box->buttonRole(btn) == QDialogButtonBox::ResetRole) { for (int i = 0; i < ui->tableWidget->rowCount(); ++i) { if (auto cb = qobject_cast(ui->tableWidget->cellWidget(i, 1))) { if (QTableWidgetItem *widgetItem = ui->tableWidget->item(i, 0)) { cb->blockSignals(true); // we neither change visibility lists nor save settings here if (mAutoHideList.contains(widgetItem->text())) cb->setCurrentIndex(1); else if (mHideList.contains(widgetItem->text())) cb->setCurrentIndex(2); else cb->setCurrentIndex(0); cb->blockSignals(false); } } } } } ================================================ FILE: plugin-statusnotifier/statusnotifierconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2020 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef STATUSNOTIFIERCONFIGURATION_H #define STATUSNOTIFIERCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" namespace Ui { class StatusNotifierConfiguration; } class StatusNotifierConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit StatusNotifierConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~StatusNotifierConfiguration(); void addItems(const QStringList &items); private: Ui::StatusNotifierConfiguration *ui; QStringList mAutoHideList; QStringList mHideList; void loadSettings(); void dialogButtonsAction(QAbstractButton *btn); private slots: void saveSettings(); }; #endif // STATUSNOTIFIERCONFIGURATION_H ================================================ FILE: plugin-statusnotifier/statusnotifierconfiguration.ui ================================================ StatusNotifierConfiguration 0 0 400 400 Status Notifier Settings 5 Reverse the order of items 5 An auto-hiding item will remain visible for this period if it needs attention. Attention period: An auto-hiding item will remain visible for this period if it needs attention. minute(s) 1 60 Qt::Horizontal QSizePolicy::MinimumExpanding 5 5 Change visibility of items QAbstractItemView::SingleSelection false Item Visibility Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() StatusNotifierConfiguration accept() buttons rejected() StatusNotifierConfiguration reject() ================================================ FILE: plugin-statusnotifier/statusnotifieriteminterface.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ /* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c StatusNotifierItemInterface -p statusnotifieriteminterface -i dbustypes.h dbus-ifaces/org.kde.StatusNotifierItem.xml * * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ #include "statusnotifieriteminterface.h" /* * Implementation of interface class StatusNotifierItemInterface */ StatusNotifierItemInterface::StatusNotifierItemInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) { } StatusNotifierItemInterface::~StatusNotifierItemInterface() = default; ================================================ FILE: plugin-statusnotifier/statusnotifieriteminterface.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ /* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c StatusNotifierItemInterface -p statusnotifieriteminterface -i dbustypes.h dbus-ifaces/org.kde.StatusNotifierItem.xml * * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ #ifndef STATUSNOTIFIERITEMINTERFACE_H #define STATUSNOTIFIERITEMINTERFACE_H #include #include #include #include #include #include #include #include #include "dbustypes.h" /* * Proxy class for interface org.kde.StatusNotifierItem */ class StatusNotifierItemInterface: public QDBusAbstractInterface { Q_OBJECT public: static inline const char *staticInterfaceName() { return "org.kde.StatusNotifierItem"; } public: StatusNotifierItemInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~StatusNotifierItemInterface(); Q_PROPERTY(QString AttentionIconName READ attentionIconName) inline QString attentionIconName() const { return qvariant_cast< QString >(property("AttentionIconName")); } Q_PROPERTY(IconPixmapList AttentionIconPixmap READ attentionIconPixmap) inline IconPixmapList attentionIconPixmap() const { return qvariant_cast< IconPixmapList >(property("AttentionIconPixmap")); } Q_PROPERTY(QString AttentionMovieName READ attentionMovieName) inline QString attentionMovieName() const { return qvariant_cast< QString >(property("AttentionMovieName")); } Q_PROPERTY(QString Category READ category) inline QString category() const { return qvariant_cast< QString >(property("Category")); } Q_PROPERTY(QString IconName READ iconName) inline QString iconName() const { return qvariant_cast< QString >(property("IconName")); } Q_PROPERTY(IconPixmapList IconPixmap READ iconPixmap) inline IconPixmapList iconPixmap() const { return qvariant_cast< IconPixmapList >(property("IconPixmap")); } Q_PROPERTY(QString IconThemePath READ iconThemePath) inline QString iconThemePath() const { return qvariant_cast< QString >(property("IconThemePath")); } Q_PROPERTY(QString Id READ id) inline QString id() const { return qvariant_cast< QString >(property("Id")); } Q_PROPERTY(bool ItemIsMenu READ itemIsMenu) inline bool itemIsMenu() const { return qvariant_cast< bool >(property("ItemIsMenu")); } Q_PROPERTY(QDBusObjectPath Menu READ menu) inline QDBusObjectPath menu() const { return qvariant_cast< QDBusObjectPath >(property("Menu")); } Q_PROPERTY(QString OverlayIconName READ overlayIconName) inline QString overlayIconName() const { return qvariant_cast< QString >(property("OverlayIconName")); } Q_PROPERTY(IconPixmapList OverlayIconPixmap READ overlayIconPixmap) inline IconPixmapList overlayIconPixmap() const { return qvariant_cast< IconPixmapList >(property("OverlayIconPixmap")); } Q_PROPERTY(QString Status READ status) inline QString status() const { return qvariant_cast< QString >(property("Status")); } Q_PROPERTY(QString Title READ title) inline QString title() const { return qvariant_cast< QString >(property("Title")); } Q_PROPERTY(ToolTip ToolTip READ toolTip) inline ToolTip toolTip() const { return qvariant_cast< ToolTip >(property("ToolTip")); } Q_PROPERTY(int WindowId READ windowId) inline int windowId() const { return qvariant_cast< int >(property("WindowId")); } public Q_SLOTS: // METHODS inline QDBusPendingReply<> Activate(int x, int y) { QList argumentList; argumentList << QVariant::fromValue(x) << QVariant::fromValue(y); return asyncCallWithArgumentList(QLatin1String("Activate"), argumentList); } inline QDBusPendingReply<> ContextMenu(int x, int y) { QList argumentList; argumentList << QVariant::fromValue(x) << QVariant::fromValue(y); return asyncCallWithArgumentList(QLatin1String("ContextMenu"), argumentList); } inline QDBusPendingReply<> Scroll(int delta, const QString &orientation) { QList argumentList; argumentList << QVariant::fromValue(delta) << QVariant::fromValue(orientation); return asyncCallWithArgumentList(QLatin1String("Scroll"), argumentList); } inline QDBusPendingReply<> SecondaryActivate(int x, int y) { QList argumentList; argumentList << QVariant::fromValue(x) << QVariant::fromValue(y); return asyncCallWithArgumentList(QLatin1String("SecondaryActivate"), argumentList); } Q_SIGNALS: // SIGNALS void NewAttentionIcon(); void NewIcon(); void NewOverlayIcon(); void NewStatus(const QString &status); void NewTitle(); void NewToolTip(); }; namespace org { namespace kde { typedef ::StatusNotifierItemInterface StatusNotifierItem; } } #endif ================================================ FILE: plugin-statusnotifier/statusnotifierproxy.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifierproxy.h" #include "statusnotifierwatcher.h" #include #include #include #include #include Q_GLOBAL_STATIC(StatusNotifierProxy, statusNotifierProxy) StatusNotifierProxy::StatusNotifierProxy() : mWatcher{nullptr}, mUsersCount{0} { } void StatusNotifierProxy::createWatcher() { QFutureWatcher * future_watcher = new QFutureWatcher; connect(future_watcher, &QFutureWatcher::finished, this, [this, future_watcher] { mWatcher.reset(future_watcher->future().result()); connect(mWatcher.get(), &StatusNotifierWatcher::StatusNotifierItemRegistered, this, &StatusNotifierProxy::StatusNotifierItemRegistered); connect(mWatcher.get(), &StatusNotifierWatcher::StatusNotifierItemUnregistered, this, &StatusNotifierProxy::StatusNotifierItemUnregistered); qDebug() << "StatusNotifierProxy, services:" << mWatcher->RegisteredStatusNotifierItems(); future_watcher->deleteLater(); }); QFuture future = QtConcurrent::run([] { QString dbusName = QStringLiteral("org.kde.StatusNotifierHost-%1-%2").arg(QApplication::applicationPid()).arg(1); if (QDBusConnectionInterface::ServiceNotRegistered == QDBusConnection::sessionBus().interface()->registerService(dbusName, QDBusConnectionInterface::DontQueueService)) qDebug() << "unable to register service for " << dbusName; StatusNotifierWatcher * watcher = new StatusNotifierWatcher; watcher->RegisterStatusNotifierHost(dbusName); watcher->moveToThread(QApplication::instance()->thread()); return watcher; }); future_watcher->setFuture(future); } QStringList StatusNotifierProxy::RegisteredStatusNotifierItems() const { Q_ASSERT(mUsersCount > 0); return mWatcher ? mWatcher->RegisteredStatusNotifierItems() : QStringList{}; } StatusNotifierProxy & StatusNotifierProxy::registerLifetimeUsage(QObject * obj) { StatusNotifierProxy & p = *statusNotifierProxy(); p.registerUsage(obj); return p; } void StatusNotifierProxy::registerUsage(QObject * obj) { connect(obj, &QObject::destroyed, this, &StatusNotifierProxy::unregisterUsage); if (mUsersCount <= 0) createWatcher(); ++mUsersCount; } void StatusNotifierProxy::unregisterUsage() { --mUsersCount; if (mUsersCount <= 0) { mWatcher.reset(); } } ================================================ FILE: plugin-statusnotifier/statusnotifierproxy.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2021 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include class StatusNotifierWidget; class StatusNotifierWatcher; class StatusNotifierProxy : public QObject { Q_OBJECT public: StatusNotifierProxy(); ~StatusNotifierProxy() = default; QStringList RegisteredStatusNotifierItems() const; static StatusNotifierProxy & registerLifetimeUsage(QObject * obj); private: std::unique_ptr mWatcher; int mUsersCount; void createWatcher(); void registerUsage(QObject * obj); void unregisterUsage(); signals: void StatusNotifierItemRegistered(const QString &service); void StatusNotifierItemUnregistered(const QString &service); }; ================================================ FILE: plugin-statusnotifier/statusnotifierwatcher.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifierwatcher.h" #include #include StatusNotifierWatcher::StatusNotifierWatcher(QObject *parent) : QObject(parent) { qRegisterMetaType("IconPixmap"); qDBusRegisterMetaType(); qRegisterMetaType("IconPixmapList"); qDBusRegisterMetaType(); qRegisterMetaType("ToolTip"); qDBusRegisterMetaType(); QDBusConnection dbus = QDBusConnection::sessionBus(); switch (dbus.interface()->registerService(QStringLiteral("org.kde.StatusNotifierWatcher"), QDBusConnectionInterface::QueueService).value()) { case QDBusConnectionInterface::ServiceNotRegistered: qWarning() << "StatusNotifier: unable to register service for org.kde.StatusNotifierWatcher"; break; case QDBusConnectionInterface::ServiceQueued: qWarning() << "StatusNotifier: registration of service org.kde.StatusNotifierWatcher queued, we can become primary after existing one deregisters"; break; case QDBusConnectionInterface::ServiceRegistered: break; } if (!dbus.registerObject(QStringLiteral("/StatusNotifierWatcher"), this, QDBusConnection::ExportScriptableContents)) qDebug() << QDBusConnection::sessionBus().lastError().message(); mWatcher = new QDBusServiceWatcher(this); mWatcher->setConnection(dbus); mWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration); connect(mWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &StatusNotifierWatcher::serviceUnregistered); } StatusNotifierWatcher::~StatusNotifierWatcher() { QDBusConnection::sessionBus().unregisterService(QStringLiteral("org.kde.StatusNotifierWatcher")); } void StatusNotifierWatcher::RegisterStatusNotifierItem(const QString &serviceOrPath) { QString service = serviceOrPath; QString path = QStringLiteral("/StatusNotifierItem"); // workaround for sni-qt if (service.startsWith(QLatin1Char('/'))) { path = service; service = message().service(); } QString notifierItemId = service + path; if (QDBusConnection::sessionBus().interface()->isServiceRegistered(service).value() && !mServices.contains(notifierItemId)) { mServices << notifierItemId; mWatcher->addWatchedService(service); emit StatusNotifierItemRegistered(notifierItemId); } } void StatusNotifierWatcher::RegisterStatusNotifierHost(const QString &service) { if (!mHosts.contains(service)) { mHosts.append(service); mWatcher->addWatchedService(service); } } void StatusNotifierWatcher::serviceUnregistered(const QString &service) { qDebug() << "Service" << service << "unregistered"; mWatcher->removeWatchedService(service); if (mHosts.contains(service)) { mHosts.removeAll(service); return; } QString match = service + QLatin1Char('/'); QStringList::Iterator it = mServices.begin(); while (it != mServices.end()) { if (it->startsWith(match)) { QString name = *it; it = mServices.erase(it); emit StatusNotifierItemUnregistered(name); } else ++it; } } ================================================ FILE: plugin-statusnotifier/statusnotifierwatcher.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef STATUSNOTIFIERWATCHER_H #define STATUSNOTIFIERWATCHER_H #include #include #include #include #include #include "dbustypes.h" class StatusNotifierWatcher : public QObject, protected QDBusContext { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.StatusNotifierWatcher") Q_SCRIPTABLE Q_PROPERTY(bool IsStatusNotifierHostRegistered READ isStatusNotifierHostRegistered) Q_SCRIPTABLE Q_PROPERTY(int ProtocolVersion READ protocolVersion) Q_SCRIPTABLE Q_PROPERTY(QStringList RegisteredStatusNotifierItems READ RegisteredStatusNotifierItems) public: explicit StatusNotifierWatcher(QObject *parent = nullptr); ~StatusNotifierWatcher(); bool isStatusNotifierHostRegistered() { return mHosts.count() > 0; } int protocolVersion() const { return 0; } QStringList RegisteredStatusNotifierItems() const { return mServices; } signals: Q_SCRIPTABLE void StatusNotifierItemRegistered(const QString &service); Q_SCRIPTABLE void StatusNotifierItemUnregistered(const QString &service); Q_SCRIPTABLE void StatusNotifierHostRegistered(); public slots: Q_SCRIPTABLE void RegisterStatusNotifierItem(const QString &serviceOrPath); Q_SCRIPTABLE void RegisterStatusNotifierHost(const QString &service); void serviceUnregistered(const QString &service); private: QStringList mServices; QStringList mHosts; QDBusServiceWatcher *mWatcher; }; #endif // STATUSNOTIFIERWATCHER_H ================================================ FILE: plugin-statusnotifier/statusnotifierwidget.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "statusnotifierwidget.h" #include "statusnotifierproxy.h" #include "../panel/pluginsettings.h" #include "../panel/ilxqtpanelplugin.h" StatusNotifierWidget::StatusNotifierWidget(ILXQtPanelPlugin *plugin, QWidget *parent) : QWidget(parent), mPlugin(plugin), mAttentionPeriod(5), mForceVisible(false) { setLayout(new LXQt::GridLayout(this)); // The button that shows all hidden items: mShowBtn = new QToolButton(this); mShowBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mShowBtn->setAutoRaise(true); mShowBtn->setToolButtonStyle(Qt::ToolButtonTextOnly); mShowBtn->setText(QStringLiteral("+")); layout()->addWidget(mShowBtn); mShowBtn->hide(); connect(mShowBtn, &QAbstractButton::clicked, this, [this] { if (mForceVisible) return; // all items are visible; nothing to do mShowBtn->hide(); mHideTimer.stop(); mForceVisible = true; const auto allButtons = findChildren(QString(), Qt::FindDirectChildrenOnly); for (const auto &btn : allButtons) btn->show(); }); settingsChanged(); // The timer that hides (auto-)hidden items after 2 seconds: mHideTimer.setSingleShot(true); mHideTimer.setInterval(2000); connect(&mHideTimer, &QTimer::timeout, this, [this] { mShowBtn->show(); mForceVisible = false; const auto allButtons = findChildren(QString(), Qt::FindDirectChildrenOnly); for (const auto &btn : allButtons) { if (btn->hasAttention() || (!mAutoHideList.contains(btn->title()) && !mHideList.contains(btn->title()))) { continue; } btn->hide(); } }); realign(); StatusNotifierProxy & proxy = StatusNotifierProxy::registerLifetimeUsage(this); connect(&proxy, &StatusNotifierProxy::StatusNotifierItemRegistered, this, &StatusNotifierWidget::itemAdded); connect(&proxy, &StatusNotifierProxy::StatusNotifierItemUnregistered, this, &StatusNotifierWidget::itemRemoved); for (const auto & service: proxy.RegisteredStatusNotifierItems()) itemAdded(service); } void StatusNotifierWidget::leaveEvent(QEvent * /*event*/) { if (mForceVisible) mHideTimer.start(); } void StatusNotifierWidget::enterEvent(QEnterEvent * /*event*/) { mHideTimer.stop(); } void StatusNotifierWidget::itemAdded(QString serviceAndPath) { int slash = serviceAndPath.indexOf(QLatin1Char('/')); QString serv = serviceAndPath.left(slash); QString path = serviceAndPath.mid(slash); StatusNotifierButton *button = new StatusNotifierButton(serv, path, mPlugin, this); mServices.insert(serviceAndPath, button); layout()->addWidget(button); button->show(); // show/hide the added item appropriately and show mShowBtn if needed connect(button, &StatusNotifierButton::titleFound, this, [this, button] (const QString &title) { mItemTitles << title; if (mAutoHideList.contains(title)) { if (!mForceVisible) mShowBtn->show(); button->setAutoHide(true, mAttentionPeriod, mForceVisible); } else if (mHideList.contains(title)) { button->setAutoHide(false); if (!mForceVisible) { mShowBtn->show(); button->hide(); } } }); // show/hide mShowBtn if needed whenever an item gets or loses attention connect(button, &StatusNotifierButton::attentionChanged, mShowBtn, [this, button] { if (button->hasAttention()) { if (mShowBtn->isVisible() || mForceVisible) { const auto allButtons = findChildren(QString(), Qt::FindDirectChildrenOnly); for (const auto &btn : allButtons) { if (!btn->isVisible() // or shown only because mShowBtn was clicked || (mForceVisible && !btn->hasAttention() && (mAutoHideList.contains(btn->title()) || mHideList.contains(btn->title())))) { return; } } // there is no item in the hiding list and all auto-hiding items have attention; // so, mShowBtn has no job mHideTimer.stop(); mForceVisible = false; mShowBtn->hide(); } } else // the auto-hiding item lost attention { if (!mForceVisible) mShowBtn->show(); } }); } void StatusNotifierWidget::itemRemoved(const QString &serviceAndPath) { StatusNotifierButton *button = mServices.value(serviceAndPath, nullptr); if (button) { mItemTitles.removeOne(button->title()); if (mShowBtn->isVisible() || mForceVisible) { // hide mShowBtn if no (auto-)hidden item remains bool showBtn = false; for (const auto &name : std::as_const(mItemTitles)) { if (mAutoHideList.contains(name) || mHideList.contains(name)) { showBtn = true; break; } } if (!showBtn) { mHideTimer.stop(); mForceVisible = false; mShowBtn->hide(); } } button->deleteLater(); layout()->removeWidget(button); mServices.remove(serviceAndPath); } } void StatusNotifierWidget::settingsChanged() { LXQt::GridLayout *layout = qobject_cast(this->layout()); if (mPlugin->settings()->value(QStringLiteral("reverseOrder"), false).toBool()) { layout->setItemsOrder(LXQt::GridLayout::ItemsOrder::LastToFirst); } else { layout->setItemsOrder(LXQt::GridLayout::ItemsOrder::FirstToLast); } mAttentionPeriod = mPlugin->settings()->value(QStringLiteral("attentionPeriod"), 5).toInt(); mAutoHideList = mPlugin->settings()->value(QStringLiteral("autoHideList")).toStringList(); mHideList = mPlugin->settings()->value(QStringLiteral("hideList")).toStringList(); // show/hide items as well as showBtn appropriately const auto allButtons = findChildren(QString(), Qt::FindDirectChildrenOnly); bool showBtn = false; for (const auto &btn : allButtons) { if (mAutoHideList.contains(btn->title())) { btn->setAutoHide(true, mAttentionPeriod); if (!btn->isVisible() // or shown only because mShowBtn was clicked || !btn->hasAttention()) { showBtn = true; } } else if (mHideList.contains(btn->title())) { showBtn = true; btn->setAutoHide(false); btn->hide(); } else { btn->setAutoHide(false); btn->show(); // may have been in mHideList before } } if (!showBtn) { mHideTimer.stop(); mForceVisible = false; mShowBtn->hide(); } else if (!mForceVisible) mShowBtn->show(); } void StatusNotifierWidget::realign() { LXQt::GridLayout *layout = qobject_cast(this->layout()); layout->setEnabled(false); ILXQtPanel *panel = mPlugin->panel(); if (panel->isHorizontal()) { layout->setRowCount(panel->lineCount()); layout->setColumnCount(0); } else { layout->setColumnCount(panel->lineCount()); layout->setRowCount(0); } layout->setEnabled(true); } QStringList StatusNotifierWidget::itemTitles() const { QStringList names = mItemTitles; names.removeDuplicates(); return names; } ================================================ FILE: plugin-statusnotifier/statusnotifierwidget.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 LXQt team * Authors: * Balázs Béla * Paulo Lieuthier * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include "statusnotifierbutton.h" class StatusNotifierProxy; class StatusNotifierWidget : public QWidget { Q_OBJECT public: StatusNotifierWidget(ILXQtPanelPlugin *plugin, QWidget *parent = nullptr); ~StatusNotifierWidget() = default; void settingsChanged(); QStringList itemTitles() const; signals: public slots: void itemAdded(QString serviceAndPath); void itemRemoved(const QString &serviceAndPath); void realign(); protected: void leaveEvent(QEvent *event) override; void enterEvent(QEnterEvent *event) override; private: ILXQtPanelPlugin *mPlugin; QTimer mHideTimer; QHash mServices; QStringList mItemTitles; QStringList mAutoHideList; QStringList mHideList; QToolButton *mShowBtn; int mAttentionPeriod; bool mForceVisible; }; ================================================ FILE: plugin-statusnotifier/translations/statusnotifier.desktop.yaml ================================================ Desktop Entry/Name: "Status Notifier" Desktop Entry/Comment: "Provides the notification area (aka systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ar.desktop.yaml ================================================ Desktop Entry/Name: "ملحقة لمُخطر الحالة" Desktop Entry/Comment: "يوفر منطقة الإعلام (الملقب systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ar.ts ================================================ StatusNotifierConfiguration Status Notifier Settings إعدادات منبه الحالة Reverse the order of items عكس ترتيب العناصر An auto-hiding item will remain visible for this period if it needs attention. سيظل عنصر الإخفاء التلقائي مرئيًا لهذه الفترة إذا كان بحاجة إلى الاهتمام. Attention period: فترة الانتباه: minute(s) دق Change visibility of items تغيير رؤية العناصر Item عنصر Visibility الرؤية Always show إظهار دوماً Auto-hide اخفاء تلقائي Always hide اخفي دائما ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_arn.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ast.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_bg.desktop.yaml ================================================ Desktop Entry/Name: "Област на системни известия" Desktop Entry/Comment: "Показване на системни известия ( т.нар. систрей)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_bg.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Настройки на системните известия Reverse the order of items Обратно подреждане на елементите An auto-hiding item will remain visible for this period if it needs attention. Елемент с автоматично скриване, ако изисква внимание, ще остане видим за този период от време. Attention period: Период на активност: minute(s) минути Change visibility of items Промяна на видимост на елемент Item Елемент Visibility Видимост Always show Винаги да се показва Auto-hide Автоматично скриване Always hide Винаги да се скрива ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ca.desktop.yaml ================================================ Desktop Entry/Name: "Connector de notificacions d'estat" Desktop Entry/Comment: "Proporciona l'àrea de notificació (safata del sistema)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ca.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Paràmetres del notificador d'estat Reverse the order of items Inverteix l'ordre dels elements An auto-hiding item will remain visible for this period if it needs attention. Un element d'ocultació automàtica romandrà visible durant aquest període si necessita atenció. Attention period: Període d'atenció: minute(s) minut(s) Change visibility of items Canvia la visibilitat dels elements Item Element Visibility Visibilitat Always show Mostra sempre Auto-hide Oculta automàticament Always hide Oculta sempre ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_cs.desktop.yaml ================================================ Desktop Entry/Name: "Stavové zprávy" Desktop Entry/Comment: "Zásuvný modul poskytující oznamovací oblast (systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_cs.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Nastavení oznamování stavu Reverse the order of items Obrátit pořadí položek An auto-hiding item will remain visible for this period if it needs attention. Automaticky skrývaná položka zůstane po tuto dobu viditelná, pokud položka vyžaduje pozornost. Attention period: Doba pozornosti: minute(s) minut(a) Change visibility of items Změnit viditelnost položek Item Položka Visibility Viditelnost Always show Ukázat vždy Auto-hide Automaticky skrývat Always hide Skrýt vždy ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_cy.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_da.desktop.yaml ================================================ Desktop Entry/Name: "Statusunderretter" Desktop Entry/Comment: "Giver underretningsområdet (også kendt som systembakke)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_da.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Indstillinger for statusunderretter Reverse the order of items Vend rækkefølge af elementer An auto-hiding item will remain visible for this period if it needs attention. Et element som skjules automatisk forbliver synlig i denne periode hvis det behøver opmærksomhed. Attention period: Opmærksomhedsperiode: minute(s) minut(ter) Change visibility of items Skift synligheden af elementer Item Element Visibility Synlighed Always show Vis altid Auto-hide Skjul automatisk Always hide Skjul altid ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_de.desktop.yaml ================================================ Desktop Entry/Name: "Statusbenachrichtigungen" Desktop Entry/Comment: "Plugin für Statusbenachrichtigungen" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_de.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Einstellungen Statusmeldungen Reverse the order of items Reihenfolge der Elemente umkehren An auto-hiding item will remain visible for this period if it needs attention. Eine automatisch verschwindende wichtige Meldung bleibt für diesen Zeitraum sichtbar. Attention period: Benachrichtigungszeitraum: minute(s) Minute(n) Change visibility of items Ändere Sichtbarkeit der Einträge Item Eintrag Visibility Sichtbarkeit Always show Immer sichtbar Auto-hide Automatisch verbergen Always hide Immer verbergen ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_el.desktop.yaml ================================================ Desktop Entry/Name: "Πρόσθετο ειδοποίησης κατάστασης" Desktop Entry/Comment: "Η περιοχή ειδοποιήσεων πλαισίου συστήματος" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_el.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Ρυθμίσεις εφαρμογής ειδοποιήσεων κατάστασης Reverse the order of items Αντιστροφή της σειράς των στοιχείων An auto-hiding item will remain visible for this period if it needs attention. Ένα στοιχείο αυτόματης απόκρυψης θα παραμείνει ορατό για αυτή την περίοδο εάν χρήζει προσήλωσης. Attention period: Περίοδος προσήλωσης: minute(s) λεπτό(ά) Change visibility of items Αλλαγή ορατότητας στοιχείων Item Στοιχείο Visibility Ορατότητα Always show Πάντα εμφάνιση Auto-hide Αυτόματη απόκρυψη Always hide Πάντα απόκρυψη ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Status Notifier" Desktop Entry/Comment: "Provides the notification area (aka systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_en_GB.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Status Notifier Settings Reverse the order of items Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. An auto-hiding item will remain visible for this period if it needs attention. Attention period: Attention period: minute(s) minute(s) Change visibility of items Change visibility of items Item Item Visibility Visibility Always show Always show Auto-hide Auto-hide Always hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_es.desktop.yaml ================================================ Desktop Entry/Name: "Complemento de notificaciones de estado" Desktop Entry/Comment: "Brinda el área de notificaciones (conocida también como bandeja\ \ del sistema)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_et.desktop.yaml ================================================ Desktop Entry/Name: "Olekuteataja" Desktop Entry/Comment: "Teadete ja teatiste vidin (tuntud ka kui süsteemisalv)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_et.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Olekuteatiste seadistused Reverse the order of items Pööra kirjete järjekord An auto-hiding item will remain visible for this period if it needs attention. Kui teavitus eeldab tegevust, siis automaatselt peidetavad kirjed jäävad nii kauaks nähtavaks. Attention period: Kuvamise aeg tähelepanu saamiseks: minute(s) minut(it) Change visibility of items Muuda kirjete nähtavust Item Rakendus Visibility Nähtavus Always show Näita alati Auto-hide Peida automaatselt Always hide Alati peida ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_fi.desktop.yaml ================================================ Desktop Entry/Name: "Tilailmoitin" Desktop Entry/Comment: "Muodostaa ilmoitusalueen (ts. systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_fi.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Tilailmoittimen asetukset Reverse the order of items Käänteinen kohteiden järjestys An auto-hiding item will remain visible for this period if it needs attention. Automaattisesti piiloutuva kohde näytetään tämän ajan, kunnes se huomioidaan. Attention period: Huomioaika: minute(s) minuutti(a) Change visibility of items Määritä kohteiden näkyvyys Item Kohde Visibility Näkyvyys Always show Näytä aina Auto-hide Piilota automaattisesti Always hide Piilota aina ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_fr.desktop.yaml ================================================ Desktop Entry/Name: "Information du statut" Desktop Entry/Comment: "Greffon d'information du statut" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_fr.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Paramètres d'information du statut Reverse the order of items Inverser l'ordre des items An auto-hiding item will remain visible for this period if it needs attention. Un élément à masquage automatique restera visible pendant cette période s'il nécessite une attention particulière. Attention period: Période d'attention : minute(s) minute(s) Change visibility of items Modifier la visibilité des éléments Item Élément Visibility Visibilité Always show Toujours visible Auto-hide Masquer automatiquement Always hide Toujours caché ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_gl.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_he.desktop.yaml ================================================ Desktop Entry/Name: "התראות מצב" Desktop Entry/Comment: "מספק את אזור ההתראות (ידוע גם בשם מגש המערכת)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_he.ts ================================================ StatusNotifierConfiguration Status Notifier Settings הגדרות מודיע מצבים Reverse the order of items היפוך סדר הפריטים An auto-hiding item will remain visible for this period if it needs attention. פריט שמסתתר אוטומטית יישאר גלוי למשך הזמן הזה אם נדרשת התייחסות. Attention period: תקופת ההתייחסות: minute(s) דקות Change visibility of items החלפת מצב חשיפה של פריטים Item פריט Visibility נראות Always show להציג תמיד Auto-hide הסתרה אוטומטית Always hide להסתיר תמיד ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_hr.desktop.yaml ================================================ Desktop Entry/Name: "Obavijesti o stanju" Desktop Entry/Comment: "Pruža područje za obavijesti (poznato kao programska traka)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_hr.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Obavijesti o stanju – postavke Reverse the order of items Preokreni redoslijed stavki An auto-hiding item will remain visible for this period if it needs attention. Automatski skrivajući element ostat će vidljiv ovoliko dugo ako zahtijeva pažnju. Attention period: Vrijeme pažnje: minute(s) min Change visibility of items Promijeni vidljivost Item Element Visibility Vidljivost Always show Uvijek prikaži Auto-hide Automatski sakrij Always hide Uvijek sakrij ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_hu.desktop.yaml ================================================ Desktop Entry/Name: "Állapotjelzés" Desktop Entry/Comment: "Állapotértesítő bővítmény" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_hu.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Állapotjelző beállítások Reverse the order of items Az elemek sorrendjének megfordítása An auto-hiding item will remain visible for this period if it needs attention. Az automatikus rejtett elem ebben az időszakban látható marad, ha figyelmet igényel. Attention period: Figyelemidő: minute(s) perc Change visibility of items Elemek láthatóságának változtatása Item Elem Visibility Láthatóság Always show Megjelenítés mindig Auto-hide Automatikus elrejtés Always hide Elrejtés mindig ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_it.desktop.yaml ================================================ Desktop Entry/Name: "Area di notifiche" Desktop Entry/Comment: "Fornisce l'area di notifica (vassoio)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_it.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Impostazioni di Status Notifier Reverse the order of items Ordine inverso per gli elementi An auto-hiding item will remain visible for this period if it needs attention. Un applicazione che si nasconde automaticamente rimarrà visibile per questo periodo se necessita di attenzione. Attention period: Periodo di attenzione: minute(s) minuti Change visibility of items Cambia visibilità delle applicazioni Item Applicazione Visibility Visibilità Always show Mostra sempre Auto-hide Nascondi automaticamente Always hide Nascondi sempre ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ja.desktop.yaml ================================================ Desktop Entry/Name: "ステータス通知" Desktop Entry/Comment: "通知領域を確保します (別名 システムトレイ)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ja.ts ================================================ StatusNotifierConfiguration Status Notifier Settings ステータス通知の設定 Reverse the order of items 項目の順序を逆にする An auto-hiding item will remain visible for this period if it needs attention. 注意が必要な場合、自動的に隠されるアイテムがこの時間表示されたままになります。 Attention period: 注意の時間: minute(s) Change visibility of items アイテムの表示設定を変更します Item アイテム Visibility 表示設定 Always show 常に表示する Auto-hide 自動的に隠す Always hide 常に隠す ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ka.desktop.yaml ================================================ Desktop Entry/Name: "სტატუსის გაფრთხილება" Desktop Entry/Comment: "გაჩვენებთ გაფრთხილებების ადგილს (ანუ სისტემის კუთხეს)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ka.ts ================================================ StatusNotifierConfiguration Status Notifier Settings სტატუსის გაფრთხილების მორგება Reverse the order of items ელემენტების მიმდევრობის შებრუნება An auto-hiding item will remain visible for this period if it needs attention. ავტოდამალული ელემენტი ხილული დარჩება ამ პერიოდით, თუ მას ყურადღება სჭირდება. Attention period: ყურადღების პერიოდი: minute(s) წთ Change visibility of items ელემენტების ხილვადობის შეცვლა Item ელემენტი Visibility ხილვადობა Always show ყოველთვის ჩვენება Auto-hide ავტოდამალვა Always hide ყოველთვის დამალვა ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_kk.desktop.yaml ================================================ Desktop Entry/Name: "Хабарландырулар плагині" Desktop Entry/Comment: "Хабарландырулар аймағын жасайды (жүйелік трей)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_kk.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Күй хабарландырушысының баптаулары Reverse the order of items Элементтердің ретін кері өзгерту An auto-hiding item will remain visible for this period if it needs attention. Автоматты түрде жасырылатын элемент, егер назар аударуды талап етсе, осы уақыт бойы көрініп тұрады. Attention period: Назар аудару кезеңі: minute(s) минут Change visibility of items Элементтердің көрінуін өзгерту Item Элемент Visibility Көрінуі Always show Әрқашан көрсету Auto-hide Автоматты түрде жасыру Always hide Әрқашан жасыру ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ko.desktop.yaml ================================================ Desktop Entry/Name: "상태 알림이" Desktop Entry/Comment: "알림 영역 제공(일명 systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ko.ts ================================================ StatusNotifierConfiguration Status Notifier Settings 상태 알림이 설정 Reverse the order of items 항목의 순서 반대로 바꾸기 An auto-hiding item will remain visible for this period if it needs attention. 자동 숨김 항목은 주목이 필요한 경우 이 시간 동안 계속 표시됩니다. Attention period: 주목 시간: minute(s) Change visibility of items 항목의 가시성 변경 Item 항목 Visibility 가시성 Always show 항상 표시 Auto-hide 자동 숨김 Always hide 항상 숨김 ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kamanyisa Mbeera" Desktop Entry/Comment: "Kano kateekawo ekifo ku lubaawo omulabikira bubaka obukwata ku mbeera ya sisitemu ne puloguramu" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lg.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Enteekateeka za kamanyisa mbeera Reverse the order of items Vuunika ensengeka y'ebiragibwa An auto-hiding item will remain visible for this period if it needs attention. Kino kye kiseera obubabaka obuvaawo bwokka kye bunaamalanga nga bulabika. Attention period: Ekiseera obubaka kye bulabikira: minute(s) dakiika Change visibility of items Kyusa obubaka lwe bulagibwa Item Obubaka Visibility Lwe bulagibwa Always show Bulijjo Auto-hide Kiseerabuseera Always hide Buleme okulagibwa ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lt.desktop.yaml ================================================ Desktop Entry/Name: "Būsenos pranešimų įskiepis" Desktop Entry/Comment: "Pateikia pranešimų sritį (dar žinomą kaip sistemos dėklas)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lt.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Būsenos pranešimų nustatymai Reverse the order of items Atvirkštinė elementų tvarka An auto-hiding item will remain visible for this period if it needs attention. Automatiškai besislepiantis elementas šį laiko tarpą išliks matomu, jei reikalaus dėmesio. Attention period: Dėmesio laikotarpis: minute(s) min. Change visibility of items Keisti elementų matomumą Item Elementas Visibility Matomumas Always show Visada rodyti Auto-hide Automatiškai slėpti Always hide Visada slėpti ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lv.desktop.yaml ================================================ Desktop Entry/Name: "Statusa paziņotājs - spraudnis" Desktop Entry/Comment: "Izveido paziņojumu lauku (aka sistēmas treju/tekni)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_lv.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Statusa paziņotāja iestatījumi Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Automātiski paslēpjamais elements būs redzams šo laika sprīdi, ja tam būs nepieciešama uzmanība. Attention period: Uzmanības periods: minute(s) minūte(s) Change visibility of items Mainīt elementu redzamību Item Elements Visibility Redzamība Always show Rādīt vienmēr Auto-hide Automātiski paslēpt Always hide Paslēpt vienmēr ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Statusvarsler" Desktop Entry/Comment: "Gir varslingsområdet (også kjent som systemkurven)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_nb_NO.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Statusvarslingsinnstillinger Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Et automatisk skjult element vil forbli synlig i denne tidsperioden hvis det trenger oppmerksomhet. Attention period: Oppmerksomhetsperiode: minute(s) minutt(er) Change visibility of items Endre elementsynlighet Item Element Visibility Synlighet Always show Alltid vis Auto-hide Auto-skjul Always hide Alltid skjul ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_nl.desktop.yaml ================================================ Desktop Entry/Name: "Systeemvak" Desktop Entry/Comment: "Systeemvak-invoegtoepassing" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_nl.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Systeemvakinstellingen Reverse the order of items Itemvolgorde omdraaien An auto-hiding item will remain visible for this period if it needs attention. Een item dat automatisch wordt verborgen blijft zichtbaar voor deze duur als er een actie benodigd is. Attention period: Actieperiode: minute(s) minu(u)t(en) Change visibility of items Zichtbaarheid van items aanpassen Item Item Visibility Zichtbaarheid Always show Altijd tonen Auto-hide Automatisch verbergen Always hide Altijd verbergen ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_oc.desktop.yaml ================================================ Desktop Entry/Name: "Connector de notificacions d’estat" Desktop Entry/Comment: "Provesís d’informacions per las notificacions" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_oc.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Paramètres d’informacion d’estat Reverse the order of items Invertir l’òrdre dels elements An auto-hiding item will remain visible for this period if it needs attention. Un element d’amagar automaticament demorarà visible durant aqueste periòde se requerís atencion. Attention period: Periòde d’atencion : minute(s) minutas(s) Change visibility of items Modificar la visibilitat dels elements Item Element Visibility Visibilitat Always show Totjorn visible Auto-hide Amagar automaticament Always hide Totjorn amagat ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਹਾਲਤ ਨੋਟੀਫਾਇਰ" Desktop Entry/Comment: "ਨੋਟੀਫਿਕੇਸ਼ਨ ਖੇਤਰ (systray) ਦਿੰਦਾ ਹੈ" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pa.ts ================================================ StatusNotifierConfiguration Status Notifier Settings ਹਾਲਤ ਨੋਟੀਫਾਇਰ ਸੈਟਿੰਗਾਂ Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. ਆਪੇ-ਓਹਲੇ ਹੋਣ ਵਾਲੀ ਚੀਜ਼ ਇਸ ਸਮੇਂ ਲਈ ਦਿਖਾਈ ਦੇਵੇਗੀ, ਜੇ ਇਸ ਲਈ ਧਿਆਨ ਦੇਣ ਦੀ ਲੋੜ ਹੋਵੇ। Attention period: ਧਿਆਨ ਦਿਵਾਉਣ ਅੰਤਰਾਲ: minute(s) ਮਿੰਟ Change visibility of items ਆਈਟਮਾਂ ਦੀ ਦਿੱਖ ਬਦਲੋ Item ਆਈਟਮ Visibility ਦਿੱਖ Always show ਹਮੇਸ਼ਾਂ ਵੇਖਾਓ Auto-hide ਆਪੇ-ਓਹਲੇ Always hide ਹਮੇਸ਼ਾਂ ਓਹਲੇ ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pl.desktop.yaml ================================================ Desktop Entry/Name: "Wtyczka powiadomień o stanie" Desktop Entry/Comment: "Zapewnia obszar powiadomień (zasobnik systemowy)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pl.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Ustawienia powiadomień o statusie Reverse the order of items Odwróć kolejność elementów An auto-hiding item will remain visible for this period if it needs attention. Automatycznie ukrywany element pozostanie widoczny przez ten czas, jeśli wymaga uwagi. Attention period: Okres uwagi: minute(s) min Change visibility of items Zmień widoczność elementów Item Element Visibility Widoczność Always show Zawsze pokazuj Auto-hide Ukrywaj automatycznie Always hide Zawsze ukrywaj ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pt.desktop.yaml ================================================ Desktop Entry/Name: "Plugin Status Notifier" Desktop Entry/Comment: "Um plugin para notificar sobre o estado" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pt.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Definições do notificador de estado Reverse the order of items Inverter a ordem dos itens An auto-hiding item will remain visible for this period if it needs attention. Um item de ocultação automática permanecerá visível durante este período se necessitar de atenção. Attention period: Período de atenção: minute(s) minuto(s) Change visibility of items Mudar a visibilidade dos itens Item Item Visibility Visibilidade Always show Mostrar sempre Auto-hide Ocultar automaticamente Always hide Ocultar sempre ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Notificador de status" Desktop Entry/Comment: "Fornece notificações da área de trabalho (systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_pt_BR.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Configurações do Notificador de Status Reverse the order of items Inverter a ordem dos itens An auto-hiding item will remain visible for this period if it needs attention. Um item de ocultação automática permanecerá visível durante este período se necessitar de atenção. Attention period: Período de atenção: minute(s) minuto(s) Change visibility of items Mudar visibilidade dos itens Item Item Visibility Visibilidade Always show Sempre mostrar Auto-hide Esconder automaticamente Always hide Sempre esconder ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ru.desktop.yaml ================================================ Desktop Entry/Name: "Плагин уведомлений" Desktop Entry/Comment: "Создаёт область уведомления (системный трей)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_ru.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Настройки плагина уведомлений Reverse the order of items Уведомления в обратном порядке An auto-hiding item will remain visible for this period if it needs attention. Элемент, для которого включено автоскрытие, будет оставаться видимым в течении этого периода, если он требует к себе внимания. Attention period: Период внимания: minute(s) мин. Change visibility of items Изменить видимость элементов Item Элемент Visibility Видимость Always show Всегда показывать Auto-hide Автоматически скрывать Always hide Всегда скрывать ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_si.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. Attention period: minute(s) Change visibility of items Item Visibility Always show Auto-hide Always hide ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_sk.desktop.yaml ================================================ Desktop Entry/Name: "Stavové správy" Desktop Entry/Comment: "Poskytuje oblasť oznamov (systray)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_sk_SK.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Nastavenia widgetu Status Notifier Reverse the order of items Obrátiť poradie položiek An auto-hiding item will remain visible for this period if it needs attention. Ak automaticky skrývaná položka potrebuje pozornosť, ostane viditeľná po zadaný čas. Attention period: Čas upozornenia: minute(s) minút Change visibility of items Viditeľnosť položiek Item Položka Visibility Viditeľnosť Always show Zobraziť vždy Auto-hide Automaticky skryť Always hide Vždy skryť ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_sv.desktop.yaml ================================================ Desktop Entry/Name: "Statusaviserare" Desktop Entry/Comment: "Insticksmodul för status meddelanden" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_sv.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Inställningar för statusaviseraren Reverse the order of items Vänd ordning på elementen An auto-hiding item will remain visible for this period if it needs attention. Ett program som automatiskt döljs kommer visas den här tiden om det behöver uppmärkas. Attention period: Visningstid: minute(s) minut(er) Change visibility of items Ändra ikonsynligheten Item Program Visibility Synlighet Always show Alltid synlig Auto-hide Dölj automatiskt Always hide Alltid dold ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_tr.desktop.yaml ================================================ Desktop Entry/Name: "Durum Bildirici" Desktop Entry/Comment: "Bildirim alanı sağlar (diğer adıyla sistem çekmecesi)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_tr.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Durum Bildirici Ayarları Reverse the order of items Ögelerin sırasını tersine çevir An auto-hiding item will remain visible for this period if it needs attention. Otomatik gizlenen bir öge, ilgilenilmesi gerekiyorsa bu süre boyunca görünür kalacaktır. Attention period: Dikkat süresi: minute(s) dakika(lar) Change visibility of items Ögelerin görünürlüğünü değiştir Item Öge Visibility Görünürlük Always show Her zaman göster Auto-hide Otomatik Gizle Always hide Her zaman gizle ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_uk.desktop.yaml ================================================ Desktop Entry/Name: "Сповіщувач стану" Desktop Entry/Comment: "Створює область сповіщень (системний лоток)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_uk.ts ================================================ StatusNotifierConfiguration Status Notifier Settings Налаштування сповіщувача стану Reverse the order of items Зворотний порядок елементів An auto-hiding item will remain visible for this period if it needs attention. Сповіщення з автоприховуванням залишатиметься видимим протягом проміжку часу, якщо воно потребує уваги. Attention period: Проміжок часу уваги: minute(s) хвилин(а) Change visibility of items Змінити видимість сповіщень Item Сповіщення Visibility Видимість Always show Завжди показувати Auto-hide Автоприховування Always hide Завжди ховати ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "状态提示器" Desktop Entry/Comment: "状态提示器插件" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_zh_CN.ts ================================================ StatusNotifierConfiguration Status Notifier Settings 状态通知程序设置 Reverse the order of items An auto-hiding item will remain visible for this period if it needs attention. 如果需要关注,该自动隐藏的项目将在此期间保持可见状态。 Attention period: 关注期限: minute(s) 分钟 Change visibility of items 改变项目可见性 Item 项目 Visibility 可见性 Always show 总是展示 Auto-hide 自动隐藏 Always hide 总是隐藏 ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "狀態通知器" Desktop Entry/Comment: "提供通知區域(即為系統匣)" ================================================ FILE: plugin-statusnotifier/translations/statusnotifier_zh_TW.ts ================================================ StatusNotifierConfiguration Status Notifier Settings 狀態指示器的設定 Reverse the order of items 反轉項目排序 An auto-hiding item will remain visible for this period if it needs attention. 自動隱藏的項目如果需要注意時,會在指定的期間保持可見。 Attention period: 注意期間: minute(s) 分鐘 Change visibility of items 控制項目是否可見 Item 項目 Visibility 可見性 Always show 總是顯示 Auto-hide 自動隱藏 Always hide 總是隱藏 ================================================ FILE: plugin-sysstat/CMakeLists.txt ================================================ set(PLUGIN "sysstat") find_package(SysStat-Qt6 REQUIRED) set(HEADERS lxqtsysstat.h lxqtsysstatconfiguration.h lxqtsysstatcolours.h lxqtsysstatutils.h ) set(SOURCES lxqtsysstat.cpp lxqtsysstatconfiguration.cpp lxqtsysstatcolours.cpp lxqtsysstatutils.cpp ) set(UIS lxqtsysstatconfiguration.ui lxqtsysstatcolours.ui ) set(LIBRARIES sysstat-qt6) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-sysstat/lxqtsysstat.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsysstat.h" #include "lxqtsysstatutils.h" #include #include #include #include #include #include #include #include #include #include #include LXQtSysStat::LXQtSysStat(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mWidget(new QWidget()), mFakeTitle(new LXQtSysStatTitle(mWidget)), mContent(new LXQtSysStatContent(this, mWidget)) { QVBoxLayout *borderLayout = new QVBoxLayout(mWidget); borderLayout->setContentsMargins(0, 0, 0, 0); borderLayout->setSpacing(0); borderLayout->addWidget(mContent); borderLayout->setStretchFactor(mContent, 1); mContent->setMinimumSize(2, 2); // qproperty of font type doesn't work with qss, so fake QLabel is used instead connect(mFakeTitle, &LXQtSysStatTitle::fontChanged, mContent, &LXQtSysStatContent::setTitleFont); // has to be postponed to update the size first QTimer::singleShot(0, this, SLOT(lateInit())); } LXQtSysStat::~LXQtSysStat() { delete mWidget; } void LXQtSysStat::lateInit() { settingsChanged(); mContent->setTitleFont(mFakeTitle->font()); mSize = mContent->size(); } QDialog *LXQtSysStat::configureDialog() { return new LXQtSysStatConfiguration(settings(), mWidget); } void LXQtSysStat::realign() { QSize newSize = mContent->size(); if (mSize != newSize) { mContent->reset(); mSize = newSize; } } void LXQtSysStat::settingsChanged() { mContent->updateSettings(settings()); } LXQtSysStatTitle::LXQtSysStatTitle(QWidget *parent): QLabel(parent) { } LXQtSysStatTitle::~LXQtSysStatTitle() = default; bool LXQtSysStatTitle::event(QEvent *e) { if (e->type() == QEvent::FontChange) emit fontChanged(font()); return QLabel::event(e); } LXQtSysStatContent::LXQtSysStatContent(ILXQtPanelPlugin *plugin, QWidget *parent): QWidget(parent), mPlugin(plugin), mStat(nullptr), mUpdateInterval(0), mMinimalSize(0), mGridLines(0), mTitleFontPixelHeight(0), mUseFrequency(true), mNetMaximumSpeed(0), mNetRealMaximumSpeed(0), mLogarithmicScale(true), mLogScaleSteps(0), mLogScaleMax(0), mUseThemeColours(true), mHistoryOffset(0) { setObjectName(QStringLiteral("SysStat_Graph")); } LXQtSysStatContent::~LXQtSysStatContent() = default; // I don't like macros very much, but writing dozen similar functions is much much worse. #undef QSS_GET_COLOUR #define QSS_GET_COLOUR(GETNAME) \ QColor LXQtSysStatContent::GETNAME##Colour() const \ { \ return mThemeColours.GETNAME##Colour; \ } #undef QSS_COLOUR #define QSS_COLOUR(GETNAME, SETNAME) \ QSS_GET_COLOUR(GETNAME) \ void LXQtSysStatContent::SETNAME##Colour(QColor value) \ { \ mThemeColours.GETNAME##Colour = value; \ if (mUseThemeColours) \ mColours.GETNAME##Colour = mThemeColours.GETNAME##Colour; \ } #undef QSS_NET_COLOUR #define QSS_NET_COLOUR(GETNAME, SETNAME) \ QSS_GET_COLOUR(GETNAME) \ void LXQtSysStatContent::SETNAME##Colour(QColor value) \ { \ mThemeColours.GETNAME##Colour = value; \ if (mUseThemeColours) \ { \ mColours.GETNAME##Colour = mThemeColours.GETNAME##Colour; \ mixNetColours(); \ } \ } QSS_COLOUR(grid, setGrid) QSS_COLOUR(title, setTitle) QSS_COLOUR(cpuSystem, setCpuSystem) QSS_COLOUR(cpuUser, setCpuUser) QSS_COLOUR(cpuNice, setCpuNice) QSS_COLOUR(cpuOther, setCpuOther) QSS_COLOUR(frequency, setFrequency) QSS_COLOUR(memApps, setMemApps) QSS_COLOUR(memBuffers, setMemBuffers) QSS_COLOUR(memCached, setMemCached) QSS_COLOUR(swapUsed, setSwapUsed) QSS_NET_COLOUR(netReceived, setNetReceived) QSS_NET_COLOUR(netTransmitted, setNetTransmitted) #undef QSS_NET_COLOUR #undef QSS_COLOUR #undef QSS_GET_COLOUR void LXQtSysStatContent::mixNetColours() { QColor netReceivedColour_hsv = mColours.netReceivedColour.toHsv(); QColor netTransmittedColour_hsv = mColours.netTransmittedColour.toHsv(); qreal hue = (netReceivedColour_hsv.hueF() + netTransmittedColour_hsv.hueF()) / 2; if (std::abs(netReceivedColour_hsv.hueF() - netTransmittedColour_hsv.hueF()) > 0.5) hue += 0.5; mNetBothColour.setHsvF( hue, (netReceivedColour_hsv.saturationF() + netTransmittedColour_hsv.saturationF()) / 2, (netReceivedColour_hsv.valueF() + netTransmittedColour_hsv.valueF() ) / 2 ); } void LXQtSysStatContent::setTitleFont(QFont value) { mTitleFont = value; updateTitleFontPixelHeight(); update(); } void LXQtSysStatContent::updateTitleFontPixelHeight() { if (mTitleLabel.isEmpty()) mTitleFontPixelHeight = 0; else { QFontMetrics fm(mTitleFont); mTitleFontPixelHeight = fm.height() - 1; } } void LXQtSysStatContent::updateSettings(const PluginSettings *settings) { double old_updateInterval = mUpdateInterval; int old_minimalSize = mMinimalSize; QString old_dataType = mDataType; QString old_dataSource = mDataSource; bool old_useFrequency = mUseFrequency; bool old_logarithmicScale = mLogarithmicScale; int old_logScaleSteps = mLogScaleSteps; mUseThemeColours = settings->value(QStringLiteral("graph/useThemeColours"), true).toBool(); mUpdateInterval = settings->value(QStringLiteral("graph/updateInterval"), 1.0).toDouble(); mMinimalSize = settings->value(QStringLiteral("graph/minimalSize"), 30).toInt(); mGridLines = settings->value(QStringLiteral("grid/lines"), 1).toInt(); mTitleLabel = settings->value(QStringLiteral("title/label"), QString()).toString(); // default to CPU monitoring mDataType = settings->value(QStringLiteral("data/type"), LXQtSysStatConfiguration::msStatTypes[0]).toString(); mDataSource = settings->value(QStringLiteral("data/source"), QStringLiteral("cpu")).toString(); mUseFrequency = settings->value(QStringLiteral("cpu/useFrequency"), true).toBool(); mNetMaximumSpeed = PluginSysStat::netSpeedFromString(settings->value(QStringLiteral("net/maximumSpeed"), QStringLiteral("1 MB/s")).toString()); mLogarithmicScale = settings->value(QStringLiteral("net/logarithmicScale"), true).toBool(); mLogScaleSteps = settings->value(QStringLiteral("net/logarithmicScaleSteps"), 4).toInt(); mLogScaleMax = static_cast(static_cast(1) << mLogScaleSteps); mNetRealMaximumSpeed = static_cast(static_cast(1) << mNetMaximumSpeed); mSettingsColours.gridColour = QColor(settings->value(QStringLiteral("grid/colour"), QStringLiteral("#c0c0c0")).toString()); mSettingsColours.titleColour = QColor(settings->value(QStringLiteral("title/colour"), QStringLiteral("#ffffff")).toString()); mSettingsColours.cpuSystemColour = QColor(settings->value(QStringLiteral("cpu/systemColour"), QStringLiteral("#800000")).toString()); mSettingsColours.cpuUserColour = QColor(settings->value(QStringLiteral("cpu/userColour"), QStringLiteral("#000080")).toString()); mSettingsColours.cpuNiceColour = QColor(settings->value(QStringLiteral("cpu/niceColour"), QStringLiteral("#008000")).toString()); mSettingsColours.cpuOtherColour = QColor(settings->value(QStringLiteral("cpu/otherColour"), QStringLiteral("#808000")).toString()); mSettingsColours.frequencyColour = QColor(settings->value(QStringLiteral("cpu/frequencyColour"), QStringLiteral("#808080")).toString()); mSettingsColours.memAppsColour = QColor(settings->value(QStringLiteral("mem/appsColour"), QStringLiteral("#000080")).toString()); mSettingsColours.memBuffersColour = QColor(settings->value(QStringLiteral("mem/buffersColour"), QStringLiteral("#008000")).toString()); mSettingsColours.memCachedColour = QColor(settings->value(QStringLiteral("mem/cachedColour"), QStringLiteral("#808000")).toString()); mSettingsColours.swapUsedColour = QColor(settings->value(QStringLiteral("mem/swapColour"), QStringLiteral("#800000")).toString()); mSettingsColours.netReceivedColour = QColor(settings->value(QStringLiteral("net/receivedColour"), QStringLiteral("#000080")).toString()); mSettingsColours.netTransmittedColour = QColor(settings->value(QStringLiteral("net/transmittedColour"), QStringLiteral("#808000")).toString()); if (mUseThemeColours) mColours = mThemeColours; else mColours = mSettingsColours; mixNetColours(); updateTitleFontPixelHeight(); bool minimalSizeChanged = old_minimalSize != mMinimalSize; bool updateIntervalChanged = old_updateInterval != mUpdateInterval; bool dataTypeChanged = old_dataType != mDataType; bool dataSourceChanged = old_dataSource != mDataSource; bool useFrequencyChanged = old_useFrequency != mUseFrequency; bool logScaleStepsChanged = old_logScaleSteps != mLogScaleSteps; bool logarithmicScaleChanged = old_logarithmicScale != mLogarithmicScale; bool needReconnecting = dataTypeChanged || dataSourceChanged || useFrequencyChanged; bool needTimerRestarting = needReconnecting || updateIntervalChanged; bool needFullReset = needTimerRestarting || minimalSizeChanged || logScaleStepsChanged || logarithmicScaleChanged; if (mStat) { if (needTimerRestarting) mStat->stopUpdating(); if (needReconnecting) mStat->disconnect(this); } if (dataTypeChanged) { if (mStat) { mStat->deleteLater(); mStat = nullptr; } if (mDataType == QLatin1String("CPU")) mStat = new SysStat::CpuStat(this); else if (mDataType == QLatin1String("Memory")) mStat = new SysStat::MemStat(this); else if (mDataType == QLatin1String("Network")) mStat = new SysStat::NetStat(this); } if (mStat) { if (needReconnecting) { if (mDataType == QLatin1String("CPU")) { SysStat::CpuStat* cpustat = qobject_cast(mStat); if (mUseFrequency) { cpustat->setMonitoring(SysStat::CpuStat::LoadAndFrequency); connect(cpustat, QOverload::of(&SysStat::CpuStat::update), this, &LXQtSysStatContent::cpuLoadFrequencyUpdate); } else { cpustat->setMonitoring(SysStat::CpuStat::LoadOnly); connect(cpustat, QOverload::of(&SysStat::CpuStat::update), this, &LXQtSysStatContent::cpuLoadUpdate); } } else if (mDataType == QLatin1String("Memory")) { SysStat::MemStat* memstat = qobject_cast(mStat); if (mDataSource == QLatin1String("memory")) connect(memstat, &SysStat::MemStat::memoryUpdate, this, &LXQtSysStatContent::memoryUpdate); else connect(memstat, &SysStat::MemStat::swapUpdate, this, &LXQtSysStatContent::swapUpdate); } else if (mDataType == QLatin1String("Network")) { SysStat::NetStat* netstat = qobject_cast(mStat); connect(netstat, &SysStat::NetStat::update, this, &LXQtSysStatContent::networkUpdate); } mStat->setMonitoredSource(mDataSource); } if (needTimerRestarting) mStat->setUpdateInterval(static_cast(mUpdateInterval * 1000.0)); } if (needFullReset) reset(); else update(); } void LXQtSysStatContent::resizeEvent(QResizeEvent * /*event*/) { reset(); } void LXQtSysStatContent::reset() { setMinimumSize(mPlugin->panel()->isHorizontal() ? mMinimalSize : 2, mPlugin->panel()->isHorizontal() ? 2 : mMinimalSize); if (width() > mHistoryImage.width()) { QImage newImage{width(), 100, QImage::Format_ARGB32}; newImage.fill(Qt::transparent); QPainter p{&newImage}; p.drawImage(mHistoryImage.rect(), mHistoryImage, mHistoryImage.rect()); mHistoryImage = newImage; update(); } } // QPainter.drawLine with pen set to Qt::transparent doesn't clear anything void LXQtSysStatContent::clearLine() { QRgb bg = QColor(Qt::transparent).rgba(); for (int i = 0; i < 100; ++i) reinterpret_cast(mHistoryImage.scanLine(i))[mHistoryOffset] = bg; } void LXQtSysStatContent::cpuLoadFrequencyUpdate(float user, float nice, float system, float other, float frequencyRate, uint) { int y_system = static_cast(system * 100.0 * frequencyRate); int y_user = static_cast(user * 100.0 * frequencyRate); int y_nice = static_cast(nice * 100.0 * frequencyRate); int y_other = static_cast(other * 100.0 * frequencyRate); int y_freq = static_cast( 100.0 * frequencyRate); toolTipInfo(tr("system: %1%
user: %2%
nice: %3%
other: %4%
freq: %5%", "CPU tooltip information") .arg(y_system).arg(y_user).arg(y_nice).arg(y_other).arg(y_freq)); y_system = std::clamp(y_system, 0, 99); y_user = std::clamp(y_user + y_system, 0, 99); y_nice = std::clamp(y_nice + y_user, 0, 99); y_other = std::clamp(y_other, 0, 99); y_freq = std::clamp(y_freq, 0, 99); clearLine(); QPainter painter(&mHistoryImage); if (y_system != 0) { painter.setPen(mColours.cpuSystemColour); painter.drawLine(mHistoryOffset, y_system, mHistoryOffset, 0); } if (y_user != y_system) { painter.setPen(mColours.cpuUserColour); painter.drawLine(mHistoryOffset, y_user, mHistoryOffset, y_system); } if (y_nice != y_user) { painter.setPen(mColours.cpuNiceColour); painter.drawLine(mHistoryOffset, y_nice, mHistoryOffset, y_user); } if (y_other != y_nice) { painter.setPen(mColours.cpuOtherColour); painter.drawLine(mHistoryOffset, y_other, mHistoryOffset, y_nice); } if (y_freq != y_other) { painter.setPen(mColours.frequencyColour); painter.drawLine(mHistoryOffset, y_freq, mHistoryOffset, y_other); } mHistoryOffset = (mHistoryOffset + 1) % mHistoryImage.width(); update(0, mTitleFontPixelHeight, width(), height() - mTitleFontPixelHeight); } void LXQtSysStatContent::cpuLoadUpdate(float user, float nice, float system, float other) { int y_system = static_cast(system * 100.0); int y_user = static_cast(user * 100.0); int y_nice = static_cast(nice * 100.0); int y_other = static_cast(other * 100.0); toolTipInfo(tr("system: %1%
user: %2%
nice: %3%
other: %4%
freq: n/a", "CPU tooltip information") .arg(y_system).arg(y_user).arg(y_nice).arg(y_other)); y_system = std::clamp(y_system, 0, 99); y_user = std::clamp(y_user + y_system, 0, 99); y_nice = std::clamp(y_nice + y_user, 0, 99); y_other = std::clamp(y_other + y_nice, 0, 99); clearLine(); QPainter painter(&mHistoryImage); if (y_system != 0) { painter.setPen(mColours.cpuSystemColour); painter.drawLine(mHistoryOffset, y_system, mHistoryOffset, 0); } if (y_user != y_system) { painter.setPen(mColours.cpuUserColour); painter.drawLine(mHistoryOffset, y_user, mHistoryOffset, y_system); } if (y_nice != y_user) { painter.setPen(mColours.cpuNiceColour); painter.drawLine(mHistoryOffset, y_nice, mHistoryOffset, y_user); } if (y_other != y_nice) { painter.setPen(mColours.cpuOtherColour); painter.drawLine(mHistoryOffset, y_other, mHistoryOffset, y_nice); } mHistoryOffset = (mHistoryOffset + 1) % mHistoryImage.width(); update(0, mTitleFontPixelHeight, width(), height() - mTitleFontPixelHeight); } void LXQtSysStatContent::memoryUpdate(float apps, float buffers, float cached) { int y_apps = static_cast(apps * 100.0); int y_buffers = static_cast(buffers * 100.0); int y_cached = static_cast(cached * 100.0); toolTipInfo(tr("apps: %1%
buffers: %2%
cached: %3%", "Memory tooltip information") .arg(y_apps).arg(y_buffers).arg(y_cached)); y_apps = std::clamp(y_apps, 0, 99); y_buffers = std::clamp(y_buffers + y_apps, 0, 99); y_cached = std::clamp(y_cached + y_buffers, 0, 99); clearLine(); QPainter painter(&mHistoryImage); if (y_apps != 0) { painter.setPen(mColours.memAppsColour); painter.drawLine(mHistoryOffset, y_apps, mHistoryOffset, 0); } if (y_buffers != y_apps) { painter.setPen(mColours.memBuffersColour); painter.drawLine(mHistoryOffset, y_buffers, mHistoryOffset, y_apps); } if (y_cached != y_buffers) { painter.setPen(mColours.memCachedColour); painter.drawLine(mHistoryOffset, y_cached, mHistoryOffset, y_buffers); } mHistoryOffset = (mHistoryOffset + 1) % mHistoryImage.width(); update(0, mTitleFontPixelHeight, width(), height() - mTitleFontPixelHeight); } void LXQtSysStatContent::swapUpdate(float used) { int y_used = static_cast(used * 100.0); toolTipInfo(tr("used: %1%", "Swap tooltip information").arg(y_used)); y_used = std::clamp(y_used, 0, 99); clearLine(); QPainter painter(&mHistoryImage); if (y_used != 0) { painter.setPen(mColours.swapUsedColour); painter.drawLine(mHistoryOffset, y_used, mHistoryOffset, 0); } mHistoryOffset = (mHistoryOffset + 1) % mHistoryImage.width(); update(0, mTitleFontPixelHeight, width(), height() - mTitleFontPixelHeight); } void LXQtSysStatContent::networkUpdate(unsigned received, unsigned transmitted) { qreal min_value = std::clamp(static_cast(std::min(received, transmitted)) / mNetRealMaximumSpeed, static_cast(0.0), static_cast(1.0)); qreal max_value = std::clamp(static_cast(std::max(received, transmitted)) / mNetRealMaximumSpeed, static_cast(0.0), static_cast(1.0)); if (mLogarithmicScale) { min_value = qLn(min_value * (mLogScaleMax - 1.0) + 1.0) / qLn(2.0) / static_cast(mLogScaleSteps); max_value = qLn(max_value * (mLogScaleMax - 1.0) + 1.0) / qLn(2.0) / static_cast(mLogScaleSteps); } int y_min_value = static_cast(min_value * 100.0); int y_max_value = static_cast(max_value * 100.0); toolTipInfo(tr("min: %1%
max: %2%", "Network tooltip information").arg(y_min_value).arg(y_max_value)); y_min_value = std::clamp(y_min_value, 0, 99); y_max_value = std::clamp(y_max_value + y_min_value, 0, 99); clearLine(); QPainter painter(&mHistoryImage); if (y_min_value != 0) { painter.setPen(mNetBothColour); painter.drawLine(mHistoryOffset, y_min_value, mHistoryOffset, 0); } if (y_max_value != y_min_value) { painter.setPen((received > transmitted) ? mColours.netReceivedColour : mColours.netTransmittedColour); painter.drawLine(mHistoryOffset, y_max_value, mHistoryOffset, y_min_value); } mHistoryOffset = (mHistoryOffset + 1) % mHistoryImage.width(); update(0, mTitleFontPixelHeight, width(), height() - mTitleFontPixelHeight); } void LXQtSysStatContent::paintEvent(QPaintEvent *event) { QPainter p(this); qreal graphTop = 0; qreal graphHeight = height(); bool hasTitle = !mTitleLabel.isEmpty(); if (hasTitle) { graphTop = mTitleFontPixelHeight; graphHeight -= graphTop; if (event->region().intersects(QRect(0, 0, width(), graphTop))) { p.setPen(mColours.titleColour); p.setFont(mTitleFont); p.drawText(QRectF(0, 0, width(), graphTop), Qt::AlignHCenter | Qt::AlignVCenter, mTitleLabel); } } if (graphHeight < 1) graphHeight = 1; p.scale(1.0, -1.0); p.drawImage(QRect(0, -height(), width() - mHistoryOffset, graphHeight), mHistoryImage, QRect(mHistoryOffset, 0, width() - mHistoryOffset, 100)); if (mHistoryOffset) p.drawImage(QRect(width() - mHistoryOffset, -height(), mHistoryOffset, graphHeight), mHistoryImage, QRect(0, 0, mHistoryOffset, 100)); p.resetTransform(); p.setRenderHint(QPainter::Antialiasing); p.setPen(mColours.gridColour); qreal w = static_cast(width()); if (hasTitle) p.drawLine(QPointF(0.0, graphTop + 0.5), QPointF(w, graphTop + 0.5)); // 0.5 looks better with antialiasing for (int l = 0; l < mGridLines; ++l) { qreal y = graphTop + static_cast(l + 1) * graphHeight / (static_cast(mGridLines + 1)); p.drawLine(QPointF(0.0, y), QPointF(w, y)); } } void LXQtSysStatContent::toolTipInfo(QString const & tooltip) { setToolTip(QStringLiteral("%1(%2)
%3") .arg(QCoreApplication::translate("LXQtSysStatConfiguration", mDataType.toStdString().c_str())) .arg(QCoreApplication::translate("LXQtSysStatConfiguration", mDataSource.toStdString().c_str())) .arg(tooltip)); } ================================================ FILE: plugin-sysstat/lxqtsysstat.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTPANELSYSSTAT_H #define LXQTPANELSYSSTAT_H #include "../panel/ilxqtpanelplugin.h" #include "lxqtsysstatconfiguration.h" #include class LXQtSysStatTitle; class LXQtSysStatContent; class LXQtPanel; namespace SysStat { class BaseStat; } class LXQtSysStat : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtSysStat(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtSysStat(); virtual QWidget *widget() { return mWidget; } virtual QString themeId() const { return QStringLiteral("SysStat"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog; } virtual bool isSeparate() const { return true; } QDialog *configureDialog(); void realign(); protected slots: virtual void lateInit(); virtual void settingsChanged(); private: QWidget *mWidget; LXQtSysStatTitle *mFakeTitle; LXQtSysStatContent *mContent; QSize mSize; }; class LXQtSysStatTitle : public QLabel { Q_OBJECT public: LXQtSysStatTitle(QWidget *parent = nullptr); ~LXQtSysStatTitle(); protected: bool event(QEvent *e); signals: void fontChanged(QFont); }; class LXQtSysStatContent : public QWidget { Q_OBJECT Q_PROPERTY(QColor gridColor READ gridColour WRITE setGridColour) Q_PROPERTY(QColor titleColor READ titleColour WRITE setTitleColour) Q_PROPERTY(QColor cpuSystemColor READ cpuSystemColour WRITE setCpuSystemColour) Q_PROPERTY(QColor cpuUserColor READ cpuUserColour WRITE setCpuUserColour) Q_PROPERTY(QColor cpuNiceColor READ cpuNiceColour WRITE setCpuNiceColour) Q_PROPERTY(QColor cpuOtherColor READ cpuOtherColour WRITE setCpuOtherColour) Q_PROPERTY(QColor frequencyColor READ frequencyColour WRITE setFrequencyColour) Q_PROPERTY(QColor memAppsColor READ memAppsColour WRITE setMemAppsColour) Q_PROPERTY(QColor memBuffersColor READ memBuffersColour WRITE setMemBuffersColour) Q_PROPERTY(QColor memCachedColor READ memCachedColour WRITE setMemCachedColour) Q_PROPERTY(QColor swapUsedColor READ swapUsedColour WRITE setSwapUsedColour) Q_PROPERTY(QColor netReceivedColor READ netReceivedColour WRITE setNetReceivedColour) Q_PROPERTY(QColor netTransmittedColor READ netTransmittedColour WRITE setNetTransmittedColour) public: LXQtSysStatContent(ILXQtPanelPlugin *plugin, QWidget *parent = nullptr); ~LXQtSysStatContent(); void updateSettings(const PluginSettings *); #undef QSS_COLOUR #define QSS_COLOUR(GETNAME, SETNAME) \ QColor GETNAME##Colour() const; \ void SETNAME##Colour(QColor value); QSS_COLOUR(grid, setGrid) QSS_COLOUR(title, setTitle) QSS_COLOUR(cpuSystem, setCpuSystem) QSS_COLOUR(cpuUser, setCpuUser) QSS_COLOUR(cpuNice, setCpuNice) QSS_COLOUR(cpuOther, setCpuOther) QSS_COLOUR(frequency, setFrequency) QSS_COLOUR(memApps, setMemApps) QSS_COLOUR(memBuffers, setMemBuffers) QSS_COLOUR(memCached, setMemCached) QSS_COLOUR(swapUsed, setSwapUsed) QSS_COLOUR(netReceived, setNetReceived) QSS_COLOUR(netTransmitted, setNetTransmitted) #undef QSS_COLOUR public slots: void setTitleFont(QFont value); void reset(); protected: void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); protected slots: void cpuLoadFrequencyUpdate(float user, float nice, float system, float other, float frequencyRate, uint frequency); void cpuLoadUpdate(float user, float nice, float system, float other); void memoryUpdate(float apps, float buffers, float cached); void swapUpdate(float used); void networkUpdate(unsigned received, unsigned transmitted); private: void toolTipInfo(QString const & tooltip); private: ILXQtPanelPlugin *mPlugin; SysStat::BaseStat *mStat; typedef struct ColourPalette { QColor gridColour; QColor titleColour; QColor cpuSystemColour; QColor cpuUserColour; QColor cpuNiceColour; QColor cpuOtherColour; QColor frequencyColour; QColor memAppsColour; QColor memBuffersColour; QColor memCachedColour; QColor swapUsedColour; QColor netReceivedColour; QColor netTransmittedColour; } ColourPalette; double mUpdateInterval; int mMinimalSize; int mGridLines; QString mTitleLabel; QFont mTitleFont; int mTitleFontPixelHeight; QString mDataType; QString mDataSource; bool mUseFrequency; int mNetMaximumSpeed; qreal mNetRealMaximumSpeed; bool mLogarithmicScale; int mLogScaleSteps; qreal mLogScaleMax; bool mUseThemeColours; ColourPalette mThemeColours; ColourPalette mSettingsColours; ColourPalette mColours; QColor mNetBothColour; int mHistoryOffset; QImage mHistoryImage; void clearLine(); void mixNetColours(); void updateTitleFontPixelHeight(); }; class LXQtSysStatLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtSysStat(startupInfo); } }; #endif // LXQTPANELSYSSTAT_H ================================================ FILE: plugin-sysstat/lxqtsysstatcolours.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsysstatcolours.h" #include "ui_lxqtsysstatcolours.h" #include #include LXQtSysStatColours::LXQtSysStatColours(QWidget *parent) : QDialog(parent), ui(new Ui::LXQtSysStatColours), mSelectColourMapper(new QSignalMapper(this)) { setWindowModality(Qt::WindowModal); ui->setupUi(this); mDefaultColours[QStringLiteral("grid")] = QColor("#808080"); mDefaultColours[QStringLiteral("title")] = QColor("#000000"); mDefaultColours[QStringLiteral("cpuSystem")] = QColor("#800000"); mDefaultColours[QStringLiteral("cpuUser")] = QColor("#000080"); mDefaultColours[QStringLiteral("cpuNice")] = QColor("#008000"); mDefaultColours[QStringLiteral("cpuOther")] = QColor("#808000"); mDefaultColours[QStringLiteral("cpuFrequency")] = QColor("#808080"); mDefaultColours[QStringLiteral("memApps")] = QColor("#000080"); mDefaultColours[QStringLiteral("memBuffers")] = QColor("#008000"); mDefaultColours[QStringLiteral("memCached")] = QColor("#808000"); mDefaultColours[QStringLiteral("memSwap")] = QColor("#800000"); mDefaultColours[QStringLiteral("netReceived")] = QColor("#000080"); mDefaultColours[QStringLiteral("netTransmitted")] = QColor("#808000"); // mShowColourMap[QStringLiteral("grid")] = ui->gridB; mShowColourMap[QStringLiteral("title")] = ui->titleB; mShowColourMap[QStringLiteral("cpuSystem")] = ui->cpuSystemB; mShowColourMap[QStringLiteral("cpuUser")] = ui->cpuUserB; mShowColourMap[QStringLiteral("cpuNice")] = ui->cpuNiceB; mShowColourMap[QStringLiteral("cpuOther")] = ui->cpuOtherB; mShowColourMap[QStringLiteral("cpuFrequency")] = ui->cpuFrequencyB; mShowColourMap[QStringLiteral("memApps")] = ui->memAppsB; mShowColourMap[QStringLiteral("memBuffers")] = ui->memBuffersB; mShowColourMap[QStringLiteral("memCached")] = ui->memCachedB; mShowColourMap[QStringLiteral("memSwap")] = ui->memSwapB; mShowColourMap[QStringLiteral("netReceived")] = ui->netReceivedB; mShowColourMap[QStringLiteral("netTransmitted")] = ui->netTransmittedB; auto iterator = mShowColourMap.constBegin(); while (iterator != mShowColourMap.constEnd()) { connect(iterator.value(), &QPushButton::clicked, mSelectColourMapper, QOverload<>::of(&QSignalMapper::map)); mSelectColourMapper->setMapping( iterator.value() , iterator.key() ); ++iterator; } connect(mSelectColourMapper, &QSignalMapper::mappedString, this, &LXQtSysStatColours::selectColour); } LXQtSysStatColours::~LXQtSysStatColours() { delete ui; } void LXQtSysStatColours::selectColour(const QString &name) { QColor color = QColorDialog::getColor(mColours[name], this); if (color.isValid()) { mColours[name] = color; mShowColourMap[name]->setStyleSheet(QStringLiteral("background-color: %1;\ncolor: %2;").arg(color.name()).arg((color.toHsl().lightnessF() > 0.5) ? QStringLiteral("black") : QStringLiteral("white"))); ui->buttons->button(QDialogButtonBox::Apply)->setEnabled(true); } } void LXQtSysStatColours::setColours(const Colours &colours) { mInitialColours = colours; mColours = colours; applyColoursToButtons(); ui->buttons->button(QDialogButtonBox::Apply)->setEnabled(false); } void LXQtSysStatColours::applyColoursToButtons() { Colours::ConstIterator M = mColours.constEnd(); for (Colours::ConstIterator I = mColours.constBegin(); I != M; ++I) { const QColor &color = I.value(); mShowColourMap[I.key()]->setStyleSheet(QStringLiteral("background-color: %1;\ncolor: %2;").arg(color.name()).arg((color.toHsl().lightnessF() > 0.5) ? QStringLiteral("black") : QStringLiteral("white"))); } } void LXQtSysStatColours::on_buttons_clicked(QAbstractButton *button) { switch (ui->buttons->standardButton(button)) { case QDialogButtonBox::RestoreDefaults: restoreDefaults(); break; case QDialogButtonBox::Reset: reset(); break; case QDialogButtonBox::Ok: apply(); accept(); break; case QDialogButtonBox::Apply: apply(); break; case QDialogButtonBox::Cancel: reset(); reject(); break; default:; } } void LXQtSysStatColours::restoreDefaults() { bool wereTheSame = mColours == mDefaultColours; mColours = mDefaultColours; applyColoursToButtons(); ui->buttons->button(QDialogButtonBox::Apply)->setEnabled(!wereTheSame); } void LXQtSysStatColours::reset() { bool wereTheSame = mColours == mInitialColours; mColours = mInitialColours; applyColoursToButtons(); ui->buttons->button(QDialogButtonBox::Apply)->setEnabled(!wereTheSame); } void LXQtSysStatColours::apply() { emit coloursChanged(); ui->buttons->button(QDialogButtonBox::Apply)->setEnabled(false); } LXQtSysStatColours::Colours LXQtSysStatColours::colours() const { return mColours; } LXQtSysStatColours::Colours LXQtSysStatColours::defaultColours() const { return mDefaultColours; } ================================================ FILE: plugin-sysstat/lxqtsysstatcolours.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSYSSTATCOLOURS_HPP #define LXQTSYSSTATCOLOURS_HPP #include #include #include #include namespace Ui { class LXQtSysStatColours; } class QSignalMapper; class QAbstractButton; class QPushButton; class LXQtSysStatColours : public QDialog { Q_OBJECT public: explicit LXQtSysStatColours(QWidget *parent = nullptr); ~LXQtSysStatColours(); typedef QMap Colours; void setColours(const Colours&); Colours colours() const; Colours defaultColours() const; signals: void coloursChanged(); public slots: void on_buttons_clicked(QAbstractButton*); void selectColour(const QString &); void restoreDefaults(); void reset(); void apply(); private: Ui::LXQtSysStatColours *ui; QSignalMapper *mSelectColourMapper; QMap mShowColourMap; Colours mDefaultColours; Colours mInitialColours; Colours mColours; void applyColoursToButtons(); }; #endif // LXQTSYSSTATCOLOURS_HPP ================================================ FILE: plugin-sysstat/lxqtsysstatcolours.ui ================================================ LXQtSysStatColours 0 0 519 328 System Statistics Colors Graph &Grid gridB Change ... T&itle titleB Change ... CPU Change ... &Nice cpuNiceB Change ... Ot&her cpuOtherB &Frequency cpuFrequencyB Change ... S&ystem cpuSystemB &User cpuUserB Change ... Change ... Qt::Vertical Memory Change ... Cache&d memCachedB S&wap memSwapB Change ... &Applications memAppsB &Buffers memBuffersB Change ... Change ... Network &Received netReceivedB Change ... &Transmitted netTransmittedB Change ... Qt::Vertical Qt::Horizontal Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset|QDialogButtonBox::RestoreDefaults gridB titleB cpuSystemB cpuUserB cpuNiceB cpuOtherB cpuFrequencyB memAppsB memBuffersB memCachedB memSwapB netReceivedB netTransmittedB buttons on_buttons_clicked(QAbstractButton*) ================================================ FILE: plugin-sysstat/lxqtsysstatconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtsysstatconfiguration.h" #include "ui_lxqtsysstatconfiguration.h" #include "lxqtsysstatutils.h" #include "lxqtsysstatcolours.h" #include #include #include //Note: strings can't actually be translated here (in static initialization time) // the QT_TR_NOOP here is just for qt translate tools to get the strings for translation const QStringList LXQtSysStatConfiguration::msStatTypes = { QLatin1String(QT_TR_NOOP("CPU")) , QLatin1String(QT_TR_NOOP("Memory")) , QLatin1String(QT_TR_NOOP("Network")) }; namespace { //Note: workaround for making source strings translatable // (no need to ever call this function) void localizationWorkaround(); auto t = localizationWorkaround;//avoid unused function warning void localizationWorkaround() { static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu0")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu1")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu2")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu3")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu4")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu5")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu6")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu7")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu8")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu9")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu10")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu11")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu12")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu13")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu14")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu15")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu16")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu17")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu18")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu19")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu20")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu21")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu22")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "cpu23")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "memory")); static_cast(QT_TRANSLATE_NOOP("LXQtSysStatConfiguration", "swap")); static_cast(t);//avoid unused variable warning } } LXQtSysStatConfiguration::LXQtSysStatConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtSysStatConfiguration), mStat(nullptr), mColoursDialog(nullptr), mLockSettingChanges(false) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("SysStatConfigurationWindow")); ui->setupUi(this); //Note: translation is needed here in runtime (translator is attached already) for (auto const & type : msStatTypes) ui->typeCOB->addItem(tr(type.toStdString().c_str()), type); loadSettings(); connect(ui->typeCOB, static_cast(&QComboBox::currentIndexChanged), this, &LXQtSysStatConfiguration::saveSettings); connect(ui->intervalSB, static_cast(&QDoubleSpinBox::valueChanged), this, &LXQtSysStatConfiguration::saveSettings); connect(ui->sizeSB, static_cast(&QSpinBox::valueChanged), this, &LXQtSysStatConfiguration::saveSettings); connect(ui->linesSB, static_cast(&QSpinBox::valueChanged), this, &LXQtSysStatConfiguration::saveSettings); connect(ui->titleLE, &QLineEdit::editingFinished, this, &LXQtSysStatConfiguration::saveSettings); connect(ui->useFrequencyCB, &QCheckBox::toggled, this, &LXQtSysStatConfiguration::saveSettings); connect(ui->maximumHS, &QSlider::valueChanged, this, &LXQtSysStatConfiguration::saveSettings); connect(ui->logarithmicCB, &QCheckBox::toggled, this, &LXQtSysStatConfiguration::saveSettings); connect(ui->sourceCOB, static_cast(&QComboBox::currentIndexChanged), this, &LXQtSysStatConfiguration::saveSettings); connect(ui->useThemeColoursRB, &QRadioButton::toggled, this, &LXQtSysStatConfiguration::saveSettings); } LXQtSysStatConfiguration::~LXQtSysStatConfiguration() { delete ui; } void LXQtSysStatConfiguration::loadSettings() { mLockSettingChanges = true; ui->intervalSB->setValue(settings().value(QStringLiteral("graph/updateInterval"), 1.0).toDouble()); ui->sizeSB->setValue(settings().value(QStringLiteral("graph/minimalSize"), 30).toInt()); ui->linesSB->setValue(settings().value(QStringLiteral("grid/lines"), 1).toInt()); ui->titleLE->setText(settings().value(QStringLiteral("title/label"), QString()).toString()); int typeIndex = ui->typeCOB->findData(settings().value(QStringLiteral("data/type"), msStatTypes[0])); ui->typeCOB->setCurrentIndex((typeIndex >= 0) ? typeIndex : 0); on_typeCOB_currentIndexChanged(ui->typeCOB->currentIndex()); int sourceIndex = ui->sourceCOB->findData(settings().value(QStringLiteral("data/source"), QString())); ui->sourceCOB->setCurrentIndex((sourceIndex >= 0) ? sourceIndex : 0); ui->useFrequencyCB->setChecked(settings().value(QStringLiteral("cpu/useFrequency"), true).toBool()); ui->maximumHS->setValue(PluginSysStat::netSpeedFromString(settings().value(QStringLiteral("net/maximumSpeed"), QStringLiteral("1 MB/s")).toString())); on_maximumHS_valueChanged(ui->maximumHS->value()); ui->logarithmicCB->setChecked(settings().value(QStringLiteral("net/logarithmicScale"), true).toBool()); ui->logScaleSB->setValue(settings().value(QStringLiteral("net/logarithmicScaleSteps"), 4).toInt()); bool useThemeColours = settings().value(QStringLiteral("graph/useThemeColours"), true).toBool(); ui->useThemeColoursRB->setChecked(useThemeColours); ui->useCustomColoursRB->setChecked(!useThemeColours); ui->customColoursB->setEnabled(!useThemeColours); mLockSettingChanges = false; } void LXQtSysStatConfiguration::saveSettings() { if (mLockSettingChanges) return; settings().setValue(QStringLiteral("graph/useThemeColours"), ui->useThemeColoursRB->isChecked()); settings().setValue(QStringLiteral("graph/updateInterval"), ui->intervalSB->value()); settings().setValue(QStringLiteral("graph/minimalSize"), ui->sizeSB->value()); settings().setValue(QStringLiteral("grid/lines"), ui->linesSB->value()); settings().setValue(QStringLiteral("title/label"), ui->titleLE->text()); //Note: // need to make a really deep copy of the msStatTypes[x] because of SEGFAULTs // occurring in static finalization time (don't know the real reason...maybe ordering of static finalizers/destructors) QString type = QString::fromUtf8(ui->typeCOB->itemData(ui->typeCOB->currentIndex(), Qt::UserRole).toString().toStdString().c_str()); settings().setValue(QStringLiteral("data/type"), type); settings().setValue(QStringLiteral("data/source"), ui->sourceCOB->itemData(ui->sourceCOB->currentIndex(), Qt::UserRole)); settings().setValue(QStringLiteral("cpu/useFrequency"), ui->useFrequencyCB->isChecked()); settings().setValue(QStringLiteral("net/maximumSpeed"), PluginSysStat::netSpeedToString(ui->maximumHS->value())); settings().setValue(QStringLiteral("net/logarithmicScale"), ui->logarithmicCB->isChecked()); settings().setValue(QStringLiteral("net/logarithmicScaleSteps"), ui->logScaleSB->value()); } void LXQtSysStatConfiguration::on_typeCOB_currentIndexChanged(int index) { if (mStat) mStat->deleteLater(); switch (index) { case 0: mStat = new SysStat::CpuStat(this); break; case 1: mStat = new SysStat::MemStat(this); break; case 2: mStat = new SysStat::NetStat(this); break; } ui->sourceCOB->blockSignals(true); ui->sourceCOB->clear(); const auto sources = mStat->sources(); for (auto const & s : sources) ui->sourceCOB->addItem(tr(s.toStdString().c_str()), s); ui->sourceCOB->blockSignals(false); ui->sourceCOB->setCurrentIndex(0); } void LXQtSysStatConfiguration::on_maximumHS_valueChanged(int value) { ui->maximumValueL->setText(PluginSysStat::netSpeedToString(value)); } void LXQtSysStatConfiguration::coloursChanged() { const LXQtSysStatColours::Colours &colours = mColoursDialog->colours(); settings().setValue(QStringLiteral("grid/colour"), colours[QStringLiteral("grid")].name()); settings().setValue(QStringLiteral("title/colour"), colours[QStringLiteral("title")].name()); settings().setValue(QStringLiteral("cpu/systemColour"), colours[QStringLiteral("cpuSystem")].name()); settings().setValue(QStringLiteral("cpu/userColour"), colours[QStringLiteral("cpuUser")].name()); settings().setValue(QStringLiteral("cpu/niceColour"), colours[QStringLiteral("cpuNice")].name()); settings().setValue(QStringLiteral("cpu/otherColour"), colours[QStringLiteral("cpuOther")].name()); settings().setValue(QStringLiteral("cpu/frequencyColour"), colours[QStringLiteral("cpuFrequency")].name()); settings().setValue(QStringLiteral("mem/appsColour"), colours[QStringLiteral("memApps")].name()); settings().setValue(QStringLiteral("mem/buffersColour"), colours[QStringLiteral("memBuffers")].name()); settings().setValue(QStringLiteral("mem/cachedColour"), colours[QStringLiteral("memCached")].name()); settings().setValue(QStringLiteral("mem/swapColour"), colours[QStringLiteral("memSwap")].name()); settings().setValue(QStringLiteral("net/receivedColour"), colours[QStringLiteral("netReceived")].name()); settings().setValue(QStringLiteral("net/transmittedColour"), colours[QStringLiteral("netTransmitted")].name()); } void LXQtSysStatConfiguration::on_customColoursB_clicked() { if (!mColoursDialog) { mColoursDialog = new LXQtSysStatColours(this); connect(mColoursDialog, &LXQtSysStatColours::coloursChanged, this, &LXQtSysStatConfiguration::coloursChanged); } LXQtSysStatColours::Colours colours; const LXQtSysStatColours::Colours &defaultColours = mColoursDialog->defaultColours(); colours[QStringLiteral("grid")] = QColor(settings().value(QStringLiteral("grid/colour"), defaultColours[QStringLiteral("grid")] .name()).toString()); colours[QStringLiteral("title")] = QColor(settings().value(QStringLiteral("title/colour"), defaultColours[QStringLiteral("title")].name()).toString()); colours[QStringLiteral("cpuSystem")] = QColor(settings().value(QStringLiteral("cpu/systemColour"), defaultColours[QStringLiteral("cpuSystem")] .name()).toString()); colours[QStringLiteral("cpuUser")] = QColor(settings().value(QStringLiteral("cpu/userColour"), defaultColours[QStringLiteral("cpuUser")] .name()).toString()); colours[QStringLiteral("cpuNice")] = QColor(settings().value(QStringLiteral("cpu/niceColour"), defaultColours[QStringLiteral("cpuNice")] .name()).toString()); colours[QStringLiteral("cpuOther")] = QColor(settings().value(QStringLiteral("cpu/otherColour"), defaultColours[QStringLiteral("cpuOther")] .name()).toString()); colours[QStringLiteral("cpuFrequency")] = QColor(settings().value(QStringLiteral("cpu/frequencyColour"), defaultColours[QStringLiteral("cpuFrequency")].name()).toString()); colours[QStringLiteral("memApps")] = QColor(settings().value(QStringLiteral("mem/appsColour"), defaultColours[QStringLiteral("memApps")] .name()).toString()); colours[QStringLiteral("memBuffers")] = QColor(settings().value(QStringLiteral("mem/buffersColour"), defaultColours[QStringLiteral("memBuffers")].name()).toString()); colours[QStringLiteral("memCached")] = QColor(settings().value(QStringLiteral("mem/cachedColour"), defaultColours[QStringLiteral("memCached")] .name()).toString()); colours[QStringLiteral("memSwap")] = QColor(settings().value(QStringLiteral("mem/swapColour"), defaultColours[QStringLiteral("memSwap")] .name()).toString()); colours[QStringLiteral("netReceived")] = QColor(settings().value(QStringLiteral("net/receivedColour"), defaultColours[QStringLiteral("netReceived")] .name()).toString()); colours[QStringLiteral("netTransmitted")] = QColor(settings().value(QStringLiteral("net/transmittedColour"), defaultColours[QStringLiteral("netTransmitted")].name()).toString()); mColoursDialog->setColours(colours); mColoursDialog->exec(); } ================================================ FILE: plugin-sysstat/lxqtsysstatconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSYSSTATCONFIGURATION_H #define LXQTSYSSTATCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #include namespace Ui { class LXQtSysStatConfiguration; } namespace SysStat { class BaseStat; } class LXQtSysStatColours; class LXQtSysStatConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtSysStatConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtSysStatConfiguration(); public slots: void saveSettings(); void on_typeCOB_currentIndexChanged(int); void on_maximumHS_valueChanged(int); void on_customColoursB_clicked(); void coloursChanged(); public: static const QStringList msStatTypes; signals: void maximumNetSpeedChanged(QString); private: Ui::LXQtSysStatConfiguration *ui; SysStat::BaseStat *mStat; LXQtSysStatColours *mColoursDialog; bool mLockSettingChanges; void loadSettings(); }; #endif // LXQTSYSSTATCONFIGURATION_H ================================================ FILE: plugin-sysstat/lxqtsysstatconfiguration.ui ================================================ LXQtSysStatConfiguration 0 0 399 438 System Statistics Settings Graph 4 4 &Minimal size sizeSB Update &interval intervalSB &Title titleLE &Grid lines linesSB <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px 2 500 30 s 1 0.100000000000000 60.000000000000000 0.250000000000000 1.000000000000000 Data 4 4 0 0 0 Use &frequency Qt::Vertical 0 0 0 0 Qt::Vertical 0 0 0 0 4 Ma&ximum maximumHS 4 XXX KBs 39 Qt::Horizontal Lo&garithmic scale steps 1 64 4 Qt::Vertical 0 0 &Source sourceCOB T&ype typeCOB Colors 4 5 4 Use t&heme colours true Use c&ustom colours Custom colour ... Qt::Vertical 0 0 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset intervalSB sizeSB linesSB titleLE typeCOB sourceCOB useFrequencyCB maximumHS logarithmicCB logScaleSB useThemeColoursRB useCustomColoursRB customColoursB buttons buttons accepted() LXQtSysStatConfiguration accept() buttons rejected() LXQtSysStatConfiguration reject() typeCOB currentIndexChanged(int) dataSW setCurrentIndex(int) useCustomColoursRB toggled(bool) customColoursB setEnabled(bool) ================================================ FILE: plugin-sysstat/lxqtsysstatutils.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include "lxqtsysstatutils.h" namespace PluginSysStat { QString netSpeedToString(int value) { QString prefix; static const char prefixes[] = "kMG"; if (value / 10) prefix = QLatin1Char(prefixes[value / 10 - 1]); return QStringLiteral("%1 %2B/s").arg(1 << (value % 10)).arg(prefix); } int netSpeedFromString(QStringView value) { static const QRegularExpression re(QStringLiteral("^(\\d+) ([kMG])B/s$")); QRegularExpressionMatch match = re.matchView(value); if (match.hasMatch()) { int shift = 0; switch (match.capturedView(2).at(0).toLatin1()) { case 'k': shift = 10; break; case 'M': shift = 20; break; case 'G': shift = 30; break; } return qCeil(qLn(match.capturedView(1).toInt()) / qLn(2.)) + shift; } return 0; } } ================================================ FILE: plugin-sysstat/lxqtsysstatutils.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTSYSSTATUTILS_HPP #define LXQTSYSSTATUTILS_HPP #include namespace PluginSysStat { QString netSpeedToString(int value); int netSpeedFromString(QStringView value); } #endif // LXQTSYSSTATUTILS_HPP ================================================ FILE: plugin-sysstat/resources/sysstat.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=utilities-system-monitor #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-sysstat/translations/sysstat.desktop.yaml ================================================ Desktop Entry/Name: "System Statistics" Desktop Entry/Comment: "Shows a graph for network, CPU or memory" ================================================ FILE: plugin-sysstat/translations/sysstat.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle CPU &Nice Ot&her &Frequency S&ystem &User Memory Cache&d S&wap &Applications &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_ar.desktop.yaml ================================================ Desktop Entry/Name: "إحصائيّات النّظام" Desktop Entry/Comment: "يعرض رسمًا بيانيًا للشبكة أو وحدة المعالجة المركزية أو الذاكرة" ================================================ FILE: plugin-sysstat/translations/sysstat_ar.ts ================================================ LXQtSysStatColours System Statistics Colors ألوان إحصائيات النظام Graph رسم بياني &Grid &شبكة Change ... تغيير ... T&itle ا&لعنوان CPU وحدة المعالجة المركزية &Nice &جميل Ot&her &آخر &Frequency &التكرار S&ystem &نظام &User &مستفيد Memory الذاكرة Cache&d &مخبأ S&wap &تبديل &Applications &التطبيقات &Buffers &مخازن Network الشبكة &Received &تلقى &Transmitted &أحال LXQtSysStatConfiguration System Statistics Settings إعدادات إحصائيات النظام Graph رسم بياني &Minimal size &الحجم الاصغر Update &interval &الفاصل الزمني للتحديث &Title &العنوان &Grid lines &خطوط الشبكة <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body style=";text-align:right;direction:rtl"><p style=";text-align:right;direction:rtl">أدنى عرض إذا كانت اللوحة أفقية.</p><p style=";text-align:right;direction:rtl"> أدنى ارتفاع إذا كانت اللوحة عمودية.</p></body></html> px بكسل s s Data البيانات Use &frequency &تكرار الاستخدام Ma&ximum &أقصى XXX KBs XXX كيلو بايت Lo&garithmic scale &مقياس لوغاريتمي steps خطوات &Source &المصدر T&ype &نوع Colors الألوان Use t&heme colours &استخدم ألوان الموضوع Use c&ustom colours &استخدم ألوان التخصيص Custom colour ... لون مخصص ... CPU وحدة المعالجة المركزية Memory الذاكرة Network الشبكة cpu وحدة المعالجة المركزية cpu0 وحدة المعالجة المركزية 0 cpu1 وحدة المعالجة المركزية 1 cpu2 وحدة المعالجة المركزية 2 cpu3 وحدة المعالجة المركزية 3 cpu4 وحدة المعالجة المركزية 4 cpu5 وحدة المعالجة المركزية 5 cpu6 وحدة المعالجة المركزية 6 cpu7 وحدة المعالجة المركزية 7 cpu8 وحدة المعالجة المركزية 8 cpu9 وحدة المعالجة المركزية 9 cpu10 وحدة المعالجة المركزية 10 cpu11 وحدة المعالجة المركزية 11 cpu12 وحدة المعالجة المركزية 12 cpu13 وحدة المعالجة المركزية 13 cpu14 وحدة المعالجة المركزية 14 cpu15 وحدة المعالجة المركزية 15 cpu16 وحدة المعالجة المركزية 16 cpu17 وحدة المعالجة المركزية 17 cpu18 وحدة المعالجة المركزية 18 cpu19 وحدة المعالجة المركزية 19 cpu20 وحدة المعالجة المركزية 20 cpu21 وحدة المعالجة المركزية 21 cpu22 وحدة المعالجة المركزية 22 cpu23 وحدة المعالجة المركزية 23 memory ذاكرة swap تبديل LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information النظام: %1%<br> المستخدم: %2%<br> لطيف: %3%<br> أخرى: %4%<br> التكرار: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information النظام: %1%<br> المستخدم: %2%<br> لطيف: %3%<br> أخرى: %4%<br> التكرار: غير متوفر apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information التطبيقات: %1%<br> المخازن المؤقتة: %2%<br> مخبأ: %3% used: %1% Swap tooltip information مستخدم: %1% min: %1%<br>max: %2% Network tooltip information الحد الأدنى: %1%<br> الحد الأقصى: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_arn.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle CPU &Nice Ot&her &Frequency S&ystem &User Memory Cache&d S&wap &Applications &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_ast.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle CPU &Nice Ot&her &Frequency S&ystem &User Memory Cache&d S&wap &Applications &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_bg.desktop.yaml ================================================ Desktop Entry/Name: "Статистика на системата" Desktop Entry/Comment: "Показва графика на мрежата, CPU и памет" ================================================ FILE: plugin-sysstat/translations/sysstat_bg.ts ================================================ LXQtSysStatColours System Statistics Colors Цветове за системната статистика Graph Графика &Grid &Мрежа Change ... Промени ... T&itle &Заглавие CPU Процесор &Nice &Приоритет Ot&her &Други &Frequency &Честота S&ystem &Система &User &Потребител Memory Памет Cache&d Кеширан&о S&wap Д&исков кеш &Applications &Приложения &Buffers &Буфери Network Мрежа &Received П&олучени &Transmitted Изп&ратени LXQtSysStatConfiguration System Statistics Settings Настройки на системната статистика Graph Графика &Minimal size &Минимален размер Update &interval &Интервал на опресняване &Title &Заглавие &Grid lines &Линии <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Минимална ширина, ако панелът е хоризонтален.</p><p>Минимална височина, ако панелът е вертикален.</p></body></html> px px s s Data Данни Use &frequency &Честота Ma&ximum М&аксимум XXX KBs XXX КБс Lo&garithmic scale Л&огаритмична скала steps стъпки &Source Източ&ник T&ype &Тип Colors Цветове Use t&heme colours Използване на цветове от т&емата Use c&ustom colours Използване на со&бствени цветове Custom colour ... Цветове ... CPU CPU Memory Памет Network Мрежа cpu проц cpu0 проц0 cpu1 проц1 cpu2 проц2 cpu3 проц3 cpu4 проц4 cpu5 проц5 cpu6 проц6 cpu7 проц7 cpu8 проц8 cpu9 проц9 cpu10 проц10 cpu11 проц11 cpu12 проц12 cpu13 проц13 cpu14 проц14 cpu15 проц15 cpu16 проц16 cpu17 проц17 cpu18 проц18 cpu19 проц19 cpu20 проц20 cpu21 проц21 cpu22 проц22 cpu23 проц23 memory памет swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information система: %1%<br>потребител: %2%<br>приоритет: %3%<br>друго: %4%<br>честота: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information система: %1%<br>потребител: %2%<br>приоритет: %3%<br>друго: %4%<br>честота: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information приложения: %1%<br>буфери: %2%<br>кеширано: %3% used: %1% Swap tooltip information използвано: %1% min: %1%<br>max: %2% Network tooltip information мин: %1%<br>макс: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_ca.desktop.yaml ================================================ Desktop Entry/Name: "Estadístiques del sistema" Desktop Entry/Comment: "Mostra un gràfic de xarxa, CPU o memòria" ================================================ FILE: plugin-sysstat/translations/sysstat_ca.ts ================================================ LXQtSysStatColours System Statistics Colors Colors de les estadístiques del sistema Graph Gràfica &Grid &Quadrícula Change ... Canvia... T&itle Tít&ol CPU CPU &Nice &Prioritat Ot&her Alt&res &Frequency &Freqüència S&ystem S&istema &User &Usuari Memory Memòria Cache&d Ca&u S&wap Intercan&vi &Applications &Aplicacions &Buffers &Búfers Network Xarxa &Received &Recepció &Transmitted &Transmissió LXQtSysStatConfiguration System Statistics Settings Ajusts de les estadístiques del sistema Graph Gràfica &Minimal size &Mida mínima Update &interval &Interval d'actualització &Title &Títol &Grid lines Línies de &quadrícula <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Amplada mínima si el panell és horitzontal.</p><p>Alçada mínima si el panell és vertical.</p></body></html> px px s s Data Data Use &frequency Utilitza la &freqüència Ma&ximum Mà&xim XXX KBs XXX KB/s Lo&garithmic scale Escala lo&garítmica steps passos &Source Orig&en T&ype T&ipus Colors Colors Use t&heme colours Utilitza els colors del te&ma Use c&ustom colours &Utilitza els colors personalitzats Custom colour ... Colors personalitzats... CPU CPU Memory Memòria Network Xarxa cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memòria swap intercanvi LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>usuari: %2%<br>nice: %3%<br>altres: %4%<br>freq.: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>usuari: %2%<br>nice: %3%<br>altres: %4%<br>freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information apps: %1%<br>búfers: %2%<br>cau: %3% used: %1% Swap tooltip information utilitzat: %1% min: %1%<br>max: %2% Network tooltip information mín.: %1%<br>màx.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_cs.desktop.yaml ================================================ Desktop Entry/Name: "Statistiky o systému" Desktop Entry/Comment: "Zobrazí graf k síti, procesoru nebo oper. paměti" ================================================ FILE: plugin-sysstat/translations/sysstat_cs.ts ================================================ LXQtSysStatColours System Statistics Colors Barvy systémových statistik Graph Graf &Grid &Mřížka Change ... Změnit… T&itle &Název CPU Procesor &Nice Před&nost Ot&her &Ostatní &Frequency &Frekvence S&ystem S&ystém &User &Uživatel Memory Paměť Cache&d &Uloženo v mezipaměti S&wap &Stránkování na disk &Applications &Aplikace &Buffers &Vyrovnávací paměti Network Síť &Received &Přijato &Transmitted &Odesláno LXQtSysStatConfiguration System Statistics Settings Nastavení systémových statistik Graph Graf &Minimal size &Minimální velikost Update &interval &Interval aktualizace &Title &Nadpis &Grid lines Čáry &mřížky <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Nejmenší šířka, pokud je panel vodorovný.</p><p>Nejmenší výška, pokud je panel svislý.</p></body></html> px obraz. bodů s s Data Data Use &frequency Použít &frekvenci Ma&ximum Ma&ximum XXX KBs XXX KB/s Lo&garithmic scale Lo&garitmická stupnice steps kroky &Source &Zdroj T&ype T&yp Colors Barvy Use t&heme colours Použít barvy &motivu Use c&ustom colours Použít &uživatelsky určené barvy Custom colour ... Uživatelsky určená barva… CPU Procesor Memory Paměť Network Síť cpu procesor cpu0 jádro0 cpu1 jádro1 cpu2 jádro2 cpu3 jádro3 cpu4 jádro4 cpu5 jádro5 cpu6 jádro6 cpu7 jádro7 cpu8 jádro8 cpu9 jádro9 cpu10 jádro10 cpu11 jádro11 cpu12 jádro12 cpu13 jádro13 cpu14 jádro14 cpu15 jádro15 cpu16 jádro16 cpu17 jádro17 cpu18 jádro18 cpu19 jádro19 cpu20 jádro20 cpu21 jádro21 cpu22 jádro22 cpu23 jádro23 memory paměť swap Stránkování na disk LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information systém: %1%<br>uživatel: %2%<br>přednost: %3%<br>ostatní: %4%<br>frekvence: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information systém: %1%<br>uživatel: %2%<br>přednost: %3%<br>ostatní: %4%<br>frekvence: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplikace: %1%<br>vyrovnávací paměti: %2%<br>uloženo v mezipaměti: %3% used: %1% Swap tooltip information použito: %1% min: %1%<br>max: %2% Network tooltip information nejméně: %1%<br>nejvíce: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_cy.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle CPU &Nice Ot&her &Frequency S&ystem &User Memory Cache&d S&wap &Applications &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_da.desktop.yaml ================================================ Desktop Entry/Name: "Systemstatistik" Desktop Entry/Comment: "Viser en graf for netværk, CPU eller hukommelse" ================================================ FILE: plugin-sysstat/translations/sysstat_da.ts ================================================ LXQtSysStatColours System Statistics Colors Farver for systemstatistik Graph Graf &Grid &Gitter Change ... Skift ... T&itle &Titel CPU CPU &Nice &Fint Ot&her &Andre &Frequency &Frekvens S&ystem &System &User &Bruger Memory Hukommelse Cache&d &Mellemlagret S&wap &Swap &Applications &Programmer &Buffers &Buffere Network Netværk &Received &Modtaget &Transmitted &Overført LXQtSysStatConfiguration System Statistics Settings Indstillinger for systemstatistik Graph Graf &Minimal size &Minimal størrelse Update &interval Opdaterings&interval &Title &Titel &Grid lines &Gitterlinjer <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Mindste bredde hvis panelet er vandret.</p><p>Mindste højde hvis panelet er lodret.</p></body></html> px px s s Data Data Use &frequency Brug &frekvens Ma&ximum &Maksimum XXX KBs XXX KBs Lo&garithmic scale &Logaritmisk skala steps trin &Source &Kilde T&ype &Type Colors Farver Use t&heme colours Brug &temaets farver Use c&ustom colours Brug &brugerdefinerede farver Custom colour ... Brugerdefineret farve ... CPU CPU Memory Hukommelse Network Netværk cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory hukommelse swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>bruger: %2%<br>fint: %3%<br>andet: %4%<br>frek.: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information system: %1%<br>bruger: %2%<br>fint: %3%<br>andet: %4%<br>frek.: utilgængelig apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information programmer: %1%<br>buffere: %2%<br>mellemlagret: %3% used: %1% Swap tooltip information brugt: %1% min: %1%<br>max: %2% Network tooltip information min.: %1%<br>maks.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_de.desktop.yaml ================================================ Desktop Entry/Name: "Systemstatistiken" Desktop Entry/Comment: "Zusatz zum Anzeigen von Systemstatistiken" ================================================ FILE: plugin-sysstat/translations/sysstat_de.ts ================================================ LXQtSysStatColours System Statistics Colors Systemstatistikfarben Graph Diagramm &Grid &Raster Change ... Ändern ... T&itle T&itel CPU CPU &Nice &Priorität Ot&her A&ndere &Frequency &Frequenz S&ystem S&ystem &User Ben&utzer Memory Speicher Cache&d Zwischenspei&cher S&wap Ausge&lagert &Applications &Anwendungen &Buffers &Puffer Network Netzwerk &Received &Empfangen &Transmitted Gesende&t LXQtSysStatConfiguration System Statistics Settings Systemstatistikeinstellungen Graph Diagramm &Minimal size &Mindestgröße Update &interval Aktualisierungs&intervall &Title &Titel &Grid lines &Rasterlinien <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimale Breite bei horizontaler Leiste.</p><p>Minimale Höhe bei vertikaler Leiste.</p></body></html> px px s s Data Daten Use &frequency &Frequenz nutzen Ma&ximum Ma&ximum XXX KBs XXX KB/s Lo&garithmic scale Lo&garithmische Skala steps Schritte &Source &Quelle T&ype T&yp Colors Farben Use t&heme colours T&hemenfarben verwenden Use c&ustom colours &Eigene Farben verwenden Custom colour ... Benutzerdefinierte Farbe ... CPU CPU Memory Speicher Network Netzwerk cpu CPU cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory Speicher swap Ausgelagert LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information System: %1%<br>Nutzer: %2%<br>Priorität: %3%<br>Andere: %4%<br>Freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information System: %1%<br>Nutzer: %2%<br>Priorität: %3%<br>Andere: %4%<br>Freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information Anwendungen: %1%<br>Puffer: %2%<br>Cache: %3% used: %1% Swap tooltip information Benutzt: %1% min: %1%<br>max: %2% Network tooltip information Min: %1%<br>Max: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_el.desktop.yaml ================================================ Desktop Entry/Name: "Στατιστικά συστήματος" Desktop Entry/Comment: "Εμφάνιση γραφήματος για το δίκτυο, την CPU ή την μνήμη" ================================================ FILE: plugin-sysstat/translations/sysstat_el.ts ================================================ LXQtSysStatColours System Statistics Colors Χρώματα στατιστικών του συστήματος Graph Γράφημα &Grid &Κάνναβος Change ... Αλλαγή... T&itle Τ&ίτλος CPU Επεξεργαστής &Nice &Προτεραιότητα Ot&her Ά&λλο &Frequency &Συχνότητα S&ystem Σύστη&μα &User &Χρήστης Memory Μνήμη Cache&d Αποθηκευμένη προσ&ωρινά S&wap Ανταλλαγής &δεδομένων &Applications Ε&φαρμογές &Buffers &Ενδιάμεση Network Δίκτυο &Received Ειλ&ημμένα &Transmitted &Διαβιβασμένα LXQtSysStatConfiguration Graph Γράφημα <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Το ελάχιστο μέγεθος αν ο πίνακας είναι τοποθετημένος οριζόντια.</p><p>Το ελάχιστο ύψος αν ο πίνακας είναι τοποθετημένος κάθετα.</p></body></html> px εικ s δ Data Δεδομένα System Statistics Settings Ρυθμίσεις στατιστικών του συστήματος &Minimal size Ελάχιστο μέ&γεθος Update &interval Χρονικό &διάστημα ενημέρωσης &Title &Τίτλος &Grid lines &Γραμμές καννάβου Use &frequency Χρήση της συ&χνότητας Ma&ximum Μέγισ&το Lo&garithmic scale Λογαρι&θμική κλίμακα CPU Επεξεργαστής Memory Μνήμη Network Δίκτυο cpu επεξεργαστής cpu0 επεξεργαστής0 cpu1 επεξεργαστής1 cpu2 επεξεργαστής2 cpu3 επεξεργαστής3 cpu4 επεξεργαστής4 cpu5 επεξεργαστής5 cpu6 επεξεργαστής6 cpu7 επεξεργαστής7 cpu8 επεξεργαστής8 cpu9 επεξεργαστής9 cpu10 επεξεργαστής10 cpu11 επεξεργαστής11 cpu12 επεξεργαστής12 cpu13 επεξεργαστής13 cpu14 επεξεργαστής14 cpu15 επεξεργαστής15 cpu16 επεξεργαστής16 cpu17 επεξεργαστής17 cpu18 επεξεργαστής18 cpu19 επεξεργαστής19 cpu20 επεξεργαστής20 cpu21 επεξεργαστής21 cpu22 επεξεργαστής22 cpu23 επεξεργαστής23 memory Μνήμη swap swap &Source &Πηγή T&ype &Τύπος Colors Χρώματα Use t&heme colours Χρήση των χρωμάτων του &θέματος Use c&ustom colours Χρήση &προσαρμοσμένων χρωμάτων Custom colour ... Προσαρμοσμένα χρώματα... XXX KBs XXX KB steps βήματα LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information σύστημα: %1%<br>χρήστης: %2%<br>nice: %3%<br>άλλο: %4%<br>συχν: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information σύστημα: %1%<br>χρήστης: %2%<br>nice: %3%<br>άλλο: %4%<br>συχν: μ/δ apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information εφαρμογές: %1%<br>ενδιάμεση μνήμη: %2%<br>λανθάνουσα: %3% used: %1% Swap tooltip information σε χρήση: %1% min: %1%<br>max: %2% Network tooltip information ελάχ: %1%<br>μέγ: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "System Statistics" Desktop Entry/Comment: "Shows a graph for network, CPU or memory" ================================================ FILE: plugin-sysstat/translations/sysstat_en_GB.ts ================================================ LXQtSysStatColours System Statistics Colors System Statistics Colours Graph Graph &Grid &Grid Change ... Change ... T&itle T&itle CPU CPU &Nice &Nice Ot&her Ot&her &Frequency &Frequency S&ystem S&ystem &User &User Memory Memory Cache&d Cache&d S&wap S&wap &Applications &Applications &Buffers &Buffers Network Network &Received &Received &Transmitted &Transmitted LXQtSysStatConfiguration System Statistics Settings System Statistics Settings Graph Graph &Minimal size &Minimal size Update &interval Update &interval &Title &Title &Grid lines &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px px s s Data Data Use &frequency Use &frequency Ma&ximum Ma&ximum XXX KBs XXX KBs Lo&garithmic scale Lo&garithmic scale steps steps &Source &Source T&ype T&ype Colors Colours Use t&heme colours Use t&heme colours Use c&ustom colours Custom colour ... CPU CPU Memory Memory Network Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_es.desktop.yaml ================================================ Desktop Entry/Name: "Estadísticas del sistema" Desktop Entry/Comment: "Muestra un gráfico de red, CPU o memoria" ================================================ FILE: plugin-sysstat/translations/sysstat_es.ts ================================================ LXQtSysStatColours System Statistics Colors Colores de Estadísticas del sistema Graph Gráfico &Grid &Cuadrícula Change ... Cambiar... T&itle T&ítulo CPU CPU &Nice &Prioridad Ot&her Otras &Frequency &Frecuencia S&ystem Sistema &User &Usuario Memory Memoria Cache&d En caché S&wap Intercambio &Applications &Aplicaciones &Buffers &Búferes Network Red &Received &Recibido &Transmitted &Transmitido LXQtSysStatConfiguration System Statistics Settings Configuración de Estadísticas del sistema Graph Gráfico &Minimal size Tamaño &mínimo Update &interval &Intervalo de actualización &Title &Título &Grid lines Líneas de rejilla <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Ancho mínimo si el panel está en horizontal.</p><p>Altura mínima si el panel está en vertical.</p></body></html> px px s s Data Datos Use &frequency Usar &frecuencia Ma&ximum Má&ximo XXX KBs XXX KB/s Lo&garithmic scale Escala lo&garítmica steps pasos &Source &Origen T&ype Tipo Colors Colores Use t&heme colours Usar los colores del tema Use c&ustom colours &Usar colores personalizados Custom colour ... Color personalizado... CPU CPU Memory Memoria Network Red cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memoria swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>usuario: %2%<br>prioridad: %3%<br>otras: %4%<br>frec: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>usuario: %2%<br>prioridad: %3%<br>otras: %4%<br>frec: no disponible apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplicaciones: %1%<br>búferes: %2%<br>en caché: %3% used: %1% Swap tooltip information usada: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>máx: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_et.desktop.yaml ================================================ Desktop Entry/Name: "Süsteemi statistika" Desktop Entry/Comment: "Näitab võrguühenduse, protsessori ja mälu koormusgraafikut" ================================================ FILE: plugin-sysstat/translations/sysstat_et.ts ================================================ LXQtSysStatColours System Statistics Colors Süsteemi statistika värvid Graph Graafik &Grid &Alusvõrk Change ... Muuda... T&itle &Pealkiri CPU Protsessor &Nice &Prioriteet Ot&her M%uu &Frequency &Sagedus S&ystem S&üsteem &User &Kasutaja Memory Mälu Cache&d Puhverdatu&d S&wap S&aaleala &Applications &Rakendused &Buffers &Puhvrid Network Võrk &Received &Saadetud &Transmitted &Vastu võetud LXQtSysStatConfiguration System Statistics Settings Süsteemi statistika seadistused Graph Graafik &Minimal size &Väikseim suurus Update &interval Uuendamise &välp &Title &Pealkiri &Grid lines &Alusvõrk <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Paneeli vähim laius horisontaalselt.</p><p>Paneeli vähim kõrgus vertikaalselt.</p></body></html> px pikslit s sekundit Data Andmed Use &frequency Näita &sagedust Ma&ximum Ma&ksimaalne XXX KBs XXX KB Lo&garithmic scale Lo&garitmiline skaala steps sammu &Source &Aallikas T&ype T&üüp Colors Värvid Use t&heme colours Kasuta &teema värve Use c&ustom colours Kasuta &kohandatud värve Custom colour ... Kohandatud värv... CPU CPU Memory Mälu Network Võrk cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory mälu swap saaleala LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information süsteem: %1%<br>kasutaja: %2%<br>prioriteet: %3%<br>muu: %4%<br>sagedus: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information süsteem: %1%<br>kasutaja: %2%<br>prioriteet: %3%<br>muu: %4%<br>sagedus: pole teada apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information rakendused: %1%<br>puhverdatud: %2%<br>puhverdatud kettale: %3% used: %1% Swap tooltip information kasutusel: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>maks: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_fi.desktop.yaml ================================================ Desktop Entry/Name: "Järjestelmätilastot" Desktop Entry/Comment: "Näyttää kaavion verkolle, prosessorille tai muistille" ================================================ FILE: plugin-sysstat/translations/sysstat_fi.ts ================================================ LXQtSysStatColours System Statistics Colors Järjestelmätilastojen värit Graph Kaavio &Grid &Ruudukko Change ... Muuta... T&itle &Otsikko CPU CPU &Nice Pr&ioriteetti Ot&her &Muut &Frequency &Taajuus S&ystem &Järjestelmä &User &Käyttäjä Memory Muisti Cache&d &Välimuistissa S&wap Siv&utettu &Applications &Sovellukset &Buffers &Puskurit Network Verkko &Received V&astaanotettu &Transmitted &Lähetetty LXQtSysStatConfiguration System Statistics Settings Järjestelmätilastojen asetukset Graph Kaavio &Minimal size &Minimikoko Update &interval &Päivitysväli &Title &Otsikko &Grid lines &Ruudukkoviivat <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimileveys jos paneeli on vaakatasossa.</p><p>Minimikorkeus jos paneeli on pystysuorassa.</p></body></html> px px s s. Data Data Use &frequency Käytä t&aajuutta Ma&ximum &Yläraja XXX KBs XXX kilotavua Lo&garithmic scale &Logaritminen kerroin steps vaihetta &Source &Lähde T&ype &Tyyppi Colors Värit Use t&heme colours Käytä t&eeman värejä Use c&ustom colours &Käytä omia värejä Custom colour ... Mukautettu väri... CPU CPU Memory Muisti Network Verkko cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory muisti swap sivutus LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information järj.: %1%<br>käytt.: %2%<br>prio.: %3%<br>muu: %4%<br>taaj.: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information järj.: %1%<br>käytt.: %2%<br>prio.: %3%<br>muu: %4%<br>taaj.: - apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information sovellukset: %1%<br>puskurit: %2%<br>välimuistissa: %3% used: %1% Swap tooltip information käytössä: %1% min: %1%<br>max: %2% Network tooltip information pienin: %1%<br>-suurin: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_fr.desktop.yaml ================================================ Desktop Entry/Name: "Statistiques du système" Desktop Entry/Comment: "Affiche un graphique pour le réseau, le processeur ou la mémoire" ================================================ FILE: plugin-sysstat/translations/sysstat_fr.ts ================================================ LXQtSysStatColours System Statistics Colors Couleurs des statistiques du système Graph Graphique &Grid &Grille Change ... Changer... T&itle T&itre CPU CPU &Nice &Bien Ot&her A&utre &Frequency &Fréquence S&ystem S&ystème &User &Utilisateur Memory Mémoire Cache&d Cac&hée S&wap Échan&ge &Applications &Applications &Buffers &Tampons Network Réseau &Received &Reçus &Transmitted &Transmis LXQtSysStatConfiguration System Statistics Settings Paramètres des statistiques du système Graph Graphique &Minimal size Taille &minimale Update &interval &Intervalle des mises à jour &Title &Titre &Grid lines Lignes de &grille <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Largeur minimale si le panneau est horizontal.</p><p>Hauteur minimale si le panneau est vertical.</p></body></html> px px s s Data Données Use &frequency Utiliser la &fréquence Ma&ximum &Maximum XXX KBs XXX Ko(s) Lo&garithmic scale Échelle lo&garithmique steps étapes &Source &Source T&ype T&ype Colors Couleurs Use t&heme colours Utiliser les couleurs du t&hème Use c&ustom colours &Utiliser des couleurs personnalisées Custom colour ... Couleurs personnalisées... CPU CPU Memory Mémoire Network Réseau cpu CPU cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory mémoire swap mémoire d'échange LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information système : %1%<br>utilisateur : %2%<br>nice : %3%<br>autre : %4%<br>fréq : %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information système : %1%<br>utilisateur : %2%<br>nice : %3%<br>autre : %4%<br>fréq : n/c apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information applis : %1%<br>tampons : %2%<br>en cache : %3% used: %1% Swap tooltip information utilisée : %1% min: %1%<br>max: %2% Network tooltip information min : %1%<br>max : %2% ================================================ FILE: plugin-sysstat/translations/sysstat_gl.ts ================================================ LXQtSysStatColours System Statistics Colors Cores das estatísticas do sistema Graph Gráfico &Grid &Grella Change ... Cambiar... T&itle &Título CPU &Nice &Prioridade Ot&her &Outras &Frequency &Frecuencia S&ystem &Sistema &User &Usuario Memory Memoria Cache&d Na &caché S&wap &Intercambio &Applications &Aplicacións &Buffers &Búferes Network Rede &Received &Recibido &Transmitted &Enviado LXQtSysStatConfiguration System Statistics Settings Axustes das estatísticas do sistema Graph Gráfico &Minimal size Tamaño &mínimo Update &interval &Intervalo de actualización &Title &Título &Grid lines Liñas da &grella <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Datos Use &frequency Usar a &frecuencia Ma&ximum Má&ximo XXX KBs XXX KB/s Lo&garithmic scale Escala lo&garítmica steps pasos &Source &Orixe T&ype Ti&po Colors Cores Use t&heme colours Usar as cores do &tema Use c&ustom colours Usar cores &personalizadas Custom colour ... Cor personalizado ... CPU Memory Memoria Network Rede cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory memoria swap memoria de intercambio LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>usuario: %2%<br>prioridade: %3%<br>outras: %4%<br>frec: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>usuario: %2%<br>prioridade: %3%<br>otras: %4%<br>frec: n/d apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplicacións: %1%<br>búferes: %2%<br>na caché: %3% used: %1% Swap tooltip information utilizada: %1% min: %1%<br>max: %2% Network tooltip information mín: %1%<br>máx: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_he.desktop.yaml ================================================ Desktop Entry/Name: "סטטיסטיקת המערכת" Desktop Entry/Comment: "מציג תרשים לניצולת רשת, מעבד וזיכרון" ================================================ FILE: plugin-sysstat/translations/sysstat_he.ts ================================================ LXQtSysStatColours System Statistics Colors צבעי סטטיסטיקת מערכת Graph תרשים &Grid &רשת Change ... שינוי… T&itle &כותרת CPU מעבד &Nice &עדיפות Ot&her &אחר &Frequency ת&דירות S&ystem מ&ערכת &User מ&שתמש Memory זיכרון Cache&d במ&טמון S&wap החל&פה &Applications יי&שומים &Buffers &חוצצים Network רשת &Received הת&קבלו &Transmitted &נשלחו LXQtSysStatConfiguration System Statistics Settings הגדרות סטטיסטיקת מערכת Graph תרשים &Minimal size גודל מז&ערי Update &interval ה&פרש בין עדכונים &Title &כותרת &Grid lines &קווי רשת <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>רוחב מזערי אם הלוח אופקי.</p><p>גובה מזערי אם הלוח אנכי.</p></body></html> px פיקסלים s שנ׳ Data נתונים Use &frequency שימוש בת&דירות Ma&ximum מ&רבי XXX KBs XXX ק״ב/שנ׳ Lo&garithmic scale קנה מידה &לוגריתמי steps צעדים &Source מ&קור T&ype &סוג Colors צבעים Use t&heme colours שימוש בצבעי &ערכת העיצוב Use c&ustom colours שימוש בצבעים בהת&אמה אישית Custom colour ... צבע בהתאמה אישית… CPU מעבד Memory זיכרון Network רשת cpu מעבד cpu0 מעבד0 cpu1 מעבד1 cpu2 מעבד2 cpu3 מעבד3 cpu4 מעבד4 cpu5 מעבד5 cpu6 מעבד6 cpu7 מעבד7 cpu8 מעבד8 cpu9 מעבד9 cpu10 מעבד10 cpu11 מעבד11 cpu12 מעבד12 cpu13 מעבד13 cpu14 מעבד14 cpu15 מעבד15 cpu16 מעבד16 cpu17 מעבד17 cpu18 מעבד18 cpu19 מעבד19 cpu20 מעבד20 cpu21 מעבד21 cpu22 מעבד22 cpu23 מעבד23 memory זיכרון swap החלפה LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information מערכת: %1%<br>משתמש: %2%<br>nice: %3%<br>אחר: %4%<br>תדירות: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information מערכת: %1%<br>משתמש: %2%<br>nice: %3%<br>אחר: %4%<br>תדירות: לא זמינה apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information יישומים: %1%<br>חוצצים: %2%<br>במטמון: %3% used: %1% Swap tooltip information מנוצל: %1% min: %1%<br>max: %2% Network tooltip information מזערי: %1%<br>מרבי: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_hr.desktop.yaml ================================================ Desktop Entry/Name: "Statistika sustava" Desktop Entry/Comment: "Prikazuje grafikon za mrežu, CPU ili memoriju" ================================================ FILE: plugin-sysstat/translations/sysstat_hr.ts ================================================ LXQtSysStatColours System Statistics Colors Statistika sustava – Boje Graph Dijagram &Grid &Mreža Change ... Promijeni … T&itle Na&slov CPU CPU &Nice &Nice Ot&her Os&talo &Frequency &Frekvencija S&ystem S&ustav &User &Korisnik Memory Memorija Cache&d Pre&dmemorija S&wap &Virtualna &Applications &Programi &Buffers M&eđuspremnici Network Mreža &Received P&rimljeno &Transmitted Prenesen&o LXQtSysStatConfiguration System Statistics Settings Statistika sustava – Postavke Graph Dijagram &Minimal size &Minimalna veličina Update &interval &Interval aktualiziranja &Title Naslo&v &Grid lines Broj linija &mreže <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimalna širina, ako ploča stoji vodoravno.</p><p>Minimalna visina, ako ploča stoji okomito.</p></body></html> px px s s Data Podaci Use &frequency Koristi &frekvenciju Ma&ximum Ma&ksimum XXX KBs XXX KB Lo&garithmic scale Lo&garitamska mjera steps koraka &Source &Izvor T&ype &Vrsta Colors Boje Use t&heme colours Koristi boj&e teme Use c&ustom colours Koristi &prilagođene boje Custom colour ... Prilagođena boja … CPU CPU Memory Memorija Network Mreža cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memorija swap virtualna LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sustav: %1 %<br>korisnik: %2 %<br>nice: %3 %<br>ostalo: %4 %<br>frekv.: %5 % system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sustav: %1 %<br>korisnik: %2 %<br>nice: %3 %<br>ostalo: %4 %<br>frekv.: -- apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information programi: %1 %<br>međuspremnici: %2 %<br>predmemorija: %3 % used: %1% Swap tooltip information korišteno: %1 % min: %1%<br>max: %2% Network tooltip information min.: %1 %<br>maks.: %2 % ================================================ FILE: plugin-sysstat/translations/sysstat_hu.desktop.yaml ================================================ Desktop Entry/Name: "Rendszerstatisztika" Desktop Entry/Comment: "Egy grafikont jelenít meg a hálózat-, processzor- és memóriahasználatról" ================================================ FILE: plugin-sysstat/translations/sysstat_hu.ts ================================================ LXQtSysStatColours System Statistics Colors Rendszerstatisztika színek Graph Grafikon &Grid &Rács Change ... Változtatás... T&itle Fel&irat CPU Processzor &Nice &Nice Ot&her &Egyéb &Frequency &Frekvencia S&ystem Rend&szer &User &Felhasználó Memory Memória Cache&d &Gyorsítótárazva S&wap &Swap &Applications &Alkalmazások &Buffers &Pufferek Network Hálózat &Received &Fogadott &Transmitted &Küldött LXQtSysStatConfiguration Graph Grafikon <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Legkisebb szélesség, ha a panel vízszintes.</p><p>Legkisebb magasság, ha a panel függőleges.</p></body></html> px px s mp Data Adatok System Statistics Settings Rendszerstatisztika beállítások &Minimal size Legkisebb &méret Update &interval Fr&issítési időköz &Title Felira&t &Grid lines &Rácsvonalak Use &frequency &Frekvencia használata Ma&ximum Ma&ximális Lo&garithmic scale Lo&garitmikus skála CPU Processzor Memory Memória Network Hálózat cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory memória swap swap &Source Forrá&s T&ype &Típus Colors Színek Use t&heme colours &Rendszertéma használata Use c&ustom colours &Egyéni Custom colour ... Egyéni színek... XXX KBs XXX KB steps lépés LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information rendszer: %1%<br>felhasználó: %2%<br>nice: %3%<br>egyéb: %4%<br>frekvencia: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information rendszer: %1%<br>felhasználó: %2%<br>nice: %3%<br>más: %4%<br>freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information alkalmazások: %1%<br>pufferek: %2%<br>gyorsítótárazva: %3% used: %1% Swap tooltip information használt: %1% min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_id.ts ================================================ LXQtSysStatColours System Statistics Colors Warna Statistik Sistem Graph Grafik &Grid Kisi Change ... Ubah ... T&itle Judul CPU CPU &Nice &Nice Ot&her Lainnya &Frequency &Frekuensi S&ystem Sistem &User Pengguna Memory Memori Cache&d Tembolok S&wap S&wap &Applications &Aplikasi &Buffers &Buffers Network Jaringan &Received Diterima &Transmitted Dikirim LXQtSysStatConfiguration System Statistics Settings Pengaturan Statistik Sistem Graph Grafik &Minimal size Ukuran minimal Update &interval &Interval pembaruan &Title Judul &Grid lines Garis kisi <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px px s s Data Data Use &frequency Gunakan &frekuensi Ma&ximum Maksimal XXX KBs XXX KBs Lo&garithmic scale Skala lo&garitmik steps langkah &Source &Sumber T&ype Tipe Colors Warna Use t&heme colours Gunakan warna tema Use c&ustom colours Gunakan warna kustom Custom colour ... Warna kustom ... CPU CPU Memory Memori Network Jaringan cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memori swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistem: %1%<br>pengguna: %2%<br>nice: %3%<br>lainnya: %4%<br>frek: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistem: %1%<br>pengguna: %2%<br>nice: %3%<br>lainnya: %4%<br>frek: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information apl: %1%<br>buffers: %2%<br>tembolok: %3% used: %1% Swap tooltip information terpakai: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>maks: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_it.desktop.yaml ================================================ Desktop Entry/Name: "Statistiche del sistema" Desktop Entry/Comment: "Mostra un grafico per rete, processore e memoria" ================================================ FILE: plugin-sysstat/translations/sysstat_it.ts ================================================ LXQtSysStatColours System Statistics Colors Colori delle statistiche di sistema Graph Grafico &Grid &Griglia Change ... Cambia... T&itle T&itolo CPU CPU &Nice &Priorità Ot&her &Altro &Frequency &Frequenza S&ystem &Sistema &User &Utente Memory Memoria Cache&d cache&d S&wap &Swap &Applications &Applicazioni &Buffers &Buffer Network Rete &Received &Ricevuti &Transmitted &Trasmessi LXQtSysStatConfiguration Graph Grafico <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Larghezza minimale se il pannello è horizontale.</p><p>Altezza minima se il pannello è verticale.</p></body></html> px s Data Dati System Statistics Settings Impostazioni statistiche del sistema &Minimal size &Dimensione minima Update &interval &Intervallo di aggiornamento &Title &Titolo &Grid lines &Linee della griglia Use &frequency Usa &frequenza Ma&ximum &Massimo Lo&garithmic scale Scala &logaritmica CPU CPU Memory Memoria Network Rete cpu CPU cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memoria swap swap &Source &Sorgente T&ype &Tipo Colors Colori Use t&heme colours Usa colori del &tema Use c&ustom colours Colori &personalizzati Custom colour ... Colore personalizzato ... XXX KBs XXX KB/s steps intervalli LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>utente: %2%<br>nice: %3%<br>altro: %4%<br>freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>utente: %2%<br>nice: %3%<br>altro: %4%<br>freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information app: %1%<br>buffers: %2%<br>in cache: %3% used: %1% Swap tooltip information usata: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br> max: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_ja.desktop.yaml ================================================ Desktop Entry/Name: "システム統計情報" Desktop Entry/Comment: "ネットワーク、CPU、メモリのグラフを表示します" ================================================ FILE: plugin-sysstat/translations/sysstat_ja.ts ================================================ LXQtSysStatColours System Statistics Colors システム統計の色 Graph グラフ &Grid グリッド(&G) Change ... 変更 ... T&itle タイトル(&T) CPU CPU &Nice Nice値(&N) Ot&her その他(&H) &Frequency 周波数(&F) S&ystem システム(&Y) &User ユーザー(&U) Memory メモリ Cache&d キャッシュ(&D) S&wap スワップ(&W) &Applications アプリケーション(&A) &Buffers バッファー(&B) Network ネットワーク &Received 受信(&R) &Transmitted 送信(&T) LXQtSysStatConfiguration Graph グラフ <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>パネルが水平では最小幅。</p><p>パネルが垂直では最小高。</p></body></html> px ピクセル s Data データ System Statistics Settings システム統計の設定 &Minimal size 最小サイズ(&M) Update &interval 更新間隔(&I) &Title タイトル(&T) &Grid lines グリッド線の数(&G) Use &frequency 周波数をグラフ表示する(&F) Ma&ximum 最大(&X) Lo&garithmic scale 対数スケール(&G) CPU CPU Memory メモリ Network ネットワーク cpu CPU cpu0 CPU 0 cpu1 CPU 1 cpu2 CPU 2 cpu3 CPU 3 cpu4 CPU 4 cpu5 CPU 5 cpu6 CPU 6 cpu7 CPU 7 cpu8 CPU 8 cpu9 CPU 9 cpu10 CPU 10 cpu11 CPU 11 cpu12 CPU 12 cpu13 CPU 13 cpu14 CPU 14 cpu15 CPU 15 cpu16 CPU 16 cpu17 CPU 17 cpu18 CPU 18 cpu19 CPU 19 cpu20 CPU 20 cpu21 CPU 21 cpu22 CPU 22 cpu23 CPU 23 memory メモリ swap スワップ &Source 情報元(&S) T&ype 種類(&Y) Colors Use t&heme colours テーマの色を使用する(&H) Use c&ustom colours 色を指定する(&U) Custom colour ... 色の指定 ... XXX KBs XXX KB steps ステップ LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information システム: %1%<br>ユーザー: %2%<br>Nice値: %3%<br>その他: %4%<br>周波数: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information システム: %1%<br>ユーザー: %2%<br>Nice値: %3%<br>その他: %4%<br>周波数: 不明 apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information アプリケーション: %1%<br>バッファー: %2%<br>キャッシュ: %3% used: %1% Swap tooltip information 使用量: %1% min: %1%<br>max: %2% Network tooltip information 最小: %1%<br>最大: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_ka.desktop.yaml ================================================ Desktop Entry/Name: "სისტემის სტატისტიკა" Desktop Entry/Comment: "აჩვენებს გრაფიკს ქსელისთვის, პროცესორისთვის ან მეხსიერებისთვის" ================================================ FILE: plugin-sysstat/translations/sysstat_ka.ts ================================================ LXQtSysStatColours System Statistics Colors სისტემის სტატისტიკის ფერები Graph გრაფიკი &Grid &ბადე Change ... შეცვლა... T&itle &სათაური CPU პროცესორი &Nice &პრიო Ot&her &სხვა &Frequency სი&ხშირე S&ystem &სისტემა &User მომ&ხმარებელი Memory მეხსიერება Cache&d &დაკეშილი S&wap ს&ვოპი &Applications &აპლიკაციები &Buffers &ბუფერები Network ქსელი &Received მი&ღებულია &Transmitted გადა&ცემულია LXQtSysStatConfiguration System Statistics Settings სისტემის სტატისტიკის მორგება Graph გრაფიკი &Minimal size &მინიმალური ზომა Update &interval განახლების &ინტერვალი &Title &სათაური &Grid lines ბადის ხა&ზები <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>მინიმალური სიგანე, თუ პანელი ჰორიზონალურია.</p><p>მინიმალური სიმაღლე, თუ პანელი ვერტიკალურია.</p></body></html> px პქს s s Data მონაცემები Use &frequency სიხშირის გამო&ყენება Ma&ximum მაქ&სიმუმი XXX KBs XXX კბწმ Lo&garithmic scale ლო&გარითმიური მასშტაბი steps ნაბიჯები &Source &წყარო T&ype &ტიპი Colors ფერები Use t&heme colours &თემის ფერების გამოყენება Use c&ustom colours მორგებ&ული ფერების გამოყენება Custom colour ... მორგებული ფერი ... CPU პროცესორი Memory მეხსიერება Network ქსელი cpu პროცესორი cpu0 პროცესორი0 cpu1 პროცესორი1 cpu2 პროცესორი2 cpu3 პროცესორი3 cpu4 პროცესორი4 cpu5 პროცესორი5 cpu6 პროცესორი6 cpu7 პროცესორი7 cpu8 პროცესორი8 cpu9 პროცესორი9 cpu10 პროცესორი10 cpu11 პროცესორი11 cpu12 პროცესორი12 cpu13 პროცესორი13 cpu14 პროცესორი14 cpu15 პროცესორი15 cpu16 პროცესორი16 cpu17 პროცესორი17 cpu18 პროცესორი18 cpu19 პროცესორი19 cpu20 პროცესორი20 cpu21 პროცესორი21 cpu22 პროცესორი22 cpu23 პროცესორი23 memory მეხსიერება swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information სისტემა: %1%<br>მომხმარებელი: %2%<br>ლამაზი: %3%<br>სხვა: %4%<br>freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information სისტემა: %1%<br>მომხმარებელი: %2%<br>პრიორიტეტი: %3%<br>სხვა: %4%<br>სიხშ: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information აპები: %1%<br>ბუფერები: %2%<br>დაკეშილი: %3% used: %1% Swap tooltip information გამოყენებულია: %1% min: %1%<br>max: %2% Network tooltip information მინ: %1%<br>მაქს: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_kab.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle A&zwel CPU CPU &Nice Ot&her &Frequency S&ystem A&nagraw &User Ase&qdac Memory Cache&d S&wap &Applications Is&nasen &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_kk.desktop.yaml ================================================ Desktop Entry/Name: "Жүйелік статистика" Desktop Entry/Comment: "Желі, процессор немесе жады графиктерін көрсетеді" ================================================ FILE: plugin-sysstat/translations/sysstat_kk.ts ================================================ LXQtSysStatColours System Statistics Colors Жүйе статистикасының түстері Graph График &Grid &Тор Change ... Өзгерту ... T&itle Ата&уы CPU Процессор &Nice &Приоритет Ot&her Б&асқа &Frequency &Жиілік S&ystem Жү&йе &User &Пайдаланушы Memory Жады Cache&d К&эштелген S&wap &Своп &Applications Қ&олданбалар &Buffers &Буферлер Network Желі &Received Қ&абылданған &Transmitted &Жіберілген LXQtSysStatConfiguration System Statistics Settings Жүйе статистикасының баптаулары Graph График &Minimal size &Минималды өлшемі Update &interval Жаңарту &аралығы &Title &Тақырыбы &Grid lines &Тор сызықтары <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Егер панель горизонталды болса, минималды ені.</p><p>Егер панель вертикалды болса, минималды биіктігі.</p></body></html> px пикс s с Data Деректер Use &frequency &Жиілікті пайдалану Ma&ximum Ма&ксимум XXX KBs XXX КБ/с Lo&garithmic scale Ло&гарифмдік шкала steps қадам &Source Қ&айнар көзі T&ype &Түрі Colors Түстер Use t&heme colours Т&ема түстерін пайдалану Use c&ustom colours Таңдау&ыңызша түстерді пайдалану Custom colour ... Таңдауыңызша түс ... CPU Процессор Memory Жады Network Желі cpu процессор cpu0 процессор 0 cpu1 процессор 1 cpu2 процессор 2 cpu3 процессор 3 cpu4 процессор 4 cpu5 процессор 5 cpu6 процессор 6 cpu7 процессор 7 cpu8 процессор 8 cpu9 процессор 9 cpu10 процессор 10 cpu11 процессор 11 cpu12 процессор 12 cpu13 процессор 13 cpu14 процессор 14 cpu15 процессор 15 cpu16 процессор 16 cpu17 процессор 17 cpu18 процессор 18 cpu19 процессор 19 cpu20 процессор 20 cpu21 процессор 21 cpu22 процессор 22 cpu23 процессор 23 memory жады swap своп LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information жүйе: %1%<br>пайдаланушы: %2%<br>nice: %3%<br>басқа: %4%<br>жиілік: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information жүйе: %1%<br>пайдаланушы: %2%<br>nice: %3%<br>басқа: %4%<br>жиілік: қолжетімсіз apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information қолданбалар: %1%<br>буферлер: %2%<br>кэштелген: %3% used: %1% Swap tooltip information пайдаланылды: %1% min: %1%<br>max: %2% Network tooltip information мин: %1%<br>макс: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_ko.desktop.yaml ================================================ Desktop Entry/Name: "시스템 통계" Desktop Entry/Comment: "네트워크, CPU 또는 메모리에 대한 그래프를 표시합니다" ================================================ FILE: plugin-sysstat/translations/sysstat_ko.ts ================================================ LXQtSysStatColours System Statistics Colors 시스템 통계 색상 Graph 그래프 &Grid 격자(&G) Change ... 변경 ... T&itle 제목(&I) CPU CPU &Nice 좋음(&N) Ot&her 기타(&H) &Frequency 빈도(&F) S&ystem 시스템(&Y) &User 사용자(&U) Memory 메모리 Cache&d 캐시됨(&D) S&wap 스왑(&W) &Applications 응용프로그램(&A) &Buffers 버퍼(&B) Network 네트워크 &Received 수신됨(&R) &Transmitted 전송됨(&T) LXQtSysStatConfiguration System Statistics Settings 시스템 통계 설정 Graph 그래프 &Minimal size 최소 크기(&M) Update &interval 업데이트 간격(&I) &Title 제목(&T) &Grid lines 격자 선(&G) <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>패널이 가로인 경우 최소 너비입니다.</p><p>패널이 세로인 경우 최소 높이입니다.</p></body></html> px 픽셀 s Data 데이터 Use &frequency 빈도 사용(&F) Ma&ximum 최대(&X) XXX KBs XXX KB Lo&garithmic scale 로그 스케일(&G) steps 단계 &Source 소스(&S) T&ype 유형(&Y) Colors 색상 Use t&heme colours 테마 색상 사용(&H) Use c&ustom colours 사용자 지정 색상 사용(&U) Custom colour ... 사용자 지정 색상 ... CPU CPU Memory 메모리 Network 네트워크 cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory 메모리 swap 스왑 LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information 시스템: %1%<br>사용자: %2%<br>좋음: %3%<br>기타: %4%<br>빈도: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information 시스템: %1%<br>사용자: %2%<br>좋음: %3%<br>기타: %4%<br>빈도: 해당 없음 apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information 앱: %1%<br>버퍼: %2%<br>캐시됨: %3% used: %1% Swap tooltip information 사용됨: %1% min: %1%<br>max: %2% Network tooltip information 최소: %1%<br>최대: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ekirabiriza kukuluusana kwa sisitemu" Desktop Entry/Comment: "Kano kateekawo ekifaananyi eky'okubala ekiraga kimu ku: kukuluusana kw'ekitundu ekibazi, eggwanika oba emikutu egikwataganye ne kayungirizi" ================================================ FILE: plugin-sysstat/translations/sysstat_lg.ts ================================================ LXQtSysStatColours System Statistics Colors Langi eza mu bifaananyi eby'okubala okukuluusana kwa sisitemu Graph Ez'oku bwaliriro bw'ekifaananyi &Grid Ey'e&nkoloboze Change ... Gikyuse... T&itle Ey'ebigambo eby'omu &mutwe CPU Ez'ebisangibwa ku ky'okukuluusana kw'ekitundu ekibazi &Nice Emirimu egiriko en&soosawaza Ot&her Emirimu emi&rala &Frequency &Obusobozi obukozesebwa S&ystem Emirimu egy'okuddukanya sisi&temu &User Emirimu gy'aba&kozesa Memory Ez'ebisangibwa ku ky'enkozesa y'eggwanika Cache&d Erikola ng'ezzibizi ery'obu&wangaazi S&wap Erikola ng'eggwanika ery'en&yongeza ery'ekiseera &Applications Eririmu &puloguramu &Buffers Erikozesebwa ng'eggwanika zzibizi ery'ekis&eera Network Ez'ebisangibwa ku ky'empulizigana ku kayungirizi &Received Ebitole ebi&funidwa &Transmitted Ebitole ebisin&dikidwa LXQtSysStatConfiguration System Statistics Settings Enteekateeka y'okubala okukuluusana kwa sisistemu Graph Kifaananyi eky'okubala &Minimal size Ekkomo ly'obu&tono Update &interval Ob&wangu bw'okukebera ebipya &Title &Mutwe &Grid lines Bungi bw'ebi&rambe <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Olubaawo bwe luba kya bugazi liba kkomo lya bugazi bw'ekifaananyi.</p><p>Olubaawo bwe luba busimbalaala liba kkomo ly bugulumivu bwa kifaananyi.</p></body></html> px px s s Data Ebibalibwa Use &frequency Bala enkozesa y'obu&sobozi bw'ekitundu ekibazi Ma&ximum Obwa&ngu obusinga yo waggulu XXX KBs XXX KB/s Lo&garithmic scale Entereeza y'ebipimo egoborere lo&garitimu steps ennekubisa &Source &Nnono y'ebibalibwa T&ype Eki&balibwa Colors Langi Use t&heme colours Kozesa lul&yo lwa langi olutegekedwa ku sisitemu Use c&ustom colours Werondere langi e&zinaakozesebwa Custom colour ... Londa langi... CPU Okukuluusana kw'ekitundu ekibazi Memory Enkozesa y'eggwanika Network Empulizigana ku kayungirizi cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory ggwanika lyonna swap ggwanika ery'enyongeza ery'ekiseera LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information egiddukanya sisitemu: %1%<br> egy'abakozesa: %2%<br>egiriko ensoosawaza: %3%<br>mirala: %4%<br>bosobozi bw'ekibazi: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information egiddukanya sisitemu: %1%<br> egy'abakozesa: %2%<br>egiriko ensoosawaza: %3%<br>mirala: %4%<br>bosobozi bw'ekibazi: tekibalidwa apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information eririmu puloguramu: %1%<br>ezzibizi ery'ekiseera: %2%<br>ezzibizi ery'obuwangaazi: %3% used: %1% Swap tooltip information kukozesebwako: %1% min: %1%<br>max: %2% Network tooltip information ebitono: %1%<br>ebingi: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_lt.desktop.yaml ================================================ Desktop Entry/Name: "Sistemos statistika" Desktop Entry/Comment: "Rodo tinklo, procesoriaus ar atminties grafiką" ================================================ FILE: plugin-sysstat/translations/sysstat_lt.ts ================================================ LXQtSysStatColours System Statistics Colors Sistemos statistikos spalvos Graph Grafikas &Grid &Tinklelis Change ... Pakeisti ... T&itle &Pavadinimas CPU Procesorius &Nice „N&ice“ reikšmė Ot&her &Kita &Frequency &Dažnis S&ystem S&istema &User Na&udotojas Memory Atmintis Cache&d Yra po&dėlyje S&wap S&ukeitimų skaidinys &Applications P&rogramos &Buffers &Buferiai Network Tinklas &Received &Gauta &Transmitted &Persiųsta LXQtSysStatConfiguration System Statistics Settings Sistemos statistikos nustatymai Graph Grafikas &Minimal size &Minimalus dydis Update &interval Atnaujinimo &intervalas &Title &Pavadinimas &Grid lines &Tinklelio eilutės <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Mažiausias plotis, jei skydelis horizontalus.</p><p>Mažiausias aukštis, jei skydelis vertikalus.</p></body></html> px pikselių s s Data Duomenys Use &frequency Naudoti &dažnį Ma&ximum Da&ugiausia XXX KBs XXX KB Lo&garithmic scale Lo&garitminė skalė steps žingsnių &Source Š&altinis T&ype T&ipas Colors Spalvos Use t&heme colours Naudoti t&emos spalvas Use c&ustom colours Naudoti &tinkintas spalvas Custom colour ... Tinkinta spalva ... CPU Procesorius Memory Atmintis Network Tinklas cpu procesorius cpu0 procesorius0 cpu1 procesorius1 cpu2 procesorius2 cpu3 procesorius3 cpu4 procesorius4 cpu5 procesorius5 cpu6 procesorius6 cpu7 procesorius7 cpu8 procesorius8 cpu9 procesorius9 cpu10 procesorius10 cpu11 procesorius11 cpu12 procesorius12 cpu13 procesorius13 cpu14 procesorius14 cpu15 procesorius15 cpu16 procesorius16 cpu17 procesorius17 cpu18 procesorius18 cpu19 procesorius19 cpu20 procesorius20 cpu21 procesorius21 cpu22 procesorius22 cpu23 procesorius23 memory atmintis swap sukeitimų skaidinys LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>naudotojas: %2%<br>nice: %3%<br>kita: %4%<br>dažnis: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>naudotojas: %2%<br>nice: %3%<br>kita: %4%<br>dažnis: nėra apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information programos: %1%<br>buferiai: %2%<br>yra podėlyje: %3% used: %1% Swap tooltip information panaudota: %1% min: %1%<br>max: %2% Network tooltip information min.: %1%<br>maks.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_lv.desktop.yaml ================================================ Desktop Entry/Name: "Sistēmas statistika" Desktop Entry/Comment: "Parāda tīkla, CPU un RAM (atmiņas) diagrammas" ================================================ FILE: plugin-sysstat/translations/sysstat_lv.ts ================================================ LXQtSysStatColours System Statistics Colors Sistēmas statistikas datu krāsas Graph Diagramma &Grid &Režģis Change ... Mainīt... T&itle &Nosaukums CPU CPU (procesors) &Nice &Nice (prioritāte) Ot&her &Citi &Frequency &Frekvence S&ystem S&istēma &User &Lietotājs Memory RAM (atmiņa) Cache&d Kešatmiņā (kešots) S&wap &Mijmaiņa (swap) &Applications &Lietotnes &Buffers &Bufferi Network Tīkls &Received &Saņemts &Transmitted &Nosūtīts LXQtSysStatConfiguration System Statistics Settings Sistēmas statistikas datu iestatījumi Graph Diagramma/grafiks &Minimal size &Minimālais izmērs Update &interval Atsvaidzināšanas &intervāls &Title &Nosaukums &Grid lines &Režģa līnijas <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimālais platums, ja panelis horizontāls.</p><p>Minimālais augstums, ja panelis vertikāls.</p></body></html> px pikseļi s S Data Dati Use &frequency Lietot &frekvenci Ma&ximum Ma&ksimums XXX KBs XXX KBs Lo&garithmic scale Lo&garitmiskā skala steps soļi &Source &Avots T&ype &Tips Colors Krāsas Use t&heme colours Izmantot tē&mas krāsas Use c&ustom colours Izmantot pielā&gotas krāsas Custom colour ... Pielāgojamā krāsa... CPU CPU (procesors) Memory RAM (operatīvā atmiņa) Network Tīkls cpu cpu (procesors) cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory RAM (atmiņa) swap Mijmaiņas atmiņa (swap) LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistēma: %1%<br>lietotājs: %2%<br>nice: %3%<br>citi: %4%<br>frekv: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistēma: %1%<br>lietotājs: %2%<br>nice: %3%<br>citi: %4%<br>frekv: (nepieejama) apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information lietotnes: %1%<br>bufferi: %2%<br>kešots: %3% used: %1% Swap tooltip information izmantots: %1% min: %1%<br>max: %2% Network tooltip information min.: %1%<br>maks.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Systemstatistikk" Desktop Entry/Comment: "Viser en graf for nettverket, prosessor, og minne" ================================================ FILE: plugin-sysstat/translations/sysstat_nb_NO.ts ================================================ LXQtSysStatColours System Statistics Colors Farger for systemstatistikk Graph Graf &Grid &Rutenett Change ... Forandre ... T&itle T&ittel CPU &Nice &Prioritering Ot&her An&dre &Frequency &Frekvens S&ystem &User &Bruker Memory Minne Cache&d Hurti&glagret S&wap V&ekselminne &Applications &Programmer &Buffers &Buffere Network Nettverk &Received &Mottat &Transmitted &Sendt LXQtSysStatConfiguration System Statistics Settings Systemstatistikkinnstillinger Graph Graf &Minimal size &Minimal størrelse Update &interval Oppdater&ingsintervall &Title &Tittel &Grid lines &Rutenettlinjer <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimal bredde hvis panelet er horisontalt.</p><p>Minimal høyde hvis panelet er vertikalt.</p></body></html> px px s s Data Use &frequency Bruks&frekvens Ma&ximum &Maksimum XXX KBs XXX kBs Lo&garithmic scale Lo&garitmisk skala steps steg &Source &Kilde T&ype Colors Farger Use t&heme colours Bruk &temafarger Use c&ustom colours Bruk &selvvalgte farger Custom colour ... Selvvalgte farger... CPU Memory Minne Network Nettverk cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory minne swap vekselminne LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>bruker: %2%<br>prioritering: %3%<br>andre: %4%<br>frekv: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information system: %1%<br>bruker: %2%<br>prioritering: %3%<br>andre: %4%<br>frekv: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information apper: %1%<br>buffere: %2%<br>hurtigbufret: %3% used: %1% Swap tooltip information brukt: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>maks: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_nl.desktop.yaml ================================================ Desktop Entry/Name: "Systeemstatistieken" Desktop Entry/Comment: "Laat een grafiek van uw netwerk, processor en geheugen zien" ================================================ FILE: plugin-sysstat/translations/sysstat_nl.ts ================================================ LXQtSysStatColours System Statistics Colors Systeemstatistiek-kleuren Graph Grafiek &Grid &Rooster Change ... Wijzigen… T&itle N&aam CPU Processor &Nice &Prioriteit Ot&her O&verige &Frequency &Frequentie S&ystem S&ysteem &User Gebr&uiker Memory Geheugen Cache&d &Tijdelijke opslag S&wap &Wisselgeheugen &Applications Progr&amma's &Buffers &Buffers Network Netwerk &Received O&ntvangen &Transmitted &Verzonden LXQtSysStatConfiguration System Statistics Settings Systeemstatistiek-instellingen Graph Grafiek &Minimal size &Minimale grootte Update &interval B&ijwerktussenpoos &Title &Naam &Grid lines &Roosterlijnen <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimale breedte als het paneel horizontaal is.</p><p>Minimale hoogte als het paneel verticaal is.</p></body></html> px px s s Data Gegevens Use &frequency &Frequentie gebruiken Ma&ximum Ma&ximum XXX KBs XXX KB/s Lo&garithmic scale Lo&garithmische schaal steps stappen &Source &Bron T&ype S&oort Colors Kleuren Use t&heme colours T&hemakleuren gebruiken Use c&ustom colours Aangepaste kle&uren gebruiken Custom colour ... Aangepaste kleur… CPU Processor Memory Geheugen Network Netwerk cpu CPU cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory geheugen swap wisselgeheugen LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information systeem: %1%<br>gebruiker: %2%<br>prioriteit: %3%<br>overige: %4%<br>freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information systeem: %1%<br>gebruiker: %2%<br>prioriteit: %3%<br>overige: %4%<br>freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information programma's: %1%<br>buffers: %2%<br>tijd. opslag: %3% used: %1% Swap tooltip information in gebruik: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>max: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_oc.ts ================================================ LXQtSysStatColours System Statistics Colors Colors de las estatisticas sistèma Graph Grafic &Grid &Grasilha Change ... Cambiar... T&itle Tít&ol CPU CPU &Nice &Prioritat Ot&her A&utre &Frequency &Frequéncia S&ystem S&istèma &User &Utilizaire Memory Memòria Cache&d S&wap Escam&bi &Applications &Aplicacions &Buffers &Tampons Network Ret &Received &Recebut &Transmitted &Enviat LXQtSysStatConfiguration System Statistics Settings Graph Grafic &Minimal size Update &interval &Title &Títol &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source &Font T&ype T&ipe Colors Colors Use t&heme colours Use c&ustom colours Custom colour ... Color personalizat... CPU CPU Memory Memòria Network Ret cpu cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory memòria swap memòria d’escambi LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information min : %1%<br>max : %2% ================================================ FILE: plugin-sysstat/translations/sysstat_pa.ts ================================================ LXQtSysStatColours System Statistics Colors ਸਿਸਟਮ ਅੰਕੜੇ ਰੰਗ Graph ਗਰਾਫ &Grid ਗਰਿੱਡ(&G) Change ... ਬਦਲੋ ... T&itle ਟਾਈਟਲ(&i) CPU CPU &Nice ਨਾਈਸ(&N) Ot&her ਹੋਰ(&h) &Frequency ਫਰੀਕਿਉਂਸੀ(&F) S&ystem ਸਿਸਟਮ(&y) &User ਵਰਤੋਂਕਾਰ(&U) Memory ਮੈਮੋਰੀ Cache&d ਕੈਸ਼ ਕੀਤੀ(&d) S&wap ਸਵੈਪ(&w) &Applications ਐਪਲੀਕੇਸ਼ਨਾਂ(&A) &Buffers ਬਫ਼ਰ(&B) Network ਨੈੱਟਵਰਕ &Received ਮਿਲੇ(&R) &Transmitted ਭੇਜੇ(&T) LXQtSysStatConfiguration System Statistics Settings ਸਿਸਟਮ ਅੰਕੜੇ ਸੈਟਿੰਗਾਂ Graph ਗਰਾਫ਼ &Minimal size ਘੱਟੋ-ਘੱਟ ਆਕਾਰ(&M) Update &interval ਅੱਪਡੇਟ ਕਰਨ ਦਾ ਸਮਾਂ(&i) &Title ਟਾਈਟਲ(&T) &Grid lines ਗਰਿੱਡ ਲਾਈਨਾਂ(&G) <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px ਪਿਕਸਲ s Data ਡਾਟਾ Use &frequency Ma&ximum ਵੱਧ ਤੋਂ ਵੱਧ(&x) XXX KBs XXX KB Lo&garithmic scale steps ਪੜਾਅ &Source ਸਰੋਤ(&S) T&ype ਕਿਸਮ(&y) Colors ਰੰਗ Use t&heme colours ਥੀਮ ਦੇ ਰੰਗ ਵਰਤੋਂ(&h) Use c&ustom colours ਕਸਟਮ ਰੰਗਾਂ ਨੂੰ ਵਰਤੋਂ(&u) Custom colour ... ਕਸਟਮ ਰੰਗ ... CPU CPU Memory ਮੈਮੋਰੀ Network ਨੈੱਟਵਰਕ cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu24 memory ਮੈਮੋਰੀ swap ਸਵੈਪ LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information ਸਿਸਟਮ: %1%<br>user: %2%<br>ਨਾਈਸ: %3%<br>ਹੋਰ: %4%<br>ਫਰੀਕਿ: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information ਸਿਸਟਮ: %1%<br>user: %2%<br>ਨਾਈਸ: %3%<br>ਹੋਰ: %4%<br>ਫਰੀ: ਲਾਗੂ ਨਹੀਂ apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information ਐਪਾਂ: %1%<br>ਬਫ਼ਰ: %2%<br>ਕੈਸ਼: %3% used: %1% Swap tooltip information ਵਰਤੀ: %1% min: %1%<br>max: %2% Network tooltip information ਘੱਟ: %1%<br>ਵੱਧ: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_pl.desktop.yaml ================================================ Desktop Entry/Name: "Statystyki systemowe" Desktop Entry/Comment: "Pokazuje wykres użycia sieci, procesora lub pamięci" ================================================ FILE: plugin-sysstat/translations/sysstat_pl.ts ================================================ LXQtSysStatColours System Statistics Colors Kolory statystyk systemowych Graph Graf &Grid &Siatka Change ... Zmień… T&itle Tyt&uł CPU Procesor &Nice &Priorytet Ot&her &Inne &Frequency C&zęstotliwość S&ystem S&ystem &User &Użytkownik Memory Pamięć Cache&d W pamięci po&dręcznej S&wap Pamięć &wymiany &Applications Progr&amy &Buffers &Bufor Network Sieć &Received Odeb&rano &Transmitted &Wysłano LXQtSysStatConfiguration System Statistics Settings Ustawienia statystyk systemu Graph Graf &Minimal size &Minimalny rozmiar Update &interval Aktual&izuj częstotliwość &Title &Tytuł &Grid lines Linie &siatki <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minimalna szerokość, jeśli panel jest poziomy.</p><p>Minimalna wysokość, jeśli panel jest pionowy.</p></body></html> px px s s Data Dane Use &frequency Używaj c&zęstotliwości Ma&ximum Mak&symalne XXX KBs XXX KB/s Lo&garithmic scale Skala lo&garytmiczna steps kroki &Source Źró&dło T&ype &Rodzaj Colors Kolory Use t&heme colours Używaj kolorów &motywu Use c&ustom colours Używaj &niestandardowych kolorów Custom colour ... Niestandardowy kolor… CPU Procesor Memory Pamięć Network Sieć cpu CPU cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory Pamięć swap Pamięć wymiany LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information System: %1%<br>Użytkownik: %2%<br>Priorytet: %3%<br>Inne: %4%<br>Częst.: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information System: %1%<br>Użytkownik: %2%<br>Priorytet: %3%<br>Inne: %4%<br>Częst.: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information Aplikacje: %1%<br>Bufory: %2%<br>Buforowane: %3% used: %1% Swap tooltip information Używane: %1% min: %1%<br>max: %2% Network tooltip information Min: %1%<br>Maks: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_pt.desktop.yaml ================================================ Desktop Entry/Name: "Estatísticas do sistema" Desktop Entry/Comment: "Mostra um gráfico para rede, CPU ou memória" ================================================ FILE: plugin-sysstat/translations/sysstat_pt.ts ================================================ LXQtSysStatColours System Statistics Colors Cores das estatísticas do sistema Graph Gráfico &Grid &Grelha Change ... Alterar... T&itle Tí&tulo CPU CPU &Nice A&ceitável Ot&her O&utras &Frequency &Frequência S&ystem S&istema &User &Utilizador Memory Memória Cache&d Cac&he S&wap S&wap &Applications &Aplicações &Buffers &Buffers Network Rede &Received &Recebido &Transmitted &Enviado LXQtSysStatConfiguration Graph Gráfico <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Largura mínima do painel se na horizontal.</p><p>Altura mínima do painel se na vertical.</p></body></html> px px s s Data Dados System Statistics Settings Defiições das estatísticas do sistema &Minimal size Tamanho &mínimo Update &interval &Intervalo de atualização &Title &Título &Grid lines Linhas da &grelha Use &frequency Utilizar &frequência Ma&ximum Má&ximo Lo&garithmic scale Escala lo&garítmica CPU CPU Memory Memória Network Rede cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memória swap swap &Source &Fonte T&ype T&ipo Colors Cores Use t&heme colours Utili&zar cores do tema Use c&ustom colours &Utilizar cores personalizadas Custom colour ... Cor personalizada... XXX KBs XXX KBs steps etapas LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>utilizador: %2%<br>aceitável: %3%<br>outras: %4%<br>freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>utilizador: %2%<br>aceitável: %3%<br>outras: %4%<br>freq: :n/d apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplicações: %1%<br>buffers: %2%<br>cache: %3% used: %1% Swap tooltip information utilizado: %1% min: %1%<br>max: %2% Network tooltip information mín.: %1%<br>máx.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_pt_BR.ts ================================================ LXQtSysStatColours System Statistics Colors Cores de Estatísticas do Sistema Graph Gráfico &Grid &Grade Change ... Alterar ... T&itle T&ítulo CPU CPU &Nice &Aceitável Ot&her Out&ro &Frequency &Frequência S&ystem S&istema &User &Usuário Memory Memória Cache&d Em cac&he S&wap &Swap &Applications &Aplicações &Buffers &Buffers Network Rede &Received &Recebido &Transmitted &Transmitido LXQtSysStatConfiguration System Statistics Settings Configurações de Estatísticas do Sistema Graph Gráfico &Minimal size Tamanho &Mínimo Update &interval &Intervalo de atualização &Title &Título &Grid lines Linhas de &grade <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Largura mínima se o painel é horizontal.</p><p>Altura mínima se o painel é vertical.</p></body></html> px px s s Data Dados Use &frequency &Frequência de uso Ma&ximum Má&ximo XXX KBs XXX KBs Lo&garithmic scale Escala lo&garítmica steps passos &Source &Origem T&ype T&ipo Colors Cores Use t&heme colours Usar cores do t&ema Use c&ustom colours Usar cores per&sonalizadas Custom colour ... Cor personalizada ... CPU CPU Memory Memória Network Rede cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory memória swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistema: %1%<br>usuário: %2%<br>nice: %3%<br>outro: %4%<br>freq: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistema: %1%<br>usuário: %2%<br>nice: %3%<br>outro: %4%<br>freq: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplicativos: %1%<br>buffers: %2%<br>em cache: %3% used: %1% Swap tooltip information usado: %1% min: %1%<br>max: %2% Network tooltip information mín: %1%<br>máx: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_ru.desktop.yaml ================================================ Desktop Entry/Name: "Системная статистика" Desktop Entry/Comment: "Показывает графики для сетевой активности, ЦПУ или памяти" ================================================ FILE: plugin-sysstat/translations/sysstat_ru.ts ================================================ LXQtSysStatColours System Statistics Colors Цвета статистических данных системы Graph График &Grid &Сетка Change ... Изменить… T&itle &Название CPU ЦПУ &Nice &Приоритет Ot&her &Прочее &Frequency &Частота S&ystem &Система &User &Пользователь Memory Память Cache&d &Кэшировано S&wap &Подкачка &Applications &Приложения &Buffers &Буферы Network Сеть &Received &Получено &Transmitted &Передано LXQtSysStatConfiguration System Statistics Settings Настройки статистических данных системы Graph График &Minimal size &Минимальный размер Update &interval И&нтервал обновления &Title &Название &Grid lines &Линий сетки <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Минимальная ширина панели, если она горизинтальная.</p><p>Минимальная высота — если вертикальная.</p></body></html> px пикс s с Data Данные Use &frequency Использовать &частоту Ma&ximum Ма&ксимум XXX KBs XXX Кб Lo&garithmic scale Ло&гарифмическая шкала steps шаги CPU ЦПУ Memory Память Network Сеть cpu ЦП cpu0 ЦП0 cpu1 ЦП1 cpu2 ЦП2 cpu3 ЦП3 cpu4 ЦП4 cpu5 ЦП5 cpu6 ЦП6 cpu7 ЦП7 cpu8 ЦП8 cpu9 ЦП9 cpu10 ЦП10 cpu11 ЦП11 cpu12 ЦП12 cpu13 ЦП13 cpu14 ЦП14 cpu15 ЦП15 cpu16 ЦП16 cpu17 ЦП17 cpu18 ЦП18 cpu19 ЦП19 cpu20 ЦП20 cpu21 ЦП21 cpu22 ЦП22 cpu23 ЦП23 memory память swap файл подкачки &Source &Источник T&ype &Тип Colors Цвета Use t&heme colours Использовать цвета &темы Use c&ustom colours Использовать с&вои цвета Custom colour ... Свои цвета… LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information система: %1%<br>пользователь: %2%<br>nice: %3%<br>прочее: %4%<br>частота: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information система: %1%<br>пользователь: %2%<br>nice: %3%<br>прочее: %4%<br>частота: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information приложения: %1%<br>буферы: %2%<br>кэшировано: %3% used: %1% Swap tooltip information использовано: %1% min: %1%<br>max: %2% Network tooltip information мин.: %1%<br>макс.: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-sysstat/translations/sysstat_si.ts ================================================ LXQtSysStatColours System Statistics Colors Graph &Grid Change ... T&itle CPU &Nice Ot&her &Frequency S&ystem &User Memory Cache&d S&wap &Applications &Buffers Network &Received &Transmitted LXQtSysStatConfiguration System Statistics Settings Graph &Minimal size Update &interval &Title &Grid lines <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> px s Data Use &frequency Ma&ximum XXX KBs Lo&garithmic scale steps &Source T&ype Colors Use t&heme colours Use c&ustom colours Custom colour ... CPU Memory Network cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information used: %1% Swap tooltip information min: %1%<br>max: %2% Network tooltip information ================================================ FILE: plugin-sysstat/translations/sysstat_sk.desktop.yaml ================================================ Desktop Entry/Name: "Štatistika o systéme" Desktop Entry/Comment: "Zobrazuje graf siete, procesora alebo pamäte" ================================================ FILE: plugin-sysstat/translations/sysstat_sk_SK.ts ================================================ LXQtSysStatColours System Statistics Colors Farby systémových štatistík Graph Graf &Grid &Mriežka Change ... Zmeniť... T&itle &Názov CPU Procesor &Nice &Prednosť Ot&her &Iné &Frequency &Frekvencia S&ystem &Systém &User &Užívateľ Memory Pamäť Cache&d &Uložené v medzipamäti S&wap &Swap &Applications &Aplikácie &Buffers &Vyrovnávacia pamäť Network Sieť &Received &Prijaté &Transmitted &Odoslané LXQtSysStatConfiguration System Statistics Settings &Nastavenie systémových štatistík Graph Graf &Minimal size &Minimálna veľkosť Update &interval &Interval aktualizácie &Title &Nadpis &Grid lines &Čiary a mriežky <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Najmenšia šírka horizontálneho panela.</p><p>Minimal height if the panel is vertical.</p></body></html> px px s s Data Dáta Use &frequency &Použiť frekvenciu Ma&ximum &Maximum XXX KBs XXX KB/s Lo&garithmic scale &Logaritmická stupnica steps kroky &Source &Zdroj T&ype &Typ Colors Farby Use t&heme colours &Použiť farbu motívu Use c&ustom colours &Použiť užívateľsky určené farby Custom colour ... Užívateľsky určená farba... CPU Procesor Memory Pamäť Network Sieť cpu procesor cpu0 jadro0 cpu1 jadro1 cpu2 jadro2 cpu3 jadro3 cpu4 jadro4 cpu5 jadro5 cpu6 jadro6 cpu7 jadro7 cpu8 jadro8 cpu9 jadro9 cpu10 jadro10 cpu11 jadro11 cpu12 jadro12 cpu13 jadro13 cpu14 jadro14 cpu15 jadro15 cpu16 jadro16 cpu17 jadro17 cpu18 jadro18 cpu19 jadro19 cpu20 jadro20 cpu21 jadro21 cpu22 jadro22 cpu23 jadro23 memory Pamäť swap swap LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information systém: %1%<br>užívateľ: %2%<br>prednosť: %3%<br>ostatní: %4%<br>frekvencia: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information systém: %1%<br>užívateľ: %2%<br>prednosť: %3%<br>ostatné: %4%<br>frekvencia: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information aplikácie: %1%<br>vyrovnávacia pamäť: %2%<br>uložené v medzipamäti: %3% used: %1% Swap tooltip information použité: %1% min: %1%<br>max: %2% Network tooltip information najmenej: %1%<br>najviac: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_sv.desktop.yaml ================================================ Desktop Entry/Name: "Systemstatistik" Desktop Entry/Comment: "Visar en aktivitetsgraf för nätverk, processor och minne" ================================================ FILE: plugin-sysstat/translations/sysstat_sv.ts ================================================ LXQtSysStatColours System Statistics Colors Färger för systemstatistik Graph Graf &Grid &Rutnät Change ... Ändra ... T&itle T&itel CPU CPU &Nice &Prioritering Ot&her Öv&rigt &Frequency &Frekvens S&ystem S&ystem &User &Användare Memory Minne Cache&d Cache&minne S&wap V&äxelminne &Applications &Program &Buffers &Köminne Network Nätverk &Received &Mottagit &Transmitted &Överfört LXQtSysStatConfiguration System Statistics Settings Hantera systemstatistik Graph Graf &Minimal size &Min. storlek Update &interval Uppdaterings&intervall &Title &Titel &Grid lines &Rutnätslinjer <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Minsta bredd om panelen är horisontal.</p><p>Minsta höjd om panelen är vertikal.</p></body></html> px px s s Data Data Use &frequency Använd &frekvens Ma&ximum Ma&x. XXX KBs XXX KB/s Lo&garithmic scale Lo&garitmisk skala steps steg &Source &Källa T&ype T&yp Colors Färger Use t&heme colours Följ &systemtemat Use c&ustom colours Använd &eget färgschema Custom colour ... Anpassa färger ... CPU CPU Memory Minne Network Nätverk cpu CPU cpu0 CPU0 cpu1 CPU1 cpu2 CPU2 cpu3 CPU3 cpu4 CPU4 cpu5 CPU5 cpu6 CPU6 cpu7 CPU7 cpu8 CPU8 cpu9 CPU9 cpu10 CPU10 cpu11 CPU11 cpu12 CPU12 cpu13 CPU13 cpu14 CPU14 cpu15 CPU15 cpu16 CPU16 cpu17 CPU17 cpu18 CPU18 cpu19 CPU19 cpu20 CPU20 cpu21 CPU21 cpu22 CPU22 cpu23 CPU23 memory minne swap växelminne LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information system: %1%<br>anv.: %2%<br>prio.: %3%<br>övr.: %4%<br>frekv: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information system: %1%<br>användare: %2%<br>prioritering: %3%<br>övrigt: %4%<br>frekv: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information program: %1%<br>köminne: %2%<br>cacheminne: %3% used: %1% Swap tooltip information Använt: %1% min: %1%<br>max: %2% Network tooltip information Min: %1%<br>Max: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_tr.desktop.yaml ================================================ Desktop Entry/Name: "Sistem İstatistikleri" Desktop Entry/Comment: "Ağ, CPU veya bellek için grafik gösterir" ================================================ FILE: plugin-sysstat/translations/sysstat_tr.ts ================================================ LXQtSysStatColours System Statistics Colors Sistem İstatistikleri Rengi Graph Grafik &Grid &Izgara Change ... Değiştir ... T&itle &Başlık CPU CPU &Nice &Güzel Ot&her &Diğer &Diğer &Frequency &Frekans S&ystem &Sistem &User &Kullanıcı Memory Bellek Cache&d Ön&bellekte S&wap &Takas &Applications &Uygulamalar &Buffers &Tamponlar Network &Received &Alınan &Transmitted &Gönderilen LXQtSysStatConfiguration System Statistics Settings Sistem İstatistikleri Ayarları Graph Grafik &Minimal size &En küçük boyut Update &interval Güncelleme &aralığı &Title &Başlık &Grid lines &Izgara çizgileri <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Panel yatay ise minimum genişlik.</p><p>Panel dikey ise minimum yükseklik.</p></body></html> px px s s Data Veri Use &frequency &Frekansı kullan Ma&ximum En&fazla XXX KBs XXX KB Lo&garithmic scale Lo&garitmik ölçek steps adım &Source &Kaynak T&ype &Tür Colors Renk Use t&heme colours &Tema rengini kullan Use c&ustom colours &Özel renk kullan Custom colour ... Özel renk ... CPU CPU Memory Bellek Network cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 memory bellek swap takas LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information sistem: %1%<br>kullanıcı: %2%<br>nice: %3%<br>diğer: %4%<br>frek: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information sistem: %1%<br>kullanıcı: %2%<br>nice: %3%<br>diğer: %4%<br>frek: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information uygulama: %1%<br>tampon: %2%<br>önbellek: %3% used: %1% Swap tooltip information kullanılan: %1% min: %1%<br>max: %2% Network tooltip information min: %1%<br>maks: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_uk.desktop.yaml ================================================ Desktop Entry/Name: "Статистики системи" Desktop Entry/Comment: "Показує графіки мережі, CPU або пам'яті" ================================================ FILE: plugin-sysstat/translations/sysstat_uk.ts ================================================ LXQtSysStatColours System Statistics Colors Кольори системних статистик Graph Графік &Grid &Сітка Change ... Зміна ... T&itle Н&азва CPU ЦП &Nice &Докладність Ot&her Ін&ше &Frequency &Частота S&ystem С&истема &User &Користувач Memory Пам'ять Cache&d Кешо&вано S&wap &Підкачка &Applications &Програми &Buffers &Буфери Network Мережа &Received &Отримано &Transmitted &Передано LXQtSysStatConfiguration System Statistics Settings Налаштування системної статистики Graph Графік &Minimal size &Мінімальний розмір Update &interval Інтервал оновле&ння &Title Н&азва &Grid lines Лінії &сітки <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>Найменша ширина, якщо панель горизонтальна.</p><p>Найменша висота, якщо панель вертикальна.</p></body></html> px px s s Data Дані Use &frequency Використовувати ч&астоту Ma&ximum Ма&ксимум XXX KBs XXX КБс Lo&garithmic scale Логари&фмічна шкала steps кроки &Source &Джерело T&ype Ти&п Colors Кольори Use t&heme colours Використати ко&льори теми Use c&ustom colours Вико&ристати власні кольори Custom colour ... Власні кольори ... CPU ЦП Memory Пам'ять Network Мережа cpu цп cpu0 цп0 cpu1 цп1 cpu2 цп2 cpu3 цп3 cpu4 сп4 cpu5 цп5 cpu6 цп6 cpu7 сп7 cpu8 цп8 cpu9 цп9 cpu10 цп10 cpu11 цп11 cpu12 цп12 cpu13 цп13 cpu14 цп14 cpu15 цп15 cpu16 цп16 cpu17 цп17 cpu18 цп18 cpu19 цп19 cpu20 цп20 cpu21 цп21 cpu22 цп22 cpu23 цп23 memory пам'ять swap підкачка LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information система: %1%<br>користувач: %2%<br>докладність: %3%<br>інше: %4%<br>част: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information система: %1%<br>користувач: %2%<br>докладність: %3%<br>інше: %4%<br>част: н/д apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information прогр: %1%<br>буфери: %2%<br>кешовано: %3% used: %1% Swap tooltip information використано: %1% min: %1%<br>max: %2% Network tooltip information мін: %1%<br>макс: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "系统统计" Desktop Entry/Comment: "以图形的方式显示网络,处理器或内存" ================================================ FILE: plugin-sysstat/translations/sysstat_zh_CN.ts ================================================ LXQtSysStatColours System Statistics Colors 系统统计信息颜色 Graph 图象 &Grid 网格(&G) Change ... 更改... T&itle 标题(&I) CPU &Nice 优先级(&N) Ot&her 其他(&H) &Frequency 频率(&F) S&ystem 系统(&Y) &User 用户(&U) Memory 内存 Cache&d 已缓存(&D) S&wap 交换(&W) &Applications 应用程序(&A) &Buffers 缓冲区(&B) Network 网络 &Received 已接收(&R) &Transmitted 已传输(&T) LXQtSysStatConfiguration System Statistics Settings 系统统计设置 Graph 图象 &Minimal size 最小尺寸(&M) Update &interval 更新间隔(&I) &Title 标题(&T) &Grid lines 网格线(&G) <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>水平面板的最小宽度。</p><p>垂直面板的最小高度。</p></body></html> px s Data 数据 Use &frequency 使用频率(&F) Ma&ximum 最大值(&X) XXX KBs Lo&garithmic scale 对数刻度(&G) steps &Source 源(&S) T&ype 类型(&Y) Colors 颜色 Use t&heme colours 使用主题颜色(&H) Use c&ustom colours 使用自定义颜色(&U) Custom colour ... 自定义颜色... CPU Memory 内存 Network 网络 cpu cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu18 cpu19 cpu20 cpu21 cpu22 cpu23 memory 内存 swap 交换 LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information 系统: %1%<br>用户: %2%<br>Nice 值: %3%<br>其它: %4%<br>频率: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information 系统: %1%<br>用户: %2%<br>Nice 值: %3%<br>其它: %4%<br>频率: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information 应用程序: %1%<br>缓冲区: %2%<br>已缓存: %3% used: %1% Swap tooltip information 已使用:%1% min: %1%<br>max: %2% Network tooltip information 最小:%1%<br>最大: %2% ================================================ FILE: plugin-sysstat/translations/sysstat_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "系統統計" Desktop Entry/Comment: "顯示圖型用於網路、CPU或記憶體" ================================================ FILE: plugin-sysstat/translations/sysstat_zh_TW.ts ================================================ LXQtSysStatColours System Statistics Colors 系統統計資訊顏色 Graph 圖表 &Grid 網格(&G) Change ... 變更… T&itle 標題(&I) CPU CPU &Nice 優等(&N) Ot&her 其他(&H) &Frequency 頻率(&F) S&ystem 系統(&Y) &User 使用者(&U) Memory 記憶體 Cache&d 已經快取(&D) S&wap 交換(&W) &Applications 應用程式(&A) &Buffers 緩衝(&B) Network 網路 &Received 已經接收(&R) &Transmitted 已經傳送(&T) LXQtSysStatConfiguration System Statistics Settings 系統統計設定 Graph 圖表 &Minimal size 最小大小(&M) Update &interval 更新間隔(&I) &Title 標題(&T) &Grid lines 網格線(&G) <html><head/><body><p>Minimal width if the panel is horizontal.</p><p>Minimal height if the panel is vertical.</p></body></html> <html><head/><body><p>最小寬度,若面板為橫立。</p><p>最小高度,若面板為直立。</p></body></html> px px s s Data 資料 Use &frequency 使用頻率(&F) Ma&ximum 最大值(&X) XXX KBs XXX KBs Lo&garithmic scale 對數刻度(&G) steps &Source 來源(&S) T&ype 類型(&Y) Colors 顏色 Use t&heme colours 使用主題顏色(&H) Use c&ustom colours 使用自訂顏色(&U) Custom colour ... 自訂顏色… CPU CPU Memory 記憶體 Network 網路 cpu cpu cpu0 cpu0 cpu1 cpu1 cpu2 cpu2 cpu3 cpu3 cpu4 cpu4 cpu5 cpu5 cpu6 cpu6 cpu7 cpu7 cpu8 cpu8 cpu9 cpu9 cpu10 cpu10 cpu11 cpu11 cpu12 cpu12 cpu13 cpu13 cpu14 cpu14 cpu15 cpu15 cpu16 cpu16 cpu17 cpu17 cpu18 cpu18 cpu19 cpu19 cpu20 cpu20 cpu21 cpu21 cpu22 cpu22 cpu23 cpu23 memory 記憶體 swap 交換 LXQtSysStatContent system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: %5% CPU tooltip information 系統: %1%<br>使用者: %2%<br>優等: %3%<br>其他: %4%<br>頻率: %5% system: %1%<br>user: %2%<br>nice: %3%<br>other: %4%<br>freq: n/a CPU tooltip information 系統: %1%<br>使用者: %2%<br>優等: %3%<br>其他: %4%<br>頻率: n/a apps: %1%<br>buffers: %2%<br>cached: %3% Memory tooltip information 應用: %1%<br>緩衝: %2%<br>快取: %3% used: %1% Swap tooltip information 已經使用: %1% min: %1%<br>max: %2% Network tooltip information 最小: %1%<br>最大: %2% ================================================ FILE: plugin-taskbar/CMakeLists.txt ================================================ set(PLUGIN "taskbar") set(HEADERS lxqttaskbar.h lxqttaskbutton.h lxqttaskbarconfiguration.h lxqttaskbarplugin.h lxqttaskgroup.h lxqtgrouppopup.h ) set(SOURCES lxqttaskbar.cpp lxqttaskbutton.cpp lxqttaskbarconfiguration.cpp lxqttaskbarplugin.cpp lxqttaskgroup.cpp lxqtgrouppopup.cpp ) set(UIS lxqttaskbarconfiguration.ui ) set(LIBRARIES lxqt lxqt-globalkeys Qt6Xdg ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-taskbar/lxqtgrouppopup.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtgrouppopup.h" #include "lxqttaskgroup.h" #include #include #include #include #include #include #include /************************************************ this class is just a container of window buttons the main purpose is showing window buttons in vertical layout and drag&drop feature inside group ************************************************/ LXQtGroupPopup::LXQtGroupPopup(LXQtTaskGroup *group): QFrame(group), mGroup(group) { Q_ASSERT(group); setAcceptDrops(true); setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip); setAttribute(Qt::WA_AlwaysShowToolTips); setAttribute(Qt::WA_TranslucentBackground); setLayout(new QVBoxLayout); layout()->setSpacing(3); layout()->setContentsMargins(3, 3, 3, 3); connect(&mCloseTimer, &QTimer::timeout, this, &LXQtGroupPopup::closeTimerSlot); mCloseTimer.setSingleShot(true); mCloseTimer.setInterval(400); } LXQtGroupPopup::~LXQtGroupPopup() = default; void LXQtGroupPopup::dropEvent(QDropEvent *event) { qlonglong temp; QDataStream stream(event->mimeData()->data(LXQtTaskButton::mimeDataFormat())); stream >> temp; WId window = (WId) temp; LXQtTaskButton *button = nullptr; int oldIndex(0); // get current position of the button being dragged for (int i = 0; i < layout()->count(); i++) { LXQtTaskButton *b = qobject_cast(layout()->itemAt(i)->widget()); if (b && b->windowId() == window) { button = b; oldIndex = i; break; } } if (button == nullptr) return; int newIndex = -1; // find the new position to place it in for (int i = 0; i < oldIndex && newIndex == -1; i++) { QWidget *w = layout()->itemAt(i)->widget(); if (w && w->pos().y() + w->height() / 2 > event->position().y()) newIndex = i; } const int size = layout()->count(); for (int i = size - 1; i > oldIndex && newIndex == -1; i--) { QWidget *w = layout()->itemAt(i)->widget(); if (w && w->pos().y() + w->height() / 2 < event->position().y()) newIndex = i; } if (newIndex == -1 || newIndex == oldIndex) return; QVBoxLayout * l = qobject_cast(layout()); l->takeAt(oldIndex); l->insertWidget(newIndex, button); l->invalidate(); } void LXQtGroupPopup::dragEnterEvent(QDragEnterEvent *event) { event->accept(); QWidget::dragEnterEvent(event); } void LXQtGroupPopup::dragLeaveEvent(QDragLeaveEvent *event) { hide(false/*not fast*/); QFrame::dragLeaveEvent(event); } /************************************************ * ************************************************/ void LXQtGroupPopup::leaveEvent(QEvent * /*event*/) { mCloseTimer.start(); } /************************************************ * ************************************************/ void LXQtGroupPopup::enterEvent(QEnterEvent * /*event*/) { mCloseTimer.stop(); } void LXQtGroupPopup::paintEvent(QPaintEvent * /*event*/) { QPainter p(this); QStyleOption opt; opt.initFrom(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void LXQtGroupPopup::hide(bool fast) { if (fast) close(); else mCloseTimer.start(); } void LXQtGroupPopup::show() { mCloseTimer.stop(); QFrame::show(); } int LXQtGroupPopup::indexOf(LXQtTaskButton *button) { return layout()->indexOf(button); } void LXQtGroupPopup::addButton(LXQtTaskButton *button) { layout()->addWidget(button); } void LXQtGroupPopup::closeTimerSlot() { bool button_has_dnd_hover = false; QLayout* l = layout(); for (int i = 0; l->count() > i; ++i) { LXQtTaskButton const * const button = dynamic_cast(l->itemAt(i)->widget()); if (nullptr != button && button->hasDragAndDropHover()) { button_has_dnd_hover = true; break; } } if (!button_has_dnd_hover) close(); } ================================================ FILE: plugin-taskbar/lxqtgrouppopup.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKPOPUP_H #define LXQTTASKPOPUP_H #include #include #include #include #include class LXQtTaskButton; class LXQtTaskGroup; class LXQtGroupPopup: public QFrame { Q_OBJECT public: LXQtGroupPopup(LXQtTaskGroup *group); ~LXQtGroupPopup(); void hide(bool fast = false); void show(); // Layout int indexOf(LXQtTaskButton *button); int count() { return layout()->count(); } QLayoutItem * itemAt(int i) { return layout()->itemAt(i); } int spacing() { return layout()->spacing(); } void addButton(LXQtTaskButton* button); void removeWidget(QWidget *button) { layout()->removeWidget(button); } protected: void dragEnterEvent(QDragEnterEvent * event); void dragLeaveEvent(QDragLeaveEvent *event); void dropEvent(QDropEvent * event); void leaveEvent(QEvent * event); void enterEvent(QEnterEvent *event); void paintEvent(QPaintEvent * event); void closeTimerSlot(); private: LXQtTaskGroup *mGroup; QTimer mCloseTimer; }; #endif // LXQTTASKPOPUP_H ================================================ FILE: plugin-taskbar/lxqttaskbar.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttaskbar.h" #include #include #include #include #include #include #include #include #include #include #include "../panel/ilxqtpanelplugin.h" #include "../panel/pluginsettings.h" #include #include #include "lxqttaskgroup.h" #include "../panel/pluginsettings.h" #include "../panel/backends/ilxqtabstractwmiface.h" #include "../panel/lxqtpanelapplication.h" using namespace LXQt; /************************************************ ************************************************/ LXQtTaskBar::LXQtTaskBar(ILXQtPanelPlugin *plugin, QWidget *parent) : QFrame(parent), mSignalMapper(new QSignalMapper(this)), mButtonStyle(Qt::ToolButtonTextBesideIcon), mButtonWidth(220), mButtonHeight(100), mCloseOnMiddleClick(true), mRaiseOnCurrentDesktop(true), mShowOnlyOneDesktopTasks(false), mShowDesktopNum(0), mShowOnlyCurrentScreenTasks(false), mShowOnlyMinimizedTasks(false), mAutoRotate(true), mGroupingEnabled(true), mShowGroupOnHover(true), mUngroupedNextToExisting(false), mIconByClass(false), mWheelEventsAction(1), mWheelDeltaThreshold(300), mPlugin(plugin), mPlaceHolder(new QWidget(this)), mStyle(new LeftAlignedTextStyle()), mBackend(nullptr) { setStyle(mStyle); mLayout = new LXQt::GridLayout(this); setLayout(mLayout); mLayout->setContentsMargins(QMargins()); mLayout->setStretch(LXQt::GridLayout::StretchHorizontal | LXQt::GridLayout::StretchVertical); realign(); mPlaceHolder->setMinimumSize(1, 1); mPlaceHolder->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); mPlaceHolder->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); mLayout->addWidget(mPlaceHolder); // Get backend LXQtPanelApplication *a = static_cast(qApp); mBackend = a->getWMBackend(); QTimer::singleShot(0, this, &LXQtTaskBar::settingsChanged); setAcceptDrops(true); connect(mSignalMapper, &QSignalMapper::mappedInt, this, &LXQtTaskBar::activateTask); QTimer::singleShot(0, this, &LXQtTaskBar::registerShortcuts); connect(mBackend, &ILXQtAbstractWMInterface::windowPropertyChanged, this, &LXQtTaskBar::onWindowChanged); connect(mBackend, &ILXQtAbstractWMInterface::windowAdded, this, &LXQtTaskBar::onWindowAdded); connect(mBackend, &ILXQtAbstractWMInterface::windowRemoved, this, &LXQtTaskBar::onWindowRemoved); // Consider already fetched windows const auto initialWindows = mBackend->getCurrentWindows(); for(WId windowId : initialWindows) { onWindowAdded(windowId); } } /************************************************ ************************************************/ LXQtTaskBar::~LXQtTaskBar() { delete mStyle; } /************************************************ ************************************************/ void LXQtTaskBar::dragEnterEvent(QDragEnterEvent* event) { if (event->mimeData()->hasFormat(LXQtTaskGroup::mimeDataFormat())) { event->acceptProposedAction(); buttonMove(nullptr, qobject_cast(event->source()), event->position().toPoint()); } else event->ignore(); QWidget::dragEnterEvent(event); } /************************************************ ************************************************/ void LXQtTaskBar::dragMoveEvent(QDragMoveEvent * event) { //we don't get any dragMoveEvents if dragEnter wasn't accepted buttonMove(nullptr, qobject_cast(event->source()), event->position().toPoint()); QWidget::dragMoveEvent(event); } /************************************************ ************************************************/ void LXQtTaskBar::buttonMove(LXQtTaskGroup * dst, LXQtTaskGroup * src, QPoint const & pos) { int src_index; if (!src || -1 == (src_index = mLayout->indexOf(src))) { qDebug() << "Dropped invalid"; return; } const int size = mLayout->count(); Q_ASSERT(0 < size); //dst is nullptr in case the drop occurred on empty space in taskbar int dst_index; if (nullptr == dst) { //moving based on taskbar (not signaled by button) QRect occupied = mLayout->occupiedGeometry(); QRect last_empty_row{occupied}; const QRect last_item_geometry = mLayout->itemAt(size - 1)->geometry(); if (mPlugin->panel()->isHorizontal()) { if (isRightToLeft()) { last_empty_row.setTopRight(last_item_geometry.topLeft()); } else { last_empty_row.setTopLeft(last_item_geometry.topRight()); } } else { if (isRightToLeft()) { last_empty_row.setTopRight(last_item_geometry.topRight()); } else { last_empty_row.setTopLeft(last_item_geometry.topLeft()); } } if (occupied.contains(pos) && !last_empty_row.contains(pos)) return; dst_index = size; } else { //moving based on signal from child button dst_index = mLayout->indexOf(dst); } //moving lower index to higher one => consider as the QList::move => insert(to, takeAt(from)) if (src_index < dst_index) { if (size == dst_index || src_index + 1 != dst_index) { --dst_index; } else { //switching positions of next standing const int tmp_index = src_index; src_index = dst_index; dst_index = tmp_index; } } if (dst_index == src_index || mLayout->animatedMoveInProgress() ) return; mLayout->moveItem(src_index, dst_index, true); } /************************************************ ************************************************/ void LXQtTaskBar::groupBecomeEmptySlot() { //group now contains no buttons - clean up in hash and delete the group LXQtTaskGroup * const group = qobject_cast(sender()); Q_ASSERT(group); for (auto i = mKnownWindows.begin(); mKnownWindows.end() != i; ) { if (group == *i) i = mKnownWindows.erase(i); else ++i; } mLayout->removeWidget(group); group->deleteLater(); } /************************************************ ************************************************/ void LXQtTaskBar::addWindow(WId window) { if (mExcludedList.contains(mBackend->getWindowClass(window), Qt::CaseInsensitive)) return; // If grouping disabled group behaves like regular button const QString group_id = mGroupingEnabled ? mBackend->getWindowClass(window) : QString::number(window); LXQtTaskGroup *group = nullptr; auto i_group = mKnownWindows.find(window); if (mKnownWindows.end() != i_group) { if ((*i_group)->groupName() == group_id) group = *i_group; else (*i_group)->onWindowRemoved(window); } //check if window belongs to some existing group if (!group && mGroupingEnabled) { for (auto i = mKnownWindows.cbegin(), i_e = mKnownWindows.cend(); i != i_e; ++i) { if ((*i)->groupName() == group_id) { group = *i; break; } } } if (!group) { group = new LXQtTaskGroup(group_id, window, this); connect(group, &LXQtTaskGroup::groupBecomeEmpty, this, &LXQtTaskBar::groupBecomeEmptySlot); connect(group, &LXQtTaskGroup::visibilityChanged, this, &LXQtTaskBar::refreshPlaceholderVisibility); connect(group, &LXQtTaskGroup::popupShown, this, &LXQtTaskBar::popupShown); connect(group, &LXQtTaskButton::dragging, this, [this] (QObject * dragSource, QPoint const & pos) { buttonMove(qobject_cast(sender()), qobject_cast(dragSource), pos); }); mLayout->addWidget(group); group->setToolButtonsStyle(mButtonStyle); if (mUngroupedNextToExisting) { const QString window_class = mBackend->getWindowClass(window); int src_index = mLayout->count() - 1; int dst_index = src_index; for (int i = mLayout->count() - 2; 0 <= i; --i) { LXQtTaskGroup * current_group = qobject_cast(mLayout->itemAt(i)->widget()); if (nullptr != current_group) { const QString current_class = mBackend->getWindowClass(current_group->groupName().toULong()); if(current_class == window_class) { dst_index = i + 1; break; } } } if (dst_index != src_index) { mLayout->moveItem(src_index, dst_index, false); } } } mKnownWindows[window] = group; group->addWindow(window); } /************************************************ ************************************************/ auto LXQtTaskBar::removeWindow(windowMap_t::iterator pos) -> windowMap_t::iterator { WId const window = pos.key(); LXQtTaskGroup * const group = *pos; auto ret = mKnownWindows.erase(pos); group->onWindowRemoved(window); return ret; } /************************************************ ************************************************/ void LXQtTaskBar::onWindowChanged(WId window, int prop) { auto i = mKnownWindows.find(window); if (mKnownWindows.end() != i) { if (!(*i)->onWindowChanged(window, LXQtTaskBarWindowProperty(prop))) { // window is removed from a group because of class change, so we should add it again addWindow(window); } } } void LXQtTaskBar::onWindowAdded(WId window) { auto const pos = mKnownWindows.find(window); if (mKnownWindows.end() == pos) addWindow(window); } /************************************************ ************************************************/ void LXQtTaskBar::onWindowRemoved(WId window) { auto const pos = mKnownWindows.find(window); if (mKnownWindows.end() != pos) { removeWindow(pos); } } /************************************************ ************************************************/ void LXQtTaskBar::refreshButtonRotation() { bool autoRotate = mAutoRotate && (mButtonStyle != Qt::ToolButtonIconOnly); ILXQtPanel::Position panelPosition = mPlugin->panel()->position(); emit buttonRotationRefreshed(autoRotate, panelPosition); } /************************************************ ************************************************/ void LXQtTaskBar::refreshPlaceholderVisibility() { // if no visible group button show placeholder widget bool haveVisibleWindow = false; for (auto i = mKnownWindows.cbegin(), i_e = mKnownWindows.cend(); i_e != i; ++i) { if ((*i)->isVisibleTo(this)) { haveVisibleWindow = true; break; } } mPlaceHolder->setVisible(!haveVisibleWindow); if (haveVisibleWindow) mPlaceHolder->setFixedSize(0, 0); else { mPlaceHolder->setMinimumSize(1, 1); mPlaceHolder->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); } } /************************************************ ************************************************/ void LXQtTaskBar::setButtonStyle(Qt::ToolButtonStyle buttonStyle) { const Qt::ToolButtonStyle old_style = mButtonStyle; mButtonStyle = buttonStyle; if (old_style != mButtonStyle) emit buttonStyleRefreshed(mButtonStyle); } /************************************************ ************************************************/ void LXQtTaskBar::settingsChanged() { bool groupingEnabledOld = mGroupingEnabled; bool ungroupedNextToExistingOld = mUngroupedNextToExisting; bool showOnlyOneDesktopTasksOld = mShowOnlyOneDesktopTasks; const int showDesktopNumOld = mShowDesktopNum; bool showOnlyCurrentScreenTasksOld = mShowOnlyCurrentScreenTasks; bool showOnlyMinimizedTasksOld = mShowOnlyMinimizedTasks; const bool iconByClassOld = mIconByClass; mButtonWidth = mPlugin->settings()->value(QStringLiteral("buttonWidth"), 220).toInt(); mButtonHeight = mPlugin->settings()->value(QStringLiteral("buttonHeight"), 100).toInt(); QString s = mPlugin->settings()->value(QStringLiteral("buttonStyle")).toString().toUpper(); if (s == QStringLiteral("ICON")) setButtonStyle(Qt::ToolButtonIconOnly); else if (s == QStringLiteral("TEXT")) setButtonStyle(Qt::ToolButtonTextOnly); else setButtonStyle(Qt::ToolButtonTextBesideIcon); mShowOnlyOneDesktopTasks = mPlugin->settings()->value(QStringLiteral("showOnlyOneDesktopTasks"), false).toBool(); mShowDesktopNum = mPlugin->settings()->value(QStringLiteral("showDesktopNum"), 0).toInt(); mShowOnlyCurrentScreenTasks = mPlugin->settings()->value(QStringLiteral("showOnlyCurrentScreenTasks"), false).toBool(); mShowOnlyMinimizedTasks = mPlugin->settings()->value(QStringLiteral("showOnlyMinimizedTasks"), false).toBool(); mAutoRotate = mPlugin->settings()->value(QStringLiteral("autoRotate"), true).toBool(); mCloseOnMiddleClick = mPlugin->settings()->value(QStringLiteral("closeOnMiddleClick"), true).toBool(); mRaiseOnCurrentDesktop = mPlugin->settings()->value(QStringLiteral("raiseOnCurrentDesktop"), false).toBool(); mGroupingEnabled = mPlugin->settings()->value(QStringLiteral("groupingEnabled"), true).toBool(); mShowGroupOnHover = mPlugin->settings()->value(QStringLiteral("showGroupOnHover"), true).toBool(); mUngroupedNextToExisting = mPlugin->settings()->value(QStringLiteral("ungroupedNextToExisting"), false).toBool(); mIconByClass = mPlugin->settings()->value(QStringLiteral("iconByClass"), false).toBool(); mWheelEventsAction = mPlugin->settings()->value(QStringLiteral("wheelEventsAction"), 1).toInt(); mWheelDeltaThreshold = mPlugin->settings()->value(QStringLiteral("wheelDeltaThreshold"), 300).toInt(); mExcludedList = mPlugin->settings()->value(QStringLiteral("excludedList")).toString() .split(QRegularExpression(QStringLiteral("\\s*,\\s*")), Qt::SkipEmptyParts); const auto wins = mBackend->getCurrentWindows(); for(WId win : wins) { if (mExcludedList.contains(mBackend->getWindowClass(win), Qt::CaseInsensitive)) onWindowRemoved(win); else onWindowAdded(win); } // Delete all groups if grouping or ungrouped next to existing feature toggled and start over if (groupingEnabledOld != mGroupingEnabled || ungroupedNextToExistingOld != mUngroupedNextToExisting) { for (int i = mLayout->count() - 1; 0 <= i; --i) { LXQtTaskGroup * group = qobject_cast(mLayout->itemAt(i)->widget()); if (nullptr != group) { mLayout->takeAt(i); group->deleteLater(); } } mKnownWindows.clear(); } if (showOnlyOneDesktopTasksOld != mShowOnlyOneDesktopTasks || (mShowOnlyOneDesktopTasks && showDesktopNumOld != mShowDesktopNum) || showOnlyCurrentScreenTasksOld != mShowOnlyCurrentScreenTasks || showOnlyMinimizedTasksOld != mShowOnlyMinimizedTasks ) emit showOnlySettingChanged(); if (iconByClassOld != mIconByClass) emit iconByClassChanged(); mBackend->reloadWindows(); refreshPlaceholderVisibility(); } /************************************************ ************************************************/ void LXQtTaskBar::realign() { mLayout->setEnabled(false); refreshButtonRotation(); ILXQtPanel *panel = mPlugin->panel(); QSize maxSize = QSize(mButtonWidth, mButtonHeight); QSize minSize = QSize(0, 0); bool rotated = false; if (panel->isHorizontal()) { mLayout->setRowCount(panel->lineCount()); mLayout->setColumnCount(0); } else { mLayout->setRowCount(0); if (mButtonStyle == Qt::ToolButtonIconOnly) { // Vertical + Icons mLayout->setColumnCount(panel->lineCount()); } else { rotated = mAutoRotate && (panel->position() == ILXQtPanel::PositionLeft || panel->position() == ILXQtPanel::PositionRight); // Vertical + Text if (rotated) { maxSize.rwidth() = mButtonHeight; maxSize.rheight() = mButtonWidth; mLayout->setColumnCount(panel->lineCount()); } else { mLayout->setColumnCount(1); } } } mLayout->setCellMinimumSize(minSize); mLayout->setCellMaximumSize(maxSize); mLayout->setDirection(rotated ? LXQt::GridLayout::TopToBottom : LXQt::GridLayout::LeftToRight); mLayout->setEnabled(true); //our placement on screen could have been changed emit showOnlySettingChanged(); emit refreshIconGeometry(); } ILXQtPanel *LXQtTaskBar::panel() const { return mPlugin->panel(); } /************************************************ ************************************************/ void LXQtTaskBar::wheelEvent(QWheelEvent* event) { // ignore wheel action unless user preference is "cycle windows" if (mWheelEventsAction != 1) return QFrame::wheelEvent(event); static int threshold = 0; QPoint angleDelta = event->angleDelta(); Qt::Orientation orient = (qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int delta = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); threshold += abs(delta); if (threshold < mWheelDeltaThreshold) return QFrame::wheelEvent(event); else threshold = 0; int D = delta < 0 ? 1 : -1; // create temporary list of visible groups in the same order like on the layout QList list; LXQtTaskGroup *group = nullptr; for (int i = 0; i < mLayout->count(); i++) { QWidget * o = mLayout->itemAt(i)->widget(); LXQtTaskGroup * g = qobject_cast(o); if (!g) continue; if (g->isVisible()) list.append(g); if (g->isChecked()) group = g; } if (list.isEmpty()) return QFrame::wheelEvent(event); if (!group) group = list.at(0); LXQtTaskButton *button = nullptr; // switching between groups from temporary list in modulo addressing while (!button) { button = group->getNextPrevChildButton(D == 1, !(list.count() - 1)); if (button) button->raiseApplication(); int idx = (list.indexOf(group) + D + list.count()) % list.count(); group = list.at(idx); } QFrame::wheelEvent(event); } /************************************************ ************************************************/ void LXQtTaskBar::resizeEvent(QResizeEvent* event) { emit refreshIconGeometry(); return QWidget::resizeEvent(event); } /************************************************ ************************************************/ void LXQtTaskBar::changeEvent(QEvent* event) { // if current style is changed, reset the base style of the proxy style // so we can apply the new style correctly to task buttons. if(event->type() == QEvent::StyleChange) mStyle->setBaseStyle(nullptr); QFrame::changeEvent(event); } /************************************************ ************************************************/ void LXQtTaskBar::registerShortcuts() { // Register shortcuts to switch to the task // mPlaceHolder is always at position 0 // tasks are at positions 1..10 GlobalKeyShortcut::Action * gshortcut; QString path; QString description; for (int i = 1; i <= 10; ++i) { path = QStringLiteral("/panel/%1/task_%2").arg(mPlugin->settings()->group()).arg(i); description = tr("Activate task %1").arg(i); gshortcut = GlobalKeyShortcut::Client::instance()->addAction(QLatin1String(""), path, description, this); if (nullptr != gshortcut) { mKeys << gshortcut; connect(gshortcut, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtTaskBar::shortcutRegistered); connect(gshortcut, &GlobalKeyShortcut::Action::activated, mSignalMapper, static_cast(&QSignalMapper::map)); mSignalMapper->setMapping(gshortcut, i); } } } void LXQtTaskBar::shortcutRegistered() { GlobalKeyShortcut::Action * const shortcut = qobject_cast(sender()); disconnect(shortcut, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtTaskBar::shortcutRegistered); const int i = mKeys.indexOf(shortcut); Q_ASSERT(-1 != i); if (shortcut->shortcut().isEmpty()) { // Shortcuts come in order they were registered // starting from index 0 const int key = (i + 1) % 10; shortcut->changeShortcut(QStringLiteral("Meta+%1").arg(key)); } } void LXQtTaskBar::activateTask(int pos) { for (int i = 1; i < mLayout->count(); ++i) { QWidget * o = mLayout->itemAt(i)->widget(); LXQtTaskGroup * g = qobject_cast(o); if (g && g->isVisible()) { pos--; if (pos == 0) { g->raiseApplication(); break; } } } } ================================================ FILE: plugin-taskbar/lxqttaskbar.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKBAR_H #define LXQTTASKBAR_H #include #include #include #include "../panel/ilxqtpanel.h" class ILXQtPanel; class ILXQtPanelPlugin; class QSignalMapper; class LXQtTaskGroup; class LeftAlignedTextStyle; class ILXQtAbstractWMInterface; namespace LXQt { class GridLayout; } namespace GlobalKeyShortcut { class Action; } class LXQtTaskBar : public QFrame { Q_OBJECT public: explicit LXQtTaskBar(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); virtual ~LXQtTaskBar(); void realign(); Qt::ToolButtonStyle buttonStyle() const { return mButtonStyle; } int buttonWidth() const { return mButtonWidth; } bool closeOnMiddleClick() const { return mCloseOnMiddleClick; } bool raiseOnCurrentDesktop() const { return mRaiseOnCurrentDesktop; } bool isShowOnlyOneDesktopTasks() const { return mShowOnlyOneDesktopTasks; } int showDesktopNum() const { return mShowDesktopNum; } bool isShowOnlyCurrentScreenTasks() const { return mShowOnlyCurrentScreenTasks; } bool isShowOnlyMinimizedTasks() const { return mShowOnlyMinimizedTasks; } bool isAutoRotate() const { return mAutoRotate; } bool isGroupingEnabled() const { return mGroupingEnabled; } bool isShowGroupOnHover() const { return mShowGroupOnHover; } bool isIconByClass() const { return mIconByClass; } int wheelEventsAction() const { return mWheelEventsAction; } int wheelDeltaThreshold() const { return mWheelDeltaThreshold; } ILXQtPanel * panel() const; inline ILXQtPanelPlugin * plugin() const { return mPlugin; } inline ILXQtAbstractWMInterface *getBackend() const { return mBackend; } public slots: void settingsChanged(); signals: void buttonRotationRefreshed(bool autoRotate, ILXQtPanel::Position position); void buttonStyleRefreshed(Qt::ToolButtonStyle buttonStyle); void refreshIconGeometry(); void showOnlySettingChanged(); void iconByClassChanged(); void popupShown(LXQtTaskGroup* sender); protected: virtual void dragEnterEvent(QDragEnterEvent * event); virtual void dragMoveEvent(QDragMoveEvent * event); private slots: void refreshButtonRotation(); void refreshPlaceholderVisibility(); void groupBecomeEmptySlot(); void onWindowChanged(WId window, int prop); void onWindowAdded(WId window); void onWindowRemoved(WId window); void registerShortcuts(); void shortcutRegistered(); void activateTask(int pos); private: typedef QMap windowMap_t; private: void addWindow(WId window); windowMap_t::iterator removeWindow(windowMap_t::iterator pos); void buttonMove(LXQtTaskGroup * dst, LXQtTaskGroup * src, QPoint const & pos); private: QMap mKnownWindows; //!< Ids of known windows (mapping to buttons/groups) LXQt::GridLayout *mLayout; QList mKeys; QSignalMapper *mSignalMapper; // Settings Qt::ToolButtonStyle mButtonStyle; int mButtonWidth; int mButtonHeight; bool mCloseOnMiddleClick; bool mRaiseOnCurrentDesktop; bool mShowOnlyOneDesktopTasks; int mShowDesktopNum; bool mShowOnlyCurrentScreenTasks; bool mShowOnlyMinimizedTasks; bool mAutoRotate; bool mGroupingEnabled; bool mShowGroupOnHover; bool mUngroupedNextToExisting; bool mIconByClass; int mWheelEventsAction; int mWheelDeltaThreshold; void setButtonStyle(Qt::ToolButtonStyle buttonStyle); void wheelEvent(QWheelEvent* event); void changeEvent(QEvent* event); void resizeEvent(QResizeEvent *event); ILXQtPanelPlugin *mPlugin; QWidget *mPlaceHolder; LeftAlignedTextStyle *mStyle; ILXQtAbstractWMInterface *mBackend; QStringList mExcludedList; }; #endif // LXQTTASKBAR_H ================================================ FILE: plugin-taskbar/lxqttaskbarconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttaskbarconfiguration.h" #include "ui_lxqttaskbarconfiguration.h" #include "../panel/lxqtpanelapplication.h" #include "../panel/backends/ilxqtabstractwmiface.h" LXQtTaskbarConfiguration::LXQtTaskbarConfiguration(PluginSettings *settings, QWidget *parent): LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtTaskbarConfiguration) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QStringLiteral("TaskbarConfigurationWindow")); ui->setupUi(this); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtTaskbarConfiguration::dialogButtonsAction); ui->buttonStyleCB->addItem(tr("Icon and text"), QLatin1String("IconText")); ui->buttonStyleCB->addItem(tr("Only icon"), QLatin1String("Icon")); ui->buttonStyleCB->addItem(tr("Only text"), QLatin1String("Text")); ui->wheelEventsActionCB->addItem(tr("Disabled"), 0); ui->wheelEventsActionCB->addItem(tr("Cycle windows on wheel scrolling"), 1); ui->wheelEventsActionCB->addItem(tr("Scroll up to raise, down to minimize"), 2); ui->wheelEventsActionCB->addItem(tr("Scroll up to minimize, down to raise"), 3); ui->wheelEventsActionCB->addItem(tr("Scroll up to move to next desktop, down to previous"), 4); ui->wheelEventsActionCB->addItem(tr("Scroll up to move to previous desktop, down to next"), 5); LXQtPanelApplication *a = reinterpret_cast(qApp); auto wmBackend = a->getWMBackend(); ui->showDesktopNumCB->addItem(tr("Current"), 0); //Note: in KWindowSystem desktops are numbered from 1..N const int desk_cnt = wmBackend->getWorkspacesCount(); for (int i = 1; desk_cnt >= i; ++i) { auto deskName = wmBackend->getWorkspaceName(i); if (deskName.isEmpty()) deskName = tr("Desktop %1").arg(i); ui->showDesktopNumCB->addItem(QString(QStringLiteral("%1 - %2")).arg(i).arg(deskName), i); } loadSettings(); ui->ungroupedNextToExistingCB->setEnabled(!(ui->groupingGB->isChecked())); /* We use clicked() and activated(int) because these signals aren't emitting after programmatically change of state */ connect(ui->limitByDesktopCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); #if (QT_VERSION >= QT_VERSION_CHECK(6,7,0)) connect(ui->limitByDesktopCB, &QCheckBox::checkStateChanged, ui->showDesktopNumCB, &QWidget::setEnabled); #else connect(ui->limitByDesktopCB, &QCheckBox::stateChanged, ui->showDesktopNumCB, &QWidget::setEnabled); #endif connect(ui->showDesktopNumCB, &QComboBox::activated, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->limitByScreenCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->limitByMinimizedCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->raiseOnCurrentDesktopCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->buttonStyleCB, &QComboBox::activated, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->buttonWidthSB, &QAbstractSpinBox::editingFinished, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->buttonHeightSB, &QAbstractSpinBox::editingFinished, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->autoRotateCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->middleClickCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->groupingGB, &QGroupBox::clicked, this, [this] { saveSettings(); ui->ungroupedNextToExistingCB->setEnabled(!(ui->groupingGB->isChecked())); }); connect(ui->showGroupOnHoverCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->ungroupedNextToExistingCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->iconByClassCB, &QAbstractButton::clicked, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->wheelEventsActionCB, &QComboBox::activated, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->wheelDeltaThresholdSB, &QAbstractSpinBox::editingFinished, this, &LXQtTaskbarConfiguration::saveSettings); connect(ui->excludeLE, &QLineEdit::editingFinished, this, &LXQtTaskbarConfiguration::saveSettings); } LXQtTaskbarConfiguration::~LXQtTaskbarConfiguration() { delete ui; } void LXQtTaskbarConfiguration::loadSettings() { const bool showOnlyOneDesktopTasks = settings().value(QStringLiteral("showOnlyOneDesktopTasks"), false).toBool(); ui->limitByDesktopCB->setChecked(showOnlyOneDesktopTasks); ui->showDesktopNumCB->setCurrentIndex(ui->showDesktopNumCB->findData(settings().value(QStringLiteral("showDesktopNum"), 0).toInt())); ui->showDesktopNumCB->setEnabled(showOnlyOneDesktopTasks); ui->limitByScreenCB->setChecked(settings().value(QStringLiteral("showOnlyCurrentScreenTasks"), false).toBool()); ui->limitByMinimizedCB->setChecked(settings().value(QStringLiteral("showOnlyMinimizedTasks"), false).toBool()); ui->autoRotateCB->setChecked(settings().value(QStringLiteral("autoRotate"), true).toBool()); ui->middleClickCB->setChecked(settings().value(QStringLiteral("closeOnMiddleClick"), true).toBool()); ui->raiseOnCurrentDesktopCB->setChecked(settings().value(QStringLiteral("raiseOnCurrentDesktop"), false).toBool()); ui->buttonStyleCB->setCurrentIndex(ui->buttonStyleCB->findData(settings().value(QStringLiteral("buttonStyle"), QLatin1String("IconText")))); ui->buttonWidthSB->setValue(settings().value(QStringLiteral("buttonWidth"), 220).toInt()); ui->buttonHeightSB->setValue(settings().value(QStringLiteral("buttonHeight"), 100).toInt()); ui->groupingGB->setChecked(settings().value(QStringLiteral("groupingEnabled"), true).toBool()); ui->showGroupOnHoverCB->setChecked(settings().value(QStringLiteral("showGroupOnHover"), true).toBool()); ui->ungroupedNextToExistingCB->setChecked(settings().value(QStringLiteral("ungroupedNextToExisting"), false).toBool()); ui->iconByClassCB->setChecked(settings().value(QStringLiteral("iconByClass"), false).toBool()); ui->wheelEventsActionCB->setCurrentIndex(ui->wheelEventsActionCB->findData(settings().value(QStringLiteral("wheelEventsAction"), 1).toInt())); ui->wheelDeltaThresholdSB->setValue(settings().value(QStringLiteral("wheelDeltaThreshold"), 300).toInt()); ui->excludeLE->setText(settings().value(QStringLiteral("excludedList")).toString()); } void LXQtTaskbarConfiguration::saveSettings() { settings().setValue(QStringLiteral("showOnlyOneDesktopTasks"), ui->limitByDesktopCB->isChecked()); settings().setValue(QStringLiteral("showDesktopNum"), ui->showDesktopNumCB->itemData(ui->showDesktopNumCB->currentIndex())); settings().setValue(QStringLiteral("showOnlyCurrentScreenTasks"), ui->limitByScreenCB->isChecked()); settings().setValue(QStringLiteral("showOnlyMinimizedTasks"), ui->limitByMinimizedCB->isChecked()); settings().setValue(QStringLiteral("buttonStyle"), ui->buttonStyleCB->itemData(ui->buttonStyleCB->currentIndex())); settings().setValue(QStringLiteral("buttonWidth"), ui->buttonWidthSB->value()); settings().setValue(QStringLiteral("buttonHeight"), ui->buttonHeightSB->value()); settings().setValue(QStringLiteral("autoRotate"), ui->autoRotateCB->isChecked()); settings().setValue(QStringLiteral("closeOnMiddleClick"), ui->middleClickCB->isChecked()); settings().setValue(QStringLiteral("raiseOnCurrentDesktop"), ui->raiseOnCurrentDesktopCB->isChecked()); settings().setValue(QStringLiteral("groupingEnabled"), ui->groupingGB->isChecked()); settings().setValue(QStringLiteral("showGroupOnHover"), ui->showGroupOnHoverCB->isChecked()); settings().setValue(QStringLiteral("ungroupedNextToExisting"), ui->ungroupedNextToExistingCB->isChecked()); settings().setValue(QStringLiteral("iconByClass"), ui->iconByClassCB->isChecked()); settings().setValue(QStringLiteral("wheelEventsAction"), ui->wheelEventsActionCB->itemData(ui->wheelEventsActionCB->currentIndex())); settings().setValue(QStringLiteral("wheelDeltaThreshold"), ui->wheelDeltaThresholdSB->value()); settings().setValue(QStringLiteral("excludedList"), ui->excludeLE->text()); } ================================================ FILE: plugin-taskbar/lxqttaskbarconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * Authors: * Maciej Płaza * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKBARCONFIGURATION_H #define LXQTTASKBARCONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" class PluginSettings; namespace Ui { class LXQtTaskbarConfiguration; } class LXQtTaskbarConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtTaskbarConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtTaskbarConfiguration(); private: Ui::LXQtTaskbarConfiguration *ui; /* Read settings from conf file and put data into controls. */ void loadSettings(); private slots: void saveSettings(); }; #endif // LXQTTASKBARCONFIGURATION_H ================================================ FILE: plugin-taskbar/lxqttaskbarconfiguration.ui ================================================ LXQtTaskbarConfiguration 0 0 401 528 Task Manager Settings General 0 0 0 0 0 Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Mouse Wheel 0 0 0 0 0 Wheel Delta Threshold 0 0 px 0 300 Window &grouping true Show popup on mouse hover Put buttons of the same class next to each other Appearance QFormLayout::AllNonFixedFieldsGrow Button style Maximum button width 0 0 px 1 2147483647 Maximum button height 0 0 px 1 500 Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Comma separated list of window classes Exclude from taskbar Comma separated list of window classes Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() LXQtTaskbarConfiguration accept() buttons rejected() LXQtTaskbarConfiguration reject() ================================================ FILE: plugin-taskbar/lxqttaskbarplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttaskbarplugin.h" #include "lxqttaskbar.h" #include "lxqttaskbarconfiguration.h" LXQtTaskBarPlugin::LXQtTaskBarPlugin(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo) { mTaskBar = new LXQtTaskBar(this); } LXQtTaskBarPlugin::~LXQtTaskBarPlugin() { delete mTaskBar; } QWidget *LXQtTaskBarPlugin::widget() { return mTaskBar; } QDialog *LXQtTaskBarPlugin::configureDialog() { return new LXQtTaskbarConfiguration(settings()); } void LXQtTaskBarPlugin::settingsChanged() { mTaskBar->settingsChanged(); } void LXQtTaskBarPlugin::realign() { mTaskBar->realign(); } ================================================ FILE: plugin-taskbar/lxqttaskbarplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKBARPLUGIN_H #define LXQTTASKBARPLUGIN_H #include "../panel/ilxqtpanelplugin.h" class LXQtTaskBar; class LXQtTaskBarPlugin : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtTaskBarPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtTaskBarPlugin(); QString themeId() const { return QStringLiteral("TaskBar"); } virtual Flags flags() const { return HaveConfigDialog | NeedsHandle; } QWidget *widget(); QDialog *configureDialog(); void settingsChanged(); void realign(); bool isSeparate() const { return true; } bool isExpandable() const { return true; } private: LXQtTaskBar *mTaskBar; }; class LXQtTaskBarPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtTaskBarPlugin(startupInfo);} }; #endif // LXQTTASKBARPLUGIN_H ================================================ FILE: plugin-taskbar/lxqttaskbutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttaskbutton.h" #include "lxqttaskbar.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../panel/backends/ilxqtabstractwmiface.h" bool LXQtTaskButton::sDraggging = false; /************************************************ ************************************************/ void LeftAlignedTextStyle::drawItemText(QPainter * painter, const QRect & rect, int flags , const QPalette & pal, bool enabled, const QString & text , QPalette::ColorRole textRole) const { QString txt = text; // get the button text because the text that's given to this function may be middle-elided if (const QToolButton *tb = dynamic_cast(painter->device())) txt = tb->text(); txt = QFontMetrics(painter->font()).elidedText(txt, Qt::ElideRight, rect.width()); QProxyStyle::drawItemText(painter, rect, (flags & ~Qt::AlignHCenter) | Qt::AlignLeft, pal, enabled, txt, textRole); } /************************************************ ************************************************/ LXQtTaskButton::LXQtTaskButton(const WId window, LXQtTaskBar * taskbar, QWidget *parent) : QToolButton(parent), mBackend(taskbar->getBackend()), mWindow(window), mUrgencyHint(false), mOrigin(Qt::TopLeftCorner), mParentTaskBar(taskbar), mPlugin(mParentTaskBar->plugin()), mIconSize(mPlugin->panel()->iconSize()), mWheelDelta(0), mDNDTimer(new QTimer(this)), mWheelTimer(new QTimer(this)) { Q_ASSERT(taskbar); setCheckable(true); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setMinimumWidth(1); setMinimumHeight(1); setToolButtonStyle(Qt::ToolButtonTextBesideIcon); setAcceptDrops(true); updateText(); updateIcon(); mDNDTimer->setSingleShot(true); mDNDTimer->setInterval(700); connect(mDNDTimer, &QTimer::timeout, this, &LXQtTaskButton::raiseApplication); mWheelTimer->setSingleShot(true); mWheelTimer->setInterval(250); connect(mWheelTimer, &QTimer::timeout, this, [this] { mWheelDelta = 0; // forget previous wheel deltas }); setUrgencyHint(mBackend->applicationDemandsAttention(mWindow)); connect(LXQt::Settings::globalSettings(), &LXQt::GlobalSettings::iconThemeChanged, this, &LXQtTaskButton::updateIcon); connect(mParentTaskBar, &LXQtTaskBar::iconByClassChanged, this, &LXQtTaskButton::updateIcon); } /************************************************ ************************************************/ LXQtTaskButton::~LXQtTaskButton() = default; /************************************************ ************************************************/ void LXQtTaskButton::updateText() { QString title = mBackend->getWindowTitle(mWindow); setTextExplicitly(title.replace(QStringLiteral("&"), QStringLiteral("&&"))); setToolTip(title); } /************************************************ ************************************************/ void LXQtTaskButton::updateIcon() { QIcon ico; if (mParentTaskBar->isIconByClass()) { ico = XdgIcon::fromTheme(mBackend->getWindowClass(mWindow).toLower()); } if (ico.isNull()) { int devicePixels = mIconSize * devicePixelRatioF(); ico = mBackend->getApplicationIcon(mWindow, devicePixels); } setIcon(ico.isNull() ? XdgIcon::defaultApplicationIcon() : ico); } /************************************************ ************************************************/ void LXQtTaskButton::changeEvent(QEvent *event) { if (event->type() == QEvent::StyleChange) { // When the icon size changes, the panel doesn't emit any specific // signal, but it triggers a stylesheet update, which we can detect int newIconSize = mPlugin->panel()->iconSize(); if (newIconSize != mIconSize) { mIconSize = newIconSize; updateIcon(); } } QToolButton::changeEvent(event); } /************************************************ ************************************************/ void LXQtTaskButton::dragEnterEvent(QDragEnterEvent *event) { // It must be here otherwise dragLeaveEvent and dragMoveEvent won't be called // on the other hand drop and dragmove events of parent widget won't be called if (event->mimeData()->hasFormat(mimeDataFormat())) { emit dragging(event->source(), event->position().toPoint()); setAttribute(Qt::WA_UnderMouse, false); } else { mDNDTimer->start(); } QToolButton::dragEnterEvent(event); } void LXQtTaskButton::dragMoveEvent(QDragMoveEvent * event) { if (event->mimeData()->hasFormat(mimeDataFormat())) { emit dragging(event->source(), event->position().toPoint()); setAttribute(Qt::WA_UnderMouse, false); } } void LXQtTaskButton::dragLeaveEvent(QDragLeaveEvent *event) { mDNDTimer->stop(); QToolButton::dragLeaveEvent(event); } void LXQtTaskButton::dropEvent(QDropEvent *event) { mDNDTimer->stop(); if (event->mimeData()->hasFormat(mimeDataFormat())) { event->acceptProposedAction(); emit dropped(event->source(), event->position().toPoint()); setAttribute(Qt::WA_UnderMouse, false); } QToolButton::dropEvent(event); } /************************************************ ************************************************/ void LXQtTaskButton::mousePressEvent(QMouseEvent* event) { const Qt::MouseButton b = event->button(); if (Qt::LeftButton == b) mDragStartPosition = event->pos(); else if (Qt::MiddleButton == b && parentTaskBar()->closeOnMiddleClick()) closeApplication(); QToolButton::mousePressEvent(event); } /************************************************ ************************************************/ void LXQtTaskButton::mouseReleaseEvent(QMouseEvent* event) { QToolButton::mouseReleaseEvent(event); if (!sDraggging && event->button() == Qt::LeftButton) { if (!isChecked()) minimizeApplication(); else raiseApplication(); } } /************************************************ ************************************************/ void LXQtTaskButton::wheelEvent(QWheelEvent* event) { // ignore wheel event if it is not "raise", "minimize" or "move" window if (mParentTaskBar->wheelEventsAction() < 2 || mParentTaskBar->wheelEventsAction() > 5) return QToolButton::wheelEvent(event); QPoint angleDelta = event->angleDelta(); Qt::Orientation orient = (qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int delta = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); if (!mWheelTimer->isActive()) mWheelDelta += abs(delta); else { // NOTE: We should consider a short delay after the last wheel event // in order to distinguish between separate wheel rotations; otherwise, // a wheel delta threshold will not make much sense because the delta // might have been increased due to a previous and separate wheel rotation. mWheelTimer->start(); } if (mWheelDelta < mParentTaskBar->wheelDeltaThreshold()) return QToolButton::wheelEvent(event); else { mWheelDelta = 0; mWheelTimer->start(); // start to distinguish between separate wheel rotations } int D = delta < 0 ? 1 : -1; if (mParentTaskBar->wheelEventsAction() == 4) { moveApplicationToPrevNextDesktop(D < 0); } else if (mParentTaskBar->wheelEventsAction() == 5) { moveApplicationToPrevNextDesktop(D > 0); } else { if (mParentTaskBar->wheelEventsAction() == 3) D *= -1; if (D < 0) raiseApplication(); else if (D > 0) minimizeApplication(); } QToolButton::wheelEvent(event); } /************************************************ ************************************************/ QMimeData * LXQtTaskButton::mimeData() { QMimeData *mimedata = new QMimeData; QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); stream << (qlonglong)(mWindow); mimedata->setData(mimeDataFormat(), ba); return mimedata; } /*! * \brief LXQtTaskButton::setTextExplicitly * \param str * * This is needed to workaround flickering caused by KAcceleratorManager * This class is hooked by KDE Integration and adds accelerators to button text * (Adds some '&' characters) * This triggers widget update but soon after text is reset to original value * This triggers a KAcceleratorManager update which again adds accelerator * This happens in loop * * TODO: investigate proper solution */ void LXQtTaskButton::setTextExplicitly(const QString &str) { if(str == mExplicitlySetText) { return; } mExplicitlySetText = str; setText(mExplicitlySetText); } /************************************************ ************************************************/ void LXQtTaskButton::mouseMoveEvent(QMouseEvent* event) { QAbstractButton::mouseMoveEvent(event); if (!(event->buttons() & Qt::LeftButton)) return; if ((event->position().toPoint() - mDragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; QPointer drag = new QDrag(this); drag->setMimeData(mimeData()); QIcon ico = icon(); QPixmap img = ico.pixmap(ico.actualSize({32, 32})); drag->setPixmap(img); switch (parentTaskBar()->panel()->position()) { case ILXQtPanel::PositionLeft: case ILXQtPanel::PositionTop: drag->setHotSpot({0, 0}); break; case ILXQtPanel::PositionRight: case ILXQtPanel::PositionBottom: drag->setHotSpot(img.rect().bottomRight()); break; } sDraggging = true; drag->exec(); // if button is dropped out of panel (e.g. on desktop) // it is not deleted automatically by Qt if (drag) drag->deleteLater(); // release mouse appropriately, by positioning the event outside // the button rectangle (otherwise, the button will be toggled) QMouseEvent releasingEvent(QEvent::MouseButtonRelease, QPoint(-1, -1), mapToGlobal(QPoint(-1, -1)), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); mouseReleaseEvent(&releasingEvent); sDraggging = false; } /************************************************ ************************************************/ bool LXQtTaskButton::isApplicationHidden() const { return false; //FIXME: unused } /************************************************ ************************************************/ bool LXQtTaskButton::isApplicationActive() const { return mBackend->isWindowActive(mWindow); } /************************************************ ************************************************/ void LXQtTaskButton::raiseApplication() { mBackend->raiseWindow(mWindow, parentTaskBar()->raiseOnCurrentDesktop()); } /************************************************ ************************************************/ void LXQtTaskButton::minimizeApplication() { mBackend->setWindowState(mWindow, LXQtTaskBarWindowState::Minimized, true); } /************************************************ ************************************************/ void LXQtTaskButton::maximizeApplication() { QAction* act = qobject_cast(sender()); if (!act) return; int state = act->data().toInt(); mBackend->setWindowState(mWindow, LXQtTaskBarWindowState(state), true); if(!mBackend->isWindowActive(mWindow)) mBackend->raiseWindow(mWindow, parentTaskBar()->raiseOnCurrentDesktop()); } /************************************************ ************************************************/ void LXQtTaskButton::deMaximizeApplication() { mBackend->setWindowState(mWindow, LXQtTaskBarWindowState::Maximized, false); if(!mBackend->isWindowActive(mWindow)) mBackend->raiseWindow(mWindow, parentTaskBar()->raiseOnCurrentDesktop()); } /************************************************ ************************************************/ void LXQtTaskButton::shadeApplication() { mBackend->setWindowState(mWindow, LXQtTaskBarWindowState::RolledUp, true); } /************************************************ ************************************************/ void LXQtTaskButton::unShadeApplication() { mBackend->setWindowState(mWindow, LXQtTaskBarWindowState::RolledUp, false); } /************************************************ ************************************************/ void LXQtTaskButton::closeApplication() { mBackend->closeWindow(mWindow); } /************************************************ ************************************************/ void LXQtTaskButton::setApplicationLayer() { QAction* act = qobject_cast(sender()); if (!act) return; int layer = act->data().toInt(); mBackend->setWindowLayer(mWindow, LXQtTaskBarWindowLayer(layer)); } /************************************************ ************************************************/ void LXQtTaskButton::moveApplicationToDesktop() { QAction* act = qobject_cast(sender()); if (!act) return; bool ok; int idx = act->data().toInt(&ok); if (!ok) return; mBackend->setWindowOnWorkspace(mWindow, idx); } /************************************************ ************************************************/ void LXQtTaskButton::moveApplicationToPrevNextDesktop(bool next) { mBackend->moveApplicationToPrevNextDesktop(mWindow, next); } /************************************************ ************************************************/ void LXQtTaskButton::moveApplicationToPrevNextMonitor(bool next) { mBackend->moveApplicationToPrevNextMonitor(mWindow, next, parentTaskBar()->raiseOnCurrentDesktop()); } /************************************************ ************************************************/ void LXQtTaskButton::moveApplication() { mBackend->moveApplication(mWindow); } /************************************************ ************************************************/ void LXQtTaskButton::resizeApplication() { mBackend->resizeApplication(mWindow); } /************************************************ ************************************************/ void LXQtTaskButton::contextMenuEvent(QContextMenuEvent* event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { event->ignore(); return; } const LXQtTaskBarWindowState state = mBackend->getWindowState(mWindow); QMenu * menu = new QMenu(tr("Application"), this); menu->setAttribute(Qt::WA_DeleteOnClose); QAction* a; /* KDE menu ******* + To &Desktop > + &All Desktops + --- + &1 Desktop 1 + &2 Desktop 2 + &To Current Desktop &Move Re&size + Mi&nimize + Ma&ximize + &Shade Ad&vanced > Keep &Above Others Keep &Below Others Fill screen &Layer > Always on &top &Normal Always on &bottom --- + &Close */ /********** Desktop menu **********/ int deskNum = mBackend->getWorkspacesCount(); if (deskNum > 1) { int winDesk = mBackend->getWindowWorkspace(mWindow); QMenu* deskMenu = menu->addMenu(tr("To &Desktop")); deskMenu->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::MoveToDesktop)); a = deskMenu->addAction(tr("&All Desktops")); a->setData(mBackend->onAllWorkspacesEnum()); a->setEnabled(winDesk != mBackend->onAllWorkspacesEnum()); connect(a, &QAction::triggered, this, &LXQtTaskButton::moveApplicationToDesktop); deskMenu->addSeparator(); for (int i = 1; i <= deskNum; ++i) { auto deskName = mBackend->getWorkspaceName(i).trimmed(); if (deskName.isEmpty()) a = deskMenu->addAction(tr("Desktop &%1").arg(i)); else a = deskMenu->addAction(QStringLiteral("&%1: %2").arg(i).arg(deskName)); a->setData(i); a->setEnabled(i != winDesk); connect(a, &QAction::triggered, this, &LXQtTaskButton::moveApplicationToDesktop); } int curDesk = mBackend->getCurrentWorkspace(); a = menu->addAction(tr("&To Current Desktop")); a->setData(curDesk); a->setEnabled(curDesk != winDesk); connect(a, &QAction::triggered, this, &LXQtTaskButton::moveApplicationToDesktop); } /********** Move/Resize **********/ if (QGuiApplication::screens().size() > 1) { bool enable(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::MoveToOutput) && (state != LXQtTaskBarWindowState::FullScreen || mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::FullScreen))); menu->addSeparator(); a = menu->addAction(tr("Move To N&ext Monitor")); connect(a, &QAction::triggered, this, [this] { moveApplicationToPrevNextMonitor(true); }); a->setEnabled(enable); a = menu->addAction(tr("Move To &Previous Monitor")); connect(a, &QAction::triggered, this, [this] { moveApplicationToPrevNextMonitor(false); }); a->setEnabled(enable); } menu->addSeparator(); a = menu->addAction(tr("&Move")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::Move) && state != LXQtTaskBarWindowState::Maximized && state != LXQtTaskBarWindowState::FullScreen); connect(a, &QAction::triggered, this, &LXQtTaskButton::moveApplication); a = menu->addAction(tr("Resi&ze")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::Resize) && state != LXQtTaskBarWindowState::Maximized && state != LXQtTaskBarWindowState::FullScreen); connect(a, &QAction::triggered, this, &LXQtTaskButton::resizeApplication); /********** State menu **********/ menu->addSeparator(); a = menu->addAction(tr("Ma&ximize")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::Maximize) && state != LXQtTaskBarWindowState::Maximized && state != LXQtTaskBarWindowState::Hidden); a->setData(int(LXQtTaskBarWindowState::Maximized)); connect(a, &QAction::triggered, this, &LXQtTaskButton::maximizeApplication); if (event->modifiers() & Qt::ShiftModifier) { a = menu->addAction(tr("Maximize vertically")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::MaximizeVertically) && state != LXQtTaskBarWindowState::MaximizedVertically && state != LXQtTaskBarWindowState::Hidden); a->setData(int(LXQtTaskBarWindowState::MaximizedVertically)); connect(a, &QAction::triggered, this, &LXQtTaskButton::maximizeApplication); a = menu->addAction(tr("Maximize horizontally")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::MaximizeHorizontally) && state != LXQtTaskBarWindowState::MaximizedHorizontally && state != LXQtTaskBarWindowState::Hidden); a->setData(int(LXQtTaskBarWindowState::MaximizedHorizontally)); connect(a, &QAction::triggered, this, &LXQtTaskButton::maximizeApplication); } a = menu->addAction(tr("&Restore")); a->setEnabled(state == LXQtTaskBarWindowState::Hidden || state == LXQtTaskBarWindowState::Minimized || state == LXQtTaskBarWindowState::Maximized || state == LXQtTaskBarWindowState::MaximizedVertically || state == LXQtTaskBarWindowState::MaximizedHorizontally); connect(a, &QAction::triggered, this, &LXQtTaskButton::deMaximizeApplication); a = menu->addAction(tr("Mi&nimize")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::Minimize) && state != LXQtTaskBarWindowState::Hidden && state != LXQtTaskBarWindowState::Minimized); connect(a, &QAction::triggered, this, &LXQtTaskButton::minimizeApplication); if (state == LXQtTaskBarWindowState::RolledUp) { a = menu->addAction(tr("Roll down")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::RollUp) && state != LXQtTaskBarWindowState::Hidden && state != LXQtTaskBarWindowState::Minimized); connect(a, &QAction::triggered, this, &LXQtTaskButton::unShadeApplication); } else { a = menu->addAction(tr("Roll up")); a->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::RollUp) && state != LXQtTaskBarWindowState::Hidden); connect(a, &QAction::triggered, this, &LXQtTaskButton::shadeApplication); } /********** Layer menu **********/ menu->addSeparator(); QMenu* layerMenu = menu->addMenu(tr("&Layer")); layerMenu->setEnabled(mBackend->supportsAction(mWindow, LXQtTaskBarBackendAction::MoveToLayer)); LXQtTaskBarWindowLayer currentLayer = mBackend->getWindowLayer(mWindow); a = layerMenu->addAction(tr("Always on &top")); a->setEnabled(currentLayer != LXQtTaskBarWindowLayer::KeepAbove); a->setData(int(LXQtTaskBarWindowLayer::KeepAbove)); connect(a, &QAction::triggered, this, &LXQtTaskButton::setApplicationLayer); a = layerMenu->addAction(tr("&Normal")); a->setEnabled(currentLayer != LXQtTaskBarWindowLayer::Normal); a->setData(int(LXQtTaskBarWindowLayer::Normal)); connect(a, &QAction::triggered, this, &LXQtTaskButton::setApplicationLayer); a = layerMenu->addAction(tr("Always on &bottom")); a->setEnabled(currentLayer != LXQtTaskBarWindowLayer::KeepBelow); a->setData(int(LXQtTaskBarWindowLayer::KeepBelow)); connect(a, &QAction::triggered, this, &LXQtTaskButton::setApplicationLayer); /********** Kill menu **********/ menu->addSeparator(); a = menu->addAction(XdgIcon::fromTheme(QStringLiteral("process-stop")), tr("&Close")); connect(a, &QAction::triggered, this, &LXQtTaskButton::closeApplication); menu->setGeometry(mParentTaskBar->panel()->calculatePopupWindowPos(mapToGlobal(event->pos()), menu->sizeHint())); mPlugin->willShowWindow(menu); menu->show(); } /************************************************ ************************************************/ void LXQtTaskButton::setUrgencyHint(bool set) { if (mUrgencyHint == set) return; mUrgencyHint = set; setProperty("urgent", set); style()->unpolish(this); style()->polish(this); update(); } /************************************************ ************************************************/ bool LXQtTaskButton::isOnDesktop(int desktop) const { int d = mBackend->getWindowWorkspace(mWindow); return d == desktop || d == mBackend->onAllWorkspacesEnum(); } bool LXQtTaskButton::isOnCurrentScreen() const { QScreen *screen = parentTaskBar()->screen(); return mBackend->isWindowOnScreen(screen, mWindow); } bool LXQtTaskButton::isMinimized() const { return mBackend->getWindowState(mWindow) == LXQtTaskBarWindowState::Minimized; } Qt::Corner LXQtTaskButton::origin() const { return mOrigin; } void LXQtTaskButton::setOrigin(Qt::Corner newOrigin) { if (mOrigin != newOrigin) { mOrigin = newOrigin; update(); } } void LXQtTaskButton::setAutoRotation(bool value, ILXQtPanel::Position position) { if (value) { switch (position) { case ILXQtPanel::PositionTop: case ILXQtPanel::PositionBottom: setOrigin(Qt::TopLeftCorner); break; case ILXQtPanel::PositionLeft: setOrigin(Qt::BottomLeftCorner); break; case ILXQtPanel::PositionRight: setOrigin(Qt::TopRightCorner); break; } } else setOrigin(Qt::TopLeftCorner); } void LXQtTaskButton::paintEvent(QPaintEvent *event) { if (mOrigin == Qt::TopLeftCorner) { QToolButton::paintEvent(event); return; } QSize sz = size(); bool transpose = false; QTransform transform; switch (mOrigin) { case Qt::TopLeftCorner: break; case Qt::TopRightCorner: transform.rotate(90.0); transform.translate(0.0, -sz.width()); transpose = true; break; case Qt::BottomRightCorner: transform.rotate(180.0); transform.translate(-sz.width(), -sz.height()); break; case Qt::BottomLeftCorner: transform.rotate(270.0); transform.translate(-sz.height(), 0.0); transpose = true; break; } QStylePainter painter(this); painter.setTransform(transform); QStyleOptionToolButton opt; initStyleOption(&opt); if (transpose) opt.rect = opt.rect.transposed(); painter.drawComplexControl(QStyle::CC_ToolButton, opt); } bool LXQtTaskButton::hasDragAndDropHover() const { return mDNDTimer->isActive(); } ================================================ FILE: plugin-taskbar/lxqttaskbutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKBUTTON_H #define LXQTTASKBUTTON_H #include #include #include "../panel/ilxqtpanel.h" class QPainter; class QPalette; class QMimeData; class LXQtTaskBar; class ILXQtAbstractWMInterface; class LeftAlignedTextStyle : public QProxyStyle { using QProxyStyle::QProxyStyle; public: virtual void drawItemText(QPainter * painter, const QRect & rect, int flags , const QPalette & pal, bool enabled, const QString & text , QPalette::ColorRole textRole = QPalette::NoRole) const override; }; class LXQtTaskButton : public QToolButton { Q_OBJECT Q_PROPERTY(Qt::Corner origin READ origin WRITE setOrigin) public: explicit LXQtTaskButton(const WId window, LXQtTaskBar * taskBar, QWidget *parent = nullptr); virtual ~LXQtTaskButton(); bool isApplicationHidden() const; bool isApplicationActive() const; WId windowId() const { return mWindow; } bool hasUrgencyHint() const { return mUrgencyHint; } void setUrgencyHint(bool set); bool isOnDesktop(int desktop) const; bool isOnCurrentScreen() const; bool isMinimized() const; void updateText(); Qt::Corner origin() const; virtual void setAutoRotation(bool value, ILXQtPanel::Position position); LXQtTaskBar * parentTaskBar() const {return mParentTaskBar;} static QString mimeDataFormat() { return QLatin1String("lxqt/lxqttaskbutton"); } /*! \return true if this button received DragEnter event (and no DragLeave event yet) * */ bool hasDragAndDropHover() const; public slots: void raiseApplication(); void minimizeApplication(); void maximizeApplication(); void deMaximizeApplication(); void shadeApplication(); void unShadeApplication(); void closeApplication(); void moveApplicationToDesktop(); void moveApplication(); void resizeApplication(); void setApplicationLayer(); void setOrigin(Qt::Corner); void updateIcon(); protected: virtual void changeEvent(QEvent *event); virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dragMoveEvent(QDragMoveEvent * event); virtual void dragLeaveEvent(QDragLeaveEvent *event); virtual void dropEvent(QDropEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent* event); virtual void contextMenuEvent(QContextMenuEvent *event); void paintEvent(QPaintEvent *); void setWindowId(WId wid) {mWindow = wid;} virtual QMimeData * mimeData(); static bool sDraggging; inline ILXQtPanelPlugin * plugin() const { return mPlugin; } void setTextExplicitly(const QString& str); protected: //TODO: public getter instead? ILXQtAbstractWMInterface *mBackend; private: void moveApplicationToPrevNextDesktop(bool next); void moveApplicationToPrevNextMonitor(bool next); WId mWindow; bool mUrgencyHint; QPoint mDragStartPosition; Qt::Corner mOrigin; LXQtTaskBar * mParentTaskBar; ILXQtPanelPlugin * mPlugin; int mIconSize; int mWheelDelta; QString mExplicitlySetText; // Timer for when draggind something into a button (the button's window // must be activated so that the use can continue dragging to the window QTimer * mDNDTimer; // Timer for distinguishing between separate mouse wheel rotations QTimer * mWheelTimer; signals: void dropped(QObject * dragSource, QPoint const & pos); void dragging(QObject * dragSource, QPoint const & pos); }; typedef QHash LXQtTaskButtonHash; #endif // LXQTTASKBUTTON_H ================================================ FILE: plugin-taskbar/lxqttaskgroup.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttaskgroup.h" #include "lxqttaskbar.h" #include "lxqtgrouppopup.h" #include "../panel/ilxqtpanelplugin.h" #include #include #include #include #include #include #include #include #include "../panel/backends/ilxqtabstractwmiface.h" /************************************************ ************************************************/ LXQtTaskGroup::LXQtTaskGroup(const QString &groupName, WId window, LXQtTaskBar *parent) : LXQtTaskButton(window, parent, parent), mGroupName(groupName), mPopup(new LXQtGroupPopup(this)), mPreventPopup(false), mSingleButton(true) { Q_ASSERT(parent); setObjectName(groupName); setTextExplicitly(groupName); connect(this, &LXQtTaskGroup::clicked, this, &LXQtTaskGroup::onClicked); connect(parent, &LXQtTaskBar::buttonRotationRefreshed, this, &LXQtTaskGroup::setAutoRotation); connect(parent, &LXQtTaskBar::refreshIconGeometry, this, &LXQtTaskGroup::refreshIconsGeometry); connect(parent, &LXQtTaskBar::buttonStyleRefreshed, this, &LXQtTaskGroup::setToolButtonsStyle); connect(parent, &LXQtTaskBar::showOnlySettingChanged, this, &LXQtTaskGroup::refreshVisibility); connect(parent, &LXQtTaskBar::popupShown, this, &LXQtTaskGroup::groupPopupShown); connect(mBackend, &ILXQtAbstractWMInterface::currentWorkspaceChanged, this, &LXQtTaskGroup::onDesktopChanged); connect(mBackend, &ILXQtAbstractWMInterface::activeWindowChanged, this, &LXQtTaskGroup::onActiveWindowChanged); } /************************************************ ************************************************/ void LXQtTaskGroup::contextMenuEvent(QContextMenuEvent *event) { setPopupVisible(false, true); if (mSingleButton) { LXQtTaskButton::contextMenuEvent(event); return; } mPreventPopup = true; QMenu * menu = new QMenu(tr("Group")); menu->setAttribute(Qt::WA_DeleteOnClose); QAction *a = menu->addAction(XdgIcon::fromTheme(QStringLiteral("process-stop")), tr("Close group")); connect(a, &QAction::triggered, this, &LXQtTaskGroup::closeGroup); connect(menu, &QMenu::aboutToHide, this, [this] { mPreventPopup = false; }); menu->setGeometry(plugin()->panel()->calculatePopupWindowPos(mapToGlobal(event->pos()), menu->sizeHint())); plugin()->willShowWindow(menu); menu->show(); } /************************************************ ************************************************/ void LXQtTaskGroup::closeGroup() { for (LXQtTaskButton *button : std::as_const(mButtonHash) ) if (button->isOnDesktop(mBackend->getCurrentWorkspace())) button->closeApplication(); } /************************************************ ************************************************/ LXQtTaskButton * LXQtTaskGroup::addWindow(WId id) { if (mButtonHash.contains(id)) return mButtonHash.value(id); LXQtTaskButton *btn = new LXQtTaskButton(id, parentTaskBar(), mPopup); btn->setToolButtonStyle(popupButtonStyle()); if (btn->isApplicationActive()) { btn->setChecked(true); setChecked(true); } mButtonHash.insert(id, btn); mPopup->addButton(btn); connect(btn, &LXQtTaskButton::clicked, this, &LXQtTaskGroup::onChildButtonClicked); refreshVisibility(); return btn; } /************************************************ ************************************************/ LXQtTaskButton * LXQtTaskGroup::checkedButton() const { for (LXQtTaskButton* button : std::as_const(mButtonHash)) if (button->isChecked()) return button; return nullptr; } /************************************************ ************************************************/ LXQtTaskButton * LXQtTaskGroup::getNextPrevChildButton(bool next, bool circular) { LXQtTaskButton *button = checkedButton(); int idx = mPopup->indexOf(button); int inc = next ? 1 : -1; idx += inc; // if there is no checked button, get the first one if next equals true // or the last one if not if (!button) { idx = -1; if (next) { for (int i = 0; i < mPopup->count() && idx == -1; i++) if (mPopup->itemAt(i)->widget()->isVisibleTo(mPopup)) idx = i; } else { for (int i = mPopup->count() - 1; i >= 0 && idx == -1; i--) if (mPopup->itemAt(i)->widget()->isVisibleTo(mPopup)) idx = i; } } if (circular) idx = (idx + mButtonHash.count()) % mButtonHash.count(); else if (mPopup->count() <= idx || idx < 0) return nullptr; // return the next or the previous child QLayoutItem *item = mPopup->itemAt(idx); if (item) { button = qobject_cast(item->widget()); if (button->isVisibleTo(mPopup)) return button; } return nullptr; } /************************************************ ************************************************/ void LXQtTaskGroup::onActiveWindowChanged(WId window) { LXQtTaskButton *button = mButtonHash.value(window, nullptr); for (LXQtTaskButton *btn : std::as_const(mButtonHash)) btn->setChecked(false); if (button) { button->setChecked(true); if (button->hasUrgencyHint()) button->setUrgencyHint(false); } setChecked(nullptr != button && button->isVisibleTo(mPopup)); } /************************************************ ************************************************/ void LXQtTaskGroup::onDesktopChanged(int /*number*/) { refreshVisibility(); } /************************************************ ************************************************/ void LXQtTaskGroup::onWindowRemoved(WId window) { if (mButtonHash.contains(window)) { LXQtTaskButton *button = mButtonHash.value(window); mButtonHash.remove(window); mPopup->removeWidget(button); button->deleteLater(); if (mButtonHash.count()) regroup(); else { if (isVisible()) emit visibilityChanged(false); hide(); emit groupBecomeEmpty(groupName()); } } } /************************************************ ************************************************/ void LXQtTaskGroup::onChildButtonClicked() { setPopupVisible(false, true); } /************************************************ ************************************************/ Qt::ToolButtonStyle LXQtTaskGroup::popupButtonStyle() const { // do not set icons-only style in the buttons in the group, // as they'll be indistinguishable const Qt::ToolButtonStyle style = toolButtonStyle(); return style == Qt::ToolButtonIconOnly ? Qt::ToolButtonTextBesideIcon : style; } /************************************************ ************************************************/ void LXQtTaskGroup::setToolButtonsStyle(Qt::ToolButtonStyle style) { setToolButtonStyle(style); const Qt::ToolButtonStyle styleInPopup = popupButtonStyle(); for (auto & button : mButtonHash) { button->setToolButtonStyle(styleInPopup); } } /************************************************ ************************************************/ int LXQtTaskGroup::buttonsCount() const { return mButtonHash.count(); } /************************************************ ************************************************/ int LXQtTaskGroup::visibleButtonsCount() const { int i = 0; for (LXQtTaskButton *btn : std::as_const(mButtonHash)) if (btn->isVisibleTo(mPopup)) i++; return i; } /************************************************ ************************************************/ void LXQtTaskGroup::draggingTimerTimeout() { if (mSingleButton) setPopupVisible(false); } /************************************************ ************************************************/ void LXQtTaskGroup::onClicked(bool) { if (visibleButtonsCount() > 1) { setChecked(mButtonHash.contains(mBackend->getActiveWindow())); setPopupVisible(true); } } /************************************************ ************************************************/ void LXQtTaskGroup::regroup() { int cont = visibleButtonsCount(); recalculateFrameIfVisible(); if (cont == 1) { mSingleButton = true; // Get first visible button LXQtTaskButton * button = nullptr; for (LXQtTaskButton *btn : std::as_const(mButtonHash)) { if (btn->isVisibleTo(mPopup)) { button = btn; break; } } if (button) { setTextExplicitly(button->text()); setToolTip(button->toolTip()); setWindowId(button->windowId()); } } else if (cont == 0) hide(); else { mSingleButton = false; QString t = QString(QStringLiteral("%1 - %2 windows")).arg(mGroupName).arg(cont); setTextExplicitly(t); setToolTip(parentTaskBar()->isShowGroupOnHover() ? QString() : t); } } /************************************************ ************************************************/ void LXQtTaskGroup::recalculateFrameIfVisible() { if (mPopup->isVisible()) { recalculateFrameSize(); if (plugin()->panel()->position() == ILXQtPanel::PositionBottom) recalculateFramePosition(); } } /************************************************ ************************************************/ void LXQtTaskGroup::setAutoRotation(bool value, ILXQtPanel::Position position) { for (LXQtTaskButton *button : std::as_const(mButtonHash)) button->setAutoRotation(false, position); LXQtTaskButton::setAutoRotation(value, position); } /************************************************ ************************************************/ void LXQtTaskGroup::refreshVisibility() { bool will = false; LXQtTaskBar const * taskbar = parentTaskBar(); const int showDesktop = taskbar->showDesktopNum(); for(LXQtTaskButton * btn : std::as_const(mButtonHash)) { bool visible = taskbar->isShowOnlyOneDesktopTasks() ? btn->isOnDesktop(0 == showDesktop ? mBackend->getCurrentWorkspace() : showDesktop) : true; visible &= taskbar->isShowOnlyCurrentScreenTasks() ? btn->isOnCurrentScreen() : true; visible &= taskbar->isShowOnlyMinimizedTasks() ? btn->isMinimized() : true; btn->setVisible(visible); will |= visible; // correct the checked state if this button is checked if (btn->isChecked()) setChecked(visible); } bool is = isVisible(); setVisible(will); regroup(); if (is != will) emit visibilityChanged(will); } /************************************************ ************************************************/ QMimeData * LXQtTaskGroup::mimeData() { QMimeData *mimedata = new QMimeData; QByteArray byteArray; QDataStream stream(&byteArray, QIODevice::WriteOnly); stream << groupName(); mimedata->setData(mimeDataFormat(), byteArray); return mimedata; } /************************************************ ************************************************/ void LXQtTaskGroup::setPopupVisible(bool visible, bool fast) { if (visible && !mPreventPopup && !mSingleButton) { if (!mPopup->isVisible()) { // setup geometry recalculateFrameSize(); recalculateFramePosition(); } plugin()->willShowWindow(mPopup); mPopup->show(); emit popupShown(this); } else mPopup->hide(fast); } /************************************************ ************************************************/ void LXQtTaskGroup::refreshIconsGeometry() { QRect rect = geometry(); rect.moveTo(mapToGlobal(QPoint(0, 0))); if (mSingleButton) { mBackend->refreshIconGeometry(windowId(), rect); return; } for(LXQtTaskButton *but : std::as_const(mButtonHash)) { mBackend->refreshIconGeometry(but->windowId(), rect); but->setIconSize(QSize(plugin()->panel()->iconSize(), plugin()->panel()->iconSize())); } } /************************************************ ************************************************/ QSize LXQtTaskGroup::recalculateFrameSize() { int height = recalculateFrameHeight(); mPopup->setMaximumHeight(1000); mPopup->setMinimumHeight(0); int hh = recalculateFrameWidth(); mPopup->setMaximumWidth(hh); mPopup->setMinimumWidth(0); QSize newSize(hh, height); mPopup->resize(newSize); return newSize; } /************************************************ ************************************************/ int LXQtTaskGroup::recalculateFrameHeight() const { int cont = visibleButtonsCount(); int h = !plugin()->panel()->isHorizontal() && parentTaskBar()->isAutoRotate() ? width() : height(); return cont * h + (cont + 1) * mPopup->spacing(); } /************************************************ ************************************************/ int LXQtTaskGroup::recalculateFrameWidth() const { const QFontMetrics fm = fontMetrics(); int max = 100 * fm.horizontalAdvance(QLatin1Char(' ')); // elide after the max width int txtWidth = 0; for (LXQtTaskButton *btn : std::as_const(mButtonHash)) txtWidth = std::max(fm.horizontalAdvance(btn->text()), txtWidth); return iconSize().width() + std::min(txtWidth, max) + 30/* give enough room to margins and borders*/; } /************************************************ ************************************************/ QPoint LXQtTaskGroup::recalculateFramePosition() { // Set position int x_offset = 0, y_offset = 0; switch (plugin()->panel()->position()) { case ILXQtPanel::PositionTop: y_offset += height(); break; case ILXQtPanel::PositionBottom: y_offset = -recalculateFrameHeight(); break; case ILXQtPanel::PositionLeft: x_offset += width(); break; case ILXQtPanel::PositionRight: x_offset = -recalculateFrameWidth(); break; } QPoint pos = mapToGlobal(QPoint(x_offset, y_offset)); mPopup->move(pos); return pos; } /************************************************ ************************************************/ void LXQtTaskGroup::leaveEvent(QEvent *event) { setPopupVisible(false); QToolButton::leaveEvent(event); } /************************************************ ************************************************/ void LXQtTaskGroup::enterEvent(QEnterEvent *event) { QToolButton::enterEvent(event); if (sDraggging) return; if (parentTaskBar()->isShowGroupOnHover()) setPopupVisible(true); } /************************************************ ************************************************/ void LXQtTaskGroup::dragEnterEvent(QDragEnterEvent *event) { // only show the popup if we aren't dragging a taskgroup if (!event->mimeData()->hasFormat(mimeDataFormat())) { setPopupVisible(true); } LXQtTaskButton::dragEnterEvent(event); } /************************************************ ************************************************/ void LXQtTaskGroup::dragLeaveEvent(QDragLeaveEvent *event) { // if draggind something into the taskgroup or the taskgroups' popup, // do not close the popup if (!sDraggging) setPopupVisible(false); LXQtTaskButton::dragLeaveEvent(event); } void LXQtTaskGroup::mouseMoveEvent(QMouseEvent* event) { // if dragging the taskgroup, do not show the popup if (event->buttons() & Qt::LeftButton) setPopupVisible(false, true); LXQtTaskButton::mouseMoveEvent(event); } /************************************************ ************************************************/ void LXQtTaskGroup::mouseReleaseEvent(QMouseEvent* event) { // do nothing on left button release if there is a group if (event->button() == Qt::LeftButton && visibleButtonsCount() == 1) LXQtTaskButton::mouseReleaseEvent(event); else QToolButton::mouseReleaseEvent(event); } /************************************************ ************************************************/ void LXQtTaskGroup::wheelEvent(QWheelEvent* event) { if (mSingleButton) { LXQtTaskButton::wheelEvent(event); return; } // if there are multiple buttons, just show the popup setPopupVisible(true); QToolButton::wheelEvent(event); } /************************************************ ************************************************/ bool LXQtTaskGroup::onWindowChanged(WId window, LXQtTaskBarWindowProperty prop) { // Returns true if the class is preserved bool needsRefreshVisibility{false}; QList buttons; if (mButtonHash.contains(window)) buttons.append(mButtonHash.value(window)); // If group is based on that window properties must be changed also on button group if (window == windowId()) buttons.append(this); if (!buttons.isEmpty()) { // if class is changed the window won't belong to our group any more if (parentTaskBar()->isGroupingEnabled() && prop == LXQtTaskBarWindowProperty::WindowClass) { if (mBackend->getWindowClass(windowId()) != mGroupName) { onWindowRemoved(window); return false; } } // window changed virtual desktop or may change screen if ((prop == LXQtTaskBarWindowProperty::Workspace && parentTaskBar()->isShowOnlyOneDesktopTasks()) || (prop == LXQtTaskBarWindowProperty::Geometry && parentTaskBar()->isShowOnlyCurrentScreenTasks())) { needsRefreshVisibility = true; } if (prop == LXQtTaskBarWindowProperty::Title) std::for_each(buttons.begin(), buttons.end(), std::mem_fn(&LXQtTaskButton::updateText)); // XXX: we are setting window icon geometry -> don't need to handle NET::WMIconGeometry // Icon of the button can be based on windowClass if (prop == LXQtTaskBarWindowProperty::Icon) std::for_each(buttons.begin(), buttons.end(), std::mem_fn(&LXQtTaskButton::updateIcon)); bool set_urgency = false; bool urgency = false; if (prop == LXQtTaskBarWindowProperty::Urgency) { set_urgency = true; //FIXME: original code here did not consider "demand attention", was it intentional? urgency = mBackend->applicationDemandsAttention(window); } if (prop == LXQtTaskBarWindowProperty::State) { if (!set_urgency) urgency = mBackend->applicationDemandsAttention(window); std::for_each(buttons.begin(), buttons.end(), std::bind(&LXQtTaskButton::setUrgencyHint, std::placeholders::_1, urgency)); set_urgency = false; if (parentTaskBar()->isShowOnlyMinimizedTasks()) { needsRefreshVisibility = true; } } if (set_urgency) std::for_each(buttons.begin(), buttons.end(), std::bind(&LXQtTaskButton::setUrgencyHint, std::placeholders::_1, urgency)); } if (needsRefreshVisibility) refreshVisibility(); return true; } /************************************************ ************************************************/ void LXQtTaskGroup::groupPopupShown(LXQtTaskGroup * const sender) { //close all popups (should they be visible because of close delay) if (this != sender && isVisible()) setPopupVisible(false, true/*fast*/); } ================================================ FILE: plugin-taskbar/lxqttaskgroup.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2011 Razor team * 2014 LXQt team * Authors: * Alexander Sokoloff * Maciej Płaza * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTTASKGROUP_H #define LXQTTASKGROUP_H #include "lxqttaskbutton.h" #include "../panel/backends/lxqttaskbartypes.h" class QVBoxLayout; class ILXQtPanelPlugin; class LXQtGroupPopup; class LXQtMasterPopup; class LXQtTaskGroup: public LXQtTaskButton { Q_OBJECT public: LXQtTaskGroup(const QString & groupName, WId window, LXQtTaskBar * parent); QString groupName() const { return mGroupName; } int buttonsCount() const; int visibleButtonsCount() const; LXQtTaskButton * addWindow(WId id); LXQtTaskButton * checkedButton() const; // Returns the next or the previous button in the popup // if circular is true, then it will go around the list of buttons LXQtTaskButton * getNextPrevChildButton(bool next, bool circular); bool onWindowChanged(WId window, LXQtTaskBarWindowProperty prop); void setAutoRotation(bool value, ILXQtPanel::Position position); Qt::ToolButtonStyle popupButtonStyle() const; void setToolButtonsStyle(Qt::ToolButtonStyle style); void setPopupVisible(bool visible = true, bool fast = false); public slots: void onWindowRemoved(WId window); protected: QMimeData * mimeData(); void leaveEvent(QEvent * event); void enterEvent(QEnterEvent *event); void dragEnterEvent(QDragEnterEvent * event); void dragLeaveEvent(QDragLeaveEvent * event); void contextMenuEvent(QContextMenuEvent * event); void mouseMoveEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent *event); void wheelEvent(QWheelEvent* event); int recalculateFrameHeight() const; int recalculateFrameWidth() const; void draggingTimerTimeout(); private slots: void onClicked(bool checked); void onChildButtonClicked(); void onActiveWindowChanged(WId window); void onDesktopChanged(int number); void closeGroup(); void refreshIconsGeometry(); void refreshVisibility(); void groupPopupShown(LXQtTaskGroup* sender); signals: void groupBecomeEmpty(QString name); void visibilityChanged(bool visible); void popupShown(LXQtTaskGroup* sender); private: QString mGroupName; LXQtGroupPopup * mPopup; LXQtTaskButtonHash mButtonHash; bool mPreventPopup; bool mSingleButton; //!< flag if this group should act as a "standard" button (no grouping or only one "shown" window in group) QSize recalculateFrameSize(); QPoint recalculateFramePosition(); void recalculateFrameIfVisible(); void regroup(); }; #endif // LXQTTASKGROUP_H ================================================ FILE: plugin-taskbar/resources/taskbar.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=window-duplicate #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-taskbar/translations/taskbar.desktop.yaml ================================================ Desktop Entry/Name: "Task Manager" Desktop Entry/Comment: "Switch between running applications" ================================================ FILE: plugin-taskbar/translations/taskbar.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ar.desktop.yaml ================================================ Desktop Entry/Name: "مدير المهامّ" Desktop Entry/Comment: "بدّل بين التّطبيقات العاملة" ================================================ FILE: plugin-taskbar/translations/taskbar_ar.ts ================================================ LXQtTaskBar Activate task %1 فعّل المهمة 1% LXQtTaskButton Application التطبيق To &Desktop إلى س&طح المكتب &All Desktops &كل أسطح المكتب Desktop &%1 سطح المكتب &1% &To Current Desktop إ&لى سطح المكتب الحالي Move To N&ext Monitor الانتقال إلى جهاز العرض التالي Move To &Previous Monitor الانتقال إلى جهاز العرض السابق &Move ا&نقل Resi&ze &غيّر المقاس Ma&ximize &كبّر Maximize vertically كبّر رأسيا Maximize horizontally كبّر أفقيا &Restore ا&ستعِد Mi&nimize &صغّر Roll down لُفّ لأسفل Roll up لُفّ لأعلى &Layer ال&طبقة Always on &top &فوق الكل دائما &Normal &عادي Always on &bottom &تحت الكل دائما &Close أ&غلِق LXQtTaskGroup Group المجموعة Close group أغلِق المجموعة LXQtTaskbarConfiguration Task Manager Settings إعدادات مدير المهام General عام Show only windows from desktop اعرض فقط النوافذ في سطح المكتب Show only windows from &panel's screen اعرض النوافذ في شاشة اللو&حة فقط Show only minimized windows اعرض النوافذ المصغّرة فقط Raise minimized windows on current desktop كبّر النوافذ المصغّرة في سطح المكتب الحالي Close on middle-click أغلِق بالنقر بالوسط Comma separated list of window classes قائمة مفصولة بفواصل لفئات النافذة Exclude from taskbar استبعاد من شريط المهام Cycle windows on wheel scrolling عجلة الفأرة تُبدّل بين النوافذ Window &grouping &جمّع النوافذ Show popup on mouse hover اعرض منبثقة عند مرور المؤشّر Appearance المظهر Button style نمط الأزرار Maximum button width أدنى عرض للزرّ px بكسل Mouse Wheel عجلة الفأرة Wheel Delta Threshold عتبة عجلة دلتا Put buttons of the same class next to each other ضع الأزرار من نفس الفئة بجانب بعضها البعض Maximum button height أقصى ارتفاع للزرّ Auto&rotate buttons when the panel is vertical &دوّر الأزرار آليا عندما تكون اللوحة رأسية Use icons by WindowClass, if available استخدم الأيقونات من WindowClass إن وُجدت Icon and text أيقونة ونص Only icon أيقونة فقط Only text نص فقط Disabled غير فعّال Scroll up to raise, down to minimize قم بالتمرير لأعلى للرفع ، وللأسفل للتقليل Scroll up to minimize, down to raise قم بالتمرير لأعلى للتقليل ، وللأسفل للرفع Scroll up to move to next desktop, down to previous قم بالتمرير لأعلى للانتقال إلى سطح المكتب التالي ، ولأسفل إلى السابق Scroll up to move to previous desktop, down to next قم بالتمرير لأعلى للانتقال إلى سطح المكتب السابق ، ومن الأسفل إلى التالي Current الحالي Desktop %1 سطح المكتب %1 ================================================ FILE: plugin-taskbar/translations/taskbar_arn.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ast.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_bg.desktop.yaml ================================================ Desktop Entry/Name: "Управление на прозорци" Desktop Entry/Comment: "Лента за превключване и управление на отворените прозорци" ================================================ FILE: plugin-taskbar/translations/taskbar_bg.ts ================================================ LXQtTaskBar Activate task %1 Активиране на задача %1 LXQtTaskButton Application Приложение To &Desktop Към &работен плот &All Desktops &Всички работни плотове Desktop &%1 Работен плот &%1 &To Current Desktop &Към текущия работен плот Move To N&ext Monitor Преместване към &следващия монитор Move To &Previous Monitor Преместване към предишния монитор &Move &Преместване Resi&ze Преораз&меряване Ma&ximize Ма&ксимализиране Maximize vertically Вертикално максимализиране Maximize horizontally Хоризонтално максимализиране &Restore В&ъзстановяване Mi&nimize Минимизиране Roll down Разгъване Roll up Свиване &Layer &Ниво Always on &top Винаги &отгоре &Normal &Нормално Always on &bottom Винаги отдол&у &Close &Затваряне LXQtTaskGroup Group Групиране Close group Затваряне на група LXQtTaskbarConfiguration Task Manager Settings Настройки на Управление на прозорците General Общи Show only windows from desktop Показване само на прозорците от работен плот: Show only windows from &panel's screen Показване само на прозорците от екрана на &панела Show only minimized windows Показване само на минимизираните прозорци Raise minimized windows on current desktop Възстановяване на минимизираните прозорци на текущия работен плот Close on middle-click Затваряне със средния бутон на мишката Comma separated list of window classes Списък с класове на прозорци, разделени със запетая Exclude from taskbar Изключване от лентата на задачите: Cycle windows on wheel scrolling прелистване на прозорците Window &grouping &Групиране на прозорците Show popup on mouse hover Показване на подсказки при посочване Appearance Външен вид Button style Стил на полетата: Maximum button width Максимална ширина на полетата: px px Mouse Wheel Действия с колелцето на мишката: Wheel Delta Threshold Чувствителност на превъртането: Put buttons of the same class next to each other Поставяне на полета от един клас един до друг Maximum button height Максимална височина на полетата: Auto&rotate buttons when the panel is vertical Автоматично завъртане на полетата когато панелът е вертикален Use icons by WindowClass, if available Използване на икони според WindowClass, ако са налични Icon and text икони и текст Only icon само икони Only text само текст Disabled изключено Scroll up to raise, down to minimize превъртане нагоре за максимализиране, надолу за минимизиране Scroll up to minimize, down to raise превъртане нагоре за минимизиране, надолу за максимализиране Scroll up to move to next desktop, down to previous превъртане нагоре за преместване към следващия работен плот, надолу за предишния Scroll up to move to previous desktop, down to next превъртане нагоре за преместване към предишния работен плот, надолу за следващия Current текущ Desktop %1 Десктоп %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ca.desktop.yaml ================================================ Desktop Entry/Name: "Gestor de tasques" Desktop Entry/Comment: "Canvieu entre aplicacions en execució" ================================================ FILE: plugin-taskbar/translations/taskbar_ca.ts ================================================ LXQtTaskBar Activate task %1 Activa la tasca %1 LXQtTaskButton Application Aplicació To &Desktop A l'&escriptori &All Desktops T&ots els escriptoris Desktop &%1 Escriptori &%1 &To Current Desktop A l'escriptori ac&tual Move To N&ext Monitor Canvia al s&egüent monitor Move To &Previous Monitor Mou al &monitor anterior &Move &Mou Resi&ze Redimen&siona Ma&ximize Ma&ximitza Maximize vertically Maximitza verticalment Maximize horizontally Maximitza horitzontalment &Restore &Restaura Mi&nimize Mi&nimitza Roll down Enrotlla cap avall Roll up Enrotlla cap amunt &Layer &Capa Always on &top Sempre a la par&t superior &Normal &Normal Always on &bottom Sempre a la part in&ferior &Close Tan&ca LXQtTaskGroup Group Grup Close group Tanca el grup LXQtTaskbarConfiguration Task Manager Settings Ajusts del gestor de tasques General General Show only windows from desktop Mostra únicament les finestres de l'escriptori Show only windows from &panel's screen Mostra únicament les finestres de la pantalla del &tauler Show only minimized windows Mostra únicament les finestres minimitzades Raise minimized windows on current desktop Eleva les finestres minimitzades en l'escriptori actual Close on middle-click Tanca amb el clic del botó del mig Comma separated list of window classes Llista de classes de finestres separades per comes Exclude from taskbar Exclou de la barra de tasques Cycle windows on wheel scrolling Recorre les finestres amb el desplaçament del ratolí Window &grouping A&grupació de les finestres Show popup on mouse hover Mostra el menú emergent en passar per sobre el ratolí Appearance Aparença Button style Estil del botó Maximum button width Amplada màxima del botó px px Mouse Wheel Roda del ratolí Wheel Delta Threshold Llindar Delta de la roda Put buttons of the same class next to each other Posa els botons de la mateixa classe un al costat de l'altre Maximum button height Alçada màxima del botó Auto&rotate buttons when the panel is vertical Gi&ra automàticament els botons quan el tauler sigui vertical Use icons by WindowClass, if available Utilitza les icones de classe de finestra, si estigués disponible Icon and text Icona i text Only icon Només la icona Only text Només el text Disabled Inhabilitat Scroll up to raise, down to minimize Desplaça amunt per pujar, avall per minimitzar Scroll up to minimize, down to raise Desplaça cap amunt per minimitzar, cap avall per pujar Scroll up to move to next desktop, down to previous Desplaça amunt per moure's al següent escriptori, avall a l'anterior Scroll up to move to previous desktop, down to next Desplaça cap amunt per moure's a l'escriptori anterior, cap avall fins al següent Current Actual Desktop %1 Escriptori %1 ================================================ FILE: plugin-taskbar/translations/taskbar_cs.desktop.yaml ================================================ Desktop Entry/Name: "Správce úloh" Desktop Entry/Comment: "Přepínání mezi spuštěnými aplikacemi" ================================================ FILE: plugin-taskbar/translations/taskbar_cs.ts ================================================ LXQtTaskBar Activate task %1 Aktivovat úlohu %1 LXQtTaskButton Application Aplikace To &Desktop Na &plochu &All Desktops &Všechny plochy Desktop &%1 Plocha &%1 &To Current Desktop Na s&távající plochu Move To N&ext Monitor Př&esunout na další z monitorů Move To &Previous Monitor Přesunout na &předchozí obrazovku &Move &Přesunout Resi&ze &Změnit velikost Ma&ximize Z&většit Maximize vertically Udělat největším ve svislém směru Maximize horizontally Udělat největším ve vodorovném směru &Restore &Obnovit předchozí velikost Mi&nimize &Zmenšit Roll down Sbalit Roll up Rozbalit &Layer &Vrstva Always on &top Vždy &navrchu &Normal &Normální Always on &bottom Vždy &naspodu &Close &Zavřít LXQtTaskGroup Group Seskupit Close group Zavřít skupinu LXQtTaskbarConfiguration Task Manager Settings Nastavení Správce úloh General Obecné Show only windows from desktop Ukazovat pouze okna z dané plochy Show only windows from &panel's screen Ukazovat pouze okna z obrazovky, na které se daný &panel nachází Show only minimized windows Ukazovat pouze minimalizovaná okna Raise minimized windows on current desktop Vyzdvihnout minimalizovaná okna stávající plochy Comma separated list of window classes Seznam tříd oken oddělených čárkou Exclude from taskbar Vyloučit z panelu úloh Cycle windows on wheel scrolling Přepínat mezi okny otáčením kolečka myši Window &grouping &Seskupování oken Show popup on mouse hover Při najetí ukazatelem myši zobrazit vyskakovací okno Appearance Vzhled Maximum button width Šířka tlačítka maximálně px px Mouse Wheel Kolečko myši Wheel Delta Threshold Práh přírůstku pootočení kolečka Put buttons of the same class next to each other Dát tlačítka stejné třídy vedle sebe Maximum button height Výška tlačítka maximálně Use icons by WindowClass, if available Použít ikony podle třídy okna (pokud je k dispozici) Auto&rotate buttons when the panel is vertical Při svisle o&rientovaném panelu otočit tlačítka tak, aby byla vodorovně Button style Styl tlačítek Close on middle-click Zavírat kliknutím prostředním tlačítkem Icon and text Ikona a text Only icon Pouze ikona Only text Pouze text Disabled Vypnuto Scroll up to raise, down to minimize Otáčením nahoru přenést do popředí, dolů minimalizovat Scroll up to minimize, down to raise Otáčením nahoru minimalizovat, dolů přenést do popředí Scroll up to move to next desktop, down to previous Otáčením nahoru pro přesun na další plochu, dolů pro přesun na předchozí Scroll up to move to previous desktop, down to next Otáčením nahoru pro přesun na předchozí plochu, dolů pro přesun na další Current Stávající Desktop %1 Plocha %1 ================================================ FILE: plugin-taskbar/translations/taskbar_cy.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_da.desktop.yaml ================================================ Desktop Entry/Name: "Opgavehåndtering" Desktop Entry/Comment: "Skift mellem kørende programmer" ================================================ FILE: plugin-taskbar/translations/taskbar_da.ts ================================================ LXQtTaskBar Activate task %1 Aktivér opgave %1 LXQtTaskButton Application Program To &Desktop Til &skrivebord &All Desktops &Alle skriveborde Desktop &%1 Skrivebord &%1 &To Current Desktop &Til nuværende skrivebord Move To N&ext Monitor Flyt til n&æste skærm Move To &Previous Monitor Flyt til &forrige skærm &Move &Flyt Resi&ze &Tilpas størrelse Ma&ximize Ma&ksimer Maximize vertically Maksimer lodret Maximize horizontally Maksimer vandret &Restore &Genskab Mi&nimize Mi&nimer Roll down Rul ned Roll up Rul op &Layer &Lag Always on &top Altid &øverst &Normal &Normal Always on &bottom Altid &nederst &Close &Luk LXQtTaskGroup Group Gruppe Close group Luk gruppe LXQtTaskbarConfiguration Task Manager Settings Indstillinger for opgavehåndtering General Generelt Show only windows from desktop Vis kun vinduer fra skrivebord Show only windows from &panel's screen Vis kun vinduer fra &panelets skærm Show only minimized windows Vis kun minimerede vinduer Raise minimized windows on current desktop Løft minimerede vinduer på nuværende skrivebord Cycle windows on wheel scrolling Gennemløb vinduer når der rulles med hjulet Window &grouping Vindues&gruppering Appearance Udseende Maximum button width Maksimum knapbredde px px Maximum button height Maksimum knaphøjde Use icons by WindowClass, if available Brug ikoner fra WindowClass, hvis tilgængeligt Auto&rotate buttons when the panel is vertical &Rotér automatisk knapper når panelet er lodret Close on middle-click Luk ved midterklik Mouse Wheel Musehjul Wheel Delta Threshold Hjulets deltatærskel Show popup on mouse hover Vis pop op når musen holdes over Put buttons of the same class next to each other Placer knapper af samme klasse ved siden af hinanden Button style Knapstil Comma separated list of window classes Kommasepareret liste over vinduesklasser Exclude from taskbar Udeluk fra proceslinjen Icon and text Ikon og tekst Only icon Kun ikon Only text Kun tekst Disabled Deaktiveret Scroll up to raise, down to minimize Rul op for at løfte, ned for at minimere Scroll up to minimize, down to raise Rul op for at minimere, ned for at løfte Scroll up to move to next desktop, down to previous Rul op for er flytte til næste skrivebord, ned for forrige Scroll up to move to previous desktop, down to next Rul op for er flytte til forrige skrivebord, ned for næste Current Nuværende Desktop %1 Skrivebord %1 ================================================ FILE: plugin-taskbar/translations/taskbar_de.desktop.yaml ================================================ Desktop Entry/Name: "Anwendungsverwalter" Desktop Entry/Comment: "Wechsel zwischen laufenden Anwendungen" ================================================ FILE: plugin-taskbar/translations/taskbar_de.ts ================================================ LXQtTaskBar Activate task %1 Aufgabe %1 aktivieren LXQtTaskButton Application Anwendung To &Desktop Zu Arbei&tsfläche &All Desktops &Alle Arbeitsflächen Desktop &%1 Arbeitsfläche &%1 &To Current Desktop Zur ak&tuellen Arbeitsfläche Move To N&ext Monitor Zum n&ächsten Monitor verschieben Move To &Previous Monitor Zum &vorherigen Monitor verschieben &Move &Verschieben Resi&ze &Größe ändern Ma&ximize Ma&ximieren Maximize vertically Vertikal maximieren Maximize horizontally Horizontal maximieren &Restore Wiede&rherstellen Mi&nimize Mi&nimieren Roll down Herunterrollen Roll up Hochrollen &Layer &Ebene Always on &top Immer &oben &Normal &Normal Always on &bottom Immer &unten &Close &Schließen LXQtTaskGroup Group Gruppe Close group Gruppe schließen LXQtTaskbarConfiguration Task Manager Settings Anwendungsverwaltungseinstellungen General Allgemein Show only windows from desktop Nur Fenster der Arbeitsfläche anzeigen Show only windows from &panel's screen Nur Fenster des Bildschirms mit der &Leiste anzeigen Show only minimized windows Nur minimierte Fenster anzeigen Raise minimized windows on current desktop Minimierte Fenster auf aktuelle Arbeitsfläche heben Close on middle-click Mit Mittelklick schließen Comma separated list of window classes Kommagetrennte Liste von Fensterklassen Exclude from taskbar Von der Taskleiste ausschließen Cycle windows on wheel scrolling Fensterwechsel durch Scrolling Window &grouping Fenster&gruppierung Show popup on mouse hover Popup beim Überfahren mit der Maus anzeigen Appearance Erscheinungsbild Button style Schaltflächenstil Maximum button width Maximale Schaltflächenbreite px px Mouse Wheel Mausrad Wheel Delta Threshold Rad-Delta-Schwelle Put buttons of the same class next to each other Platziere Schaltflächen der selben Klasse nebeneinander Maximum button height Maximale Schaltflächenhöhe Auto&rotate buttons when the panel is vertical Schaltflächen bei vertikaler Leiste automatisch d&rehen Use icons by WindowClass, if available Fensterklassensymbole verwenden, falls vorhanden Icon and text Symbol und Text Only icon Nur Symbol Only text Nur Text Disabled Deaktiviert Scroll up to raise, down to minimize Rolle hoch zum vergrößern, runter zum verkleinern Scroll up to minimize, down to raise Rolle hoch zum verkleinern, runter zum vergrößern Scroll up to move to next desktop, down to previous Rolle hoch zur nächsten Arbeitsfläche, runter zur vorherigen Scroll up to move to previous desktop, down to next Rolle runter zur nächsten Arbeitsfläche, hoch zur vorherigen Current Aktuell Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_el.desktop.yaml ================================================ Desktop Entry/Name: "Διαχειριστής εργασιών" Desktop Entry/Comment: "Εναλλαγή μεταξύ των εκτελούμενων εφαρμογών" ================================================ FILE: plugin-taskbar/translations/taskbar_el.ts ================================================ LXQtTaskBar Activate task %1 Ενεργοποίηση της εργασίας %1 LXQtTaskButton Application Εφαρμογή To &Desktop Στην επι&φάνεια εργασίας &All Desktops Ό&λες οι επιφάνειες εργασίας Desktop &%1 Επιφάνεια εργασίας &%1 &To Current Desktop Στ&ην τρέχουσα επιφάνεια εργασίας Move To N&ext Monitor Μετακίνηση στην &επόμενη οθόνη Move To &Previous Monitor Μετακίνηση στην π&ροηγούμενη οθόνη &Move &Μετακίνηση Resi&ze Αλλαγή &μεγέθους Ma&ximize &Μεγιστοποίηση Maximize vertically Μεγιστοποίηση κάθετα Maximize horizontally Μεγιστοποίηση οριζόντια &Restore &Επαναφορά Mi&nimize Ελα&χιστοποίηση Roll down Κύλιση κάτω Roll up Κύλιση επάνω &Layer Στ&ρώση Always on &top Πάντα ε&πάνω &Normal Κα&νονικό Always on &bottom Πάντα &κάτω &Close Κλεί&σιμο LXQtTaskGroup Group Ομάδα Close group Κλείσιμο της ομάδας LXQtTaskbarConfiguration Task Manager Settings Ρυθμίσεις του διαχειριστή εργασιών General Γενικά Show only windows from desktop Εμφάνιση μόνο των παραθύρων της επιφάνειας εργασίας Show only windows from &panel's screen Εμφάνιση μόνο των παραθύρων της οθόνης του &πίνακα Show only minimized windows Εμφάνιση μόνο των ελαχιστοποιημένων παραθύρων Raise minimized windows on current desktop Ανύψωση των ελαχιστοποιημένων παραθύρων στην τρέχουσα επιφάνεια εργασίας Comma separated list of window classes Κατάστιχο κλάσεων παραθύρου διαχωρισμένες με κόμμα Exclude from taskbar Εξαίρεση από την γραμμή εργασιών Cycle windows on wheel scrolling Εναλλαγή παραθύρων κατά την περιστροφή της ρόδας του ποντικιού Window &grouping Ομα&δοποίηση των παραθύρων Show popup on mouse hover Εμφάνιση αναδυόμενου στο πέρασμα του ποντικιού Appearance Εμφάνιση Maximum button width Μέγιστο πλάτος κουμπιού px εικ Mouse Wheel Τροχός ποντικιού Wheel Delta Threshold Κατώτατο όριο Δέλτα τροχού Put buttons of the same class next to each other Τοποθέτηση των κουμπιών της ίδιας κλάσης το ένα δίπλα στο άλλο Maximum button height Μέγιστο ύψος του κουμπιού Use icons by WindowClass, if available Χρήση των εικονιδίων από την κλάση Παραθύρου, αν είναι διαθέσιμα Auto&rotate buttons when the panel is vertical &Αυτόματη περιστροφή των κουμπιών όταν ο πίνακας είναι τοποθετημένος κάθετα Button style Ύφος του πλήκτρου Close on middle-click Κλείσιμο με μεσαίο κλικ Icon and text Εικόνα και κείμενο Only icon Μόνο εικόνα Only text Μόνο κείμενο Disabled Απενεργοποιημένο Scroll up to raise, down to minimize Κύλιση πάνω για ανύψωση, κάτω για ελαχιστοποίηση Scroll up to minimize, down to raise Κύλιση πάνω για ελαχιστοποίηση, κάτω για ανύψωση Scroll up to move to next desktop, down to previous Κύλιση προς τα πάνω για μετάβαση στην επόμενη επιφάνεια εργασίας, προς τα κάτω για την προηγούμενη Scroll up to move to previous desktop, down to next Κύλιση προς τα πάνω για μετάβαση στην προηγούμενη επιφάνεια εργασίας, προς τα κάτω για την επόμενη Current Επιφάνεια εργασίας Τρέχουσα Desktop %1 Επιφάνεια εργασίας %1 ================================================ FILE: plugin-taskbar/translations/taskbar_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Task Manager" Desktop Entry/Comment: "Switch between running applications" ================================================ FILE: plugin-taskbar/translations/taskbar_en_GB.ts ================================================ LXQtTaskBar Activate task %1 Activate task %1 LXQtTaskButton Application Application To &Desktop To &Desktop &All Desktops &All Desktops Desktop &%1 Desktop &%1 &To Current Desktop &To Current Desktop Move To N&ext Monitor Move To N&ext Monitor Move To &Previous Monitor Move To &Previous Monitor &Move &Move Resi&ze Resi&ze Ma&ximize Ma&ximise Maximize vertically Maximise vertically Maximize horizontally Maximise horizontally &Restore &Restore Mi&nimize Mi&nimise Roll down Roll down Roll up Roll up &Layer &Layer Always on &top Always on &top &Normal &Normal Always on &bottom Always on &bottom &Close &Close LXQtTaskGroup Group Group Close group Close group LXQtTaskbarConfiguration Task Manager Settings Task Manager Settings General General Show only windows from desktop Show only windows from desktop Show only windows from &panel's screen Show only windows from &panel's screen Show only minimized windows Show only minimised windows Raise minimized windows on current desktop Raise minimised windows on current desktop Close on middle-click Close on middle-click Comma separated list of window classes Comma-separated list of window classes Exclude from taskbar Exclude from taskbar Cycle windows on wheel scrolling Cycle windows on wheel scrolling Window &grouping Window &grouping Show popup on mouse hover Show popup on mouse hover Appearance Appearance Button style Button style Maximum button width Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to raise, down to minimise Scroll up to minimize, down to raise Scroll up to minimise, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_eo.desktop.yaml ================================================ Desktop Entry/Name: "Taskmastrumilo" Desktop Entry/Comment: "Ŝalti inter rulantaj aplikaĵoj" ================================================ FILE: plugin-taskbar/translations/taskbar_eo.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application Aplikaĵo To &Desktop &Al labortablo &All Desktops Ĉiuj l&abortabloj Desktop &%1 Labortablo &%1 &To Current Desktop Al ak&tuala labortablo Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Ma&ksimumigi Maximize vertically Vertikale maksimumigi Maximize horizontally Horizontale maksimumigi &Restore &Restaŭri Mi&nimize &Malmaksimumigi Roll down Malsupren rulumi Roll up Supren rulumi &Layer Tavo&lo Always on &top Ĉiam &supre &Normal &Normale Always on &bottom Ĉiam &malsupre &Close &Fermi LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Button style Stilo de butonoj Close on middle-click Icon and text Piktogramo kaj teksto Only icon Nur piktogramoj Only text Nur teksto Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_es.desktop.yaml ================================================ Desktop Entry/Name: "Administrador de tareas" Desktop Entry/Comment: "Cambia entre aplicaciones activas" ================================================ FILE: plugin-taskbar/translations/taskbar_es.ts ================================================ LXQtTaskBar Activate task %1 Activar la tarea %1 LXQtTaskButton Application Aplicación To &Desktop Al &escritorio &All Desktops &Todos los escritorios Desktop &%1 Escritorio &%1 &To Current Desktop &Al escritorio actual Move To N&ext Monitor Al monitor &siguiente Move To &Previous Monitor Al m&onitor anterior &Move &Mover Resi&ze Re&dimensionar Ma&ximize Ma&ximizar Maximize vertically Maximizar verticalmente Maximize horizontally Maximizar horizontalmente &Restore &Restaurar Mi&nimize Mi&nimizar Roll down Desenrollar Roll up Enrollar &Layer Ca&pa Always on &top Siempre &encima &Normal &Normal Always on &bottom Siempre al &fondo &Close &Cerrar LXQtTaskGroup Group Grupo Close group Cerrar el grupo LXQtTaskbarConfiguration Task Manager Settings Configuración del Administrador de tareas General General Show only windows from desktop Mostrar solo ventanas del escritorio Show only windows from &panel's screen Mostrar solo ventanas de la pantalla del &panel Show only minimized windows Mostrar solo ventanas minimizadas Raise minimized windows on current desktop Elevar ventanas minimizadas del escritorio actual Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Rotar las ventanas con la rueda del ratón Window &grouping A&grupación de ventanas Show popup on mouse hover Mostrar mensaje de ayuda al mover el ratón encima Appearance Apariencia Maximum button width Ancho máximo del botón px px Mouse Wheel Rueda del ratón Wheel Delta Threshold Umbral de variación de la rueda Put buttons of the same class next to each other Poner juntos los botones de la misma clase Maximum button height Alto máximo del botón Use icons by WindowClass, if available Usar iconos de WindowClass, si están disponibles Auto&rotate buttons when the panel is vertical &Rotar automáticamente los botones cuando el panel esté vertical Button style Estilo del botón Close on middle-click Cerrar con el botón central Icon and text Icono y texto Only icon Solo icono Only text Solo texto Disabled Deshabilitado Scroll up to raise, down to minimize Desplazar hacia arriba para elevar, hacia abajo para minimizar Scroll up to minimize, down to raise Desplazar hacia arriba para minimizar, hacia abajo para elevar Scroll up to move to next desktop, down to previous Desplazar hacia arriba para ir al siguiente escritorio, hacia abajo para ir al anterior Scroll up to move to previous desktop, down to next Desplazar hacia arriba para ir al escritorio anterior, hacia abajo para ir al siguiente Current Actual Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Manejador de ventanas" Desktop Entry/Comment: "Cambia entre aplicaciones o programas abiertos" ================================================ FILE: plugin-taskbar/translations/taskbar_es_VE.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application Aplicación To &Desktop Al &Escritorio &All Desktops &Todos los escritorios Desktop &%1 Escritorio &%1 &To Current Desktop &Al escritorio actual Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Ma&ximizar Maximize vertically Maximizar verticalmente Maximize horizontally Maximizar Orizzontalmente &Restore &Restaurar Mi&nimize Mi&nimizar Roll down DesEnrolar Roll up Enrolar &Layer Ca&pa Always on &top Siempre &encima &Normal &Normal Always on &bottom Siempre por de&bajo &Close &Cerrar LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Button style Estilo de boton Close on middle-click Cerrar en click medio Icon and text Icono y texto Only icon Solo iconos Only text Solo texto Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_et.desktop.yaml ================================================ Desktop Entry/Name: "Tegumihaldur" Desktop Entry/Comment: "Halda ja vaheta hetkel kasutusel olevaid rakendusi" ================================================ FILE: plugin-taskbar/translations/taskbar_et.ts ================================================ LXQtTaskBar Activate task %1 Võta %1 kasutusele LXQtTaskButton Application Rakendus To &Desktop Saada töö&lauale &All Desktops &Kõikidele töölaudadele Desktop &%1 Töölauale &%1 &To Current Desktop &Praegusele töölauale Move To N&ext Monitor Tõsta &järgmisele ekraanile Move To &Previous Monitor Tõsta &eelmisele ekraanile &Move &Tõsta Resi&ze Muuda &suurust Ma&ximize Suu&renda Maximize vertically Suurenda püstloodis Maximize horizontally Suurenda rõhtloodis &Restore &Taasta suurus Mi&nimize Vä&henda Roll down Rulli lahti Roll up Rulli kokku &Layer &Kihid Always on &top Alati kõige &peal &Normal &Näita tavakihil Always on &bottom Alati kõige &all &Close &Sulge LXQtTaskGroup Group Akende grupp Close group Sulge akende grupp LXQtTaskbarConfiguration Task Manager Settings Tegumihalduri seadistused General Üldist Show only windows from desktop Näita töölaua aknaid Show only windows from &panel's screen Näita vaid aknaid, mis töötavad antud &paneeli ekraanil Show only minimized windows Näita vaid vähendatud aknaid Raise minimized windows on current desktop Suurenda vähendatud aknad vaid sellel töölaual Close on middle-click Sulgemiseks kasuta hiire keskmist nuppu Comma separated list of window classes Komadega eraldatud aknaklasside loend Exclude from taskbar Välista tegumiribalt Cycle windows on wheel scrolling Hiireratta kerimisel lappa aknaid läbi Window &grouping Akende &rühmitamine Show popup on mouse hover Hiirekursori alla näita teabeakent Appearance Välimus Button style Nuppude stiil Maximum button width Nuppude suurim laius px pikslit Mouse Wheel Hiire ratas Wheel Delta Threshold Hiireratta läve vahemik Put buttons of the same class next to each other Aseta sama tüüpi nupud kõrvuti Maximum button height Nuppude suurim kõrgus Auto&rotate buttons when the panel is vertical Kui paneel asub püstloodis, siis pööra nupud &automaatselt Use icons by WindowClass, if available Kui võimalik, siis kasuta ikoone AknaKlassi alusel Icon and text Ikoon ja tekst Only icon Ainult ikoon Only text Ainult tekst Disabled Ei ole kasutusel Scroll up to raise, down to minimize Akna suurendamiseks rulli üles, vähendamiseks rulli alla Scroll up to minimize, down to raise Akna vähendamiseks rulli üles, suurendamiseks rulli alla Scroll up to move to next desktop, down to previous Akna tõstmiseks järgmisele töölauale rulli üles, tõstmiseks eelmisele töölauale rulli alla Scroll up to move to previous desktop, down to next Akna tõstmiseks eelmisele töölauale rulli üles, tõstmiseks järgmisele töölauale rulli alla Current Praegune töölaud Desktop %1 %1. töölaud ================================================ FILE: plugin-taskbar/translations/taskbar_eu.desktop.yaml ================================================ Desktop Entry/Name: "Ataza-kudeatzailea" Desktop Entry/Comment: "Aldatu martxan dauden aplikazioen artean" ================================================ FILE: plugin-taskbar/translations/taskbar_eu.ts ================================================ LXQtTaskBar Activate task %1 Aktibatu %1 zeregina LXQtTaskButton Application Aplikazioa To &Desktop &Mahaigainera &All Desktops Mahaigain &guztiak Desktop &%1 &%1 mahaigaina &To Current Desktop &Uneko mahaigainera Move To N&ext Monitor Mugitu ondor&en monitorera Move To &Previous Monitor &Move &Mugitu Resi&ze Ma&ximize Maximizatu Maximize vertically Maximizatu bertikalki Maximize horizontally Maximizatu horizontalki &Restore &Leheneratu Mi&nimize Minimizatu Roll down Zabaldu Roll up Bildu &Layer &Geruza Always on &top Beti &goian &Normal &Normala Always on &bottom Beti &behean &Close &Itxi LXQtTaskGroup Group Taldea Close group Itxi taldea LXQtTaskbarConfiguration Task Manager Settings Ataza-kudeatzailearen ezarpenak General Orokorra Show only windows from desktop Erakutsi mahaigainetik leihoak soilik Show only windows from &panel's screen Erakutsi &panelaren pantailako leihoak soilik Show only minimized windows Erakutsi txikitutako leihoak soilik Raise minimized windows on current desktop Altxatu minimizatutako leihoak uneko mahaigainean Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Erakutsi pop-up sagua pasatzean Appearance Itxura Maximum button width Botoiaren gehienezko zabalera px px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Jarri klase bereko botoiak bata bestearen ondoan Maximum button height Botoiaren gehienezko altuera Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Button style Botoi-estiloa Close on middle-click Itxi erdiko botoia klikatzean Icon and text Ikonoa eta testua Only icon Ikonoa soilik Only text Testua soilik Disabled Desgaituta Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Oraingoa Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_fi.desktop.yaml ================================================ Desktop Entry/Name: "Tehtävähallinta" Desktop Entry/Comment: "Vaihda käynnissä olevien sovellusten välillä" ================================================ FILE: plugin-taskbar/translations/taskbar_fi.ts ================================================ LXQtTaskBar Activate task %1 Aktivoi tehtävä %1 LXQtTaskButton Application Sovellus To &Desktop Työ&pöydälle &All Desktops &Kaikille työpöydille Desktop &%1 Työpöytä &%1 &To Current Desktop &Nykyiselle työpöydälle Move To N&ext Monitor Siirrä &seuraavalle näytölle Move To &Previous Monitor Siirrä &edelliselle näytölle &Move &Siirrä Resi&ze Muuta kokoa Ma&ximize Suu&renna Maximize vertically Suurenna pystysuunnassa Maximize horizontally Suurenna vaakasuunnassa &Restore &Palauta Mi&nimize Pie&nennä Roll down Rullaa alas Roll up Rullaa ylös &Layer Tas&o Always on &top Aina &ylimpänä &Normal &Tavallinen Always on &bottom Aina &alimpana &Close &Sulje LXQtTaskGroup Group Ryhmä Close group Sulje ryhmä LXQtTaskbarConfiguration Task Manager Settings Tehtävänhallinnan asetukset General Yleiset Show only windows from desktop Näytä ikkunat vain työpöydältä Show only windows from &panel's screen Näytä ikkunat vain &paneelin näytöltä Show only minimized windows Näytä vain pienennetyt ikkunat Raise minimized windows on current desktop Nosta minimoidut ikkunat tämänhetkisellä työpöydällä Comma separated list of window classes Pilkuilla eroteltu lista ikkunaluokista Exclude from taskbar Piilota tehtäväpalkista Cycle windows on wheel scrolling Vaihda ikkunoita hiirenrullaa pyörittämällä Window &grouping Ikkunoiden &ryhmittäminen Show popup on mouse hover Näytä ponnahdusviesti osoittimen kohdalla Appearance Ulkoasu Maximum button width Painikkeiden maksimi leveys px px Mouse Wheel Hiiren rulla Wheel Delta Threshold Rullan delta-kynnysarvo Put buttons of the same class next to each other Asettele saman tyyppiset painikkeet vierekkäin Maximum button height Painikkeiden enimmäiskorkeus Use icons by WindowClass, if available Käytä ikkunaluokan mukaisia kuvakkeita jos mahdollista Auto&rotate buttons when the panel is vertical Käännä painikkeet automaattisesti paneelin ollessa pystysuorassa Button style Painiketyyli Close on middle-click Sulje hiiren keskimmäisen painikkeen painalluksella Icon and text Kuvake ja teksti Only icon Pelkkä kuvake Only text Pelkkä teksti Disabled Poistettu käytöstä Scroll up to raise, down to minimize Vieritä ylös nostamiseksi tai alas minimoidaksi Scroll up to minimize, down to raise Vieritä ylös minimoidaksi tai alas nostamiseksi Scroll up to move to next desktop, down to previous Ylös vierittäminen vie seuraavalle työpöydälle ja alas vierittäminen vie edelliselle Scroll up to move to previous desktop, down to next Ylös vierittäminen vie edelliselle työpöydälle ja alas vierittäminen vie seuraavalle Current Nykyinen Desktop %1 Työpöytä %1 ================================================ FILE: plugin-taskbar/translations/taskbar_fr.desktop.yaml ================================================ Desktop Entry/Name: "Gestionnaire des tâches" Desktop Entry/Comment: "Basculer entre des applications actives" ================================================ FILE: plugin-taskbar/translations/taskbar_fr.ts ================================================ LXQtTaskBar Activate task %1 Activer la tâche %1 LXQtTaskButton Application Application To &Desktop Vers &le bureau &All Desktops &Tous les bureaux Desktop &%1 Bureau &%1 &To Current Desktop &Vers le bureau courant Move To N&ext Monitor Déplacer vers l'&ecran suivant Move To &Previous Monitor Déplacer vers l'Écran &précédent &Move &Déplacer Resi&ze Re&dimensionner Ma&ximize Ma&ximiser Maximize vertically Maximiser verticalement Maximize horizontally Maximiser horizontalement &Restore &Restaurer Mi&nimize Mi&nimiser Roll down Dérouler vers le bas Roll up Dérouler vers le haut &Layer &Disposition Always on &top Toujours au-&dessus &Normal &Normal Always on &bottom Toujours en &bas &Close &Fermer LXQtTaskGroup Group Groupe Close group Fermer le groupe LXQtTaskbarConfiguration Task Manager Settings Paramétrages du gestionnaire de tâches General Général Show only windows from desktop Afficher uniquement les fenêtres du bureau Show only windows from &panel's screen Afficher uniquement les fenêtres de l'écran du &panneau Show only minimized windows Afficher uniquement les fenêtres minimisées Raise minimized windows on current desktop Faire apparaître les fenêtres réduites du bureau actuel Comma separated list of window classes Liste des classes de fenêtres séparées par des virgules Exclude from taskbar Exclure de la barre des tâches Cycle windows on wheel scrolling Faire défiler les fenêtres en utilisant la roulette Window &grouping &Groupement de fenêtres Appearance Apparence Maximum button width Largeur maximale des boutons px px Mouse Wheel Roulette de la souris Wheel Delta Threshold Seuil de delta de roue Put buttons of the same class next to each other Placez les boutons de la même classe les uns à côté des autres Maximum button height Hauteur maximale des boutons Use icons by WindowClass, if available Utiliser les icônes par classe de fenêtre, si disponible Auto&rotate buttons when the panel is vertical &Rotation automatique des boutons lorsque la barre de tâche est verticale Show popup on mouse hover Afficher une bulle au survol de la souris Button style Style de boutons Close on middle-click Fermer d'un clic du milieu Icon and text Icône et texte Only icon Icône seule Only text Texte seul Disabled Désactivé Scroll up to raise, down to minimize Défiler vers le haut pour élever, vers le bas pour minimiser Scroll up to minimize, down to raise Défiler vers le haut pour minimiser, vers le bas pour agrandir Scroll up to move to next desktop, down to previous Faites défiler vers le haut pour passer au bureau suivant, vers le bas au précédent Scroll up to move to previous desktop, down to next Faites défiler vers le haut pour passer au bureau précédent, vers le bas au suivant Current Courant Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_gl.ts ================================================ LXQtTaskBar Activate task %1 Activar a tarefa %1 LXQtTaskButton Application Aplicación To &Desktop Ao &escritorio &All Desktops &Todos os escritorios Desktop &%1 Escritorio &%1 &To Current Desktop Ao escritorio &actual Move To N&ext Monitor Move To &Previous Monitor &Move &Desprazar Resi&ze Redi&mensionar Ma&ximize Ma&ximizar Maximize vertically Maximizar verticalmente Maximize horizontally Maximizar horizontalmente &Restore &Restaurar Mi&nimize Mi&nimizar Roll down Desenrolar Roll up Enrolar &Layer &Disposición Always on &top Sempre &enriba &Normal Always on &bottom Sempre em&baixo &Close &Pechar LXQtTaskGroup Group Grupo Close group Pechar o grupo LXQtTaskbarConfiguration Task Manager Settings Axustes do administrador de tarefas General Xeral Show only windows from desktop Amosar só as xanelas do escritorio Show only windows from &panel's screen Amosar só as xanelas da pantalla do &panel Show only minimized windows Amosar só as xanelas minimizadas Raise minimized windows on current desktop Elevar as xanelas minimizadas do escritorio actual Close on middle-click Pechar co botón central do rato Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Percorrer as xanelas coa roda do rato Window &grouping A&grupamento de xanelas Show popup on mouse hover Amosar a xanela emerxente ao pasar o rato por riba Appearance Aparencia Button style Estilo do botón Maximum button width Largura máxima do botón px Mouse Wheel Roda do rato Wheel Delta Threshold Limiar de desprazamento antes do cambio Put buttons of the same class next to each other Maximum button height Altura máxima do botón Auto&rotate buttons when the panel is vertical &Rotar automaticamente os botóns cando o panel estea en vertical Use icons by WindowClass, if available Usar as iconas de clase de xanela, se están dispoñíbeis Icon and text Icona e texto Only icon Só a icona Only text Só o texto Disabled Desactivado Scroll up to raise, down to minimize Desprácese cara a arriba para elevar, cara a abaixo para minimizar Scroll up to minimize, down to raise Desprácese cara a arriba para minimizar, cara a abaixo para elevar Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Actual Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_he.desktop.yaml ================================================ Desktop Entry/Name: "מנהל משימות" Desktop Entry/Comment: "מעבר בין יישומים פעילים" ================================================ FILE: plugin-taskbar/translations/taskbar_he.ts ================================================ LXQtTaskBar Activate task %1 הפעלת משימה %1 LXQtTaskButton Application יישום To &Desktop ל&שולחן העבודה &All Desktops &כל שולחנות העבודה Desktop &%1 שולחן עבודה &%1 &To Current Desktop לשולחן העבודה ה&נוכחי Move To N&ext Monitor העברה למסך ה&בא Move To &Previous Monitor העברה לצד ה&קודם &Move ה&עברה Resi&ze &שינוי גודל Ma&ximize ה&גדלה Maximize vertically הגדלה אנכית Maximize horizontally הגדלה אופקית &Restore שח&זור Mi&nimize ה&קטנה Roll down גלגול מטה Roll up גלגול מעלה &Layer &שכבה Always on &top תמיד &עליון &Normal &רגיל Always on &bottom תמיד ת&חתון &Close &סגירה LXQtTaskGroup Group קבוצה Close group סגירת קבוצה LXQtTaskbarConfiguration Task Manager Settings הגדרות מנהל המשימות General כללי Show only windows from desktop הצגת חלונות משולחן העבודה בלבד Show only windows from &panel's screen הצגת חלונות ממסך ה&לוח בלבד Show only minimized windows הצגת חלונות ממוזערים בלבד Raise minimized windows on current desktop הגבהת החלונות הממוזערים לשולחן העבודה הנוכחי Close on middle-click סגירה עם כפתור אמצעי Comma separated list of window classes רשימה של מחלקות חלונות מופרדות בפסיקים Exclude from taskbar החרגה משורת המשימות Cycle windows on wheel scrolling דפדוף בין חלונות עם גלילת העכבר Window &grouping &קיבוץ חלונות Show popup on mouse hover הצגת חלונית עם מעבר העכבר Appearance מראה Button style סגנון כפתורים Maximum button width רוחב הכפתור המרבי px פיקסלים Mouse Wheel גלגלת העכבר Wheel Delta Threshold סף גלגול גלגלת Put buttons of the same class next to each other הצבת כפתורים מאותה המחלקה זה לצד זה Maximum button height גובה הכפתור המרבי Auto&rotate buttons when the panel is vertical הטיה &אוטומטית של כפתורים כאשר הלוח אנכי Use icons by WindowClass, if available שימוש בסמלים לפי WindowClass, אם ניתן Icon and text סמל וטקסט Only icon סמל בלבד Only text טקסט בלבד Disabled מושבת Scroll up to raise, down to minimize גלילה למעלה כדי להרים, למטה כדי למזער Scroll up to minimize, down to raise גלילה למעלה כדי למזער, למטה כדי להרים Scroll up to move to next desktop, down to previous גלילה למעלה על מנת לעבור לשולחן העבודה הבא, ולמטה לקודם Scroll up to move to previous desktop, down to next גלילה למעלה על מנת לעבור לשולחן העבודה הקודם, ולמטה להבא Current נוכחי Desktop %1 שולחן עבודה %1 ================================================ FILE: plugin-taskbar/translations/taskbar_hr.desktop.yaml ================================================ Desktop Entry/Name: "Upravljač zadataka" Desktop Entry/Comment: "Prebacivanje između pokrenutih programa" ================================================ FILE: plugin-taskbar/translations/taskbar_hr.ts ================================================ LXQtTaskBar Activate task %1 Aktiviraj zadatak %1 LXQtTaskButton Application Program To &Desktop Na &radnu površinu &All Desktops &Sve radne površine Desktop &%1 Radna površina &%1 &To Current Desktop Na &trenutačnu radnu površinu Move To N&ext Monitor Prijeđi na slj&edeći monitor Move To &Previous Monitor Prijeđi na &prethodni monitor &Move &Prijeđi Resi&ze Promijeni &veličinu Ma&ximize Ma&ksimiraj Maximize vertically Maksimiraj okomito Maximize horizontally Maksimiraj vodoravno &Restore &Obnovi Mi&nimize Mi&nimiraj Roll down Rasklopi naslovnu traku Roll up Sklopi u naslovnu traku &Layer S&loj Always on &top Uvijek izna&d &Normal &Normalno Always on &bottom Uvijek i&spod &Close &Zatvori LXQtTaskGroup Group Grupa Close group Zatvori grupu LXQtTaskbarConfiguration Task Manager Settings Upravljač zadataka – Postavke General Opće Show only windows from desktop Prikaži samo prozore s radne površine Show only windows from &panel's screen Prikaži samo prozore s ekrana ploče Show only minimized windows Prikaži samo smanjene prozore Raise minimized windows on current desktop Nadigni smanjene prozore na trenutačnoj radnoj površini Close on middle-click Zatvori pritiskom srednje gumba Comma separated list of window classes Popis klasa prozora odvojen zarezima Exclude from taskbar Isključi iz programske trake Cycle windows on wheel scrolling Prelazi po prozorima okretanjem kotačića miša Window &grouping &Grupiranje prozora Show popup on mouse hover Prikaži skočni prozor prilikom prelaska mišem Appearance Izgled Button style Stil gumba Maximum button width Maksimalna širina gumba px px Mouse Wheel Kotačić miša Wheel Delta Threshold Prag razlike kotačića Put buttons of the same class next to each other Stavi gumbe iste klase jedan pored drugog Maximum button height Maksimalna visina gumba Auto&rotate buttons when the panel is vertical Automatski ok&reni gumbe kad ploča stoji okomito Use icons by WindowClass, if available Koristi ikone na osnovi WindowClass, ako je dostupno Icon and text Ikona i tekst Only icon Samo ikone Only text Samo tekst Disabled Deaktivirano Scroll up to raise, down to minimize Kliži gore za nadizanje, dolje za smanjivanje Scroll up to minimize, down to raise Kliži gore za smanjivanje, dolje za nadizanje Scroll up to move to next desktop, down to previous Kliži gore za prelaženje na sljedeću radnu površinu, dolje na prethodnu Scroll up to move to previous desktop, down to next Kliži gore za prelaženje na prethodnu radnu površinu, dolje na sljedeću Current Trenutačna Desktop %1 Radna površina %1 ================================================ FILE: plugin-taskbar/translations/taskbar_hu.desktop.yaml ================================================ Desktop Entry/Name: "Feladatkezelő" Desktop Entry/Comment: "Váltás a futó alkalmazások között" ================================================ FILE: plugin-taskbar/translations/taskbar_hu.ts ================================================ LXQtTaskBar Activate task %1 A %1 feladat indítása LXQtTaskButton Application Alkalmazás To &Desktop Asztal&ra &All Desktops &Az összes asztalra Desktop &%1 &%1. asztalra &To Current Desktop Az ak&tuális asztalra Move To N&ext Monitor Á&thelyezés a következő monitorra Move To &Previous Monitor Áthelyezés az &előző monitorra &Move &Áthelyezés Resi&ze Átmé&retezés Ma&ximize Ma&ximalizálás Maximize vertically Maximalizálás függőlegesen Maximize horizontally Maximalizálás vízszintesen &Restore &Visszaállítás Mi&nimize Mi&nimalizálás Roll down Legördítés Roll up Felgördítés &Layer Réte&g Always on &top Mindig &felül &Normal &Normál Always on &bottom Min&dig alul &Close &Bezárás LXQtTaskGroup Group Csoport Close group Csoport bezárása LXQtTaskbarConfiguration Task Manager Settings Feladatkezelő beállítása General Általános Show only windows from desktop Csak az asztal ablakai látszanak Show only windows from &panel's screen Csak a &panel képernyőjének ablakai látszanak Show only minimized windows Csak minimalizált ablakok látszanak Raise minimized windows on current desktop A minimalizált ablakok kirakása az aktuális asztalra Comma separated list of window classes Vesszővel elválasztott ablakosztály-lista Exclude from taskbar Kihagyás a tálcáról Cycle windows on wheel scrolling Az ablakok körbeléptetése Window &grouping &Ablakcsoportosítás Show popup on mouse hover Felugró ablak megjelenítése rámutatáskor Appearance Megjelenés Maximum button width Gomb maximális szélessége px px Mouse Wheel Egérkerék Wheel Delta Threshold Egérgörgő elmozdulási küszöb Put buttons of the same class next to each other Azonos osztályba tartozó gombok egymás mellé helyezése Maximum button height Gomb maximális magassága Use icons by WindowClass, if available Ikonok az ablakosztályokból, ha elérhetőek Auto&rotate buttons when the panel is vertical Gombok elfo&rgatása függőleges panelnél Button style Gombstílus Close on middle-click Bezárás középső kattintásra Icon and text Ikon és szöveg Only icon Csak ikon Only text Csak szöveg Disabled Kikapcsolva Scroll up to raise, down to minimize Görgetés felfelé az előtérbe helyezéshez, le a minimalizáláshoz Scroll up to minimize, down to raise Görgetés felfelé a minimalizáláshoz, le az előtérbe helyezéshez Scroll up to move to next desktop, down to previous Felfelé görgetés a következő asztalhoz, lefelé az előzőhöz Scroll up to move to previous desktop, down to next Felfelé görgetés az előző asztalhoz, lefelé a következőhöz Current Jelenlegi Desktop %1 %1. asztal ================================================ FILE: plugin-taskbar/translations/taskbar_ia.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Cycle windows on wheel scrolling Window &grouping Appearance Maximum button width px Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Close on middle-click Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Mouse Wheel Wheel Delta Threshold Show popup on mouse hover Put buttons of the same class next to each other Button style Comma separated list of window classes Exclude from taskbar Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_id.ts ================================================ LXQtTaskBar Activate task %1 Aktifkan tugas %1 LXQtTaskButton Application Aplikasi To &Desktop Untuk &Desktop &All Desktops Semua Desktop Desktop &%1 Desktop &%1 &To Current Desktop Untuk Desktop Saat Ini Move To N&ext Monitor Pindahkan Ke Monitor &Berikutnya Move To &Previous Monitor Pindahkan Ke Monitor &Sebelumnya &Move &Pindah Resi&ze Ubah ukuran Ma&ximize Maksimalkan Maximize vertically Maksimalkan secara vertikal Maximize horizontally Maksimalkan secara horizontal &Restore Pulihkan Mi&nimize Minimalkan Roll down Gulung kebawah Roll up Gulung keatas &Layer Lapisan Always on &top Selalu diatas &Normal &Normal Always on &bottom Selalu dibawah &Close Tutup LXQtTaskGroup Group Grup Close group Tutup Grup LXQtTaskbarConfiguration Task Manager Settings Pengaturan Pengelola Tugas General Umum Cycle windows on wheel scrolling Putar jendela saat gerigi digulirkan Window &grouping Pengelompokan jendela Appearance Penampilan Maximum button width Lebar tombol maksimal px px Maximum button height Tinggi tombol maksimal Auto&rotate buttons when the panel is vertical Otomatis putar tombol saat panelnya vertikal Use icons by WindowClass, if available Gunakan ikon oleh WindowClass, jika tersedia Close on middle-click Tutup pada klik tengah Show only windows from desktop Hanya tampilkan jendela dari desktop Show only windows from &panel's screen Hanya tampilkan jendela dari layar panel Show only minimized windows Hanya tampilkan jendela yang diminimalkan Raise minimized windows on current desktop Angkat jendela yang diminimalkan pada desktop saat ini Mouse Wheel Roda Mouse Wheel Delta Threshold Ambang Batas Delta Roda Show popup on mouse hover Tampilkan munculan saat tetikus diatasnya Put buttons of the same class next to each other Letakkan tombol dari kelas yang sama berdekatan Button style Gaya tombol Comma separated list of window classes Daftar kelas jendela yang dipisahkan koma Exclude from taskbar Kecualikan dari bilah tugas Icon and text Ikon dan teks Only icon Ikon saja Only text Teks saja Disabled Dinonaktifkan Scroll up to raise, down to minimize Gulir ke atas untuk menaikkan, ke bawah untuk meminimalkan Scroll up to minimize, down to raise Gulir ke atas untuk meminimalkan, ke bawah untuk menaikkan Scroll up to move to next desktop, down to previous Gulir ke atas untuk pindah ke desktop berikutnya, ke bawah ke sebelumnya Scroll up to move to previous desktop, down to next Gulir ke atas untuk pindah ke desktop sebelumnya, ke bawah ke berikutnya Current Saat ini Desktop %1 Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_it.desktop.yaml ================================================ Desktop Entry/Name: "Barra delle applicazioni" Desktop Entry/Comment: "Permette di spostarsi tra le applicazioni in esecuzione tramite pulsanti" ================================================ FILE: plugin-taskbar/translations/taskbar_it.ts ================================================ LXQtTaskBar Activate task %1 Attiva applicazione %1 LXQtTaskButton Application Applicazione To &Desktop Al &desktop &All Desktops &Tutti i desktop Desktop &%1 Desktop &%1 &To Current Desktop &Al desktop corrente Move To N&ext Monitor Sposta al monitor &prossimo Move To &Previous Monitor Sposta al monitor p&recedente &Move &Sposta Resi&ze &Ridimensiona Ma&ximize Ma&ssimizza Maximize vertically Massimizza verticalmente Maximize horizontally Massimizza orizzontalmente &Restore &Ripristina Mi&nimize Mi&nimizza Roll down Srotola Roll up Arrotola &Layer &Livello Always on &top Sempre in &primo piano &Normal &Normale Always on &bottom Sempre in &secondo piano &Close &Chiudi LXQtTaskGroup Group Gruppo Close group Chiudi gruppo LXQtTaskbarConfiguration Task Manager Settings Impostazioni della barra applicazioni General Generale Show only windows from desktop Mostra solo finestre del desktop Show only windows from &panel's screen Mostra solo finestre dello &schermo del pannello Show only minimized windows Mostra solo finestre minimizzate Raise minimized windows on current desktop Alza finestre minimizzate sul desktop attuale Comma separated list of window classes Lista di classe di finestra, separata da commata Exclude from taskbar Escludi dalla barra delle applicazioni Cycle windows on wheel scrolling Scorri le finestre con la rotellina Window &grouping &Raggruppa finestre della stessa applicazione Appearance Aspetto Maximum button width Larghezza massima del pulsante px px Mouse Wheel Rotellina del mouse Wheel Delta Threshold Soglia Put buttons of the same class next to each other Accosta finestre della stessa classe Maximum button height Altezza massima del pulsante Use icons by WindowClass, if available Usa icone della classe della finestra se disponibile Auto&rotate buttons when the panel is vertical Ruota &automaticamente se il pannello è verticale Show popup on mouse hover Mostra popup al passaggio del puntatore Button style Stile dei pulsanti Close on middle-click Chiudi con un clic del tasto centrale Icon and text Icone e testo Only icon Solo icone Only text Solo testo Disabled Disabilitata Scroll up to raise, down to minimize Scrolla insù per alzare, in giù per minimizzare Scroll up to minimize, down to raise Scrolla insù per minimizzare, in giù per alzare Scroll up to move to next desktop, down to previous Scrolla insù per spostare al desktop prossimo, ingiù al precedente Scroll up to move to previous desktop, down to next Scrolla insù per spostare al desktop precedente, ingiù al prossimo Current attuale Desktop %1 Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ja.desktop.yaml ================================================ Desktop Entry/Name: "タスク管理" Desktop Entry/Comment: "実行中のアプリケーションを切り替えます" ================================================ FILE: plugin-taskbar/translations/taskbar_ja.ts ================================================ LXQtTaskBar Activate task %1 アクティブなタスク %1 LXQtTaskButton Application アプリケーション To &Desktop デスクトップへ(&D) &All Desktops すべてのデスクトップ(&A) Desktop &%1 デスクトップ &%1 &To Current Desktop 現在のデスクトップに(&T) Move To N&ext Monitor 次のモニターへ移動(&E) Move To &Previous Monitor 前のモニターへ移動(&P) &Move 移動(&M) Resi&ze サイズの変更(&Z) Ma&ximize 最大化(&X) Maximize vertically 縦方向の最大化 Maximize horizontally 横方向の最大化 &Restore 復元(&R) Mi&nimize 最小化(&N) Roll down 広げる Roll up たたむ &Layer レイヤー(&L) Always on &top 常に手前に表示(&T) &Normal 通常(&N) Always on &bottom 常に奥に表示(&B) &Close 閉じる(&C) LXQtTaskGroup Group グループ Close group グループを閉じる LXQtTaskbarConfiguration Task Manager Settings タスク管理の設定 Auto&rotate buttons when the panel is vertical パネルが垂直ならばボタンを回転させる(&R) Button style ボタンのスタイル General 全般 Show only windows from desktop 次のデスクトップのウィンドウのみを表示する Show only windows from &panel's screen パネルのある画面のウィンドウのみを表示する(&P) Show only minimized windows 最小化されたウィンドウのみを表示する Raise minimized windows on current desktop 最小化されたウィンドウを選択した時には現在のデスクトップに移動させる Close on middle-click 中ボタンのクリックで閉じる Comma separated list of window classes ウィンドウクラスのコンマ区切りリストです Exclude from taskbar タスクバーから除外 Cycle windows on wheel scrolling ホイールスクロールでウィンドウの切り替え Window &grouping ウィンドウのグループ化(&G) Show popup on mouse hover マウスを合わせるとポップアップでタイトルを表示する Appearance 外観 Maximum button width ボタンの最大幅 px ピクセル Mouse Wheel マウスのホイール Wheel Delta Threshold ホイールの変化量のしきい値 Put buttons of the same class next to each other 同じクラスのボタンを隣同士に置く Maximum button height ボタンの最大高 Use icons by WindowClass, if available 可能であれば WindowClass のアイコンを使用する Icon and text アイコンとテキスト Only icon アイコンのみ Only text テキストのみ Disabled 無効 Scroll up to raise, down to minimize スクロールアップで最前面、スクロールダウンで最小化 Scroll up to minimize, down to raise スクロールアップで最小化、スクロールダウンで最前面 Scroll up to move to next desktop, down to previous スクロールアップで次のデスクトップへ移動、ダウンで前のデスクトップへ Scroll up to move to previous desktop, down to next スクロールアップで前のデスクトップへ移動、ダウンで次のデスクトップへ Current 現在のデスクトップ Desktop %1 デスクトップ %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ka.desktop.yaml ================================================ Desktop Entry/Name: "ამოცანების მმართველი" Desktop Entry/Comment: "გადართვა გაშვებულ აპლიკაციებს შორის" ================================================ FILE: plugin-taskbar/translations/taskbar_ka.ts ================================================ LXQtTaskBar Activate task %1 გაუშვი ამოცანა %1 LXQtTaskButton Application პროგრამა To &Desktop სამუშაო მაგი&დაზე &All Desktops &ყველა სამუშაო მაგიდა Desktop &%1 სამუშაო მაგიდა &%1 &To Current Desktop მიმდინარე სამუშაო მაგ&იდაზე Move To N&ext Monitor შ&ემდეგ ეკრანზე გადატანა Move To &Previous Monitor &წინა ეკრანზე გადატანა &Move &გადატანა Resi&ze &ზომის შეცვლა Ma&ximize &აკეცვა Maximize vertically მაქსიმალური ზომა ვერტიკალურად Maximize horizontally მაქსიმალური ზომა ჰორიზონტალურად &Restore ა&ღდგენა Mi&nimize &ჩაკეცვა Roll down ჩამოშლა Roll up ზემოთ აკეცვა &Layer &ფენა Always on &top ყოველ&თვის ყველაზე ზემოდან &Normal &ნორმალური Always on &bottom ყოველთვის ყველაზე &ქვემოთ &Close &დახურვა LXQtTaskGroup Group ჯგუფი Close group ჯგუფის დახურვა LXQtTaskbarConfiguration Task Manager Settings ამოცანების მმართველის მორგება General ზოგადი Show only windows from desktop ნაჩვენები იქნება, მხოლოდ, ფანჯრები სამუშაო მაგიდიდან Show only windows from &panel's screen ფანჯრების, მხოლოდ, &პანელის ეკრანიდან ჩვენება Show only minimized windows მხოლოდ, ჩაკეცილი ფანჯრების ჩვენება Raise minimized windows on current desktop ჩაკეცილი ფანჯრების ამოწევა მიმდინარე სამუშაო მაგიდაზე Close on middle-click დახურვა შუა წკაპით Comma separated list of window classes მძიმით გამოყოფილი ფანჯრების კლასების სია Exclude from taskbar ამოღება ამოცანების პანელიდან Cycle windows on wheel scrolling ფანჯრებს შორის გადართვა თაგუნას ბორბლით Window &grouping ფანჯრების დაჯ&გუფება Show popup on mouse hover მხტუნარას ჩვენება თაგუნას ზედ გაჩერებისას Appearance გარეგნობა Button style ღილაკის სტილი Maximum button width მაქსიმალური ღილაკის სიგანე px პქს Mouse Wheel თაგუნას რგოლი Wheel Delta Threshold ბორბლის დელტა ზღვარი Put buttons of the same class next to each other იგივე კლასის მქონე ღილაკების ერთად დალაგება Maximum button height მაქსიმალური ღილაკის სიმაღლე Auto&rotate buttons when the panel is vertical ღილაკების ავტომობ&რუნება, როცა პანელი ვერტიკალურია Use icons by WindowClass, if available WindowClass-ის ხატულების გამოყენება, თუ ხელმისაწვდომია Icon and text ხატულა და ტექსტი Only icon მხოლოდ ხატულა Only text მხოლოდ ტექსტური Disabled გამორთული Scroll up to raise, down to minimize გადახვევა ზემოთ ამოსატანად, ქვემოთ ჩასაკეცად Scroll up to minimize, down to raise ბორბალი მაღლა ჩასაკეცად, ქვემოთ ამოსაწევად Scroll up to move to next desktop, down to previous გადახვევა მაღლა გადავა შემდეგ სამუშაო მაგიდაზე, ქვემოთ წინაზე Scroll up to move to previous desktop, down to next ზემოთ ახვევა გადავა წინა სამუშაო მაგიდაზე, ქვემოთ კი შემდეგზე Current მიმდინარე Desktop %1 სამუშაო მაგიდა %1 ================================================ FILE: plugin-taskbar/translations/taskbar_kab.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_kk.desktop.yaml ================================================ Desktop Entry/Name: "Тапсырмалар басқарушысы" Desktop Entry/Comment: "Орындалып тұрған қолданбалар арасында ауысу" ================================================ FILE: plugin-taskbar/translations/taskbar_kk.ts ================================================ LXQtTaskBar Activate task %1 %1 тапсырмасын белсендіру LXQtTaskButton Application Қолданба To &Desktop &Жұмыс үстеліне &All Desktops &Барлық жұмыс үстелдері Desktop &%1 Жұмыс үстелі &%1 &To Current Desktop &Ағымдағы жұмыс үстеліне Move To N&ext Monitor К&елесі мониторға жылжыту Move To &Previous Monitor &Алдыңғы мониторға жылжыту &Move &Жылжыту Resi&ze Өлшемін өзгер&ту Ma&ximize Жа&зық қылу Maximize vertically Вертикалды жазық қылу Maximize horizontally Горизонталды жазық қылу &Restore Қалп&ына келтіру Mi&nimize Қа&йыру Roll down Төмен жинау Roll up Жоғары жинау &Layer Қа&бат Always on &top Әрқашан үс&тінде &Normal Қалып&ты Always on &bottom Әрқашан ас&тында &Close &Жабу LXQtTaskGroup Group Топ Close group Топты жабу LXQtTaskbarConfiguration Task Manager Settings Тапсырмалар басқарушысының баптаулары General Жалпы Show only windows from desktop Тек жұмыс үстеліндегі терезелерді көрсету Show only windows from &panel's screen Тек &панель экранындағы терезелерді көрсету Show only minimized windows Тек жиырылған терезелерді көрсету Raise minimized windows on current desktop Ағымдағы жұмыс үстелінде жиырылған терезелерді жазу Close on middle-click Ортаңғы батырмамен шерту арқылы жабу Comma separated list of window classes Терезе кластарының үтірмен ажыратылған тізімі Exclude from taskbar Тапсырмалар панелінен шығару Cycle windows on wheel scrolling Дөңгелекті айналдыру кезінде терезелерді ауыстыру Window &grouping Терезелерді &топтастыру Show popup on mouse hover Тышқанды үстіне апарғанда қалқымалы терезені көрсету Appearance Сыртқы түрі Button style Батырма стилі Maximum button width Батырманың максималды ені px пикс Mouse Wheel Тышқан дөңгелегі Wheel Delta Threshold Дөңгелек дельтасының шегі Put buttons of the same class next to each other Бір класс батырмаларын қатар орналастыру Maximum button height Батырманың максималды биіктігі Auto&rotate buttons when the panel is vertical Панель вертикалды болғанда батырмаларды авто&бұру Use icons by WindowClass, if available Қолжетімді болса, WindowClass бойынша таңбашаларды қолдану Icon and text Таңбаша мен мәтін Only icon Тек таңбаша Only text Тек мәтін Disabled Сөндірілген Scroll up to raise, down to minimize Көтеру үшін жоғары айналдыру, қайыру үшін төмен айналдыру Scroll up to minimize, down to raise Қайыру үшін жоғары айналдыру, көтеру үшін төмен айналдыру Scroll up to move to next desktop, down to previous Келесі жұмыс үстеліне ауысу үшін жоғары айналдыру, алдыңғысына өту үшін төмен айналдыру Scroll up to move to previous desktop, down to next Алдыңғы жұмыс үстеліне ауысу үшін жоғары айналдыру, келесісіне өту үшін төмен айналдыру Current Ағымдағы Desktop %1 Жұмыс үстелі %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ko.desktop.yaml ================================================ Desktop Entry/Name: "작업 관리자" Desktop Entry/Comment: "실행 중인 응용프로그램 사이를 전환합니다" ================================================ FILE: plugin-taskbar/translations/taskbar_ko.ts ================================================ LXQtTaskBar Activate task %1 작업 %1 활성화 LXQtTaskButton Application 응용프로그램 To &Desktop 바탕화면으로(&D) &All Desktops 모든 바탕화면(&A) Desktop &%1 바탕화면 &%1 &To Current Desktop 현재 바탕화면으로(&T) Move To N&ext Monitor 다음 모니터로 이동(&E) Move To &Previous Monitor 이전 모니터로 이동(&P) &Move 이동(&M) Resi&ze 크기 조정(&Z) Ma&ximize 최대화(&X) Maximize vertically 세로로 최대화 Maximize horizontally 가로로 최대화 &Restore 복원(&R) Mi&nimize 최소화(&N) Roll down 아래로 내리기 Roll up 위로 올리기 &Layer 레이어(&L) Always on &top 항상 맨 위(&T) &Normal 정상(&N) Always on &bottom 항상 맨 아래(&B) &Close 닫기(&C) LXQtTaskGroup Group 그룹 Close group 그룹 닫기 LXQtTaskbarConfiguration Task Manager Settings 작업 관리자 설정 General 일반 Cycle windows on wheel scrolling 휠 스크롤 시 창 순환하기 Window &grouping 창 그룹화(&G) Appearance 모양새 Maximum button width 버튼 최대 폭 px px Maximum button height 버튼 최대 높이 Auto&rotate buttons when the panel is vertical 패널이 세로 일 때 버튼 자동 회전(&R) Use icons by WindowClass, if available 가능한 경우 WindowClass에 따른 아이콘 사용 Close on middle-click 가운데 클릭으로 닫기 Show only windows from desktop 바탕 화면의 창만 표시 Show only windows from &panel's screen 패널 화면의 창만 표시(&P) Show only minimized windows 최소화된 창만 표시 Raise minimized windows on current desktop 현재 바탕화면에 최소화한 창 올리기 Mouse Wheel 마우스 휠 Wheel Delta Threshold 휠 델타 임계값 Show popup on mouse hover 마우스를 올릴 때 팝업 표시 Put buttons of the same class next to each other 같은 클래스의 버튼을 나란히 배치 Button style 버튼 스타일 Comma separated list of window classes 쉼표로 구분된 창 클래스 목록 Exclude from taskbar 작업 표시줄에서 제외 Icon and text 아이콘 및 텍스트 Only icon 아이콘만 Only text 텍스트만 Disabled 비활성화 Scroll up to raise, down to minimize 스크롤을 올리면 최대화, 내리면 최소화 Scroll up to minimize, down to raise 스크롤을 내리면 최소화, 올리면 최대화 Scroll up to move to next desktop, down to previous 다음 바탕화면으로 이동, 이전 바탕화면으로 이동하려면 위로 스크롤 Scroll up to move to previous desktop, down to next 스크롤을 올리면 이전 데스크톱으로, 내리면 다음 데스크톱으로 이동 Current 현재 Desktop %1 바탕화면 %1 ================================================ FILE: plugin-taskbar/translations/taskbar_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kiteekateekamirimu" Desktop Entry/Comment: "Kino kyanguya okukyusa eddirisa lya puloguramu ebumbujja eriri kungulu" ================================================ FILE: plugin-taskbar/translations/taskbar_lg.ts ================================================ LXQtTaskBar Activate task %1 Zuukusa omulimu gwa %1 LXQtTaskButton Application Puloguramu To &Desktop Kyusa &awakolerwa kwe lirabikira &All Desktops Lirabikire ku wakolerwa &zonna Desktop &%1 Awakolerwa namba &%1 &To Current Desktop Lirabikire &wano Move To N&ext Monitor Lig&ende ku lutimbe oluddako Move To &Previous Monitor Ligende ku lutimbe ol&ukulembera kweliri kakano &Move Ddirisa &lijulule Resi&ze K&yusa bunene bw'eddirisa Ma&ximize Ddirisa li&bune olutimbe Maximize vertically Obugulumivu bw'eddirisa bwenkane obw'olutimbe Maximize horizontally Obugazi bw'eddirisa bwenkane obw'olutimbe &Restore &Komyawo ddirisa Mi&nimize Eddirisa lizi&ngeko Roll down Komyawo akatimbe ku mutwe gw'eddirisa Roll up Ddirisa lirabikeko mutwe gwokka &Layer &Ensoosawaza Always on &top Lis&ookenga ku bwanjo &Normal &Teriba na nkizo Always on &bottom Lise&mbenga mabega &Close &Gala ddirisa LXQtTaskGroup Group Ttuluba Close group Gala ettuluba lyonna LXQtTaskbarConfiguration Task Manager Settings Enteekateeka za kiteekateekamirimu General Enkola ey'awamu Show only windows from desktop Amadirisa ge kiba kiraganga Show only windows from &panel's screen Kiragenga agali ku lutimbe awali olu&baawo gokka Show only minimized windows Kiragenga amadirisa agazingidwako gokka Raise minimized windows on current desktop Amadirisa agakomezebwawo galabikerenga w'okolera Close on middle-click Eppeesa ery'okukasongesebwa erya mu makkati lye liggalanga ddirisa Comma separated list of window classes Lukalala lw'ebiti by'amadirisa, nga akabonero ',' ke k'awula erinnya erimu ku linnaalyo Exclude from taskbar Kino kireme okulabikanga ku kabaawo k'emirimu Cycle windows on wheel scrolling Okunyoola namuziga kikyuse ddirisa eriri kungulu Window &grouping Amadirisa agaleetedwa puloguramu y'emu ga&funzibwenga awamu Show popup on mouse hover Akasonga bwe kagwa ku kapande k'amadirisa agafunzidwa wabonekengawo olukalala lwa go Appearance Endabika Button style Endabika ya bupande Maximum button width Ekkomo ly'obugazi bw'obupande px px Mouse Wheel Enkola ya namuziga ya ku kasongesebwa Wheel Delta Threshold Ebbanga namuziga ly'emala okwetoolola ebalibwe nga enyooledwa Put buttons of the same class next to each other Obupande obuleetedwa puluguramu y'emu buliraanaganenga Maximum button height Kkomo ly'obugulumivu bw'obupande Auto&rotate buttons when the panel is vertical Obupande b&wetereezanga olubaawo nga lwesimbye Use icons by WindowClass, if available Obufaananyi obw'oku bupande bubenga bwa WindowClass buli lwe kisoboka Icon and text Bubengako kafaananayi n'ebigambo Only icon Bubengako kafaananayi kokka Only text Bubengako bigambo byokka Disabled Ereme okukola Scroll up to raise, down to minimize Bw'oginyoolera ku ddyo kireeta ddirisa, ku kkono kirizingako Scroll up to minimize, down to raise Bw'oginyoolera ku ddyo eddirisa kirizingako, ku kkono kirikomyawo Scroll up to move to next desktop, down to previous Bw'oginyoolera ku ddyo ogenda awakolerwa awaddako, ku kkono odda awakulembera w'oli Scroll up to move to previous desktop, down to next Bw'oginyoolera ku ddyo odda awakolerwa awakulembera w'oli, ku kkono ogenda awaddako Current Agali w'okolera kakano gokka Desktop %1 Awakolerwa namba %1 ================================================ FILE: plugin-taskbar/translations/taskbar_lt.desktop.yaml ================================================ Desktop Entry/Name: "Užduočių tvarkytuvė" Desktop Entry/Comment: "Perjungti tarp paleistų programų" ================================================ FILE: plugin-taskbar/translations/taskbar_lt.ts ================================================ LXQtTaskBar Activate task %1 Aktyvuoti užduotį %1 LXQtTaskButton Application Programa To &Desktop Į &darbalaukį &All Desktops &Visus darbalaukius Desktop &%1 Darbalaukį &%1 &To Current Desktop Į &esamą darbalaukį Move To N&ext Monitor Perkelti į ki&tą monitorių Move To &Previous Monitor Perkelti į a&nkstesnį monitorių &Move &Perkelti Resi&ze Keisti dy&dį Ma&ximize Iš&skleisti Maximize vertically Išskleisti vertikaliai Maximize horizontally Išskleisti horizontaliai &Restore &Atkurti Mi&nimize Sus&kleisti Roll down Nuraityti Roll up Užraityti &Layer S&luoksnis Always on &top Visada vi&ršuje &Normal &Normalus Always on &bottom Visada a&pačioje &Close &Užverti LXQtTaskGroup Group Grupė Close group Užverti grupę LXQtTaskbarConfiguration Task Manager Settings Užduočių tvarkytuvės nustatymai General Bendra Show only windows from desktop Rodyti tik langus iš darbalaukio Show only windows from &panel's screen Rodyti tik langus iš &skydelio ekrano Show only minimized windows Rodyti tik suskleistus langus Raise minimized windows on current desktop Suskleistus langus iškelti esamame darbalaukyje Close on middle-click Užverti, spustelėjus viduriniu pelės mygtuku Comma separated list of window classes Kableliais atskirtų lango klasių sąrašas Exclude from taskbar Išskirti iš užduočių juostos Cycle windows on wheel scrolling Perjunginėti langus, slenkant pelės ratuku Window &grouping Langų &grupavimas Show popup on mouse hover Užvedus pelę, rodyti iškylantįjį langą Appearance Išvaizda Button style Mygtukų stilius Maximum button width Didžiausias mygtuko plotis px pikselių Mouse Wheel Pelės ratukas Wheel Delta Threshold Ratuko delta slenkstis Put buttons of the same class next to each other Išdėstyti tos pačios klasės mygtukus vieną šalia kito Maximum button height Didžiausias mygtuko aukštis Auto&rotate buttons when the panel is vertical Automatiškai &pasukti mygtukus, jei skydelis vertikalus Use icons by WindowClass, if available Jei prieinama, naudoti WindowClass piktogramas Icon and text Piktograma ir tekstas Only icon Tik piktograma Only text Tik tekstas Disabled Išjungta Scroll up to raise, down to minimize Slinkti aukštyn norint iškelti, žemyn - norint suskleisti Scroll up to minimize, down to raise Slinkti aukštyn norint suskleisti, žemyn - norint iškelti Scroll up to move to next desktop, down to previous Slenkant aukštyn perjungti į kitą darbalaukį, o slenkant žemyn - į ankstesnį Scroll up to move to previous desktop, down to next Slenkant aukštyn perjungti į ankstesnį darbalaukį, o slenkant žemyn - į kitą Current Esamo Desktop %1 Darbalaukis %1 ================================================ FILE: plugin-taskbar/translations/taskbar_lv.desktop.yaml ================================================ Desktop Entry/Name: "Uzdevumu pārvaldnieks" Desktop Entry/Comment: "Pārslēgties starp palaistajām lietotnēm" ================================================ FILE: plugin-taskbar/translations/taskbar_lv.ts ================================================ LXQtTaskBar Activate task %1 Aktivēt uzdevumu %1 LXQtTaskButton Application Lietotne To &Desktop Uz &darbvirsmu &All Desktops Visa&as darbvirsmas Desktop &%1 Darbvirsma &%1 &To Current Desktop Uz &tekošo/pašreizējo darbvirsmu Move To N&ext Monitor Move To &Previous Monitor Pārvietot/pārnest uz ie&priekšējo ekrānu &Move Pārnest/pārvietot (&Move) Resi&ze Mainīt i&zmēru Ma&ximize Maksimizēt Maximize vertically Maksimizēt vertikāli Maximize horizontally Maksimizēt horizontāli &Restore Atg&riezt Mi&nimize Mi&nimizēt Roll down Tīt lejā/notīt Roll up Tīt augšā/uztīt &Layer S&lānis Always on &top Vienmēr virspusē/priekšplānā (&T) &Normal Parasts/&normāls Always on &bottom Vienmēr apakšā/di&benplānā &Close Aizvērt (&C) LXQtTaskGroup Group Grupa Close group Aizvērt grupu LXQtTaskbarConfiguration Task Manager Settings Uzdevumu pārvaldnieka iestatījumi General Vispārīgie Show only windows from desktop Rādīt logus tikai no darbvirsmas Show only windows from &panel's screen Rādīt logus tikai no &paneļa ekrāna Show only minimized windows Rādīt tikai minimizētos logus Raise minimized windows on current desktop Izklāt minimizētos logus uz pašreizējās darbvirsmas Close on middle-click Aizvērt ar peles vidējo pogu Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Pārslēgt logus ar peles ritentiņu Window &grouping Logu &grupēšana Show popup on mouse hover Rādīt informāciju, uzbraucot ar peles kursoru Appearance Izskats Button style Pogu stils Maximum button width Pogas maksimālais platums px pikseļi Mouse Wheel Peles ritenis Wheel Delta Threshold Peles riteņa jūtīguma slieksnis Put buttons of the same class next to each other Izvietot vienas klases pogas vienu otrai līdzās Maximum button height Maksimālais pogas augstums Auto&rotate buttons when the panel is vertical Automātiski pag&riezt pogas, kad panelis ir vertikāls Use icons by WindowClass, if available Izmantot WindowClass ikonas, ja pieejamas Icon and text Ikona un teksts Only icon Tikai ikona Only text Tikai teksts Disabled Atspējots Scroll up to raise, down to minimize Ripinot uz augšu logu maksimizē , uz leju - minimizē. Scroll up to minimize, down to raise Ripinot uz augšu logu minimizē, uz leju - maksimizē. Scroll up to move to next desktop, down to previous Ripināt uz augšu, lai pārceltu uz nākamo darbvirsmu, uz leju — uz iepriekšējo Scroll up to move to previous desktop, down to next Ripināt uz augšu, lai pārceltu uz iepriekšējo darbvirsmu, uz leju — uz nākošo Current Tekošais/pašreizējais Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Oppgavebehandler" Desktop Entry/Comment: "Bytt mellom kjørende programmer" ================================================ FILE: plugin-taskbar/translations/taskbar_nb_NO.ts ================================================ LXQtTaskBar Activate task %1 Aktiver handling %1 LXQtTaskButton Application Program To &Desktop Til &skrivebord &All Desktops &Alle skrivebord Desktop &%1 Skrivebord &%1 &To Current Desktop &Til skrivebord i bruk Move To N&ext Monitor Flytt til n&este skjerm Move To &Previous Monitor Flytt til &forrige skjerm &Move &Flytt Resi&ze Endr&e størrelse Ma&ximize Ma&ksimer Maximize vertically Maksimer vertikalt Maximize horizontally Maksimer horisontalt &Restore &Gjenopprett Mi&nimize Mi&nimer Roll down Rull ned Roll up Rull opp &Layer &Lag Always on &top Alltid på &topp &Normal Always on &bottom Alltid på &bunnen &Close &Lukk LXQtTaskGroup Group Gruppe Close group Lukk gruppe LXQtTaskbarConfiguration Task Manager Settings Oppgavebehandlingsinnstillinger General Generelt Show only windows from desktop Vis bare vinduer fra skrivebord Show only windows from &panel's screen Vis bare vinduer fra pa&nelets skjerm Show only minimized windows Vis bare minimerte vinduer Raise minimized windows on current desktop Løft opp minimerte vinduer på gjeldende skrivebord Close on middle-click Lukk ved midt-klikk Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Skift vindu ved rulling med mushjulet Window &grouping Vindus&gruppering Show popup on mouse hover Vis sprettopprute når musa er over Appearance Utseende Button style Knappstil Maximum button width Maksimal bredde på knapper px px Mouse Wheel Rullehjul på mus Wheel Delta Threshold Avstand å rulle før forandring Put buttons of the same class next to each other Plasser knapper av samme klasse ved siden av hverandre Maximum button height Maksimal høyde på knapper Auto&rotate buttons when the panel is vertical Auto&roter knapper når panelet er vertikalt Use icons by WindowClass, if available Bruk ikoner fra WindowClass, hvis tilgjengelig Icon and text Ikon og tekst Only icon Kun ikon Only text Bare tekst Disabled Avslått Scroll up to raise, down to minimize Rull opp for å maksimere, ned for å minimere Scroll up to minimize, down to raise Rull opp for å minimere, ned for å maksimere Scroll up to move to next desktop, down to previous Rull ↑ for å flytte til neste skrivebord, ↓ for forrige Scroll up to move to previous desktop, down to next Rull ↑ for å flytte til forrige skrivebord, ↓ for neste Current Nåværende Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_nl.desktop.yaml ================================================ Desktop Entry/Name: "Taakbalk" Desktop Entry/Comment: "Schakel tussen actieve programma's" ================================================ FILE: plugin-taskbar/translations/taskbar_nl.ts ================================================ LXQtTaskBar Activate task %1 %1 activeren LXQtTaskButton Application Programma To &Desktop Naar bureaubla&d &All Desktops &Alle werkbladen Desktop &%1 Werkblad &%1 &To Current Desktop &Naar huidig werkblad Move To N&ext Monitor Verplaatsen naar volge&nd beeldscherm Move To &Previous Monitor Ver&plaatsen naar vorig beeldscherm &Move &Verplaatsen Resi&ze Grootte aanpas&sen Ma&ximize Ma&ximaliseren Maximize vertically Verticaal maximaliseren Maximize horizontally Horizontaal maximaliseren &Restore He&rstellen Mi&nimize Mi&nimaliseren Roll down Afrollen Roll up Oprollen &Layer &Laag Always on &top Al&tijd bovenaan &Normal &Normaal Always on &bottom Altijd &onderaan &Close &Sluiten LXQtTaskGroup Group Groep Close group Groep sluiten LXQtTaskbarConfiguration Task Manager Settings Taakbalkinstellingen General Algemeen Show only windows from desktop Alleen vensters van een bepaald werkblad tonen Show only windows from &panel's screen Alleen vensters van scherm met &paneel tonen Show only minimized windows Alleen geminimaliseerde vensters tonen Raise minimized windows on current desktop Geminimaliseerde vensters herstellen op huidig werkblad Comma separated list of window classes Een kommagescheiden lijst met vensterklassen Exclude from taskbar Niet tonen op taakbalk Cycle windows on wheel scrolling Tussen vensters schakelen door te scrollen met muiswiel Window &grouping Venster&groepering Show popup on mouse hover Pop-upvenster tonen na aanwijzen met cursor Appearance Vormgeving Maximum button width Maximale itembreedte px px Mouse Wheel Muiswiel Wheel Delta Threshold Gevoeligheid van muiswiel Put buttons of the same class next to each other Items van hetzelfde programma naast elkaar zetten Maximum button height Maximale itemhoogte Use icons by WindowClass, if available Pictogrammen van vensterklasse gebruiken (indien beschikbaar) Auto&rotate buttons when the panel is vertical Items automatisch d&raaien indien paneel verticaal is Button style Itemstijl Close on middle-click Sluiten met middelste muisknop Icon and text Pictogram en tekst Only icon Alleen pictogram Only text Alleen tekst Disabled Uitgeschakeld Scroll up to raise, down to minimize Scrol omhoog om te herstellen en naar beneden om te minimaliseren Scroll up to minimize, down to raise Scrol omhoog om te minimaliseren en naar beneden om te herstellen Scroll up to move to next desktop, down to previous Scrol omhoog voor het volgende werkblad en omlaag voor het vorige Scroll up to move to previous desktop, down to next Scrol omhoog voor het vorige werkblad en omlaag voor het volgende Current Huidig werkblad Desktop %1 Werkblad %1 ================================================ FILE: plugin-taskbar/translations/taskbar_oc.desktop.yaml ================================================ Desktop Entry/Name: "Gestionari de prètzfaches" Desktop Entry/Comment: "Basculatz entre las aplicacions activas" ================================================ FILE: plugin-taskbar/translations/taskbar_oc.ts ================================================ LXQtTaskBar Activate task %1 Activar la prètzfach %1 LXQtTaskButton Application Aplicacion To &Desktop Cap al &burèu &All Desktops &Totes los burèus Desktop &%1 Burèu &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move &Desplaçar Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore &Restaurar Mi&nimize Roll down Roll up &Layer Always on &top &Normal &Normal Always on &bottom &Close &Tampar LXQtTaskGroup Group Grop Close group LXQtTaskbarConfiguration Task Manager Settings General General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Aparéncia Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Actual Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਟਾਸਕ ਮੈਨੇਜਰ" Desktop Entry/Comment: "ਚੱਲ ਰਹੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਿਚਾਲੇ ਬਦਲੋ" ================================================ FILE: plugin-taskbar/translations/taskbar_pa.ts ================================================ LXQtTaskBar Activate task %1 ਟਾਸਕ %1 ਸਰਗਰਮ LXQtTaskButton Application ਐਪਲੀਕੇਸ਼ਨ To &Desktop ਡੈਸਕਟਾਪ ਤੇ(&D) &All Desktops ਸਾਰੇ ਡੈਸਕਟਾਪ(&A) Desktop &%1 ਡੈਸਕਟਾਪ &%1 &To Current Desktop ਮੌਜੂਦਾ ਡੈਸਕਟਾਪ ਉੱਤੇ(&T) Move To N&ext Monitor ਅਗਲੇ ਮਾਨੀਟਰ ਉੱਤੇ ਭੇਜੋ(&e) Move To &Previous Monitor ਪਿਛਲੇ ਮਾਨੀਟਰ ਉੱਤੇ ਭੇਜੋ(&P) &Move ਭੇਜੋ(&M) Resi&ze ਮੁੜ-ਆਕਾਰ(&z) Ma&ximize ਵੱਧ ਤੋਂ ਵੱਧ(&x) Maximize vertically ਖੜ੍ਹਵੇਂ ਰੂਪ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ Maximize horizontally ਲੇਟਵੇਂ ਰੂਪ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ &Restore ਬਹਾਲ ਕਰੋ(&R) Mi&nimize ਘੱਟੋ-ਘੱਟ(n) Roll down ਹੇਠਾਂ ਵੱਲ ਰੋਲ ਕਰੋ Roll up ਉੱਤੇ ਵੱਲ ਰੋਲ ਕਰੋ &Layer ਲੇਅਰ(&L) Always on &top ਹਮੇਸ਼ਾਂ ਉਤੇ ਵੇਖਾਓ(&t) &Normal ਸਧਾਰਨ(&N) Always on &bottom ਹਮੇਸ਼ਾਂ ਹੇਠਾਂ(&b) &Close ਬੰਦ ਕਰੋ(&C) LXQtTaskGroup Group ਗਰੁੱਪ Close group ਗਰੁੱਪ ਬੰਦ ਕਰੋ LXQtTaskbarConfiguration Task Manager Settings ਟਾਸਕ ਮੈਨੇਜਰ ਸੈਟਿੰਗਾਂ General ਆਮ Show only windows from desktop ਸਿਰਫ਼ ਡੈਸਕਟਾਪ ਤੋਂ ਹੀ ਵਿੰਡੋ ਵੇਖਾਓ Show only windows from &panel's screen ਪੈਨਲ ਦੀ ਸਕਰੀਨ ਤੋਂ ਹੀ ਵਿੰਡੋ ਵੇਖਾਓ(&p) Show only minimized windows ਸਿਰਫ਼ ਘੱਟੋ-ਘੱਟ ਕੀਤੀਆਂ ਵਿੰਡੋ ਵੇਖਾਓ Raise minimized windows on current desktop Close on middle-click ਮਿਡਲ-ਕਲਿੱਕ ਉੱਤੇ ਬੰਦ ਕਰੋ Comma separated list of window classes Exclude from taskbar ਟਾਸਕ-ਪੱਟੀ ਤੋਂ ਬਾਹਰ Cycle windows on wheel scrolling ਵੀਲ੍ਹ ਸਕਰੋਲ ਕਰਨ ਨਾਲ ਵਿੰਡੋ ਵਿੱਚ ਘੁੰਮਾਓ Window &grouping ਵਿੰਡੋ ਗਰੁੱਪਿੰਗ(&g) Show popup on mouse hover Appearance ਦਿੱਖ Button style ਬਟਨ ਸਟਾਈਲ Maximum button width ਵੱਧ ਤੋਂ ਵੱਧ ਬਟਨ ਚੌੜਾਈ px ਪਿਕਸਲ Mouse Wheel ਮਾਊਸ ਵੀਲ੍ਹ Wheel Delta Threshold ਵੀਲ੍ਹ ਡੈਲਟਾ ਥਰੈਸ਼ਹੋਲਡ Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text ਆਈਕਾਨ ਤੇ ਲਿਖਤ Only icon ਸਿਰਫ਼ ਆਈਕਾਨ Only text ਸਿਰਫ਼ ਲਿਖਤ Disabled ਅਸਮਰੱਥ ਹੈ Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current ਮੌਜੂਦਾ Desktop %1 ਡੈਸਕਟਾਪ %1 ================================================ FILE: plugin-taskbar/translations/taskbar_pl.desktop.yaml ================================================ Desktop Entry/Name: "Pasek zadań" Desktop Entry/Comment: "Przełączaj pomiędzy otwartymi programami" ================================================ FILE: plugin-taskbar/translations/taskbar_pl.ts ================================================ LXQtTaskBar Activate task %1 Aktywuj zadanie %1 LXQtTaskButton Application Program To &Desktop Na &pulpit &All Desktops &Wszystkie pulpity Desktop &%1 Pulpit &%1 &To Current Desktop &Na obecny pulpit Move To N&ext Monitor Przenieś na następny monitor Move To &Previous Monitor Przesuń na &poprzedni monitor &Move &Przenieś Resi&ze &Zmień rozmiar Ma&ximize Zma&ksymalizuj Maximize vertically Zmaksymalizuj pionowo Maximize horizontally Zmaksymalizuj poziomo &Restore P&rzywróć Mi&nimize Zmi&nimalizuj Roll down Zwiń Roll up Rozwiń &Layer &Warstwa Always on &top Zawsze na &wierzchu &Normal &Normalnie Always on &bottom Zawsze pod &spodem &Close &Zamknij LXQtTaskGroup Group Grupa Close group Zamknij grupę LXQtTaskbarConfiguration Task Manager Settings Ustawienia menedżera zadań General Ogólne Show only windows from desktop Pokazuj tylko okna pulpitu Show only windows from &panel's screen &Pokazuj tylko okna z ekranu z tym panelem Show only minimized windows Pokazuj tylko zminimalizowane okna Raise minimized windows on current desktop Unoś zminimalizowane okna na obecnym pulpicie Comma separated list of window classes Rozdzielana przecinkami lista klas okien Exclude from taskbar Wyklucz z paska zadań Cycle windows on wheel scrolling Zmieniaj stan okien rolką myszy Window &grouping &Grupowanie okien Show popup on mouse hover Pokazuj podgląd przy przyłożeniu kursora Appearance Wygląd Maximum button width Maksymalna szerokość przycisku px px Mouse Wheel Rolka myszy Wheel Delta Threshold Czułość kółka myszy Put buttons of the same class next to each other Umieść programy tego samego typu obok siebie Maximum button height Maksymalna wysokość przycisku Use icons by WindowClass, if available Używaj ikon z WindowClass, jeśli dostępne Auto&rotate buttons when the panel is vertical Automatycznie ob&racaj przyciski, jeżeli panel jest pionowy Button style Styl przycisku Close on middle-click Zamknij środkowym klawiszem Icon and text Ikona i tekst Only icon Tylko ikona Only text Tylko tekst Disabled Wyłączona Scroll up to raise, down to minimize Przesunięcie w górę rozwija, w dół minimalizuje Scroll up to minimize, down to raise Przesunięcie w górę minimalizuje, w dół rozwija Scroll up to move to next desktop, down to previous Przewiń w górę, aby przejść do następnego pulpitu, w dół do poprzedniego Scroll up to move to previous desktop, down to next Przewiń w górę, aby przejść do następnego pulpitu, w dół do poprzedniego Current Obecny Desktop %1 Pulpit %1 ================================================ FILE: plugin-taskbar/translations/taskbar_pt.desktop.yaml ================================================ Desktop Entry/Name: "Gestor de tarefas" Desktop Entry/Comment: "Permite trocar entre as aplicações em execução" ================================================ FILE: plugin-taskbar/translations/taskbar_pt.ts ================================================ LXQtTaskBar Activate task %1 Ativar tarefa %1 LXQtTaskButton Application Aplicação To &Desktop No ambiente &de trabalho &All Desktops Todos os &ambiente de trabalho Desktop &%1 Ambiente de trabalho &%1 &To Current Desktop No ambiente de &trabalho atual Move To N&ext Monitor Mover para o monitor s&eguinte Move To &Previous Monitor Mover para o monitor &anterior &Move &Mover Resi&ze Re&dimensionar Ma&ximize Ma&ximizar Maximize vertically Maximizar na vertical Maximize horizontally Maximizar na horizontal &Restore &Restaurar Mi&nimize Mi&nimizar Roll down Desenrolar Roll up Enrolar &Layer Ca&mada Always on &top Sempre na &frente &Normal &Normal Always on &bottom Sempr&e por trás &Close Fe&char LXQtTaskGroup Group Grupo Close group Fechar grupo LXQtTaskbarConfiguration Task Manager Settings Definições do Gestor de tarefas General Geral Show only windows from desktop Mostrar apenas as janelas do ambiente de trabalho Show only windows from &panel's screen Mostrar apenas as janelas do ecrã do &painel Show only minimized windows Mostrar apenas janelas minimizadas Raise minimized windows on current desktop Mostrar janelas minimizadas do ambiente de trabalho atual Comma separated list of window classes Lista de classes de janelas separada por vírgulas Exclude from taskbar Excluir da barra de tarefas Cycle windows on wheel scrolling Percorrer janelas com a roda do rato Window &grouping A&grupamento de janelas Show popup on mouse hover Mostrar janela ao passar com o rato Appearance Aparência Maximum button width Largura máxima do botão px px Mouse Wheel Roda do rato Wheel Delta Threshold Limite delta da roda do rato Put buttons of the same class next to each other Colocar botões da mesma classe juntos Maximum button height Altura máxima do botão Use icons by WindowClass, if available Se disponíveis, utilizar os ícones de WindowClass Auto&rotate buttons when the panel is vertical &Rodar automaticamente os botões se o painel for vertical Button style Estilo dos botões Close on middle-click Fechar com a roda do rato Icon and text Ícones e texto Only icon Ícones Only text Texto Disabled Desativada Scroll up to raise, down to minimize Desloque acima para maximizar e abaixo para minimizar Scroll up to minimize, down to raise Desloque acima para minimizar e abaixo para maximizar Scroll up to move to next desktop, down to previous Deslocar para cima move-se para o ambiente de trabalho seguinte, para baixo move-se para o anterior Scroll up to move to previous desktop, down to next Deslocar para cima move-se para o ambiente de trabalho anterior, para baixo move-se para o seguinte Current Atual Desktop %1 Área de trabalho %1 ================================================ FILE: plugin-taskbar/translations/taskbar_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Gerenciador de tarefas" Desktop Entry/Comment: "Alterne entre aplicativos em execução" ================================================ FILE: plugin-taskbar/translations/taskbar_pt_BR.ts ================================================ LXQtTaskBar Activate task %1 Ativar tarefa %1 LXQtTaskButton Application Aplicativo To &Desktop Para a &Área de Trabalho &All Desktops &Todas as Áreas de Trabalho Desktop &%1 Área de Trabalho &%1 &To Current Desktop &Para a Área de Trabalho atual Move To N&ext Monitor Mover para o pró&ximo monitor Move To &Previous Monitor Mover Para o Monitor &Anterior &Move &Mover Resi&ze Redi&mensionar Ma&ximize Ma&ximizar Maximize vertically Maximizar verticalmente Maximize horizontally Maximizar horizontalmente &Restore &Restaurar Mi&nimize Mi&nimizar Roll down Rolar para baixo Roll up Rolar para cima &Layer &Camada Always on &top Sempre em &cima &Normal &Normal Always on &bottom Sempre &embaixo &Close &Fechar LXQtTaskGroup Group Grupo Close group Fechar grupo LXQtTaskbarConfiguration Task Manager Settings Configurações do gerenciador de tarefas General Geral Show only windows from desktop Exibir somente as janelas da área de trabalho Show only windows from &panel's screen Exibir somente janelas da tela do &painel Show only minimized windows Exibir apenas as janelas minimizadas Raise minimized windows on current desktop Elevar janelas minimizadas na área de trabalho atual Comma separated list of window classes Lista de classes de janelas separadas por vírgula Exclude from taskbar Excluir da barra de tarefas Cycle windows on wheel scrolling Circular entre as janelas ao usar a roda do mouse (scroll) Window &grouping &Agrupamento de janelas Show popup on mouse hover Mostrar lista de janelas ao apontar Appearance Aparência Maximum button width Tamanho máximo de um botão px px Mouse Wheel Roda do Mouse Wheel Delta Threshold Limite Delta da Roda Put buttons of the same class next to each other Coloque botões da mesma classe próximos uns dos outros Maximum button height Tamanho máximo da altura de um botão Use icons by WindowClass, if available Usar ícones por WindowClass, caso disponível Auto&rotate buttons when the panel is vertical Auto&rotacionar botões quando o painel for vertical Button style Estilo dos botões Close on middle-click Fechar no clique do meio Icon and text Ícone e texto Only icon Apenas ícone Only text Apenas texto Disabled Desabilitado Scroll up to raise, down to minimize Rolar para cima para aumentar, para baixo para minimizar Scroll up to minimize, down to raise Rolar para cima para minimizar, para baixo para aumentar Scroll up to move to next desktop, down to previous Rolar para cima para mover para a próxima área de trabalho, para baixo para a anterior Scroll up to move to previous desktop, down to next Rolar para cima para mover para a área de trabalho anterior, para baixo para a próxima Current Atual Desktop %1 Área de trabalho %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ro.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "Comută între aplcațiile active" ================================================ FILE: plugin-taskbar/translations/taskbar_ro_RO.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application Aplicație To &Desktop Către &desktop &All Desktops Toate ecr&anele Desktop &%1 Ecranul &%1 &To Current Desktop Că&tre ecranul virtual curent Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Ma&ximizează Maximize vertically Maximizează pe verticală Maximize horizontally Maximizează pe orizontală &Restore &Restaurează Mi&nimize Mi&nimizează Roll down Derulează în jos Roll up Derulează în sus &Layer &Strat Always on &top Întotdeauna de&asupra &Normal &Normal Always on &bottom Întotdeauna de&desubt &Close În&chide LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Button style Stil butoane Close on middle-click Închide prin clic pe butonul din mijloc Icon and text Pictograme și text Only icon Doar pictograme Only text Doar text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_ru.desktop.yaml ================================================ Desktop Entry/Name: "Панель задач" Desktop Entry/Comment: "Переключиться между запущенными приложениями" ================================================ FILE: plugin-taskbar/translations/taskbar_ru.ts ================================================ LXQtTaskBar Activate task %1 Запустить задачу %1 LXQtTaskButton Application Приложение To &Desktop &На рабочий стол &All Desktops &Все рабочие столы Desktop &%1 Рабочий стол &%1 &To Current Desktop На &текущий рабочий стол Move To N&ext Monitor Переместить на сле&дующий монитор Move To &Previous Monitor Переместить на &предыдущий монитор &Move Пере&местить Resi&ze Изм&енить размер Ma&ximize Р&азвернуть Maximize vertically Развернуть по вертикали Maximize horizontally Развернуть по горизонтали &Restore &Восстановить Mi&nimize &Свернуть Roll down Развернуть из заголовока Roll up Свернуть в заголовок &Layer &Положение Always on &top Вс&егда на переднем плане &Normal &Обычное Always on &bottom Всегда в&низу &Close &Закрыть LXQtTaskGroup Group Группа Close group Закрыть группу LXQtTaskbarConfiguration Task Manager Settings Настройки панели задач General Общие Show only windows from &panel's screen Показывать окна только с экрана &панели Show only minimized windows Показывать только свёрнутые окна Raise minimized windows on current desktop Разворачивать свёрнутые окна на текущем рабочем столе Cycle windows on wheel scrolling Переключать окна колёсиком мыши Window &grouping &Группировка окон Appearance Внешний вид Maximum button width Максимальная ширина кнопки px пикс Maximum button height Максимальная высота кнопки Use icons by WindowClass, if available Использовать значки WindowClass, если доступно Button style Стиль кнопок Show only windows from desktop Показывать окна только с рабочего стола Mouse Wheel Колёсико мыши Wheel Delta Threshold Порог чувствительности колёсика мыши Show popup on mouse hover Показывать список при наведении мыши Put buttons of the same class next to each other Размещать кнопки одного класса рядом друг с другом Auto&rotate buttons when the panel is vertical Авто&поворот кнопок, когда панель вертикальна Comma separated list of window classes Список классов окон, разделённый запятыми Exclude from taskbar Исключить из панели задач Close on middle-click Закрывать по щелчку средней кнопки мыши Icon and text Значок и текст Only icon Только значок Only text Только текст Disabled Нет действий Scroll up to raise, down to minimize Прокрутка вверх разворачивает окно, вниз — сворачивает Scroll up to minimize, down to raise Прокрутка вверх сворачивает окно, вниз — разворачивает Scroll up to move to next desktop, down to previous Прокрутка вверх перемещает на следующий рабочий стол, вниз — на предыдущий Scroll up to move to previous desktop, down to next Прокрутка вверх перемещает на предыдущий рабочий стол, вниз — на следующий Current Текущий Desktop %1 Рабочий стол %1 ================================================ FILE: plugin-taskbar/translations/taskbar_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-taskbar/translations/taskbar_si.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Close on middle-click Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Button style Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sk.desktop.yaml ================================================ Desktop Entry/Name: "Správca úloh" Desktop Entry/Comment: "Prepínanie medzi bežiacimi aplikáciami" ================================================ FILE: plugin-taskbar/translations/taskbar_sk_SK.ts ================================================ LXQtTaskBar Activate task %1 Aktivovať úlohu %1 LXQtTaskButton Application Aplikácia To &Desktop Na &plochu &All Desktops &Všetky plochy Desktop &%1 Plocha &%1 &To Current Desktop &Na aktuálnu plochu Move To N&ext Monitor Presunúť na & Ďalší monitor Move To &Previous Monitor Presunúť na &predchádzajúcu obrazovku &Move &Presunúť Resi&ze &Zmeniť veľkosť Ma&ximize Ma&ximalizovať Maximize vertically Maximalizovať zvisle Maximize horizontally Maximalizovať vodorovne &Restore &Obnoviť Mi&nimize Mi&nimalizovať Roll down Zrolovať nahor Roll up Zrolovať dolu &Layer &Vrstva Always on &top Vždy &navrchu &Normal &Normálne Always on &bottom Vždy na&spodku &Close &Zatvoriť LXQtTaskGroup Group Skupina Close group Uzatvoriť skupinu LXQtTaskbarConfiguration Task Manager Settings Nastavenie správcu úloh General Všeobecné Show only windows from desktop Zobraziť iba okná z pracovnej plochy Show only windows from &panel's screen Zobraziť iba okná z obrazovky panela Show only minimized windows Zobraziť iba minimalizované okná Raise minimized windows on current desktop Maximalizovať všetky okná na aktuálnu plochu Comma separated list of window classes Zoznam tried okien oddelených čiarkou Exclude from taskbar Vylúčiť z panela úloh Cycle windows on wheel scrolling Zmena okna rolovaním Window &grouping Okná & zoskupenie Show popup on mouse hover Zobraziť okno po prejdení myšou Appearance Vzhľad Maximum button width Maximálna šírka tlačidla px px Mouse Wheel Kolečko myši Wheel Delta Threshold Prah prírastku pri otočení kolečka Put buttons of the same class next to each other Uložiť tlačidlá rovnakej triedy vedľa seba Maximum button height Maximálna výška tlačítka Use icons by WindowClass, if available Použiť okenné symboly, ak sú k dispozícii Auto&rotate buttons when the panel is vertical Automatické otočenie tlačidiel vo vertikálnej polohe panela Button style Štýl tlačidiel Close on middle-click Zatvoriť kliknutím na stredné tlačítko Icon and text Ikona a text Only icon Iba ikona Only text Iba text Disabled Vypnuté Scroll up to raise, down to minimize Otočením smerom hore preniesť do popredia, smerom dole minimalizovať Scroll up to minimize, down to raise Otočením smerom hore minimalizovať, smerom dole preniesť do popredia Scroll up to move to next desktop, down to previous Posunúť hore pre presun na ďalšiu plochu, dolu na predchádzajúcu Scroll up to move to previous desktop, down to next Posunúť hore pre presun na ďalšiu plochu, dolu na predchádzajúcu Current Aktuálny Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sl.desktop.yaml ================================================ Desktop Entry/Name: "Upravljalnik opravil" Desktop Entry/Comment: "Preklapljajte med zagnanimi programi" ================================================ FILE: plugin-taskbar/translations/taskbar_sl.ts ================================================ LXQtTaskBar Activate task %1 Aktiviraj opravilo %1 LXQtTaskButton Application Program To &Desktop &Na namizje &All Desktops &Vsa namizja Desktop &%1 Namizje &%1 &To Current Desktop Na &trenutno namizje Move To N&ext Monitor Move To &Previous Monitor &Move P&remakni Resi&ze Nastavi &velikost Ma&ximize &Razpni Maximize vertically Razpni navpično Maximize horizontally Razpni vodoravno &Restore &Obnovi Mi&nimize Po&manjšaj Roll down Minimiziraj Roll up Maksimiziraj &Layer &Plast Always on &top Vedno na &vrhu &Normal &Običajno Always on &bottom Vedno na &dnu &Close &Zapri LXQtTaskGroup Group Skupina Close group Zapri skupino LXQtTaskbarConfiguration Task Manager Settings Nastavitve vrstice s programi General Splošno Show only windows from desktop Prikaži le okna iz namizja Show only windows from &panel's screen Prikaži le okna, kjer je orodna vrstica Show only minimized windows Prikaži le minimizirana okna Raise minimized windows on current desktop Maksimiziraj minimizirana okna na trenutnem namizju Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Preklapljaj med okni ob vrtenju miškinega kolesca Window &grouping Okna v skupina&h Show popup on mouse hover Prikaži pojavno okno, če je miška nad skupino Appearance Izgled Maximum button width Največja širina gumba px px Mouse Wheel Miškino kolesce Wheel Delta Threshold Delta prag (threshold) kolesca Put buttons of the same class next to each other Maximum button height Največja širina gumba Use icons by WindowClass, if available Uporabi ikone atributa WindowClass, če so na voljo Auto&rotate buttons when the panel is vertical Samodejno obrni gumbe, če je v&rstica navpična Button style Slog gumbov Close on middle-click Zapri ob srednjem kliku Icon and text Ikona in besedilo Only icon Le ikona Only text Le besedilo Disabled Onemogočen Scroll up to raise, down to minimize Kolesce gor/dor za maksimizacijo/minimizacijo Scroll up to minimize, down to raise Kolesce gor/dol za minimizacijo/maksimizacijo Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Trenutno Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sr.desktop.yaml ================================================ Desktop Entry/Name: "Менаџер задатака" Desktop Entry/Comment: "Пребацујте између програма у раду" ================================================ FILE: plugin-taskbar/translations/taskbar_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Менаџер задатака" Desktop Entry/Comment: "Пребацујте између програма у раду" ================================================ FILE: plugin-taskbar/translations/taskbar_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Menadžer zadataka" Desktop Entry/Comment: "Prebacujte između programa u radu" ================================================ FILE: plugin-taskbar/translations/taskbar_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Menadžer zadataka" Desktop Entry/Comment: "Prebacujte između programa u radu" ================================================ FILE: plugin-taskbar/translations/taskbar_sr@latin.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application To &Desktop &All Desktops Desktop &%1 &To Current Desktop Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Maximize vertically Maximize horizontally &Restore Mi&nimize Roll down Roll up &Layer Always on &top &Normal Always on &bottom &Close LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Cycle windows on wheel scrolling Window &grouping Appearance Maximum button width px Maximum button height Auto&rotate buttons when the panel is vertical Use icons by WindowClass, if available Close on middle-click Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Mouse Wheel Wheel Delta Threshold Show popup on mouse hover Put buttons of the same class next to each other Button style Comma separated list of window classes Exclude from taskbar Icon and text Only icon Only text Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sr_BA.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application Програм To &Desktop На &површ &All Desktops &све површи Desktop &%1 површ &%1 &To Current Desktop &На тренутну површ Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize Ма&ксимизуј Maximize vertically Максимизуј вертикално Maximize horizontally Максимизуј хоризонтално &Restore &Обнови Mi&nimize &Минимизуј Roll down Одмотај Roll up Намотај &Layer &Слој Always on &top увијек &изнад &Normal &нормално Always on &bottom увијек испо&д &Close &Затвори LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Close on middle-click Button style Стил тастера Icon and text икона и текст Only icon само икона Only text само текст Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sr_RS.ts ================================================ LXQtTaskBar Activate task %1 Покрени задатак %1 LXQtTaskButton Application Програм To &Desktop На &површ &All Desktops &све површи Desktop &%1 површ &%1 &To Current Desktop &На тренутну површ Move To N&ext Monitor Пређи на с&ледећи монитор Move To &Previous Monitor Пређи на &Претходни монитор &Move &Помери Resi&ze Промени величину Ma&ximize Ма&ксимизуј Maximize vertically Максимизуј вертикално Maximize horizontally Максимизуј хоризонтално &Restore &Обнови Mi&nimize &Минимизуј Roll down Одмотај Roll up Намотај &Layer &Слој Always on &top увек &изнад &Normal &нормално Always on &bottom увек испо&д &Close &Затвори LXQtTaskGroup Group Група Close group Затвори групу LXQtTaskbarConfiguration Task Manager Settings Поставке менаџера задатака General Опште Show only windows from desktop Прикажи прозоре само са десктопа Show only windows from &panel's screen Прикажи прозоре само са екрана панела Show only minimized windows Прикажи само минимизоване прозоре Raise minimized windows on current desktop Повећај минимизовани прозор на тренутном десктопу Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Груписање прозора Show popup on mouse hover Прикажи искачћући прозор при преласку миша Appearance Изглед Maximum button width Максимална ширина дугмета px px Mouse Wheel Точак миша Wheel Delta Threshold Put buttons of the same class next to each other Постави дугмад исте класе један поред другог Maximum button height Максимална висина дугмета Use icons by WindowClass, if available Користи иконе од WindowClass-а, ако су доступне Auto&rotate buttons when the panel is vertical Ауто&ротирај дугмад када је панел вертикалан Button style Стил тастера Close on middle-click Затвори на средњи клик Icon and text икона и текст Only icon само икона Only text само текст Disabled Онемогућено Scroll up to raise, down to minimize Скролуј горе да повећаш, скролуј доле да минимизујеш Scroll up to minimize, down to raise Скролуј горе да минимизујеш, скролуј доле да повећаш Scroll up to move to next desktop, down to previous Скролуј горе да се помериш на следећи десктоп, скролуј доле на претходни Scroll up to move to previous desktop, down to next Скролуј горе да се помериш на претходни десктоп, скролуј доле на следећи Current Тренутни Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_sv.desktop.yaml ================================================ Desktop Entry/Name: "Aktivitetsfält" Desktop Entry/Comment: "Växla mellan körande program" ================================================ FILE: plugin-taskbar/translations/taskbar_sv.ts ================================================ LXQtTaskBar Activate task %1 Aktivt fönster %1 LXQtTaskButton Application Program To &Desktop Flytta till annat &skrivbord &All Desktops &Alla skrivbord Desktop &%1 Skrivbord &%1 &To Current Desktop &Till nuvarande skrivbord Move To N&ext Monitor Flytta till n&ästa skärm Move To &Previous Monitor Flytta till &förra skärm &Move &Flytta Resi&ze Ändr&a storlek Ma&ximize Ma&ximera Maximize vertically Maximera vertikalt Maximize horizontally Maximera horisontalt &Restore &Återställ Mi&nimize Mi&nimera Roll down Rulla ner Roll up Rulla upp &Layer &Lager Always on &top Alltid &överst &Normal &Normal Always on &bottom Alltid &underst &Close &Stäng LXQtTaskGroup Group Grupp Close group Stäng grupp LXQtTaskbarConfiguration Task Manager Settings Hantera aktivitetsfältet General Allmänt Show only windows from desktop Visa endast fönster skrivbord Show only windows from &panel's screen Visa endast fönster från pa&nelens bildskärm Show only minimized windows Visa endast minimerade fönster Raise minimized windows on current desktop Vid växling av skrivbord så höjs dess minimerade fönster Close on middle-click Stäng med mitten-klick Comma separated list of window classes Komma-separerad lista med fönsterklasser Exclude from taskbar Exkludera från panelen Cycle windows on wheel scrolling Växla fönster Window &grouping Gruppera &fönster Show popup on mouse hover Visa popup vid när musen hålls över programgrupp Appearance Utseende Button style Knappstil Maximum button width Maximal bredd på knapparna px px Mouse Wheel Mushjul Wheel Delta Threshold Tröskelvärde för hjuldelta Put buttons of the same class next to each other Placera knappar av samma klass bredvid varandra Maximum button height Maximal knapphöjd Auto&rotate buttons when the panel is vertical Rotera knapparna &automatiskt när panelen är vertikal Use icons by WindowClass, if available Använd WindowClass-ikoner om de finns Icon and text Ikon och text Only icon Endast ikon Only text Endast text Disabled Deaktiverad Scroll up to raise, down to minimize Rulla ↑ för att höja, ↓ för att minimera Scroll up to minimize, down to raise Rulla ↑ för att minimera, ↓ för att höja Scroll up to move to next desktop, down to previous Rulla ↑ för att flytta till nästa skrivbord, ↓ till förrgående Scroll up to move to previous desktop, down to next Rulla ↑ för att flytta till förrgående skrivbord, ↓ till nästa Current Aktivt Desktop %1 Skrivbord %1 ================================================ FILE: plugin-taskbar/translations/taskbar_th.desktop.yaml ================================================ Desktop Entry/Name: "ตัวจัดการงาน" Desktop Entry/Comment: "สลับใช้งานระหว่างโปรแกรมที่เปิดอยู่" ================================================ FILE: plugin-taskbar/translations/taskbar_th_TH.ts ================================================ LXQtTaskBar Activate task %1 LXQtTaskButton Application โปรแกรม To &Desktop ไปยัง &พ&ื&้นโต๊ะ &All Desktops &ท&ุกพื้นโต๊ะ Desktop &%1 พื้นโต๊ะ &%1 &To Current Desktop &ไปยังพื้นโต๊ะปัจจุบัน Move To N&ext Monitor Move To &Previous Monitor &Move Resi&ze Ma&ximize &ขยายแผ่ Maximize vertically ขยายแผ่ทางแนวตั้ง Maximize horizontally ขยายแผ่ทางแนวนอน &Restore &ค&ืนสภาพ Mi&nimize &ย&่อเก็บ Roll down ม้วนลง Roll up ม้วนขึ้น &Layer &ลำดับชั้น Always on &top ด้าน&หน้าเสมอ &Normal &ปกติ Always on &bottom ด้านหลัง&งเสมอ &Close ปิ&ด LXQtTaskGroup Group Close group LXQtTaskbarConfiguration Task Manager Settings General Show only windows from desktop Show only windows from &panel's screen Show only minimized windows Raise minimized windows on current desktop Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling Window &grouping Show popup on mouse hover Appearance Maximum button width px Mouse Wheel Wheel Delta Threshold Put buttons of the same class next to each other Maximum button height Use icons by WindowClass, if available Auto&rotate buttons when the panel is vertical Button style รูปแบบปุ่ม Close on middle-click ปิดด้วยการคลิกปุ่มกลาง Icon and text ไอคอนและข้อความ Only icon ไอคอนเท่านั้น Only text ข้อความเท่านั้น Disabled Scroll up to raise, down to minimize Scroll up to minimize, down to raise Scroll up to move to next desktop, down to previous Scroll up to move to previous desktop, down to next Current Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_tr.desktop.yaml ================================================ Desktop Entry/Name: "Görev Yöneticisi" Desktop Entry/Comment: "Çalışan uygulamalar arasında geçiş yapın" ================================================ FILE: plugin-taskbar/translations/taskbar_tr.ts ================================================ LXQtTaskBar Activate task %1 %1 görevini etkinleştir LXQtTaskButton Application Uygulama To &Desktop &Masaüstüne &All Desktops &Tüm Masaüstleri Desktop &%1 Masaüstü &%1 &To Current Desktop &Şimdiki Masaüstüne Move To N&ext Monitor Sonraki &Ekrana Taşı Move To &Previous Monitor Önceki Ekrana Taşı &Move &Taşı Resi&ze &Yeniden Boyutlandır Ma&ximize Bü&yüt Maximize vertically Dikey büyüt Maximize horizontally Yatay büyüt &Restore &Geri Yükle Mi&nimize Kü&çült Roll down Aşağı indir Roll up Yukarı çıkar &Layer &Katman Always on &top Her zaman &üstte &Normal &Normal Always on &bottom Her zaman &altta &Close &Kapat LXQtTaskGroup Group Grup Close group Grubu kapat LXQtTaskbarConfiguration Task Manager Settings Görev Yöneticisi Ayarları General Genel Show only windows from desktop Sadece masaüstünden pencereleri göster Show only windows from &panel's screen Sadece &panel ekranından pencereleri göster Show only minimized windows Sadece simge durumuna küçültülmüş pencereleri göster Raise minimized windows on current desktop Geçerli masaüstündeki pencereleri aç Comma separated list of window classes Pencere sınıflarının virgülle ayrılmış listesi Exclude from taskbar Görev çubuğundan hariç tut Cycle windows on wheel scrolling Tekerleği kaydırırken pencereleri döndür Window &grouping Pencereleri &gruplama Show popup on mouse hover Fare üzerine geldiğinde açılır pencereyi göster Appearance Görünüm Maximum button width Maksimum düğme genişliği px px Mouse Wheel Fare Tekeri Wheel Delta Threshold Tekerlek Delta Eşiği Put buttons of the same class next to each other Aynı sınıftaki düğmeleri yan yana koyun Maximum button height Maksimum düğme yüksekliği Use icons by WindowClass, if available Mümkün ise pencere tarafından sağlanan simgeyi kullan Auto&rotate buttons when the panel is vertical Panel dikey olduğunda düğmeleri otomatik &döndür Button style Düğme biçemi Close on middle-click Orta tıklama ile kapat Icon and text Simge ve metin Only icon Sadece simge Only text Sadece metin Disabled Kapalı Scroll up to raise, down to minimize Yükseltmek için yukarı, kültmek için aşağı kaydırın Scroll up to minimize, down to raise Küçültmek için yukarı, yükseltmek için aşağı kaydırın Scroll up to move to next desktop, down to previous Bir sonraki masaüstüne gitmek için yukarı, bir öncekine gitmek için aşağı kaydırın Scroll up to move to previous desktop, down to next Bir önceki masaüstüne gitmek için yukarı, bir sonrakine gitmek için aşağı kaydırın Current Mevcut Desktop %1 Masaüstü %1 ================================================ FILE: plugin-taskbar/translations/taskbar_uk.desktop.yaml ================================================ Desktop Entry/Name: "Менеджер завдань" Desktop Entry/Comment: "Перемикання між запущеними застосунками" ================================================ FILE: plugin-taskbar/translations/taskbar_uk.ts ================================================ LXQtTaskBar Activate task %1 Запустити завдання %1 LXQtTaskButton Application Програма To &Desktop На &стільницю &All Desktops На &всі стільниці Desktop &%1 Стільниця &%1 &To Current Desktop На &поточну стільницю Move To N&ext Monitor Перемістити на н&аступний монітор Move To &Previous Monitor Перемістити до &попереднього монітора &Move &Перемістити Resi&ze &Змінмти розмір Ma&ximize Ма&ксимізувати Maximize vertically Максимізувати вертикально Maximize horizontally Максимізувати горизонтально &Restore &Розгорнути Mi&nimize &Згорнути Roll down Посунути вниз Roll up Посунути вгору &Layer &Шар Always on &top Завжди з&гори &Normal &Типово Always on &bottom Завжди з&низу &Close З&акрити LXQtTaskGroup Group Група Close group Закрити групу LXQtTaskbarConfiguration Task Manager Settings Налаштування менеджера завдань General Загальне Show only windows from desktop Показати лише вікна зі стільниці Show only windows from &panel's screen Показати лише вікна з екрана &панелі Show only minimized windows Показати лише згорнуті вікна Raise minimized windows on current desktop Розгорнути мінімізовані вікна на поточній стільниці Comma separated list of window classes Список класів вікон, розділений комами Exclude from taskbar Виключити з панелі завдань Cycle windows on wheel scrolling Перемикання між вікнами прокруткою коліщатка Window &grouping Групування &вікон Show popup on mouse hover Попередній перегляд наведенням миші Appearance Вигляд Maximum button width Максимальний розмір кнопки px px Mouse Wheel Коліщатко миші Wheel Delta Threshold Поріг чутливості коліщатка Put buttons of the same class next to each other Розміщувати кнопки одного класу поруч Maximum button height Найбільша висота кнопки Use icons by WindowClass, if available Використовувати піктограми за WindowClass, якщо доступні Auto&rotate buttons when the panel is vertical Авто&повертати кнопки коли панель є вертикальна Button style Стиль кнопок Close on middle-click Закривати по середній кнопці миші Icon and text Піктограма та текст Only icon Лише піктограма Only text Лише текст Disabled Вимкнено Scroll up to raise, down to minimize Прокрутити вгору, щоб відновити, вниз, щоб згорнути Scroll up to minimize, down to raise Прокрутити вгору, щоб згорнути, вниз, щоб відновити Scroll up to move to next desktop, down to previous Прокрутити вгору, щоб перемістити на наступну стільницю, вниз — на попередню Scroll up to move to previous desktop, down to next Прокрутити вгору, щоб перемістити на попередню стільницю, вниз — на наступну Current Поточне Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "任务管理器" Desktop Entry/Comment: "在运行的程序间切换" ================================================ FILE: plugin-taskbar/translations/taskbar_zh_CN.ts ================================================ LXQtTaskBar Activate task %1 激活任务 %1 LXQtTaskButton Application 应用程序 To &Desktop 转到桌面(&D) &All Desktops 全部桌面(&A) Desktop &%1 桌面 &%1 &To Current Desktop 转到当前桌面(&T) Move To N&ext Monitor 转移到下一个显示器 Move To &Previous Monitor 移动到上一个屏幕(&P) &Move 移动(&M) Resi&ze 更改大小(Z) Ma&ximize 最大化(&X) Maximize vertically 垂直最大化 Maximize horizontally 水平最大化 &Restore 恢复(&R) Mi&nimize 最小化(&N) Roll down 卷下 Roll up 卷上 &Layer 层(&L) Always on &top 总在顶层(&T) &Normal 正常(&N) Always on &bottom 总在底层(&B) &Close 关闭(&C) LXQtTaskGroup Group Close group 关闭组 LXQtTaskbarConfiguration Task Manager Settings 任务管理器设置 General 常规 Show only windows from desktop 只显示此桌面上的窗口 Show only windows from &panel's screen 只显示面板屏幕上的窗口(&P) Show only minimized windows 只显示最小化的窗口 Raise minimized windows on current desktop 提升当前桌面的最小化窗口 Comma separated list of window classes Exclude from taskbar Cycle windows on wheel scrolling 转动鼠标滚轮切换窗口 Window &grouping 窗口分组(&G) Show popup on mouse hover 鼠标移过弹出菜单 Appearance 外观 Maximum button width 最大按钮宽度 px Mouse Wheel 鼠标滚轮 Wheel Delta Threshold 滚轮增量阈值 Put buttons of the same class next to each other 将相同类型的按钮相邻放置 Maximum button height 最大按钮高度 Use icons by WindowClass, if available 如果可用,使用 WindowClass 提供的图标 Auto&rotate buttons when the panel is vertical 纵置面板时自动旋转按钮(&R) Button style 按钮样式 Close on middle-click 鼠标中击时关闭 Icon and text 图标和文字 Only icon 仅图标 Only text 仅文字 Disabled 已禁用 Scroll up to raise, down to minimize 向上滚动显示窗口,向下滚动最小化 Scroll up to minimize, down to raise 向上滚动最小化,向下滚动显示窗口 Scroll up to move to next desktop, down to previous 向上滚动移至下一个桌面,向下滚动移至上一个 Scroll up to move to previous desktop, down to next 向上滚动移至上一个桌面,向下滚动移至下一个 Current 当前桌面 Desktop %1 ================================================ FILE: plugin-taskbar/translations/taskbar_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "工作管理員" Desktop Entry/Comment: "在正在運行程式中切換" ================================================ FILE: plugin-taskbar/translations/taskbar_zh_TW.ts ================================================ LXQtTaskBar Activate task %1 啟動任務 %1 LXQtTaskButton Application 應用程式 To &Desktop 至桌面(&D) &All Desktops 全部桌面(&A) Desktop &%1 桌面 &%1 &To Current Desktop 至目前桌面(&T) Move To N&ext Monitor 移至下一個顯示器(&E) Move To &Previous Monitor 移至上一個顯示器(&P) &Move 移動(&M) Resi&ze 調整大小(&Z) Ma&ximize 最大化(&X) Maximize vertically 垂直最大化 Maximize horizontally 水平最大化 &Restore 還原(&R) Mi&nimize 最小化(&n) Roll down 捲下 Roll up 捲上 &Layer 層(&L) Always on &top 總是在最上層(&t) &Normal 正常(&N) Always on &bottom 總是在最底層(&b) &Close 關閉(&C) LXQtTaskGroup Group 群組 Close group 關閉群組 LXQtTaskbarConfiguration Task Manager Settings 工作管理員設定 General 通則 Show only windows from desktop 僅顯示桌面上的視窗 Show only windows from &panel's screen 僅顯示面板視窗(&P) Show only minimized windows 僅顯示最小化視窗 Raise minimized windows on current desktop 在目前桌面展開最小化的視窗 Comma separated list of window classes 逗號分隔的視窗類別列表 Exclude from taskbar 從工作列排除 Cycle windows on wheel scrolling 滾動滾輪時循環顯示視窗 Window &grouping 視窗群組(&G) Show popup on mouse hover 當滑鼠懸停時顯示彈出窗框 Appearance 外觀 Maximum button width 最大按鈕寬度 px 像素 Mouse Wheel 滑鼠滾輪 Wheel Delta Threshold 滾輪位移臨界值 Delta Threshold Put buttons of the same class next to each other 將相同類別的視窗按鈕相鄰擺放 Maximum button height 按鈕高度最大化 Use icons by WindowClass, if available 若是可用,依照 WindowClass 使用圖示 Auto&rotate buttons when the panel is vertical 當面板垂直時自動旋轉按鈕(&R) Button style 按鈕樣式 Close on middle-click 按滑鼠中鍵關閉 Icon and text 圖示與文字 Only icon 僅圖示 Only text 僅文字 Disabled 不做任何事 Scroll up to raise, down to minimize 向上滾顯示視窗,向下滾最小化 Scroll up to minimize, down to raise 向上滾最小化,向下滾顯示視窗 Scroll up to move to next desktop, down to previous 向上滾移動到下一個桌面,向下滾則移動到前一個 Scroll up to move to previous desktop, down to next 向上滾移動到前一個桌面,向下滾則移動到下一個 Current 目前 Desktop %1 桌面 %1 ================================================ FILE: plugin-tray/CMakeLists.txt ================================================ set(PLUGIN "tray") include(CheckLibraryExists) find_package(XCB REQUIRED COMPONENTS XCB XFIXES DAMAGE COMPOSITE RANDR SHM UTIL IMAGE SHAPE ) find_package(PkgConfig) pkg_check_modules(xtst REQUIRED xtst) set(HEADERS xtestsender.h xcbutils.h sniproxy.h snidbus.h fdoselectionmanager.h lxqttrayplugin.h ) set(SOURCES xtestsender.cpp sniproxy.cpp snidbus.cpp fdoselectionmanager.cpp lxqttrayplugin.cpp ) qt_add_dbus_adaptor(SOURCES org.kde.StatusNotifierItem.xml sniproxy.h SNIProxy) qt_add_dbus_interface(SOURCES org.kde.StatusNotifierWatcher.xml statusnotifierwatcher_interface) set(LIBRARIES ${XCB_LIBRARIES} ${xtst_LDFLAGS} ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-tray/fdoselectionmanager.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2019 Konrad Materka * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "fdoselectionmanager.h" #include #include #include #include #include #include // For nativeInterface() #include #include #include #include #include "sniproxy.h" #include "xcbutils.h" //NOTE: Xlib.h defines Bool which conflicts with QJsonValue::Type enum #include #undef Bool #undef Status #define SYSTEM_TRAY_REQUEST_DOCK 0 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 #define SYSTEM_TRAY_CANCEL_MESSAGE 2 FdoSelectionManager::FdoSelectionManager() : m_atoms{nullptr} , m_selectionOwner{nullptr} { auto *x11Application = qGuiApp->nativeInterface(); Q_ASSERT_X(x11Application, "FdoSelectionManager", "Expected X11 connection"); m_connection = x11Application->connection(); m_atoms.reset(new Xcb::Atoms(m_connection, XDefaultScreen(x11Application->display()))); m_selectionOwner = new KSelectionOwner{m_atoms->selectionAtom, -1, this}; qDebug() << "starting"; // we may end up calling QCoreApplication::quit() in this method, at which point we need the event loop running QTimer::singleShot(0, this, &FdoSelectionManager::init); } FdoSelectionManager::~FdoSelectionManager() { qDebug() << "closing"; for (auto p_i = m_proxies.begin(); p_i != m_proxies.end(); p_i = m_proxies.begin()) { undock(p_i.key(), false); } m_selectionOwner->release(); } void FdoSelectionManager::init() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); // load damage extension xcb_prefetch_extension_data(m_connection, &xcb_damage_id); const auto *reply = xcb_get_extension_data(m_connection, &xcb_damage_id); if (reply && reply->present) { m_damageEventBase = reply->first_event; xcb_damage_query_version_unchecked(m_connection, XCB_DAMAGE_MAJOR_VERSION, XCB_DAMAGE_MINOR_VERSION); } else { // no XDamage means qCritical() << "could not load damage extension. Quitting"; return; } qApp->installNativeEventFilter(this); connect(m_selectionOwner, &KSelectionOwner::claimedOwnership, this, &FdoSelectionManager::onClaimedOwnership); connect(m_selectionOwner, &KSelectionOwner::failedToClaimOwnership, this, &FdoSelectionManager::onFailedToClaimOwnership); connect(m_selectionOwner, &KSelectionOwner::lostOwnership, this, &FdoSelectionManager::onLostOwnership); m_selectionOwner->claim(false); } bool FdoSelectionManager::addDamageWatch(xcb_window_t client) { qDebug() << "adding damage watch for " << client; const auto attribsCookie = xcb_get_window_attributes_unchecked(m_connection, client); const auto damageId = xcb_generate_id(m_connection); m_damageWatches[client] = damageId; xcb_damage_create(m_connection, damageId, client, XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY); xcb_generic_error_t *error = nullptr; Xcb::ScopedCPointer attr(xcb_get_window_attributes_reply(m_connection, attribsCookie, &error)); Xcb::ScopedCPointer getAttrError(error); uint32_t events = XCB_EVENT_MASK_STRUCTURE_NOTIFY; if (attr) { events = events | attr->your_event_mask; } // if window is already gone, there is no need to handle it. if (getAttrError && getAttrError->error_code == XCB_WINDOW) { return false; } // the event mask will not be removed again. We cannot track whether another component also needs STRUCTURE_NOTIFY (e.g. KWindowSystem). // if we would remove the event mask again, other areas will break. const auto changeAttrCookie = xcb_change_window_attributes_checked(m_connection, client, XCB_CW_EVENT_MASK, &events); Xcb::ScopedCPointer changeAttrError(xcb_request_check(m_connection, changeAttrCookie)); // if window is gone by this point, it will be caught by eventFilter, so no need to check later errors. if (changeAttrError && changeAttrError->error_code == XCB_WINDOW) { return false; } return true; } bool FdoSelectionManager::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) { Q_UNUSED(result) if (eventType != "xcb_generic_event_t") { return false; } xcb_generic_event_t *ev = static_cast(message); const auto responseType = XCB_EVENT_RESPONSE_TYPE(ev); if (responseType == XCB_CLIENT_MESSAGE) { const auto ce = reinterpret_cast(ev); if (ce->type == m_atoms->opcodeAtom) { switch (ce->data.data32[1]) { case SYSTEM_TRAY_REQUEST_DOCK: dock(ce->data.data32[2]); return true; } } } else if (responseType == XCB_UNMAP_NOTIFY) { const auto unmappedWId = reinterpret_cast(ev)->window; if (m_proxies.contains(unmappedWId)) { undock(unmappedWId, true); } } else if (responseType == XCB_DESTROY_NOTIFY) { const auto destroyedWId = reinterpret_cast(ev)->window; if (m_proxies.contains(destroyedWId)) { undock(destroyedWId, true); } } else if (responseType == m_damageEventBase + XCB_DAMAGE_NOTIFY) { const auto damagedWId = reinterpret_cast(ev)->drawable; const auto sniProxy = m_proxies.value(damagedWId); if (sniProxy) { sniProxy->update(); xcb_damage_subtract(m_connection, m_damageWatches[damagedWId], XCB_NONE, XCB_NONE); } } else if (responseType == XCB_CONFIGURE_REQUEST) { const auto event = reinterpret_cast(ev); const auto sniProxy = m_proxies.value(event->window); if (sniProxy) { // The embedded window tries to move or resize. Ignore move, handle resize only. if ((event->value_mask & XCB_CONFIG_WINDOW_WIDTH) || (event->value_mask & XCB_CONFIG_WINDOW_HEIGHT)) { sniProxy->resizeWindow(event->width, event->height); } } } else if (responseType == XCB_VISIBILITY_NOTIFY) { const auto event = reinterpret_cast(ev); // it's possible that something showed our container window, we have to hide it // workaround for BUG 357443: when KWin is restarted, container window is shown on top if (event->state == XCB_VISIBILITY_UNOBSCURED) { for (auto sniProxy : m_proxies.values()) { sniProxy->hideContainerWindow(event->window); } } } return false; } void FdoSelectionManager::dock(xcb_window_t winId) { qDebug() << "trying to dock window " << winId; if (m_proxies.contains(winId)) { return; } if (addDamageWatch(winId)) { m_proxies[winId] = new SNIProxy(winId, *m_atoms, this); } } void FdoSelectionManager::undock(xcb_window_t winId, bool vanished) { qDebug() << "trying to undock window " << winId; auto p_i = m_proxies.find(winId); if (p_i == m_proxies.end()) { return; } auto d_i = m_damageWatches.find(winId); if (d_i != m_damageWatches.end()) { if (!vanished) { xcb_damage_destroy(m_connection, *d_i); } m_damageWatches.erase(d_i); } (*p_i)->vanished(vanished); (*p_i)->deleteLater(); m_proxies.erase(p_i); } void FdoSelectionManager::onClaimedOwnership() { qDebug() << "Manager selection claimed"; setSystemTrayVisual(); } void FdoSelectionManager::onFailedToClaimOwnership() { qWarning() << "failed to claim ownership of Systray Manager"; } void FdoSelectionManager::onLostOwnership() { qWarning() << "lost ownership of Systray Manager"; } void FdoSelectionManager::setSystemTrayVisual() { auto screen = xcb_setup_roots_iterator(xcb_get_setup(m_connection)).data; auto trayVisual = screen->root_visual; xcb_depth_iterator_t depth_iterator = xcb_screen_allowed_depths_iterator(screen); xcb_depth_t *depth = nullptr; while (depth_iterator.rem) { if (depth_iterator.data->depth == 32) { depth = depth_iterator.data; break; } xcb_depth_next(&depth_iterator); } if (depth) { xcb_visualtype_iterator_t visualtype_iterator = xcb_depth_visuals_iterator(depth); while (visualtype_iterator.rem) { xcb_visualtype_t *visualtype = visualtype_iterator.data; if (visualtype->_class == XCB_VISUAL_CLASS_TRUE_COLOR) { trayVisual = visualtype->visual_id; break; } xcb_visualtype_next(&visualtype_iterator); } } xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_selectionOwner->ownerWindow(), m_atoms->visualAtom, XCB_ATOM_VISUALID, 32, 1, &trayVisual); } ================================================ FILE: plugin-tray/fdoselectionmanager.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include #include #include class KSelectionOwner; class SNIProxy; namespace Xcb { class Atoms; } class FdoSelectionManager : public QObject, public QAbstractNativeEventFilter { Q_OBJECT public: FdoSelectionManager(); ~FdoSelectionManager() override; protected: bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override; private Q_SLOTS: void onClaimedOwnership(); void onFailedToClaimOwnership(); void onLostOwnership(); private: void init(); bool addDamageWatch(xcb_window_t client); void dock(xcb_window_t embed_win); void undock(xcb_window_t client, bool vanished); void setSystemTrayVisual(); uint8_t m_damageEventBase; xcb_connection_t *m_connection; QHash m_damageWatches; QHash m_proxies; std::unique_ptr m_atoms; KSelectionOwner *m_selectionOwner; }; ================================================ FILE: plugin-tray/lxqttrayplugin.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * 2022 LXQt team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqttrayplugin.h" #include "fdoselectionmanager.h" #include // For nativeInterface() LXQtTrayPlugin::LXQtTrayPlugin(const ILXQtPanelPluginStartupInfo &startupInfo) : QObject() , ILXQtPanelPlugin(startupInfo) , mManager{new FdoSelectionManager} { } LXQtTrayPlugin::~LXQtTrayPlugin() { } QWidget *LXQtTrayPlugin::widget() { return nullptr; } ILXQtPanelPlugin *LXQtTrayPluginLibrary::instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { auto *x11Application = qGuiApp->nativeInterface(); if(!x11Application || !x11Application->connection()) { // Currently only X11 supported qWarning() << "Currently tray plugin supports X11 only. Skipping."; return nullptr; } return new LXQtTrayPlugin(startupInfo); } ================================================ FILE: plugin-tray/lxqttrayplugin.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2013 Razor team * 2022 LXQt team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include "../panel/ilxqtpanelplugin.h" #include #include class FdoSelectionManager; class LXQtTrayPlugin : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: explicit LXQtTrayPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtTrayPlugin(); virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("Tray"); } virtual Flags flags() const { return PreferRightAlignment | SingleInstance | NeedsHandle; } bool isSeparate() const { return true; } private: std::unique_ptr mManager; }; class LXQtTrayPluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT // Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const; }; ================================================ FILE: plugin-tray/org.kde.StatusNotifierItem.xml ================================================ ================================================ FILE: plugin-tray/org.kde.StatusNotifierWatcher.xml ================================================ ================================================ FILE: plugin-tray/resources/tray.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=go-bottom #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-tray/snidbus.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2019 Konrad Materka * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "snidbus.h" #include #include // mostly copied from KStatusNotifierItemDbus.cpp from knotification KDbusImageStruct::KDbusImageStruct() { } KDbusImageStruct::KDbusImageStruct(const QImage &image) { width = image.size().width(); height = image.size().height(); if (image.format() == QImage::Format_ARGB32) { data = QByteArray((char *)image.bits(), image.sizeInBytes()); } else { QImage image32 = image.convertToFormat(QImage::Format_ARGB32); data = QByteArray((char *)image32.bits(), image32.sizeInBytes()); } // swap to network byte order if we are little endian if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) { quint32 *uintBuf = (quint32 *)data.data(); for (uint i = 0; i < data.size() / sizeof(quint32); ++i) { *uintBuf = qToBigEndian(*uintBuf); ++uintBuf; } } } // Marshall the ImageStruct data into a D-BUS argument const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusImageStruct &icon) { argument.beginStructure(); argument << icon.width; argument << icon.height; argument << icon.data; argument.endStructure(); return argument; } // Retrieve the ImageStruct data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusImageStruct &icon) { qint32 width; qint32 height; QByteArray data; argument.beginStructure(); argument >> width; argument >> height; argument >> data; argument.endStructure(); icon.width = width; icon.height = height; icon.data = data; return argument; } // Marshall the ImageVector data into a D-BUS argument const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusImageVector &iconVector) { argument.beginArray(qMetaTypeId()); for (int i = 0; i < iconVector.size(); ++i) { argument << iconVector[i]; } argument.endArray(); return argument; } // Retrieve the ImageVector data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusImageVector &iconVector) { argument.beginArray(); iconVector.clear(); while (!argument.atEnd()) { KDbusImageStruct element; argument >> element; iconVector.append(element); } argument.endArray(); return argument; } // Marshall the ToolTipStruct data into a D-BUS argument const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusToolTipStruct &toolTip) { argument.beginStructure(); argument << toolTip.icon; argument << toolTip.image; argument << toolTip.title; argument << toolTip.subTitle; argument.endStructure(); return argument; } // Retrieve the ToolTipStruct data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusToolTipStruct &toolTip) { QString icon; KDbusImageVector image; QString title; QString subTitle; argument.beginStructure(); argument >> icon; argument >> image; argument >> title; argument >> subTitle; argument.endStructure(); toolTip.icon = icon; toolTip.image = image; toolTip.title = title; toolTip.subTitle = subTitle; return argument; } ================================================ FILE: plugin-tray/snidbus.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include #include #include // Custom message type for DBus struct KDbusImageStruct { KDbusImageStruct(); KDbusImageStruct(const QImage &image); int width; int height; QByteArray data; }; typedef QList KDbusImageVector; struct KDbusToolTipStruct { QString icon; KDbusImageVector image; QString title; QString subTitle; }; const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusImageStruct &icon); const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusImageStruct &icon); Q_DECLARE_METATYPE(KDbusImageStruct) const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusImageVector &iconVector); const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusImageVector &iconVector); Q_DECLARE_METATYPE(KDbusImageVector) const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusToolTipStruct &toolTip); const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusToolTipStruct &toolTip); Q_DECLARE_METATYPE(KDbusToolTipStruct) ================================================ FILE: plugin-tray/sniproxy.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2019 Konrad Materka * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "sniproxy.h" #include #include #include #include #include #include #include #include #include #include "kwindowinfo.h" #include "statusnotifieritemadaptor.h" #include "statusnotifierwatcher_interface.h" #include "xtestsender.h" #include #include #include "xcbutils.h" //NOTE: Xlib.h defines Bool which conflicts with QJsonValue::Type enum #include #undef Bool #undef Status //#define VISUAL_DEBUG #define SNI_WATCHER_SERVICE_NAME "org.kde.StatusNotifierWatcher" #define SNI_WATCHER_PATH "/StatusNotifierWatcher" static uint16_t s_embedSize = 128; // size of window to embed static unsigned int XEMBED_VERSION = 0; int SNIProxy::s_serviceCount = 0; void xembed_message_send(xcb_connection_t *conn, Xcb::Atoms & atoms, xcb_window_t towin, long message, long d1, long d2, long d3) { xcb_client_message_event_t ev; ev.response_type = XCB_CLIENT_MESSAGE; ev.window = towin; ev.format = 32; ev.data.data32[0] = XCB_CURRENT_TIME; ev.data.data32[1] = message; ev.data.data32[2] = d1; ev.data.data32[3] = d2; ev.data.data32[4] = d3; ev.type = atoms.xembedAtom; xcb_send_event(conn, false, towin, XCB_EVENT_MASK_NO_EVENT, (char *)&ev); } static QRect findOpaqueArea(const QImage & image, int margin = 0) { int w = image.width(); int h = image.height(); int left = image.width(), right = 0, top = image.height(), bottom = 0; for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { if (qAlpha(image.pixel(x, y))) { // Found an opaque pixel. if (x < left) left = x; if (x > right) right = x; if (y < top) top = y; if (y > bottom) bottom = y; } } } QRect r{QPoint{left - margin, top - margin}, QPoint{right + margin, bottom + margin}}; return r; } SNIProxy::SNIProxy(xcb_window_t wid, Xcb::Atoms & atoms, QObject *parent) : QObject(parent) , // Work round a bug in our SNIWatcher with multiple SNIs per connection. // there is an undocumented feature that you can register an SNI by path, however it doesn't detect an object on a service being removed, only the entire // service closing instead lets use one DBus connection per SNI m_dbus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, QStringLiteral("XembedSniProxy%1").arg(s_serviceCount++))) , m_connection(nullptr) , m_windowId(wid) , sendingClickEvent(false) , m_injectMode(Direct) , m_atoms{atoms} { auto *x11Application = qGuiApp->nativeInterface(); Q_ASSERT_X(x11Application, "SNIProxy", "Expected X11 connection"); m_connection = x11Application->connection(); resizeWindow(s_embedSize, s_embedSize); // create new SNI new StatusNotifierItemAdaptor(this); m_dbus.registerObject(QStringLiteral("/StatusNotifierItem"), this); auto statusNotifierWatcher = new org::kde::StatusNotifierWatcher(QStringLiteral(SNI_WATCHER_SERVICE_NAME), QStringLiteral(SNI_WATCHER_PATH), QDBusConnection::sessionBus(), this); auto reply = statusNotifierWatcher->RegisterStatusNotifierItem(m_dbus.baseService()); reply.waitForFinished(); if (reply.isError()) { qWarning() << "could not register SNI:" << reply.error().message(); } // create a container window auto screen = xcb_setup_roots_iterator(xcb_get_setup(m_connection)).data; m_containerWid = xcb_generate_id(m_connection); uint32_t values[3]; uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK; values[0] = screen->black_pixel; // draw a solid background so the embedded icon doesn't get garbage in it values[1] = true; // bypass wM values[2] = XCB_EVENT_MASK_VISIBILITY_CHANGE | // receive visibility change, to handle KWin restart #357443 // Redirect and handle structure (size, position) requests from the embedded window. XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT; xcb_create_window(m_connection, /* connection */ XCB_COPY_FROM_PARENT, /* depth */ m_containerWid, /* window Id */ screen->root, /* parent window */ 0, 0, /* x, y */ s_embedSize, s_embedSize, /* width, height */ 0, /* border_width */ XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */ screen->root_visual, /* visual */ mask, values); /* masks */ /* We need the window to exist and be mapped otherwise the child won't render it's contents We also need it to exist in the right place to get the clicks working as GTK will check sendEvent locations to see if our window is in the right place. So even though our contents are drawn via compositing we still put this window in the right place We can't composite it away anything parented owned by the root window (apparently) Stack Under works in the non composited case, but it doesn't seem to work in kwin's composited case (probably need set relevant NETWM hint) As a last resort set opacity to 0 just to make sure this container never appears */ #ifndef VISUAL_DEBUG stackContainerWindow(XCB_STACK_MODE_BELOW); NETWinInfo wm(m_connection, m_containerWid, screen->root, NET::Properties(), NET::Properties2()); wm.setOpacity(0); #endif xcb_flush(m_connection); xcb_map_window(m_connection, m_containerWid); xcb_reparent_window(m_connection, m_windowId, m_containerWid, 0, 0); /* * Render the embedded window offscreen */ xcb_composite_redirect_window(m_connection, m_windowId, XCB_COMPOSITE_REDIRECT_MANUAL); /* we grab the window, but also make sure it's automatically reparented back * to the root window if we should die. */ xcb_change_save_set(m_connection, XCB_SET_MODE_INSERT, m_windowId); // tell client we're embedding it xembed_message_send(m_connection, m_atoms, m_windowId, XEMBED_EMBEDDED_NOTIFY, 0, m_containerWid, XEMBED_VERSION); // move window we're embedding const uint32_t windowMoveConfigVals[2] = {0, 0}; xcb_configure_window(m_connection, m_windowId, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, windowMoveConfigVals); QSize clientWindowSize = calculateClientWindowSize(); // show the embedded window otherwise nothing happens xcb_map_window(m_connection, m_windowId); xcb_clear_area(m_connection, 0, m_windowId, 0, 0, clientWindowSize.width(), clientWindowSize.height()); xcb_flush(m_connection); // guess which input injection method to use // we can either send an X event to the client or XTest // some don't support direct X events (GTK3/4), and some don't support XTest because reasons // note also some clients might not have the XTest extension. We may as well assume it does and just fail to send later. // we query if the client selected button presses in the event mask // if the client does supports that we send directly, otherwise we'll use xtest auto waCookie = xcb_get_window_attributes(m_connection, m_windowId); Xcb::ScopedCPointer windowAttributes(xcb_get_window_attributes_reply(m_connection, waCookie, nullptr)); if (windowAttributes && !(windowAttributes->all_event_masks & XCB_EVENT_MASK_BUTTON_PRESS)) { m_injectMode = XTest; } // there's no damage event for the first paint, and sometimes it's not drawn immediately // not ideal, but it works better than nothing // test with xchat before changing QTimer::singleShot(500, this, &SNIProxy::update); } SNIProxy::~SNIProxy() { auto *x11Application = qGuiApp->nativeInterface(); Q_ASSERT_X(x11Application, "SNIProxy", "Expected X11 connection"); WId appRootWindow = XDefaultRootWindow(x11Application->display()); if (!m_vanished) { xcb_reparent_window(m_connection, m_windowId, appRootWindow, 0, 0); } xcb_destroy_window(m_connection, m_containerWid); QDBusConnection::disconnectFromBus(m_dbus.name()); } void SNIProxy::update() { m_windowImage = getImageNonComposite(); if (m_windowImage.isNull()) { m_iconImage = QImage{}; qDebug() << "No xembed icon for" << m_windowId << Title(); return; } m_iconImage = m_windowImage.copy(findOpaqueArea(m_windowImage, 1)); //qDebug() << Title() << "windowImage.size:" << m_windowImage.size() << ", iconImage.size:" << m_iconImage.size(); Q_EMIT NewIcon(); Q_EMIT NewToolTip(); } void SNIProxy::resizeWindow(const uint16_t width, const uint16_t height) const { const uint32_t windowSizeConfigVals[2] = {width, height}; xcb_configure_window(m_connection, m_windowId, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, windowSizeConfigVals); xcb_flush(m_connection); } void SNIProxy::hideContainerWindow(xcb_window_t windowId) const { if (m_containerWid == windowId && !sendingClickEvent) { qDebug() << "Container window visible, stack below"; stackContainerWindow(XCB_STACK_MODE_BELOW); } } QSize SNIProxy::calculateClientWindowSize() const { auto cookie = xcb_get_geometry(m_connection, m_windowId); Xcb::ScopedCPointer clientGeom(xcb_get_geometry_reply(m_connection, cookie, nullptr)); QSize clientWindowSize; if (clientGeom) { clientWindowSize = QSize(clientGeom->width, clientGeom->height); } // if the window is a clearly stupid size resize to be something sensible // this is needed as chromium and such when resized just fill the icon with transparent space and only draw in the middle // however KeePass2 does need this as by default the window size is 273px wide and is not transparent // use an arbitrary heuristic to make sure icons are always sensible if (clientWindowSize.isEmpty() || clientWindowSize.width() > s_embedSize || clientWindowSize.height() > s_embedSize) { qDebug() << "Resizing window" << m_windowId << Title() << "from w*h" << clientWindowSize; resizeWindow(s_embedSize, s_embedSize); clientWindowSize = QSize(s_embedSize, s_embedSize); } return clientWindowSize; } void sni_cleanup_xcb_image(void *data) { xcb_image_destroy(static_cast(data)); } bool SNIProxy::isTransparentImage(const QImage &image) const { int w = image.width(); int h = image.height(); // check for the center and sub-center pixels first and avoid full image scan if (!(qAlpha(image.pixel(w >> 1, h >> 1)) + qAlpha(image.pixel(w >> 2, h >> 2)) == 0)) return false; // skip scan altogether if sub-center pixel found to be opaque // and break out from the outer loop too on full scan for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { if (qAlpha(image.pixel(x, y))) { // Found an opaque pixel. return false; } } } return true; } QImage SNIProxy::getImageNonComposite() const { QSize clientWindowSize = calculateClientWindowSize(); xcb_image_t *image = xcb_image_get(m_connection, m_windowId, 0, 0, clientWindowSize.width(), clientWindowSize.height(), 0xFFFFFFFF, XCB_IMAGE_FORMAT_Z_PIXMAP); // Don't hook up cleanup yet, we may use a different QImage after all QImage naiveConversion; if (image) { naiveConversion = QImage(image->data, image->width, image->height, QImage::Format_ARGB32); } else { qDebug() << "Skip NULL image returned from xcb_image_get() for" << m_windowId << Title(); return QImage(); } if (isTransparentImage(naiveConversion)) { QImage elaborateConversion = QImage(convertFromNative(image)); // Update icon only if it is at least partially opaque. // This is just a workaround for X11 bug: xembed icon may suddenly // become transparent for a one or few frames. Reproducible at least // with WINE applications. if (isTransparentImage(elaborateConversion)) { qDebug() << "Skip transparent xembed icon for" << m_windowId << Title(); return QImage(); } else return elaborateConversion; } else { // Now we are sure we can eventually delete the xcb_image_t with this version return QImage(image->data, image->width, image->height, image->stride, QImage::Format_ARGB32, sni_cleanup_xcb_image, image); } } QImage SNIProxy::convertFromNative(xcb_image_t *xcbImage) const { QImage::Format format = QImage::Format_Invalid; switch (xcbImage->depth) { case 1: format = QImage::Format_MonoLSB; break; case 16: format = QImage::Format_RGB16; break; case 24: format = QImage::Format_RGB32; break; case 30: { // Qt doesn't have a matching image format. We need to convert manually quint32 *pixels = reinterpret_cast(xcbImage->data); for (uint i = 0; i < (xcbImage->size / 4); i++) { int r = (pixels[i] >> 22) & 0xff; int g = (pixels[i] >> 12) & 0xff; int b = (pixels[i] >> 2) & 0xff; pixels[i] = qRgba(r, g, b, 0xff); } // fall through, Qt format is still Format_ARGB32_Premultiplied Q_FALLTHROUGH(); } case 32: format = QImage::Format_ARGB32_Premultiplied; break; default: return QImage(); // we don't know } QImage image(xcbImage->data, xcbImage->width, xcbImage->height, xcbImage->stride, format, sni_cleanup_xcb_image, xcbImage); if (image.isNull()) { return QImage(); } if (format == QImage::Format_RGB32 && xcbImage->bpp == 32) { QImage m = image.createHeuristicMask(); QBitmap mask = QBitmap::fromImage(m); QPixmap p = QPixmap::fromImage(image); p.setMask(mask); image = p.toImage(); } // work around an abort in QImage::color if (image.format() == QImage::Format_MonoLSB) { image.setColorCount(2); image.setColor(0, QColor(Qt::white).rgb()); image.setColor(1, QColor(Qt::black).rgb()); } return image; } /* Wine is using XWindow Shape Extension for transparent tray icons. We need to find first clickable point starting from top-left. */ QPoint SNIProxy::calculateClickPoint() const { QPoint clickPoint = QPoint(0, 0); // request extent to check if shape has been set xcb_shape_query_extents_cookie_t extentsCookie = xcb_shape_query_extents(m_connection, m_windowId); // at the same time make the request for rectangles (even if this request isn't needed) xcb_shape_get_rectangles_cookie_t rectaglesCookie = xcb_shape_get_rectangles(m_connection, m_windowId, XCB_SHAPE_SK_BOUNDING); Xcb::ScopedCPointer extentsReply(xcb_shape_query_extents_reply(m_connection, extentsCookie, nullptr)); Xcb::ScopedCPointer rectanglesReply(xcb_shape_get_rectangles_reply(m_connection, rectaglesCookie, nullptr)); if (!extentsReply || !rectanglesReply || !extentsReply->bounding_shaped) { return clickPoint; } xcb_rectangle_t *rectangles = xcb_shape_get_rectangles_rectangles(rectanglesReply.get()); if (!rectangles) { return clickPoint; } double minLength = sqrt(pow(m_windowImage.height(), 2) + pow(m_windowImage.width(), 2)); const int nRectangles = xcb_shape_get_rectangles_rectangles_length(rectanglesReply.get()); for (int i = 0; i < nRectangles; ++i) { double length = sqrt(pow(rectangles[i].x, 2) + pow(rectangles[i].y, 2)); if (length < minLength) { minLength = length; clickPoint = QPoint(rectangles[i].x, rectangles[i].y); } } qDebug() << "Click point:" << clickPoint; return clickPoint; } void SNIProxy::stackContainerWindow(const uint32_t stackMode) const { const uint32_t stackData[] = {stackMode}; xcb_configure_window(m_connection, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackData); } //____________properties__________ QString SNIProxy::Category() const { return QStringLiteral("ApplicationStatus"); } QString SNIProxy::Id() const { const auto title = Title(); // we always need /some/ ID so if no window title exists, just use the winId. if (title.isEmpty()) { return QString::number(m_windowId); } return title; } KDbusImageVector SNIProxy::IconPixmap() const { KDbusImageVector v{m_iconImage}; // add pixmaps up to s_embedSize resolution (for the SNI presenter to be able to choose, if needed) for (int s = 16; s <= s_embedSize && !m_iconImage.isNull(); s <<= 1) { if (std::max(m_iconImage.size().width(), m_iconImage.size().height()) < s) { v << m_iconImage.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } return v; } bool SNIProxy::ItemIsMenu() const { return false; } QString SNIProxy::Status() const { return QStringLiteral("Active"); } QString SNIProxy::Title() const { KWindowInfo window(m_windowId, NET::WMName); return window.name(); } int SNIProxy::WindowId() const { return m_windowId; } //____________actions_____________ void SNIProxy::Activate(int x, int y) { sendClick(XCB_BUTTON_INDEX_1, x, y); } void SNIProxy::SecondaryActivate(int x, int y) { sendClick(XCB_BUTTON_INDEX_2, x, y); } void SNIProxy::ContextMenu(int x, int y) { sendClick(XCB_BUTTON_INDEX_3, x, y); } void SNIProxy::Scroll(int delta, const QString &orientation) { if (orientation == QLatin1String("vertical")) { sendClick(delta > 0 ? XCB_BUTTON_INDEX_4 : XCB_BUTTON_INDEX_5, 0, 0); } else { sendClick(delta > 0 ? 6 : 7, 0, 0); } } void SNIProxy::sendClick(uint8_t mouseButton, int x, int y) { // it's best not to look at this code // GTK doesn't like send_events and double checks the mouse position matches where the window is and is top level // in order to solve this we move the embed container over to where the mouse is then replay the event using send_event // if patching, test with xchat + xchat context menus // note x,y are not actually where the mouse is, but the plasmoid // ideally we should make this match the plasmoid hit area qDebug() << "Received click" << mouseButton << "with passed x*y" << x << y; sendingClickEvent = true; auto cookieSize = xcb_get_geometry(m_connection, m_windowId); Xcb::ScopedCPointer clientGeom(xcb_get_geometry_reply(m_connection, cookieSize, nullptr)); if (!clientGeom) { return; } auto cookie = xcb_query_pointer(m_connection, m_windowId); Xcb::ScopedCPointer pointer(xcb_query_pointer_reply(m_connection, cookie, nullptr)); /*qDebug() << "samescreen" << pointer->same_screen << endl << "root x*y" << pointer->root_x << pointer->root_y << endl << "win x*y" << pointer->win_x << pointer->win_y;*/ // move our window so the mouse is within its geometry uint32_t configVals[2] = {0, 0}; const QPoint clickPoint = calculateClickPoint(); if (mouseButton >= XCB_BUTTON_INDEX_4) { // scroll event, take pointer position configVals[0] = pointer->root_x; configVals[1] = pointer->root_y; } else { if (pointer->root_x > x + clientGeom->width) configVals[0] = pointer->root_x - clientGeom->width + 1; else configVals[0] = static_cast(x - clickPoint.x()); if (pointer->root_y > y + clientGeom->height) configVals[1] = pointer->root_y - clientGeom->height + 1; else configVals[1] = static_cast(y - clickPoint.y()); } xcb_configure_window(m_connection, m_containerWid, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, configVals); // pull window up stackContainerWindow(XCB_STACK_MODE_ABOVE); auto *x11Application = qGuiApp->nativeInterface(); WId appRootWindow = XDefaultRootWindow(x11Application->display()); // mouse down if (m_injectMode == Direct) { xcb_button_press_event_t *event = new xcb_button_press_event_t; memset(event, 0x00, sizeof(xcb_button_press_event_t)); event->response_type = XCB_BUTTON_PRESS; event->event = m_windowId; event->time = XCB_CURRENT_TIME; //NOTE: to get proper timestamp we would need Qt Private APIs event->same_screen = 1; event->root = appRootWindow; event->root_x = x; event->root_y = y; event->event_x = static_cast(clickPoint.x()); event->event_y = static_cast(clickPoint.y()); event->child = 0; event->state = 0; event->detail = mouseButton; xcb_send_event(m_connection, false, m_windowId, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); delete event; } else { sendXTestPressed(x11Application->display(), mouseButton); } // mouse up if (m_injectMode == Direct) { xcb_button_release_event_t *event = new xcb_button_release_event_t; memset(event, 0x00, sizeof(xcb_button_release_event_t)); event->response_type = XCB_BUTTON_RELEASE; event->event = m_windowId; event->time = XCB_CURRENT_TIME; //NOTE: to get proper timestamp we would need Qt Private APIs event->same_screen = 1; event->root = appRootWindow; event->root_x = x; event->root_y = y; event->event_x = static_cast(clickPoint.x()); event->event_y = static_cast(clickPoint.y()); event->child = 0; event->state = 0; event->detail = mouseButton; xcb_send_event(m_connection, false, m_windowId, XCB_EVENT_MASK_BUTTON_RELEASE, (char *)event); delete event; } else { sendXTestReleased(x11Application->display(), mouseButton); } #ifndef VISUAL_DEBUG stackContainerWindow(XCB_STACK_MODE_BELOW); #endif sendingClickEvent = false; } ================================================ FILE: plugin-tray/sniproxy.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2015 David Edmundson * 2019 Konrad Materka * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include #include #include #include #include #include #include "snidbus.h" namespace Xcb { class Atoms; } class SNIProxy : public QObject { Q_OBJECT Q_PROPERTY(QString Category READ Category) Q_PROPERTY(QString Id READ Id) Q_PROPERTY(QString Title READ Title) Q_PROPERTY(QString Status READ Status) Q_PROPERTY(int WindowId READ WindowId) Q_PROPERTY(bool ItemIsMenu READ ItemIsMenu) Q_PROPERTY(KDbusImageVector IconPixmap READ IconPixmap) public: explicit SNIProxy(xcb_window_t wid, Xcb::Atoms & atoms, QObject *parent = nullptr); ~SNIProxy() override; void update(); void resizeWindow(const uint16_t width, const uint16_t height) const; void hideContainerWindow(xcb_window_t windowId) const; inline void vanished(bool vanished) { m_vanished = vanished; } /** * @return the category of the application associated to this item * @see Category */ QString Category() const; /** * @return the id of this item */ QString Id() const; /** * @return the title of this item */ QString Title() const; /** * @return The status of this item * @see Status */ QString Status() const; /** * @return The id of the main window of the application that controls the item */ int WindowId() const; /** * @return The item only support the context menu, the visualization should prefer sending ContextMenu() instead of Activate() */ bool ItemIsMenu() const; /** * @return a serialization of the icon data */ KDbusImageVector IconPixmap() const; public Q_SLOTS: // interaction /** * Shows the context menu associated to this item * at the desired screen position */ void ContextMenu(int x, int y); /** * Shows the main widget and try to position it on top * of the other windows, if the widget is already visible, hide it. */ void Activate(int x, int y); /** * The user activated the item in an alternate way (for instance with middle mouse button, this depends from the systray implementation) */ void SecondaryActivate(int x, int y); /** * Inform this item that the mouse wheel was used on its representation */ void Scroll(int delta, const QString &orientation); Q_SIGNALS: /** * Inform the systemtray that the own main icon has been changed, * so should be reloaded */ void NewIcon(); /** * Inform the systemtray that there is a new icon to be used as overlay */ void NewOverlayIcon(); /** * Inform the systemtray that the requesting attention icon * has been changed, so should be reloaded */ void NewAttentionIcon(); /** * Inform the systemtray that something in the tooltip has been changed */ void NewToolTip(); /** * Signal the new status when it has been changed * @see Status */ void NewStatus(const QString &status); private: enum InjectMode { Direct, XTest, }; QSize calculateClientWindowSize() const; void sendClick(uint8_t mouseButton, int x, int y); QImage getImageNonComposite() const; bool isTransparentImage(const QImage &image) const; QImage convertFromNative(xcb_image_t *xcbImage) const; QPoint calculateClickPoint() const; void stackContainerWindow(const uint32_t stackMode) const; QDBusConnection m_dbus; xcb_connection_t *m_connection; xcb_window_t m_windowId; xcb_window_t m_containerWid; static int s_serviceCount; QImage m_windowImage; QImage m_iconImage; bool sendingClickEvent; InjectMode m_injectMode; Xcb::Atoms & m_atoms; bool m_vanished = false; }; ================================================ FILE: plugin-tray/translations/tray.desktop.yaml ================================================ Desktop Entry/Name: "System Tray" Desktop Entry/Comment: "Maps obsolete xembed icons to Status Notifier" ================================================ FILE: plugin-tray/translations/tray_ar.desktop.yaml ================================================ Desktop Entry/Name: "صينيّة النّظام" Desktop Entry/Comment: "خرائط رموز xembed المتقادمة إلى Status Notifier" ================================================ FILE: plugin-tray/translations/tray_bg.desktop.yaml ================================================ Desktop Entry/Name: "Системна област" Desktop Entry/Comment: "Напасва старите икони към Status Notifier" ================================================ FILE: plugin-tray/translations/tray_ca.desktop.yaml ================================================ Desktop Entry/Name: "Safata del sistema" Desktop Entry/Comment: "Assigna les icones obsoletes de «xembed» al notificador d'estat" ================================================ FILE: plugin-tray/translations/tray_cs.desktop.yaml ================================================ Desktop Entry/Name: "Oznamovací oblast panelu" Desktop Entry/Comment: "Mapuje zastaralé xembed ikony na Stavové zprávy" ================================================ FILE: plugin-tray/translations/tray_da.desktop.yaml ================================================ Desktop Entry/Name: "Statusfelt" Desktop Entry/Comment: "Mapper forældede xembed-ikoner til Status Notifier" ================================================ FILE: plugin-tray/translations/tray_de.desktop.yaml ================================================ Desktop Entry/Name: "Benachrichtigungsfläche" Desktop Entry/Comment: "Ordnet veraltete xembed-Symbole dem Statusmelder zu" ================================================ FILE: plugin-tray/translations/tray_el.desktop.yaml ================================================ Desktop Entry/Name: "Πλαίσιο συστήματος" Desktop Entry/Comment: "Συσχέτιση των παρωχημένων εικόνων xembed για τον ειδοποιητή\ \ κατάστασης" ================================================ FILE: plugin-tray/translations/tray_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "System Tray" Desktop Entry/Comment: "Maps obsolete xembed icons to Status Notifier" ================================================ FILE: plugin-tray/translations/tray_eo.desktop.yaml ================================================ Desktop Entry/Name: "Sistempleto" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_es.desktop.yaml ================================================ Desktop Entry/Name: "Bandeja del sistema" Desktop Entry/Comment: "Muestra los iconos XEmbed obsoletos en el notificador de estado" ================================================ FILE: plugin-tray/translations/tray_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Barra de sistema" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_et.desktop.yaml ================================================ Desktop Entry/Name: "Süsteemisalv" Desktop Entry/Comment: "Kuvab aegunud xembed ikoonid olekuteatistes" ================================================ FILE: plugin-tray/translations/tray_eu.desktop.yaml ================================================ Desktop Entry/Name: "Ataza-barra" Desktop Entry/Comment: "Horrek esan nahi du SNI protokolo modernoa onartzen ez duten\ \ aplikazio batzuen (pidgin, xchat, nm-applet eta beste batzuk) ikonoak zuzenean\ \ bistaratuko direla egoera jakinarazlearen pluginean." ================================================ FILE: plugin-tray/translations/tray_fi.desktop.yaml ================================================ Desktop Entry/Name: "Ilmoitusalue" Desktop Entry/Comment: "Sitoo vanhennetut xembed-kuvakkeet tilailmoitin-lisäosaan" ================================================ FILE: plugin-tray/translations/tray_fr.desktop.yaml ================================================ Desktop Entry/Name: "Zone de notification" Desktop Entry/Comment: "Mappe les icônes xembed obsolètes pour Status Notifier" ================================================ FILE: plugin-tray/translations/tray_he.desktop.yaml ================================================ Desktop Entry/Name: "מגש המערכת" Desktop Entry/Comment: "המפות מיתרות את xembed שיופיעו על Status Notifier" ================================================ FILE: plugin-tray/translations/tray_hr.desktop.yaml ================================================ Desktop Entry/Name: "Programska traka" Desktop Entry/Comment: "Preslikava zastarjele xembed ikone u „Obavijesti o stanju“" ================================================ FILE: plugin-tray/translations/tray_hu.desktop.yaml ================================================ Desktop Entry/Name: "Rendszertálca" Desktop Entry/Comment: "Elavult XEmbed ikonokat társít a Status Notifier-hez" ================================================ FILE: plugin-tray/translations/tray_is.desktop.yaml ================================================ Desktop Entry/Name: "Kerfisbakki" Desktop Entry/Comment: "Varpa úreltum innbyggðum táknum á Stöðuslá" ================================================ FILE: plugin-tray/translations/tray_it.desktop.yaml ================================================ Desktop Entry/Name: "Vassoio di sistema" Desktop Entry/Comment: "Mostra le icone xembed obsolete nell'area di notifica" ================================================ FILE: plugin-tray/translations/tray_ja.desktop.yaml ================================================ Desktop Entry/Name: "システムトレイ" Desktop Entry/Comment: "古い xembed アイコンを [ステータス通知] プラグインにマッピングします" ================================================ FILE: plugin-tray/translations/tray_ka.desktop.yaml ================================================ Desktop Entry/Name: "სისტემის კუთხე" Desktop Entry/Comment: "მოძველებული xembed-ის ხატულების ასახვა სტატუსის გამფრთხილებელში" ================================================ FILE: plugin-tray/translations/tray_kab.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_kk.desktop.yaml ================================================ Desktop Entry/Name: "Жүйелік сөре" Desktop Entry/Comment: "Ескірген xembed таңбашаларын Status Notifier жүйесіне сәйкестендіреді" ================================================ FILE: plugin-tray/translations/tray_ko.desktop.yaml ================================================ Desktop Entry/Name: "시스템 트레이" Desktop Entry/Comment: "사용되지 않는 xembed 아이콘을 상태 알림이 플러그인에 매핑" ================================================ FILE: plugin-tray/translations/tray_lg.desktop.yaml ================================================ Desktop Entry/Name: "Kakuŋaanyizo" Desktop Entry/Comment: "Kano kasobozesa obufaananyi bwa puloguramu ezibumbujja okulabikira ku lubaawo" ================================================ FILE: plugin-tray/translations/tray_lt.desktop.yaml ================================================ Desktop Entry/Name: "Sistemos dėklas" Desktop Entry/Comment: "Susieja pasenusias xembed piktogramas su būsenos pranešimų\ \ įskiepiu" ================================================ FILE: plugin-tray/translations/tray_lv.desktop.yaml ================================================ Desktop Entry/Name: "Sistēmas tekne (tray)" Desktop Entry/Comment: "Norakstīts, lūgums lietot statusa paziņotāja/paziņojumu spraudni!" ================================================ FILE: plugin-tray/translations/tray_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Systemkurv" Desktop Entry/Comment: "Tilordner foreldede xembed-ikoner til Statusvarsler" ================================================ FILE: plugin-tray/translations/tray_nl.desktop.yaml ================================================ Desktop Entry/Name: "Systeemvak" Desktop Entry/Comment: "Koppelt verouderde xembed-pictogrammen aan de systeemvak-invoegtoepassing" ================================================ FILE: plugin-tray/translations/tray_oc.desktop.yaml ================================================ Desktop Entry/Name: "Zòna de notificacion" Desktop Entry/Comment: "Junta las icònas xembed obsolètas amb Status Notifier" ================================================ FILE: plugin-tray/translations/tray_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਸਿਸਟਮ ਟਰੇ" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_pl.desktop.yaml ================================================ Desktop Entry/Name: "Zasobnik systemowy" Desktop Entry/Comment: "Mapuje przestarzałe ikony xembed na Status Notifier" ================================================ FILE: plugin-tray/translations/tray_pt.desktop.yaml ================================================ Desktop Entry/Name: "Bandeja do sistema" Desktop Entry/Comment: "Mapeia ícones xembed obsoletos para o Notificador de Estado" ================================================ FILE: plugin-tray/translations/tray_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Área de notificação" Desktop Entry/Comment: "Mapeia os ícones Xembed obsoletos para o Notificador de Status" ================================================ FILE: plugin-tray/translations/tray_ro.desktop.yaml ================================================ Desktop Entry/Name: "Zonă de notificare" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_ru.desktop.yaml ================================================ Desktop Entry/Name: "Системный лоток" Desktop Entry/Comment: "Привязывать устаревшие иконки XEmbed к Status Notifier" ================================================ FILE: plugin-tray/translations/tray_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_sk.desktop.yaml ================================================ Desktop Entry/Name: "Oznamovacia oblasť" Desktop Entry/Comment: "Mapuje staršie ikony z niektorých aplikácii do oznamovacej\ \ oblasti" ================================================ FILE: plugin-tray/translations/tray_sl.desktop.yaml ================================================ Desktop Entry/Name: "Sistemska vrstica" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_sr.desktop.yaml ================================================ Desktop Entry/Name: "Системска касета" Desktop Entry/Comment: "Мапира застареле xembed иконе у Стаус Нотифајер" ================================================ FILE: plugin-tray/translations/tray_sr@ijekavian.desktop.yaml ================================================ Desktop Entry/Name: "Системска касета" Desktop Entry/Comment: "Мапира застарјеле xembed иконе у Статус нотифајер" ================================================ FILE: plugin-tray/translations/tray_sr@ijekavianlatin.desktop.yaml ================================================ Desktop Entry/Name: "Sistemska kaseta" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_sr@latin.desktop.yaml ================================================ Desktop Entry/Name: "Sistemska kaseta" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_sv.desktop.yaml ================================================ Desktop Entry/Name: "Systemfält" Desktop Entry/Comment: "Tilldelar föråldrade xembed-ikoner till statusaviseraren" ================================================ FILE: plugin-tray/translations/tray_th.desktop.yaml ================================================ Desktop Entry/Name: "ถาดระบบ" Desktop Entry/Comment: "" ================================================ FILE: plugin-tray/translations/tray_tr.desktop.yaml ================================================ Desktop Entry/Name: "Sistem çekmecesi" Desktop Entry/Comment: "Eski xembed simgelerini Durum Bildiricisine eşler" ================================================ FILE: plugin-tray/translations/tray_uk.desktop.yaml ================================================ Desktop Entry/Name: "Системний лоток" Desktop Entry/Comment: "Показує застарілі xembed піктограми до сповіщень стану" ================================================ FILE: plugin-tray/translations/tray_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "系统托盘" Desktop Entry/Comment: "将过时的xembed图标映射到状态通知程序上" ================================================ FILE: plugin-tray/translations/tray_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "系統匣" Desktop Entry/Comment: "將已經過時的 xembed 圖示對映到狀態通知" ================================================ FILE: plugin-tray/xcbutils.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012, 2013 Martin Graesslin * 2015 David Edmundson * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once #include #include #include #include #include #include #include #include #include /** XEMBED messages */ #define XEMBED_EMBEDDED_NOTIFY 0 #define XEMBED_WINDOW_ACTIVATE 1 #define XEMBED_WINDOW_DEACTIVATE 2 #define XEMBED_REQUEST_FOCUS 3 #define XEMBED_FOCUS_IN 4 #define XEMBED_FOCUS_OUT 5 #define XEMBED_FOCUS_NEXT 6 #define XEMBED_FOCUS_PREV 7 namespace Xcb { typedef xcb_window_t WindowId; struct ScopedCPointerDeleter { static inline void cleanup(void *pointer) noexcept { free(pointer); } void operator()(void *pointer) const noexcept { cleanup(pointer); } }; template using ScopedCPointer = std::unique_ptr; class Atom { public: explicit Atom(const QByteArray &name, xcb_connection_t *c, bool onlyIfExists = false) : m_connection(c) , m_retrieved(false) , m_cookie(xcb_intern_atom_unchecked(m_connection, onlyIfExists, name.length(), name.constData())) , m_atom(XCB_ATOM_NONE) , m_name(name) { } Atom() = delete; Atom(const Atom &) = delete; ~Atom() { if (!m_retrieved && m_cookie.sequence) { xcb_discard_reply(m_connection, m_cookie.sequence); } } operator xcb_atom_t() const { (const_cast(this))->getReply(); return m_atom; } bool isValid() { getReply(); return m_atom != XCB_ATOM_NONE; } bool isValid() const { (const_cast(this))->getReply(); return m_atom != XCB_ATOM_NONE; } inline const QByteArray &name() const { return m_name; } private: void getReply() { if (m_retrieved || !m_cookie.sequence) { return; } ScopedCPointer reply(xcb_intern_atom_reply(m_connection, m_cookie, nullptr)); if (reply) { m_atom = reply->atom; } m_retrieved = true; } xcb_connection_t *m_connection; bool m_retrieved; xcb_intern_atom_cookie_t m_cookie; xcb_atom_t m_atom; QByteArray m_name; }; class Atoms { public: Atoms(xcb_connection_t *c, int defaultScreen) : xembedAtom("_XEMBED", c) , selectionAtom(xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", defaultScreen), c) , opcodeAtom("_NET_SYSTEM_TRAY_OPCODE", c) , messageData("_NET_SYSTEM_TRAY_MESSAGE_DATA", c) , visualAtom("_NET_SYSTEM_TRAY_VISUAL", c) { } Atom xembedAtom; Atom selectionAtom; Atom opcodeAtom; Atom messageData; Atom visualAtom; }; extern Atoms *atoms; } // namespace Xcb ================================================ FILE: plugin-tray/xtestsender.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2017 David Edmundson * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "xtestsender.h" #include void sendXTestPressed(Display *display, int button) { XTestFakeButtonEvent(display, button, true, 0); } void sendXTestReleased(Display *display, int button) { XTestFakeButtonEvent(display, button, false, 0); } ================================================ FILE: plugin-tray/xtestsender.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2.1+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2017 David Edmundson * 2022 LXQt team * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #pragma once typedef struct _XDisplay Display; void sendXTestPressed(Display *display, int button); void sendXTestReleased(Display *display, int button); ================================================ FILE: plugin-volume/CMakeLists.txt ================================================ set(PLUGIN "volume") set(HEADERS lxqtvolume.h volumebutton.h volumepopup.h audiodevice.h lxqtvolumeconfiguration.h audioengine.h ) set(SOURCES ${PROJECT_SOURCE_DIR}/panel/lxqtpanelpluginconfigdialog.cpp lxqtvolume.cpp volumebutton.cpp volumepopup.cpp audiodevice.cpp lxqtvolumeconfiguration.cpp audioengine.cpp ossengine.cpp ) set(UIS lxqtvolumeconfiguration.ui ) set(LIBRARIES ${LIBRARIES} lxqt-globalkeys Qt6Xdg ) if(PULSEAUDIO_FOUND) add_definitions(-DUSE_PULSEAUDIO) include_directories(${PULSEAUDIO_INCLUDE_DIR}) set(HEADERS ${HEADERS} pulseaudioengine.h) set(SOURCES ${SOURCES} pulseaudioengine.cpp) set(MOCS ${MOCS} pulseaudioengine.h) set(LIBRARIES ${LIBRARIES} ${PULSEAUDIO_LIBRARY}) endif() if(ALSA_FOUND) add_definitions(-DUSE_ALSA) set(HEADERS ${HEADERS} alsaengine.h alsadevice.h) set(SOURCES ${SOURCES} alsaengine.cpp alsadevice.cpp) set(MOCS ${MOCS} alsaengine.h alsadevice.h) set(LIBRARIES ${LIBRARIES} ${ALSA_LIBRARIES}) endif() BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-volume/alsadevice.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "alsadevice.h" AlsaDevice::AlsaDevice(AudioDeviceType t, AudioEngine *engine, QObject *parent) : AudioDevice(t, engine, parent), m_mixer(nullptr), m_elem(nullptr), m_volumeMin(0), m_volumeMax(100) { } void AlsaDevice::setMixer(snd_mixer_t *mixer) { if (m_mixer == mixer) return; m_mixer = mixer; emit mixerChanged(); } void AlsaDevice::setElement(snd_mixer_elem_t *elem) { if (m_elem == elem) return; m_elem = elem; emit elementChanged(); } void AlsaDevice::setCardName(const QString &cardName) { if (m_cardName == cardName) return; m_cardName = cardName; emit cardNameChanged(); } void AlsaDevice::setVolumeMinMax(long volumeMin, long volumeMax) { m_volumeMin = volumeMin; m_volumeMax = volumeMax; } ================================================ FILE: plugin-volume/alsadevice.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef ALSADEVICE_H #define ALSADEVICE_H #include "audiodevice.h" #include #include #include class AlsaDevice : public AudioDevice { Q_OBJECT public: AlsaDevice(AudioDeviceType t, AudioEngine *engine, QObject *parent = nullptr); snd_mixer_t *mixer() const { return m_mixer; } snd_mixer_elem_t *element() const { return m_elem; } const QString &cardName() const { return m_cardName; } inline long volumeMin() const { return m_volumeMin; } inline long volumeMax() const { return m_volumeMax; } void setMixer(snd_mixer_t *mixer); void setElement(snd_mixer_elem_t *elem); void setCardName(const QString &cardName); void setVolumeMinMax(long volumeMin, long volumeMax); signals: void mixerChanged(); void elementChanged(); void cardNameChanged(); private: snd_mixer_t *m_mixer; snd_mixer_elem_t *m_elem; QString m_cardName; long m_volumeMin; long m_volumeMax; }; #endif // ALSADEVICE_H ================================================ FILE: plugin-volume/alsaengine.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "alsaengine.h" #include "alsadevice.h" #include #include #include #include #include MixerHandler::MixerHandler(snd_mixer_t * mixer, QObject * parent /*= nullptr*/) : QObject{parent} , m_mixer{mixer} { if (nullptr != m_mixer) { // setup eventloop handling struct pollfd pfd; if (snd_mixer_poll_descriptors(m_mixer, &pfd, 1)) { QSocketNotifier *notifier = new QSocketNotifier(pfd.fd, QSocketNotifier::Read, this); connect(notifier, &QSocketNotifier::activated, this, [this] { const int err = snd_mixer_handle_events(m_mixer); if (0 > err) emit handlingError(err); }); } } } MixerHandler::~MixerHandler() { if (nullptr != m_mixer) snd_mixer_close(m_mixer); } AlsaEngine *AlsaEngine::m_instance = nullptr; static int alsa_elem_event_callback(snd_mixer_elem_t *elem, unsigned int /*mask*/) { AlsaEngine *engine = AlsaEngine::instance(); if (engine) engine->updateDevice(engine->getDeviceByAlsaElem(elem)); return 0; } static int alsa_mixer_event_callback(snd_mixer_t * /*mixer*/, unsigned int /*mask*/, snd_mixer_elem_t * /*elem*/) { return 0; } AlsaEngine::AlsaEngine(QObject *parent) : AudioEngine(parent) { discoverDevices(); m_instance = this; } AlsaEngine *AlsaEngine::instance() { return m_instance; } int AlsaEngine::volumeMax(AudioDevice *device) const { AlsaDevice * alsa_dev = qobject_cast(device); Q_ASSERT(alsa_dev); return alsa_dev->volumeMax(); } AlsaDevice *AlsaEngine::getDeviceByAlsaElem(snd_mixer_elem_t *elem) const { for (AudioDevice *device : std::as_const(m_sinks)) { AlsaDevice *dev = qobject_cast(device); if (!dev || !dev->element()) continue; if (dev->element() == elem) return dev; } return nullptr; } void AlsaEngine::commitDeviceVolume(AudioDevice *device) { AlsaDevice *dev = qobject_cast(device); if (!dev || !dev->element()) return; long value = dev->volumeMin() + std::round(static_cast(dev->volume()) / 100.0 * (dev->volumeMax() - dev->volumeMin())); snd_mixer_selem_set_playback_volume_all(dev->element(), value); } void AlsaEngine::setMute(AudioDevice *device, bool state) { AlsaDevice *dev = qobject_cast(device); if (!dev || !dev->element()) return; if (snd_mixer_selem_has_playback_switch(dev->element())) snd_mixer_selem_set_playback_switch_all(dev->element(), (int)!state); else if (state) dev->setVolume(0); } void AlsaEngine::updateDevice(AlsaDevice *device) { if (!device) return; long value; snd_mixer_selem_get_playback_volume(device->element(), (snd_mixer_selem_channel_id_t)0, &value); // qDebug() << "updateDevice:" << device->name() << value; device->setVolumeNoCommit(std::round((static_cast(value - device->volumeMin()) * 100.0) / (device->volumeMax() - device->volumeMin()))); if (snd_mixer_selem_has_playback_switch(device->element())) { int mute; snd_mixer_selem_get_playback_switch(device->element(), (snd_mixer_selem_channel_id_t)0, &mute); device->setMuteNoCommit(!(bool)mute); } } void AlsaEngine::discoverDevices() { std::for_each(m_sinks.begin(), m_sinks.end(), std::default_delete{}); m_sinks.clear(); m_mixers.clear(); int error; int cardNum = -1; const int BUFF_SIZE = 64; while (true) { if ((error = snd_card_next(&cardNum)) < 0) { qWarning("Can't get the next card number: %s\n", snd_strerror(error)); break; } if (cardNum < 0) break; char str[BUFF_SIZE]; const size_t n = snprintf(str, sizeof(str), "hw:%i", cardNum); if (BUFF_SIZE <= n) { qWarning("AlsaEngine::discoverDevices: Buffer too small\n"); continue; } snd_ctl_t *cardHandle; if ((error = snd_ctl_open(&cardHandle, str, 0)) < 0) { qWarning("Can't open card %i: %s\n", cardNum, snd_strerror(error)); continue; } snd_ctl_card_info_t *cardInfo; snd_ctl_card_info_alloca(&cardInfo); QString cardName = QString::fromLatin1(snd_ctl_card_info_get_name(cardInfo)); if (cardName.isEmpty()) cardName = QString::fromLatin1(str); if ((error = snd_ctl_card_info(cardHandle, cardInfo)) < 0) { qWarning("Can't get info for card %i: %s\n", cardNum, snd_strerror(error)); } else { // setup mixer and iterate over channels snd_mixer_t *mixer = nullptr; snd_mixer_open(&mixer, 0); snd_mixer_attach(mixer, str); snd_mixer_selem_register(mixer, nullptr, nullptr); snd_mixer_load(mixer); // setup event handler for mixer snd_mixer_set_callback(mixer, alsa_mixer_event_callback); m_mixers.emplace_back(mixer); connect(&m_mixers.back(), &MixerHandler::handlingError, this, [this] (int err) { qWarning() << "Mixer handling failed(" << snd_strerror(err) << "), reloading ..."; QTimer::singleShot(0, this, [this] { discoverDevices(); }); }); snd_mixer_elem_t *mixerElem = nullptr; mixerElem = snd_mixer_first_elem(mixer); while (mixerElem) { // check if we have a Sink or Source if (snd_mixer_selem_has_playback_volume(mixerElem)) { AlsaDevice *dev = new AlsaDevice(Sink, this, this); dev->setName(QString::fromLatin1(snd_mixer_selem_get_name(mixerElem))); dev->setIndex(cardNum); dev->setDescription(cardName + QStringLiteral(" - ") + dev->name()); // set alsa specific members dev->setCardName(QString::fromLatin1(str)); dev->setMixer(mixer); dev->setElement(mixerElem); // get & store the range long min, max; snd_mixer_selem_get_playback_volume_range(mixerElem, &min, &max); dev->setVolumeMinMax(min, max); updateDevice(dev); // register event callback snd_mixer_elem_set_callback(mixerElem, alsa_elem_event_callback); m_sinks.append(dev); } mixerElem = snd_mixer_elem_next(mixerElem); } } snd_ctl_close(cardHandle); } snd_config_update_free_global(); emit sinkListChanged(); } ================================================ FILE: plugin-volume/alsaengine.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef ALSAENGINE_H #define ALSAENGINE_H #include "audioengine.h" #include #include class AlsaDevice; class MixerHandler : public QObject { Q_OBJECT public: MixerHandler(snd_mixer_t * mixer, QObject * parent = nullptr); MixerHandler(const MixerHandler & ) = delete; ~MixerHandler(); signals: void handlingError(int err); private: snd_mixer_t * m_mixer; }; class AlsaEngine : public AudioEngine { Q_OBJECT public: AlsaEngine(QObject *parent = nullptr); static AlsaEngine *instance(); virtual const QString backendName() const { return QLatin1String("Alsa"); } int volumeMax(AudioDevice *device) const; AlsaDevice *getDeviceByAlsaElem(snd_mixer_elem_t *elem) const; public slots: void commitDeviceVolume(AudioDevice *device); void setMute(AudioDevice *device, bool state); void updateDevice(AlsaDevice *device); private: void discoverDevices(); std::list m_mixers; static AlsaEngine *m_instance; }; #endif // ALSAENGINE_H ================================================ FILE: plugin-volume/audiodevice.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "audiodevice.h" #include "audioengine.h" AudioDevice::AudioDevice(AudioDeviceType t, AudioEngine *engine, QObject *parent) : QObject(parent), m_engine(engine), m_volume(0), m_mute(false), m_type(t), m_index(0) { } AudioDevice::~AudioDevice() = default; void AudioDevice::setName(const QString &name) { if (m_name == name) return; m_name = name; emit nameChanged(m_name); } void AudioDevice::setDescription(const QString &description) { if (m_description == description) return; m_description = description; emit descriptionChanged(m_description); } void AudioDevice::setIndex(uint index) { if (m_index == index) return; m_index = index; emit indexChanged(index); } // this is just for setting the internal volume void AudioDevice::setVolumeNoCommit(int volume) { if (m_engine) volume = m_engine->volumeBounded(volume, this); if (m_volume == volume) return; m_volume = volume; emit volumeChanged(m_volume); } void AudioDevice::toggleMute() { setMute(!m_mute); } void AudioDevice::setMute(bool state) { if (m_mute == state) return; setMuteNoCommit(state); if (m_engine) m_engine->setMute(this, state); } void AudioDevice::setMuteNoCommit(bool state) { if (m_mute == state) return; m_mute = state; emit muteChanged(m_mute); } // this performs a volume change on the device void AudioDevice::setVolume(int volume) { if (m_volume == volume) return; setVolumeNoCommit(volume); if (m_engine) m_engine->commitDeviceVolume(this); } ================================================ FILE: plugin-volume/audiodevice.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef AUDIODEVICE_H #define AUDIODEVICE_H #include class AudioEngine; typedef enum AudioDeviceType { Sink = 0, Source = 1, PulseAudioDeviceTypeLength } AudioDeviceType; class AudioDevice : public QObject { Q_OBJECT Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged) Q_PROPERTY(AudioDeviceType type READ type CONSTANT) public: AudioDevice(AudioDeviceType t, AudioEngine *engine, QObject *parent = nullptr); ~AudioDevice(); // the volume can range from 0 to 100. int volume() const { return m_volume; } bool mute() const { return m_mute; } AudioDeviceType type() const { return m_type; } const QString &name() const { return m_name; } const QString &description() const { return m_description; } uint index() const { return m_index; } void setName(const QString &name); void setDescription(const QString &description); void setIndex(uint index); AudioEngine* engine() { return m_engine; } public slots: // the volume can range from 0 to 100. void setVolume(int volume); void setVolumeNoCommit(int volume); void toggleMute(); void setMute(bool state); void setMuteNoCommit(bool state); signals: void volumeChanged(int volume); void muteChanged(bool state); void nameChanged(const QString &name); void descriptionChanged(const QString &description); void indexChanged(uint index); private: AudioEngine *m_engine; int m_volume; // the volume can range from 0 to 100. bool m_mute; AudioDeviceType m_type; QString m_name; uint m_index; QString m_description; }; #endif // AUDIODEVICE_H ================================================ FILE: plugin-volume/audioengine.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "audioengine.h" #include "audiodevice.h" #include #include #include AudioEngine::AudioEngine(QObject *parent) : QObject(parent) { } AudioEngine::~AudioEngine() { qDeleteAll(m_sinks); m_sinks.clear(); } int AudioEngine::volumeBounded(int volume, AudioDevice* device) const { int maximum = volumeMax(device); double v = ((double) volume / 100.0) * maximum; double bounded = std::clamp(v, 0.0, maximum); return std::round((bounded / maximum) * 100); } bool AudioEngine::setDefaultSink(AudioDevice */*device*/) { return false; } void AudioEngine::mute(AudioDevice *device) { setMute(device, true); } void AudioEngine::unmute(AudioDevice *device) { setMute(device, false); } void AudioEngine::setIgnoreMaxVolume(bool ignore) { Q_UNUSED(ignore) } ================================================ FILE: plugin-volume/audioengine.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef AUDIOENGINE_H #define AUDIOENGINE_H #include #include #include class AudioDevice; class AudioEngine : public QObject { Q_OBJECT public: AudioEngine(QObject *parent = nullptr); ~AudioEngine(); const QList &sinks() const { return m_sinks; } virtual int volumeMax(AudioDevice *device) const = 0; virtual int volumeBounded(int volume, AudioDevice *device) const; virtual const QString backendName() const = 0; virtual bool setDefaultSink(AudioDevice *device); public slots: virtual void commitDeviceVolume(AudioDevice *device) = 0; virtual void setMute(AudioDevice *device, bool state) = 0; void mute(AudioDevice *device); void unmute(AudioDevice *device); virtual void setIgnoreMaxVolume(bool ignore); signals: void sinkListChanged(); protected: QList m_sinks; }; #endif // AUDIOENGINE_H ================================================ FILE: plugin-volume/lxqtvolume.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtvolume.h" #include "volumebutton.h" #include "volumepopup.h" #include "lxqtvolumeconfiguration.h" #include "audiodevice.h" #ifdef USE_PULSEAUDIO #include "pulseaudioengine.h" #endif #ifdef USE_ALSA #include "alsaengine.h" #endif #include "ossengine.h" #include #include #include #include #define DEFAULT_UP_SHORTCUT "XF86AudioRaiseVolume" #define DEFAULT_DOWN_SHORTCUT "XF86AudioLowerVolume" #define DEFAULT_MUTE_SHORTCUT "XF86AudioMute" LXQtVolume::LXQtVolume(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), m_engine(nullptr), m_defaultSinkIndex(0), m_defaultSink(nullptr), m_alwaysShowNotifications(SETTINGS_DEFAULT_ALWAYS_SHOW_NOTIFICATIONS), m_showKeyboardNotifications(SETTINGS_DEFAULT_SHOW_KEYBOARD_NOTIFICATIONS) { m_volumeButton = new VolumeButton(this); connect(m_volumeButton->volumePopup(), &VolumePopup::defaultSinkRequested, this, &LXQtVolume::handleDefaultSinkRequested); m_notification = new LXQt::Notification(QLatin1String(""), this); m_keyVolumeUp = GlobalKeyShortcut::Client::instance()->addAction(QString(), QStringLiteral("/panel/%1/up").arg(settings()->group()), tr("Increase sound volume"), this); if (m_keyVolumeUp) { connect(m_keyVolumeUp, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); connect(m_keyVolumeUp, &GlobalKeyShortcut::Action::activated, this, &LXQtVolume::handleShortcutVolumeUp); } m_keyVolumeDown = GlobalKeyShortcut::Client::instance()->addAction(QString(), QStringLiteral("/panel/%1/down").arg(settings()->group()), tr("Decrease sound volume"), this); if (m_keyVolumeDown) { connect(m_keyVolumeDown, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); connect(m_keyVolumeDown, &GlobalKeyShortcut::Action::activated, this, &LXQtVolume::handleShortcutVolumeDown); } m_keyMuteToggle = GlobalKeyShortcut::Client::instance()->addAction(QString(), QStringLiteral("/panel/%1/mute").arg(settings()->group()), tr("Mute/unmute sound volume"), this); if (m_keyMuteToggle) { connect(m_keyMuteToggle, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); connect(m_keyMuteToggle, &GlobalKeyShortcut::Action::activated, this, &LXQtVolume::handleShortcutVolumeMute); } settingsChanged(); } LXQtVolume::~LXQtVolume() { delete m_volumeButton; } void LXQtVolume::shortcutRegistered() { GlobalKeyShortcut::Action * const shortcut = qobject_cast(sender()); QString shortcutNotRegistered; if (shortcut == m_keyVolumeUp) { disconnect(m_keyVolumeUp, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); if (m_keyVolumeUp->shortcut().isEmpty()) { m_keyVolumeUp->changeShortcut(QStringLiteral(DEFAULT_UP_SHORTCUT)); if (m_keyVolumeUp->shortcut().isEmpty()) { shortcutNotRegistered = QStringLiteral(" '") + QStringLiteral(DEFAULT_UP_SHORTCUT) + QStringLiteral("'"); } } } else if (shortcut == m_keyVolumeDown) { disconnect(m_keyVolumeDown, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); if (m_keyVolumeDown->shortcut().isEmpty()) { m_keyVolumeDown->changeShortcut(QStringLiteral(DEFAULT_DOWN_SHORTCUT)); if (m_keyVolumeDown->shortcut().isEmpty()) { shortcutNotRegistered += QStringLiteral(" '") + QStringLiteral(DEFAULT_DOWN_SHORTCUT) + QStringLiteral("'"); } } } else if (shortcut == m_keyMuteToggle) { disconnect(m_keyMuteToggle, &GlobalKeyShortcut::Action::registrationFinished, this, &LXQtVolume::shortcutRegistered); if (m_keyMuteToggle->shortcut().isEmpty()) { m_keyMuteToggle->changeShortcut(QStringLiteral(DEFAULT_MUTE_SHORTCUT)); if (m_keyMuteToggle->shortcut().isEmpty()) { shortcutNotRegistered += QStringLiteral(" '") + QStringLiteral(DEFAULT_MUTE_SHORTCUT) + QStringLiteral("'"); } } } if(!shortcutNotRegistered.isEmpty()) { m_notification->setSummary(tr("Volume Control: The following shortcuts can not be registered: %1").arg(shortcutNotRegistered)); m_notification->update(); } m_notification->setTimeout(1000); m_notification->setUrgencyHint(LXQt::Notification::UrgencyLow); } void LXQtVolume::setAudioEngine(AudioEngine *engine) { if (m_engine) { if (m_engine->backendName() == engine->backendName()) return; if (m_defaultSink) { disconnect(m_defaultSink, nullptr, this, nullptr); m_defaultSink = nullptr; } m_volumeButton->volumePopup()->setSinks(QList(), nullptr); disconnect(m_engine, nullptr, nullptr, nullptr); delete m_engine; m_engine = nullptr; } m_engine = engine; connect(m_engine, &AudioEngine::sinkListChanged, this, &LXQtVolume::handleSinkListChanged); handleSinkListChanged(); } void LXQtVolume::settingsChanged() { m_defaultSinkIndex = settings()->value(QStringLiteral(SETTINGS_DEVICE), SETTINGS_DEFAULT_DEVICE).toInt(); QString engineName = settings()->value(QStringLiteral(SETTINGS_AUDIO_ENGINE), QStringLiteral(SETTINGS_DEFAULT_AUDIO_ENGINE)).toString(); const bool new_engine = !m_engine || m_engine->backendName() != engineName; if (new_engine) { #if defined(USE_PULSEAUDIO) && defined(USE_ALSA) if (engineName == QLatin1String("PulseAudio")) setAudioEngine(new PulseAudioEngine(this)); else if (engineName == QLatin1String("Alsa")) setAudioEngine(new AlsaEngine(this)); else // fallback to OSS setAudioEngine(new OssEngine(this)); #elif defined(USE_PULSEAUDIO) if (engineName == QLatin1String("PulseAudio")) setAudioEngine(new PulseAudioEngine(this)); else // fallback to OSS setAudioEngine(new OssEngine(this)); #elif defined(USE_ALSA) if (engineName == QLatin1String("Alsa")) setAudioEngine(new AlsaEngine(this)); else // fallback to OSS setAudioEngine(new OssEngine(this)); #else // No other backends are available, fallback to OSS setAudioEngine(new OssEngine(this)); #endif } m_volumeButton->setMuteOnMiddleClick(settings()->value(QStringLiteral(SETTINGS_MUTE_ON_MIDDLECLICK), SETTINGS_DEFAULT_MUTE_ON_MIDDLECLICK).toBool()); m_volumeButton->setMixerCommand(settings()->value(QStringLiteral(SETTINGS_MIXER_COMMAND), QStringLiteral(SETTINGS_DEFAULT_MIXER_COMMAND)).toString()); m_volumeButton->volumePopup()->setSliderStep(settings()->value(QStringLiteral(SETTINGS_STEP), SETTINGS_DEFAULT_STEP).toInt()); m_alwaysShowNotifications = settings()->value(QStringLiteral(SETTINGS_ALWAYS_SHOW_NOTIFICATIONS), SETTINGS_DEFAULT_ALWAYS_SHOW_NOTIFICATIONS).toBool(); m_showKeyboardNotifications = settings()->value(QStringLiteral(SETTINGS_SHOW_KEYBOARD_NOTIFICATIONS), SETTINGS_DEFAULT_SHOW_KEYBOARD_NOTIFICATIONS).toBool() // in case the config file was edited manually (see LXQtVolumeConfiguration) || m_alwaysShowNotifications; if (!new_engine) handleSinkListChanged(); } void LXQtVolume::handleSinkListChanged() { if (m_engine) { if (m_engine->sinks().count() > 0) { m_defaultSink = m_engine->sinks().at(qBound(0, m_defaultSinkIndex, m_engine->sinks().count() - 1)); m_volumeButton->volumePopup()->setSinks(m_engine->sinks(), m_defaultSink); connect(m_defaultSink, &AudioDevice::volumeChanged, this, [this] { LXQtVolume::showNotification(false); }); connect(m_defaultSink, &AudioDevice::muteChanged, this, [this] { LXQtVolume::showNotification(false); }); connect(m_defaultSink, &AudioDevice::volumeChanged, this, &LXQtVolume::updateTrayIconFromDefaultSink); connect(m_defaultSink, &AudioDevice::muteChanged, this, &LXQtVolume::updateTrayIconFromDefaultSink); updateTrayIconFromDefaultSink(); m_engine->setIgnoreMaxVolume(settings()->value(QStringLiteral(SETTINGS_IGNORE_MAX_VOLUME), SETTINGS_DEFAULT_IGNORE_MAX_VOLUME).toBool()); } else { m_defaultSink = nullptr; m_volumeButton->volumePopup()->setSinks(QList(), nullptr); m_volumeButton->setIcon(XdgIcon::fromTheme(QStringLiteral("dialog-error"))); } if (m_configDialog) m_configDialog->setSinkList(m_engine->sinks()); } } void LXQtVolume::handleShortcutVolumeUp() { if (m_defaultSink) { m_defaultSink->setVolume(m_defaultSink->volume() + settings()->value(QStringLiteral(SETTINGS_STEP), SETTINGS_DEFAULT_STEP).toInt()); showNotification(true); } } void LXQtVolume::handleShortcutVolumeDown() { if (m_defaultSink) { m_defaultSink->setVolume(m_defaultSink->volume() - settings()->value(QStringLiteral(SETTINGS_STEP), SETTINGS_DEFAULT_STEP).toInt()); showNotification(true); } } void LXQtVolume::handleShortcutVolumeMute() { if (m_defaultSink) { m_defaultSink->toggleMute(); showNotification(true); } } void LXQtVolume::handleDefaultSinkRequested(AudioDevice *device) { if (!m_engine || !device) return; const QList &sinks = m_engine->sinks(); const int idx = sinks.indexOf(device); if (idx < 0) return; m_engine->setDefaultSink(device); // PulseAudio: sets server default; no-op for ALSA/OSS if (m_defaultSink) disconnect(m_defaultSink, nullptr, this, nullptr); m_defaultSink = device; m_defaultSinkIndex = idx; settings()->setValue(QStringLiteral(SETTINGS_DEVICE), m_defaultSinkIndex); connect(m_defaultSink, &AudioDevice::volumeChanged, this, [this] { LXQtVolume::showNotification(false); }); connect(m_defaultSink, &AudioDevice::muteChanged, this, [this] { LXQtVolume::showNotification(false); }); connect(m_defaultSink, &AudioDevice::volumeChanged, this, &LXQtVolume::updateTrayIconFromDefaultSink); connect(m_defaultSink, &AudioDevice::muteChanged, this, &LXQtVolume::updateTrayIconFromDefaultSink); m_volumeButton->volumePopup()->setDefaultSink(m_defaultSink); updateTrayIconFromDefaultSink(); } void LXQtVolume::updateTrayIconFromDefaultSink() { if (!m_defaultSink) { m_volumeButton->setIcon(XdgIcon::fromTheme(QStringLiteral("dialog-error"))); m_volumeButton->setToolTip(QString()); return; } QString iconName; if (m_defaultSink->volume() <= 0 || m_defaultSink->mute()) iconName = QLatin1String("audio-volume-muted"); else if (m_defaultSink->volume() <= 33) iconName = QLatin1String("audio-volume-low"); else if (m_defaultSink->volume() <= 66) iconName = QLatin1String("audio-volume-medium"); else iconName = QLatin1String("audio-volume-high"); iconName.append(QLatin1String("-panel")); m_volumeButton->setIcon(XdgIcon::fromTheme(iconName)); m_volumeButton->setToolTip(tr("%1: %2%").arg(m_defaultSink->description()).arg(m_defaultSink->volume())); } QWidget *LXQtVolume::widget() { return m_volumeButton; } void LXQtVolume::realign() { } QDialog *LXQtVolume::configureDialog() { if (!m_configDialog) { const bool oss_available = (m_engine && m_engine->backendName() == QLatin1String("Oss")) ? m_engine->sinks().size() > 0 : OssEngine().sinks().size() > 0; m_configDialog = new LXQtVolumeConfiguration(settings(), oss_available); m_configDialog->setAttribute(Qt::WA_DeleteOnClose, true); if (m_engine) m_configDialog->setSinkList(m_engine->sinks()); } return m_configDialog; } void LXQtVolume::showNotification(bool forceShow) const { if ((forceShow && m_showKeyboardNotifications) // force only if volume change should be notified with keyboard || m_alwaysShowNotifications) { if (Q_LIKELY(m_defaultSink)) { m_notification->setSummary(tr("Volume: %1%%2").arg(QString::number(m_defaultSink->volume())).arg(m_defaultSink->mute() ? tr("(muted)") : QLatin1String(""))); m_notification->update(); } } } #undef DEFAULT_UP_SHORTCUT #undef DEFAULT_DOWN_SHORTCUT #undef DEFAULT_MUTE_SHORTCUT ================================================ FILE: plugin-volume/lxqtvolume.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTVOLUME_H #define LXQTVOLUME_H #include "../panel/ilxqtpanelplugin.h" #include #include #include class VolumeButton; class AudioEngine; class AudioDevice; namespace LXQt { class Notification; } namespace GlobalKeyShortcut { class Action; } class LXQtVolumeConfiguration; class LXQtVolume : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtVolume(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtVolume(); virtual QWidget *widget(); virtual QString themeId() const { return QStringLiteral("Volume"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog ; } void realign(); QDialog *configureDialog(); void setAudioEngine(AudioEngine *engine); protected slots: virtual void settingsChanged(); void handleSinkListChanged(); void handleShortcutVolumeUp(); void handleShortcutVolumeDown(); void handleShortcutVolumeMute(); void handleDefaultSinkRequested(AudioDevice *device); void shortcutRegistered(); void showNotification(bool forceShow) const; void updateTrayIconFromDefaultSink(); private: AudioEngine *m_engine; VolumeButton *m_volumeButton; int m_defaultSinkIndex; AudioDevice *m_defaultSink; GlobalKeyShortcut::Action *m_keyVolumeUp; GlobalKeyShortcut::Action *m_keyVolumeDown; GlobalKeyShortcut::Action *m_keyMuteToggle; LXQt::Notification *m_notification; QPointer m_configDialog; bool m_alwaysShowNotifications; bool m_showKeyboardNotifications; }; class LXQtVolumePluginLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtVolume(startupInfo); } }; #endif // LXQTVOLUME_H ================================================ FILE: plugin-volume/lxqtvolumeconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtvolumeconfiguration.h" #include "ui_lxqtvolumeconfiguration.h" #include "audiodevice.h" #include #include LXQtVolumeConfiguration::LXQtVolumeConfiguration(PluginSettings *settings, bool ossAvailable, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtVolumeConfiguration), mLockSettingChanges(false) { ui->setupUi(this); loadSettings(); connect(ui->devAddedCombo, &QComboBox::currentIndexChanged, this, &LXQtVolumeConfiguration::sinkSelectionChanged); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtVolumeConfiguration::dialogButtonsAction); connect(ui->muteOnMiddleClickCheckBox, &QCheckBox::toggled, this, &LXQtVolumeConfiguration::muteOnMiddleClickChanged); connect(ui->mixerLineEdit, &QLineEdit::textChanged, this, &LXQtVolumeConfiguration::mixerLineEditChanged); connect(ui->stepSpinBox, &QSpinBox::valueChanged, this, &LXQtVolumeConfiguration::stepSpinBoxChanged); connect(ui->ignoreMaxVolumeCheckBox, &QCheckBox::toggled, this, &LXQtVolumeConfiguration::ignoreMaxVolumeCheckBoxChanged); connect(ui->alwaysShowNotificationsCheckBox, &QAbstractButton::toggled, this, &LXQtVolumeConfiguration::alwaysShowNotificationsCheckBoxChanged); connect(ui->showKeyboardNotificationsCheckBox, &QAbstractButton::toggled, this, &LXQtVolumeConfiguration::showKeyboardNotificationsCheckBoxChanged); if (ossAvailable) connect(ui->ossRadioButton, &QRadioButton::toggled, this, &LXQtVolumeConfiguration::audioEngineChanged); else ui->ossRadioButton->setVisible(false); #ifdef USE_PULSEAUDIO connect(ui->pulseAudioRadioButton, &QRadioButton::toggled, this, &LXQtVolumeConfiguration::audioEngineChanged); #else ui->pulseAudioRadioButton->setVisible(false); #endif #ifdef USE_ALSA connect(ui->alsaRadioButton, &QRadioButton::toggled, this, &LXQtVolumeConfiguration::audioEngineChanged); #else ui->alsaRadioButton->setVisible(false); #endif } LXQtVolumeConfiguration::~LXQtVolumeConfiguration() { delete ui; } void LXQtVolumeConfiguration::setSinkList(const QList sinks) { // preserve the current index, as we change the list int tmp_index = settings().value(QStringLiteral(SETTINGS_DEVICE), SETTINGS_DEFAULT_DEVICE).toInt(); const bool old_block = ui->devAddedCombo->blockSignals(true); ui->devAddedCombo->clear(); for (const AudioDevice *dev : std::as_const(sinks)) { ui->devAddedCombo->addItem(dev->description(), dev->index()); } ui->devAddedCombo->setCurrentIndex(tmp_index); ui->devAddedCombo->blockSignals(old_block); } void LXQtVolumeConfiguration::audioEngineChanged(bool checked) { if (!checked) return; bool canIgnoreMaxVolume = false; if (ui->pulseAudioRadioButton->isChecked()) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_AUDIO_ENGINE), QStringLiteral("PulseAudio")); canIgnoreMaxVolume = true; } else if (!mLockSettingChanges) { if(ui->alsaRadioButton->isChecked()) settings().setValue(QStringLiteral(SETTINGS_AUDIO_ENGINE), QStringLiteral("Alsa")); else settings().setValue(QStringLiteral(SETTINGS_AUDIO_ENGINE), QStringLiteral("Oss")); } ui->ignoreMaxVolumeCheckBox->setEnabled(canIgnoreMaxVolume); } void LXQtVolumeConfiguration::sinkSelectionChanged(int index) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_DEVICE), index >= 0 ? index : 0); } void LXQtVolumeConfiguration::muteOnMiddleClickChanged(bool state) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_MUTE_ON_MIDDLECLICK), state); } void LXQtVolumeConfiguration::mixerLineEditChanged(const QString &command) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_MIXER_COMMAND), command); } void LXQtVolumeConfiguration::stepSpinBoxChanged(int step) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_STEP), step); } void LXQtVolumeConfiguration::ignoreMaxVolumeCheckBoxChanged(bool state) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_IGNORE_MAX_VOLUME), state); } void LXQtVolumeConfiguration::alwaysShowNotificationsCheckBoxChanged(bool state) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_ALWAYS_SHOW_NOTIFICATIONS), state); // since always showing notifications is the sufficient condition for showing them with keyboard, // self-consistency requires setting the latter to true whenever the former is toggled by the user ui->showKeyboardNotificationsCheckBox->setEnabled(!state); if (!ui->showKeyboardNotificationsCheckBox->isChecked()) ui->showKeyboardNotificationsCheckBox->setChecked(true); else if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_SHOW_KEYBOARD_NOTIFICATIONS), true); } void LXQtVolumeConfiguration::showKeyboardNotificationsCheckBoxChanged(bool state) { if (!mLockSettingChanges) settings().setValue(QStringLiteral(SETTINGS_SHOW_KEYBOARD_NOTIFICATIONS), state); } void LXQtVolumeConfiguration::loadSettings() { mLockSettingChanges = true; QString engine = settings().value(QStringLiteral(SETTINGS_AUDIO_ENGINE), QStringLiteral(SETTINGS_DEFAULT_AUDIO_ENGINE)).toString().toLower(); if (engine == QLatin1String("pulseaudio")) ui->pulseAudioRadioButton->setChecked(true); else if (engine == QLatin1String("alsa")) ui->alsaRadioButton->setChecked(true); else ui->ossRadioButton->setChecked(true); // currently, this option is only supported by the pulse audio backend if(!ui->pulseAudioRadioButton->isChecked()) ui->ignoreMaxVolumeCheckBox->setEnabled(false); setComboboxIndexByData(ui->devAddedCombo, settings().value(QStringLiteral(SETTINGS_DEVICE), SETTINGS_DEFAULT_DEVICE), 1); ui->muteOnMiddleClickCheckBox->setChecked(settings().value(QStringLiteral(SETTINGS_MUTE_ON_MIDDLECLICK), SETTINGS_DEFAULT_MUTE_ON_MIDDLECLICK).toBool()); ui->mixerLineEdit->setText(settings().value(QStringLiteral(SETTINGS_MIXER_COMMAND), QStringLiteral(SETTINGS_DEFAULT_MIXER_COMMAND)).toString()); ui->stepSpinBox->setValue(settings().value(QStringLiteral(SETTINGS_STEP), SETTINGS_DEFAULT_STEP).toInt()); ui->ignoreMaxVolumeCheckBox->setChecked(settings().value(QStringLiteral(SETTINGS_IGNORE_MAX_VOLUME), SETTINGS_DEFAULT_IGNORE_MAX_VOLUME).toBool()); ui->alwaysShowNotificationsCheckBox->setChecked(settings().value(QStringLiteral(SETTINGS_ALWAYS_SHOW_NOTIFICATIONS), SETTINGS_DEFAULT_ALWAYS_SHOW_NOTIFICATIONS).toBool()); // always showing notifications is the sufficient condition for showing them with keyboard if (ui->alwaysShowNotificationsCheckBox->isChecked()) { ui->showKeyboardNotificationsCheckBox->setChecked(true); ui->showKeyboardNotificationsCheckBox->setEnabled(false); } else { ui->showKeyboardNotificationsCheckBox->setChecked(settings().value(QStringLiteral(SETTINGS_SHOW_KEYBOARD_NOTIFICATIONS), SETTINGS_DEFAULT_SHOW_KEYBOARD_NOTIFICATIONS).toBool()); } mLockSettingChanges = false; } ================================================ FILE: plugin-volume/lxqtvolumeconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2010-2011 Razor team * Authors: * Alexander Sokoloff * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQTVOLUMECONFIGURATION_H #define LXQTVOLUMECONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #define SETTINGS_MIXER_COMMAND "mixerCommand" #define SETTINGS_MUTE_ON_MIDDLECLICK "showOnMiddleClick" #define SETTINGS_DEVICE "device" #define SETTINGS_STEP "volumeAdjustStep" #define SETTINGS_IGNORE_MAX_VOLUME "ignoreMaxVolume" #define SETTINGS_AUDIO_ENGINE "audioEngine" #define SETTINGS_ALWAYS_SHOW_NOTIFICATIONS "alwaysShowNotifications" #define SETTINGS_SHOW_KEYBOARD_NOTIFICATIONS "showKeyboardNotifications" #define SETTINGS_DEFAULT_MUTE_ON_MIDDLECLICK true #define SETTINGS_DEFAULT_DEVICE 0 #define SETTINGS_DEFAULT_STEP 3 #ifdef USE_PULSEAUDIO #define SETTINGS_DEFAULT_MIXER_COMMAND "pavucontrol-qt" #define SETTINGS_DEFAULT_AUDIO_ENGINE "PulseAudio" #elif defined(USE_ALSA) #define SETTINGS_DEFAULT_MIXER_COMMAND "qasmixer" #define SETTINGS_DEFAULT_AUDIO_ENGINE "Alsa" #else #define SETTINGS_DEFAULT_MIXER_COMMAND "" #define SETTINGS_DEFAULT_AUDIO_ENGINE "Oss" #endif #define SETTINGS_DEFAULT_IGNORE_MAX_VOLUME false #define SETTINGS_DEFAULT_IGNORE_MAX_VOLUME false #define SETTINGS_DEFAULT_ALWAYS_SHOW_NOTIFICATIONS false #define SETTINGS_DEFAULT_SHOW_KEYBOARD_NOTIFICATIONS true class AudioDevice; namespace Ui { class LXQtVolumeConfiguration; } class LXQtVolumeConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtVolumeConfiguration(PluginSettings *settings, bool ossAvailable, QWidget *parent = nullptr); ~LXQtVolumeConfiguration(); public slots: void setSinkList(const QList sinks); void audioEngineChanged(bool checked); void sinkSelectionChanged(int index); void muteOnMiddleClickChanged(bool state); void mixerLineEditChanged(const QString &command); void stepSpinBoxChanged(int step); void ignoreMaxVolumeCheckBoxChanged(bool state); void alwaysShowNotificationsCheckBoxChanged(bool state); void showKeyboardNotificationsCheckBoxChanged(bool state); protected slots: virtual void loadSettings(); private: Ui::LXQtVolumeConfiguration *ui; bool mLockSettingChanges; }; #endif // LXQTVOLUMECONFIGURATION_H ================================================ FILE: plugin-volume/lxqtvolumeconfiguration.ui ================================================ LXQtVolumeConfiguration 0 0 306 407 Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard 0 0 Volume adjust step 1 External Mixer Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset buttons accepted() LXQtVolumeConfiguration accept() buttons rejected() LXQtVolumeConfiguration reject() ================================================ FILE: plugin-volume/ossengine.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2014 LXQt team * Authors: * Hong Jen Yee (PCMan) * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "ossengine.h" #include "audiodevice.h" #include #include #include #include #include #include #include #if defined(__FreeBSD__) || defined(__NetBSD__) #include #elif defined(__linux__) || defined(__Linux__) #include #else #error "Not supported platform" #endif OssEngine::OssEngine(QObject *parent) : AudioEngine(parent), m_mixer(-1), m_device(nullptr), m_leftVolume(0), m_rightVolume(0) { qDebug() << "OssEngine"; initMixer(); } OssEngine::~OssEngine() { if(m_mixer >= 0) close(m_mixer); } void OssEngine::initMixer() { m_mixer = open ("/dev/mixer", O_RDWR, 0); if (m_mixer < 0) { qDebug() << "/dev/mixer cannot be opened"; return; } qDebug() << "InitMixer:" << m_mixer; m_device = new AudioDevice(Sink, this); m_device->setName(QStringLiteral("Master")); m_device->setIndex(0); m_device->setDescription(QStringLiteral("Master Volume")); m_device->setMuteNoCommit(false); updateVolume(); m_sinks.append(m_device); emit sinkListChanged(); } void OssEngine::updateVolume() { if(m_mixer < 0 || !m_device) return; int volumes; if(ioctl(m_mixer, MIXER_READ(SOUND_MIXER_VOLUME), &volumes) < 0) { qDebug() << "updateVolume() failed" << errno; } m_leftVolume = volumes & 0xff; // left m_rightVolume = (volumes >> 8) & 0xff; // right qDebug() << "volume:" << m_leftVolume << m_rightVolume; m_device->setVolumeNoCommit(m_leftVolume); } void OssEngine::setVolume(int volume) { if(m_mixer < 0) return; int volumes = (volume << 8) + volume; if(ioctl(m_mixer, MIXER_WRITE(SOUND_MIXER_VOLUME), &volumes) < 0) { qDebug() << "setVolume() failed" << errno; } else { qDebug() << "setVolume()" << volume; } } void OssEngine::commitDeviceVolume(AudioDevice *device) { if (!device) return; setVolume(device->volume()); } void OssEngine::setMute(AudioDevice * /*device*/, bool state) { if(state) setVolume(0); else setVolume(m_leftVolume); } void OssEngine::setIgnoreMaxVolume(bool /*ignore*/) { // TODO } ================================================ FILE: plugin-volume/ossengine.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef OSSENGINE_H #define OSSENGINE_H #include "audioengine.h" #include #include #include class AudioDevice; class OssEngine : public AudioEngine { Q_OBJECT public: OssEngine(QObject *parent = nullptr); ~OssEngine(); virtual const QString backendName() const { return QLatin1String("Oss"); } virtual int volumeMax(AudioDevice */*device*/) const { return 100; } virtual void commitDeviceVolume(AudioDevice *device); virtual void setMute(AudioDevice *device, bool state); virtual void setIgnoreMaxVolume(bool ignore); signals: void sinkInfoChanged(AudioDevice *device); void readyChanged(bool ready); private: void initMixer(); void updateVolume(); void setVolume(int volume); private: int m_mixer; // oss mixer fd AudioDevice* m_device; int m_leftVolume; int m_rightVolume; }; #endif // OSSENGINE_H ================================================ FILE: plugin-volume/pulseaudioengine.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "pulseaudioengine.h" #include "audiodevice.h" #include #include #include #include #include //#define PULSEAUDIO_ENGINE_DEBUG // PA_VOLUME_UI_MAX is only supported since pulseaudio 0.9.23 #ifndef PA_VOLUME_UI_MAX #define PA_VOLUME_UI_MAX (pa_sw_volume_from_dB(+11.0)) #endif PulseAudioEngine::PulseAudioDevice::PulseAudioDevice(const pa_sink_info &pa_info) : name{QString::fromUtf8(pa_info.name)} , description{QString::fromUtf8(pa_info.description)} , index{pa_info.index} , mute{pa_info.mute} , volume{pa_info.volume} {} void PulseAudioEngine::sinkInfoCallback(pa_context *context, const pa_sink_info *info, int isLast, void *userdata) { PulseAudioEngine *pulseEngine = static_cast(userdata); if (isLast < 0) { pa_threaded_mainloop_signal(pulseEngine->m_mainLoop, 0); qWarning() << QStringLiteral("Failed to get sink information: %1").arg(QString::fromUtf8(pa_strerror(pa_context_errno(context)))); return; } if (isLast) { pa_threaded_mainloop_signal(pulseEngine->m_mainLoop, 0); return; } emit pulseEngine->sinkInfoReceived(PulseAudioDevice{*info}); } void PulseAudioEngine::contextEventCallback(pa_context * /*context*/, const char * #ifdef PULSEAUDIO_ENGINE_DEBUG name #endif , pa_proplist * /*p*/, void * /*userdata*/) { #ifdef PULSEAUDIO_ENGINE_DEBUG qWarning("event received %s", name); #endif } void PulseAudioEngine::contextStateCallback(pa_context *context, void *userdata) { PulseAudioEngine *pulseEngine = static_cast(userdata); // update internal state pa_context_state_t state = pa_context_get_state(context); pulseEngine->setContextState(state); #ifdef PULSEAUDIO_ENGINE_DEBUG switch (state) { case PA_CONTEXT_UNCONNECTED: qWarning("context unconnected"); break; case PA_CONTEXT_CONNECTING: qWarning("context connecting"); break; case PA_CONTEXT_AUTHORIZING: qWarning("context authorizing"); break; case PA_CONTEXT_SETTING_NAME: qWarning("context setting name"); break; case PA_CONTEXT_READY: qWarning("context ready"); break; case PA_CONTEXT_FAILED: qWarning("context failed"); break; case PA_CONTEXT_TERMINATED: qWarning("context terminated"); break; default: qWarning("we should never hit this state"); } #endif pa_threaded_mainloop_signal(pulseEngine->m_mainLoop, 0); } void PulseAudioEngine::contextSuccessCallback(pa_context *, int , void *userdata) { pa_threaded_mainloop_signal(static_cast(userdata)->m_mainLoop, 0); } void PulseAudioEngine::contextSubscriptionCallback(pa_context * /*context*/, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { PulseAudioEngine *pulseEngine = static_cast(userdata); if (PA_SUBSCRIPTION_EVENT_REMOVE == t) emit pulseEngine->sinkRemoved(idx); else pulseEngine->requestSinkInfoUpdate(idx); } PulseAudioEngine::PulseAudioEngine(QObject *parent) : AudioEngine(parent), m_context(nullptr), m_contextState(PA_CONTEXT_UNCONNECTED), m_ready(false), m_maximumVolume(PA_VOLUME_NORM) { qRegisterMetaType("pa_context_state_t"); m_reconnectionTimer.setSingleShot(true); m_reconnectionTimer.setInterval(100); connect(&m_reconnectionTimer, &QTimer::timeout, this, &PulseAudioEngine::connectContext); m_mainLoop = pa_threaded_mainloop_new(); if (m_mainLoop == nullptr) { qWarning("Unable to create pulseaudio mainloop"); return; } if (pa_threaded_mainloop_start(m_mainLoop) != 0) { qWarning("Unable to start pulseaudio mainloop"); pa_threaded_mainloop_free(m_mainLoop); m_mainLoop = nullptr; return; } m_mainLoopApi = pa_threaded_mainloop_get_api(m_mainLoop); connect(this, &PulseAudioEngine::contextStateChanged, this, &PulseAudioEngine::handleContextStateChanged); connect(this, &PulseAudioEngine::sinkRemoved, this, &PulseAudioEngine::removeSink, Qt::QueuedConnection); connect(this, &PulseAudioEngine::sinkInfoReceived, this, &PulseAudioEngine::addOrUpdateSink, Qt::QueuedConnection); connectContext(); } PulseAudioEngine::~PulseAudioEngine() { if (m_context) { pa_context_unref(m_context); m_context = nullptr; } if (m_mainLoop) { pa_threaded_mainloop_free(m_mainLoop); m_mainLoop = nullptr; } } void PulseAudioEngine::removeSink(uint32_t idx) { auto dev_i = std::find_if(m_sinks.begin(), m_sinks.end(), [idx] (AudioDevice * dev) { return dev->index() == idx; }); if (m_sinks.end() == dev_i) return; std::unique_ptr dev{*dev_i}; m_cVolumeMap.remove(dev.get()); m_sinks.erase(dev_i); emit sinkListChanged(); } void PulseAudioEngine::addOrUpdateSink(const PulseAudioDevice &pulse_dev) { auto const dev_it = std::find_if(m_sinks.constBegin(), m_sinks.constEnd(), [&](auto const dev) { return dev->name() == pulse_dev.name; }); AudioDevice* dev = nullptr; bool newSink = false; if (dev_it == m_sinks.constEnd()) { dev = new AudioDevice(Sink, this); newSink = true; } else { dev = *dev_it; } dev->setName(pulse_dev.name); dev->setIndex(pulse_dev.index); dev->setDescription(pulse_dev.description); dev->setMuteNoCommit(pulse_dev.mute); // TODO: save separately? alsa does not have it m_cVolumeMap.insert(dev, pulse_dev.volume); pa_volume_t v = pa_cvolume_avg(&(pulse_dev.volume)); // convert real volume to percentage dev->setVolumeNoCommit(std::round((static_cast(v) * 100.0) / m_maximumVolume)); if (newSink) { //keep the sinks sorted by index() m_sinks.insert( std::lower_bound(m_sinks.begin(), m_sinks.end(), dev, [] (AudioDevice const * const a, AudioDevice const * const b) { return a->name() < b->name(); }) , dev); emit sinkListChanged(); } } void PulseAudioEngine::requestSinkInfoUpdate(uint32_t idx) { emit sinkInfoChanged(idx); } void PulseAudioEngine::commitDeviceVolume(AudioDevice *device) { if (!device || !m_ready) return; // convert from percentage to real volume value pa_volume_t v = ((double)device->volume() / 100.0) * m_maximumVolume; pa_cvolume tmpVolume = m_cVolumeMap.value(device); pa_cvolume *volume = pa_cvolume_set(&tmpVolume, tmpVolume.channels, v); // qDebug() << "PulseAudioEngine::commitDeviceVolume" << v; pa_threaded_mainloop_lock(m_mainLoop); pa_operation *operation; if (device->type() == Sink) operation = pa_context_set_sink_volume_by_index(m_context, device->index(), volume, contextSuccessCallback, this); else operation = pa_context_set_source_volume_by_index(m_context, device->index(), volume, contextSuccessCallback, this); while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); } void PulseAudioEngine::retrieveSinks() { if (!m_ready) return; pa_threaded_mainloop_lock(m_mainLoop); pa_operation *operation; operation = pa_context_get_sink_info_list(m_context, sinkInfoCallback, this); while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); } void PulseAudioEngine::setupSubscription() { if (!m_ready) return; connect(this, &PulseAudioEngine::sinkInfoChanged, this, &PulseAudioEngine::retrieveSinkInfo, Qt::QueuedConnection); pa_context_set_subscribe_callback(m_context, contextSubscriptionCallback, this); pa_threaded_mainloop_lock(m_mainLoop); pa_operation *operation; operation = pa_context_subscribe(m_context, PA_SUBSCRIPTION_MASK_SINK, contextSuccessCallback, this); while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); } void PulseAudioEngine::handleContextStateChanged() { if (m_contextState == PA_CONTEXT_FAILED || m_contextState == PA_CONTEXT_TERMINATED) { qWarning("LXQt-Volume: Context connection failed or terminated lets try to reconnect"); m_reconnectionTimer.start(); } } void PulseAudioEngine::connectContext() { bool keepGoing = true; bool ok = false; m_reconnectionTimer.stop(); if (!m_mainLoop) return; pa_threaded_mainloop_lock(m_mainLoop); if (m_context) { pa_context_unref(m_context); m_context = nullptr; } m_context = pa_context_new(m_mainLoopApi, "lxqt-volume"); pa_context_set_state_callback(m_context, contextStateCallback, this); pa_context_set_event_callback(m_context, contextEventCallback, this); if (!m_context) { pa_threaded_mainloop_unlock(m_mainLoop); m_reconnectionTimer.start(); return; } if (pa_context_connect(m_context, nullptr, (pa_context_flags_t)0, nullptr) < 0) { pa_threaded_mainloop_unlock(m_mainLoop); m_reconnectionTimer.start(); return; } while (keepGoing) { switch (m_contextState) { case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: keepGoing = false; ok = true; break; case PA_CONTEXT_TERMINATED: keepGoing = false; break; case PA_CONTEXT_FAILED: default: qWarning() << QStringLiteral("Connection failure: %1").arg(QString::fromUtf8(pa_strerror(pa_context_errno(m_context)))); keepGoing = false; } if (keepGoing) pa_threaded_mainloop_wait(m_mainLoop); } pa_threaded_mainloop_unlock(m_mainLoop); if (ok) { retrieveSinks(); setupSubscription(); } else { m_reconnectionTimer.start(); } } void PulseAudioEngine::retrieveSinkInfo(uint32_t idx) { if (!m_ready) return; pa_threaded_mainloop_lock(m_mainLoop); pa_operation *const operation = pa_context_get_sink_info_by_index(m_context, idx, sinkInfoCallback, this); while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); } void PulseAudioEngine::setMute(AudioDevice *device, bool state) { if (!m_ready) return; pa_threaded_mainloop_lock(m_mainLoop); pa_operation *const operation = pa_context_set_sink_mute_by_index(m_context, device->index(), state, contextSuccessCallback, this); while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); } bool PulseAudioEngine::setDefaultSink(AudioDevice *device) { if (!device || !m_ready) return false; const QByteArray name = device->name().toUtf8(); if (name.isEmpty()) return false; pa_threaded_mainloop_lock(m_mainLoop); pa_operation *operation = pa_context_set_default_sink(m_context, name.constData(), contextSuccessCallback, this); if (!operation) { pa_threaded_mainloop_unlock(m_mainLoop); return false; } while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) pa_threaded_mainloop_wait(m_mainLoop); pa_operation_unref(operation); pa_threaded_mainloop_unlock(m_mainLoop); return true; } void PulseAudioEngine::setContextState(pa_context_state_t state) { if (m_contextState == state) return; m_contextState = state; // update ready member as it depends on state if (m_ready == (m_contextState == PA_CONTEXT_READY)) return; m_ready = (m_contextState == PA_CONTEXT_READY); emit contextStateChanged(m_contextState); emit readyChanged(m_ready); } void PulseAudioEngine::setIgnoreMaxVolume(bool ignore) { int oldMax = m_maximumVolume; if (ignore) m_maximumVolume = PA_VOLUME_UI_MAX; else m_maximumVolume = PA_VOLUME_NORM; if (oldMax != m_maximumVolume) retrieveSinks(); } ================================================ FILE: plugin-volume/pulseaudioengine.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef PULSEAUDIOENGINE_H #define PULSEAUDIOENGINE_H #include "audioengine.h" #include #include #include #include #include class AudioDevice; class PulseAudioEngine : public AudioEngine { Q_OBJECT public: PulseAudioEngine(QObject *parent = nullptr); ~PulseAudioEngine(); const QString backendName() const override { return QLatin1String("PulseAudio"); } int volumeMax(AudioDevice */*device*/) const override { return m_maximumVolume; } bool setDefaultSink(AudioDevice *device) override; struct PulseAudioDevice { PulseAudioDevice(const pa_sink_info&); QString name; QString description; uint32_t index; int mute; pa_cvolume volume; }; public slots: void commitDeviceVolume(AudioDevice *device) override; void retrieveSinkInfo(uint32_t idx); void setMute(AudioDevice *device, bool state) override; void setContextState(pa_context_state_t state); void setIgnoreMaxVolume(bool ignore) override; signals: void sinkInfoChanged(uint32_t idx); void contextStateChanged(pa_context_state_t state); void readyChanged(bool ready); void sinkRemoved(uint32_t); void sinkInfoReceived(const PulseAudioDevice&); private slots: void handleContextStateChanged(); void connectContext(); void removeSink(uint32_t idx); void addOrUpdateSink(const PulseAudioDevice&); private: static void sinkInfoCallback(pa_context *, const pa_sink_info *, int, void *); static void contextStateCallback(pa_context *, void *); static void contextSuccessCallback(pa_context *, int, void *); static void contextSubscriptionCallback(pa_context *, pa_subscription_event_type_t, uint32_t, void *); static void contextEventCallback(pa_context *, const char *, pa_proplist *, void *); void retrieveSinks(); void setupSubscription(); void requestSinkInfoUpdate(uint32_t idx); pa_mainloop_api *m_mainLoopApi; pa_threaded_mainloop *m_mainLoop; pa_context *m_context; pa_context_state_t m_contextState; bool m_ready; QTimer m_reconnectionTimer; int m_maximumVolume; QMap m_cVolumeMap; }; #endif // PULSEAUDIOENGINE_H ================================================ FILE: plugin-volume/resources/volume.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=multimedia-volume-control #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-volume/translations/volume.desktop.yaml ================================================ Desktop Entry/Name: "Volume Control" Desktop Entry/Comment: "Control the system's volume and launch your preferred mixer" ================================================ FILE: plugin-volume/translations/volume.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_ar.desktop.yaml ================================================ Desktop Entry/Name: "تحكّم بمستوى الصّوت" Desktop Entry/Comment: "تحكّم بمستوى صوت النّظام وأطلق المازج المفضّل لك" ================================================ FILE: plugin-volume/translations/volume_ar.ts ================================================ LXQtVolume Increase sound volume رفع مستوى الصوت Decrease sound volume خفض مستوى الصوت Mute/unmute sound volume كتم/إلغاء كتم الصوت Volume Control: The following shortcuts can not be registered: %1 التحكّم بالصوت: تعذّر تسجيل الاختصارات التالية: %1 %1: %2% Volume: %1%%2 مستوى الصوت: %L1٪%L2 (muted) (مكتوم) LXQtVolumeConfiguration Volume Control Settings إعدادات التحكّم بالصوت Device to control جهاز للتحكّم به ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior السلوك Mute on middle click اكتم بالنقر على البكرة Allow volume beyond 100% (0dB) اسمح بارتفاع المستوى على ١٠٠٪ (٠ديسيبيل) Always notify about volume changes أخطِرني دومًا بتغييرات مستوى الصوت Notify about volume changes with keyboard أخطِرني بتغييرات مستوى الصوت باستعمال لوحة المفاتيح Volume adjust step عتبة ضبط مستوى الصوت External Mixer المازج الخارجي VolumePopup Launch mixer أطلِق المازج Mi&xer &المازج Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_arn.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_ast.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_bg.desktop.yaml ================================================ Desktop Entry/Name: "Контрол на звука" Desktop Entry/Comment: "Контролиране на силата на звука и избор на миксер" ================================================ FILE: plugin-volume/translations/volume_bg.ts ================================================ LXQtVolume Increase sound volume Увеличаване на звука Decrease sound volume Намаляване на звука Mute/unmute sound volume Включване/Изключване на заглушаване Volume Control: The following shortcuts can not be registered: %1 Контрол на звука: Следните клавиатурни комбинации не могат да бъдат регистрирани: %1 %1: %2% %1: %2% Volume: %1%%2 Сила на звука: %1%%2 (muted) (заглушен) LXQtVolumeConfiguration Volume Control Settings Настройки на управление на звука Device to control Устройство за управление ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Поведение Mute on middle click Заглушаване при кликване със средния бутон Allow volume beyond 100% (0dB) Разрешаване сила на звука над 100% (0 dB) Always notify about volume changes Винаги да се информира при промяна на звука Notify about volume changes with keyboard Информиране при промяна на звука с клавиатурата Volume adjust step Стъпки на настройките External Mixer Външен миксер VolumePopup Launch mixer Стартиране на миксер Mi&xer &Миксер Mute Заглушаване Set as default output Задаване като изход по подразбиране Default output Изход по подразбиране ================================================ FILE: plugin-volume/translations/volume_ca.desktop.yaml ================================================ Desktop Entry/Name: "Control del volum" Desktop Entry/Comment: "Controleu el volum del sistema i executeu el mesclador preferit" ================================================ FILE: plugin-volume/translations/volume_ca.ts ================================================ LXQtVolume Increase sound volume Augmenta el volum del so Decrease sound volume Redueix el volum del so Mute/unmute sound volume Silencia/Activa el volum del so Volume Control: The following shortcuts can not be registered: %1 Control de volum: No es poden registrar les següents dreceres:%1 %1: %2% Volume: %1%%2 Volum: %1%%2 (muted) (silenciat) LXQtVolumeConfiguration Volume Control Settings Configuració del control de volum Device to control Dispositiu a controlar ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Comportament Mute on middle click Silencia amb el clic central del ratolí Allow volume beyond 100% (0dB) Permet que el volum superi el 100% (0 dB) Always notify about volume changes Notifica sempre sobre els canvis de volum Notify about volume changes with keyboard Notifica els canvis de volum amb el teclat Volume adjust step Pas d'ajust del volum External Mixer Mesclador extern VolumePopup Launch mixer Inicia el mesclador Mi&xer Mes&clador Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_cs.desktop.yaml ================================================ Desktop Entry/Name: "Ovládání hlasitosti" Desktop Entry/Comment: "Ovládejte hlasitost systému a spusťte vámi upřednostňovaný\ \ směšovač" ================================================ FILE: plugin-volume/translations/volume_cs.ts ================================================ LXQtVolume Increase sound volume Zesílit zvuk Decrease sound volume Zeslabit zvuk Mute/unmute sound volume Ztlumit / zrušit ztlumení zvuku Volume Control: The following shortcuts can not be registered: %1 Ovládání hlasitosti: Následující klávesové zkratky nelze zaregistrovat: %1 %1: %2% %1: %2% Volume: %1%%2 Hlasitost: %1%%2 (muted) (ztlumeno) LXQtVolumeConfiguration Volume Control Settings Nastavení ovládání hlasitosti Device to control Ovládané zařízení ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Chování Mute on middle click Ztlumit kliknutím prostředním tlačítkem Allow volume beyond 100% (0dB) Umožnit nastavit hlasitost přes 100% (0 dB) Always notify about volume changes Vždy upozornit na změny hlasitosti Notify about volume changes with keyboard Oznamovat změny hlasitosti, provedené pomocí kláves Volume adjust step Hlasitost měnit v krocích o velikosti External Mixer Externí směšovač VolumePopup Launch mixer Spustit směšovač Mi&xer &Směšovač Mute Ztlumit Set as default output Nastavit jako výchozí výstup Default output Výchozí výstup ================================================ FILE: plugin-volume/translations/volume_cy.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_da.desktop.yaml ================================================ Desktop Entry/Name: "Lydstyrkekontrol" Desktop Entry/Comment: "Justér systemets lydstyrke og start din foretrukne mikser" ================================================ FILE: plugin-volume/translations/volume_da.ts ================================================ LXQtVolume Increase sound volume Højere lydstyrke Decrease sound volume Lavere lydstyrke Mute/unmute sound volume Lydløs til/fra Volume Control: The following shortcuts can not be registered: %1 Lydstyrkekontrol: Følgende genveje kan ikke registreres: %1 %1: %2% Volume: %1%%2 Lydstyrke: %1%%2 (muted) (lydløst) LXQtVolumeConfiguration Volume Control Settings Indstillinger for lydstyrkekontrol Device to control Enhed som skal styres ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Opførsel Mute on middle click Lydløs ved midterklik Allow volume beyond 100% (0dB) Tillad lydstyrke over 100% (0dB) Always notify about volume changes Underret altid når lydstyrken ændres Notify about volume changes with keyboard Underret når lydstyrken ændres med tastaturet Volume adjust step Trin for lydstyrkejustering External Mixer Ekstern mikser VolumePopup Launch mixer Start mikser Mi&xer &Mikser Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_de.desktop.yaml ================================================ Desktop Entry/Name: "Lautstärkeeinstellung" Desktop Entry/Comment: "Systemlautstärke einstellen und den bevorzugten Mischer starten" ================================================ FILE: plugin-volume/translations/volume_de.ts ================================================ LXQtVolume Increase sound volume Lautstärke erhöhen Decrease sound volume Lautstärke verringern Mute/unmute sound volume Lautstärke stummschalten/wiederherstellen Volume Control: The following shortcuts can not be registered: %1 Lautstärkeregler: Die folgenden Tastaturkürzel konnten nicht registriert werden: %1 %1: %2% %1: %2% Volume: %1%%2 Lautstärke: %1%%2 (muted) (stumm) LXQtVolumeConfiguration Volume Control Settings Lautstärkereglereinstellungen Device to control Zu steuerndes Gerät ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Verhalten Mute on middle click Stummschaltung per Mittelklick Allow volume beyond 100% (0dB) Lautstärke über 100 % (0 dB) erlauben Always notify about volume changes Immer über Änderungen der Lautstärke benachrichtigen Notify about volume changes with keyboard Benachrichtigung über Lautstärkeänderungen mit der Tastatur Volume adjust step Lautstärkeschrittweite External Mixer Externer Mischer VolumePopup Launch mixer Mischer starten Mi&xer &Mischer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_el.desktop.yaml ================================================ Desktop Entry/Name: "Έλεγχος έντασης ήχου" Desktop Entry/Comment: "Ελέγξτε την ένταση ήχου του συστήματος και εκκινήστε τον προτιμώμενο μίκτη" ================================================ FILE: plugin-volume/translations/volume_el.ts ================================================ LXQtVolume Increase sound volume Αύξηση της έντασης του ήχου Decrease sound volume Μείωση της έντασης του ήχου Mute/unmute sound volume Σίγαση/αποσίγαση της έντασης του ήχου Volume Control: The following shortcuts can not be registered: %1 Έλεγχος έντασης: Οι ακόλουθες συντομεύσεις δεν μπόρεσαν να καταχωρηθούν: %1 %1: %2% %1: %2% Volume: %1%%2 Ένταση: %1%%2 (muted) (χωρίς ήχο) LXQtVolumeConfiguration Volume Control Settings Ρυθμίσεις του ελέγχου έντασης του ήχου Device to control Συσκευή για έλεγχο ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Συμπεριφορά Mute on middle click Σίγαση με μεσαίο κλικ Allow volume beyond 100% (0dB) Να επιτρέπεται ένταση πάνω από 100% (0dB) Always notify about volume changes Ειδοποίηση πάντα σε αλλαγές στην ένταση Notify about volume changes with keyboard Ειδοποίηση αλλαγών στην ένταση με το πληκτρολόγιο Volume adjust step Βήμα προσαρμογής της έντασης External Mixer Εξωτερικός μίκτης VolumePopup Launch mixer Εκτέλεση του μίκτη Mi&xer Μί&κτης Mute Σίγαση Set as default output Ορισμός ως προεπιλεγμένη έξοδος Default output Προεπιλεγμένη έξοδος ================================================ FILE: plugin-volume/translations/volume_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "Volume Control" Desktop Entry/Comment: "Control the system's volume and launch your preferred mixer" ================================================ FILE: plugin-volume/translations/volume_en_GB.ts ================================================ LXQtVolume Increase sound volume Increase sound volume Decrease sound volume Decrease sound volume Mute/unmute sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 Volume: %1%%2 (muted) (muted) LXQtVolumeConfiguration Volume Control Settings Volume Control Settings Device to control Device to control ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Behaviour Mute on middle click Mute on middle click Allow volume beyond 100% (0dB) Allow volume beyond 100% (0dB) Always notify about volume changes Always notify about volume changes Notify about volume changes with keyboard Notify about volume changes with keyboard Volume adjust step Volume adjust step External Mixer External Mixer VolumePopup Launch mixer Launch mixer Mi&xer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_eo.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_es.desktop.yaml ================================================ Desktop Entry/Name: "Control de volumen" Desktop Entry/Comment: "Controla el volumen del sistema y lanza su mezclador preferido" ================================================ FILE: plugin-volume/translations/volume_es.ts ================================================ LXQtVolume Increase sound volume Aumentar el volumen del sonido Decrease sound volume Reducir el volumen del sonido Mute/unmute sound volume Silenciar/No silenciar el volumen del sonido Volume Control: The following shortcuts can not be registered: %1 Control de volumen: los siguientes atajos no han podido registrarse: %1 %1: %2% Volume: %1%%2 Volumen: %1%%2 (muted) (silenciado) LXQtVolumeConfiguration Volume Control Settings Configuración de Control de volumen Device to control Dispositivo que controlar ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Comportamiento Mute on middle click Silenciar haciendo clic con el botón central Allow volume beyond 100% (0dB) Permitir que el volumen sobrepase el 100% (0dB) Always notify about volume changes Notificar siempre los cambios de volumen Notify about volume changes with keyboard Notificar los cambios de volumen con el teclado Volume adjust step Paso del ajuste de volumen External Mixer Mezclador externo VolumePopup Launch mixer Ejecuta el mezclador Mi&xer &Mezclador Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_es_VE.desktop.yaml ================================================ Desktop Entry/Name: "Control de volumen" Desktop Entry/Comment: "Controla el volumen del sistema y lanza el mezclador escogido referido" ================================================ FILE: plugin-volume/translations/volume_es_VE.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control Disositivo ALSA PulseAudio PulseAudio OSS Behavior Comportamiento Mute on middle click Silenciar en clic medio Allow volume beyond 100% (0dB) permitir volumen mas alla de 100% (0db) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step paso de ajuste de volumen External Mixer Mexclador VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_et.desktop.yaml ================================================ Desktop Entry/Name: "Helivaljuse haldus" Desktop Entry/Comment: "Halda helivaljust ja käivita eelistatud väline mikserirakendus" ================================================ FILE: plugin-volume/translations/volume_et.ts ================================================ LXQtVolume Increase sound volume Suurenda helivaljust Decrease sound volume Vähenda helivaljust Mute/unmute sound volume Summuta või taasta heli Volume Control: The following shortcuts can not be registered: %1 Helivaljuse haldus: Järgnevat kiirklahvi ei õnnestu salvestada: %1 %1: %2% %1: %2% Volume: %1%%2 Helivaljus: %1%%2 (muted) (summutatud) LXQtVolumeConfiguration Volume Control Settings Helivaljuse halduse seadistused Device to control Hallatav seade ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Tegevused Mute on middle click Hiire keskmise klahviga vajutamine summutab heli Allow volume beyond 100% (0dB) Luba helivaljus üle 100% (0dB) Always notify about volume changes Alati teavita helivaljuse muutustest Notify about volume changes with keyboard Teavita helivaljuse muutmisest klaviatuurilt Volume adjust step Helivaljuse muutmise samm External Mixer Võimalik väline helimikseri rakendus VolumePopup Launch mixer Käivita helimikser Mi&xer Mi&kser Mute Summuta Set as default output Määra vaikimisi väljundiks Default output Vaikimisi väljund ================================================ FILE: plugin-volume/translations/volume_eu.desktop.yaml ================================================ Desktop Entry/Name: "Bolumen-kontrola" Desktop Entry/Comment: "Kontrolatu sistemaren bolumena eta abiarazi zure gogoko nahasgailua." ================================================ FILE: plugin-volume/translations/volume_eu.ts ================================================ LXQtVolume Increase sound volume Soinu bolumena handitu Decrease sound volume Jaitsi soinuaren bolumena Mute/unmute sound volume Desaktibatu/aktibatu soinuaren bolumena Volume Control: The following shortcuts can not be registered: %1 Bolumen-kontrola: lasterbide hauek ezin dira erregistratu: %1 %1: %2% Volume: %1%%2 Bolumena: %1%%2 (muted) (isilduta) LXQtVolumeConfiguration Volume Control Settings Bolumen-kontrolaren ezarpenak Device to control Kontrolatu beharreko gailua ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Portaera Mute on middle click Mututu erdiko botoiarekin klikatzean Allow volume beyond 100% (0dB) Baimendu % 100etik (0dB) gorako bolumena Always notify about volume changes Eman beti bolumen-aldaketen berri Notify about volume changes with keyboard Jakinarazi bolumen-aldaketen berri teklatuarekin Volume adjust step Bolumen-doikuntzaren pausoa External Mixer Kanpoko nahastailea VolumePopup Launch mixer Abiarazi nahasgailua Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_fi.desktop.yaml ================================================ Desktop Entry/Name: "Äänenvoimakkuuden hallinta" Desktop Entry/Comment: "Hallitse järjestelmän äänenvoimakkuutta, ja käynnistä suosimasi mikseri" ================================================ FILE: plugin-volume/translations/volume_fi.ts ================================================ LXQtVolume Increase sound volume Suurenna äänenvoimakkuutta Decrease sound volume Pienennä äänenvoimakkuutta Mute/unmute sound volume Mykistä/poista mykistys Volume Control: The following shortcuts can not be registered: %1 Äänenvoimakkuuden hallinta: Seuraavia pikavalintoja ei voida rekisteröidä: %1 %1: %2% Volume: %1%%2 Äänenvoimakkuus: %1%%2 (muted) (mykistetty) LXQtVolumeConfiguration Volume Control Settings Äänenvoimakkuuden hallinnan asetukset Device to control Hallittava laite ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Toiminta Mute on middle click Vaimenna hiiren keskimmäisen painikkeen painalluksella Allow volume beyond 100% (0dB) Salli yli 100 %:n äänenvoimakkuus (0 dB) Always notify about volume changes Ilmoita aina äänenvoimakkuuden muutoksista Notify about volume changes with keyboard Ilmoita näppäimistöllä tehdystä äänenvoimakkuuden muutoksesta Volume adjust step Äänenvoimakkuuden säätöväli External Mixer Ulkoinen mikseri VolumePopup Launch mixer Avaa mikseri Mi&xer Mikseri Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_fr.desktop.yaml ================================================ Desktop Entry/Name: "Volume audio" Desktop Entry/Comment: "Réglage du volume audio du système et démarrage du mixeur" ================================================ FILE: plugin-volume/translations/volume_fr.ts ================================================ LXQtVolume Increase sound volume Augmenter le volume Decrease sound volume Diminuer le volume Mute/unmute sound volume Désactiver/activer le son Volume Control: The following shortcuts can not be registered: %1 Contrôle du volume : les raccourcis suivants ne peuvent pas être enregistrés  : %1 %1: %2% Volume: %1%%2 Volume : %1%%2 (muted) (muet) LXQtVolumeConfiguration Volume Control Settings Paramètres de contrôle du volume Device to control Périphérique à contrôler ALSA ALSA PulseAudio Pulse Audio OSS OSS Behavior Comportement Mute on middle click Muet avec le clic central Allow volume beyond 100% (0dB) Autoriser un volume supérieur à 100% (0dB) Always notify about volume changes Toujours notifier les changements de volume Notify about volume changes with keyboard Notification lorsque le volume est changé avec le clavier Volume adjust step Étape de réglage du volume External Mixer Mixer externe VolumePopup Launch mixer Démarre le mixer Mi&xer Mi&xeur Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_gl.ts ================================================ LXQtVolume Increase sound volume Aumentar o volume do son Decrease sound volume Reducir o volume do son Mute/unmute sound volume Silenciar/activar o volume do son Volume Control: The following shortcuts can not be registered: %1 Control de volume: Non foi posíbel rexistrar os seguintes atallos: %1 %1: %2% Volume: %1%%2 (muted) (silenciado) LXQtVolumeConfiguration Volume Control Settings Axustes do control do volume Device to control Dispositivo a controlar ALSA ALSA PulseAudio OSS Behavior Comportamento Mute on middle click Silenciar premendo co botón central do rato Allow volume beyond 100% (0dB) Permitir que o volume exceda o 100% (0dB) Always notify about volume changes Notificar sempre os cambios de volume Notify about volume changes with keyboard Notificar sobre os cambios de volume co teclado Volume adjust step Paso do axuste do volume External Mixer Mesturador externo VolumePopup Launch mixer Iniciar o mesturador Mi&xer &Mesturador Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_he.desktop.yaml ================================================ Desktop Entry/Name: "בקרת שמע" Desktop Entry/Comment: "שליטה בעצמת השמע של המערכת והפעלת המערבל המועדף עליך" ================================================ FILE: plugin-volume/translations/volume_he.ts ================================================ LXQtVolume Increase sound volume הגברת עצמת השמע Decrease sound volume הנמכת עצמת השמע Mute/unmute sound volume השתקה/השמעה של צלילים Volume Control: The following shortcuts can not be registered: %1 בקרת עצמת שמע: אין אפשרות לרשום את קיצורי הדרך הבאים: %1 %1: %2% %1: %2% Volume: %1%%2 עצמת שמע: %1%%2 (muted) (מושתק) LXQtVolumeConfiguration Volume Control Settings הגדרות בקרת עצמת שמע Device to control התקן לבקרה ALSA ALSA PulseAudio OSS Behavior התנהגות Mute on middle click השתקה בכפתור אמצעי Allow volume beyond 100% (0dB) לאפשר עצמת שמע מעל 100% (0dB) Always notify about volume changes תמיד להודיע על שינויים בעצמת השמע Notify about volume changes with keyboard להודיע על שינויי עצמת שמע עם המקלדת Volume adjust step צעדי התאמת עצמת שמע External Mixer מערבל חיצוני VolumePopup Launch mixer הפעלת מערבל Mi&xer מ&ערבל Mute השתקה Set as default output הגדרה כפלט ברירת מחדל Default output פלט ברירת מחדל ================================================ FILE: plugin-volume/translations/volume_hr.desktop.yaml ================================================ Desktop Entry/Name: "Kontrola glasnoće" Desktop Entry/Comment: "Kotroliraj glasnoću sustava i pokreni omiljeni mikser" ================================================ FILE: plugin-volume/translations/volume_hr.ts ================================================ LXQtVolume Increase sound volume Povećaj glasnoću Decrease sound volume Smanji glasnoću Mute/unmute sound volume Isključi/uključi glasnoću Volume Control: The following shortcuts can not be registered: %1 Kontrola glasnoće: Nije moguće registrirati sljedeće prečace: %1 %1: %2% Volume: %1%%2 Glasnoća: %1 % %2 (muted) (zvuk isključen) LXQtVolumeConfiguration Volume Control Settings Kontrola glasnoće – Postavke Device to control Uređaj za kontrolu ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Ponašanje Mute on middle click Isključi zvuk pritiskom srednjeg gumba miša Allow volume beyond 100% (0dB) Dozvoli glasnoću iznad 100 % (0 dB) Always notify about volume changes Uvijek obavijesti o promjenama glasnoće Notify about volume changes with keyboard Obavijesti o promjenama glasnoće s tipkovnicom Volume adjust step Korak prilagođavanja glasnoće External Mixer Vanjski mikser VolumePopup Launch mixer Pokreni miksera Mi&xer Mi&kser Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_hu.desktop.yaml ================================================ Desktop Entry/Name: "Hangerőszabályzó" Desktop Entry/Comment: "A rendszer hangerejének beállítása" ================================================ FILE: plugin-volume/translations/volume_hu.ts ================================================ LXQtVolume Increase sound volume Hangosítás Decrease sound volume Halkítás Mute/unmute sound volume Némítás/visszahangosítás Volume Control: The following shortcuts can not be registered: %1 Hangerőszabályzó: A %1 gyorsbillentyű nincs beállítva %1: %2% Volume: %1%%2 Hangerő: %1%%2 (muted) (némítva) LXQtVolumeConfiguration Volume Control Settings Hangerőszabályzó beállítások Device to control Eszközbeállítás ALSA ALSA PulseAudio OSS Behavior Működés Mute on middle click Némítás középső kattintásra Allow volume beyond 100% (0dB) Hangerő tartomány 100% (0dB) Always notify about volume changes Hangerőváltoztatásnál mindig értesítsen Notify about volume changes with keyboard Értesítés amikor a billentyűzetről változtatja a hangerőt Volume adjust step Lépésköz External Mixer Külső keverő VolumePopup Launch mixer Keverő indítása Mi&xer Ke&verő Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_id.ts ================================================ LXQtVolume Increase sound volume Naikkan volume suara Decrease sound volume Turunkan volume suara Mute/unmute sound volume Bisukan/hidupkan volume suara Volume Control: The following shortcuts can not be registered: %1 Kontrol Volume: Pintasan berikut ini tidak dapat didaftarkan: %1 %1: %2% Volume: %1%%2 Volume: %1%%2 (muted) (bisu) LXQtVolumeConfiguration Volume Control Settings Pengaturan Kontrol Volume Device to control Perangkat untuk dikontrol ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Perilaku Mute on middle click Bisukan saat klik tengah Allow volume beyond 100% (0dB) Izinkan volume diatas 100% (0dB) Always notify about volume changes Selalu beritahu tentang perubahan volume Notify about volume changes with keyboard Notifikasi tentang perubahan volume menggunakan kibot Volume adjust step Langkah menyesuaikan volume External Mixer Mikser Eksternal VolumePopup Launch mixer Luncurkan mikser Mi&xer Mikser Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_it.desktop.yaml ================================================ Desktop Entry/Name: "Controllo del volume" Desktop Entry/Comment: "Controlla il volume del sistema e avvia il mixer preferito" ================================================ FILE: plugin-volume/translations/volume_it.ts ================================================ LXQtVolume Increase sound volume Aumenta il volume Decrease sound volume Riduci il volume Mute/unmute sound volume Silenzia/rimuovi silenzio per il volume Volume Control: The following shortcuts can not be registered: %1 Controllo volume: la scorciatoia globale '%1' non può essere registrata %1: %2% %1: %2% Volume: %1%%2 Volume: %1%%2 (muted) (silenziato) LXQtVolumeConfiguration Volume Control Settings Impostazioni controllo volume Device to control Dispositivo da controllare ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Comportamento Mute on middle click Silenzia al clic centrale del mouse Allow volume beyond 100% (0dB) Permetti volume oltre il 100% (0dB) Always notify about volume changes Notifica sempre i cambiamenti di volume Notify about volume changes with keyboard Notifica cambio volume da tastiera Volume adjust step Passo di regolazione del volume External Mixer Mixer esterno VolumePopup Launch mixer Avvia mixer Mi&xer Mi&xer Mute Silenzia Set as default output Imposta come output predefinito Default output Output predefinito ================================================ FILE: plugin-volume/translations/volume_ja.desktop.yaml ================================================ Desktop Entry/Name: "音量調節" Desktop Entry/Comment: "システムの音量を制御したり、ミキサーを起動したりします" ================================================ FILE: plugin-volume/translations/volume_ja.ts ================================================ LXQtVolume Increase sound volume 音量を上げる Decrease sound volume 音量を下げる Mute/unmute sound volume 音量をミュート/解除する Volume Control: The following shortcuts can not be registered: %1 音量調節: このショートカットは登録できません: %1 %1: %2% %1: %2% Volume: %1%%2 音量: %1%%2 (muted) (ミュート中) LXQtVolumeConfiguration Volume Control Settings 音量調節の設定 Device to control 制御するデバイス ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior 動作 Mute on middle click 中ボタンのクリックでミュートする Allow volume beyond 100% (0dB) 100% (0dB) を超える音量を許可する Always notify about volume changes 音量変更時には常に通知する Notify about volume changes with keyboard キーボードでの音量変更を通知する Volume adjust step 音量変更のステップ幅 External Mixer 外部ミキサー VolumePopup Launch mixer ミキサーを起動します Mi&xer ミキサー(&X) Mute ミュート Set as default output デフォルト出力として設定 Default output デフォルト出力 ================================================ FILE: plugin-volume/translations/volume_ka.desktop.yaml ================================================ Desktop Entry/Name: "ხმის კონტროლი" Desktop Entry/Comment: "აკონტროლეთ სისტემის ხმა და გაუშვით თქვენი რჩეული მიქსერი" ================================================ FILE: plugin-volume/translations/volume_ka.ts ================================================ LXQtVolume Increase sound volume ხმის აწევა Decrease sound volume ხმის ჩაწევა Mute/unmute sound volume ხმის დადუმება/დადუმების გაუქმება Volume Control: The following shortcuts can not be registered: %1 ხმის კონტროლი: შეუძლებელია შემდეგი მალსახმობების რეგისტრაცია: %1 %1: %2% %1: %2% Volume: %1%%2 ხმა: %1%%2 (muted) (დადუმებულია) LXQtVolumeConfiguration Volume Control Settings ხმის მართვის მორგება Device to control სამართავი მოწყობილობა ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior ქცევა Mute on middle click დადუმება შუა წკაპით Allow volume beyond 100% (0dB) ხმის აწევა 100%-ის ზემოთ (0დბ) Always notify about volume changes ყოველთვის გამაფრთხილე ხმის ცვლილებისას Notify about volume changes with keyboard გამაფრთხილე ხმის კლავიატურით ცვლილებისას Volume adjust step ხმის მორგების ნაბიჯი External Mixer გარე მიქსერი VolumePopup Launch mixer მიქსერის გაშვება Mi&xer მი&ქსერი Mute დადუმება Set as default output ნაგულისხმევ გამოტანად დაყენება Default output ნაგულისხმევი გამოტანა ================================================ FILE: plugin-volume/translations/volume_kab.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer ================================================ FILE: plugin-volume/translations/volume_kk.desktop.yaml ================================================ Desktop Entry/Name: "Дыбыс деңгейін реттеушісі" Desktop Entry/Comment: "Жүйенің дыбыс деңгейін басқаруға және қалаған микшерді іске\ \ қосуға мүмкіндік береді" ================================================ FILE: plugin-volume/translations/volume_kk.ts ================================================ LXQtVolume Increase sound volume Дыбыс деңгейін арттыру Decrease sound volume Дыбыс деңгейін азайту Mute/unmute sound volume Дыбысты сөндіру/іске қосу Volume Control: The following shortcuts can not be registered: %1 Дыбыс деңгейін басқару: Келесі жарлықтарды тіркеу мүмкін емес: %1 %1: %2% %1: %2% Volume: %1%%2 Дыбыс деңгейі: %1%%2 (muted) (дыбыссыз) LXQtVolumeConfiguration Volume Control Settings Дыбыс деңгейін басқару баптаулары Device to control Басқарылатын құрылғы ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Мінез-құлқы Mute on middle click Ортаңғы батырмамен шерткенде дыбысты өшіру Allow volume beyond 100% (0dB) Дыбыс деңгейін 100%-дан (0 дБ) асыруға рұқсат ету Always notify about volume changes Дыбыс деңгейінің өзгерістері туралы әрқашан хабарлау Notify about volume changes with keyboard Дыбыс деңгейі пернетақта арқылы өзгергенде хабарлау Volume adjust step Дыбыс деңгейін реттеу қадамы External Mixer Сыртқы микшер VolumePopup Launch mixer Микшерді іске қосу Mi&xer Мик&шер Mute Дыбысын басу Set as default output Негізгі шығыс ретінде орнату Default output Негізгі шығыс ================================================ FILE: plugin-volume/translations/volume_ko.desktop.yaml ================================================ Desktop Entry/Name: "음량 제어" Desktop Entry/Comment: "시스템 음량 제어 및 기본 믹서 실행" ================================================ FILE: plugin-volume/translations/volume_ko.ts ================================================ LXQtVolume Increase sound volume 소리 음량 높이기 Decrease sound volume 소리 음량 줄이기 Mute/unmute sound volume 소리 음량 음소거/해제 Volume Control: The following shortcuts can not be registered: %1 음량 제어: 다음 단축키는 등록할 수 없습니다: %1 %1: %2% %1: %2% Volume: %1%%2 음량: %1%%2 (muted) (음소거됨) LXQtVolumeConfiguration Volume Control Settings 음량 제어 설정 Device to control 제어할 장치 ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior 동작 Mute on middle click 가운데 클릭 시 음소거 Allow volume beyond 100% (0dB) 100%를 초과하는 음량 허용 (0dB) Always notify about volume changes 음량 변경에 대해 항상 알림 Notify about volume changes with keyboard 키보드로 음량 변경 알림 Volume adjust step 음량 조정 단계 External Mixer 외부 믹서 VolumePopup Launch mixer 믹서 실행 Mi&xer 믹서(&X) Mute 음소거 Set as default output 기본 출력으로 지정 Default output 기본 출력 ================================================ FILE: plugin-volume/translations/volume_lg.desktop.yaml ================================================ Desktop Entry/Name: "Ddoboozi" Desktop Entry/Comment: "Ekifuga obukangufu bw'amaloboozi ku sisitemu era ne kitandika\ \ puloguramu etegekedwa okuteekateeka eby'eddoboozi" ================================================ FILE: plugin-volume/translations/volume_lg.ts ================================================ LXQtVolume Increase sound volume Kangula ku ddoboozi Decrease sound volume Kendeeza ku ddoboozi Mute/unmute sound volume Sirisa/zaako ddoboozi Volume Control: The following shortcuts can not be registered: %1 Ddoboozi: Amapeesa agagonza emirimu gano tekisobose kugategeka: %1 %1: %2% Volume: %1%%2 Ddoboozi: %1%%2 (muted) (eddoboozi lisirisidwa) LXQtVolumeConfiguration Volume Control Settings Enteekateeka z'ekifuga ddoboozi Device to control Ekinaateekateekanga maloboozi ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Enkola Mute on middle click Ppeesa ery'akasongesbwa erya wakati lisirisenga ddoboozi Allow volume beyond 100% (0dB) Obukangufu bw'eddoboozi busobole okusinga 100% (0dB) Always notify about volume changes Teekangawo obubaka obukangufu bw'eddoboozi buli lwe bukyuka Notify about volume changes with keyboard Teekawo obubaka obukangufu bw'eddoboozi buli lwe bukyusibwa okuva ku mapeesa Volume adjust step Bunene bw'enkyuka ez'obukangufu External Mixer Ekiteekateeka ddobozi ekirabikira awakolerwa VolumePopup Launch mixer Tandika ekiteekateeka ddoboozi Mi&xer &Kiteekateekaddoboozi Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_lt.desktop.yaml ================================================ Desktop Entry/Name: "Garsio reguliavimas" Desktop Entry/Comment: "Reguliuoti sistemos garsį ir paleisti pageidaujamą mašiklį" ================================================ FILE: plugin-volume/translations/volume_lt.ts ================================================ LXQtVolume Increase sound volume Pagarsinti Decrease sound volume Tildyti Mute/unmute sound volume Nutildyti/įjungti garsį Volume Control: The following shortcuts can not be registered: %1 Garsio reguliavimas: Šie spartieji klavišai negali būti užregistruoti: %1 %1: %2% %1: %2% Volume: %1%%2 Garsis: %1%%2 (muted) (nutildyta) LXQtVolumeConfiguration Volume Control Settings Garsio reguliavimo nustatymai Device to control Įrenginys, kurį valdyti ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Elgsena Mute on middle click Nutildyti, spustelėjus vidurinį pelės mygtuką Allow volume beyond 100% (0dB) Leisti garsį virš 100% (0dB) Always notify about volume changes Visada pranešti apie garsio pakeitimus Notify about volume changes with keyboard Pranešti apie klaviatūra atliktus garsio pakeitimus Volume adjust step Garsio reguliavimo žingsnis External Mixer Išorinis maišiklis VolumePopup Launch mixer Paleisti maišiklį Mi&xer Maiši&klis Mute Nutildyti Set as default output Nustatyti kaip numatytąją išvestį Default output Numatytoji išvestis ================================================ FILE: plugin-volume/translations/volume_lv.desktop.yaml ================================================ Desktop Entry/Name: "Skaļuma regulators/pārvaldnieks" Desktop Entry/Comment: "Pārvalda sistēmas skaļumu un palaiž izvēlēto mikseri" ================================================ FILE: plugin-volume/translations/volume_lv.ts ================================================ LXQtVolume Increase sound volume Skaļināt Decrease sound volume Klusināt Mute/unmute sound volume Iesl./izsl. skaņu Volume Control: The following shortcuts can not be registered: %1 Skaļuma vadība: nevar reģistrēt šādus īsceļus: %1 %1: %2% Volume: %1%%2 Skaļums: %1%%2 (muted) (noklusināts/bez skaņas) LXQtVolumeConfiguration Volume Control Settings Skaļuma vadības iestatījumi Device to control Vadāmā ierīce ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Uzvedība Mute on middle click Izslēgt skaņu, noklikšķinot ar peles vidējo pogu Allow volume beyond 100% (0dB) Ļaut skaļumam pārsniegt 100% (0 db) Always notify about volume changes Vienmēr informēt par skaļuma izmaiņām Notify about volume changes with keyboard Paziņot par skaļuma izmaiņām, veiktām ar tastatūru Volume adjust step Skaļuma regulēšanas solis External Mixer Ārējais mikseris VolumePopup Launch mixer Palaist mikseri Mi&xer Mi&kseris Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Lydstyrkekontroll" Desktop Entry/Comment: "Kontrollerer systemets lydstyrke og starter din foretrukne\ \ mikser" ================================================ FILE: plugin-volume/translations/volume_nb_NO.ts ================================================ LXQtVolume Increase sound volume Øk lydvolum Decrease sound volume Senk lydvolum Mute/unmute sound volume Skru av eller på lydvolum Volume Control: The following shortcuts can not be registered: %1 Volumkontroll: De følgende tastatursnarveiene kan ikke registreres: %1 %1: %2% Volume: %1%%2 Volum: %1%%2 (muted) (skrudd av) LXQtVolumeConfiguration Volume Control Settings Volumkontrollinnstillinger Device to control Enhet å kontrollere ALSA ALSA PulseAudio OSS Behavior Virkemåte Mute on middle click Skru av ved midtklikk Allow volume beyond 100% (0dB) Tillat volum over 100% (0dB) Always notify about volume changes Alltid varsle om volumforandringer Notify about volume changes with keyboard Varsle om volumforandringer med tastaturet Volume adjust step Volumjusteringstrinn External Mixer Ekstern mikser VolumePopup Launch mixer Åpne mikser Mi&xer Mi&kser Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_nl.desktop.yaml ================================================ Desktop Entry/Name: "Volumeregeling" Desktop Entry/Comment: "Regel het volume van de luidsprekers en open uw favoriete\ \ mengpaneel" ================================================ FILE: plugin-volume/translations/volume_nl.ts ================================================ LXQtVolume Increase sound volume Volume verhogen Decrease sound volume Volume verlagen Mute/unmute sound volume Geluid dempen/ontdempen Volume Control: The following shortcuts can not be registered: %1 Volumeregeling: de volgende sneltoetsen kunnen niet worden vastgelegd: %1 %1: %2% %1: %2% Volume: %1%%2 Volumeniveau: %1%%2 (muted) (gedempt) LXQtVolumeConfiguration Volume Control Settings Volumeregelingsinstellingen Device to control Te bedienen apparaat ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Gedrag Mute on middle click Dempen met middelste muisknop Allow volume beyond 100% (0dB) Volumeniveaus boven 100% (0dB) toestaan Always notify about volume changes Melding tonen als volumeniveau wijzigt Notify about volume changes with keyboard Melding tonen als volumeniveau wijzigt via toetsenbord Volume adjust step Stapgrootte bij volumeaanpassing External Mixer Extern mengpaneel VolumePopup Launch mixer Mengpaneel openen Mi&xer &Mengpaneel Mute Dempen Set as default output Instellen als standaarduitvoer Default output Standaarduitvoer ================================================ FILE: plugin-volume/translations/volume_oc.desktop.yaml ================================================ Desktop Entry/Name: "Contraròtle del volum" Desktop Entry/Comment: "Contrarotlatz lo volum del sistèma e aviatz vòstre mesclador\ \ preferit" ================================================ FILE: plugin-volume/translations/volume_oc.ts ================================================ LXQtVolume Increase sound volume Aumentar lo volum Decrease sound volume Demesir lo volum Mute/unmute sound volume Desactivar/activar lo son Volume Control: The following shortcuts can not be registered: %1 Contraròtle del volum : los acorchis seguents se podián pas enregistrar : %1 %1: %2% Volume: %1%%2 Volum : %1%%2 (muted) (mut) LXQtVolumeConfiguration Volume Control Settings Paramètres de contraròtle del volum Device to control Periferic de contrarotlar ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Compòrtament Mute on middle click Mut amb lo clic central Allow volume beyond 100% (0dB) Autorizar un volum superior a 100% (0dB) Always notify about volume changes Totjorn notificar los cambiaments de volum Notify about volume changes with keyboard Notificar quand lo volum es cambiat amb lo clavièr Volume adjust step Etapa de reglatge del volum External Mixer Mesclador extèrn VolumePopup Launch mixer Aviar lo mesclador Mi&xer Mes&clador Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਵਾਲੀਅਮ ਕੰਟਰੋਲ" Desktop Entry/Comment: "ਸਿਸਟਮ ਦੇ ਵਾਲੀਅਮ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ ਅਤੇ ਆਪਣੇ ਪਸੰਦੀਦਾ ਮਿਕਸਰ ਨੂੰ\ \ ਚਲਾਓ" ================================================ FILE: plugin-volume/translations/volume_pa.ts ================================================ LXQtVolume Increase sound volume ਆਵਾਜ਼ ਵਾਲੀਅਮ ਵਧਾਓ Decrease sound volume ਆਵਾਜ਼ ਵਾਲੀਅਮ ਘਟਾਓ Mute/unmute sound volume ਸਾਊਂਡ ਵਾਲੀਅਮ ਨੂੰ ਮੌਨ/ਅਣ-ਮੌਨ ਕਰੋ Volume Control: The following shortcuts can not be registered: %1 ਵਾਲੀਅਮ ਕੰਟਰੋਲ: ਅੱਗੇ ਦਿੱਤੇ ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ: %1 %1: %2% Volume: %1%%2 ਵਾਲੀਅਮ: %1%%2 (muted) (ਮੌਨ ਹੈ) LXQtVolumeConfiguration Volume Control Settings ਵਾਲੀਅਮ ਕੰਟਰੋਲ ਸੈਟਿੰਗਾਂ Device to control ਕੰਟਰੋਲ ਕਰਨ ਲਈ ਡਿਵਾਈਸ ALSA ALSA PulseAudio ਪਲਸ-ਆਡਓ OSS OSS Behavior ਰਵਈਆ Mute on middle click ਮਿਡਲ ਕਲਿੱਕ ਉੱਤੇ ਮੌਨ ਕਰੋ Allow volume beyond 100% (0dB) ਵਾਲੀਅਮ ਨੂੰ 100% (0dB) ਤੋਂ ਵੱਧ ਜਾਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ Always notify about volume changes ਵਾਲੀਅਮ ਤਬਦੀਲੀ ਬਾਰੇ ਹਮੇਸ਼ਾਂ ਸੂਚਨਾ ਦਿਓ Notify about volume changes with keyboard ਕੀਬੋਰਡ ਨਾਲ ਵਾਲੀਅਮ ਬਦਲਣ ਬਾਰੇ ਸੂਚਿਤ ਕਰੋ Volume adjust step ਵਾਲੀਅਮ ਅਡਜਸਟ ਸਟੈਪ External Mixer ਬਾਹਰੀ ਮਿਕਸਰ VolumePopup Launch mixer ਮਿਕਸਰ ਚਲਾਓ Mi&xer ਮਿਕਸਰ(&x) Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_pl.desktop.yaml ================================================ Desktop Entry/Name: "Kontrola głośności" Desktop Entry/Comment: "Dopasuj poziom dźwięku i uruchom preferowany mikser" ================================================ FILE: plugin-volume/translations/volume_pl.ts ================================================ LXQtVolume Increase sound volume Zwiększ głośność dźwięku Decrease sound volume Zmniejsz głośność dźwięku Mute/unmute sound volume Wycisz/cofnij wyciszenie dźwięku Volume Control: The following shortcuts can not be registered: %1 Kontrola głośności: Nie można zarejestrować następujących skrótów klawiszowych: %1 %1: %2% %1: %2% Volume: %1%%2 Głośność: %1%%2 (muted) (wyciszony) LXQtVolumeConfiguration Volume Control Settings Ustawienia kontroli głośności Device to control Używane urządzenie ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Zachowanie Mute on middle click Wycisz na kliknięcie środkowym przyciskiem myszy Allow volume beyond 100% (0dB) Pozwól na poziom dźwięku powyżej 100% (0db) Always notify about volume changes Zawsze informuj o zmianie głośności Notify about volume changes with keyboard Powiadamiaj o zmianie głośności skrótem klawiszowym Volume adjust step Rozmiar kroku przy zmianie głośności External Mixer Zewnętrzny mikser VolumePopup Launch mixer Uruchom mikser Mi&xer Mi&kser Mute Wycisz Set as default output Ustaw jako domyślne wyjście Default output Domyślne wyjście ================================================ FILE: plugin-volume/translations/volume_pt.desktop.yaml ================================================ Desktop Entry/Name: "Controlo de volume" Desktop Entry/Comment: "Controlar o volume do sistema e abrir o gestor de som" ================================================ FILE: plugin-volume/translations/volume_pt.ts ================================================ LXQtVolume Increase sound volume Aumentar volume Decrease sound volume Diminuir volume Mute/unmute sound volume Silenciar/restaurar volume Volume Control: The following shortcuts can not be registered: %1 Controlo de volume: os seguintes atalhos não foram registados: %1 %1: %2% %1: %2% Volume: %1%%2 Volume: %1%%2 (muted) (sem som) LXQtVolumeConfiguration Volume Control Settings Definições do Controlo de volume Device to control Dispositivo a controlar ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Comportamento Mute on middle click Silenciar com a roda do rato Allow volume beyond 100% (0dB) Permitir volume acima de 100% (0dB) Always notify about volume changes Notificar sempre sobre a alteração de volume Notify about volume changes with keyboard Notificar sobre as alterações de volume com o teclado Volume adjust step Nível de ajuste do volume External Mixer Gestor de som externo VolumePopup Launch mixer Iniciar gestor de som Mi&xer &Gestor de som Mute Silenciar Set as default output Definir como saída predefinida Default output Saída predefinida ================================================ FILE: plugin-volume/translations/volume_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Controle de Volume" Desktop Entry/Comment: "Controla o volume do sistema e lança seu mixer preferido" ================================================ FILE: plugin-volume/translations/volume_pt_BR.ts ================================================ LXQtVolume Increase sound volume Aumentar volume Decrease sound volume Diminuir volume Mute/unmute sound volume Ativar/desativar som Volume Control: The following shortcuts can not be registered: %1 Controle de Volume: Os seguintes atalhos não podem ser registrados: %1 %1: %2% Volume: %1%%2 Volume: %1%%2 (muted) (mudo) LXQtVolumeConfiguration Volume Control Settings Configurações de controle de volume Device to control Dispositivo de controle ALSA ALSA PulseAudio Pulseaudio OSS OSS Behavior Comportamento Mute on middle click Mudo no clique do meio Allow volume beyond 100% (0dB) Permitir volume além de 100% (0dB) Always notify about volume changes Sempre notificar sobre alterações de volume Notify about volume changes with keyboard Notificar sobre alterações de volume com o teclado Volume adjust step Passos de ajuste do volume External Mixer Mixador externo VolumePopup Launch mixer Executar Mixador Mi&xer Mi&xador Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_ro_RO.desktop.yaml ================================================ Desktop Entry/Name: "Control volum" Desktop Entry/Comment: "Controlează volumul sistem și lansează mixerul dvs preferat" ================================================ FILE: plugin-volume/translations/volume_ro_RO.ts ================================================ LXQtVolume Increase sound volume Mărește volumul sunetului Decrease sound volume Micșorează volumul sunetului Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 Controlul volumului de sunet: Următoarele scurtături nu pot fi înregistrate: %1 %1: %2% Volume: %1%%2 Volum de sunet: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Setări de Control ale Volumului de sunet Device to control Dispozitiv de controlat ALSA PulseAudio PulseAudio OSS Behavior Comportament Mute on middle click Allow volume beyond 100% (0dB) Permite volum dincolo de 100% (0dB) Always notify about volume changes Notifica întotdeauna schimbările de volum de sunet Notify about volume changes with keyboard Volume adjust step Pasul de ajustare a volumului de sunet External Mixer Mixer extern VolumePopup Launch mixer Pornește mixerul de sunet Mi&xer Mixer de sunet Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_ru.desktop.yaml ================================================ Desktop Entry/Name: "Регулятор громкости" Desktop Entry/Comment: "Управлять громкостью звука в системе и запустить предпочитаемый микшер" ================================================ FILE: plugin-volume/translations/volume_ru.ts ================================================ LXQtVolume Increase sound volume Увеличить громкость звука Decrease sound volume Уменьшить громкость звука Mute/unmute sound volume Выкл/вкл звук Volume Control: The following shortcuts can not be registered: %1 Контроль громкости: следующие сочетания клавиш нельзя зарегистрировать: %1 %1: %2% %1: %2% Volume: %1%%2 Громкость: %1%%2 (muted) (без звука) LXQtVolumeConfiguration Volume Control Settings Настройки контроля громкости Device to control Контролируемое устройство ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Поведение Mute on middle click Отключать звук при щелчке средней кнопкой мыши Allow volume beyond 100% (0dB) Разрешить громкость выше 100% (0дБ) Always notify about volume changes Всегда уведомлять об изменении громкости Notify about volume changes with keyboard Показывать уведомления о изменении громкости с клавиатуры Volume adjust step Шаг регулировки громкости External Mixer Внешний микшер VolumePopup Launch mixer Запустить микшер Mi&xer Ми&кшер Mute Заглушить Set as default output Установить в качестве выхода по умолчанию Default output Стандартный выход ================================================ FILE: plugin-volume/translations/volume_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-volume/translations/volume_si.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control ALSA PulseAudio OSS Behavior Mute on middle click Allow volume beyond 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step External Mixer VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_sk.desktop.yaml ================================================ Desktop Entry/Name: "Ovládanie hlasitosti" Desktop Entry/Comment: "Ovláda hlasitosť počítača a spúšťa zmiešavač hlasitosti" ================================================ FILE: plugin-volume/translations/volume_sk_SK.ts ================================================ LXQtVolume Increase sound volume Zosilniť zvuk Decrease sound volume Zoslabiť zvuk Mute/unmute sound volume Stlmiť/zrušiť stlmenie zvuku Volume Control: The following shortcuts can not be registered: %1 Ovládanie hlasitosti: Nie je možné zaregistrovať následujúce klávesové skratky: %1 %1: %2% Volume: %1%%2 Hlasitosť: %1%%2 (muted) (stlmené) LXQtVolumeConfiguration Volume Control Settings Nastavenie ovládania hlasitosti Device to control Ovládanie zariadenia ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Správanie Mute on middle click Stlmiť kliknutím na prostredné tlačítko Allow volume beyond 100% (0dB) Umožniť nastavenie hlasitosti cez 100% (0 dB) Always notify about volume changes Vždy upozorniť na zmenu hlasitosti Notify about volume changes with keyboard Ukázať oznam pri zmene hlasitosti klávesnicou Volume adjust step Hlasitosť meniť v krokoch o veľkosti External Mixer Externý mixér VolumePopup Launch mixer Spustiť mixér Mi&xer &Mixér Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_sl.ts ================================================ LXQtVolume Increase sound volume Zvišaj glasnost Decrease sound volume Znižaj glasnost Mute/unmute sound volume Izklopi/vklopi zvok Volume Control: The following shortcuts can not be registered: %1 Nastavitev glasnosti: Sledeče bližnjice ne morejo biti registrirane: %1 %1: %2% Volume: %1%%2 Glasnost: %1%%2 (muted) (utišan) LXQtVolumeConfiguration Volume Control Settings Nastavitve glasnosti Device to control Naprava ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Obnašanje Mute on middle click Utišaj s srednjim klikom na ikono Allow volume beyond 100% (0dB) Dovoli glasnost, večjo od 100% (0 dB) Always notify about volume changes Prikaži obvestilo ob vsaki spremembi glasnosti Notify about volume changes with keyboard Obvesti, ko se prek tipkovnice nastavi glasnost Volume adjust step Velikost koraka External Mixer Zunanji mešalnik zvoka VolumePopup Launch mixer Zaženi mešalnik zvoka Mi&xer &Mešalnik Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_sv.desktop.yaml ================================================ Desktop Entry/Name: "Volymkontroll" Desktop Entry/Comment: "Reglera systemets ljudnivå och starta din förvalda ljudmixer" ================================================ FILE: plugin-volume/translations/volume_sv.ts ================================================ LXQtVolume Increase sound volume Öka ljudvolymen Decrease sound volume Minska ljudvolymen Mute/unmute sound volume Stäng av/på ljudet Volume Control: The following shortcuts can not be registered: %1 Volymkontroll: Följande genvägar kan inte registreras:% 1 %1: %2% %1: %2% Volume: %1%%2 Volym: %1%%2 (muted) (tyst) LXQtVolumeConfiguration Volume Control Settings Inställningar av volymkontroll Device to control Enhet att styra ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Beteende Mute on middle click Stäng av vid mittenklick Allow volume beyond 100% (0dB) Tillåt volym över 100% (0 dB) Always notify about volume changes Meddela alltid om volymförändringar Notify about volume changes with keyboard Meddela om volymförändringar med tangentbordet Volume adjust step Volymjusteringssteg External Mixer Extern mixer VolumePopup Launch mixer Starta mixer Mi&xer Mi&xer Mute Tysta Set as default output Ange som standardutgång Default output Standardutgång ================================================ FILE: plugin-volume/translations/volume_th.desktop.yaml ================================================ Desktop Entry/Name: "ควบคุมระดับเสียง" Desktop Entry/Comment: "ควบคุมระดับเสียงของระบบและเรียกใช้ตัวผสมที่คุณต้องการ" ================================================ FILE: plugin-volume/translations/volume_th_TH.ts ================================================ LXQtVolume Increase sound volume Decrease sound volume Mute/unmute sound volume Volume Control: The following shortcuts can not be registered: %1 %1: %2% Volume: %1%%2 (muted) LXQtVolumeConfiguration Volume Control Settings Device to control อุปกรณ์ที่จะควบคุม ALSA PulseAudio PulseAudio OSS Behavior พฤติกรรม Mute on middle click ปิดเสียงด้วยการคลิกปุ่มกลาง Allow volume beyond 100% (0dB) อนุญาตให้ใช้ระดับเสียงเกินกว่า 100% (0dB) Always notify about volume changes Notify about volume changes with keyboard Volume adjust step ช่วงการปรับระดับเสียง External Mixer ตัวผสมภายนอก VolumePopup Launch mixer Mi&xer Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_tr.desktop.yaml ================================================ Desktop Entry/Name: "Ses Denetimi" Desktop Entry/Comment: "Sistem sesini denetleyin ve tercih ettiğiniz mikseri çalıştırın" ================================================ FILE: plugin-volume/translations/volume_tr.ts ================================================ LXQtVolume Increase sound volume Ses seviyesini yükselt Decrease sound volume Ses seviyesini azalt Mute/unmute sound volume Sessiz/Sesi Aç Volume Control: The following shortcuts can not be registered: %1 Ses Kontrol: Aşağıdaki kısayollar kaydedilemez: %1 %1: %2% %1: %%2 Volume: %1%%2 Ses: %1%%2 (muted) (sessiz) LXQtVolumeConfiguration Volume Control Settings Ses Kontrol Ayarları Device to control Kontrol edilecek aygıt ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior Davranış Mute on middle click Orta tıklamayla sessize al Allow volume beyond 100% (0dB) 100% (0dB) üzerine izin ver Always notify about volume changes Ses değişiklikleri hakkında her zaman uyar Notify about volume changes with keyboard Klavye ile ses seviyesi değişikliklerini bildir Volume adjust step Ses ayar adımı External Mixer Harici Karıştırıcı VolumePopup Launch mixer Karıştırıcıyı aç Mi&xer &Karıştırıcı Mute Sessize al Set as default output Varsayılan çıkış olarak ayarla Default output Varsayılan çıkış ================================================ FILE: plugin-volume/translations/volume_uk.desktop.yaml ================================================ Desktop Entry/Name: "Регулятор гучності" Desktop Entry/Comment: "Регулює системну гучність та запускає ваш улюблений мікшер" ================================================ FILE: plugin-volume/translations/volume_uk.ts ================================================ LXQtVolume Increase sound volume Збільшити гучність звуку Decrease sound volume Зменшити гучність звуку Mute/unmute sound volume Вимкнути/ввімкнути гучність звуку Volume Control: The following shortcuts can not be registered: %1 Регулятор гучності: не вдалося зареєструвати таку комбінацію клавіш: %1 %1: %2% Volume: %1%%2 Гучність: %1% {1%%2?} (muted) (вимкнено) LXQtVolumeConfiguration Volume Control Settings Налаштування регулятора гучності Device to control Контролювати пристрій ALSA РAЗL PulseAudio PulseAudio OSS OSS Behavior Поведінка Mute on middle click Приглушити клацанням середньої кнопки Allow volume beyond 100% (0dB) Дозволяти гучність вище 100% (0 дБ) Always notify about volume changes Завжди сповіщати про зміни гучности Notify about volume changes with keyboard Сповіщати про зміни гучности за допомогою клавіатури Volume adjust step Крок регулювання гучності External Mixer Зовнішній мікшер VolumePopup Launch mixer Запустити мікшер Mi&xer Мі&кшер Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "音量控制" Desktop Entry/Comment: "控制系统音量并启动您喜欢的混音器" ================================================ FILE: plugin-volume/translations/volume_zh_CN.ts ================================================ LXQtVolume Increase sound volume 增大音量 Decrease sound volume 减小音量 Mute/unmute sound volume 静音/取消静音 Volume Control: The following shortcuts can not be registered: %1 音量控制:无法注册下列快捷键:%1 %1: %2% Volume: %1%%2 音量: %1%%2 (muted) (静音) LXQtVolumeConfiguration Volume Control Settings 音量控制设置 Device to control 控制设备 ALSA ALSA PulseAudio OSS Behavior 行为 Mute on middle click 鼠标中击时静音 Allow volume beyond 100% (0dB) 允许声音超过 100%(0分贝) Always notify about volume changes 总是在音量改变时提示 Notify about volume changes with keyboard 使用键盘更改音量时显示通知 Volume adjust step 声音调整幅度 External Mixer 外部混音器 VolumePopup Launch mixer 运行混音器 Mi&xer 混音器(&X) Mute Set as default output Default output ================================================ FILE: plugin-volume/translations/volume_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "音量控制" Desktop Entry/Comment: "控制系統音量並啟動您喜愛的音量控制器" ================================================ FILE: plugin-volume/translations/volume_zh_TW.ts ================================================ LXQtVolume Increase sound volume 增加音量 Decrease sound volume 減少音量 Mute/unmute sound volume 靜音/取消靜音 Volume Control: The following shortcuts can not be registered: %1 音量控制:以下捷徑無法被註冊:%1 %1: %2% %1: %2% Volume: %1%%2 音量:%1%%2 (muted) (靜音) LXQtVolumeConfiguration Volume Control Settings 音量控制設定 Device to control 裝置控制 ALSA ALSA PulseAudio PulseAudio OSS OSS Behavior 行為 Mute on middle click 按滑鼠中鍵時靜音 Allow volume beyond 100% (0dB) 允許音量超過 100% (0dB) Always notify about volume changes 音量變更時總是通知 Notify about volume changes with keyboard 使用鍵盤變更音量時顯示通知 Volume adjust step 音量調整幅度 External Mixer 外部混音器 VolumePopup Launch mixer 執行混音器 Mi&xer 混音器(&X) Mute 靜音 Set as default output 設定作為預設輸出 Default output 預設輸出 ================================================ FILE: plugin-volume/volumebutton.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "volumebutton.h" #include "volumepopup.h" #include "audiodevice.h" #include #include #include #include #include #include #include "../panel/ilxqtpanel.h" #include "../panel/ilxqtpanelplugin.h" VolumeButton::VolumeButton(ILXQtPanelPlugin *plugin, QWidget* parent): QToolButton(parent), mPlugin(plugin), m_muteOnMiddleClick(true) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setAutoRaise(true); setMouseTracking(true); // initial icon for button. It will be replaced after devices scan. // In the worst case - no soundcard/pulse - is found it remains // in the button but at least the button is not blank ("invisible") handleStockIconChanged(QStringLiteral("dialog-error")); m_volumePopup = new VolumePopup(this); m_popupHideTimer.setInterval(1000); connect(this, &VolumeButton::clicked, this, &VolumeButton::toggleVolumeSlider); connect(&m_popupHideTimer, &QTimer::timeout, this, &VolumeButton::hideVolumeSlider); connect(m_volumePopup, &VolumePopup::mouseEntered, &m_popupHideTimer, &QTimer::stop); connect(m_volumePopup, &VolumePopup::mouseLeft, this, [this] { m_popupHideTimer.start(); } ); connect(m_volumePopup, &VolumePopup::launchMixer, this, &VolumeButton::handleMixerLaunch); connect(m_volumePopup, &VolumePopup::stockIconChanged, this, &VolumeButton::handleStockIconChanged); connect(m_volumePopup, &VolumePopup::popupHidden, this, [this]() { setDown(false); suppressTooltipTemporarily(); }); } VolumeButton::~VolumeButton() = default; void VolumeButton::suppressTooltipTemporarily() { QToolTip::hideText(); m_suppressTooltip = true; QTimer::singleShot(500, this, [this]() { m_suppressTooltip = false; }); } void VolumeButton::setMuteOnMiddleClick(bool state) { m_muteOnMiddleClick = state; } void VolumeButton::setMixerCommand(const QString &command) { m_mixerParams = QProcess::splitCommand(command); m_mixerCommand = m_mixerParams.empty() ? QString{} : m_mixerParams.takeFirst(); } void VolumeButton::enterEvent(QEnterEvent *event) { if (m_volumePopup->isVisible() || m_suppressTooltip) return; // show tooltip immediately on entering widget QToolTip::showText(event->globalPosition().toPoint(), toolTip(), this); } void VolumeButton::mouseMoveEvent(QMouseEvent *event) { QToolButton::mouseMoveEvent(event); if (m_volumePopup->isVisible() || m_suppressTooltip) return; // show tooltip immediately on moving the mouse if (!QToolTip::isVisible()) // prevent sliding of tooltip QToolTip::showText(event->globalPosition().toPoint(), toolTip(), this); } void VolumeButton::wheelEvent(QWheelEvent *event) { m_volumePopup->handleWheelEvent(event); QToolTip::showText(event->globalPosition().toPoint(), toolTip(), this); event->accept(); } void VolumeButton::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::MiddleButton && m_muteOnMiddleClick) { if (m_volumePopup->device()) { m_volumePopup->device()->toggleMute(); return; } } QToolButton::mouseReleaseEvent(event); } void VolumeButton::toggleVolumeSlider() { if (m_volumePopup->isVisible()) { hideVolumeSlider(); } else { showVolumeSlider(); } } void VolumeButton::showVolumeSlider() { if (m_volumePopup->isVisible()) return; QToolTip::hideText(); m_popupHideTimer.stop(); m_volumePopup->updateGeometry(); m_volumePopup->adjustSize(); const QPoint buttonCenter = mapToGlobal(rect().center()); QRect pos = mPlugin->panel()->calculatePopupWindowPos(buttonCenter, m_volumePopup->size()); const auto panelPosition = mPlugin->panel()->position(); if (panelPosition == ILXQtPanel::PositionLeft || panelPosition == ILXQtPanel::PositionRight) pos.moveTop(buttonCenter.y() - pos.height() / 2); else pos.moveLeft(buttonCenter.x() - pos.width() / 2); // Clamp to available screen geometry so the popup is never cut off (e.g. icon at panel edge). QScreen *screen = QGuiApplication::screenAt(buttonCenter); const QRect geom = screen ? screen->availableGeometry() : QGuiApplication::primaryScreen()->availableGeometry(); if (pos.left() < geom.left()) pos.moveLeft(geom.left()); if (pos.right() > geom.right()) pos.moveRight(geom.right()); if (pos.top() < geom.top()) pos.moveTop(geom.top()); if (pos.bottom() > geom.bottom()) pos.moveBottom(geom.bottom()); mPlugin->willShowWindow(m_volumePopup); m_volumePopup->openAt(pos.topLeft(), Qt::TopLeftCorner); m_volumePopup->activateWindow(); setDown(true); } void VolumeButton::hideVolumeSlider() { // qDebug() << "hideVolumeSlider"; m_popupHideTimer.stop(); m_volumePopup->hide(); setDown(false); suppressTooltipTemporarily(); } void VolumeButton::handleMixerLaunch() { QProcess::startDetached(m_mixerCommand, m_mixerParams); } void VolumeButton::handleStockIconChanged(const QString &iconName) { setIcon(XdgIcon::fromTheme(iconName)); } ================================================ FILE: plugin-volume/volumebutton.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef VOLUMEBUTTON_H #define VOLUMEBUTTON_H #include #include class VolumePopup; class ILXQtPanelPlugin; class VolumeButton : public QToolButton { Q_OBJECT public: VolumeButton(ILXQtPanelPlugin *plugin, QWidget* parent = nullptr); ~VolumeButton(); void setMuteOnMiddleClick(bool state); void setMixerCommand(const QString &command); VolumePopup *volumePopup() const { return m_volumePopup; } public slots: void hideVolumeSlider(); void showVolumeSlider(); protected: void enterEvent(QEnterEvent *event) override; void wheelEvent(QWheelEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; private slots: void toggleVolumeSlider(); void handleMixerLaunch(); void handleStockIconChanged(const QString &iconName); private: void suppressTooltipTemporarily(); VolumePopup *m_volumePopup; ILXQtPanelPlugin *mPlugin; QTimer m_popupHideTimer; bool m_muteOnMiddleClick; bool m_suppressTooltip = false; QString m_mixerCommand; QStringList m_mixerParams; }; #endif // VOLUMEBUTTON_H ================================================ FILE: plugin-volume/volumepopup.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "volumepopup.h" #include "audiodevice.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { // Touchpads often use pixelDelta() and/or small angle steps; angleDelta()/120 truncates to 0. int volumeScrollStep(const QWheelEvent *event, int singleStep) { if (singleStep <= 0) singleStep = 3; const QPoint pixel = event->pixelDelta(); if (!pixel.isNull() && pixel.y() != 0) { const int py = pixel.y(); int step = (py * singleStep) / 32; if (step == 0 && qAbs(py) >= 3) step = (py > 0) ? 1 : -1; return step; } const int angleY = event->angleDelta().y(); if (angleY == 0) return 0; return static_cast(std::lround(static_cast(angleY) * static_cast(singleStep) / static_cast(QWheelEvent::DefaultDeltasPerStep))); } } // namespace VolumePopup::VolumePopup(QWidget* parent): QDialog(parent, Qt::Dialog | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint), m_pos(0, 0), m_anchor(Qt::TopLeftCorner), m_defaultSink(nullptr), m_sliderStep(3) { // Under some Wayland compositors, setting window flags in the c-tor of the base class // may not be enough for a correct positioning of the popup. setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint); m_mixerButton = new QPushButton(this); m_mixerButton->setObjectName(QStringLiteral("MixerLink")); m_mixerButton->setMinimumWidth(1); m_mixerButton->setToolTip(tr("Launch mixer")); m_mixerButton->setText(tr("Mi&xer")); m_mixerButton->setAutoDefault(false); m_sinkScrollArea = new QScrollArea(this); m_sinkScrollArea->setWidgetResizable(true); m_sinkScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_sinkScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); m_sinkScrollArea->setFrameShape(QFrame::NoFrame); m_sinkScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_sinksContainer = new QWidget(this); QVBoxLayout *sinksLayout = new QVBoxLayout(m_sinksContainer); sinksLayout->setContentsMargins(QMargins()); sinksLayout->setSpacing(0); m_sinkScrollArea->setWidget(m_sinksContainer); setMinimumWidth(420); QVBoxLayout *l = new QVBoxLayout(this); l->setSpacing(0); l->setContentsMargins(QMargins()); l->addWidget(m_mixerButton, 0, Qt::AlignHCenter); l->addWidget(m_sinkScrollArea); connect(m_mixerButton, &QPushButton::released, this, &VolumePopup::launchMixer); } void VolumePopup::hideEvent(QHideEvent *event) { QDialog::hideEvent(event); emit popupHidden(); } bool VolumePopup::event(QEvent *event) { if(event->type() == QEvent::WindowDeactivate) { // qDebug("QEvent::WindowDeactivate"); hide(); } return QDialog::event(event); } bool VolumePopup::eventFilter(QObject * watched, QEvent * event) { if (event->type() == QEvent::Wheel) { QWheelEvent *wheelEvent = dynamic_cast(event); if (wheelEvent) { for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.slider && watched == row.slider) { handleWheelEvent(wheelEvent, row.slider); return true; } } } } return QDialog::eventFilter(watched, event); } void VolumePopup::enterEvent(QEnterEvent * /*event*/) { emit mouseEntered(); } void VolumePopup::leaveEvent(QEvent * /*event*/) { // qDebug("leaveEvent"); } void VolumePopup::handleSliderValueChanged(int value) { QSlider *slider = qobject_cast(sender()); if (!slider) return; for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.slider == slider && row.device) { // qDebug("VolumePopup::handleSliderValueChanged: %d\n", value); row.device->setVolume(value); const QString tip = slider->toolTip(); QTimer::singleShot(0, [this, tip]() { QToolTip::showText(QCursor::pos(), tip, this); }); return; } } } void VolumePopup::handleMuteToggleClicked() { QPushButton *btn = qobject_cast(sender()); if (!btn) return; for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.muteButton == btn && row.device) { row.device->toggleMute(); return; } } } void VolumePopup::handleSetDefaultClicked() { QPushButton *btn = qobject_cast(sender()); if (!btn) return; for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.defaultButton == btn && row.device) { emit defaultSinkRequested(row.device); return; } } } void VolumePopup::handleDeviceVolumeChanged(AudioDevice *device, int volume) { for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.device == device && row.slider) { // Calling setValue() would trigger handleSliderValueChanged() and set the device volume // again, so we have to block the signals to avoid recursive signal emission. row.slider->blockSignals(true); row.slider->setValue(volume); row.slider->setToolTip(QStringLiteral("%1%").arg(volume)); row.slider->blockSignals(false); if (device == m_defaultSink) onDefaultSinkVolumeOrMuteChanged(); return; } } } void VolumePopup::handleDeviceMuteChanged(AudioDevice *device, bool mute) { for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.device == device && row.muteButton) { row.muteButton->setChecked(mute); if (device == m_defaultSink) onDefaultSinkVolumeOrMuteChanged(); return; } } } void VolumePopup::onDefaultSinkVolumeOrMuteChanged() { updateStockIcon(); } void VolumePopup::updateStockIcon() { if (!m_defaultSink) return; QString iconName; if (m_defaultSink->volume() <= 0 || m_defaultSink->mute()) iconName = QLatin1String("audio-volume-muted"); else if (m_defaultSink->volume() <= 33) iconName = QLatin1String("audio-volume-low"); else if (m_defaultSink->volume() <= 66) iconName = QLatin1String("audio-volume-medium"); else iconName = QLatin1String("audio-volume-high"); iconName.append(QLatin1String("-panel")); emit stockIconChanged(iconName); } void VolumePopup::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); realign(); } void VolumePopup::openAt(QPoint pos, Qt::Corner anchor) { m_pos = pos; m_anchor = anchor; realign(); show(); } void VolumePopup::handleWheelEvent(QWheelEvent *event, QSlider *sliderFromWheel) { if (sliderFromWheel) { for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.slider == sliderFromWheel && row.device) { const int step = volumeScrollStep(event, sliderFromWheel->singleStep()); if (step != 0) row.device->setVolume(row.device->volume() + step); return; } } } if (m_defaultSink) { const int step = volumeScrollStep(event, m_sliderStep); if (step != 0) m_defaultSink->setVolume(m_defaultSink->volume() + step); return; } if (m_sinkRows.size() == 1 && m_sinkRows.at(0).slider && m_sinkRows.at(0).device) { QSlider *slider = m_sinkRows.at(0).slider; const int step = volumeScrollStep(event, slider->singleStep()); if (step != 0) m_sinkRows.at(0).device->setVolume(slider->sliderPosition() + step); } } void VolumePopup::setDevice(AudioDevice *device) { if (device) setSinks({device}, device); else setSinks({}, nullptr); } void VolumePopup::setSinks(const QList &sinks, AudioDevice *defaultSink) { if (m_sinks == sinks && m_defaultSink == defaultSink) return; // Disconnect old default sink. if (m_defaultSink) disconnect(m_defaultSink, nullptr, this, nullptr); m_sinks = sinks; m_defaultSink = defaultSink; if (m_defaultSink) { connect(m_defaultSink, &AudioDevice::volumeChanged, this, [this](int v) { handleDeviceVolumeChanged(m_defaultSink, v); }); connect(m_defaultSink, &AudioDevice::muteChanged, this, [this](bool m) { handleDeviceMuteChanged(m_defaultSink, m); }); } rebuildSinkRows(); updateStockIcon(); emit deviceChanged(); } void VolumePopup::setDefaultSink(AudioDevice *defaultSink) { if (m_defaultSink == defaultSink) return; if (m_defaultSink) disconnect(m_defaultSink, nullptr, this, nullptr); m_defaultSink = defaultSink; if (m_defaultSink) { connect(m_defaultSink, &AudioDevice::volumeChanged, this, [this](int v) { handleDeviceVolumeChanged(m_defaultSink, v); }); connect(m_defaultSink, &AudioDevice::muteChanged, this, [this](bool m) { handleDeviceMuteChanged(m_defaultSink, m); }); } updateDefaultButtons(); updateStockIcon(); emit deviceChanged(); } void VolumePopup::setSliderStep(int step) { m_sliderStep = step; for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.slider) { row.slider->setSingleStep(step); row.slider->setPageStep(step * 10); } } } void VolumePopup::rebuildSinkRows() { for (const SinkRow &row : std::as_const(m_sinkRows)) { if (row.device) disconnect(row.device, nullptr, this, nullptr); if (row.rowWidget) row.rowWidget->deleteLater(); } m_sinkRows.clear(); QVBoxLayout *layout = qobject_cast(m_sinksContainer->layout()); if (!layout) return; for (AudioDevice *dev : std::as_const(m_sinks)) { SinkRow row = makeSinkRow(dev); if (!row.rowWidget) continue; layout->addWidget(row.rowWidget); m_sinkRows.append(row); connect(dev, &AudioDevice::volumeChanged, this, [this, dev](int v) { handleDeviceVolumeChanged(dev, v); }); connect(dev, &AudioDevice::muteChanged, this, [this, dev](bool m) { handleDeviceMuteChanged(dev, m); }); if (row.slider) { connect(row.slider, &QSlider::valueChanged, this, &VolumePopup::handleSliderValueChanged); row.slider->installEventFilter(this); } if (row.muteButton) connect(row.muteButton, &QPushButton::clicked, this, &VolumePopup::handleMuteToggleClicked); if (row.defaultButton) connect(row.defaultButton, &QPushButton::clicked, this, &VolumePopup::handleSetDefaultClicked); } updateDefaultButtons(); setSliderStep(m_sliderStep); // Size the scroll area by row height: show at least 1 row, at most 3 rows. if (!m_sinkRows.isEmpty() && layout) { m_sinksContainer->adjustSize(); QWidget *firstRow = m_sinkRows.at(0).rowWidget; int rowHeight = firstRow->sizeHint().height(); if (rowHeight <= 0) rowHeight = firstRow->minimumSizeHint().height(); if (rowHeight > 0) { const int spacing = layout->spacing(); m_sinkScrollArea->setMinimumHeight(rowHeight); m_sinkScrollArea->setMaximumHeight(3 * rowHeight + 2 * spacing); } } else { m_sinkScrollArea->setMinimumHeight(0); m_sinkScrollArea->setMaximumHeight(QWIDGETSIZE_MAX); } } SinkRow VolumePopup::makeSinkRow(AudioDevice *device) { SinkRow row; row.device = device; if (!device) return row; QFrame *frame = new QFrame(m_sinksContainer); frame->setFrameShape(QFrame::NoFrame); row.rowWidget = frame; QHBoxLayout *rowLayout = new QHBoxLayout(row.rowWidget); const QString desc = device->description(); QLabel *label = new QLabel(row.rowWidget); label->setToolTip(desc); const QFontMetrics fm(label->font()); const int maxChars = 18; const int labelWidth = fm.averageCharWidth() * maxChars; label->setFixedWidth(labelWidth); label->setText(fm.elidedText(desc, Qt::ElideRight, labelWidth)); rowLayout->addWidget(label); row.slider = new QSlider(Qt::Horizontal, row.rowWidget); // The volume sliders show 0-100; volumes of all devices should be converted to percentages. row.slider->setRange(0, 100); row.slider->setValue(device->volume()); row.slider->setToolTip(QStringLiteral("%1%").arg(device->volume())); row.slider->setSingleStep(m_sliderStep); row.slider->setPageStep(m_sliderStep * 10); row.slider->setMinimumWidth(120); row.slider->setTickPosition(QSlider::TicksBelow); row.slider->setTickInterval(10); rowLayout->addWidget(row.slider, 1); row.muteButton = new QPushButton(row.rowWidget); row.muteButton->setCheckable(true); row.muteButton->setChecked(device->mute()); row.muteButton->setIcon(QIcon::fromTheme(QLatin1String("audio-volume-muted-panel"))); row.muteButton->setToolTip(tr("Mute")); row.muteButton->setAutoDefault(false); rowLayout->addWidget(row.muteButton); row.defaultButton = new QPushButton(row.rowWidget); row.defaultButton->setCheckable(true); row.defaultButton->setToolTip(tr("Set as default output")); row.defaultButton->setAutoDefault(false); rowLayout->addWidget(row.defaultButton); return row; } void VolumePopup::updateDefaultButtons() { const bool showDefaultButton = m_sinkRows.count() > 1; for (SinkRow &row : m_sinkRows) { if (!row.defaultButton || !row.device) continue; row.defaultButton->setVisible(showDefaultButton); if (!showDefaultButton) continue; const bool isDefault = (row.device == m_defaultSink); row.defaultButton->setChecked(isDefault); row.defaultButton->setEnabled(!isDefault); row.defaultButton->setIcon(QIcon::fromTheme(QLatin1String("emblem-default-symbolic"))); row.defaultButton->setToolTip(isDefault ? tr("Default output") : tr("Set as default output")); } } void VolumePopup::realign() { QRect rect; rect.setSize(sizeHint()); switch (m_anchor) { case Qt::TopLeftCorner: rect.moveTopLeft(m_pos); break; case Qt::TopRightCorner: rect.moveTopRight(m_pos); break; case Qt::BottomLeftCorner: rect.moveBottomLeft(m_pos); break; case Qt::BottomRightCorner: rect.moveBottomRight(m_pos); break; } if (QScreen const * const screen = QGuiApplication::screenAt(m_pos)) { auto const & geometry = screen->availableGeometry(); if (rect.left() < geometry.left()) rect.moveLeft(geometry.left()); if (rect.right() > geometry.right()) rect.moveRight(geometry.right()); if (rect.top() < geometry.top()) rect.moveTop(geometry.top()); if (rect.bottom() > geometry.bottom()) rect.moveBottom(geometry.bottom()); } move(rect.topLeft()); } ================================================ FILE: plugin-volume/volumepopup.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Johannes Zellner * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef VOLUMEPOPUP_H #define VOLUMEPOPUP_H #include #include #include class QSlider; class QPushButton; class QScrollArea; class QWheelEvent; class AudioDevice; struct SinkRow { QPointer device; QWidget *rowWidget = nullptr; QSlider *slider = nullptr; QPushButton *muteButton = nullptr; QPushButton *defaultButton = nullptr; }; class VolumePopup : public QDialog { Q_OBJECT public: VolumePopup(QWidget* parent = nullptr); void openAt(QPoint pos, Qt::Corner anchor); void handleWheelEvent(QWheelEvent *event, QSlider *slider = nullptr); AudioDevice *device() const { return m_defaultSink; } void setDevice(AudioDevice *device); void setSinks(const QList &sinks, AudioDevice *defaultSink); void setDefaultSink(AudioDevice *defaultSink); void setSliderStep(int step); signals: void mouseEntered(); void mouseLeft(); void deviceChanged(); void launchMixer(); void stockIconChanged(const QString &iconName); void defaultSinkRequested(AudioDevice *device); void popupHidden(); protected: void hideEvent(QHideEvent *event) override; void resizeEvent(QResizeEvent *event) override; void enterEvent(QEnterEvent *event) override; void leaveEvent(QEvent *event) override; bool event(QEvent * event) override; bool eventFilter(QObject * watched, QEvent * event) override; private slots: void handleSliderValueChanged(int value); void handleMuteToggleClicked(); void handleSetDefaultClicked(); void handleDeviceVolumeChanged(AudioDevice *device, int volume); void handleDeviceMuteChanged(AudioDevice *device, bool mute); void onDefaultSinkVolumeOrMuteChanged(); private: void realign(); void updateStockIcon(); void rebuildSinkRows(); SinkRow makeSinkRow(AudioDevice *device); void updateDefaultButtons(); QScrollArea *m_sinkScrollArea; QWidget *m_sinksContainer; QPushButton *m_mixerButton; QPoint m_pos; Qt::Corner m_anchor; QList m_sinkRows; QList m_sinks; QPointer m_defaultSink; int m_sliderStep; }; #endif // VOLUMEPOPUP_H ================================================ FILE: plugin-worldclock/CMakeLists.txt ================================================ set(PLUGIN "worldclock") set(HEADERS lxqtworldclock.h lxqtworldclockconfiguration.h lxqtworldclockconfigurationtimezones.h lxqtworldclockconfigurationmanualformat.h ) set(SOURCES lxqtworldclock.cpp lxqtworldclockconfiguration.cpp lxqtworldclockconfigurationtimezones.cpp lxqtworldclockconfigurationmanualformat.cpp ) set(UIS lxqtworldclockconfiguration.ui lxqtworldclockconfigurationtimezones.ui lxqtworldclockconfigurationmanualformat.ui ) BUILD_LXQT_PLUGIN(${PLUGIN}) ================================================ FILE: plugin-worldclock/lxqtworldclock.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012-2013 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtworldclock.h" #include #include #include #include #include #include #include #include #include #include #include LXQtWorldClock::LXQtWorldClock(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mPopup(nullptr), mTimer(new QTimer(this)), mUpdateInterval(1), mTimeZoneWheel(true), mAutoRotate(true), mShowWeekNumber(true), mShowTooltip(false), mPopupContent(nullptr) { mMainWidget = new QWidget(); mMainWidget->installEventFilter(this); mContent = new ActiveLabel(); mRotatedWidget = new LXQt::RotatedWidget(*mContent, mMainWidget); QVBoxLayout *borderLayout = new QVBoxLayout(mMainWidget); borderLayout->setContentsMargins(0, 0, 0, 0); borderLayout->setSpacing(0); borderLayout->addWidget(mRotatedWidget, 0, Qt::AlignCenter); mContent->setObjectName(QLatin1String("WorldClockContent")); mContent->setAlignment(Qt::AlignCenter); settingsChanged(); mTimer->setTimerType(Qt::PreciseTimer); connect(mTimer, &QTimer::timeout, this, &LXQtWorldClock::timeout); connect(mContent, &ActiveLabel::wheelScrolled, this, &LXQtWorldClock::wheelScrolled); } LXQtWorldClock::~LXQtWorldClock() { delete mMainWidget; } void LXQtWorldClock::timeout() { if (QTime::currentTime().msec() > 500) restartTimer(); updateTimeText(); } void LXQtWorldClock::updateTimeText() { QDateTime now = QDateTime::currentDateTime(); QString timeZoneName = mActiveTimeZone; if (timeZoneName == QLatin1String("local")) timeZoneName = QString::fromLatin1(QTimeZone::systemTimeZoneId()); QTimeZone timeZone(timeZoneName.toLatin1()); QDateTime tzNow = now.toTimeZone(timeZone); bool isUpToDate(true); if (!mShownTime.isValid()) // first time or forced update { isUpToDate = false; if (mUpdateInterval < 60000) mShownTime = tzNow.addMSecs(-tzNow.time().msec()); // s else if (mUpdateInterval < 3600000) mShownTime = tzNow.addSecs(-tzNow.time().second()); // m else mShownTime = tzNow.addSecs(-tzNow.time().minute() * 60 - tzNow.time().second()); // h } else { qint64 diff = mShownTime.secsTo(tzNow); if (mUpdateInterval < 60000) { if (diff < 0 || diff >= 1) { isUpToDate = false; mShownTime = tzNow.addMSecs(-tzNow.time().msec()); } } else if (mUpdateInterval < 3600000) { if (diff < 0 || diff >= 60) { isUpToDate = false; mShownTime = tzNow.addSecs(-tzNow.time().second()); } } else if (diff < 0 || diff >= 3600) { isUpToDate = false; mShownTime = tzNow.addSecs(-tzNow.time().minute() * 60 - tzNow.time().second()); } } if (!isUpToDate) { const QSize old_size = mContent->sizeHint(); mContent->setText(QLocale::system().toString(tzNow, preformat(mFormat, timeZone, tzNow))); if (old_size != mContent->sizeHint()) mRotatedWidget->adjustContentSize(); mRotatedWidget->update(); updatePopupContent(); } } void LXQtWorldClock::setTimeText() { mShownTime = QDateTime(); // force an update updateTimeText(); } void LXQtWorldClock::restartTimer() { mTimer->stop(); // check the time every second even if the clock doesn't show seconds // because otherwise, the shown time might be vey wrong after resume mTimer->setInterval(1000); int delay = static_cast(1000 - (static_cast(QTime::currentTime().msecsSinceStartOfDay()) % 1000)); QTimer::singleShot(delay, Qt::PreciseTimer, this, &LXQtWorldClock::updateTimeText); QTimer::singleShot(delay, Qt::PreciseTimer, mTimer, SLOT(start())); } void LXQtWorldClock::settingsChanged() { static const QRegularExpression regexp(QLatin1String("'[^']*'")); PluginSettings *_settings = settings(); QString oldFormat = mFormat; mTimeZones.clear(); const QList > array = _settings->readArray(QLatin1String("timeZones")); for (const auto &map : array) { QString timeZoneName = map.value(QLatin1String("timeZone"), QString()).toString(); mTimeZones.append(timeZoneName); mTimeZoneCustomNames[timeZoneName] = map.value(QLatin1String("customName"), QString()).toString(); } if (mTimeZones.isEmpty()) mTimeZones.append(QLatin1String("local")); mDefaultTimeZone = _settings->value(QLatin1String("defaultTimeZone"), QString()).toString(); if (mDefaultTimeZone.isEmpty()) mDefaultTimeZone = mTimeZones[0]; mActiveTimeZone = mDefaultTimeZone; bool longTimeFormatSelected = false; QString formatType = _settings->value(QLatin1String("formatType"), QString()).toString(); QString dateFormatType = _settings->value(QLatin1String("dateFormatType"), QString()).toString(); bool advancedManual = _settings->value(QLatin1String("useAdvancedManualFormat"), false).toBool(); // backward compatibility if (formatType == QLatin1String("custom")) { formatType = QLatin1String("short-timeonly"); dateFormatType = QLatin1String("short"); advancedManual = true; } else if (formatType == QLatin1String("short")) { formatType = QLatin1String("short-timeonly"); dateFormatType = QLatin1String("short"); advancedManual = false; } else if ((formatType == QLatin1String("full")) || (formatType == QLatin1String("long")) || (formatType == QLatin1String("medium"))) { formatType = QLatin1String("long-timeonly"); dateFormatType = QLatin1String("long"); advancedManual = false; } if (formatType == QLatin1String("long-timeonly")) longTimeFormatSelected = true; bool timeShowSeconds = _settings->value(QLatin1String("timeShowSeconds"), false).toBool(); bool timePadHour = _settings->value(QLatin1String("timePadHour"), false).toBool(); bool timeAMPM = _settings->value(QLatin1String("timeAMPM"), false).toBool(); mShowTooltip = _settings->value(QLatin1String("showTooltip"), false).toBool(); // timezone bool showTimezone = _settings->value(QLatin1String("showTimezone"), false).toBool() && !longTimeFormatSelected; QString timezonePosition = _settings->value(QLatin1String("timezonePosition"), QString()).toString(); QString timezoneFormatType = _settings->value(QLatin1String("timezoneFormatType"), QString()).toString(); mTimeZoneWheel = _settings->value(QLatin1String("timeZoneWheel"), true).toBool(); // date bool showDate = _settings->value(QLatin1String("showDate"), false).toBool(); QString datePosition = _settings->value(QLatin1String("datePosition"), QString()).toString(); bool dateShowYear = _settings->value(QLatin1String("dateShowYear"), false).toBool(); bool dateShowDoW = _settings->value(QLatin1String("dateShowDoW"), false).toBool(); bool datePadDay = _settings->value(QLatin1String("datePadDay"), false).toBool(); bool dateLongNames = _settings->value(QLatin1String("dateLongNames"), false).toBool(); // advanced QString customFormat = _settings->value(QLatin1String("customFormat"), tr("''HH:mm:ss'
'ddd, d MMM yyyy'
'TT'
'")).toString(); if (advancedManual) mFormat = customFormat; else { if (formatType == QLatin1String("short-timeonly")) mFormat = QLocale{}.timeFormat(QLocale::ShortFormat); else if (formatType == QLatin1String("long-timeonly")) mFormat = QLocale{}.timeFormat(QLocale::LongFormat); else // if (formatType == QLatin1String("custom-timeonly")) mFormat = QString(QLatin1String("%1:mm%2%3")).arg(timePadHour ? QLatin1String("hh") : QLatin1String("h")).arg(timeShowSeconds ? QLatin1String(":ss") : QLatin1String("")).arg(timeAMPM ? QLatin1String(" A") : QLatin1String("")); if (showTimezone) { QString timezonePortion; if (timezoneFormatType == QLatin1String("short")) timezonePortion = QLatin1String("TTTT"); else if (timezoneFormatType == QLatin1String("long")) timezonePortion = QLatin1String("TTTTT"); else if (timezoneFormatType == QLatin1String("offset")) timezonePortion = QLatin1String("T"); else if (timezoneFormatType == QLatin1String("abbreviation")) timezonePortion = QLatin1String("TTT"); else if (timezoneFormatType == QLatin1String("iana")) timezonePortion = QLatin1String("TT"); else // if (timezoneFormatType == QLatin1String("custom")) timezonePortion = QLatin1String("TTTTTT"); if (timezonePosition == QLatin1String("below")) mFormat = mFormat + QLatin1String("'
'") + timezonePortion; else if (timezonePosition == QLatin1String("above")) mFormat = timezonePortion + QLatin1String("'
'") + mFormat; else if (timezonePosition == QLatin1String("before")) mFormat = timezonePortion + QLatin1String(" ") + mFormat; else // if (timezonePosition == QLatin1String("after")) mFormat = mFormat + QLatin1String(" ") + timezonePortion; } if (showDate) { QString datePortion; if (dateFormatType == QLatin1String("short")) datePortion = QLocale{}.dateFormat(QLocale::ShortFormat); else if (dateFormatType == QLatin1String("long")) datePortion = QLocale{}.dateFormat(QLocale::LongFormat); else if (dateFormatType == QLatin1String("iso")) datePortion = QLatin1String("yyyy-MM-dd"); else // if (dateFormatType == QLatin1String("custom")) { QString datePortionOrder; QString dateLocale = QLocale{}.dateFormat(QLocale::ShortFormat).toLower(); int yearIndex = dateLocale.indexOf(QLatin1String("y")); int monthIndex = dateLocale.indexOf(QLatin1String("m")); int dayIndex = dateLocale.indexOf(QLatin1String("d")); if (yearIndex < dayIndex) // Big-endian (year, month, day) (yyyy MMMM dd, dddd) -> in some Asia countires like China or Japan datePortionOrder = QLatin1String("%1%2%3 %4%5%6"); else if (monthIndex < dayIndex) // Middle-endian (month, day, year) (dddd, MMMM dd yyyy) -> USA datePortionOrder = QLatin1String("%6%5%3 %4%2%1"); else // Little-endian (day, month, year) (dddd, dd MMMM yyyy) -> most of Europe datePortionOrder = QLatin1String("%6%5%4 %3%2%1"); datePortion = datePortionOrder.arg(dateShowYear ? QLatin1String("yyyy") : QLatin1String("")).arg(dateShowYear ? QLatin1String(" ") : QLatin1String("")).arg(dateLongNames ? QLatin1String("MMMM") : QLatin1String("MMM")).arg(datePadDay ? QLatin1String("dd") : QLatin1String("d")).arg(dateShowDoW ? QLatin1String(", ") : QLatin1String("")).arg(dateShowDoW ? (dateLongNames ? QLatin1String("dddd") : QLatin1String("ddd")) : QLatin1String("")); } if (datePosition == QLatin1String("below")) mFormat = mFormat + QLatin1String("'
'") + datePortion; else if (datePosition == QLatin1String("above")) mFormat = datePortion + QLatin1String("'
'") + mFormat; else if (datePosition == QLatin1String("before")) mFormat = datePortion + QLatin1String(" ") + mFormat; else // if (datePosition == QLatin1String("after")) mFormat = mFormat + QLatin1String(" ") + datePortion; } } if ((oldFormat != mFormat)) { int update_interval; QString format = mFormat; format.replace(regexp, QString()); //don't support updating on millisecond basis -> big performance hit if (format.contains(QLatin1String("s"))) update_interval = 1000; else if (format.contains(QLatin1String("m"))) update_interval = 60000; else update_interval = 3600000; if (update_interval != mUpdateInterval) { mUpdateInterval = update_interval; restartTimer(); } } bool autoRotate = settings()->value(QLatin1String("autoRotate"), true).toBool(); if (autoRotate != mAutoRotate) { mAutoRotate = autoRotate; realign(); } bool showWeekNumber = settings()->value(QL1S("showWeekNumber"), true).toBool(); if (showWeekNumber != mShowWeekNumber) { mShowWeekNumber = showWeekNumber; } if (mPopup) { updatePopupContent(); mPopup->adjustSize(); mPopup->setGeometry(calculatePopupWindowPos(mPopup->size())); } setTimeText(); } QDialog *LXQtWorldClock::configureDialog() { return new LXQtWorldClockConfiguration(settings()); } void LXQtWorldClock::wheelScrolled(int delta) { if (mTimeZoneWheel && mTimeZones.count() > 1) { mActiveTimeZone = mTimeZones[(mTimeZones.indexOf(mActiveTimeZone) + ((delta > 0) ? -1 : 1) + mTimeZones.size()) % mTimeZones.size()]; setTimeText(); } } void LXQtWorldClock::activated(ActivationReason reason) { switch (reason) { case ILXQtPanelPlugin::Trigger: case ILXQtPanelPlugin::MiddleClick: break; default: return; } if (!mPopup) { mPopup = new LXQtWorldClockPopup(mContent); connect(mPopup, &QObject::destroyed, this, [this]() { mPopupContent = nullptr; mPopup = nullptr; }); if (reason == ILXQtPanelPlugin::Trigger) { mPopup->setObjectName(QLatin1String("WorldClockCalendar")); mPopup->layout()->setContentsMargins(0, 0, 0, 0); QCalendarWidget *calendarWidget = new QCalendarWidget(mPopup); if (!mShowWeekNumber) calendarWidget->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader); mPopup->layout()->addWidget(calendarWidget); QString timeZoneName = mActiveTimeZone; if (timeZoneName == QLatin1String("local")) timeZoneName = QString::fromLatin1(QTimeZone::systemTimeZoneId()); QTimeZone timeZone(timeZoneName.toLatin1()); calendarWidget->setFirstDayOfWeek(QLocale{}.firstDayOfWeek()); calendarWidget->setSelectedDate(QDateTime::currentDateTime().toTimeZone(timeZone).date()); } else { mPopup->setObjectName(QLatin1String("WorldClockPopup")); mPopupContent = new QLabel(mPopup); mPopup->layout()->addWidget(mPopupContent); mPopupContent->setAlignment(mContent->alignment()); updatePopupContent(); } mPopup->adjustSize(); mPopup->setGeometry(calculatePopupWindowPos(mPopup->size())); willShowWindow(mPopup); mPopup->show(); } else { delete mPopup; } } QString LXQtWorldClock::formatDateTime(const QDateTime &datetime, const QString &timeZoneName) { QTimeZone timeZone(timeZoneName.toLatin1()); QDateTime tzNow = datetime.toTimeZone(timeZone); return QLocale::system().toString(tzNow, preformat(mFormat, timeZone, tzNow)); } void LXQtWorldClock::updatePopupContent() { if (mPopupContent) { QDateTime now = QDateTime::currentDateTime(); QStringList allTimeZones; bool hasTimeZone = formatHasTimeZone(mFormat); for (QString timeZoneName : std::as_const(mTimeZones)) { if (timeZoneName == QLatin1String("local")) timeZoneName = QString::fromLatin1(QTimeZone::systemTimeZoneId()); QString formatted = formatDateTime(now, timeZoneName); if (!hasTimeZone) formatted += QLatin1String("
") + QString::fromLatin1(QTimeZone(timeZoneName.toLatin1()).id()); allTimeZones.append(formatted); } mPopupContent->setText(allTimeZones.join(QLatin1String("
"))); } } bool LXQtWorldClock::formatHasTimeZone(QString format) { static const QRegularExpression regexp(QLatin1String("'[^']*'")); format.replace(regexp, QString()); return format.contains(QLatin1Char('t'), Qt::CaseInsensitive); } QString LXQtWorldClock::preformat(const QString &format, const QTimeZone &timeZone, const QDateTime &dateTime) { QString result = format; int from = 0; for (;;) { int apos = result.indexOf(QLatin1Char('\''), from); int tz = result.indexOf(QLatin1Char('T'), from); if ((apos != -1) && (tz != -1)) { if (apos > tz) apos = -1; else tz = -1; } if (apos != -1) { from = apos + 1; apos = result.indexOf(QLatin1Char('\''), from); if (apos == -1) // misformat break; from = apos + 1; } else if (tz != -1) { int length = 1; for (; result[tz + length] == QLatin1Char('T'); ++length); if (length > 6) length = 6; QString replacement; switch (length) { case 1: replacement = timeZone.displayName(dateTime, QTimeZone::OffsetName); if (replacement.startsWith(QLatin1String("UTC"))) replacement = replacement.mid(3); break; case 2: replacement = QString::fromLatin1(timeZone.id()); break; case 3: replacement = timeZone.abbreviation(dateTime); break; case 4: replacement = timeZone.displayName(dateTime, QTimeZone::ShortName); break; case 5: replacement = timeZone.displayName(dateTime, QTimeZone::LongName); break; case 6: replacement = mTimeZoneCustomNames[QString::fromLatin1(timeZone.id())]; } if ((tz > 0) && (result[tz - 1] == QLatin1Char('\''))) { --tz; ++length; } else replacement.prepend(QLatin1Char('\'')); if (result[tz + length] == QLatin1Char('\'')) ++length; else replacement.append(QLatin1Char('\'')); result.replace(tz, length, replacement); from = tz + replacement.length(); } else break; } return result; } void LXQtWorldClock::realign() { if (mAutoRotate) switch (panel()->position()) { case ILXQtPanel::PositionTop: case ILXQtPanel::PositionBottom: mRotatedWidget->setOrigin(Qt::TopLeftCorner); break; case ILXQtPanel::PositionLeft: mRotatedWidget->setOrigin(Qt::BottomLeftCorner); break; case ILXQtPanel::PositionRight: mRotatedWidget->setOrigin(Qt::TopRightCorner); break; } else mRotatedWidget->setOrigin(Qt::TopLeftCorner); if (mContent->size() != mContent->sizeHint()) mRotatedWidget->adjustContentSize(); } ActiveLabel::ActiveLabel(QWidget *parent) : QLabel(parent) { } void ActiveLabel::wheelEvent(QWheelEvent *event) { QPoint angleDelta = event->angleDelta(); Qt::Orientation orient = (qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? Qt::Horizontal : Qt::Vertical); int delta = (orient == Qt::Horizontal ? angleDelta.x() : angleDelta.y()); emit wheelScrolled(delta); QLabel::wheelEvent(event); } void ActiveLabel::mouseReleaseEvent(QMouseEvent* event) { switch (event->button()) { case Qt::LeftButton: emit leftMouseButtonClicked(); break; case Qt::MiddleButton: emit middleMouseButtonClicked(); break; default:; } QLabel::mouseReleaseEvent(event); } LXQtWorldClockPopup::LXQtWorldClockPopup(QWidget *parent) : QDialog(parent, Qt::Window | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::Popup | Qt::X11BypassWindowManagerHint) { setAttribute(Qt::WA_DeleteOnClose); setLayout(new QHBoxLayout(this)); layout()->setContentsMargins(5, 2, 5, 2); } void LXQtWorldClockPopup::show() { QDialog::show(); activateWindow(); } bool LXQtWorldClock::eventFilter(QObject * watched, QEvent * event) { if (mShowTooltip && watched == mMainWidget && event->type() == QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast(event); QDateTime now = QDateTime::currentDateTime(); QString timeZoneName = mActiveTimeZone; if (timeZoneName == QLatin1String("local")) timeZoneName = QString::fromLatin1(QTimeZone::systemTimeZoneId()); QTimeZone timeZone(timeZoneName.toLatin1()); QDateTime tzNow = now.toTimeZone(timeZone); QToolTip::showText(helpEvent->globalPos(), QLocale::system().toString(tzNow, QLocale::ShortFormat)); return false; } return QObject::eventFilter(watched, event); } ================================================ FILE: plugin-worldclock/lxqtworldclock.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012-2013 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PANEL_WORLDCLOCK_H #define LXQT_PANEL_WORLDCLOCK_H #include #include #include #include #include "../panel/ilxqtpanelplugin.h" #include "lxqtworldclockconfiguration.h" class ActiveLabel; class QTimer; class LXQtWorldClockPopup; class LXQtWorldClock : public QObject, public ILXQtPanelPlugin { Q_OBJECT public: LXQtWorldClock(const ILXQtPanelPluginStartupInfo &startupInfo); ~LXQtWorldClock(); virtual QWidget *widget() { return mMainWidget; } virtual QString themeId() const { return QLatin1String("WorldClock"); } virtual ILXQtPanelPlugin::Flags flags() const { return PreferRightAlignment | HaveConfigDialog ; } bool isSeparate() const { return true; } void activated(ActivationReason reason); virtual void settingsChanged(); virtual void realign(); QDialog *configureDialog(); bool eventFilter(QObject * watched, QEvent * event); private slots: void timeout(); void wheelScrolled(int); void updateTimeText(); private: QWidget *mMainWidget; LXQt::RotatedWidget* mRotatedWidget; ActiveLabel *mContent; LXQtWorldClockPopup* mPopup; QTimer *mTimer; int mUpdateInterval; QStringList mTimeZones; QMap mTimeZoneCustomNames; QString mDefaultTimeZone; QString mActiveTimeZone; QString mFormat; bool mTimeZoneWheel; bool mAutoRotate; bool mShowWeekNumber; bool mShowTooltip; QLabel *mPopupContent; QDateTime mShownTime; void restartTimer(); void setTimeText(); QString formatDateTime(const QDateTime &datetime, const QString &timeZoneName); void updatePopupContent(); bool formatHasTimeZone(QString format); QString preformat(const QString &format, const QTimeZone &timeZone, const QDateTime& dateTime); }; class ActiveLabel : public QLabel { Q_OBJECT public: explicit ActiveLabel(QWidget * = nullptr); signals: void wheelScrolled(int); void leftMouseButtonClicked(); void middleMouseButtonClicked(); protected: void wheelEvent(QWheelEvent *); void mouseReleaseEvent(QMouseEvent* event); }; class LXQtWorldClockPopup : public QDialog { Q_OBJECT public: LXQtWorldClockPopup(QWidget *parent = nullptr); void show(); }; class LXQtWorldClockLibrary: public QObject, public ILXQtPanelPluginLibrary { Q_OBJECT Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") Q_INTERFACES(ILXQtPanelPluginLibrary) public: ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const { return new LXQtWorldClock(startupInfo); } }; #endif // LXQT_PANEL_WORLDCLOCK_H ================================================ FILE: plugin-worldclock/lxqtworldclockconfiguration.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include "lxqtworldclockconfiguration.h" #include "ui_lxqtworldclockconfiguration.h" #include "lxqtworldclockconfigurationtimezones.h" #include "lxqtworldclockconfigurationmanualformat.h" #include #include LXQtWorldClockConfiguration::LXQtWorldClockConfiguration(PluginSettings *settings, QWidget *parent) : LXQtPanelPluginConfigDialog(settings, parent), ui(new Ui::LXQtWorldClockConfiguration), mLockCascadeSettingChanges(false), mConfigurationTimeZones(nullptr), mConfigurationManualFormat(nullptr) { setAttribute(Qt::WA_DeleteOnClose); setObjectName(QLatin1String("WorldClockConfigurationWindow")); ui->setupUi(this); connect(ui->buttons, &QDialogButtonBox::clicked, this, &LXQtWorldClockConfiguration::dialogButtonsAction); connect(ui->timeFormatCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timeShowSecondsCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timePadHourCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timeAMPMCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timezoneGB, &QGroupBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timezonePositionCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->timezoneFormatCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->dateGB, &QGroupBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->datePositionCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->dateFormatCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->dateShowYearCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->dateShowDoWCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->datePadDayCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->dateLongNamesCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->advancedManualGB, &QGroupBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->customisePB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::customiseManualFormatClicked); connect(ui->timeFormatCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::timeFormatChanged); connect(ui->dateGB, &QGroupBox::toggled, this, &LXQtWorldClockConfiguration::dateGroupToggled); connect(ui->dateFormatCB, &QComboBox::currentIndexChanged, this, &LXQtWorldClockConfiguration::dateFormatChanged); connect(ui->advancedManualGB, &QGroupBox::toggled, this, &LXQtWorldClockConfiguration::advancedFormatToggled); connect(ui->timeZonesTW, &QTableWidget::itemSelectionChanged, this, &LXQtWorldClockConfiguration::updateTimeZoneButtons); connect(ui->addPB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::addTimeZone); connect(ui->removePB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::removeTimeZone); connect(ui->setAsDefaultPB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::setTimeZoneAsDefault); connect(ui->editCustomNamePB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::editTimeZoneCustomName); connect(ui->moveUpPB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::moveTimeZoneUp); connect(ui->moveDownPB, &QPushButton::clicked, this, &LXQtWorldClockConfiguration::moveTimeZoneDown); connect(ui->autorotateCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->showWeekNumberCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->showTooltipCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); connect(ui->wheelCB, &QCheckBox::clicked, this, &LXQtWorldClockConfiguration::saveSettings); loadSettings(); } LXQtWorldClockConfiguration::~LXQtWorldClockConfiguration() { delete ui; } void LXQtWorldClockConfiguration::loadSettings() { mLockCascadeSettingChanges = true; bool longTimeFormatSelected = false; QString formatType = settings().value(QLatin1String("formatType"), QString()).toString(); QString dateFormatType = settings().value(QLatin1String("dateFormatType"), QString()).toString(); bool advancedManual = settings().value(QLatin1String("useAdvancedManualFormat"), false).toBool(); mManualFormat = settings().value(QLatin1String("customFormat"), tr("''HH:mm:ss'
'ddd, d MMM yyyy'
'TT'
'")).toString(); // backward compatibility if (formatType == QLatin1String("custom")) { formatType = QLatin1String("short-timeonly"); dateFormatType = QLatin1String("short"); advancedManual = true; } else if (formatType == QLatin1String("short")) { formatType = QLatin1String("short-timeonly"); dateFormatType = QLatin1String("short"); advancedManual = false; } else if ((formatType == QLatin1String("full")) || (formatType == QLatin1String("long")) || (formatType == QLatin1String("medium"))) { formatType = QLatin1String("long-timeonly"); dateFormatType = QLatin1String("long"); advancedManual = false; } if (formatType == QLatin1String("short-timeonly")) ui->timeFormatCB->setCurrentIndex(0); else if (formatType == QLatin1String("long-timeonly")) { ui->timeFormatCB->setCurrentIndex(1); longTimeFormatSelected = true; } else // if (formatType == QLatin1String("custom-timeonly")) ui->timeFormatCB->setCurrentIndex(2); ui->timeShowSecondsCB->setChecked(settings().value(QLatin1String("timeShowSeconds"), false).toBool()); ui->timePadHourCB->setChecked(settings().value(QLatin1String("timePadHour"), false).toBool()); ui->timeAMPMCB->setChecked(settings().value(QLatin1String("timeAMPM"), false).toBool()); ui->showTooltipCB->setChecked(settings().value(QLatin1String("showTooltip"), false).toBool()); bool customTimeFormatSelected = ui->timeFormatCB->currentIndex() == ui->timeFormatCB->count() - 1; ui->timeCustomW->setEnabled(customTimeFormatSelected); ui->timezoneGB->setEnabled(!longTimeFormatSelected); // timezone ui->timezoneGB->setChecked(settings().value(QLatin1String("showTimezone"), false).toBool() && !longTimeFormatSelected); QString timezonePosition = settings().value(QLatin1String("timezonePosition"), QString()).toString(); if (timezonePosition == QLatin1String("above")) ui->timezonePositionCB->setCurrentIndex(1); else if (timezonePosition == QLatin1String("before")) ui->timezonePositionCB->setCurrentIndex(2); else if (timezonePosition == QLatin1String("after")) ui->timezonePositionCB->setCurrentIndex(3); else // if (timezonePosition == QLatin1String("below")) ui->timezonePositionCB->setCurrentIndex(0); QString timezoneFormatType = settings().value(QLatin1String("timezoneFormatType"), QString()).toString(); if (timezoneFormatType == QLatin1String("short")) ui->timezoneFormatCB->setCurrentIndex(0); else if (timezoneFormatType == QLatin1String("long")) ui->timezoneFormatCB->setCurrentIndex(1); else if (timezoneFormatType == QLatin1String("offset")) ui->timezoneFormatCB->setCurrentIndex(2); else if (timezoneFormatType == QLatin1String("abbreviation")) ui->timezoneFormatCB->setCurrentIndex(3); else // if (timezoneFormatType == QLatin1String("iana")) ui->timezoneFormatCB->setCurrentIndex(4); // date bool dateIsChecked = settings().value(QLatin1String("showDate"), false).toBool(); ui->dateGB->setChecked(dateIsChecked); QString datePosition = settings().value(QLatin1String("datePosition"), QString()).toString(); if (datePosition == QLatin1String("above")) ui->datePositionCB->setCurrentIndex(1); else if (datePosition == QLatin1String("before")) ui->datePositionCB->setCurrentIndex(2); else if (datePosition == QLatin1String("after")) ui->datePositionCB->setCurrentIndex(3); else // if (datePosition == QLatin1String("below")) ui->datePositionCB->setCurrentIndex(0); if (dateFormatType == QLatin1String("short")) ui->dateFormatCB->setCurrentIndex(0); else if (dateFormatType == QLatin1String("long")) ui->dateFormatCB->setCurrentIndex(1); else if (dateFormatType == QLatin1String("iso")) ui->dateFormatCB->setCurrentIndex(2); else // if (dateFormatType == QLatin1String("custom")) ui->dateFormatCB->setCurrentIndex(3); ui->dateShowYearCB->setChecked(settings().value(QLatin1String("dateShowYear"), false).toBool()); ui->dateShowDoWCB->setChecked(settings().value(QLatin1String("dateShowDoW"), false).toBool()); ui->datePadDayCB->setChecked(settings().value(QLatin1String("datePadDay"), false).toBool()); ui->dateLongNamesCB->setChecked(settings().value(QLatin1String("dateLongNames"), false).toBool()); bool customDateFormatSelected = ui->dateFormatCB->currentIndex() == ui->dateFormatCB->count() - 1; ui->dateCustomW->setEnabled(dateIsChecked && customDateFormatSelected); ui->advancedManualGB->setChecked(advancedManual); mDefaultTimeZone = settings().value(QStringLiteral("defaultTimeZone"), QString()).toString(); ui->timeZonesTW->setRowCount(0); const QList > list = settings().readArray(QLatin1String("timeZones")); int i = 0; for (const auto &map : list) { ui->timeZonesTW->setRowCount(ui->timeZonesTW->rowCount() + 1); QString timeZoneName = map.value(QLatin1String("timeZone"), QString()).toString(); if (mDefaultTimeZone.isEmpty()) mDefaultTimeZone = timeZoneName; ui->timeZonesTW->setItem(i, 0, new QTableWidgetItem(timeZoneName)); ui->timeZonesTW->setItem(i, 1, new QTableWidgetItem(map.value(QLatin1String("customName"), QString()).toString())); setBold(i, mDefaultTimeZone == timeZoneName); ++i; } ui->timeZonesTW->resizeColumnsToContents(); ui->autorotateCB->setChecked(settings().value(QStringLiteral("autoRotate"), true).toBool()); ui->showWeekNumberCB->setChecked(settings().value(QL1S("showWeekNumber"), true).toBool()); ui->wheelCB->setChecked(settings().value(QLatin1String("timeZoneWheel"), true).toBool()); mLockCascadeSettingChanges = false; } void LXQtWorldClockConfiguration::saveSettings() { if (mLockCascadeSettingChanges) return; QString formatType; switch (ui->timeFormatCB->currentIndex()) { case 0: formatType = QLatin1String("short-timeonly"); break; case 1: formatType = QLatin1String("long-timeonly"); break; case 2: formatType = QLatin1String("custom-timeonly"); break; } settings().setValue(QLatin1String("formatType"), formatType); settings().setValue(QLatin1String("timeShowSeconds"), ui->timeShowSecondsCB->isChecked()); settings().setValue(QLatin1String("timePadHour"), ui->timePadHourCB->isChecked()); settings().setValue(QLatin1String("timeAMPM"), ui->timeAMPMCB->isChecked()); settings().setValue(QLatin1String("showTimezone"), ui->timezoneGB->isChecked()); QString timezonePosition; switch (ui->timezonePositionCB->currentIndex()) { case 0: timezonePosition = QLatin1String("below"); break; case 1: timezonePosition = QLatin1String("above"); break; case 2: timezonePosition = QLatin1String("before"); break; case 3: timezonePosition = QLatin1String("after"); break; } settings().setValue(QLatin1String("timezonePosition"), timezonePosition); QString timezoneFormatType; switch (ui->timezoneFormatCB->currentIndex()) { case 0: timezoneFormatType = QLatin1String("short"); break; case 1: timezoneFormatType = QLatin1String("long"); break; case 2: timezoneFormatType = QLatin1String("offset"); break; case 3: timezoneFormatType = QLatin1String("abbreviation"); break; case 4: timezoneFormatType = QLatin1String("iana"); break; } settings().setValue(QLatin1String("timezoneFormatType"), timezoneFormatType); settings().setValue(QLatin1String("showDate"), ui->dateGB->isChecked()); QString datePosition; switch (ui->datePositionCB->currentIndex()) { case 0: datePosition = QLatin1String("below"); break; case 1: datePosition = QLatin1String("above"); break; case 2: datePosition = QLatin1String("before"); break; case 3: datePosition = QLatin1String("after"); break; } settings().setValue(QLatin1String("datePosition"), datePosition); QString dateFormatType; switch (ui->dateFormatCB->currentIndex()) { case 0: dateFormatType = QLatin1String("short"); break; case 1: dateFormatType = QLatin1String("long"); break; case 2: dateFormatType = QLatin1String("iso"); break; case 3: dateFormatType = QLatin1String("custom"); break; } settings().setValue(QLatin1String("dateFormatType"), dateFormatType); settings().setValue(QLatin1String("dateShowYear"), ui->dateShowYearCB->isChecked()); settings().setValue(QLatin1String("dateShowDoW"), ui->dateShowDoWCB->isChecked()); settings().setValue(QLatin1String("datePadDay"), ui->datePadDayCB->isChecked()); settings().setValue(QLatin1String("dateLongNames"), ui->dateLongNamesCB->isChecked()); settings().setValue(QLatin1String("customFormat"), mManualFormat); settings().remove(QLatin1String("timeZones")); QList > array; int size = ui->timeZonesTW->rowCount(); for (int i = 0; i < size; ++i) { QMap map; map[QLatin1String("timeZone")] = ui->timeZonesTW->item(i, 0)->text(); map[QLatin1String("customName")] = ui->timeZonesTW->item(i, 1)->text(); array << map; } settings().setArray(QLatin1String("timeZones"), array); settings().setValue(QLatin1String("defaultTimeZone"), mDefaultTimeZone); settings().setValue(QLatin1String("useAdvancedManualFormat"), ui->advancedManualGB->isChecked()); settings().setValue(QLatin1String("autoRotate"), ui->autorotateCB->isChecked()); settings().setValue(QL1S("showWeekNumber"), ui->showWeekNumberCB->isChecked()); settings().setValue(QLatin1String("showTooltip"), ui->showTooltipCB->isChecked()); settings().setValue(QLatin1String("timeZoneWheel"), ui->wheelCB->isChecked()); } void LXQtWorldClockConfiguration::timeFormatChanged(int index) { bool longTimeFormatSelected = index == 1; bool customTimeFormatSelected = index == 2; ui->timeCustomW->setEnabled(customTimeFormatSelected); ui->timezoneGB->setEnabled(!longTimeFormatSelected); } void LXQtWorldClockConfiguration::dateGroupToggled(bool dateIsChecked) { bool customDateFormatSelected = ui->dateFormatCB->currentIndex() == ui->dateFormatCB->count() - 1; ui->dateCustomW->setEnabled(dateIsChecked && customDateFormatSelected); } void LXQtWorldClockConfiguration::dateFormatChanged(int index) { bool customDateFormatSelected = index == ui->dateFormatCB->count() - 1; bool dateIsChecked = ui->dateGB->isChecked(); ui->dateCustomW->setEnabled(dateIsChecked && customDateFormatSelected); } void LXQtWorldClockConfiguration::advancedFormatToggled(bool on) { bool longTimeFormatSelected = ui->timeFormatCB->currentIndex() == 1; ui->timeGB->setEnabled(!on); ui->timezoneGB->setEnabled(!on && !longTimeFormatSelected); ui->dateGB->setEnabled(!on); } void LXQtWorldClockConfiguration::customiseManualFormatClicked() { if (!mConfigurationManualFormat) { mConfigurationManualFormat = new LXQtWorldClockConfigurationManualFormat(this); connect(mConfigurationManualFormat, &LXQtWorldClockConfigurationManualFormat::manualFormatChanged, this, &LXQtWorldClockConfiguration::manualFormatChanged); } mConfigurationManualFormat->setManualFormat(mManualFormat); QString oldManualFormat = mManualFormat; mManualFormat = (mConfigurationManualFormat->exec() == QDialog::Accepted) ? mConfigurationManualFormat->manualFormat() : oldManualFormat; saveSettings(); } void LXQtWorldClockConfiguration::manualFormatChanged() { mManualFormat = mConfigurationManualFormat->manualFormat(); saveSettings(); } void LXQtWorldClockConfiguration::updateTimeZoneButtons() { QList selectedItems = ui->timeZonesTW->selectedItems(); int selectedCount = selectedItems.count() / 2; int allCount = ui->timeZonesTW->rowCount(); ui->removePB->setEnabled(selectedCount != 0); bool canSetAsDefault = (selectedCount == 1); if (canSetAsDefault) { if (selectedItems[0]->column() == 0) canSetAsDefault = (selectedItems[0]->text() != mDefaultTimeZone); else canSetAsDefault = (selectedItems[1]->text() != mDefaultTimeZone); } bool canMoveUp = false; bool canMoveDown = false; if ((selectedCount != 0) && (selectedCount != allCount)) { bool skipBottom = true; for (int i = allCount - 1; i >= 0; --i) { if (ui->timeZonesTW->item(i, 0)->isSelected()) { if (!skipBottom) { canMoveDown = true; break; } } else skipBottom = false; } bool skipTop = true; for (int i = 0; i < allCount; ++i) { if (ui->timeZonesTW->item(i, 0)->isSelected()) { if (!skipTop) { canMoveUp = true; break; } } else skipTop = false; } } ui->setAsDefaultPB->setEnabled(canSetAsDefault); ui->editCustomNamePB->setEnabled(selectedCount == 1); ui->moveUpPB->setEnabled(canMoveUp); ui->moveDownPB->setEnabled(canMoveDown); } int LXQtWorldClockConfiguration::findTimeZone(const QString& timeZone) { QList items = ui->timeZonesTW->findItems(timeZone, Qt::MatchExactly); for (const QTableWidgetItem* item : std::as_const(items)) if (item->column() == 0) return item->row(); return -1; } void LXQtWorldClockConfiguration::addTimeZone() { if (!mConfigurationTimeZones) mConfigurationTimeZones = new LXQtWorldClockConfigurationTimeZones(this); if (mConfigurationTimeZones->updateAndExec() == QDialog::Accepted) { QString timeZone = mConfigurationTimeZones->timeZone(); if (timeZone != QString()) { if (findTimeZone(timeZone) == -1) { int row = ui->timeZonesTW->rowCount(); ui->timeZonesTW->setRowCount(row + 1); QTableWidgetItem *item = new QTableWidgetItem(timeZone); ui->timeZonesTW->setItem(row, 0, item); ui->timeZonesTW->setItem(row, 1, new QTableWidgetItem(QString())); if (mDefaultTimeZone.isEmpty()) setDefault(row); } } } saveSettings(); } void LXQtWorldClockConfiguration::removeTimeZone() { const auto selectedItems = ui->timeZonesTW->selectedItems(); for (const QTableWidgetItem *item : selectedItems) if (item->column() == 0) { if (item->text() == mDefaultTimeZone) mDefaultTimeZone.clear(); ui->timeZonesTW->removeRow(item->row()); } if ((mDefaultTimeZone.isEmpty()) && ui->timeZonesTW->rowCount()) setDefault(0); saveSettings(); } void LXQtWorldClockConfiguration::setBold(QTableWidgetItem *item, bool value) { if (item) { QFont font = item->font(); font.setBold(value); item->setFont(font); } } void LXQtWorldClockConfiguration::setBold(int row, bool value) { setBold(ui->timeZonesTW->item(row, 0), value); setBold(ui->timeZonesTW->item(row, 1), value); } void LXQtWorldClockConfiguration::setDefault(int row) { setBold(row, true); mDefaultTimeZone = ui->timeZonesTW->item(row, 0)->text(); } void LXQtWorldClockConfiguration::setTimeZoneAsDefault() { setBold(findTimeZone(mDefaultTimeZone), false); setDefault(ui->timeZonesTW->selectedItems()[0]->row()); saveSettings(); } void LXQtWorldClockConfiguration::editTimeZoneCustomName() { int row = ui->timeZonesTW->selectedItems()[0]->row(); QString oldName = ui->timeZonesTW->item(row, 1)->text(); QInputDialog d(this); d.setWindowTitle(tr("Input custom time zone name")); d.setLabelText(tr("Custom name")); d.setTextValue(oldName); d.setWindowModality(Qt::WindowModal); if (d.exec()) { ui->timeZonesTW->item(row, 1)->setText(d.textValue()); saveSettings(); } } void LXQtWorldClockConfiguration::moveTimeZoneUp() { int m = ui->timeZonesTW->rowCount(); bool skipTop = true; for (int i = 0; i < m; ++i) { if (ui->timeZonesTW->item(i, 0)->isSelected()) { if (!skipTop) { QTableWidgetItem *itemP0 = ui->timeZonesTW->takeItem(i - 1, 0); QTableWidgetItem *itemP1 = ui->timeZonesTW->takeItem(i - 1, 1); QTableWidgetItem *itemT0 = ui->timeZonesTW->takeItem(i, 0); QTableWidgetItem *itemT1 = ui->timeZonesTW->takeItem(i, 1); ui->timeZonesTW->setItem(i - 1, 0, itemT0); ui->timeZonesTW->setItem(i - 1, 1, itemT1); ui->timeZonesTW->setItem(i, 0, itemP0); ui->timeZonesTW->setItem(i, 1, itemP1); itemT0->setSelected(true); itemT1->setSelected(true); itemP0->setSelected(false); itemP1->setSelected(false); } } else skipTop = false; } saveSettings(); } void LXQtWorldClockConfiguration::moveTimeZoneDown() { int m = ui->timeZonesTW->rowCount(); bool skipBottom = true; for (int i = m - 1; i >= 0; --i) { if (ui->timeZonesTW->item(i, 0)->isSelected()) { if (!skipBottom) { QTableWidgetItem *itemN0 = ui->timeZonesTW->takeItem(i + 1, 0); QTableWidgetItem *itemN1 = ui->timeZonesTW->takeItem(i + 1, 1); QTableWidgetItem *itemT0 = ui->timeZonesTW->takeItem(i, 0); QTableWidgetItem *itemT1 = ui->timeZonesTW->takeItem(i, 1); ui->timeZonesTW->setItem(i + 1, 0, itemT0); ui->timeZonesTW->setItem(i + 1, 1, itemT1); ui->timeZonesTW->setItem(i, 0, itemN0); ui->timeZonesTW->setItem(i, 1, itemN1); itemT0->setSelected(true); itemT1->setSelected(true); itemN0->setSelected(false); itemN1->setSelected(false); } } else skipBottom = false; } saveSettings(); } ================================================ FILE: plugin-worldclock/lxqtworldclockconfiguration.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PANEL_WORLDCLOCK_CONFIGURATION_H #define LXQT_PANEL_WORLDCLOCK_CONFIGURATION_H #include "../panel/lxqtpanelpluginconfigdialog.h" #include "../panel/pluginsettings.h" #include #include #include namespace Ui { class LXQtWorldClockConfiguration; } class LXQtWorldClockConfigurationTimeZones; class LXQtWorldClockConfigurationManualFormat; class QTableWidgetItem; class LXQtWorldClockConfiguration : public LXQtPanelPluginConfigDialog { Q_OBJECT public: explicit LXQtWorldClockConfiguration(PluginSettings *settings, QWidget *parent = nullptr); ~LXQtWorldClockConfiguration(); public slots: void saveSettings(); private: Ui::LXQtWorldClockConfiguration *ui; /* Read settings from conf file and put data into controls. */ void loadSettings(); private slots: void timeFormatChanged(int); void dateGroupToggled(bool); void dateFormatChanged(int); void advancedFormatToggled(bool); void customiseManualFormatClicked(); void manualFormatChanged(); void updateTimeZoneButtons(); void addTimeZone(); void removeTimeZone(); void setTimeZoneAsDefault(); void editTimeZoneCustomName(); void moveTimeZoneUp(); void moveTimeZoneDown(); private: QString mDefaultTimeZone; bool mLockCascadeSettingChanges; LXQtWorldClockConfigurationTimeZones *mConfigurationTimeZones; LXQtWorldClockConfigurationManualFormat *mConfigurationManualFormat; QString mManualFormat; void setDefault(int); void setBold(QTableWidgetItem*, bool); void setBold(int row, bool value); int findTimeZone(const QString& timeZone); }; #endif // LXQT_PANEL_WORLDCLOCK_CONFIGURATION_H ================================================ FILE: plugin-worldclock/lxqtworldclockconfiguration.ui ================================================ LXQtWorldClockConfiguration 0 0 600 687 World Clock Settings 0 Display &format &Time QFormLayout::AllNonFixedFieldsGrow F&ormat: timeFormatCB Short Long Custom false 0 0 0 0 Sho&w seconds Pad &hour with zero &Use 12-hour format T&ime zone true false &Position: timezonePositionCB For&mat: timezoneFormatCB Below Above Before After 0 Short Long Offset from UTC Abbreviation Location identifier Custom name &Date true false QFormLayout::AllNonFixedFieldsGrow Po&sition: datePositionCB Below Above Before After Fo&rmat: dateFormatCB Short Long ISO 8601 Custom false 0 0 0 0 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format true false Qt::Horizontal 40 20 &Customize ... Qt::Vertical 20 40 Time &zones QAbstractItemView::NoEditTriggers true QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows 2 true false IANA id Custom name &Add ... false &Remove false Set as &default false &Edit custom name ... false Move &up false Move do&wn Qt::Vertical 1 0 Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. true &General Auto&rotate when the panel is vertical true Show &week numbers in popup calendar true S&how tooltip Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset tabWidget timeFormatCB timeShowSecondsCB timePadHourCB timeAMPMCB timezoneGB timezonePositionCB timezoneFormatCB dateGB datePositionCB dateFormatCB dateShowYearCB dateShowDoWCB datePadDayCB dateLongNamesCB advancedManualGB customisePB timeZonesTW addPB removePB setAsDefaultPB editCustomNamePB moveUpPB moveDownPB autorotateCB showWeekNumberCB showTooltipCB buttons accepted() LXQtWorldClockConfiguration accept() buttons rejected() LXQtWorldClockConfiguration reject() maximumNetSpeedChanged(QString) on_typeCOB_currentIndexChanged(int) on_sourceCOB_currentIndexChanged(int) on_maximumHS_valueChanged(int) saveSettings() ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationmanualformat.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "lxqtworldclockconfigurationmanualformat.h" #include "ui_lxqtworldclockconfigurationmanualformat.h" LXQtWorldClockConfigurationManualFormat::LXQtWorldClockConfigurationManualFormat(QWidget *parent) : QDialog(parent), ui(new Ui::LXQtWorldClockConfigurationManualFormat) { setObjectName(QStringLiteral("WorldClockConfigurationManualFormatWindow")); setWindowModality(Qt::WindowModal); ui->setupUi(this); connect(ui->manualFormatPTE, &QPlainTextEdit::textChanged, this, &LXQtWorldClockConfigurationManualFormat::manualFormatChanged); } LXQtWorldClockConfigurationManualFormat::~LXQtWorldClockConfigurationManualFormat() { delete ui; } void LXQtWorldClockConfigurationManualFormat::setManualFormat(const QString& text) { ui->manualFormatPTE->setPlainText(text); } QString LXQtWorldClockConfigurationManualFormat::manualFormat() const { return ui->manualFormatPTE->toPlainText(); } ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationmanualformat.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PANEL_WORLDCLOCK_CONFIGURATION_MANUAL_FORMAT_H #define LXQT_PANEL_WORLDCLOCK_CONFIGURATION_MANUAL_FORMAT_H #include #include namespace Ui { class LXQtWorldClockConfigurationManualFormat; } class QTreeWidgetItem; class LXQtWorldClockConfigurationManualFormat : public QDialog { Q_OBJECT public: explicit LXQtWorldClockConfigurationManualFormat(QWidget *parent = nullptr); ~LXQtWorldClockConfigurationManualFormat(); void setManualFormat(const QString&); QString manualFormat() const; signals: void manualFormatChanged(); private: Ui::LXQtWorldClockConfigurationManualFormat *ui; }; #endif // LXQT_PANEL_WORLDCLOCK_CONFIGURATION_MANUAL_FORMAT_H ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationmanualformat.ui ================================================ LXQtWorldClockConfigurationManualFormat 0 0 800 500 World Clock Manual Format Configuration Qt::Vertical false 0 1 0 100 0 100 0 100 Qt::ScrollBarAlwaysOff true 0 0 0 0 <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> Qt::RichText true QDialogButtonBox::Cancel|QDialogButtonBox::Ok manualFormatPTE scrollArea buttons buttons accepted() LXQtWorldClockConfigurationManualFormat accept() buttons rejected() LXQtWorldClockConfigurationManualFormat reject() maximumNetSpeedChanged(QString) on_typeCOB_currentIndexChanged(int) on_sourceCOB_currentIndexChanged(int) on_maximumHS_valueChanged(int) saveSettings() ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationtimezones.cpp ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include "lxqtworldclockconfigurationtimezones.h" #include "ui_lxqtworldclockconfigurationtimezones.h" LXQtWorldClockConfigurationTimeZones::LXQtWorldClockConfigurationTimeZones(QWidget *parent) : QDialog(parent), ui(new Ui::LXQtWorldClockConfigurationTimeZones) { setObjectName(QStringLiteral("WorldClockConfigurationTimeZonesWindow")); setWindowModality(Qt::WindowModal); ui->setupUi(this); connect(ui->timeZonesTW, &QTreeWidget::itemSelectionChanged, this, &LXQtWorldClockConfigurationTimeZones::itemSelectionChanged); connect(ui->timeZonesTW, &QTreeWidget::itemDoubleClicked, this, &LXQtWorldClockConfigurationTimeZones::itemDoubleClicked); } LXQtWorldClockConfigurationTimeZones::~LXQtWorldClockConfigurationTimeZones() { delete ui; } QString LXQtWorldClockConfigurationTimeZones::timeZone() { return mTimeZone; } void LXQtWorldClockConfigurationTimeZones::itemSelectionChanged() { QList items = ui->timeZonesTW->selectedItems(); if (!items.empty()) mTimeZone = items[0]->data(0, Qt::UserRole).toString(); else mTimeZone.clear(); } void LXQtWorldClockConfigurationTimeZones::itemDoubleClicked(QTreeWidgetItem* /*item*/, int /*column*/) { if (!mTimeZone.isEmpty()) accept(); } QTreeWidgetItem* LXQtWorldClockConfigurationTimeZones::makeSureParentsExist(const QStringList &parts, QMap &parentItems) { if (parts.length() == 1) return nullptr; QStringList parentParts = parts.mid(0, parts.length() - 1); QString parentPath = parentParts.join(QLatin1String("/")); QMap::Iterator I = parentItems.find(parentPath); if (I != parentItems.end()) return I.value(); QTreeWidgetItem* newItem = new QTreeWidgetItem(QStringList() << parts[parts.length() - 2]); QTreeWidgetItem* parentItem = makeSureParentsExist(parentParts, parentItems); if (!parentItem) ui->timeZonesTW->addTopLevelItem(newItem); else parentItem->addChild(newItem); parentItems[parentPath] = newItem; return newItem; } int LXQtWorldClockConfigurationTimeZones::updateAndExec() { QDateTime now = QDateTime::currentDateTime(); ui->timeZonesTW->clear(); QMap parentItems; const auto timeZones = QTimeZone::availableTimeZoneIds(); for(const QByteArray &ba : timeZones) { QTimeZone timeZone(ba); QString ianaId(QString::fromUtf8(ba)); QStringList qStrings(QString::fromUtf8((ba)).split(QLatin1Char('/'))); if ((qStrings.size() == 1) && (qStrings[0].startsWith(QLatin1String("UTC")))) qStrings.prepend(tr("UTC")); if (qStrings.size() == 1) qStrings.prepend(tr("Other")); QTreeWidgetItem *tzItem = new QTreeWidgetItem(QStringList() << qStrings[qStrings.length() - 1] << timeZone.displayName(now) << timeZone.comment() << QLocale::territoryToString(timeZone.territory())); tzItem->setData(0, Qt::UserRole, ianaId); makeSureParentsExist(qStrings, parentItems)->addChild(tzItem); } QStringList qStrings = QStringList() << tr("Other") << QLatin1String("local"); QTreeWidgetItem *tzItem = new QTreeWidgetItem(QStringList() << qStrings[qStrings.length() - 1] << QString() << tr("Local timezone") << QString()); tzItem->setData(0, Qt::UserRole, qStrings[qStrings.length() - 1]); makeSureParentsExist(qStrings, parentItems)->addChild(tzItem); ui->timeZonesTW->sortByColumn(0, Qt::AscendingOrder); return exec(); } ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationtimezones.h ================================================ /* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * https://lxqt.org * * Copyright: 2012 Razor team * 2014 LXQt team * Authors: * Kuzma Shapran * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #ifndef LXQT_PANEL_WORLDCLOCK_CONFIGURATION_TIMEZONES_H #define LXQT_PANEL_WORLDCLOCK_CONFIGURATION_TIMEZONES_H #include #include namespace Ui { class LXQtWorldClockConfigurationTimeZones; } class QTreeWidgetItem; class LXQtWorldClockConfigurationTimeZones : public QDialog { Q_OBJECT public: explicit LXQtWorldClockConfigurationTimeZones(QWidget *parent = nullptr); ~LXQtWorldClockConfigurationTimeZones(); int updateAndExec(); QString timeZone(); public slots: void itemSelectionChanged(); void itemDoubleClicked(QTreeWidgetItem*, int); private: Ui::LXQtWorldClockConfigurationTimeZones *ui; QString mTimeZone; QTreeWidgetItem* makeSureParentsExist(const QStringList &parts, QMap &parentItems); }; #endif // LXQT_PANEL_WORLDCLOCK_CONFIGURATION_TIMEZONES_H ================================================ FILE: plugin-worldclock/lxqtworldclockconfigurationtimezones.ui ================================================ LXQtWorldClockConfigurationTimeZones 0 0 718 280 World Clock Time Zones QAbstractItemView::NoEditTriggers true true 4 150 Time zone Name Comment Country QDialogButtonBox::Cancel|QDialogButtonBox::Ok timeZonesTW buttons buttons accepted() LXQtWorldClockConfigurationTimeZones accept() buttons rejected() LXQtWorldClockConfigurationTimeZones reject() maximumNetSpeedChanged(QString) on_typeCOB_currentIndexChanged(int) on_sourceCOB_currentIndexChanged(int) on_maximumHS_valueChanged(int) saveSettings() ================================================ FILE: plugin-worldclock/resources/worldclock.desktop.in ================================================ [Desktop Entry] Type=Service ServiceTypes=LXQtPanel/Plugin Icon=clock #TRANSLATIONS_DIR=../translations ================================================ FILE: plugin-worldclock/translations/worldclock.desktop.yaml ================================================ Desktop Entry/Name: "World Clock" Desktop Entry/Comment: "Displays a clock with calendar and time zones" ================================================ FILE: plugin-worldclock/translations/worldclock.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Remove Set as &default &Edit custom name ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_ar.desktop.yaml ================================================ Desktop Entry/Name: "ساعة العالم" Desktop Entry/Comment: "ملحقة لساعة العالم" ================================================ FILE: plugin-worldclock/translations/worldclock_ar.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd، d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings إعدادات الساعة العالمية Display &format ت&نسيق العرض &Time الو&قت F&ormat: الت&نسيق: Short قصير Long طويل Custom مخصّص Sho&w seconds ا&عرض الثواني Pad &hour with zero أ&سبِق عدد الساعات بصفر T&ime zone المن&طقة الزمنية &Position: الم&كان: For&mat: الت&نسيق: Below بالأسفل Above بالأعلى Before قبل After بعد Offset from UTC الإزاحة من التوقيت العالمي المنسّق Abbreviation الاختصار IANA id معرّف IANA Custom name الاسم المخصّص &Use 12-hour format ا&ستخدم وضع ١٢ ساعة Location identifier معرّف المكان &Date ال&تاريخ Po&sition: الم&كان: Fo&rmat: الت&نسيق: ISO 8601 آيزو ٨٦٠١ Show &year اعرض ال&سنة Show day of wee&k اعرض يوم الأ&سبوع Pad d&ay with zero أ&سبِق اليوم بصفر &Long month and day of week names أسماء الأشهر وأيام الأسبوع &طويلة Ad&vanced manual format تنسيق يدوي مت&قدّم &Customize ... &خصّص… Time &zones المنا&طق الزمنية &Add ... أ&ضِف… &Remove أ&زِل Set as &default اضبط &كمبدئي &Edit custom name ... &حرّر الاسم المخصّص… Move &up انقل لأ&على Move do&wn انقل لأ&سفل Change displayed time zone with mouse wheel تغيير المنطقة الزمنية المعروضة باستخدام عجلة الماوس <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>ملاحظة:</b> انقر بزر الماوس الأوسط فوق الساعة لعرض الوقت والتاريخ لجميع المناطق الزمنية التي تم تكوينها. &General &عام Auto&rotate when the panel is vertical &دوّر آليا عندما تكون اللوحة رأسية Show &week numbers in popup calendar إظهار أرقام الأسبوع في التقويم المنبثق S&how tooltip إظهار تلميح الأداة '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd، d MMM yyyy'<br/>'TT'</font>' Input custom time zone name أدخِل اسم المنطقة الزمنية المخصّص LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration إعداد تنسيق يدوي للساعة العالمية <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1> بنية تنسيق التاريخ / الوقت المخصص </ h1> <p> نمط التاريخ هو سلسلة من الأحرف ، حيث يتم استبدال سلاسل محددة من الأحرف ببيانات التاريخ والوقت من التقويم عند التنسيق أو استخدامها لإنشاء بيانات لتقويم عند التحليل. </p> <p> يحتوي جدول رموز حقل التاريخ أدناه على الأحرف المستخدمة في الأنماط لإظهار التنسيقات المناسبة للإعداد المحلي المحدد ، مثل yyyy للسنة. يمكن استخدام الأحرف عدة مرات. على سبيل المثال ، إذا تم استخدام y للسنة ، فقد ينتج "yy" "99" ، بينما ينتج "yyyy" "1999". بالنسبة لمعظم الحقول الرقمية ، يحدد عدد الأحرف عرض الحقل. على سبيل المثال ، إذا كانت h هي الساعة ، فقد ينتج عن "h" "5" ، ولكن "hh" ينتج "05". بالنسبة لبعض الأحرف ، يحدد العدد ما إذا كان يجب استخدام صيغة مختصرة أو كاملة ، ولكن قد يكون لها خيارات أخرى ، كما هو موضح أدناه. </p> <p> علامتا اقتباس مفردتان تمثلان اقتباسًا منفردًا حرفيًا ، إما داخل علامتي اقتباس مفردة أو خارجها. لا يتم تفسير النص داخل علامات الاقتباس المفردة بأي شكل من الأشكال (باستثناء علامتي اقتباس متجاورتين). وبخلاف ذلك ، يتم حجز جميع أحرف ASCII من a إلى z ومن A إلى Z كأحرف بناء ، وتتطلب اقتباسًا إذا كانت تمثل أحرفًا حرفية. بالإضافة إلى ذلك ، قد تتغير بعض أحرف علامات الترقيم ASCII في المستقبل (على سبيل المثال ، ":" يتم تفسيرها على أنها فاصل زمني و "/" كفاصل تاريخ ، واستبدالها بأحرف حساسة للغة في العرض). <br /> < / ص> <table border = "1" width = "100%" cellpadding = "4" cellspacing = "0"> <tr> <th width = "20%"> Code </th> <th> المعنى </th> </tr> <tr> <td> d </td> <td> اليوم كرقم بدون صفر بادئ (من 1 إلى 31) </td> </tr> <tr> <td> dd </td> <td> اليوم كرقم بصفر بادئ (من 01 إلى 31) </td> </tr> <tr> <td> ddd </td> <td> اسم اليوم المترجم المختصر (مثل "Mon" إلى "Sun"). </td> </tr> <tr> <td> dddd </td> <td> اسم اليوم المترجم الطويل (مثل "من الاثنين" إلى "الأحد"). </ td> </tr> <tr> <td> M </td> <td> الشهر كرقم بدون صفر بادئ (1-12) </td> </tr> <tr> <td> MM </td> <td> الشهر كرقم بصفر بادئ (01-12) </td> </tr> <tr> <td> MMM </td> <td> اسم الشهر المترجم المختصر (مثل "يناير" إلى "ديسمبر"). </ td> </tr> <tr> <td> MMMM </td> <td> اسم الشهر المترجم الطويل (على سبيل المثال ، من "يناير" إلى "ديسمبر"). </td> </tr> <tr> <td> yy </td> <td> العام كرقم مكون من رقمين (00-99) </td> </tr> <tr> <td> yyyy </td> <td> السنة كرقم مكون من أربعة أرقام </ td> </tr> <tr> <td> h </td> <td> الساعة بدون صفر بادئ (من 0 إلى 23 أو من 1 إلى 12 في حالة عرض AM /pM) </td> </tr> <tr> <td> hh </td> <td> الساعة بصفر بادئ (من 00 إلى 23 أو من 01 إلى 12 في حالة عرض AM /pM) </td> </tr> <tr> <td> H </td> <td> الساعة بدون صفر بادئ (من 0 إلى 23 ، حتى مع عرض AM /pM) </td> </tr> <tr> <td> HH </td> <td> الساعة بصفر بادئ (من 00 إلى 23 ، حتى مع عرض AM /pM) </td> </tr> <tr> <td> m </td> <td> الدقيقة بدون صفر بادئ (0 إلى 59) </td> </tr> <tr> <td> mm </td> <td> الدقيقة بصفر بادئ (من 00 إلى 59) </td> </tr> <tr> <td> s </td> <td> الثانية بدون صفر بادئ (0 إلى 59) </td> </tr> <tr> <td> ss </td> <td> الثانية بصفر بادئ (من 00 إلى 59) </td> </tr> <tr> <td> AP <i> أو </i> A </td> <td> استخدم عرض AM /pM. سيتم استبدال <b> A / AP </b> إما بـ "AM" أو "PM". </td> </tr> <tr> <td> ap <i> أو </i> a </td> <td> استخدم عرض am /pm. سيتم استبدال <b> a / ap </b> إما بـ "am" أو "pm". </td> </tr> <tr> <td> t </td> <td> المنطقة الزمنية (مثل "CEST") </td> </tr> <tr> <td> T </td> <td> الإزاحة من التوقيت العالمي المنسق </ td> </tr> <tr> <td> TT </td> <td> معرّف IANA للمنطقة الزمنية </td> </tr> <tr> <td> TTT </td> <td> اختصار المنطقة الزمنية </td> </tr> <tr> <td> TTTT </td> <td> اسم العرض القصير للمنطقة الزمنية </td> </tr> <tr> <td> TTTTT </td> <td> اسم العرض الطويل للمنطقة الزمنية </ td> </tr> <tr> <td> TTTTTT </td> <td> الاسم المخصص للمنطقة الزمنية. يمكنك تغيير علامة التبويب "المناطق الزمنية" في نافذة التكوين </td> </tr> </table> <br /> <b> ملاحظات: </b> <ul> <li> أية أحرف في النمط ليست في نطاقات ['a' .. 'z'] و ['A' .. 'Z سيتم التعامل مع '] كنص مقتبس. على سبيل المثال ، ستظهر أحرف مثل ":" و "." و "" و "#" و "@" في نص الوقت الناتج حتى لم يتم تضمينها داخل علامات اقتباس مفردة. يستخدم الاقتباس المنفرد في "الهروب" من الأحرف. علامتا اقتباس منفردتان متتاليتان ، سواء داخل تسلسل مقتبس أو خارجه ، يمثلان اقتباسًا منفردًا "حقيقيًا". </ li> <li> أقل فترة تحديث هي ثانية واحدة. إذا تم تكوين z أو zzz ، فسيتم عرض الوقت مع جزء الملي ثانية ، ولكن لا يتم تحديثه على أساس مللي ثانية (تجنب حدوث نجاح كبير في الأداء). </ li> <ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones المناطق الزمنية للساعة العالمية Time zone المنطقة الزمنية Name الاسم Comment تعليق Country الدولة UTC التوقيت العالمي المنسّق Other أخرى Local timezone المنطقة الزمنية المحلية ================================================ FILE: plugin-worldclock/translations/worldclock_arn.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Remove Set as &default &Edit custom name ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_ast.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Remove Set as &default &Edit custom name ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_bg.desktop.yaml ================================================ Desktop Entry/Name: "Часовник" Desktop Entry/Comment: "Показва час, дати, часови зони и календар" ================================================ FILE: plugin-worldclock/translations/worldclock_bg.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Настройки на часовник Display &format &Формат на дисплея &Time &Време F&ormat: Фор&мат: Short Кратък Long Пълен Custom Модифициран Sho&w seconds Показване секунди Pad &hour with zero Представяне на часовете с водеща нула T&ime zone Часова зона &Position: &Позиция: For&mat: Фор&мат: Below Отдолу Above Отгоре Before Отпред After Отзад Offset from UTC Изместване от UTC Abbreviation Съкращение IANA id IANA id Custom name Име &Use 12-hour format &Използване на 12 часов формат Location identifier Идентификатор на локацията &Date &Дата Po&sition: По&зиция: Fo&rmat: Формат: ISO 8601 ISO 8601 Show &year Показване на &годината Show day of wee&k Показване деня от седмицата Pad d&ay with zero Представяне на дните с водеща нула &Long month and day of week names Пълни имена на месеца и деня от седмицата Ad&vanced manual format Разширен ръчен формат &Customize ... Модифициране... Time &zones Часова &зона &Add ... &Добавяне... &Remove &Премахване Set as &default По подразбиране &Edit custom name ... &Промени име... Move &up Преместване нагоре Move do&wn Преместване надолу Change displayed time zone with mouse wheel Промяна на показаната часова зона с колелцето на мишката <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Забележка:</b> Кликнете със среден бутон върху часовника, за да видите часа и датата за всички конфигурирани часови зони. &General &Общи Auto&rotate when the panel is vertical Автоматично завъртане при вертикален панел Show &week numbers in popup calendar Показване номер на седмицата в календара S&how tooltip Показване на подсказка '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Ново име на часовата зона LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Ръководство за ръчни настройки на датата <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1> Синтаксис на модифициране на формата, за дата и час</h1> <p>Шаблонът на датата е низ от символи, където конкретни низове от символи се заменят с данни, за дата и час от календара при форматиране или се използват за генериране на данни за календар при парсване.</p> <p>Таблицата със символи на полето, за дата по-долу съдържа символите, използвани в шаблони, за да покаже подходящите формати, за даден локал, като гггг за годината. Символите могат да се използват многократно. Например, ако y се използва за годината, „yy“ извежда „99“, докато „yyyy“ „1999“. За повечето цифрови полета броят на символите определя ширината на полето. Например, ако h е часът, „h“ изписва „5“, а „hh“ произвежда „05“. За някои знаци броят определя дали трябва да се използва съкратена или пълна форма, но може да има други възможности за избор, както е дадено по-долу.</p> <p>Две единични кавички представляват буквални единични кавички, вътре или извън кавичките. Текстът в единични кавички не се тълкува по никакъв начин (с изключение на две съседни единични кавички). В противен случай всички ASCII букви от a до z и A до Z са запазени като синтаксисни символи и изискват кавички, ако трябва да представляват буквени символи. В допълнение, някои пунктуационни знаци ASCII могат да станат променливи в бъдеще (напр. ":") се интерпретира като разделител на времето и '/' като разделител на дата и се заменят със съответните локални символи на дисплея).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Код</th><th>Значение</th></tr> <tr><td>d</td><td>денят като число без водеща нула</td></tr> <tr><td>dd</td><td>денят като число с водеща нула (от 01 до 31)</td></tr> <tr><td>ddd</td><td>съкратеното локализирано име на ден (напр. „Пон“ до „Нед“)</td></tr> <tr><td>dddd</td><td>дългото локализирано име на ден (напр. от „Понеделник“ до „Неделя)</td></tr> <tr><td>M</td>месецът като число без водеща нула (1-12)<td></td></tr> <tr><td>MM</td><td>месецът като число с водеща нула (01-12)</td></tr> <tr><td>MMM</td><td>съкратеното локализирано име на месеца (напр. „Яну“ до „Дек“).</td></tr> <tr><td>MMMM</td><td>дълго локализираното име на месеца (напр. „Януари“ до „Декември“)</td></tr> <tr><td>yy</td><td>годината като двуцифрено число (00-99)</td></tr> <tr><td>yyyy</td><td>годината като четирицифрено число</td></tr> <tr><td>h</td><td>часът без водеща нула (0 до 23 или 1 до 12, ако се показва AM / PM)</td></tr> <tr><td>hh</td><td>часът с водеща нула (от 00 до 23 или от 01 до 12, ако се показва AM / PM)</td></tr> <tr><td>H</td><td>часът без водеща нула (0 до 23, дори и с AM / PM дисплей)</td></tr> <tr><td>HH</td><td>часът с водеща нула (от 00 до 23, дори и с AM / PM дисплей)</td></tr> <tr><td>m</td><td>минутата без водеща нула (0 до 59)</td></tr> <tr><td>mm</td><td>минутата с водеща нула (00 до 59)</td></tr> <tr><td>s</td><td>секундите без водеща нула (0 до 59)</td></tr> <tr><td>ss</td><td>секундите с водеща нула (00 до 59)</td></tr> <tr><td>z</td><td>милисекундите без водещи нули (0 до 999)</td></tr> <tr><td>zzz</td><td>милисекундите с водещи нули (от 000 до 999)</td></tr> <tr><td>AP <i>или</i> A</td><td>използвай AM / PM дисплей.<b>A/AP</b> ще бъде заменен с „AM“ или „PM“.<</td></tr> <tr><td>ap <i>or</i> a</td><td>uизползвайте дисплей am / pm. <b>a/ap</b> ще бъде заменен с "am" или "pm".<</td></tr> <tr><td>t</td><td>часовата зона (например "CEST")</td></tr> <tr><td>T</td><td>изместването от UTC</td></tr> <tr><td>TT</td><td>идентификатор на IANA на часовата зона</td></tr> <tr><td>TTT</td><td>съкращението на часовата зона</td></tr> <tr><td>TTTT</td><td>краткото име на часовата зона</td></tr> <tr><td>TTTTT</td><td>дългото име на часовата зона</td></tr> <tr><td>TTTTTT</td><td>персонализираното име на часовата зона. Можете да го промените в раздела „Часови зони“ в прозореца за конфигуриране</td></tr></table> <br /><b>Забележки:</b> <ul><li>Всички символи в шаблона, които не са в обхвата на ['a' .. 'z'] и ['A' .. 'Z'], ще бъдат третирани като цитиран текст. Например, символите като „:“, „.“, „„, „#“ И „@“ ще се появят в получения текст на времето, дори и да не са затворени в единични кавички. Единичната кавичка се използва, буквите да не се интерпретират като синтаксни символи. Две единични кавички подред, независимо дали в цитираната последователност или извън нея, представляват „истинска“ единична кавичка. </li> <li> Минималният интервал за актуализация е 1 секунда. Ако z или zzz са конфигурирани, времето се показва с фракцията от милисекунди, но не се актуализира на база милисекунди (с цел избягване на голямо натоварване).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Настройки на часова зона Time zone &Часова зона Name Име Comment Коментар Country Държава UTC UTC Other Други Local timezone Локална часова зона ================================================ FILE: plugin-worldclock/translations/worldclock_ca.desktop.yaml ================================================ Desktop Entry/Name: "Rellotge mundial" Desktop Entry/Comment: "Connector del rellotge mundial" ================================================ FILE: plugin-worldclock/translations/worldclock_ca.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Ajusts dels rellotges del món Display &format &Format de visualització &Time &Hora F&ormat: F&ormat: Short Breu Long Llarg Custom Personalitzat Sho&w seconds &Mostra els segons Pad &hour with zero Reomplir l'&hora amb zero T&ime zone Zona horàr&ia &Position: &Posició: For&mat: For&mat: Below Sota Above Sobre Before Abans After Després Offset from UTC Desplaçament des d'UTC Abbreviation Abreviatura IANA id Id. IANA Custom name Nom personalitzat &Use 12-hour format &Utilitza el format de 12 hores Location identifier Identificador de la ubicació &Date &Data Po&sition: Po&sició: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Mostra l'&any Show day of wee&k Mostra el dia de la setma&na Pad d&ay with zero Reomplir el di&a amb zero &Long month and day of week names Nom &llarg del mes i del dia de la setmana Ad&vanced manual format Format manual a&vançat &Customize ... Per&sonalitza... Time &zones &Zones horàries &Add ... &Afegeix... &Remove Sup&rimeix Set as &default Estableix-ho com a pre&determinat &Edit custom name ... &Edita el nom personalitzat... Move &up Mou am&unt Move do&wn Mou a&vall Change displayed time zone with mouse wheel Canvia la zona horària que es mostra amb la roda del ratolí <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Nota:</b> Feu clic amb el botó del mig al rellotge per veure l'hora i la data de totes les zones horàries configurades. &General &General Auto&rotate when the panel is vertical Gi&ra automàticament quan el tauler sigui vertical Show &week numbers in popup calendar Mostra els &números de la setmana al calendari emergent S&how tooltip M&ostra consells emergents '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Entrada personalitzada de la zona horària LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuració del format manual del rellotge mundial <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Sintaxi personalitzada del format de data/hora</h1> <p>Un format de data és una cadena de caràcters, on les cadenes específiques de caràcters se substitueixen per dades de data i hora en formatar un calendari o utilitzat per a generar dades en analitzar un calendari.</p> <p>La Taula de símbols de camp de data de sota conté els caràcters utilitzats en els patrons per a mostrar els formats apropiats per a una localització donada, com ara yyyy per a l'any. Els caràcters es poden utilitzar diverses vegades. Per exemple, si s'utilitza y per a l'any, 'yy' pot generar '99', mentre que 'yyyy' genera '1999'. Per a la majoria de camps numèrics, el nombre de caràcters especifica l'amplada del camp. Per exemple, si h és l'hora, 'h' pot generar '5', però 'hh' genera '05'. Per a alguns caràcters, el recompte especifica si s'ha d'utilitzar una forma abreujada o completa, però pot tenir altres opcions, com es mostra a continuació.</p> <p>Dues cometes simples representen una cometa simple literal, ja sigui dins o fora de cometes simples. El text entre cometes simples no s'interpreta de cap manera (excepte per a dues cometes simples adjacents). En cas contrari, totes les lletres ASCII d'a a z i A a Z estan reservades com a caràcters de sintaxi, i requereixen citar si han de representar caràcters literals. A més, certs caràcters de puntuació ASCII poden esdevenir variables en el futur (per exemple, ":" s'interpreta com a separador de temps i "/" com a separador de data, i se substitueix pels respectius caràcters sensibles a la configuració de la localització i el seu idioma corresponent).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Codi</th><th>Significat</th></tr> <tr><td>d</td><td>el dia com a número sense un zero inicial (1 a 31)</td></tr> <tr><td>dd</td><td>el dia com a número amb un zero inicial (01 a 31)</td></tr> <tr><td>ddd</td><td>el nom abreujat del dia localitzat (p. ex. 'dl.' a 'dg.').</td></tr> <tr><td>dddd</td><td>el nom llarg del dia localitzat (p. ex. 'dilluns' a 'diumenge').</td></tr> <tr><td>M</td><td>el mes com a número sense un zero inicial (1-12)</td></tr> <tr><td>MM</td><td>el mes com a número amb un zero inicial (01-12)</td></tr> <tr><td>MMM</td><td>el nom abreujat del mes localitzat (p. ex. 'gen' a 'des').</td></tr> <tr><td>MMMM</td><td>el nom llarg del mes localitzat (p. ex. 'gener' a 'desembre').</td></tr> <tr><td>yy</td><td>l'any com a número de dos dígits (00-99)</td></tr> <tr><td>yyyy</td><td>l'any com a número de quatre dígits</td></tr> <tr><td>h</td><td>l'hora sense un zero inicial (0 a 23 or 1 a 12 si es mostra AM/PM)</td></tr> <tr><td>hh</td><td>l'hora amb un zero inicial (00 a 23 or 01 a 12 si es mostra AM/PM)</td></tr> <tr><td>H</td><td>l'hora sense un zero inicial (0 a 23, fins i tot mostrant AM/PM)</td></tr> <tr><td>HH</td><td>l'hora amb un zero inicial (00 to 23, fins i tot mostrant AM/PM)</td></tr> <tr><td>m</td><td>el minut sense un zero inicial (0 a 59)</td></tr> <tr><td>mm</td><td>el minut amb un zero inicial (00 a 59)</td></tr> <tr><td>s</td><td>el segon sense un zero inicial (0 a 59)</td></tr> <tr><td>ss</td><td>el segon amb un zero inicial (00 a 59)</td></tr> <tr><td>AP <i>o</i> A</td><td>utilitza la visualització AM/PM. <b>A/AP</b> serà substituït per "AM" o "PM".</td></tr> <tr><td>ap <i>o</i> a</td><td>utilitza la visualització am/pm. <b>a/ap</b> serà substituït per "am" o "pm".</td></tr> <tr><td>t</td><td>la zona horària (p. ex. "CEST")</td></tr> <tr><td>T</td><td>el desplaçament des de la UTC</td></tr> <tr><td>TT</td><td>l'ID de la zona horària IANA</td></tr> <tr><td>TTT</td><td>l'abreviatura de la zona horària</td></tr> <tr><td>TTTT</td><td>el nom de la visualització curta de la zona horària</td></tr> <tr><td>TTTTT</td><td>el nom de la visualització llarga de la zona horària</td></tr> <tr><td>TTTTTT</td><td>el nom personalitzat de la zona horària. El podeu canviar a la pestanya «Zones horàries» de la finestra de configuració</td></tr></table> <br /><b>Notes:</b> <ul><li>Qualsevol caràcter del patró que no estigui en els intervals de ['a'..'z'] i ['A'..'Z'] es tractarà com a text entre cometes. Per exemple, caràcters com ':', '.', ' ', '#' i '@' apareixeran al text de data/hora resultant, encara que no estiguin entre cometes simples. La cometa simple s'utilitza per 'escapar' de les lletres. Dues cometes simples seguides, ja siguin dins o fora d'una seqüència entre cometes, representen una cometa simple 'real'.</li><li>L'interval mínim d'actualització és d'1 segon. Si es configura z o zzz, el temps es mostra amb la fracció de mil·lisegons, però no s'actualitza en mil·lisegons (evitant un gran impacte de rendiment).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Zones horàries dels rellotges del món Time zone Zona horària Name Nom Comment Comentari Country País UTC UTC Other Altres Local timezone Zona horària local ================================================ FILE: plugin-worldclock/translations/worldclock_cs.desktop.yaml ================================================ Desktop Entry/Name: "Čas ve světě" Desktop Entry/Comment: "Zobrazuje hodiny v různých časových pásmech a kalendář" ================================================ FILE: plugin-worldclock/translations/worldclock_cs.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Nastavení hodin zobrazujících místní čas z různých časových pásem Display &format &Formát zobrazení &Time Č&as F&ormat: F&ormát: Short Krátký Long Dlouhý Custom Uživatelsky určený Sho&w seconds &Ukazovat sekundy Pad &hour with zero Zarovnávat zobrazení &hodin nulou na začátku T&ime zone Ča&sové pásmo &Position: &Poloha: For&mat: For&mát: Below Pod Above Nad Before Před After Za Offset from UTC Posun vůči světovému času (UTC) Abbreviation Zkratka IANA id IANA identif. Custom name Uživatelem stanovený název &Use 12-hour format Po&užívat dvanáctihodinový formát Location identifier Označení místa &Date &Datum Po&sition: &Poloha: Fo&rmat: Fo&rmát: ISO 8601 dle normy ISO 8601 Show &year Ukazovat &rok Show day of wee&k U&kazovat den v týdnu Pad d&ay with zero Z&arovnávat zobrazení dne v měsíci nulou na začátku &Long month and day of week names D&louhé názvy měsíců a dnů v týdnu Ad&vanced manual format Pok&ročilý ruční formát &Customize ... &Přizpůsobit… Time &zones Časová &pásma &Add ... Přid&at… &Remove Odst&ranit Set as &default Nastavit jako &výchozí &Edit custom name ... Upravit uživat&elsky určený název… Move &up Pos&unout nahoru Move do&wn Posunout &dolů Change displayed time zone with mouse wheel Měnit zobrazované časové pásmo pomocí kolečka myši <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Poznámka:</b> Klepnutím doprostřed hodin zobrazíte čas a datum pro všechna nastavená časová pásma. &General &Obecné Auto&rotate when the panel is vertical Při svisle o&rientovaném panelu natočit tak, aby bylo vodorovně Show &week numbers in popup calendar Ve &vyskakovacím kalendáři zobrazovat čísla týdnů S&how tooltip &Zobrazovat popisky ikon '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM rrrr'<br/>'TT'</font>' Input custom time zone name Zadat uživatelsky určený název časového pásma LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Ruční nastavení formátu světových hodin <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Forma zápisu pro uživatelsky určenou podobu zobrazení data a času</h1> <p>Vzor data je řetězec znaků, ve kterém jsou pak při formátování konkrétní řetězce znaků nahrazovány údaji data a času z kalendáře nebo naopak při zpracovávání slouží pro vytváření datumů pro kalendář.</p> <p>Níže uvedená tabulka symbolů pro kolonku s datem obsahuje znaky sloužící ve vzorech k zobrazení příslušných formátů pro dané národní prostředí, například rrrr pro daný rok. Znaky lze použít vícekrát. Pokud je například pro rok použito y, „yy“ může vytvořit „99“, zatímco „yyyy“ vytvoří „1999“. U většiny číselných kolonek určuje počet znaků šířku kolonky. Například pokud h je hodina, „h“ může vytvořit „5“, ale „hh“ vytvoří „05“. U některých znaků počet určuje, zda má být použita zkrácená nebo plná podoba, ale může mít i jiné možnosti, jak je uvedeno níže.</p> <p>Dvě jednoduché uvozovky představují doslovnou jednoduchou uvozovku, buď uvnitř, nebo vně jednoduchých uvozovek. Text v jednoduchých uvozovkách není žádným způsobem interpretován (s výjimkou dvou sousedních jednoduchých uvozovek). Jinak jsou všechna písmena ASCII od a do z A do Z vyhrazena jako syntaxe znaků a vyžadují citaci, pokud mají reprezentovat doslovné znaky. Kromě toho se některé interpunkční znaky ASCII mohou v budoucnu stát proměnnými (např. „:“ Bude interpretováno jako oddělovač času a „/“ jako oddělovač data a budou nahrazeny příslušnými znaky citlivými na národní prostředí v zobrazení).<br />< / p> <table border ="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width = "20%">Kód</th><th>Význam</th></tr> <tr><td>d</td><td>den jako číslo bez úvodní nuly (1 až 31)</td></tr> <tr><td>dd</td><td>den jako číslo s úvodní nulou (01 až 31)</td></tr> <tr><td>ddd</td><td>zkrácený lokalizovaný název dne (např. „Po“ až „Ne“).</td></tr> <tr><td>dddd</td><td>dlouhý lokalizovaný název dne (např. od pondělí do neděle).</td></tr> <tr><td>M</td><td>měsíc jako číslo bez úvodní nuly (1-12)</td></tr> <tr><td>MM</td><td>měsíc jako číslo s počáteční nulou (01-12)</td></tr> <tr><td>MMM</td><td>zkrácený lokalizovaný název měsíce (např. „led“ až „pro“).</td></tr> <tr><td>MMMM</td><td>dlouhý lokalizovaný název měsíce (např. „leden“ až „prosinec“).</td></tr> <tr><td>yy</td><td>rok jako dvouciferné číslo (00-99)</td></tr> <tr><td>yyyy</td><td>rok jako čtyřciferné číslo</td></tr> <tr><td>h</td><td>hodina bez úvodní nuly (0 až 23 nebo 1 až 12, i při zobrazení DOP / ODP)</td></tr> <tr><td>hh</td><td>hodina s úvodní nulou (00 až 23 nebo 01 až 12, i při zobrazení DOP / ODP)</td></tr> <tr><td>H</td><td>hodina bez úvodní nuly (0 až 23, i při zobrazení DOP / ODP)</td></tr> <tr><td>HH</td><td>hodina s úvodní nulou (00 až 23, i při zobrazení DOP / ODP)</td></tr> <tr><td>m</td><td>minuta bez úvodní nuly (0 až 59)</td></tr> <tr><td>mm</td><td>minuta s úvodní nulou (00 až 59)</td></tr> <tr><td>s</td><td>sekunda bez úvodní nuly (0 až 59)</td></tr> <tr><td>ss</td><td>sekunda s úvodní nulou (00 až 59)</td></tr> <tr><td>AP <i>nebo</i> A</td><td>použít zobrazení DOP/ODP. <b>A/AP</b> bude nahrazeno buď „DOP“, nebo „ODP“. </td></tr> <tr><td>ap <i>nebo</i> a</td><td>používají zobrazení dop/odp. <b>a/ap</b> bude nahrazeno buď „dop“, nebo „odp“. </td></tr> <tr><td>t</td><td>časové pásmo (např. „CEST“)</td></tr> <tr><td>T</td><td>posun vůči UTC</td></tr> <tr><td>TT</td><td>identifikátor časového pásma dle IANA</td></tr> <tr><td>TTT</td><td>zkratka časového pásma</td></tr> <tr><td>TTTT</td><td>zkrácený název časového pásma</td></tr> <tr><td>TTTTT</td><td>celý název časového pásma</td></tr> <tr><td>TTTTTT</td><td>Uživatelsky určený název časového pásma. Ten je možné změnit na kartě „Časová pásma“ v okně s nastaveními</td></tr></table> <br /><b>Poznámky:</b> <ul><li>Jakékoli znaky ve vzoru, které nejsou z rozsahu ['a'..'z'] a ['A'..'Z'] (všechna malá-VELKÁ písmena) budou vypsány přímo (tj. citovaný text). Například znaky jako „:“, „.“, „ “ (mezera), „#“ a „@“ se objeví ve výsledném textu času, i když nejsou obklopeny jednoduchými uvozovkami. Jednoduché uvozovky se používají ke zbavení písmen významu (escape). Dvě jednoduché uvozovky za sebou, ať už uvnitř nebo vně citované sekvence, představují „skutečnou“ jednoduchou uvozovku.</li><li>Nejnižší možný interval aktualizace zobrazovaného času je 1 sekunda. Pokud je nastaveno z nebo zzz, čas je sice zobrazen s milisekundovým zlomkem, ale ani tak není aktualizován v rámci milisekund (způsobovalo by jinak velký zásah do výkonu počítače).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Časová pásma ze kterých ukazovat místní čas Time zone Časové pásmo Name Název Comment Poznámka Country Země UTC Světový čas (UTC) Other Ostatní Local timezone Místní časové pásmo ================================================ FILE: plugin-worldclock/translations/worldclock_cy.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Remove Set as &default &Edit custom name ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_da.desktop.yaml ================================================ Desktop Entry/Name: "Verdensur" Desktop Entry/Comment: "Viser et ur med kalender og tidszoner" ================================================ FILE: plugin-worldclock/translations/worldclock_da.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'dddd, d. MMMM yyyy'</font>' LXQtWorldClockConfiguration World Clock Settings Indstillinger for verdensur Display &format Visnings&format &Time &Klokkeslæt F&ormat: &Format: Short Kort Long Lang Custom Brugerdefineret Sho&w seconds &Vis sekunder Pad &hour with zero Pad &time med nul T&ime zone &Tidszone &Position: &Placering: For&mat: &Format: Below Under Above Over Before Før After Efter Offset from UTC Forskydning fra UTC Abbreviation Forkortelse IANA id IANA-id Custom name Brugerdefineret navn &Use 12-hour format &Brug 12-timer-format Location identifier Placeringsidentifikator &Date &Dato Po&sition: &Placering: Fo&rmat: &Format: ISO 8601 ISO 8601 Show &year Vis &år Show day of wee&k Vis dagen på &ugen Pad d&ay with zero Pad &dag med nul &Long month and day of week names &Lang måned og navne for dagen af ugen Ad&vanced manual format &Avanceret manuelt format &Customize ... &Tilpas ... Time &zones &Tidszoner &Add ... &Tilføj ... &Remove &Fjern Set as &default Sæt som &standard &Edit custom name ... &Rediger brugerdefineret navn ... Move &up Flyt &op Move do&wn Flyt &ned Change displayed time zone with mouse wheel Skift vist tidszone med musehjulet <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Bemærk:</b> Midtklik på uret for at se klokkeslæt og dato for alle indstillede tidszoner. &General &Generelt Auto&rotate when the panel is vertical &Roter automatisk når panelet er lodret Show &week numbers in popup calendar Vis &ugenumre i pop op-kalender S&how tooltip Vis &værktøjstip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'dddd, d. MMMM yyyy'</font>' Input custom time zone name Input brugerdefineret tidszone og navn LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Indstilling af manuelt format for verdensur <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Syntaks for brugerdefineret dato/klokkeslæt</h1> <p>Et datomønster er en streng af tegn, hvor specifikke strenge af tegn erstattes med dato- og tidsdata fra en kalender ved formatering eller bruges til at generere data til en kalender ved parsing.</p> <p>Datofeltsymboltabellen nedenfor indeholder de tegn, der bruges i mønstre til at vise de passende formater for en given lokalitet, såsom åååå for året. Tegn kan bruges flere gange. Hvis f.eks. y bruges for året, kan 'åå' give '99', mens 'åååå' giver '1999'. For de fleste numeriske felter angiver antallet af tegn feltbredden. For eksempel, hvis h er timen, kan 'h' give '5', men 'hh' producerer '05'. For nogle tegn angiver optællingen, om en forkortet eller fuld form skal bruges, men kan have andre valg, som angivet nedenfor.</p> <p>To enkelte citater repræsenterer et bogstaveligt enkelt citat, enten inden for eller uden for enkelte citater. Tekst inden for enkelte anførselstegn fortolkes ikke på nogen måde (bortset fra to tilstødende enkelte anførselstegn). Ellers er alle ASCII-bogstaver fra a til z og A til Z reserveret som syntakstegn og kræver citering, hvis de skal repræsentere bogstavelige tegn. Derudover kan visse ASCII-tegnsætningstegn blive variable i fremtiden (f.eks. bliver ":" fortolket som tidsseparatoren og '/' som en datoseparator og erstattet af respektive lokalitetsfølsomme tegn på displayet).<br />< /p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kode</th><th>Betydning</th></tr> <tr><td>d</td><td>dagen som tal uden et indledende nul (1 til 31)</td></tr> <tr><td>dd</td><td>dagen som tal med et indledende nul (01 til 31)</td></tr> <tr><td>ddd</td><td>det forkortede lokaliserede dagnavn (f.eks. 'man' til 'søn').</td></tr> <tr><td>dddd</td><td>det lange lokaliserede dagnavn (f.eks. "mandag" til "søndag").</td></tr> <tr><td>M</td><td>måneden som tal uden et indledende nul (1-12)</td></tr> <tr><td>MM</td><td>måneden som tal med et indledende nul (01-12)</td></tr> <tr><td>MMM</td><td>det forkortede lokaliserede månedsnavn (f.eks. 'Jan' til 'Dec').</td></tr> <tr><td>MMMM</td><td>det lange lokaliserede månedsnavn (f.eks. "januar" til "december").</td></tr> <tr><td>åå</td><td>året som tocifret tal (00-99)</td></tr> <tr><td>åååå</td><td>året som firecifret tal</td></tr> <tr><td>h</td><td>timen uden indledende nul (0 til 23 eller 1 til 12 hvis AM/PM vises)</td></tr> <tr><td>hh</td><td>timen med et foranstillet nul (00 til 23 eller 01 til 12, hvis AM/PM vises)</td></tr> <tr><td>H</td><td>timen uden et indledende nul (0 til 23, selv med AM/PM-visning)</td></tr> <tr><td>HH</td><td>timen med et indledende nul (00 til 23, selv med AM/PM-visning)</td></tr> <tr><td>m</td><td>minuttet uden et indledende nul (0 til 59)</td></tr> <tr><td>mm</td><td>minuttet med et indledende nul (00 til 59)</td></tr> <tr><td>s</td><td>den anden uden et indledende nul (0 til 59)</td></tr> <tr><td>ss</td><td>den anden med et indledende nul (00 til 59)</td></tr> <tr><td>AP <i>eller</i> A</td><td>brug AM/PM-skærm. <b>A/AP</b> vil blive erstattet af enten "AM" eller "PM".</td></tr> <tr><td>ap <i>eller</i> a</td><td>brug am/pm-skærm. <b>a/ap</b> vil blive erstattet af enten "am" eller "pm".</td></tr> <tr><td>t</td><td>tidszonen (f.eks. "CEST")</td></tr> <tr><td>T</td><td>forskydningen fra UTC</td></tr> <tr><td>TT</td><td>tidszonen IANA-id</td></tr> <tr><td>TTT</td><td>tidszoneforkortelsen</td></tr> <tr><td>TTTT</td><td>tidszonens korte visningsnavn</td></tr> <tr><td>TTTTT</td><td>tidszonens lange visningsnavn</td></tr> <tr><td>TTTTTT</td><td>tidszonens brugerdefinerede navn. Du kan ændre det under fanen 'Tidszoner' i konfigurationsvinduet</td></tr></table> <br /><b>Bemærkninger:</b> <ul><li>Alle tegn i mønsteret, der ikke er i intervallet ['a'..'z'] og ['A'..'Z' '] vil blive behandlet som citeret tekst. For eksempel vil tegn som ':', '.', ' ', '#' og '@' blive vist i den resulterende tidstekst, selv om de ikke er omgivet af enkelte anførselstegn. Det enkelte citat bruges til at 'undslippe' bogstaver. To enkelte anførselstegn i en række, hvad enten det er inden for eller uden for en citationssekvens, repræsenterer et 'rigtigt' enkelt anførselstegn.</li><li>Minimale opdateringsinterval er 1 sekund. Hvis z eller zzz er konfigureret, vises tiden med millisekundersbrøken, men ikke opdateret på millisekundbasis (for at undgå store ydelsestab).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Tidszoner for verdensur Time zone Tidszone Name Navn Comment Kommentar Country Land UTC UTC Other Andet Local timezone Lokal tidszone ================================================ FILE: plugin-worldclock/translations/worldclock_de.desktop.yaml ================================================ Desktop Entry/Name: "Weltzeituhr" Desktop Entry/Comment: "Uhr mit Kalender und Zeitzonen" ================================================ FILE: plugin-worldclock/translations/worldclock_de.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ttt, t MMM jjjj'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Einstellungen der Weltzeituhr Display &format Anzeige&format &Time &Zeit F&ormat: &Format: Short Kurz Long Lang Custom Benutzerdefiniert Sho&w seconds &Zeige Sekunden Pad &hour with zero &Stundenanzeige mit führender Null &Use 12-hour format 12-St&unden-Format verwenden T&ime zone Ze&itzone &Position: &Position: For&mat: For&mat: Below Unter Above Über Before Vor After Nach Offset from UTC Abweichung zur UTC Abbreviation Abkürzung Location identifier Standortidentifikator Custom name Benutzerdefinierter Name &Date &Datum Po&sition: Po&sition: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Zeige &Jahr Show day of wee&k Wochentag an&zeigen Pad d&ay with zero T&ag mit führender Null &Long month and day of week names &Lange Monats- und Wochentagsbezeichnungen Ad&vanced manual format &Erweitertes manuelles Format &Customize ... &Anpassen ... Time &zones &Zeitzonen IANA id IANA-ID &Add ... &Hinzufügen ... &Remove Entfe&rnen Set as &default Als Stan&dardeinstellung festlegen &Edit custom name ... Benutz&erdefinierten Namen bearbeiten ... Move &up Nach &oben Move do&wn Nach &unten Change displayed time zone with mouse wheel Angezeigte Zeitzone mit dem Mausrad ändern <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Hinweis:</b> Mit der mittleren Maustaste auf die Uhr klicken um Uhrzeit und Datum für alle konfigurierten Zeitzonen anzuzeigen. &General All&gemein Auto&rotate when the panel is vertical &Bei vertikaler Leiste automatisch drehen Show &week numbers in popup calendar Zeige Kalender&Wochen im Aufklappkalender S&how tooltip &Zeige Kurzinfo '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Eingabe des Namens der benutzerdefinierten Zeitzone LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Manuelle Formatkonfiguration der Weltzeituhr <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Benutzerformat für Datum und Zeit</h1> <p>Datumsformat ist eine Zeichenkette, bei der spezielle Zeichen durch Datums- und Zeitwerte ersetzt werden aus der Anzeigevorbereitung und -formatierung.</p> <p>Die folgende Zeichentabelle beinhaltet gültige Formatzeichen. Zum Beispiel: yy bedeutet 99 und yyyy 1999. Die Anzahl der Zeichen zeigt oft Feldlänge, bspw. h bringt 5 und hh 05.</p> <p>Zwei einfache Anführungszeichen bedeuten ein einfaches Anführungszeichen, sowohl in als auch außerhalb einfacher Anführungszeichen. Text in einfachen Anführungszeichen wird nicht gedeutet (außer in benachbarten einfachen Anführungszeichen). Ansonsten sind alle ASCII-Zeichen von a bis z und A bis Z sind reserviert als Formatzeichen, und benötigen Anführungszeichen damit sie als einfache Zeichen gedeutet. Zusätzlich, werden ASCII-Interpunktion-Zeichen in der könnten in Zukunft Formatzeichen werden (z.B. ":" als Zeittrennzeichen und '/' als Datumstrennzeichen, und ersetzt mit lokalen Zeichen bei der Anzeige).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Bedeutung</th></tr> <tr><td>d</td><td>Tag ohne führende Null (1 to 31)</td></tr> <tr><td>dd</td><td>Tag mit führender Null (01 to 31)</td></tr> <tr><td>ddd</td><td>Abkürzung für Wochentag (e.g. 'Mo' bis 'So').</td></tr> <tr><td>dddd</td><td>Wochentag (e.g. 'Montag' bis 'Sonntag').</td></tr> <tr><td>M</td><td>Monat ohne führende Null (1-12)</td></tr> <tr><td>MM</td><td>Monat mit führender Null (01-12)</td></tr> <tr><td>MMM</td><td>Monatsabkürzung (e.g. 'Jan' bis 'Dez').</td></tr> <tr><td>MMMM</td><td>Monat (e.g. 'Januar' bis 'Dezember').</td></tr> <tr><td>yy</td><td>Jahreszahl zweistellig (00-99)</td></tr> <tr><td>yyyy</td><td>Jahreszahl vierstellig</td></tr> <tr><td>h</td><td>Stunde ohne führende Null (0 bis 23 oder 1 bis 12 bei AM/PM anzeige)</td></tr> <tr><td>hh</td><td>Stunde mit führender Null (00 bis 23 oder 01 bis 12 bei AM/PM anzeige)</td></tr> <tr><td>H</td><td>Stunde ohne führende Null (0 bis 23, auch bei AM/PM anzeige)</td></tr> <tr><td>HH</td><td>Stunde mit führender Null (00 bis 23, auch bei AM/PM anzeige)</td></tr> <tr><td>m</td><td>Minute ohne führende Null (0 bis 59)</td></tr> <tr><td>mm</td><td>Minute mit führender Null (00 bis 59)</td></tr> <tr><td>s</td><td>Sekunde ohne führende Null (0 bis 59)</td></tr> <tr><td>ss</td><td>Sekunde mit führender Null (00 bis 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>bei AM/PM anzeige. <b>A/AP</b> wird ersetzt mit "AM" oder "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>bei am/pm anzeige. <b>a/ap</b> wird ersetzt mit "am" oder "pm".</td></tr> <tr><td>t</td><td>Zeitzone (z.B. "CEST")</td></tr> <tr><td>T</td><td>Zeitoffset zum UTC</td></tr> <tr><td>TT</td><td>Zeitzone von IANA</td></tr> <tr><td>TTT</td><td> Abkürzung Zeitzone </td></tr> <tr><td>TTTT</td><td>Kurzbezeichnung Zeitzone </td></tr> <tr><td>TTTTT</td><td>Vollname Zeitzone</td></tr> <tr><td>TTTTTT</td><td>Benutzername Zeitzone. Man kann es im Reiter Zeitzonen im Konfigurationsfenster einstellen</td></tr></table> <br /><b>Notiz:</b> <ul><li>Jedes Zeichen außer ['a'..'z','A'..'Z'] werden als in Anführungszeichen gedeutet. Zum Beispiel, Zeichen wie ':', '.', ' ', '#' und '@' werden angezeigt ohne Anführungszeichen. Das einfache Anführungszeichen verhindert Umdeutung der Buchstaben ('escape' letters).</li><li>Kürzestes Aktualisierungsintervall ist 1 Sekunde. Wenn z oder zzz eingestellt ist, wird die Zeit in Millisekunden angezeigt, aber nicht in Millisekunden hochgezählt (vermeidet Leistungskatastrophe).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Zeitzonen der Weltzeituhr Time zone Zeitzone Name Name Comment Kommentar Country Land UTC UTC Other Sonstiges Local timezone Lokale Zeitzone ================================================ FILE: plugin-worldclock/translations/worldclock_el.desktop.yaml ================================================ Desktop Entry/Name: "Παγκόσμιο ρολόι" Desktop Entry/Comment: "Πρόσθετο παγκόσμιου ρολογιού" ================================================ FILE: plugin-worldclock/translations/worldclock_el.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Ρυθμίσεις παγκόσμιου ρολογιού Display &format &Μορφή εμφάνισης &Time &Ώρα F&ormat: Μ&ορφή: Short Σύντομη Long Μακριά Custom Προσαρμοσμένη Sho&w seconds Εμφάνι&ση των δευτερολέπτων Pad &hour with zero &Συμπλήρωση της ώρας με μηδενικά T&ime zone &Ζώνη ώρας &Position: &Θέση: For&mat: &Μορφή: Below Κάτω Above Πάνω Before Πριν After Μετά Offset from UTC Διαφορά από την UTC Abbreviation Συντομογραφία IANA id Αναγνωριστικό IANA Custom name Προσαρμοσμένο όνομα &Use 12-hour format &Χρήση της 12άωρης μορφής Location identifier Αναγνωριστικό τοποθεσίας &Date &Ημερομηνία Po&sition: &Θέση: Fo&rmat: &Μορφή: ISO 8601 ISO 8601 Show &year Εμφάνιση του έ&τους Show day of wee&k Εμφάνιση της ημέρας της ε&βδομάδας Pad d&ay with zero Συμπλή&ρωση της ημέρας με μηδενικά &Long month and day of week names &Μακριά ονόματα του μήνα και της ημέρας της εβδομάδας Ad&vanced manual format Προη&γμένη χειροκίνητη μορφή &Customize ... &Προσαρμογή... Time &zones &Ζώνες ώρας &Add ... &Προσθήκη... &Remove Α&φαίρεση Set as &default &Ορισμός ως προκαθορισμένο &Edit custom name ... &Επεξεργασία προσαρμοσμένου ονόματος... Move &up Μετακίνηση &πάνω Move do&wn Μετακίνηση &κάτω Change displayed time zone with mouse wheel Αλλαγή της εμφανιζόμενης ζώνης ώρας με τον τροχό του ποντικιού <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Σημείωση:</b> Κάνετε μεσαίο κλικ στο ρολόι για εμφάνιση της ώρας και της ημερομηνίας όλων των διαμορφωμένων ζωνών ώρας. &General &Γενικά Auto&rotate when the panel is vertical &Αυτόματη περιστροφή όταν ο πίνακας είναι τοποθετημένος κάθετα Show &week numbers in popup calendar Εμφάνιση των αριθμών &εβδομάδων στο αναδυόμενο ημερολόγιο S&how tooltip Εμ&φάνιση υπόδειξης '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Εισαγωγή του προσαρμοσμένου ονόματος της ζώνης ώρας LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Χειροκίνητη διαμόρφωση της μορφοποίησης του παγκόσμιου ρολογιού <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Προσαρμοσμένη σύνταξη ημερομηνίας/ώρας</h1> <p>Μια μορφή ημερομηνίας είναι μια συμβολοσειρά χαρακτήρων, όπου συγκεκριμένοι χαρακτήρες αντικαθίστανται με τα δεδομένα της ημερομηνίας και της ώρας από ένα ημερολόγιο κατά την μορφοποίηση ή όταν χρησιμοποιείται για την δημιουργία δεδομένων ημερολογίου κατά την ανάλυση.</p> <p>Ο παρακάτω πίνακας του πεδίου συμβόλου της ημερομηνίας περιέχει τους χαρακτήρες που χρησιμοποιούνται στις μορφές για να εμφανίσουν τις κατάλληλες μορφές για μια δοσμένη τοποθεσία, όπως yyyy για το έτος. Οι χαρακτήρες μπορούν να χρησιμοποιηθούν περισσότερες φορές. Για παράδειγμα, αν χρησιμοποιείται για το έτος, το 'yy' μπορεί να παράγει '99', ενώ το 'yyyy' παράγει '1999'. Για τα περισσότερα των αριθμητικών πεδίων, το πλήθος των χαρακτήρων καθορίζει το πλάτος του πεδίου. Για παράδειγμα, αν h είναι η ώρα, το 'h' μπορεί να παράγει '5', αλλά το 'hh' παράγει '05'. Για ορισμένους χαρακτήρες, το πλήθος καθορίζει αν θα χρησιμοποιείται μια πλήρης ή συντετμημένη μορφή, αλλά μπορεί να έχει και άλλες επιλογές, όπως αναφέρεται παρακάτω.</p> <p>Δυο μονά εισαγωγικά αναπαριστούν κυριολεκτικά μονά εισαγωγικά, είτε εσωτερικά είτε εξωτερικά μονά εισαγωγικά. Το κείμενο που εσωκλείεται σε μονά εισαγωγικά δεν ερμηνεύεται σε καμιά περίπτωση (εκτός των δυο παρακείμενων μονών εισαγωγικών). Διαφορετικά όλα τα γράμματα ASCII από το a ως το z και από το A ως το Z είναι δεσμευμένα ως χαρακτήρες σύνταξης, και απαιτούνται εισαγωγικά αν πρόκειται να αναπαραστήσουν κυριολεκτικούς χαρακτήρες. Επιπρόσθετα, ορισμένοι χαρακτήρες στίξης ASCII μπορεί να χρησιμοποιηθούν μελλοντικά ως μεταβλητές (πχ η ":" ερμηνεύεται ως διαχωριστικό ώρας και η '/' ως διαχωριστικό ημερομηνίας, και αντικαθίσταται από τους εκάστοτε χαρακτήρες τοποθεσίας στην οθόνη).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Κωδικός</th><th>Σημασία</th></tr> <tr><td>d</td><td>η ημέρα ως αριθμός χωρίς το αρχικό μηδενικό (1 ως 31)</td></tr> <tr><td>dd</td><td>η ημέρα ως αριθμός με το αρχικό μηδενικό (01 ως 31)</td></tr> <tr><td>ddd</td><td>η συντετμημένη, τοπική ονομασία της ημέρας (π.χ. 'Δευτ' ως 'Κυρ').</td></tr> <tr><td>dddd</td><td>η μακριά, τοπική ονομασία της ημέρας (π.χ. 'Δευτέρα' ως 'Κυριακή).</td></tr> <tr><td>M</td><td>ο μήνας ως αριθμός δίχως το αρχικό μηδενικό (1-12)</td></tr> <tr><td>MM</td><td>ο μήνας ως αριθμός με το αρχικό μηδενικό (01-12)</td></tr> <tr><td>MMM</td><td>η συντετμημένη, τοπική ονομασία του μήνα (π.χ. 'Ιαν' ως 'Δεκ').</td></tr> <tr><td>MMMM</td><td>η μακριά, τοπική ονομασία του μήνα (π.χ. 'Ιανουάριος' ως 'Δεκέμβριος').</td></tr> <tr><td>yy</td><td>το έτος ως διψήφιος αριθμός (00-99)</td></tr> <tr><td>yyyy</td><td>το έτος ως τετραψήφιος αριθμός</td></tr> <tr><td>h</td><td>η ώρα δίχως το αρχικό μηδενικό (0 ως 23 ή 1 ως 12 αν απεικονίζεται ως ΠΜ/ΜΜ)</td></tr> <tr><td>hh</td><td>η ώρα με το αρχικό μηδενικό (00 ως 23 ή 01 ως 12 αν απεικονίζεται ως ΠΜ/ΜΜ)</td></tr> <tr><td>H</td><td>η ώρα με το αρχικό μηδενικό (0 ως 23, ακόμα και με απεικόνιση ως ΠΜ/ΜΜ)</td></tr> <tr><td>HH</td><td>η ώρα με το αρχικό μηδενικό (00 ως 23, ακόμα και με απεικόνιση ως ΠΜ/ΜΜ)</td></tr> <tr><td>m</td><td>τα λεπτά δίχως το αρχικό μηδενικό (0 ως )</td></tr> <tr><td>mm</td><td>τα λεπτά με το αρχικό μηδενικό (0 ως 59)</td></tr> <tr><td>s</td><td>τα δευτερόλεπτα δίχως το αρχικό μηδενικό (0 ως 59)</td></tr> <tr><td>ss</td><td>τα δευτερόλεπτα με το αρχικό μηδενικό (00 ως 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>χρήση της απεικόνισης ως ΠΜ/ΜΜ. Τα <b>A/AP</b> θα αντικατασταθούν από "ΠΠ" ή "ΜΜ".</td></tr> <tr><td>ap <i>or</i> a</td><td>χρήση της απεικόνισης π.μ./μ.μ. Τα <b>a/ap</b> θα αντικατασταθούν από τα "π.μ." ή "μ.μ.".</td></tr> <tr><td>t</td><td>η ζώνη ώρας (π.χ. "CEST")</td></tr> <tr><td>T</td><td>η διαφορά από την ώρα UTC</td></tr> <tr><td>TT</td><td>το αναγνωριστικό IANA της ζώνης ώρας</td></tr> <tr><td>TTT</td><td>η συντομογραφία της ζώνης ώρας</td></tr> <tr><td>TTTT</td><td>το βραχύ όνομα της ζώνης ώρας</td></tr> <tr><td>TTTTT</td><td>το μακρύ όνομα της ζώνης ώρας</td></tr> <tr><td>TTTTTT</td><td>το προσαρμοσμένο όνομα της ζώνης ώρας. Μπορείτε να το αλλάξετε από την καρτέλα «Ζώνες ώρας» του παραθύρου διαμόρφωσης</td></tr></table> <p><br /><b>Σημείωση:</b> <ul><li>Οποιοσδήποτε χαρακτήρας στη μορφή που δεν είναι στο εύρος ['a'..'z'] και ['A'..'Z'] θα διαχειρίζεται ως κείμενο σε εισαγωγικά. Παραδείγματος χάριν, οι χαρακτήρες ':', '.', ' ', '#' και '@' θα εμφανίζονται στο τελικό κείμενο της ώρας ακόμα και αν δεν είναι έγκλειστοι σε μονά εισαγωγικά. Τα μονά εισαγωγικά χρησιμοποιούνται για τη «διαφυγή» γραμμάτων. Δυο μονά εισαγωγικά σε μια γραμμή, είτε εσωτερικά είτε εξωτερικά της ακολουθίας έγκλειστης σε εισαγωγικά, αναπαριστούν ένα ζεύγος «πραγματικών» μονών εισαγωγικών.</li><li>Η ελάχιστη καθυστέρηση ενημέρωσης είναι το 1 δευτερόλεπτο. Αν z ή zzz είναι η διαμορφωμένη ώρα θα εμφανίζεται με το κλάσμα του χιλιοστού δευτερολέπτου, αλλά δεν θα ανανεώνεται βάσει των χιλιοστών του δευτερολέπτου για την αποφυγή μείωσης των επιδόσεων.</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Ζώνες ώρας του παγκόσμιου ρολογιού Time zone Ζώνη ώρας Name Όνομα Comment Σχόλιο Country Χώρα UTC UTC Other Άλλο Local timezone Τοπικής ζώνης ώρας ================================================ FILE: plugin-worldclock/translations/worldclock_en_GB.desktop.yaml ================================================ Desktop Entry/Name: "World Clock" Desktop Entry/Comment: "Displays a clock with calendar and time zones" ================================================ FILE: plugin-worldclock/translations/worldclock_en_GB.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings World Clock Settings Display &format Display &format &Time &Time F&ormat: F&ormat: Short Short Long Long Custom Custom Sho&w seconds Sho&w seconds Pad &hour with zero Pad &hour with zero T&ime zone T&ime zone &Position: &Position: For&mat: For&mat: Below Below Above Above Before Before After After Offset from UTC Offset from UTC Abbreviation Abbreviation IANA id IANA id Custom name Custom name &Use 12-hour format &Use 12-hour format Location identifier Location identifier &Date &Date Po&sition: Po&sition: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Show &year Show day of wee&k Show day of wee&k Pad d&ay with zero Pad d&ay with zero &Long month and day of week names &Long month and day of week names Ad&vanced manual format Ad&vanced manual format &Customize ... &Customise ... Time &zones Time &zones &Add ... &Add ... &Remove &Remove Set as &default Set as &default &Edit custom name ... &Edit custom name ... Move &up Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localised day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localised day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localised month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localised month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_es.desktop.yaml ================================================ Desktop Entry/Name: "Reloj mundial" Desktop Entry/Comment: "Complemento de reloj mundial" ================================================ FILE: plugin-worldclock/translations/worldclock_es.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Configuración del reloj mundial Display &format &Formato de presentación &Time Hora F&ormat: F&ormato: Short Corto Long Largo Custom Personalizado Sho&w seconds Mostrar los segundos Pad &hour with zero Rellenar la &hora con ceros T&ime zone Zona horar&ia &Position: &Posición: For&mat: For&mato: Below Abajo Above Arriba Before Antes After Después Offset from UTC Desviación de UTC Abbreviation Abreviatura IANA id Identificador de IANA Custom name Nombre personalizado &Use 12-hour format &Usar formato de 12 horas Location identifier Identificador de ubicación &Date Fecha Po&sition: Po&sición: Fo&rmat: Fo&rmato: ISO 8601 ISO 8601 Show &year Mostrar el año Show day of wee&k Mostrar el día de la semana Pad d&ay with zero Rellen&ar el día con ceros &Long month and day of week names Nombres &completos de meses y días de la semana Ad&vanced manual format Formato manual a&vanzado &Customize ... Personalizar... Time &zones &Zonas horarias &Add ... &Añadir... &Remove &Eliminar Set as &default Establecer como pre&definido &Edit custom name ... &Editar el nombre personalizado... Move &up Mover hacia arriba Move do&wn Mover hacia abajo Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General &General Auto&rotate when the panel is vertical &Rotar automáticamente cuando el panel esté vertical Show &week numbers in popup calendar Mostrar los números de las &semanas en la ventana emergente del calendario S&how tooltip &Mostrar descripciones emergentes '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Introduzca el nombre personalizado de la zona horaria LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuración manual del formato del reloj mundial <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> Español <h1>Sintaxis de formato de fecha/hora personalizado</h1> <p>Un patrón de la fecha es una cadena de caracteres, las cadenas de caracteres que sé específica se reemplazan con los datos de la fecha y hora del calendario cuando se da formato o se usa para generar datos para un calendario cuando se analiza.</p> <p>La siguiente tabla de símbolos del campo de la fecha, contiene los caracteres utilizados para mostrar los formatos apropiados en un lugar determinado, como 'yyyy' para el año. Los caracteres se pueden usar varias veces. Por ejemplo, si se usa 'y' para el año, 'yy' podría producir '99', mientras que 'yyyy' , muestra '1999'. Para la mayoría de los campos numéricos, el ancho es especificado por el número de caracteres. Por ejemplo, la hora es, 'h' y muestra '5', pero con 'hh' muestra '05'. Para algunos caracteres, se puede específicar si se debe usar una forma abreviada o completa, además puede haber otras opciones, como se indica a continuación.</p> <p>Dos comillas simples representan una comilla simple literal, ya sea por dentro o fuera de las comillas simples. El texto entre comillas simples no se interpreta de ninguna manera (excepto si hay dos comillas simples próximas). De lo contrario, todas las letras ASCII de la a - z y de la A - Z están reservadas como caracteres de sintaxis y requieren comillas si van a representar caracteres literales. Además, ciertos caracteres de puntuación ASCII pueden volverse variables en el futuro (ej., ":" se interpreta como el separador de tiempo y '/' como un separador para la fecha, y se reemplaza por los respectivos caracteres sensibles a la configuración regional en la pantalla).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Sintaxis</th><th>Descripción</th></tr> <tr><td>d</td><td>el día en número sin cero al comienzo (1 a 31)</td></tr> <tr><td>dd</td><td>el día con el número cero al comienzo (01 a 31)</td></tr> <tr><td>ddd</td><td>la abreviatura del nombre del dia (ej. 'Lun' a 'Dom' )</td></tr> <tr><td>dddd</td><td>el nombre del día (ej. 'Lunes' 'Domingo')</td></tr> <tr><td>M</td><td>el mes en numero sin cero al inicio (1-12)</td></tr> <tr><td>MM</td><td>el mes en numero con el cero al inicio (01-12)</td></tr> <tr><td>MMM</td><td>el nombre abreviado del mes (ej. 'Ene' a 'Dic')</td></tr> <tr><td>MMMM</td><td>el nombre completo del mes (ej. 'Enero' a 'Diciembre')</td></tr> <tr><td>yy</td><td>el año en número de dos dígitos (00-99)</td></tr> <tr><td>yyyy</td><td>el año en numero de cuatro dígitos</td></tr> <tr><td>h</td><td>la hora sin cero al inicio (0 a 23 o 1 a 12, si muestra AM/PM)</td></tr> <tr><td>hh</td><td>la hora sin cero al inicio (0 a 23 o 1 a 12, si muestra AM/PM)</td></tr> <tr><td>H</td><td>la hora sin el cero inicial (0 a 23, incluido en la pantalla AM/PM)</td></tr> <tr><td>HH</td><td>la hora con el cero inicial (00 a 23, incluido en la pantalla AM/PM)</td></tr> <tr><td>m</td><td>el minuto sin cero al inicio (0 a 59)</td></tr> <tr><td>mm</td><td>el minuto con cero al inicio (00 a 59)</td></tr> <tr><td>s</td><td>el segundo sin cero al inicio (0 a 59)</td></tr> <tr><td>ss</td><td>el segundo con el cero al inicio (00 a 59)</td></tr> <tr><td>AP <i>o</i> A</td><td>mostrar en pantalla AM/PM. <b>A/AP</b> será reemplazado por "AM" o "PM".</td></tr> <tr><td>ap <i>o</i> a</td><td>usar en pantalla am/pm. <b>a/ap</b> Será reemplazado por "am" o "pm".</td></tr> <tr><td>t</td><td>zona horaria (ej. "CEST")</td></tr> <tr><td>T</td><td>tiempo universal coordinado UTC</td></tr> <tr><td>TT</td><td>la zona horaria IANA id</td></tr> <tr><td>TTT</td><td>abreviatura de la zona horaria</td></tr> <tr><td>TTTT</td><td>mostrar nombre corto de la zona horaria</td></tr> <tr><td>TTTTT</td><td>mostrar nombre largo de la zona horaria</td></tr> <tr><td>TTTTTT</td><td>nombre personalizado para la zona horaria. Puede cambiarlo en la pestaña 'Zonas horarias' dentro de configuración.</td></tr></table> <br /><b>Notes:</b> <ul><li>Cualquier letra dentro del rango de ['a'..'z'] y ['A'..'Z'] será tratado como un texto citado. Por ejemplo, caracteres como ':', '.', ' ', '#' y '@' aparecerán en el texto del tiempo resultante, incluso si no están encerrados entre comillas simples. La comilla simple se utiliza para "saltar" de las letras. Dos comillas simples seguidas, ya sea dentro o fuera de una secuencia entrecomillada, representan una comilla simple 'real'.</li><li>El intervalo mínimo de actualización es de 1 segundo. Si z o zzz están configurados, el tiempo se muestra con la fracción de milisegundos, pero no se actualiza en milisegundos (evitando un gran impacto en el rendimiento).</li><ul> Clave LXQtWorldClockConfigurationManualFormat LXQtWorldClockConfigurationTimeZones World Clock Time Zones Zonas horarias del reloj mundial Time zone Zona horaria Name Nombre Comment Comentario Country País UTC UTC Other Otra Local timezone Zona horaria local ================================================ FILE: plugin-worldclock/translations/worldclock_et.desktop.yaml ================================================ Desktop Entry/Name: "Maailmakell" Desktop Entry/Comment: "Näita kellaaega koos kalendri ja ajavööndiga" ================================================ FILE: plugin-worldclock/translations/worldclock_et.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Maailmakella seadistused Display &format Esitatav &vorming &Time &Aeg F&ormat: V&orming: Short Lühike Long Pikk Custom Kohandatud Sho&w seconds Näita &sekundeid Pad &hour with zero Lisa vajadusel &tunnile null T&ime zone Aja&vöönd &Position: &Asukoht: For&mat: Vor&ming: Below All Above Üleval Before Ees After Järel Offset from UTC Erinevus UTC ajaga Abbreviation Lühend IANA id IANA tunnus Custom name Kohandatud nimi &Use 12-hour format &Kasuta 12-tunni vormingut Location identifier Ajavööndi nimi &Date &Kuupäev Po&sition: A&sukoht: Fo&rmat: Vo&rming: ISO 8601 ISO 8601 Show &year Näita &aastat Show day of wee&k Näita &nädalapäeva Pad d&ay with zero Lisa vajadusel kuupäevale &null &Long month and day of week names Kuude ja nädalapäevade &pikad nimed Ad&vanced manual format Seadista vorming väga detailselt &Customize ... &Kohanda... Time &zones Aja&vööndid &Add ... &Lisa... &Remove &Emalda Set as &default Määra &vaikimisi väärtuseks &Edit custom name ... &Muuda kohandatud nime... Move &up Liiguta &üles Move do&wn Liiguta &alla Change displayed time zone with mouse wheel Vaheta kuvatavat ajavööndit hiireratta kerimisega <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Märkus:</b> Keskmine hiireklõps kellal näitab kellaaega ja kuupäeva kõikide hetkel seadistatud ajavööndite kohta. &General Üldised &seadistused Auto&rotate when the panel is vertical Kui paneel asub püstloodis, siis pööra &automaatselt Show &week numbers in popup calendar Näita avatavas kalendris &nädalate numbreid S&how tooltip Näita &kohtspikrit '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Sisesta ajavööndile kohandatud nimi LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Maailmakella detailne seadistamine <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Aja ja kuupäeva kohandatud vorming</h1> <p>Kuupäeva vorming on tähemärkide jada, kus konkreetsed tähemärgid asendatakse vormindamisel kalendri kuupäevade ja kellaaegade andmetega või mida kasutatakse kalendri jaoks andmete loomisel.</p> <p>Allpool esitatud kuupäevavälja sümbolite tabel sisaldab märke, mida kasutatame, et näidata asjakohaseid vorminguid konkreetse lokaadi jaoks, näiteks yyyy aastaarvu jaoks. Märke võib kasutada mitu korda. Näiteks, kui aastaarvuks kasutatad y, võib 'yy' anda tulemuseks '99', samas kui 'yyyy' annab tulemuseks '1999'. Enamiku numbriliste väljade puhul määrab tähemärkide arv välja laiuse. Näiteks kui h on tund, võib 'h' anda tulemuseks '5', kuid 'hh' annab tulemuseks '05'. Mõne asenduse puhul määrab arv kindlaks, kas kasutame lühendatud või täielikku vormi, kuid võib olla ka muid valikuid, nagu on esitatud allpool.</p> <p>Kaks ühekordset jutumärki tähistab sõna-sõnalist ühekordset jutumärki, mis on kas ühekordsete jutumärkide sees või väljaspool neid. Teksti ühekordsete jutumärkide sees ei tõlgendata kuidagi (välja arvatud kaks kõrvuti asetsevat ühekordset jutumärki). Muul juhul on kõik ASCII-tähed a-st kuni z-ni ja A-st kuni Z-ni reserveeritud süntaksimärkidena ja nõuavad jutumärke, kui nad kujutavad üheselt mõistetavaid märke. Lisaks võivad teatavad ASCII kirjavahemärgid muutuda tulevikus muutuvaks (nt ":" tõlgendatakse aja eraldajana ja "/" kuupäeva eraldajana ning asendatakse vastavate lokaadikohaste märkidega).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Tähendus</th></tr> <tr><td>d</td><td>päev numbrina ilma esimese nullita (1 kuni 31)</td></tr> <tr><td>dd</td><td>päev numbrina esimese nulliga (01 kuni 31)</td></tr> <tr><td>ddd</td><td>päeva lühend sinu keeles ('esm' kuni 'püh').</td></tr> <tr><td>dddd</td><td>päeva nimi sinu keeles ('esmaspäev' kuni 'pühapäev').</td></tr> <tr><td>M</td><td>kuu numbrina ilma esimese nullita (1-12)</td></tr> <tr><td>MM</td><td>kuu numbrina esimese nulliga (01-12)</td></tr> <tr><td>MMM</td><td>kuu lühend sinu keeles ('jaan' kuni 'dets').</td></tr> <tr><td>MMMM</td><td>kuu nimi sinu keeles ('jaanuar' kuni 'detsember').</td></tr> <tr><td>yy</td><td>aasta kahekohalise numbrina (00-99)</td></tr> <tr><td>yyyy</td><td>aasta neljakohalise numbrina</td></tr> <tr><td>h</td><td>tund numbrina ilma esimese nullita (0 kuni 23 või 1 kuni 12, kui kasutad AM/PM esitusviisi)</td></tr> <tr><td>hh</td><td>tund numbrina esimese nulliga (00 kuni 23 või 01 kuni 12, kui kasutad AM/PM esitusviisi)</td></tr> <tr><td>H</td><td>tund numbrina ilma esimese nullita (0 kuni 23, sealhulgas AM/PM esitusviisil)</td></tr> <tr><td>HH</td><td>tund numbrina esimese nulliga (00 kuni 23, sealhulgas AM/PM esitusviisil)</td></tr> <tr><td>m</td><td>minut numbrina ilma esimese nullita (0 kuni 59)</td></tr> <tr><td>mm</td><td>minut numbrina esimese nulliga (00 kuni 59)</td></tr> <tr><td>s</td><td>sekund numbrina ilma esimese nullita (0 kuni 59)</td></tr> <tr><td>ss</td><td>sekund numbrina esimese nulliga (00 kuni 59)</td></tr> <tr><td>AP <i>või</i> A</td><td>kasuta AM/PM esitusviisi. <b>A/AP</b> asendub vastavalt kas "AM" või "PM" märkega.</td></tr> <tr><td>ap <i>või</i> a</td><td>kasuta am/pm esitusviisi. <b>a/ap</b> asendub vastavalt kas "am" või "pm" märkega.</td></tr> <tr><td>t</td><td>ajavöönd (näiteks "EEST")</td></tr> <tr><td>T</td><td>erinevus UTC/GMT ajast</td></tr> <tr><td>TT</td><td>ajavööndi IANA tunnus</td></tr> <tr><td>TTT</td><td>ajavööndi lühend</td></tr> <tr><td>TTTT</td><td>ajavööndi lühike nimi</td></tr> <tr><td>TTTTT</td><td>ajavööndi pikk nimi</td></tr> <tr><td>TTTTTT</td><td>ajavööndi kohandatud nimi, mida saad muuta kellaaja seadistuste vaates Ajavööndite kaardilt</td></tr></table> <br /><b>Notes:</b> <ul><li>Kõik märgid, mis ei kuulu vahemikku ['a'...z'] ja ['A'...Z'], loetakse tsiteeritud tekstiks. Näiteks sellised märgid nagu ':', '.', ' ', '#' ja '@' ilmuvad tulemuseks olevas ajatekstis isegi siis, kui need ei ole ühekordsete jutumärkide vahel. Ühekordset jutumärki kasutatakse tähtede vältimiseks. Kaks ühekordset jutumärki järjest, nii jutumärkide jada sees kui ka väljaspool, kujutavad endast "tõelist" ühekordset jutumärki.</li><li>Andmeid uuendame kord sekundis. Kui sa juhtumisi kasutad z või zzz asendusi, siis aega kuvame millisekundi täpsusega, kuid uuendame seda vaid kord sekundis ja väldime sellega kaasnevat asjatut koormust sinu süsteemis.</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Ajavööndid maailmakellas Time zone Ajavöönd Name Nimi Comment Kommentaar Country Riik UTC UTC Other Muu Local timezone Kohalik ajavöönd ================================================ FILE: plugin-worldclock/translations/worldclock_fi.desktop.yaml ================================================ Desktop Entry/Name: "Maailmankello" Desktop Entry/Comment: "Näyttää kellon kalenterilla ja aikavyöhykkeillä" ================================================ FILE: plugin-worldclock/translations/worldclock_fi.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Maailmankellon asetukset Display &format Näyttö&muoto &Time &Aika F&ormat: &Muoto: Short Lyhyt Long Pitkä Custom Mukautettu Sho&w seconds &Näytä sekunnit Pad &hour with zero Lisää tuntiin etunolla T&ime zone &Aikavyöhyke &Position: &Sijainti: For&mat: &Muoto: Below Alhaalla Above Ylhäällä Before Ennen After Jälkeen Offset from UTC UTC-poikkeama Abbreviation Lyhenne IANA id IANA-koodi Custom name Mukautettu nimi &Use 12-hour format Käytä &12-tuntista muotoa Location identifier Sijainnin tunniste &Date &Päiväys Po&sition: &Sijainti: Fo&rmat: M&uoto: ISO 8601 ISO 8601 Show &year &Näytä vuosi Show day of wee&k Näytä &viikonpäivä Pad d&ay with zero Lisää päivänumeroon &etunolla &Long month and day of week names Pitkät &kuukauden ja viikonpäivänimet Ad&vanced manual format Edistynyt &oma muoto &Customize ... &Mukauta... Time &zones Aikavy&öhykkeet &Add ... &Lisää... &Remove &Poista Set as &default &Aseta oletukseksi &Edit custom name ... &Muuta omaa nimeä... Move &up Siirrä &ylös Move do&wn Siirrä &alas Change displayed time zone with mouse wheel Vaihda näytettävää aikavyöhykettä hiiren rullalla <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Huomautus:</b> Napsauta kelloa keskipainikkeella nähdäksesi kaikkien määritettyjen aikavyöhykkeiden kellonajan ja päivämäärän. &General &Yleiset Auto&rotate when the panel is vertical Kierrä automaattisesti kun paneeli on &pystysuorassa Show &week numbers in popup calendar Näytä viikkonumerot &ponnahduskalenterissa S&how tooltip Näytä &työkaluvihje '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Syötä mukautettu nimi aikavyöhykkeelle LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Maailmankellon oman muodon &määritys <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Maailmankellon aikavyöhykkeet Time zone Aikavyöhyke Name Nimi Comment Kommentti Country Maa UTC UTC Other Muu Local timezone Paikallinen aikavyöhyke ================================================ FILE: plugin-worldclock/translations/worldclock_fr.desktop.yaml ================================================ Desktop Entry/Name: "Horloge universelle" Desktop Entry/Comment: "Horloge universelle" ================================================ FILE: plugin-worldclock/translations/worldclock_fr.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b> <br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Paramétrage de l'horloge universelle Display &format Afficher le &format &Time &Heure F&ormat: F&ormat : Short 12h Long 24h Custom Personnalisé Sho&w seconds &Afficher les secondes Pad &hour with zero Remplissage de l'&heure avec un zéro &Use 12-hour format &Utiliser le format 12 heures T&ime zone &Fuseau horaire &Position: &Position : For&mat: For&mat : Below Sous Above Sur Before Avant After Après Offset from UTC Décalage par rapport à l'UTC Abbreviation Abréviation Location identifier Identifiant géographique Custom name Nom personnalisé &Date &Date Po&sition: Po&sition : Fo&rmat: Fo&rmat : ISO 8601 ISO 8601 Show &year Afficher l&'année Show day of wee&k Afficher le &jour de la semaine Pad d&ay with zero Remplissage du j&our avec un zéro &Long month and day of week names &Noms complets du mois et du jour Ad&vanced manual format Format manuel a&vancé &Customize ... &Personnaliser... Time &zones F&useaux horaires IANA id id IANA &Add ... &Ajouter... &Remove &Supprimer Set as &default Choisir comme &défaut &Edit custom name ... &Éditer le nom personnalisé... Move &up Déplacer vers le ha&ut Move do&wn Déplacer vers le &bas Change displayed time zone with mouse wheel Changer le fuseau horaire affiché avec la molette de la souris <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Note :</b> Cliquez avec le bouton du milieu sur l’horloge pour afficher l’heure et la date de tous les fuseaux horaires configurés. &General &Général Auto&rotate when the panel is vertical Auto&rotation lorsque le panneau est vertical Show &week numbers in popup calendar Afficher les numéros de &semaine dans le calendrier contextuel S&how tooltip Montrer les infobulles '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b> <br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Entrez le nom du fuseau horaire personnalisé LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuration du format manuel de l'horloge mondiale <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Syntaxe du format de date/heure personnalisé</h1> <p>Un modèle de date est une chaîne de caractères, dans laquelle des chaînes de caractères spécifiques sont remplacées par des données de date et d'heure d'un calendrier lors du formatage ou utilisées pour générer des données pour un calendrier lors de l'analyse.</p> <p>Le tableau des symboles de champ de date ci-dessous contient les caractères utilisés dans les modèles pour afficher les formats appropriés pour un paramètre régional donné, tel que yyyy pour l'année. Les caractères peuvent être utilisés plusieurs fois. Par exemple, si y est utilisé pour l'année, «yy» peut produire «99», tandis que «yyyy» produit «1999». Pour la plupart des champs numériques, le nombre de caractères spécifie la largeur du champ. Par exemple, si h est l'heure, «h» peut produire «5», mais «hh» produit «05». Pour certains caractères, le décompte spécifie si une forme abrégée ou complète doit être utilisée, mais il peut y avoir d'autres choix, comme indiqué ci-dessous.</p> <p>Deux guillemets simples représentent un guillemet simple littéral, à l'intérieur ou à l'extérieur des guillemets simples. Le texte entre guillemets simples n'est en aucun cas interprété (à l'exception de deux guillemets simples adjacents). Sinon, toutes les lettres ASCII de a à z et de A à Z sont réservées en tant que caractères de syntaxe et nécessitent des guillemets si elles doivent représenter des caractères littéraux. De plus, certains caractères de ponctuation ASCII peuvent devenir variables à l'avenir (par ex, ":" étant interprété comme le séparateur d'heure et "/" comme un séparateur de date, et remplacé par des caractères sensibles aux paramètres régionaux respectifs affichés).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Signification</th></tr> <tr><td>d</td><td>le jour sous forme de nombre sans zéro non significatif (1 à 31)</td></tr> <tr><td>dd</td><td>le jour sous forme de nombre avec un zéro non significatif (01 à 31)</td></tr> <tr><td>ddd</td><td>le nom abrégé du jour localisé (ex, 'Lun' à 'Dim').</td></tr> <tr><td>dddd</td><td>le nom complet du jour localisé (ex, 'Lundi' à 'Dimanche').</td></tr> <tr><td>M</td><td>le mois sous forme de nombre sans zéro non significatif (1-12)</td></tr> <tr><td>MM</td><td>le mois sous forme de nombre avec zéro non significatif (01-12)</td></tr> <tr><td>MMM</td><td>le nom abrégé du mois localisé (ex, 'Jan' à 'Déc').</td></tr> <tr><td>MMMM</td><td>le nom complet du mois localisé ( 'Janvier' à 'Décembre').</td></tr> <tr><td>yy</td><td>l'année sous forme de nombre à deux chiffres (00-99)</td></tr> <tr><td>yyyy</td><td>l'année sous forme de nombre à quatre chiffres</td></tr> <tr><td>h</td><td>l'heure sans zéro non significatif (0 à 23 ou 1 à 12 si affichage AM/PM)</td></tr> <tr><td>hh</td><td>l'heure avec zéro non significatif (00 à 23 ou 01 à 12 si affichage AM/PM)</td></tr> <tr><td>H</td><td>l'heure sans zéro non significatif (0 à 23, même si affichage AM/ PM)</td></tr> <tr><td>HH</td><td>l'heure avec un zéro non significatif (00 à 23, même si affichage AM/PM)</td></tr> <tr><td>m</td><td>la minute sans zéro non significatif (0 à 59)</td></tr> <tr><td>mm</td><td>la minute avec un zéro non significatif (00 à 59)</td></tr> <tr><td>s</td><td>la seconde sans zéro non significatif (0 à 59)</td></tr> <tr><td>ss</td><td>le second avec un zéro non significatif (00 à 59)</td></tr> <tr><td>AP <i>ou</i> A</td><td>utiliser l'affichage AM / PM. <b>A/AP</b> sera remplacé par "AM" ou "PM".</td></tr> <tr><td>ap <i>ou</i> a</td><td>utiliser l'affichage am/pm <b>a/ap</b> sera remplacé par "am" ou "pm".</td></tr> <tr><td>t</td><td>le fuseau horaire (par exemple "CEST")</td></tr> <tr><td>T</td><td>le décalage par rapport à UTC</td></tr> <tr><td>TT</td><td>l'identifiant IANA du fuseau horaire</td></tr> <tr><td>TTT</td><td>l'abréviation du fuseau horraire</td></tr> <tr><td>TTTT</td><td>le nom d'affichage court du fuseau horaire</td></tr> <tr><td>TTTTT</td><td>le nom d'affichage long du fuseau horaire</td></tr> <tr><td>TTTTTT</td><td>le nom personnalisé du fuseau horaire. Modifiable dans l'onglet 'Fuseaux horaires' de la fenêtre de configuration</td></tr></table> <br /><b>Notes:</b> <ul><li>Tous les caractères du motif qui ne sont pas dans les plages ['a' .. 'z'] et ['A' .. 'Z'] seront traités comme du texte entre guillemets. Par exemple, des caractères comme «:», «.», «,», «#» Et «@» apparaîtront dans le texte temporel résultant même s'ils ne sont pas entourés de guillemets simples. Le guillemet simple est utilisé pour «échapper» les lettres. Deux guillemets simples dans une ligne, que ce soit à l'intérieur ou à l'extérieur d'une séquence entre guillemets, représentent un guillemet simple «réel». </li><li> L'intervalle de mise à jour minimal est de 1 seconde. Si z ou zzz est configuré, le temps est affiché avec la fraction de millisecondes, mais il n'est pas mis à jour sur une base de millisecondes (évitant des problèmes de performances).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fuseaux horaires de l'horloge universelle Time zone Fuseau horaire Name Nom Comment Commentaire Country Pays UTC UTC Other Autre Local timezone Fuseau horaire local ================================================ FILE: plugin-worldclock/translations/worldclock_gl.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d de MMM de yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Axustes do reloxo mundial Display &format &Formato de presentación &Time &Hora F&ormat: F&ormato: Short Curto Long Completo Custom Personalizado Sho&w seconds Amosa&r segundos Pad &hour with zero Amosar o cero inicial nas &horas T&ime zone F&uso horario &Position: &Posición: For&mat: For&mato: Below Abaixo Above Enriba Before Antes After Após Offset from UTC Desviación de UTC Abbreviation Abreviatura IANA id ID da IANA Custom name Nome personalizado &Use 12-hour format &Usar o formato de 12 horas Location identifier Identificador da localización &Date &Data Po&sition: Po&sición: Fo&rmat: Fo&rmato: ISO 8601 Show &year Amosar o a&no Show day of wee&k Amosar o día da se&mana Pad d&ay with zero Amosar o cero inicial nos dí&as &Long month and day of week names Nomes com&pletos dos meses e dos días da semana Ad&vanced manual format Formato manual a&vanzado &Customize ... &Personalizar ... Time &zones &Fusos horarios &Add ... &Engadir ... &Remove &Retirar Set as &default Estabelecer como pre&determinado &Edit custom name ... &Editar o nome personalizado ... Move &up Mover cara a a&rriba Move do&wn Mover cara a a&baixo Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General &Xeral Auto&rotate when the panel is vertical &Rotar automaticamente cando o panel estea en vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d de MMM de yyyy'<br/>'TT'</font>' Input custom time zone name Insira o nome personalizado do fuso horario LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuración do formato manual do reloxo mundial <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fusos horarios do reloxo mundial Time zone Fuso horario Name Nome Comment Comentario Country País UTC Other Outro Local timezone Fuso horario local ================================================ FILE: plugin-worldclock/translations/worldclock_he.desktop.yaml ================================================ Desktop Entry/Name: "שעון עולמי" Desktop Entry/Comment: "מציג שעון עם לוח שנה ואזורי זמן" ================================================ FILE: plugin-worldclock/translations/worldclock_he.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings הגדרות שעון עולמי Display &format תבנית ת&צוגה &Time &שעה F&ormat: ת&בנית: Short קצרה Long ארוכה Custom התאמה אישית Sho&w seconds הצגת ש&ניות Pad &hour with zero &ריפוד השעה באפס T&ime zone א&זור זמן &Position: &מיקום: For&mat: ת&בנית: Below מתחת Above מעל Before לפני After אחרי Offset from UTC מרחק מ־UTC Abbreviation קיצור IANA id מזהה IANA Custom name שם בהתאמה אישית &Use 12-hour format תבנית &12 שעות Location identifier מזהה מיקום &Date ת&אריך Po&sition: מי&קום: Fo&rmat: ת&בנית: ISO 8601 Show &year הצגת &שנה Show day of wee&k הצגת יום בשבו&ע Pad d&ay with zero &ריפוד היום באפס &Long month and day of week names שם &חודש ארוך ושמות ימים בשבוע Ad&vanced manual format תבנית ידנית מת&קדמת &Customize ... הת&אמה אישית… Time &zones א&זורי זמן &Add ... הו&ספה… &Remove הס&רה Set as &default הגדרה &כבררת מחדל &Edit custom name ... הגדרת שם בה&תאמה אישית… Move &up העברה &למעלה Move do&wn העברה למ&טה Change displayed time zone with mouse wheel החלפת אזור הזמן המוצג עם גלגלת העכבר <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>לתשומת ליבך:</b> לחיצה אמצעית על השעון מציגה את השעון והתאריך לכל אזורי הזמן המוגדרים. &General &כללי Auto&rotate when the panel is vertical להטות אוטומטית כאשר הלוח א&נכי Show &week numbers in popup calendar הצגת מ&ספרי שבועות בלוח השנה הקופץ S&how tooltip ה&צגת חלונית עצה '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' ‎'<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>'‎ Input custom time zone name להקליד שם של אזור זמן מותאם אישית LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration הגדרות תצורה ידנית של שעון עולמי <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>תחביר תאריך\שעה מותאם אישית </h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>הערות:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones אזורי זמן מרחבי העולם Time zone אזור זמן Name שם Comment תגובה Country מדינה UTC Other אחר Local timezone אזור זמן מקומי ================================================ FILE: plugin-worldclock/translations/worldclock_hi.desktop.yaml ================================================ Desktop Entry/Name: "वैश्विक घड़ियाँ" Desktop Entry/Comment: "कैलेंडर और समय क्षेत्र वाली घड़ी प्रदर्शित करता है" ================================================ FILE: plugin-worldclock/translations/worldclock_hr.desktop.yaml ================================================ Desktop Entry/Name: "Svjetski sat" Desktop Entry/Comment: "Priključak za svjetski sat" ================================================ FILE: plugin-worldclock/translations/worldclock_hr.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'dddd, d. MMMM yyyy.'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Svjetski sat – Postavke Display &format &Format prikaza &Time &Vrijeme F&ormat: F&ormat: Short Kratki Long Dugi Custom Prilagođeni Sho&w seconds Prikaži se&kunde Pad &hour with zero Prikaži &sate s vodećom nulom T&ime zone Vremenska &zona &Position: &Položaj: For&mat: For&mat: Below Ispod Above Iznad Before Ispred After Iza Offset from UTC Odstupanje od UTC-a Abbreviation Kratica IANA id IANA id Custom name Prilagođeno ime &Use 12-hour format &Koristi 12-satni format Location identifier Identifikator mjesta &Date &Datum Po&sition: P&oložaj: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Prikaži godin&u Show day of wee&k Pri&kaži dan u tjednu Pad d&ay with zero Prikaži d&ane s vodećom nulom &Long month and day of week names &Ispiši mjesece i dane tjedna Ad&vanced manual format Napredni &ručni format &Customize ... Pri&lagodi … Time &zones Vremenske &zone &Add ... Dod&aj … &Remove &Ukloni Set as &default Postavi kao sta&ndardno &Edit custom name ... Ure&di prilagođeno ime … Move &up Premjesti prema &gore Move do&wn Premjesti prema &dolje Change displayed time zone with mouse wheel Promijeni prikazanu vremensku zonu kotačićem miša <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Napomena:</b> Klikni srednjom tipkom miša na sat za prikaz vremena i datuma za sve konfigurirane vremenske zone. &General &Opće Auto&rotate when the panel is vertical Automatski ok&reni kad ploča stoji okomito Show &week numbers in popup calendar Prikaži &brojeve tjedana u skočnom kalendaru S&how tooltip Prikaži savjetni o&blačić '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'dddd, d. MMMM yyyy.'<br/>'TT'</font>' Input custom time zone name Upiši prilagođeno ime vremenske zone LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Priručnik za svjetski sat – Konfiguriranje formata <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Svjetski sat – Vremenske zone Time zone Vremenska zona Name Ime Comment Komentar Country Zemlja UTC UTC Other Ostalo Local timezone Lokalna vremenska zona ================================================ FILE: plugin-worldclock/translations/worldclock_hu.desktop.yaml ================================================ Desktop Entry/Name: "Világóra" Desktop Entry/Comment: "Világóra bővítmény" ================================================ FILE: plugin-worldclock/translations/worldclock_hu.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Világóra beállítások Display &format Megjelenítendő &formátum &Time &Idő F&ormat: F&ormátum: Short Rövid Long Hosszú Custom Egyéni Sho&w seconds &Másodpercek megjelenítése Pad &hour with zero Óra kezdő nu&llával T&ime zone &Időzóna &Position: &Helyzet: For&mat: Fo&rmátum: Below Alatta Above Felette Before Előtte After Utána Offset from UTC Eltérés UTC-től Abbreviation Rövidítés IANA id IANA-azonosító Custom name Egyedi név &Use 12-hour format 12 ó&rás formátum Location identifier Helyazonosító &Date &Dátum Po&sition: H&elyzet: Fo&rmat: Fo&rmátum: ISO 8601 ISO 8601 Show &year É&v megjelenítése Show day of wee&k Hét nap&jainak megjelenítése Pad d&ay with zero N&ap nullával kezdődik &Long month and day of week names &Hosszú hónap- és napnév Ad&vanced manual format Haladó ké&zi formátum &Customize ... &Szerkesztés... Time &zones Idő&zónák &Add ... Hozzá&adás ... &Remove Tö&rlés Set as &default Ala&pértelmezett &Edit custom name ... Név sz&erkesztése... Move &up &Fel Move do&wn &Le Change displayed time zone with mouse wheel Időzóna megváltoztatása az egérgörgő használatával <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Megjegyzés:</b> Kattintson középső egérgombbal az órára az összes beállított időzóna dátumának és idejének megtekintéséhez. &General Általáno&s Auto&rotate when the panel is vertical Függőleges panelnél gö&rgetés Show &week numbers in popup calendar A &hét számának megjelenítése a felugró naptárban S&how tooltip &Elemleírás megjelenítése '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Egyéb időzóna név LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Világóra kézi formátum beállítása <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Egyéni dátum- és időformátum-szintaxis</h1> <p>A dátumminta egy karaktersorozat, ahol a meghatározott karakterláncok a naptárból származó dátum- és időadatokra cserélődnek a formázáskor, vagy adatok generálására szolgálnak a naptárhoz a feldolgozás során.</p> <p>Az alábbi Dátummező szimbólumtáblázat tartalmazza a mintákban használt karaktereket, amelyek az adott területi beállításnak megfelelő formátumokat jelenítik meg, például az yyyy az évet jelöli. A karakterek többször is használhatók. Például, ha az y az év jelölése, az „yy” a „99” értéket, míg az „yyyy” az „1999” értéket eredményezheti. A legtöbb numerikus mezőnél a karakterek száma határozza meg a mező szélességét. Például ha a h az óra, a „h” eredménye „5” lehet, de a „hh” eredménye „05”. Egyes karaktereknél a darabszám határozza meg, hogy rövidített vagy teljes alakot kell-e használni, de egyéb választási lehetőségek is lehetnek az alábbiak szerint.</p> <p>Két egymás utáni szimpla idézőjel egyetlen szó szerinti idézőjelet jelent, akár idézőjeleken belül, akár kívül. Az idézőjelek közötti szöveg semmilyen módon nem kerül értelmezésre (kivéve a két egymás melletti idézőjelet). Egyébként az összes ASCII betű a-tól z-ig és A-tól Z-ig szintaktikai karakternek van fenntartva, és idézőjelet igényelnek, ha szó szerinti karakterként kívánjuk megjeleníteni őket. Ezenkívül bizonyos ASCII írásjelek a jövőben változóvá válhatnak (pl. a „:” időelválasztóként, a „/” pedig dátumelválasztóként értelmezhető, és a kijelzőn a megfelelő területi beállítás szerinti karakterekre cserélődik).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kód</th><th>Jelentés</th></tr> <tr><td>d</td><td>a nap számként, kezdő nulla nélkül (1-től 31-ig)</td></tr> <tr><td>dd</td><td>a nap számként, kezdő nullával (01-től 31-ig)</td></tr> <tr><td>ddd</td><td>a rövidített honosított napnév (pl. „Hét” – „Vas”)</td></tr> <tr><td>dddd</td><td>a teljes honosított napnév (pl. „Hétfő” – „Vasárnap”)</td></tr> <tr><td>M</td><td>a hónap számként, kezdő nulla nélkül (1-12)</td></tr> <tr><td>MM</td><td>a hónap számként, kezdő nullával (01-12)</td></tr> <tr><td>MMM</td><td>a rövidített honosított hónapnév (pl. „jan.” – „dec.”)</td></tr> <tr><td>MMMM</td><td>a teljes honosított hónapnév (pl. „január” – „december”)</td></tr> <tr><td>yy</td><td>az év kétjegyű számként (00-99)</td></tr> <tr><td>yyyy</td><td>az év négyjegyű számként</td></tr> <tr><td>h</td><td>az óra kezdő nulla nélkül (0-tól 23-ig, vagy 1-től 12-ig AM/PM kijelzésnél)</td></tr> <tr><td>hh</td><td>az óra kezdő nullával (00-tól 23-ig, vagy 01-től 12-ig AM/PM kijelzésnél)</td></tr> <tr><td>H</td><td>az óra kezdő nulla nélkül (0-tól 23-ig, AM/PM kijelzés mellett is)</td></tr> <tr><td>HH</td><td>az óra kezdő nullával (00-tól 23-ig, AM/PM kijelzés mellett is)</td></tr> <tr><td>m</td><td>a perc kezdő nulla nélkül (0-tól 59-ig)</td></tr> <tr><td>mm</td><td>a perc kezdő nullával (00-tól 59-ig)</td></tr> <tr><td>s</td><td>a másodperc kezdő nulla nélkül (0-tól 59-ig)</td></tr> <tr><td>ss</td><td>a másodperc kezdő nullával (00-tól 59-ig)</td></tr> <tr><td>AP <i>vagy</i> A</td><td>délelőtt/délután (AM/PM) kijelzés. Az <b>A/AP</b> helyére az „AM” vagy „PM” kerül.</td></tr> <tr><td>ap <i>vagy</i> a</td><td>délelőtt/délután (am/pm) kijelzés. Az <b>a/ap</b> helyére az „am” vagy „pm” kerül.</td></tr> <tr><td>t</td><td>az időzóna (pl. „CEST”)</td></tr> <tr><td>T</td><td>eltérés az UTC-től</td></tr> <tr><td>TT</td><td>az időzóna IANA azonosítója</td></tr> <tr><td>TTT</td><td>az időzóna rövidítése</td></tr> <tr><td>TTTT</td><td>az időzóna rövid megjelenített neve</td></tr> <tr><td>TTTTT</td><td>az időzóna hosszú megjelenített neve</td></tr> <tr><td>TTTTTT</td><td>az időzóna egyéni neve. Ez a beállítási ablak „Időzónák” lapján módosítható.</td></tr></table> <br /><b>Megjegyzések:</b> <ul><li>A mintában minden olyan karakter, amely nem az ['a'..'z'] és ['A'..'Z'] tartományba esik, idézett szövegként lesz kezelve. Például az olyan karakterek, mint a „:”, „.”, „ ”, „#” és „@” megjelennek az eredményül kapott időszövegben akkor is, ha nincsenek szimpla idézőjelek közé zárva. A szimpla idézőjel a betűk „feloldására” (escape) szolgál. Két egymást követő szimpla idézőjel – akár idézett sorozaton belül, akár kívül – egy „valódi” szimpla idézőjelet jelent.</li><li>A minimális frissítési időköz 1 másodperc. Ha a z vagy zzz van beállítva, az idő ezredmásodperc pontossággal jelenik meg, de a frissítés nem ezredmásodperc alapú (a nagy teljesítményigény elkerülése érdekében).</li></ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Világóra időzónák Time zone Időzóna Name Név Comment Megjegyzés Country Ország UTC UTC Other Egyéb Local timezone Helyi idő ================================================ FILE: plugin-worldclock/translations/worldclock_id.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'JJ:mm:dd'</b><br/><font size="-2">'hhh, h BBBB tttt'<br/>'WT'</font>' LXQtWorldClockConfiguration World Clock Settings Pengaturan Jam Dunia Display &format &Format tampilan &Time Waktu F&ormat: F&ormat: Short Singkat Long Panjang Custom Kustom Sho&w seconds Tampilkan detik Pad &hour with zero Isi jam dengan nol T&ime zone Zona waktu &Position: &Posisi: For&mat: For&mat: Below Dibawah Above Diatas Before Sebelum After Sesudah Offset from UTC Offset dari UTC Abbreviation Singkatan IANA id IANA id Custom name Nama kustom &Use 12-hour format Gunakan format 12-jam Location identifier Pengenal lokasi &Date Tanggal Po&sition: Po&sisi: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Tampilkan tahun Show day of wee&k Tampilkan hari Pad d&ay with zero Isi hari dengan nol &Long month and day of week names Nama panjang dari bulan dan hari Ad&vanced manual format Format manual lanjutan &Customize ... Ubahsuai ... Time &zones Zona waktu &Add ... Tambah ... &Remove Hapus Set as &default Atur sebagai standar &Edit custom name ... Sunting nama kustom ... Move &up Pindah keatas Move do&wn Pindah kebawah Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Umum Auto&rotate when the panel is vertical Otomatis putar saat panelnya vertikal Show &week numbers in popup calendar Tunjukkan jumlah &minggu di kaleder popup S&how tooltip &Tunjukkan info alat (tooltip) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'JJ:mm:dd'</b><br/><font size="-2">'hhh, h BBBB tttt'<br/>'WT'</font>' Input custom time zone name Masukkan nama zona waktu kustom LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Manual Konfigurasi Format Jam Dunia <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Zona Waktu Jam Dunia Time zone Zona waktu Name Nama Comment Komentar Country Negara UTC UTC Other Lainnya Local timezone Zona waktu lokal ================================================ FILE: plugin-worldclock/translations/worldclock_it.desktop.yaml ================================================ Desktop Entry/Name: "Orologio mondiale" Desktop Entry/Comment: "Orologio con calendario e fusi orari diversi" ================================================ FILE: plugin-worldclock/translations/worldclock_it.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Impostazioni orologio mondiale Display &format &Aspetto &Time &Ora F&ormat: F&ormato: Short Breve Long Esteso Custom Personalizzato Sho&w seconds &Mostra secondi Pad &hour with zero Ora &con zero iniziale T&ime zone &Fuso orario &Position: &Posizione: For&mat: F&ormato: Below Sotto Above Sopra Before Prima After Dopo Offset from UTC Differenza da UTC Abbreviation Abbreviazione IANA id ID IANA Custom name Nome personalizzato &Use 12-hour format &Usa formato 12 ore Location identifier Nome località &Date &Data Po&sition: &Posizione: Fo&rmat: F&ormato: ISO 8601 ISO 8601 Show &year Mostra l'&anno Show day of wee&k Mostra &giorno della settimana Pad d&ay with zero Giorno &con zero iniziale &Long month and day of week names Nome &esteso per mese e giorno della settimana Ad&vanced manual format Formato avanzato &personalizzato &Customize ... &Personalizza... Time &zones Fu&si orari &Add ... &Aggiungi... &Remove &Rimuovi Set as &default &Imposta come predefinito &Edit custom name ... &Personalizza nome... Move &up Sposta in s&u Move do&wn Sposta in &giù Change displayed time zone with mouse wheel Cambia fuso orario mostrato con la rotellina <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Nota:</b>Clic con il tasto centrale del mouse sull'orologio per visualizzare l'ora e la data per tutti i fusi orari configurati. &General &Generale Auto&rotate when the panel is vertical &Ruota automaticamente se il pannello è verticale Show &week numbers in popup calendar Mostra il &numero della settimana nel calendario pop-up S&how tooltip &Mostra tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Nome personalizzato del fuso orario LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configurazione del formato personalizzato dell'orologio globale <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Sintassi personalizzata per Data e Ora</h1> <p>Un modello di data è una stringa di caratteri, in cui caratteri specifici vengono sostituite con quelle di data e ora da un calendario durante la formattazione.</p> <p>La Tabella dei Simboli del Campo Data seguente contiene i caratteri utilizzati nei modelli per mostrare i formati appropriati per una data locale, ad esempio aaaa per l'anno. I caratteri possono essere utilizzati più volte. Ad esempio, se y è utilizzato per l'anno, "yy" potrebbe produrre "99", mentre "yyyy" restituirà "1999". Per la maggior parte dei campi numerici, il numero di caratteri specifica la larghezza del campo. Ad esempio, se h è l'ora, "h" potrebbe produrre "5", ma "hh" restituirà "05". Per alcuni caratteri, il conteggio specifica se deve essere utilizzata una forma abbreviata o completa, ma può avere altre scelte, come indicato di seguito.</p> <p>Due virgolette singole rappresentano una virgoletta singola letterale, all'interno o all'esterno di virgolette singole. Il testo all'interno di virgolette singole non viene interpretato in alcun modo (ad eccezione di due virgolette singole adiacenti). Altrimenti tutte le lettere ASCII dalla a alla z dalla A alla Z sono riservate come caratteri di sintassi e richiedono la citazione se devono rappresentare caratteri letterali. Inoltre, alcuni caratteri di punteggiatura ASCII potrebbero diventare variabili in futuro (ad es. ":" Interpretato come separatore dell'ora e "/" come separatore della data e sostituito dai rispettivi caratteri sensibili alle impostazioni internazionali sul display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Codice</th><th>Significato</th></tr> <tr><td>d</td><td>Il giorno come numero senza zero iniziale (1 a 31)</td></tr> <tr><td>dd</td><td>Il giorno come numero con uno zero iniziale (01 a 31)</td></tr> <tr><td>ddd</td><td>Il nome abbreviato localizzato (p.e. 'Lun' a 'Dom').</td></tr> <tr><td>dddd</td><td>Il nome completo localizzato (p.e. 'Lunedì' a 'Domenica').</td></tr> <tr><td>M</td><td>Il mese come numero senza zero iniziale (1-12)</td></tr> <tr><td>MM</td><td>Il mese come numero con uno zero iniziale (01-12)</td></tr> <tr><td>MMM</td><td>Il nome abbreviato del mese localizzato (p.e. 'Gen' a 'Dec')</td></tr> <tr><td>MMMM</td><td>In nome completo del mese localizzato (p.e. 'Gennaio' a 'Dicembre')</td></tr> <tr><td>yy</td><td>L'anno in due numeri (00-99)</td></tr> <tr><td>yyyy</td><td>L'anno in quattro numeri</td></tr> <tr><td>h</td><td>L'ora senza zero iniziale (0 a 23 o 1 a 12 con AM/PM)</td></tr> <tr><td>hh</td><td>L'ora con uno zero iniziale (00 a 23 o 01 a 12 con AM/PM)</td></tr> <tr><td>H</td><td>L'ora senza zero iniziale (0 a 23, anche con AM/PM)</td></tr> <tr><td>HH</td><td>L'ora con uno zero iniziale (00 to 23, anche con AM/PM)</td></tr> <tr><td>m</td><td>Il minuto senza zero iniziale (0 a 59)</td></tr> <tr><td>mm</td><td>Il minuto con uno zero iniziale (00 a 59)</td></tr> <tr><td>s</td><td>Il secondo senza uno zero iniziale (0 a 59)</td></tr> <tr><td>ss</td><td>Il secondo con uno zero iniziale (00 a 59)</td></tr> <tr><td>AP <i>o</i> A</td><td>Usa visualizzazione AM/PM. <b>A/AP</b> sarà sostituito con "AM" o "PM"</td></tr> <tr><td>ap <i>o</i> a</td><td>Usa visualizzazione am/pm. <b>a/ap</b> sarà sostituito con "am" o "pm"</td></tr> <tr><td>t</td><td>Il fuso orario (p.e. "CEST")</td></tr> <tr><td>T</td><td>La differenza a UTC</td></tr> <tr><td>TT</td><td>L'id del fuso orario IANA</td></tr> <tr><td>TTT</td><td>L'abbreviazione del fuso orario</td></tr> <tr><td>TTTT</td><td>Il nome abbreviato del fuso orario</td></tr> <tr><td>TTTTT</td><td>Il nome completo del fuso orario</td></tr> <tr><td>TTTTTT</td><td>Il nome personalizzato del fuso orario. E' possibile modificarlo nella scheda 'Fusi orari' nella finestra di configurazione.</td></tr></table> <br /><b>Note:</b> <ul><li>Qualsiasi carattere nel modello che non si trova negli intervalli di ['a' .. 'z'] e ['A' .. 'Z'] verrà trattato come testo citato. Ad esempio, caratteri come ":", ".", "", "#" e "@" appariranno nel orologio anche se non sono racchiusi tra virgolette singole. La virgoletta singola viene utilizzata per "sfuggire" alle lettere. Due virgolette singole di seguito, sia all'interno che all'esterno di una sequenza tra virgolette, rappresentano una virgoletta singola "reale".</li><li>L'intervallo di aggiornamento minimo è 1 secondo. Se è configurato z or zzz l'ora viene mostrata con la frazione di millisecondi ma non verrà aggiornata in questo ritmo per (evitando un grande impatto sulle prestazioni).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fusi orari dell'orologio mondiale Time zone Fuso orario Name Nome Comment Commento Country Nazione UTC UTC Other Altro Local timezone Fuso Orario locale ================================================ FILE: plugin-worldclock/translations/worldclock_ja.desktop.yaml ================================================ Desktop Entry/Name: "世界時計" Desktop Entry/Comment: "カレンダーとタイムゾーンと時計を表示します" ================================================ FILE: plugin-worldclock/translations/worldclock_ja.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'yyyy/M/d (ddd)'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings 世界時計の設定 Display &format 表示形式(&F) &Time 時刻(&T) F&ormat: 形式(&O): Short 短い Long 長い Custom 指定する Sho&w seconds 秒を表示する(&W) Pad &hour with zero 時が 1 桁のとき 0 で埋める(&H) &Use 12-hour format 12 時間制で表示する(&U) T&ime zone タイムゾーン(&I) &Position: 位置(&P): For&mat: 形式(&M): Below Above Before After Offset from UTC UTC からの時差 Abbreviation 短縮形 Location identifier ロケーション ID IANA id IANA ID Change displayed time zone with mouse wheel 表示されているタイムゾーンをマウスホイールで変更する <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>注:</b> 時計を中クリックすると設定されている全てのタイムゾーンの日時が表示されます。 Show &week numbers in popup calendar ポップアップするカレンダーに週番号を表示する(&W) S&how tooltip ツールチップを表示する(&H) Custom name カスタム名 &Date 日付(&D) Po&sition: 位置(&S): Fo&rmat: 形式(&R): ISO 8601 ISO 8601 Show &year 年を表示する(&Y) Show day of wee&k 曜日を表示する(&K) Pad d&ay with zero 日が 1 桁のとき 0 で埋める(&A) &Long month and day of week names 月や曜日を長い名前で表示する(&L) Ad&vanced manual format 形式を詳しく指定する(&V) &Customize ... 指定(&C) ... Time &zones タイムゾーン(&Z) &Add ... 追加(&A) ... &Remove 削除(&R) Set as &default 既定として設定(&D) &Edit custom name ... カスタム名の編集(&E) ... Move &up 上へ移動(&U) Move do&wn 下へ移動(&W) &General 全般(&G) Auto&rotate when the panel is vertical パネルが垂直ならば回転させる(&R) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'yyyy/M/d (ddd)'<br/>'TT'</font>' Input custom time zone name タイムゾーンのカスタム名を入力 LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration 世界時計 手動で形式の設定 <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>カスタム日付時刻形式の構文</h1> <p>日付パターンは文字列です。解析時にはカレンダー時計からデータを生成・フォーマットされ、特定の文字列がカレンダー時計の日付と時刻のデータに置き換わります。</p> <p> 以下の日付フィールドの記号表には、年の yyyy など、特定の場所に適した形式を表すためのパターンの文字列があります。 文字は複数回使用できます。例えば、y が年に使用されている場合、 yy は 99 を生成しますが、 yyyy は 1999 を生成します。 ほとんどの数値フィールドでは、文字数がフィールド幅を指定します。 例えば、時刻の h の場合、 h は 5 を生成しますが、 hh は 05 を生成します。 一部の文字では、この文字の並びの数は省略形か完全形のどちらを使用するかを指定しますが、以下の表に示すように他の使用方法もあります。 </p><p> 2 つの連続した一重引用符は、文字内か外側の 1 つの一重引用符を表します。 一重引用符内のテキストは、変換されません(隣接する 2 つの引用符を除く)。 それ以外の場合、 a から z および A から Z までの全ての ASCII 文字は形式の文字として予約されており、文字自身を表す場合は引用符が必要です。 さらに、特定の ASCII 記号は将来変更になる可能性があります(例: ":" は時刻の区切り文字として、 '/' は日付の区切り文字としてみられ、それぞれのロケール依存文字に置き換えられます)。 <br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">記号</th><th>意味</th></tr> <tr><td> d</td><td>日(1〜31)先頭に 0 を付けない数字</td></tr> <tr><td>dd</td><td>日(01〜31)先頭に 0 を付けた数字</td></tr> <tr><td>ddd</td><td>ローカライズされた曜日の短縮名(例: '月'~'日')。</td></tr> <tr><td>dddd</td><td>ローカライズされた長い曜日名(例: '月曜日'~'日曜日')。</td></tr> <tr><td> M </ td><td>月(1〜12)先頭に 0 を付けない数字</td></tr> <tr><td> MM </ td><td>月(01〜12)先頭に 0 を付けた数字</td></tr> <tr><td> MMM</td><td>ローカライズされた月の省略名(例: '1月'~'12月')。</td></tr> <tr><td> MMMM</td><td>ローカライズされた長い月の名前(例: '1月'~'12月')。(訳注: 日本語では MMM と MMMM は同じ表示のようです)</td></tr> <tr><td>yy</td><td>年 2 桁の数字(00〜99)</td></tr> <tr><td> yyyy</td><td>年 4 桁の数字</td></tr> <tr><td>h</td><td>時刻(0〜23、または午前/午後を表示する場合は 1〜12)先頭に 0 なし</td></tr> <tr><td>hh</td><td>時刻(00〜23、または午前/午後を表示する場合は 01〜12)先頭に 0 が付く</td></tr> <tr><td>H</td><td>時刻(午前/午後の表示でも 0〜23)先頭に 0 なし</td></tr> <tr><td>HH</td><td>時刻(午前/午後の表示でも 00〜23)先頭に 0 が付く</td></tr> <tr><td> m</td><td>分(0〜59)先頭に 0 なし</td></tr> <tr><td> mm</td><td>分(00~59)先頭に 0 が付く</td></tr> <tr><td> s</td><td>秒(0〜59)先頭に 0 なし</td></tr> <tr><td>ss</td><td>秒(00〜59)先頭に 0 が付く</td></tr> <tr><td> AP <i>または</i> A </td><td>午前/午後の表示に使用します。 <b> A/AP </b>は "AM" または "PM" に置き換えられます。</td></tr> <tr><td> ap <i>または</i> a </td><td>午前/午後の表示に使用します。 <b> a/ap </b>は "am" または "pm" に置き換えられます。(訳注: 日本語では AP と ap はどちらも"午前"または"午後"に置き換えられるようです)</td></tr> <tr><td>t</td><td>タイムゾーン(例: "JST")</td></tr> <tr><td> T</td><td> UTC (世界協定時) からの時差</td></tr> <tr><td>TT</td><td>タイムゾーンの IANA ID </td></tr> <tr><td>TTT</td><td>タイムゾーンの省略形</td></tr> <tr><td>TTTT</td><td>タイムゾーンの短い表示名</td></tr> <tr><td>TTTTT</td><td>タイムゾーンの長い表示名</td></tr> <tr><td>TTTTTT</td><td>タイムゾーンのカスタム名。設定ウィンドウの [タイムゾーン] タブで変更できます。</td></tr></table> <br /><b>注意:</b> <ul><li> パターン内の ['a' .. 'z'] と ['A' .. 'Z'] の範囲内にない文字は引用テキストとして扱われます。 たとえば、':', '.', ' ', '#', '@' などの文字は、一重引用符 (') で囲まれていなくても、結果のテキストに表示されます。 一重引用符 (') は、文字を<b>エスケープする</b>ために使用されます。行内の 2 つの連続した一重引用符は、引用符付き文字列の内側でも外側でも、<b>実際の</b> 1 つの一重引用符を表します。 </li><li> 最小の更新間隔は 1 秒です。 z または zzz が設定されている場合、時刻はミリ秒単位で表示されますが、ミリ秒単位では更新されません(大きなパフォーマンスの低下を避けるため)。 </li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones 世界時計のタイムゾーン Time zone タイムゾーン Name 名称 Comment 備考 Country 国名 UTC 協定世界時 Other その他 Local timezone ローカルのタイムゾーン ================================================ FILE: plugin-worldclock/translations/worldclock_ka.desktop.yaml ================================================ Desktop Entry/Name: "მსოფლიო საათი" Desktop Entry/Comment: "აჩვენებს საათს კალენდრითა და დროის სარტყლებით" ================================================ FILE: plugin-worldclock/translations/worldclock_ka.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'სთ:წთ:წმ'</b><br/><font size="-2">'დღე, დ თვე წელი'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings მსოფლიო საათის მორგება Display &format ჩვენების &ფორმატი &Time &დრო F&ormat: &ფორმატი: Short მოკლე Long გრძელი Custom მომხმარებლის Sho&w seconds &წამების ჩვენება Pad &hour with zero ასოების &შევსება ნულებით T&ime zone დრო&ის სარტყელი &Position: &მდებარეობა: For&mat: &ფორმატი: Below ქვემოდან Above ზემოდან Before წინ After შემდეგ Offset from UTC წანაცვლება UTC-დან Abbreviation აბრევიატურა IANA id IANA id Custom name ხელით მითითებული სახელი &Use 12-hour format 12 საათიანი ფორმატის გამო&ყენება Location identifier მდებარეობის იდენტიფიკატორი &Date &თარიღი Po&sition: მდებარეო&ბა: Fo&rmat: ფო&რმატი: ISO 8601 ISO 8601 Show &year &წლის ჩვენება Show day of wee&k &კვირის დღის ჩვენება Pad d&ay with zero დღის შევსებ&ა ნულებით &Long month and day of week names გრძე&ლი თვისა და კვირის დღეების სახელები Ad&vanced manual format დამატებითი მორგებული ფორმა&ტი &Customize ... &მორგება... Time &zones &დროის სარტყლები &Add ... &დამატება ... &Remove &წაშლა Set as &default ნაგულისხმევად &დაყენება &Edit custom name ... მორგებული სახ&ელის ცასწორება... Move &up &აწევა Move do&wn &ჩამოტანა Change displayed time zone with mouse wheel ნაჩვენები დროის სარტყლის შეცვლა თაგუნას ბორბლით <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>შენიშვნა:</b> შუა წკაპი საათზე, რომ იხილოთ დრო და თარიღი ყველა მორგებული დროის სარტყლისთვის. &General &ზოგადი Auto&rotate when the panel is vertical ავტომობ&რუნება, როცა პანელი ვერტიკალურია Show &week numbers in popup calendar კვირის ნომრების ჩვენება მხტუნარა კალენდარში S&how tooltip მინიშნების ჩვენე&ბა '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'სთ:წთ:წმ'</b><br/><font size="-2">'დღე, დ თვე წელი'<br/>'TT'</font>' Input custom time zone name შეიყვანეთ მორგებული დროის სარტყლის სახელი LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration მსოფლიო საათის მორგებული ფორმატის მორგება <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Custom Date/Time Format Syntax(კეთილი ინებეთ და წაიკითხეთ ეს ინგლისურად)</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones მსოფლიო საათის დროის სარტყლები Time zone დროის სარტყელი Name სახელი Comment კომენტარი Country ქვეყანა UTC UTC Other სხვა Local timezone ლოკალური დროის სარტყელი ================================================ FILE: plugin-worldclock/translations/worldclock_kab.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Rnu… &Remove Set as &default &Edit custom name ... Move &up Move do&wn <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Isem Comment Awennit Country Tamurt UTC UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_kk.desktop.yaml ================================================ Desktop Entry/Name: "Дүниежүзілік уақыт" Desktop Entry/Comment: "Дүниежүзілік уақыт плагині" ================================================ FILE: plugin-worldclock/translations/worldclock_kk.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Дүниежүзілік сағат баптаулары Display &format Көрсетілу &пішімі &Time &Уақыт F&ormat: &Пішімі: Short Қысқа Long Ұзын Custom Таңдауыңызша Sho&w seconds Секундтарды көр&сету Pad &hour with zero &Сағатты нөлмен толықтыру T&ime zone Уақыт &белдеуі &Position: &Орны: For&mat: Пі&шімі: Below Төменде Above Үстінде Before Дейін After Кейін Offset from UTC UTC-ден ығысу Abbreviation Аббревиатура IANA id IANA идентификаторы Custom name Өз атауыңыз &Use 12-hour format 12 сағаттық пішімді қолд&ану Location identifier Орналасу идентификаторы &Date &Күн Po&sition: Ор&ны: Fo&rmat: Пі&шімі: ISO 8601 ISO 8601 Show &year &Жылды көрсету Show day of wee&k Апта кү&нін көрсету Pad d&ay with zero Кү&нді нөлмен толықтыру &Long month and day of week names Ай мен апта &күнінің ұзын атаулары Ad&vanced manual format Кеңейтілген қо&лмен пішімдеу &Customize ... &Баптау ... Time &zones Уақыт &белдеулері &Add ... Қ&осу ... &Remove Ө&шіру Set as &default Ә&депкі ретінде орнату &Edit custom name ... Таңдаулы атын &түзету ... Move &up Ж&оғары жылжыту Move do&wn Тө&мен жылжыту Change displayed time zone with mouse wheel Көрсетілген уақыт белдеуін тышқан дөңгелегімен өзгерту <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Ескертпе:</b> Барлық бапталған уақыт белдеулерінің уақыты мен күнін көру үшін сағатқа ортаңғы батырмамен шертіңіз. &General &Жалпы Auto&rotate when the panel is vertical Панель вертикалды болғанда авто-&бұру Show &week numbers in popup calendar Қалқымалы күнтізбеде апта &нөмірлерін көрсету S&how tooltip Кеңесті &көрсету '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Таңдаулы уақыт белдеуінің атын енгізу LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Дүниежүзілік сағаттың қолмен пішімдеу конфигурациясы <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Таңдаулы күн/уақыт пішімінің синтаксисі</h1> <p>Күн үлгісі — таңбалар жолы, мұнда пішімдеу кезінде белгілі бір таңбалар жолы күнтізбеден алынған күн және уақыт деректерімен ауыстырылады немесе талдау кезінде күнтізбе үшін деректерді жасауға пайдаланылады.</p> <p>Төмендегі күн өрісінің таңбалар кестесінде берілген жергілікті нұсқа үшін сәйкес пішімдерді көрсету үшін үлгілерде қолданылатын таңбалар бар, мысалы, жыл үшін yyyy. Таңбалар бірнеше рет қолданылуы мүмкін. Мысалы, егер y жыл үшін қолданылса, 'yy' '99' нәтижесін беруі мүмкін, ал 'yyyy' '1999' береді. Көптеген сандық өрістер үшін таңбалар саны өріс енін көрсетеді. Мысалы, егер h сағат болса, 'h' '5' нәтижесін беруі мүмкін, бірақ 'hh' '05' береді. Кейбір таңбалар үшін сан қысқартылған немесе толық пішімнің қолданылатынын көрсетеді, бірақ төменде берілгендей басқа таңдаулар болуы мүмкін.</p> <p>Екі жалқы тырнақша жалқы тырнақшаның өзін білдіреді (тырнақша ішінде немесе сыртында). Жалқы тырнақша ішіндегі мәтін ешқандай жолмен түсіндірілмейді (екі іргелес жалқы тырнақшадан басқа). Әйтпесе, a-дан z-ге дейінгі және A-дан Z-ге дейінгі барлық ASCII әріптері синтаксистік таңбалар ретінде сақталады және олар әріп ретінде көрсетілуі үшін тырнақшаға алынуы керек. Сонымен қатар, кейбір ASCII тыныс белгілері болашақта айнымалы болуы мүмкін (мысалы, ":" уақыт ажыратқышы ретінде және "/" күн ажыратқышы ретінде түсіндіріліп, көрсету кезінде тиісті жергілікті таңбалармен ауыстырылады).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Код</th><th>Мағынасы</th></tr> <tr><td>d</td><td>күн, алдыңғы нөлсіз сан ретінде (1-ден 31-ге дейін)</td></tr> <tr><td>dd</td><td>күн, алдыңғы нөлі бар сан ретінде (01-ден 31-ге дейін)</td></tr> <tr><td>ddd</td><td>қысқартылған жергілікті апта күнінің аты (мысалы, 'Дүй' - 'Жек').</td></tr> <tr><td>dddd</td><td>толық жергілікті апта күнінің аты (мысалы, 'Дүйсенбі' - 'Жексенбі').</td></tr> <tr><td>M</td><td>ай, алдыңғы нөлсіз сан ретінде (1-12)</td></tr> <tr><td>MM</td><td>ай, алдыңғы нөлі бар сан ретінде (01-12)</td></tr> <tr><td>MMM</td><td>қысқартылған жергілікті ай аты (мысалы, 'Қаң' - 'Жел').</td></tr> <tr><td>MMMM</td><td>толық жергілікті ай аты (мысалы, 'Қаңтар' - 'Желтоқсан').</td></tr> <tr><td>yy</td><td>жыл, екі таңбалы сан ретінде (00-99)</td></tr> <tr><td>yyyy</td><td>жыл, төрт таңбалы сан ретінде</td></tr> <tr><td>h</td><td>сағат, алдыңғы нөлсіз (0-ден 23-ке дейін немесе AM/PM болса 1-ден 12-ге дейін)</td></tr> <tr><td>hh</td><td>сағат, алдыңғы нөлі бар (00-ден 23-ке дейін немесе AM/PM болса 01-ден 12-ге дейін)</td></tr> <tr><td>H</td><td>сағат, алдыңғы нөлсіз (0-ден 23-ке дейін, тіпті AM/PM болса да)</td></tr> <tr><td>HH</td><td>сағат, алдыңғы нөлі бар (00-ден 23-ке дейін, тіпті AM/PM болса да)</td></tr> <tr><td>m</td><td>минут, алдыңғы нөлсіз (0-ден 59-ға дейін)</td></tr> <tr><td>mm</td><td>минут, алдыңғы нөлі бар (00-ден 59-ға дейін)</td></tr> <tr><td>s</td><td>секунд, алдыңғы нөлсіз (0-ден 59-ға дейін)</td></tr> <tr><td>ss</td><td>секунд, алдыңғы нөлі бар (00-ден 59-ға дейін)</td></tr> <tr><td>AP <i>немесе</i> A</td><td>AM/PM көрсетілімін қолдану. <b>A/AP</b> не "AM" немесе "PM" мәнімен ауыстырылады.</td></tr> <tr><td>ap <i>немесе</i> a</td><td>am/pm көрсетілімін қолдану. <b>a/ap</b> не "am" немесе "pm" мәнімен ауыстырылады.</td></tr> <tr><td>t</td><td>уақыт белдеуі (мысалы, "CEST")</td></tr> <tr><td>T</td><td>UTC-ден ығысу</td></tr> <tr><td>TT</td><td>уақыт белдеуінің IANA идентификаторы</td></tr> <tr><td>TTT</td><td>уақыт белдеуінің аббревиатурасы</td></tr> <tr><td>TTTT</td><td>уақыт белдеуінің қысқаша көрсетілетін аты</td></tr> <tr><td>TTTTT</td><td>уақыт белдеуінің толық көрсетілетін аты</td></tr> <tr><td>TTTTTT</td><td>уақыт белдеуінің таңдаулы аты. Оны баптау терезесінің 'Уақыт белдеулері' бетінде өзгертуге болады</td></tr></table> <br /><b>Ескертпелер:</b> <ul><li>Үлгідегі ['a'..'z'] және ['A'..'Z'] ауқымына жатпайтын кез келген таңбалар тырнақшаға алынған мәтін ретінде қарастырылады. Мысалы, ':', '.', ' ', '#' және '@' сияқты таңбалар жалқы тырнақшаға алынбаса да нәтижелі уақыт мәтінінде пайда болады. Жалқы тырнақша әріптерді 'экрандау' үшін қолданылады. Қатар тұрған екі жалқы тырнақша, тырнақшаға алынған кезектің ішінде немесе сыртында болсын, 'нақты' жалқы тырнақшаны білдіреді.</li><li>Минималды жаңарту аралығы — 1 секунд. Егер z немесе zzz бапталса, уақыт миллисекунд бөлшегімен көрсетіледі, бірақ миллисекунд негізінде жаңартылмайды (үлкен өнімділік жоғалуын болдырмау үшін).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Дүниежүзілік сағаттың уақыт белдеулері Time zone Уақыт белдеуі Name Аты Comment Түсіндірме Country Ел UTC UTC Other Басқа Local timezone Жергілікті уақыт белдеуі ================================================ FILE: plugin-worldclock/translations/worldclock_ko.desktop.yaml ================================================ Desktop Entry/Name: "세계 시계" Desktop Entry/Comment: "달력 및 시간대가 있는 시계를 표시합니다" ================================================ FILE: plugin-worldclock/translations/worldclock_ko.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'yyyy MMM ddd, d'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings 세계 시계 설정 Display &format 표시 형식(&F) &Time 시간(&T) F&ormat: 형식(&O): Short 짧은 Long Custom 사용자 지정 Sho&w seconds 초 표시(&W) Pad &hour with zero 패드 시간 0으로(&H) T&ime zone 시간대(&I) &Position: 위치(&P): For&mat: 형식(&M): Below 아래 Above Before After Offset from UTC UTC에서 오프셋 Abbreviation 약어 IANA id IANA id Custom name 사용자 지정 이름 &Use 12-hour format 12시간 형식 사용(&U) Location identifier 위치 식별자 &Date 날짜(&D) Po&sition: 위치(&S): Fo&rmat: 형식(&R): ISO 8601 ISO 8601 Show &year 연도 표시(&Y) Show day of wee&k 요일 표시(&K) Pad d&ay with zero 앞에 0이 있는 날(&A) &Long month and day of week names 긴 월 및 요일 이름(&L) Ad&vanced manual format 고급 수동 형식(&V) &Customize ... 사용자 정의(&C) ... Time &zones 시간대(&Z) &Add ... 추가하기(&A) ... &Remove 제거하기(&R) Set as &default 기본값으로 지정(&D) &Edit custom name ... 사용자 지정 이름 편집하기(&E) ... Move &up 위로 이동(&U) Move do&wn 아래로 이동(&W) Change displayed time zone with mouse wheel 마우스 휠로 표시된 시간대 변경하기 <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>참고:</b> 시계를 마우스 가운데로 클릭하여 구성된 모든 시간대의 시간과 날짜를 확인합니다. &General 일반(&G) Auto&rotate when the panel is vertical 패널이 수직일 때 자동 회전(&R) Show &week numbers in popup calendar 팝업 달력에 주 번호 표시(&W) S&how tooltip 툴팁 표시(&H) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'yyyy MMM ddd, d'<br/>'TT'</font>' Input custom time zone name 사용자 지정 시간대 이름 입력 LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration 세계 시계 수동 형식 구성 <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>사용자 지정 날짜/시간 형식 구문</h1> <p>날짜 패턴은 형식을 지정할 때 특정 문자열이 달력의 날짜 및 시간 데이터로 대체되거나 구문 분석할 때 달력에 대한 데이터를 생성하는 데 사용되는 문자열입니다.</p> <p>아래의 날짜 필드 기호 테이블에는 연도의 yyyy와 같이 주어진 로케일에 적절한 형식을 표시하기 위해 패턴에 사용되는 문자가 포함되어 있습니다. 문자는 여러 번 사용할 수 있습니다. 예를 들어, y가 연도에 사용되는 경우 'yy'는 '99'를 생성하고 'yyyy'는 '1999'를 생성할 수 있습니다. 대부분의 숫자 필드의 경우 문자 수가 필드 너비를 지정합니다. 예를 들어, h가 시간인 경우 'h'는 '5'를 생성하지만 'hh'는 '05'를 생성합니다. 일부 문자의 경우 개수는 약어 또는 전체 형식을 사용해야 하는지 여부를 지정하지만 아래와 같이 다른 선택이 있을 수 있습니다.</p> <p>작은 따옴표 두 개는 작은 따옴표 내부 또는 외부에 있는 리터럴 작은 따옴표를 나타냅니다. 작은따옴표 안에 있는 텍스트는 어떤 식으로든 해석되지 않습니다(인접한 두 개의 작은따옴표 제외). 그렇지 않으면 a에서 z 및 A에서 Z까지의 모든 ASCII 문자가 구문 문자로 예약되어 있으며 리터럴 문자를 나타내려면 따옴표가 필요합니다. 또한 특정 ASCII 문장 부호 문자는 나중에 변경될 수 있습니다(예: ":"는 시간 구분 기호로, '/'는 날짜 구분 기호로 해석되며 디스플레이에서 각각의 로케일 구분 문자로 대체됨).<br />< /p> <테이블 테두리="1" 너비="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">코드</th><th>의미</th></tr> <tr><td>d</td><td>앞에 0이 없는 숫자(1에서 31까지)</td></tr> <tr><td>dd</td><td>앞에 0이 있는 숫자로 된 요일(01에서 31까지)</td></tr> <tr><td>ddd</td><td>지역화된 요일의 축약형(예: '월'에서 '일'까지).</td></tr> <tr><td>dddd</td><td>긴 현지화된 요일 이름(예: '월요일'에서 '일요일'까지).</td></tr> <tr><td>M</td><td>앞에 0이 없는 숫자로 된 월(1-12)</td></tr> <tr><td>MM</td><td>앞에 0이 있는 숫자로 된 월(01-12)</td></tr> <tr><td>MMM</td><td>현지화된 약식 월 이름(예: 'Jan'에서 'Dec'까지).</td></tr> <tr><td>MMMM</td><td>긴 현지화된 월 이름(예: '1월'에서 '12월'까지).</td></tr> <tr><td>yy</td><td>연도를 두 자리 숫자(00-99)로 표시</td></tr> <tr><td>yyyy</td><td>4자리 숫자로 된 연도</td></tr> <tr><td>h</td><td>앞에 0이 없는 시간(AM/PM이 표시되는 경우 0에서 23 또는 1에서 12)</td></tr> <tr><td>hh</td><td>0이 앞에 오는 시간(AM/PM이 표시되는 경우 00에서 23 또는 01에서 12)</td></tr> <tr><td>H</td><td>앞에 0이 없는 시간(0에서 23까지, AM/PM 표시가 있는 경우에도)</td></tr> <tr><td>HH</td><td>앞에 0이 있는 시간(AM/PM 표시가 있는 경우에도 00에서 23까지)</td></tr> <tr><td>m</td><td>앞에 0이 없는 분(0 ~ 59)</td></tr> <tr><td>mm</td><td>앞에 0이 있는 분(00 ~ 59)</td></tr> <tr><td>s</td><td>앞에 0이 없는 초(0 ~ 59)</td></tr> <tr><td>ss</td><td>0이 앞에 오는 초(00 ~ 59)</td></tr> <tr><td>AP <i>또는</i> A</td><td>AM/PM 디스플레이를 사용합니다. <b>A/AP</b>는 "AM" 또는 "PM"으로 대체됩니다.</td></tr> <tr><td>ap <i>또는</i></td><td>am/pm 디스플레이를 사용합니다. <b>a/ap</b>은 "am" 또는 "pm"으로 대체됩니다.</td></tr> <tr><td>t</td><td>시간대(예: "CEST")</td></tr> <tr><td>T</td><td>UTC에서의 오프셋</td></tr> <tr><td>TT</td><td>시간대 IANA ID</td></tr> <tr><td>TTT</td><td>시간대 약어</td></tr> <tr><td>TTTT</td><td>시간대 짧은 표시 이름</td></tr> <tr><td>TTTTT</td><td>시간대 긴 표시 이름</td></tr> <tr><td>TTTTTT</td><td>시간대 사용자 정의 이름. 구성 창의 '시간대' 탭에서 변경할 수 있습니다.</td></tr></table> <br /><b>참고:</b> <ul><li>['a'..'z'] 및 ['A'..'Z'] 범위에 없는 패턴의 모든 문자는 인용된 텍스트로 처리됩니다. 예를 들어, ':', '.', ' ', '#' 및 '@'와 같은 문자는 작은 따옴표로 묶이지 않아도 결과 시간 텍스트에 나타납니다. 작은 따옴표는 문자를 '이스케이프'하는 데 사용됩니다. 따옴표로 묶인 시퀀스의 내부 또는 외부에 있는 연속된 두 개의 작은따옴표는 '실제' 작은따옴표를 나타냅니다.</li><li>최소 업데이트 간격은 1초입니다. z 또는 zzz가 구성된 경우 시간이 밀리초 단위로 표시되지만 밀리초 단위로 업데이트되지 않습니다(큰 성능 저하 방지).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones 세계 시계 시간대 Time zone 시간대 Name 이름 Comment 주석 Country 국가 UTC UTC Other 기타 Local timezone 현지 시간대 ================================================ FILE: plugin-worldclock/translations/worldclock_lg.desktop.yaml ================================================ Desktop Entry/Name: "Saawa ya Nsi Yonna" Desktop Entry/Comment: "Ekulaga essaawa era esobola okukulaga n'ekitundu ky'ensi kya\ \ zo, omwaka, n'ennaku z'omwezi" ================================================ FILE: plugin-worldclock/translations/worldclock_lg.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Nteekateeka za Saawa ya Nsi Yonna Display &format &Endabika ya saawa &Time &Ssaawa F&ormat: E&mpandika: Short Mu bufunze Long Mu bujjuvu Custom Gyewetegekera Sho&w seconds Laga s&ikonda Pad &hour with zero Ess&aawa ez'ennamba emu yokka ziteekeko zero ekulembera T&ime zone Essaawa ezi&kozesebwa &Position: &We ziwandikibwa: For&mat: E&mpandika ya zo: Below Wansi w'essaawa Above Waggulu w'essaawa Before Zikulembere ssaawa After Ziddirire essaawa Offset from UTC Nga enjawulo ku UTC Abbreviation Nga erinnya effunze IANA id Nga erinnya eriva mu IANA Custom name Nga erinnya lwe weyiiyiza &Use 12-hour format Ko&zesa empandika ya saawa 12 Location identifier Nga ekiraga ekifo &Date La&ga nnaku za mwezi Po&sition: We zi&naalabikira: Fo&rmat: Em&pandika ya zo: ISO 8601 ISO 8601 Show &year &Laga mwaka Show day of wee&k Laga l&unaku lwa wiiki Pad d&ay with zero Ennamba &y'olunaku eya digiti emu giteekeko zero ekulembera &Long month and day of week names Amannya g'emyezi n'ennaku za wiiki gawandike mu bu&jjuvu Ad&vanced manual format Empandika y'obudde giteekateeke na bino ebyetaagisa obumanyiri&vu &Customize ... Wetegeke&re empandika... Time &zones Essaawa e&zikozeseka &Add ... &Londayo... &Remove K&igyemu Set as &default Zifuule eza &bulijjo &Edit custom name ... &Kyetegekere erinnya... Move &up &Yambusa Move do&wn &Ssa Change displayed time zone with mouse wheel Kozesa namuziga ya ku kasongesebwa okukyusa essaawa ezikozesebwa eziragibwa <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Genderera:</b> Akasonga bw'okateeka ku ssaawa n'onyiga eppeesa ly'akasongesebwa erya wakati ekulaga obudde n'ennaku ebya mu buli ttwale ly'obudde eritegekedwa ku sisitemu yo. &General E&bya wamu Auto&rotate when the panel is vertical &Essaawa yetereeze olubaawo bwe lubeera busimbalaala Show &week numbers in popup calendar &Kalenda erage n'ennamba za wiiki S&how tooltip &Akaboozi ak'ongera okutangaaza kabonekenga '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Wandika erinnya ly'e weyiiyizza LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Kweteekateekera empandika ya mu Saawa ya Nsi Yonna <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Amateeka agafuga empandika y'ennaku n'essaawa gye weteekateekera</h1> <p>Olutiba lw'empandika y'essaawa n'ennaku zibeera ennukuta engattike eziraga aw'okuwandika oba okusoma ebipimo by'obudde mu mboozi oba mu data eya kompyuta. Mu bibalibwa ng'ebipimo by'obudde mwe muli sikonda, ddakiika, saawa, nnaku, myezi, myaka, byaasa n'ebipimo ebirala okutuukira ddala ku mirembe.</p> <p>Endagiriro edda ku bino ekulaga ennukuta ezeyambisibwa mu kutegeka entiba ez'empandika y'essaawa n'ennaku era n'ekulaga amakulu n'enkozesa bya go.</p> <p>Olutiba lusobola okuzingiramu ebigambo byennyini nga ennukuta za byo zo ssi biragiro wabula ekigambo kya kulabikira muli mu ssaawa n'ennaku ebiwandikidwa oba ebisomedwa kompyuta. Mu lutiba ekigambo kikulemberwa akabonero ' era ne kifundikibwa akabonero ' nga ekyo kiraga we kitandika ne we kikoma. Ekyokulabirako olutiba 'Saawa' h 'ne dakiika' m luvamu essawa nga zifaanana bwezityi: Saawa 9 ne dakiika 30. Sso olutiba h m luviiramu esasaawa ze zimu okuwandikibwa bwezityi: 9 30. Bw'obeera oyagala akabonero ako kennyini kalabike olina okuwandikawo bubiri, bwebutyi, ''.<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Ennukuta</th><th>Makulu</th></tr> <tr><td>d</td><td>Kitegeeza namba ya lunaku nga eziri wansi wa kkumi tekuli zero ekulembera (1 okutuuka ku 31)</td></tr> <tr><td>dd</td><td>Kitegeeza namba ya lunaku nga eziri wansi wa kkumi ziriko zero ekulembera (01 okutuuka ku 31)</td></tr> <tr><td>ddd</td><td>Kitegeeza linnya lya lunaku lwa wiiki mu lulimi olukolebwamu nga lifunzidwa mu nnukuta ssatu (nga 'Bal' okutuuka ku 'Sab').</td></tr> <tr><td>dddd</td><td>Kitegeeza linnya lya lunaku lwa wiiki mu lulimi olukolebwamu mu bujjuvu (nga 'Balaza' okutuuka ku 'Sabbiiti').</td></tr> <tr><td>M</td><td>Kitegeeza namba y'omwezi nga egiri wansi wa kkumi tekuli zero ekulembera (1 okutuuka ku 12)</td></tr> <tr><td>MM</td><td>Kitegeeza namba y'omwezi nga egiri wansi wa kkumi kuliko zero ekulembera (01okutuuka ku 12)</td></tr> <tr><td>MMM</td><td>Kitegeeza linnya lya lmwezii mu lulimi olukolebwamu nga lifunzidwa mu nnukuta ssatu (nga 'Jan' okutuuka ku 'Des').</td></tr> <tr><td>MMMM</td><td>Kitegeeza linnya lya lmwezii mu lulimi olukolebwamu mu bujjuvu (e.g. 'Janwariyo' okutuuka ku 'Desemba').</td></tr> <tr><td>yy</td><td>Kitegeeza mwaaka nga guwandikwa nga ennamba zagwo ezisembayo bbiri (okuva ku 00 okutuuka ku 99)</td></tr> <tr><td>yyyy</td><td>Kitegeeza mwaaka nga guwandikwa nga ennamba zagwo zonna nya</td></tr> <tr><td>h</td><td>Kitegeeza ssaawa nga ezitatuuka mu kkumi tekuli zero ekulembera (0 okutuuka ku 23 oba 1 okutuuka ku 12 mu mpandika ya AM/PM)</td></tr> <tr><td>hh</td><td>Kitegeeza ssaawa nga ezitatuuka mu kkumi ziriko zero ekulembera (00 okutuuka ku 23 oba 01 okutuuka ku 12 mu mpandika ya AM/PM)</td></tr> <tr><td>H</td><td>Kitegeeza ssaawa nga ezitatuuka mu kkumi tekuli zero ekulembera mu mpandika ya ssaawa 24 (0 okutuuka ku 23, ne mu mpandika ya AM/PM)</td></tr> <tr><td>HH</td><td>Kitegeeza ssaawa nga ezitatuuka mu kkumi ziriko zero ekulembera mu mpandika ya ssaawa 24 (00 okutuuka ku 23, ne mu mpandika ya AM/PM)</td></tr> <tr><td>m</td><td>Kitegeeza ddakiika nga ezitatuuka mu kkumi tekuli zero ekulembera (0 okutuuka ku 59)</td></tr> <tr><td>mm</td><td>Kitegeeza ddakiika nga ezitatuuka mu kkumi ziriko zero ekulembera (00 okutuuka ku 59)</td></tr> <tr><td>s</td><td>Kitegeeza sikonda nga ezitatuuka mu kkumi tekuli zero ekulembera (0 okutuuka ku 59)</td></tr> <tr><td>ss</td><td>Kitegeeza sikonda nga ezitatuuka mu kkumi ziriko zero ekulembera (00 okutuuka ku 59)</td></tr> <tr><td>AP <i>oba</i> A</td><td>Kitegeeza kozesa empandika eya AM/PM. Awali ennukuta <b>A/AP</b> wajjakuddawo "AM" oba "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>Kitegeeza kozesa empandika eya am/pm. Awali ennukuta <b>a/ap</b> wwajjakuddawo "am" oba "pm".</td></tr> <tr><td>t</td><td>Kitegeeza erinnya ly'ekitundu ky'ensi essaawa we zikolera (e.g. "EAT" ssaawa ezibalibwa mu Afirika y'ebuvanjuba - omuli Uganda, Kenya ne Tanzania)</td></tr> <tr><td>T</td><td>Kitegeeza enjawulo okuva ku ssaawa za UTC</td></tr> <tr><td>TT</td><td>Kitegeeza erinnya aba IANA lye baawa ekifo essaawa mwe zikolera</td></tr> <tr><td>TTT</td><td>Kitegeeza erinnya ery'ekifo essaawa mwe zikolera effunze</td></tr> <tr><td>TTTT</td><td>Kitegeeza erinnya ery'ekifo essaawa mwe zikolera erimpi</td></tr> <tr><td>TTTTT</td><td>Kitegeeza erinnya ery'ekifo essaawa mwe zikolera erijjuvu</td></tr> <tr><td>TTTTTT</td><td>Kitegeeza erinnya lye weyiiyizza ekifo essaawa mwe zikolera. Lino oliwandikira mu katimbe aka 'Bifo essaawa mwe zikolera'</td></tr></table> <br /><b>Genderera:</b> <ul><li>Olutiba bw'oluteekamu obubonero obutali mu lubu lwa ['a'..'z'] oba ['A'..'Z'] bujja okubalibwa ng'ebigambo byennyini sso ssi biragiro. Okugeza, obubonero nga ':', '.', ' ', '#' ne '@' bujja okulabikira mu biwandikidwa nga bwo bwennyini nandibadde tebuwerekedwa obubonero bwa ' .</li><li>Ekipimo eky'obudde ekisinga obutono essaawa eno ky'ekyukirako ye sikonda 1. Ennukuta 'z' etegeeza kitundu kimu kya lukumi ekya sikonda. Singa olutiba lw'empandika y'essaawa n'ennaku lubeeramu 'z 'oba 'zzz' essaawa ejjakulaga obutundu obwo naye ejjakulindanga lukumi luyitewo eryoke erage nti obudde bukyuse (ekigiyamba okukola mu ngeri etamatiza).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Lukalala lw'essaawa ezikozesebwa Time zone Ssaawa ezikozesebwa Name Linnya lya zo Comment Kutangaaza Country Nsi mwe zikolera UTC UTC Other Endala Local timezone Essaawa ez'omu katundu ================================================ FILE: plugin-worldclock/translations/worldclock_lt.desktop.yaml ================================================ Desktop Entry/Name: "Pasaulio laikrodžiai" Desktop Entry/Comment: "Pasaulio laikrodžių įskiepis" ================================================ FILE: plugin-worldclock/translations/worldclock_lt.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Pasaulio laikrodžių nustatymai Display &format Rodymo &formatas &Time &Laikas F&ormat: F&ormatas: Short Trumpas Long Ilgas Custom Tinkintas Sho&w seconds R&odyti sekundes Pad &hour with zero Papildyti &valandą nuliu T&ime zone La&iko juosta &Position: &Pozicija: For&mat: For&matas: Below Žemiau Above Aukščiau Before Prieš After Po Offset from UTC Poslinkis nuo UTC (Suderintojo pasaulinio laiko) Abbreviation Santrumpa IANA id IANA id Custom name Tinkintas pavadinimas &Use 12-hour format Na&udoti 12 valandų formatą Location identifier Vietos identifikatorius &Date &Data Po&sition: Po&zicija: Fo&rmat: Fo&rmatas: ISO 8601 ISO 8601 Show &year Rodyti &metus Show day of wee&k Rodyti savaitės &dieną Pad d&ay with zero Papildyti &dieną nuliu &Long month and day of week names I&lgi mėnesių ir savaitės dienų pavadinimai Ad&vanced manual format Iš&plėstinis rankinis formatas &Customize ... &Tinkinti ... Time &zones Laiko &juostos &Add ... &Pridėti ... &Remove Ša&linti Set as &default Nustatyti &numatytąja &Edit custom name ... &Taisyti tinkintą pavadinimą ... Move &up Pa&kelti Move do&wn &Nuleisti Change displayed time zone with mouse wheel Keiskite atvaizduojamą laiko juostą naudodami pelės ratuką <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Pastaba:</b> Spustelėkite viduriniuoju pelės mygtuku ant laikrodžio, kad pamatytumėte visų sukonfigūruotų laiko juostų datą ir laiką. &General &Bendra Auto&rotate when the panel is vertical Automatiškai pasuk&ti, kai skydelis yra vertikalus Show &week numbers in popup calendar Rodyti iškylančiajame kalendoriuje &savaičių numerius S&how tooltip Ro&dyti paaiškinimą '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'yyyy MMM d, ddd'<br/>'TT'</font>' Input custom time zone name Įrašykite tinkintą laiko juostos pavadinimą LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Pasaulio laikrodžių rankinė formato konfigūracija <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Tinkintos datos/laiko formato sintaksė</h1> <p>Datos šablonas yra simbolių eilutė, kurioje tam tikros simbolių eilutės, formatuojant, yra pakeičiamos datos ir laiko duomenimis iš kalendoriaus arba analizuojant, yra naudojamos kalendoriaus duomenų kūrimui.</p> <p>Žemiau esančioje datų laukelio simbolių lentelėje yra simboliai, kurie naudojami šablonuose, siekiant rodyti atitinkamus nurodytos lokalės formatus, tokie simboliai kaip pvz., yyyy, kurie yra skirti metams. Simboliai gali būti naudojami kelis kartus. Pavyzdžiui, jeigu y yra naudojama metams, tai „yy“ gali atvaizduoti „99“, tuo tarpu „yyyy“ atvaizduos „1999“. Daugelyje skaitmeninių laukelių simbolių skaičius nustato laukelio plotį. Pavyzdžiui, jeigu h yra valanda, tai „h“ gali atvaizduoti „5“, tačiau „hh“ atvaizduos „05“. Kai kuriems simboliams skaičius nustato, ar turėtų būti naudojama pilna, ar sutrumpinta forma, tačiau gali būti ir kiti pasirinkimai, kaip tai yra nurodyta žemiau.</p> <p>Dvi kabutės, nesvarbu ar viengubų kabučių viduje ar išorėje, atvaizduoja viengubą kabutę. Viengubų kabučių viduje esantis tekstas niekaip nėra interpretuojamas (išskyrus dvi viengubas kabutes viena šalia kitos). Kita vertus visos ASCII raidės nuo a iki z ir nuo A iki Z yra rezervuotos kaip sintaksės simboliai, ir yra reikalaujama, kad jos būtų kabutėse, jeigu norima jas atvaizduoti kaip įprastas raides. Be to, tam tikri ASCII punktuacijos simboliai ateityje gali tapti kintamaisiais (pvz., „:“ gali būti interpretuojamas kaip laiko skirtuvas, o „/“ kaip datos skirtuvas, ir rodinyje gali būti pakeisti atitinkamais lokalės simboliais.<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kodas</th><th>Reikšmė</th></tr> <tr><td>d</td><td>diena kaip skaičius be priekinio nulio (nuo 1 iki 31)</td></tr> <tr><td>dd</td><td>diena kaip skaičius su priekiniu nuliu (nuo 01 iki 31)</td></tr> <tr><td>ddd</td><td>sutrumpintas lokalizuotas dienos pavadinimas (pvz., nuo „Pir“ iki „Sek“).</td></tr> <tr><td>dddd</td><td>ilgas lokalizuotas dienos pavadinimas (pvz., nuo „Pirmadienis“ iki „Sekmadienis“).</td></tr> <tr><td>M</td><td>mėnesis kaip skaičius be priekinio nulio (1-12)</td></tr> <tr><td>MM</td><td>mėnesis kaip skaičius su priekiniu nuliu (01-12)</td></tr> <tr><td>MMM</td><td>sutrumpintas lokalizuotas mėnesio pavadinimas (pvz., nuo „Sau“ iki „Gru“).</td></tr> <tr><td>MMMM</td><td>ilgas lokalizuotas mėnesio pavadinimas (pvz., nuo „Sausis“ iki „Gruodis“).</td></tr> <tr><td>yy</td><td>metai kaip dviejų skaitmenų skaičius (00-99)</td></tr> <tr><td>yyyy</td><td>metai kaip keturių skaitmenų skaičius</td></tr> <tr><td>h</td><td>valanda be priekinio nulio (nuo 0 iki 23 arba nuo 1 iki 12, jeigu yra rodoma AM/PM formatu)</td></tr> <tr><td>hh</td><td>valanda su priekiniu nuliu (nuo 00 iki 23 arba nuo 01 iki 12, jeigu yra rodoma AM/PM formatu)</td></tr> <tr><td>H</td><td>valanda be priekinio nulio (nuo 0 iki 23, netgi jeigu yra rodoma AM/PM formatu)</td></tr> <tr><td>HH</td><td>valanda su priekiniu nuliu (nuo 00 iki 23, netgi jeigu yra rodoma AM/PM formatu)</td></tr> <tr><td>m</td><td>minutė be priekinio nulio (nuo 0 iki 59)</td></tr> <tr><td>mm</td><td>minutė su priekiniu nuliu (nuo 00 iki 59)</td></tr> <tr><td>s</td><td>sekundė be priekinio nulio (nuo 0 iki 59)</td></tr> <tr><td>ss</td><td>sekundė su priekiniu nuliu (nuo 00 iki 59)</td></tr> <tr><td>AP <i>arba</i> A</td><td>naudoti AM/PM formatą. <b>A/AP</b> bus pakeista arba į „AM“, arba į „PM“.</td></tr> <tr><td>ap <i>arba</i> a</td><td>naudoti am/pm formatą. <b>a/ap</b> bus pakeista arba į „am“, arba į „pm“.</td></tr> <tr><td>t</td><td>laiko juosta (pvz., „CEST“)</td></tr> <tr><td>T</td><td>poslinkis nuo UTC (Suderintojo pasaulinio laiko)</td></tr> <tr><td>TT</td><td>laiko juostos IANA id</td></tr> <tr><td>TTT</td><td>laiko juostos santrumpa</td></tr> <tr><td>TTTT</td><td>trumpasis laiko juostos pavadinimas</td></tr> <tr><td>TTTTT</td><td>ilgasis laiko juostos pavadinimas</td></tr> <tr><td>TTTTTT</td><td>tinkintas laiko juostos pavadinimas. Jūs galite jį pakeisti konfigūracijos lango „Laiko juostų“ kortelėje</td></tr></table> <br /><b>Pastabos:</b> <ul><li>Bet kurie šablone esantys simboliai, kurie nėra rėžyje [„a“..„z“] ir [„A“..„Z“] bus laikomi cituotu tekstu. Pavyzdžiui, tokie simboliai kaip „:“, „.“, „ “, „#“ ir „@“ bus rodomi galutiniame laiko tekste netgi tuo atveju, jeigu jie nėra viengubose kabutėse. Viengubos kabutės yra naudojamos raidžių „ištrūkimui“. Dvi viengubos kabutės iš eilės, nesvarbu, ar cituojamos sekos viduje, ar išorėje, atvaizduoja „tikrąsias“ viengubas kabutes.</li><li>Mažiausias atnaujinimo intervalas yra 1 sekundė. Jeigu laiko atvaizdavimui yra naudojama z ar zzz, tuomet laikas bus rodomas su milisekundėmis, tačiau jis nebus atnaujinamas kas milisekundę (tam, kad būtų išvengta našumo sumažėjimo).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Pasaulio laikrodžių laiko juostos Time zone Laiko juosta Name Pavadinimas Comment Komentaras Country Šalis UTC UTC (Suderintasis pasaulinis laikas) Other Kita Local timezone Vietinė laiko juosta ================================================ FILE: plugin-worldclock/translations/worldclock_lv.desktop.yaml ================================================ Desktop Entry/Name: "Pasaules laiks" Desktop Entry/Comment: "Parāda pulksteni ar kalendāru un laika joslām" ================================================ FILE: plugin-worldclock/translations/worldclock_lv.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Pasaules laika iestatījumi Display &format Attēlošanas &formāts &Time &Laiks F&ormat: F&ormāts: Short Īsais Long Garais Custom Pielāgots Sho&w seconds Rādīt &sekundes Pad &hour with zero Stundām pievienot &nulli T&ime zone La&ika zona &Position: &Izvietojums/pozīcija: For&mat: For&māts: Below Zemāk/zem Above Augstāk/virs Before Pirms After Pēc Offset from UTC Nobīde pret UTC Abbreviation Saīsinājums IANA id IANA id Custom name Pielāgots nosaukums &Use 12-hour format &Lietot 12-stundu formātu Location identifier Vietas identifikators &Date &Datums Po&sition: Pozīcija/atrašanās vieta/izvietojums: Fo&rmat: Fo&rmāts: ISO 8601 ISO 8601 Show &year Rādīt &gadu Show day of wee&k Rādīt nedēļas &dienu nosaukumus Pad d&ay with zero Pievienot dienas datumam n&ulli &Long month and day of week names Mēnešu un nedēļas dienu &garie nosaukumi Ad&vanced manual format Progresī&vais (advancētais) manuālais formāts &Customize ... &Pielāgot... Time &zones Laka &joslas &Add ... &Pielikt/pievienot... &Remove &Noņemt Set as &default Iestatīt par &noklusēto &Edit custom name ... R&ediģēt pielāgoto nosaukumu... Move &up &Augstāk virzīt Move do&wn &Zemāk virzīt Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Vispārī&gie Auto&rotate when the panel is vertical Autopagriešana, kad panelis ir vertikāls Show &week numbers in popup calendar Rādīt nedēļu numurus izlienošajā kalendārā S&how tooltip Rādīt uznirstošos &padomus '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Ievadīt pielāgotu laika joslas nosaukumu LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Manuāla pasaules laika formāta iestatīšana <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Pielāgota datuma/laika formāta sintakse</h1> <p>Datuma šablons — tā ir simbolu virkne, kuru formatējot, noteiktas rakstzīmes tiek aizstātas ar kalendāro datumu un laiku vai izmantotas datuma ģenerēšanā kalendāram.</p> <p>Tabula satur burtus, ko izmanto šablonos, lai parādītu attiecīgos formātus šajā lokālē, piemēram, "yyyy" — ir gads. Atsevišķi burti var atkārtoties dažādu skaitu reižu. Piemēram, tā kā "y" nozīmē gads, tad vērtība "yy" var izdot "99", bet "yyyy" — "1999". Lielākajai daļai skaitlisko lauku atkārtojošos burtu skaits nosaka lauka platumu. Piemēram, "h" ir stunda, un "h" parādīs "5", bet "hh" — "05". Dažiem burtiem atkārtojumu skaits norāda, vai izmantot saīsināto vai pilno formu, bet var būt arī citas vērtības, kā norādīts tālāk.</p> <p>Divas vienpēdiņas pēc kārtas, rezultējas kā vienas vienpēdiņas (gan citu vienpēdiņu iekšpusē vai ārpusē). Vienpēdiņās ietvertais teksts nekādi netiek interpretēts (izņemot dubultās vienpēdiņas). Citādi visas latīņu alfabēta rakstzīmes ASCII (no a līdz z un no A līdz Z) ir rezervētas kā sintaktiskie simboli un ir liekami pēdiņā, ja vēlme tos izmantot kā literārās rakstuzīmes/burtus. Turklāt, dažas pieturzīmes ASCII arī var nākotnē kļūt par mainīgajiem (piemēram, ":" tiek interpretēts kā laika atdalītāju, un "/" — kā datuma atdalītājs un rādījumos aizstāti ar attiecīgiem no lokāles atkarīgiem simboliem).<br/></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kods</th><th>Vērtība</th></tr> <tr><td>d</td><td>diena kā skaitlis bez ievadošās nulles (no 1 līdz 31)</td></tr> <tr><td>dd</td><td>diena kā skaitlis ar ievadošo nulli (no 01 līdz 31)</td></tr> <tr><td>ddd</td><td>saīsināts lokalizēts dienas nosaukums (piemēram, "pr." līdz "sv.").</td></tr> <tr><td>dddd</td><td>pilns lokalizēts dienas nosaukums (piemēram, "pirmdiena" līdz "svētdiena").</td></tr> <tr><td>M</td><td>mēnesis kā skaitlis bez ievadošās nulles (1-12)</td></tr> <tr><td>MM</td><td>mēnesis kā skaitlis ar ievadošo nulli (01-12)</td></tr> <tr><td>MMM</td><td>saīsināts lokalizēts mēneša nosaukums (piemēram, no jan līdz dec).</td></tr> <tr><td>MMMM</td><td>pilnais lokalizēts mēneša nosaukums (piemēram, no "janvāris" līdz "decembris").</td></tr> <tr><td>yy</td><td>gads kā divciparu skaitlis (00-99)</td></tr> <tr><td>gads</td><td>gads kā četrciparu skaitlis</td></tr> <tr><td>h</td><td>stunda bez ievadošās nulles (no 0 līdz 23 vai no 1 līdz 12, ja tiek izmantoti AM/PM)</td></tr> <tr><td>ss</td><td>stunda ar ievadošo nulli (no 00 līdz 23 vai no 01 līdz 12, ja tiek izmantoti AM/PM)</td></tr> <tr><td>H</td><td>stunda bez ievadošās nulles (no 0 līdz 23, un arī tad, ja izmantojat AM/PM)</td></tr> <tr><td>SS</td><td>stunda ar vadošo nulli (no 00 līdz 23, un arī tad, ja izmantojat AM/PM)</td></tr> <tr><td>m</td><td>minūtes bez ievadošās nulles (no 0 līdz 59)</td></tr> <tr><td>mm</td><td>minūtes ar ievadošo nulli (no 00 līdz 59)</td></tr> <tr><td>s</td><td>sekundes bez ievadošās nulles (no 0 līdz 59)</td></tr> <tr><td>ss</td><td>sekundes ar ievadošo nulli (no 00 līdz 59)</td></tr> <tr><td>AP<i>vai</i>A</td><td>, lai izmantotu AM/PM formātu.<b>A/AP</b>, tiks aizstāts ar "AM" (priekšpusdienā) vai "PM" (pēcpusdienā).</td></tr> <tr><td>ap<i>vai</i>a</td><td>, lai izmantotu am/pm formātu.<b>a/ap</b>tiks aizstāts ar "am" vai "pm".</td></tr> <tr><td>t</td><td>laika josla (piemēram, "CEST")</td></tr> <tr><td>T</td><td>nobīde no UTC (piem., "+03:00")<td></tr> <tr><td>TT</td><td>id IANA laika josla (piemēram, "Europe/Riga")</td></tr> <tr><td>TTT</td><td>laika joslas saīsinājums (piemēram, "MSK")</td></tr> <tr><td>TTTT</td><td>laika joslas īsais parādāmais nosaukums (piemēram, "GMT+3")</td></tr> <tr><td>TTTTT</td><td>laika joslas garais parādāmais nosaukums (piemēram, "Rīga, standarta laiks")</td></tr> <tr><td>TTTTTT</td><td>laika joslas pielāgotais nosaukums. Varat to mainīt konfigurācijas loga cilnē "laika joslas"</td></tr></table> <br/><b>Piezīmes.</b><ul><li>Jebkuras rakstzīmes modelī, kas iziet ārpus diapazona ['a' ... 'z'] un ['A' ... 'Z'] tiks uzskatītas par citētu tekstu pēdiņās. Piemēram rakstzīmes ,':', '.', ' ', '#' un ' @ ' tiek parādītas gatavajā laika tekstā, pat tad, ja tās nav ietvertas vienpēdiņās. Vienpēdiņas tiek izmantotas, lai 'izbēgtu' burtus. Divas vienpēdiņas pēc kārtas, neatkarīgi vai tās ārpus vai iekšpus citētam tekstam pēdiņās, ir "īstas" vienpēdiņas.</li> <li>Minimālais atsvaidzināšanas intervāls ir 1 sekunde. Ja attēlojumā iekļauts z vai zzz, tad laiks tiek rādīts ar milisekundēm, taču ne atsvaidzināts milisekundēs (lai izvairītos no būtiski samazināta datora produktivitātes krituma).</li></ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Pasaules pulksteņa laika joslas Time zone Laika josla Name Nosaukums Comment Komentārs Country Valsts UTC UTC Other Cits Local timezone Vietējā laika josla ================================================ FILE: plugin-worldclock/translations/worldclock_nb_NO.desktop.yaml ================================================ Desktop Entry/Name: "Verdensklokke" Desktop Entry/Comment: "Viser en klokke med kalender og tidssoner" ================================================ FILE: plugin-worldclock/translations/worldclock_nb_NO.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Verdensklokkeinnstillinger Display &format Visnings&format &Time &Tid F&ormat: Short Kort Long Lang Custom Selvvalgt Sho&w seconds &Vis sekunder Pad &hour with zero &Time med ledende null T&ime zone &Tidssone &Position: &Plassering: For&mat: Below Under Above Over Before Før After Etter Offset from UTC Forskjell fra UTC Abbreviation Forkortelse IANA id IANA-id Custom name Selvvalgt navn &Use 12-hour format &Bruk 12-timers format Location identifier Plasseringsidentifikator &Date &Dato Po&sition: &Plassering: Fo&rmat: ISO 8601 Show &year Vis &år Show day of wee&k Vis &ukedag Pad d&ay with zero D&ag med ledende null &Long month and day of week names &Lange navn på dager og måneder Ad&vanced manual format &Avansert manuell formatering &Customize ... &Endre ... Time &zones &Tidssoner &Add ... &Legg til... &Remove &Fjern Set as &default Sett som &standard &Edit custom name ... &Forandre selvvalgt navn ... Move &up Flytt &oppover Move do&wn Flytt &nedover Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General &Generelt Auto&rotate when the panel is vertical Auto&roter når panelet er vertikalt Show &week numbers in popup calendar Vis &ukenummer i oppsprettskalender S&how tooltip &Vis verktøytips '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Skriv inn navn på tidssonen LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Manuell konfigurasjon av verdensklokken <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Syntakset for selvvalgt dato- og tidsformat</h1> <p>En dato er en streng med tegn hvor spesielle strenger av tegn blir byttet ut med dato og tidsdata fra en kalender når den formateres eller brukes til lage data til en kalender når den deles opp.</p> <p> Tabellen med datofelt under inneholder tegn brukt i mønstre for å vise det riktige formatet for en spesiell lokasjon, sånn som yyyy for året. Tegn kan bli brukt flere ganger. For eksempel, hvis y blir brukt for år kan yy kanskje gi 99 mens yyyy gir 1999. I de fleste numeriske feltene vil antallet tegn bestemme bredden. For eksempel hvis h er timen kan h gi 5 mens hh gir 05. For noen tegn kan antallet bestemme om en forkortet eller full form skal bli brukt, men det kan også være andre valg som vist under.</p> <p>To enkle anførselstegn representerer ett virkelig anførselstegn, enten det er inni eller på utsiden av enkle anførselstegn. Tekst inni enkle anførselstegn blir ikke tolket på noen måte (untatt hvis det er to ved siden av hverandre). Ellers er alle ASCII-tegn fra a til z og fra A til Z reservert for datosyntakset og krever anførselstegn hvis de skal framstå som de faktiske tegnene. I tilleg kan visse ASCII tegnsettingstegn bli variable i framtiden (f.eks. : kan bli tolket som et tidsskilletegn og / som et datoskilletegn og byttet ut med riktig tegn for lokasjonen når det vises.)<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kode</th><th>Betydning</th></tr> <tr><td>d</td><td>dagen i måneden uten null foran (1 til 31)</td></tr> <tr><td>dd</td><td>dagen i måneden med null foran (01 til 31)</td></tr> <tr><td>ddd</td><td>forkortet navn på dag for lokasjonen (f.eks. 'Man' til 'Søn').</td></tr> <tr><td>dddd</td><td>langt navn på ukedag for lokasjonen (f.eks. 'Mandag' til 'Søndag').</td></tr> <tr><td>M</td><td>måneden som tall uten null foran (1 til 12)</td></tr> <tr><td>MM</td><td>måneden som tall med null foran (01 til 12)</td></tr> <tr><td>MMM</td><td>forkortet navn på måneden for lokasjonen (f.eks. 'Jan' til 'Des').</td></tr> <tr><td>MMMM</td><td>langt månedsnavn for lokasjonen (f.eks. 'Januar' to 'Desember').</td></tr> <tr><td>yy</td><td>året som tosifret tall (00-99)</td></tr> <tr><td>yyyy</td><td>året som firesifret tall</td></tr> <tr><td>h</td><td>timen uten null foran (0 til 23 eller 1 til 12 hvis AM/PM vises)</td></tr> <tr><td>hh</td><td>timen med null foran (00 til 23 eller 01 til 12 hvis AM/PM vises)</td></tr> <tr><td>H</td><td>timen uten null foran i 24-timersvisning (0 til 23, selv hvis AM/PM vises)</td></tr> <tr><td>HH</td><td>timen med null foran i 24-timersvisning (00 til 23, selv hivs AM/PM vises)</td></tr> <tr><td>m</td><td>minuttene uten null foran (0 til 59)</td></tr> <tr><td>mm</td><td>minuttene med null foran (00 til 59)</td></tr> <tr><td>s</td><td>sekundene uten null foran (0 til 59)</td></tr> <tr><td>ss</td><td>sekundene med null foran (00 til 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM visning. <b>A/AP</b> blir erstattet med enten "AM" eller "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm visning. <b>a/ap</b> blir erstattet med enten "am" eller "pm".</td></tr> <tr><td>t</td><td>tidssonen (f.eks. "CEST")</td></tr> <tr><td>T</td><td>forskjell fra UTC</td></tr> <tr><td>TT</td><td>tidssonens IANA id</td></tr> <tr><td>TTT</td><td>tidssonens forkortelse</td></tr> <tr><td>TTTT</td><td>tidssonens korte visningsnavn</td></tr> <tr><td>TTTTT</td><td>tidssonens lange visningsnavn</td></tr> <tr><td>TTTTTT</td><td>tidssonens selvvalgte navn. Du kan forandre det i 'Tidssoner'-fana i innstillingsvinduet</td></tr></table> <br /><b>Notes:</b> <ul><li>Ethvert tegn i mønsteret som ikke er blant ['a'..'z'] og ['A'..'Z'] blir behandlet som om den var i anførselstegn. For eksempel vil tegn som ':', '.', ' ', '#' og '@' dukke opp i det som vises selv om de ikke er inne i enkle anførselstegn. Enkle anførselstegn brukes for å 'escape" tegn. To enkle anførselstegn på rad, enten inne i eller på utsiden av tekst i anførselstegn tolkes som et ekte enkelt anførselstegn. </li><li>Minimum oppdateringsintervall er ett sekund. Hvis z eller zzz blir brukt vises tiden med millisekunder, men oppdateres ikke hvert millisekund fordi det ville ødelegge ytelsen.</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Verdensklokkens tidsssoner Time zone Tidssone Name Navn Comment Kommentar Country Land UTC Other Andre Local timezone Lokal tidssone ================================================ FILE: plugin-worldclock/translations/worldclock_nl.desktop.yaml ================================================ Desktop Entry/Name: "Klok" Desktop Entry/Comment: "Toon een klok op het paneel met kalender en tijdzones" ================================================ FILE: plugin-worldclock/translations/worldclock_nl.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd d MMM jjjj'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Klok-instellingen Display &format Weerga&ve &Time &Tijd F&ormat: &Opmaak: Short Kort Long Lang Custom Aangepast Sho&w seconds Sec&onden tonen Pad &hour with zero &Uren voorzien van voorloopnul &Use 12-hour format 12-uursklok gebr&uiken T&ime zone T&ijdzone &Position: &Positie: For&mat: Op&maak: Below Onder Above Boven Before Voor After Na Offset from UTC UTC-afwijking Abbreviation Afkorting Location identifier Plaatsaanduiding Custom name Aangepaste naam &Date &Datum Po&sition: Po&sitie: Fo&rmat: &Opmaak: ISO 8601 ISO 8601 Show &year &Jaar tonen Show day of wee&k Wee&kdag tonen Pad d&ay with zero D&agen voorzien van voorloopnul &Long month and day of week names &Lange namen van maanden en weekdagen Ad&vanced manual format Gea&vanceerde, handmatige opmaak &Customize ... &Aanpassen… Time &zones Tijd&zones IANA id IANA-id &Add ... &Toevoegen… &Remove Ve&rwijderen Set as &default Instellen als standaar&d &Edit custom name ... Aangepaste naam b&ewerken… Move &up Omhoog &verplaatsen Move do&wn O&mlaag verplaatsen Change displayed time zone with mouse wheel Wisselen van tijdzone door te scrollen <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Opmerking:</b> klik met de middelste muisknop op de klok om de datum en tijd van alle ingestelde tijdzones te bekijken. &General Al&gemeen Auto&rotate when the panel is vertical Automatisch d&raaien als het paneel verticaal is Show &week numbers in popup calendar &Weeknummers tonen op kalender S&how tooltip &Hulpballon tonen '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd d MMM jjjj'<br/>'TT'</font>' Input custom time zone name Voer een aangepaste tijdzonenaam in LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Handmatige klokweergave-opmaak <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Eigen datum-/tijdopmaak</h1> <p>Een eigen datumpatroon bestaat uit tekens, waar specifieke tekens vervangen worden door de datum en tijd uit een agenda/kalender of tijdens het verwerken.</p> <p>Onderstaande tabel bevat tekens die gebruikt kunnen worden in de patronen, zoals ‘yyyy’ om een jaartal te tonen. Tekens kunnen meermaals gebruikt worden. Voorbeeld: als ‘y’ gebruikt wordt om het jaar te tonen, dan toont ‘yy’ ‘99’ en ‘yyyy’ ‘1999’. In de meeste numerieke velden bepaalt het aantal tekens de breedte van de velden. Voorbeeld: als ‘h’ gebruikt wordt om het uur te tonen, dan toont ‘h’ ‘5’ en ‘hh’ ‘05’. Bij sommige getallen geeft het aantal aan of een verkorte of volledige versie dient te worden gebruikt, maar er zijn ook variaties mogelijk.</p> <p>Twee losse aanhalingstekens zijn gelijk aan één dubbel aanhalingsteken. Tekst binnen enkele aanhalingstekens wordt niet ingelezen (behalve als er twee achter elkaar staan). Verder worden alle ascii-letters van a tot z en A tot Z gebruikt als syntaxistekens en dienen binnen twee losse aanhalingstekens te staan als ze letterlijk als letter dienen te worden gebruikt. Ook kan bepaalde ascii-punctuatie worden gebruikt, bijvoorbeeld ‘:’ om uren en minuten te scheiden en ‘/’ om dagen, maandnamen en jaren te scheiden.<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Betekenis</th></tr> <tr><td>d</td><td>dag zonder voorloopnul (1 tot 31)</td></tr> <tr><td>dd</td><td>dag met voorloopnul (01 tot 31)</td></tr> <tr><td>ddd</td><td>verkorte naam van de dag in de eigen taal (bijv. ,‘Ma’ tot ‘Zo’).</td></tr> <tr><td>dddd</td><td>volledige naam van de dag in de eigen taal (bijv. ‘Maandag’ tot ‘Zondag’).</td></tr> <tr><td>M</td><td>nummer van de maand zonder voorloopnul (1-12)</td></tr> <tr><td>MM</td><td>nummer van de maand met voorloopnul (01-12)</td></tr> <tr><td>MMM</td><td>verkorte naam van de maand in de eigen taal (bijv. ‘Jan’ tot ‘Dec’).</td></tr> <tr><td>MMMM</td><td>volledige naam van de maand in de eigen taal (bijv. ‘Januari’ tot ‘December’).</td></tr> <tr><td>yy</td><td>jaar bestaande uit twee getallen (00-99)</td></tr> <tr><td>yyyy</td><td>jaar bestaande uit vier getallen (2000-2099)</td></tr> <tr><td>h</td><td>uur zonder voorloopnul (0 tot 23, of 1 tot 12 indien am/pm)</td></tr> <tr><td>hh</td><td>uur met voorloopnul (00 tot 23, of 01 tot 12 indien am/pm)</td></tr> <tr><td>H</td><td>uur zonder voorloopnul (0 tot 23, zelfs bij gebruik van am/pm)</td></tr> <tr><td>HH</td><td>uur met voorloopnul (00 tot 23, zelfs bij gebruik van am/pm)</td></tr> <tr><td>m</td><td>minuut zonder voorloopnul (0 tot 59)</td></tr> <tr><td>mm</td><td>minuut met voorloopnul (00 tot 59)</td></tr> <tr><td>s</td><td>seconde zonder voorloopnul (0 tot 59)</td></tr> <tr><td>ss</td><td>segonde met voorloopnul (00 tot 59)</td></tr> <tr><td>AP <i>of</i> A</td><td>AM/PM tonen<b>A/AP</b> wordt vervangen door ‘AM’ of ‘PM’.</td></tr> <tr><td>ap <i>of</i> a</td><td>am/pm tonen <b>a/ap</b> wordt vervangen door ‘am’ of ‘pm’.</td></tr> <tr><td>t</td><td>tijdzone (bijv. ‘CEST’)</td></tr> <tr><td>T</td><td>verschil ten opzichte van UTC</td></tr> <tr><td>TT</td><td>tijdzone met IANA-id</td></tr> <tr><td>TTT</td><td>verkorte naam van tijdzone</td></tr> <tr><td>TTTT</td><td>verkorte naam van tijdzone</td></tr> <tr><td>TTTTT</td><td>volledige naam van tijdzone</td></tr> <tr><td>TTTTTT</td><td>eigen tijdzonenaam, op basis van de op het tabblad ‘Tijdzones’ ingestelde naam</td></tr></table> <br /><b>Let op:</b> <ul><li>tekens buiten de reeksen [‘a’…‘z’] en [‘A’…‘Z’] worden gebruikt om tekst te tonen. Voorbeeld: ‘:’, ‘.’, ‘ ’, ‘#’ en ‘@’ worden als tekst naast de tijd getoond, tenzij ze worden omsloten door enkele aanhalingstekens.</li><li>De minimale bijwerktussenpoos is 1 seconde. Als z of zzz is ingesteld, dan wordt de tijd aangeduid met behulp van milliseconden, maar niet op basis daarvan bijgewerkt in verband met prestatieredenen.</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Klok-tijdzones Time zone Tijdzone Name Naam Comment Opmerking Country Land UTC UTC Other Overige Local timezone Lokale tijdzone ================================================ FILE: plugin-worldclock/translations/worldclock_oc.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd d MMM 'de' yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Paramètres del relòtge mondial Display &format Afichar lo &format &Time &Ora F&ormat: F&ormat : Short Cort Long Long Custom Personalizat Sho&w seconds &Afichar las segondas Pad &hour with zero Emplenar l’&ora amb un zèro T&ime zone Zòna horàr&ia &Position: &Posicion : For&mat: For&mat : Below Jos Above Sus Before Abans After Aprèp Offset from UTC Descalatge respècte a l’UTC Abbreviation Abreviacion IANA id id IANA Custom name Nom personalizat &Use 12-hour format &Utilizar lo format de 12 oras Location identifier Identificant geografic &Date &Data Po&sition: Po&sicion : Fo&rmat: Fo&rmat : ISO 8601 ISO 8601 Show &year Afichar l’&annada Show day of wee&k Afichar lo &jorn de la setmana Pad d&ay with zero Emplenar lo j&orn amb un zèro &Long month and day of week names &Noms complèts del mes e jorn Ad&vanced manual format Format manual a&vançat &Customize ... &Personalizar... Time &zones &Zònas oràrias &Add ... &Apondre... &Remove &Suprimir Set as &default Causir per &dafaut &Edit custom name ... &Modificar lo nom personalizat... Move &up Desplaçar am&ont Move do&wn Desplaçar &aval Change displayed time zone with mouse wheel Cambiar lo fus orari afichat amb la rodeta de la mirga <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Nòta :</b> fasètz un clic amb la rodeta sul relòtge per afichar l’ora e la data de totes los fuses oraris configurats. &General &General Auto&rotate when the panel is vertical Vi&rar automaticament quand lo panèl es vertical Show &week numbers in popup calendar Afichar los numèros de &setmana al calendièr contextual S&how tooltip Afichar las infobolas '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd d MMM 'de' yyyy'<br/>'TT'</font>' Input custom time zone name Picatz lo nom del fus orari personalizat LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuracion del format manual del relòtge mondial <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Sintaxi del format de data/ora personalizat</h1> <p>Un modèl de data es una cadena de caractèrs, ont de cadenas de caractèrs especificas son remplaçadas per de donadas de data e d'ora d'un calendièr al moment del formatatge, o utilizadas per generar de donadas per un calendièr al moment de l'analisi.</p> <p>La Taula dels Simbòls de Camp de Data çaijós conten los caractèrs utilizats dins los modèls per afichar los formats apropriats per una lenga donada, coma yyyy per l'annada. Los caractèrs pòdon èsser utilizats mantun còp. Per exemple, se y es utilizat per l'annada, 'yy' poiriá produire '99', mentre que 'yyyy' produiriá '1999'. Per la màger part dels camps numerics, lo nombre de caractèrs especifica la largor del camp. Per exemple, se h es l'ora, 'h' poiriá produire '5', mas 'hh' produiriá '05'. Per d'unes caractèrs, lo nombre especifica se una forma abreujada o completa deu èsser utilizada, mas pòt aver d'autras causidas, coma indicat çaijós.</p> <p>Dos apostròfes simples representan un apostròfe simplaliteral, que siá a l'interior o a l'exterior d'apostròfes simples. Lo tèxte entre apostròfes simples es pas interpretat de cap de biais (levat per dos apostròfes simples adjacentes). Autrament, totas las letras ASCII de a a z e de A a Z son reservadas coma caractèrs de sintaxi, e demandan d'èsser entre apostròfes se devon representar de caractèrs literals. En mai d'aquò, d'unes caractèrs de pontuacion ASCII poirián venir de variablas a l'avenir (per ex. ":" interpretat coma lo separador d'ora e '/' coma un separador de data, e remplaçats per los caractèrs respectius adaptats a la lenga a l'afichatge).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Còdi</th><th>Significacion</th></tr> <tr><td>d</td><td>lo jorn en nombre sens zèro davant (1 a 31)</td></tr> <tr><td>dd</td><td>lo jorn en nombre amb un zèro davant (01 a 31)</td></tr> <tr><td>ddd</td><td>lo nom del jorn abreujat e localizat (ex. 'dil' a 'dim').</td></tr> <tr><td>dddd</td><td>lo nom del jorn long e localizat (ex. 'diluns' a 'dimenge').</td></tr> <tr><td>M</td><td>lo mes en nombre sens zèro davant (1-12)</td></tr> <tr><td>MM</td><td>lo mes en nombre amb un zèro davant (01-12)</td></tr> <tr><td>MMM</td><td>lo nom del mes abreujat e localizat (ex. 'gen' a 'dec').</td></tr> <tr><td>MMMM</td><td>lo nom del mes long e localizat (ex. 'genièr' a 'decembre').</td></tr> <tr><td>yy</td><td>l'annada en nombre de dos chifres (00-99)</td></tr> <tr><td>yyyy</td><td>l'annada en nombre de quatre chifres</td></tr> <tr><td>h</td><td>l'ora sens zèro davant (0 a 23 o 1 a 12 se afichatge AM/PM)</td></tr> <tr><td>hh</td><td>l'ora amb un zèro davant (00 a 23 o 01 a 12 se afichatge AM/PM)</td></tr> <tr><td>H</td><td>l'ora sens zèro davant (0 a 23, quitament amb afichatge AM/PM)</td></tr> <tr><td>HH</td><td>l'ora amb un zèro davant (00 a 23, quitament amb afichatge AM/PM)</td></tr> <tr><td>m</td><td>la minuta sens zèro davant (0 a 59)</td></tr> <tr><td>mm</td><td>la minuta amb un zèro davant (00 a 59)</td></tr> <tr><td>s</td><td>la segonda sens zèro davant (0 a 59)</td></tr> <tr><td>ss</td><td>la segonda amb un zèro davant (00 a 59)</td></tr> <tr><td>AP <i>o</i> A</td><td>utilizar l'afichatge AM/PM. <b>A/AP</b> serà remplaçat per "AM" o "PM".</td></tr> <tr><td>ap <i>o</i> a</td><td>utilizar l'afichatge am/pm. <b>a/ap</b> serà remplaçat per "am" o "pm".</td></tr> <tr><td>t</td><td>lo fus orari (ex. "CEST")</td></tr> <tr><td>T</td><td>lo descalatge respècte a UTC</td></tr> <tr><td>TT</td><td>l'identificant IANA del fus orari</td></tr> <tr><td>TTT</td><td>l'abreviacion del fus orari</td></tr> <tr><td>TTTT</td><td>lo nom d'afichatge cort del fus orari</td></tr> <tr><td>TTTTT</td><td>lo nom d'afichatge long del fus orari</td></tr> <tr><td>TTTTTT</td><td>lo nom personalizat del fus orari. Lo podètz cambiar dins l'onglet 'Fuses oraris' de la fenèstra de configuracion</td></tr></table> <br /><b>Nòtas:</b> <ul><li>Totes los caractèrs del modèl que son pas dins los intervals de ['a'..'z'] e ['A'..'Z'] seràn tractats coma de tèxte entre apostròfes. Per exemple, de caractèrs coma ':', '.', ' ', '#' e '@' apareisseràn dins lo tèxte de l'ora resultant quitament s'eles son pas clauses entre apostròfes simples. L'apostròf simpla es utilizada per 'escapar' las letras. Dos apostròfes simples a la seguida, que sián a l'interior o a l'exterior d'una sequéncia entre apostròfes, representan una 'vertadièra' apostròf simpla.</li><li>L'interval minimal de mesa a jorn es de 1 segonda. Se z o zzz es configurat, l'ora es afichada amb la fraccion de las millisegondas, mas es pas mesa a jorn a la millisegonda (per evitar un gròs impacte sus las performàncias).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fusses oraris del relòtge mondial Time zone Fus orari Name Nom Comment Comentari Country País UTC UTC Other Autre Local timezone Fus orari local ================================================ FILE: plugin-worldclock/translations/worldclock_pa.desktop.yaml ================================================ Desktop Entry/Name: "ਸੰਸਾਰ ਘੜੀ" Desktop Entry/Comment: "ਕੈਲੰਡਰ ਅਤੇ ਸਮਾਂ ਖੇਤਰ ਨਾਲ ਘੜੀ ਵੇਖੋ" ================================================ FILE: plugin-worldclock/translations/worldclock_pa.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings ਸੰਸਾਰ ਘੜੀ ਦੀਆਂ ਸੈਟਿੰਗਾਂ Display &format ਦਿਖਾਉਣ ਲਈ ਫਾਰਮੈਟ(&f) &Time ਸਮਾਂ(&T) F&ormat: ਫਾਰਮੈਟ(&o): Short ਛੋਟਾ Long ਲੰਮਾ Custom ਪਸੰਦੀਦਾ Sho&w seconds ਸਕਿੰਟ ਵੇਖਾਓ(&w) Pad &hour with zero ਘੰਟੇ ਦੇ ਅੱਗੇ ਸਿਫ਼ਰ ਲਾਓ(&h) T&ime zone ਸਮਾਂ ਖੇਤਰ(&i) &Position: ਸਥਿਤੀ(&P): For&mat: ਫਾਰਮੈਟ(&m): Below ਹੇਠਾਂ Above ਉੱਤੇ Before ਪਹਿਲਾਂ After ਬਾਅਦ Offset from UTC UTC ਤੋਂ ਵੱਖਰਾ Abbreviation ਸੰਖੇਪ ਰੂਪ IANA id IANA id Custom name ਪਸੰਦੀਦਾ ਨਾਂ &Use 12-hour format 12-ਘੰਟਿਆ ਵਾਲਾ ਫਾਰਮੈਟ ਵਰਤੋਂ(&U) Location identifier ਟਿਕਾਣਾ ਪਛਾਣਕਰਤਾ &Date ਤਾਰੀਖ(&D) Po&sition: ਸਥਿਤੀ(&s): Fo&rmat: ਫਾਰਮੈਟ(&r): ISO 8601 ISO 8601 Show &year ਸਾਲ ਵੇਖਾਓ(&y) Show day of wee&k ਹਫਤੇ ਦਾ ਦਿਨ ਵੇਖਾਓ(&k) Pad d&ay with zero ਦਿਨ ਅੱਗੇ ਸਿਫ਼ਰ ਪਾਓ(&a) &Long month and day of week names ਮਹੀਨੇ ਅਤੇ ਹਫ਼ਤੇ ਦੇ ਦਿਨਾਂ ਦੇ ਨਾਂ ਲੰਮੇ(&L) Ad&vanced manual format ਤਕਨੀਕੀ ਖੁਦ ਦਿੱਤਾ ਫਾਰਮੈਟ(&v) &Customize ... ਪਸੰਦਾਦ(&C) ... Time &zones ਸਮਾਂ ਖੇਤਰ(&z) &Add ... ਜੋੜੋ(&A) ... &Remove ਹਟਾਓ(&R) Set as &default ਮੂਲ ਵਲੋਂ ਸੈੱਟ ਕਰੋ(&d) &Edit custom name ... ਕਸਟਮ ਨਾਂ ਨੂੰ ਸੋਧੋ(&E)... Move &up ਉੱਤੇ ਭੇਜੋ(&u) Move do&wn ਹੇਠਾਂ ਭੇਜੋ(&w) Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General ਆਮ(&G) Auto&rotate when the panel is vertical ਜਦੋ ਪੈਨਲ ਖੜ੍ਹਵਾਂ ਹੋਵੇ ਤਾਂ ਆਪੇ ਘੁੰਮਾਓ(&r) Show &week numbers in popup calendar ਪੌਪਅੱਪ ਕੈਲੰਡਰ ਵਿੱਚ ਹਫ਼ਤੇ ਦਾ ਨੰਬਰ ਵੇਖਾਓ(&w) S&how tooltip ਟੂਲਟਿੱਪ ਵੇਖਾਓ(&h) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name ਕਸਟਮ ਸਮਾਂ ਖੇਤਰ ਦਾ ਨਾਂ ਦਿਓ LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration ਸੰਸਾਰ ਘੜੀ ਖੁਦ ਦਿੱਤਾ ਫਾਰਮੈਟ ਸੰਰਚਨਾ <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones ਸੰਸਾਰ ਘੜੀ ਸਮਾਂ ਜ਼ੋਨ Time zone ਸਮਾਂ ਖੇਤਰ Name ਨਾਂ Comment ਟਿੱਪਣੀ Country ਦੇਸ਼ UTC UTC Other ਹੋਰ Local timezone ਲੋਕਲ ਸਮਾਂ-ਖੇਤਰ ================================================ FILE: plugin-worldclock/translations/worldclock_pl.desktop.yaml ================================================ Desktop Entry/Name: "Zegar światowy" Desktop Entry/Comment: "Wtyczka zegara światowego" ================================================ FILE: plugin-worldclock/translations/worldclock_pl.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Ustawienia zegara światowego Display &format &Format wyświetlania &Time &Czas F&ormat: F&ormat: Short Krótki Long Długi Custom Niestandardowy Sho&w seconds Poka&zuj sekundy Pad &hour with zero Dodaj zero do &godziny T&ime zone &Strefa czasowa &Position: &Położenie: For&mat: For&mat: Below Poniżej Above Nad Before Przed After Po Offset from UTC Różnica względem UTC Abbreviation Skrót IANA id ID IANA Custom name Niestandardowa nazwa &Use 12-hour format &Używaj formatu 12-godzinnego Location identifier Identyfikator położenia &Date &Data Po&sition: &Położenie: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year &Pokazuj rok Show day of wee&k Po&kazuj dzień tygodnia Pad d&ay with zero Z&acznij dzień zerem &Long month and day of week names &Długie nazwy miesięcy i dni tygodnia Ad&vanced manual format Zaawansowany &ręczny format &Customize ... &Dostosuj… Time &zones Strefy c&zasowe &Add ... Dod&aj… &Remove &Usuń Set as &default Ustaw jako &domyślne &Edit custom name ... &Edytuj niestandardową nazwę… Move &up Przenieś w &górę Move do&wn Przenieś &w dół Change displayed time zone with mouse wheel Zmień wyświetlaną strefę czasową za pomocą kółka myszy <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Uwaga:</b> kliknij środkowym przyciskiem myszy zegar, aby wyświetlić godzinę i datę dla wszystkich skonfigurowanych stref czasowych. &General O&gólne Auto&rotate when the panel is vertical Ob&racaj automatycznie przy pionowym panelu Show &week numbers in popup calendar Pokazuj numery tygodni w kalendarzu poręcznym S&how tooltip Pokazuj pasek narzędzi '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Wprowadź niestandardową strefę czasową LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Ręczna konfiguracja formatu zegara światowego <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Składnia niestandardowego formatu daty/godziny</h1> <p>Wzorzec daty to ciąg znaków, w którym określone ciągi znaków są zastępowane danymi daty i godziny z kalendarza podczas formatowania lub używany do generowania danych dla kalendarza podczas analizowania.</p> <p>Poniższa tabela symboli pola daty zawiera znaki używane we wzorcach, aby pokazać odpowiednie formaty dla danego języka, na przykład rrrr dla roku. Znaki mogą być użyte wielokrotnie. Na przykład, jeśli y jest używane jako rok, „yy” może dać „99”, podczas gdy „rrrr” daje „1999”. W przypadku większości pól liczbowych liczba znaków określa szerokość pola. Na przykład, jeśli h jest godziną, 'h' może dać '5', ale 'hh' da '05'. W przypadku niektórych znaków liczba określa, czy należy użyć formy skróconej, czy pełnej, ale może mieć inne możliwości, jak podano poniżej.</p> <p>Dwa pojedyncze cudzysłowy oznaczają dosłowny pojedynczy cudzysłów, wewnątrz lub na zewnątrz pojedynczych cudzysłowów. Tekst ujęty w pojedyncze cudzysłowy nie jest w żaden sposób interpretowany (z wyjątkiem dwóch sąsiadujących ze sobą pojedynczych cudzysłowów). W przeciwnym razie wszystkie litery ASCII od a do z i od A do Z są zarezerwowane jako znaki składni i wymagają cytowania, jeśli mają reprezentować znaki dosłowne. Ponadto niektóre znaki interpunkcyjne ASCII mogą w przyszłości stać się zmienne (np. „:” jest interpretowany jako separator czasu, a „/” jako separator daty i jest zastępowany odpowiednimi znakami zależnymi od ustawień regionalnych na wyświetlaczu).<br />< /p> <table border="1" width="100%" cellpadding="4" cellpacing="0"> <tr><th width="20%">Kod</th><th>Znaczenie</th></tr> <tr><td>d</td><td>dzień jako liczba bez wiodącego zera (1 do 31)</td></tr> <tr><td>dd</td><td>dzień jako liczba z wiodącym zerem (od 01 do 31)</td></tr> <tr><td>ddd</td><td>skrócona, zlokalizowana nazwa dnia (np. „Pon” do „Nd”).</td></tr> <tr><td>dddd</td><td>długa zlokalizowana nazwa dnia (np. „od poniedziałku” do „niedzieli”).</td></tr> <tr><td>M</td><td>miesiąc jako liczba bez wiodącego zera (1-12)</td></tr> <tr><td>MM</td><td>miesiąc jako liczba z wiodącym zerem (01-12)</td></tr> <tr><td>MMM</td><td>skrócona zlokalizowana nazwa miesiąca (np. od „Jan” do „Dec”).</td></tr> <tr><td>MMMM</td><td>długa zlokalizowana nazwa miesiąca (np. „Styczeń” do „Grudzień”).</td></tr> <tr><td>rr</td><td>rok jako dwucyfrowa liczba (00-99)</td></tr> <tr><td>rrrr</td><td>rok w postaci czterocyfrowej</td></tr> <tr><td>h</td><td>godzina bez wiodącego zera (od 0 do 23 lub od 1 do 12 w przypadku wyświetlania AM/PM)</td></tr> <tr><td>hh</td><td>godzina z wiodącym zerem (od 00 do 23 lub od 01 do 12 w przypadku wyświetlania AM/PM)</td></tr> <tr><td>H</td><td>godzina bez wiodącego zera (od 0 do 23, nawet przy wyświetlaniu AM/PM)</td></tr> <tr><td>GG</td><td>godzina z wiodącym zerem (od 00 do 23, nawet przy wyświetlaniu AM/PM)</td></tr> <tr><td>m</td><td>minuta bez wiodącego zera (0 do 59)</td></tr> <tr><td>mm</td><td>minuta z wiodącym zerem (od 00 do 59)</td></tr> <tr><td>s</td><td>drugi bez wiodącego zera (0 do 59)</td></tr> <tr><td>ss</td><td>drugi z wiodącym zerem (od 00 do 59)</td></tr> <tr><td>AP <i>lub</i>A</td><td>użyj wyświetlania AM/PM. <b>A/AP</b> zostanie zastąpione przez „AM” lub „PM”.</td></tr> <tr><td>ap <i>lub</i></td><td>użyj wyświetlania am/pm. <b>a/ap</b> zostanie zastąpione przez „am” lub „pm”.</td></tr> <tr><td>t</td><td>strefa czasowa (np. „CEST”)</td></tr> <tr><td>T</td><td>przesunięcie względem UTC</td></tr> <tr><td>TT</td><td>identyfikator strefy czasowej IANA</td></tr> <tr><td>TTT</td><td>skrót strefy czasowej</td></tr> <tr><td>TTTT</td><td>krótka wyświetlana nazwa strefy czasowej</td></tr> <tr><td>TTTTT</td><td>długa wyświetlana nazwa strefy czasowej</td></tr> <tr><td>TTTTTT</td><td>niestandardowa nazwa strefy czasowej. Możesz to zmienić w zakładce „Strefy czasowe” w oknie konfiguracji</td></tr></table> <br /><b>Uwagi:</b> <ul><li>Wszelkie znaki we wzorcu spoza zakresu ['a'..'z'] i ['A'..'Z '] będzie traktowany jako tekst w cudzysłowie. Na przykład znaki takie jak ':', '.', ' ', '#' i '@' pojawią się w wynikowym tekście czasu, nawet jeśli nie są ujęte w pojedyncze cudzysłowy. Pojedynczy cudzysłów służy do „ucieczki” liter. Dwa pojedyncze cudzysłowy z rzędu, wewnątrz lub na zewnątrz cytowanej sekwencji, reprezentują „prawdziwy” pojedynczy cudzysłów.</li><li>Minimalny interwał aktualizacji to 1 sekunda. Jeśli skonfigurowano z lub zzz, czas jest wyświetlany z ułamkiem milisekund, ale nie jest aktualizowany na podstawie milisekund (unikając dużego spadku wydajności).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Strefy czasowe zegara światowego Time zone Strefa czasowa Name Nazwa Comment Komentarz Country Kraj UTC UTC Other Inne Local timezone Lokalna strefa czasowa ================================================ FILE: plugin-worldclock/translations/worldclock_pt.desktop.yaml ================================================ Desktop Entry/Name: "Relógio mundial" Desktop Entry/Comment: "Extra para mostrar um relógio mundial" ================================================ FILE: plugin-worldclock/translations/worldclock_pt.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d de MMM de yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Definições do Relógio mundial Time &zones Fusos &horários &Add ... &Adicionar... &Remove &Remover Set as &default Utilizar como pa&drão Move &up Mover para &cima Move do&wn Mover para &baixo Display &format &Formato de exibição &Time &Hora F&ormat: F&ormato: Short Curto Long Longo Custom Personalizado Sho&w seconds Mo&strar segundos Pad &hour with zero Mostrar zero inicial nas &horas &Use 12-hour format &Utilizar formato AM/PM T&ime zone Fuso horár&io &Position: &Posição: For&mat: For&mato: Below Abaixo Above Acima Before Antes After Depois Offset from UTC Desvio da UTC Abbreviation Abreviatura Location identifier Identificador da localização Custom name Nome personalizado &Date &Data Po&sition: Po&sição: Fo&rmat: Fo&rmato: ISO 8601 ISO 8601 Show &year Mostrar &ano Show day of wee&k Mostrar dia da se&mana Pad d&ay with zero Mostrar zero inicial nos di&as &Long month and day of week names Mês &longo e nome do dia da semana Ad&vanced manual format Formato a&vançado &Customize ... &Personalizar... IANA id ID IANA &Edit custom name ... &Editar nome personalizado... Change displayed time zone with mouse wheel Alterar o fuso horário apresentado com a roda do rato <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Nota:</b> Clique com o botão do meio no relógio para ver a hora e a data de todos os fusos horários configurados. &General &Geral Auto&rotate when the panel is vertical &Rodar automaticamente se o painel for vertical Show &week numbers in popup calendar Mostrar número da se&mana no calendário S&how tooltip &Mostrar dicas '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d de MMM de yyyy'<br/>'TT'</font>' Input custom time zone name Digite o nome do fuso horário LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuração manual do formato do relógio <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Sintaxe do formato da Data/Hora personalizado</h1> <p>Um padrão de data é uma cadeia de caracteres, onde cadeias específicas de caracteres são substituídas por dados de data e hora de um calendário ao formatar ou usados para gerar dados para um calendário ao analisar.</p> <p>A tabela de símbolos de campo de data abaixo contém os caracteres utilizados nos padrões para mostrar os formatos apropriados para um determinado local, tais como yyyy para o ano. Os caracteres podem ser utilizados várias vezes. Por exemplo, se y for utilizado para o ano, 'yyy' pode produzir '99', enquanto que 'yyyyy' produz '1999'. Para a maioria dos campos numéricos, o número de caracteres especifica a largura do campo. Por exemplo, se h for a hora, 'h' pode produzir '5', mas 'hh' produz '05'. Para alguns caracteres, a contagem especifica se deve ser utilizada uma forma abreviada ou completa, mas pode ter outras escolhas, como indicado abaixo.</p> <p>Duas aspas simples representa uma citação simples literal, seja dentro ou fora de aspas simples. O texto dentro de aspas simples não é interpretado de forma alguma (excepto para duas aspas simples adjacentes). Caso contrário, todas as letras ASCII de a a a z e de A a Z são reservadas como caracteres de sintaxe, e requerem citação se quiserem representar caracteres literais. Além disso, certos caracteres de pontuação ASCII podem tornar-se variáveis no futuro (por exemplo ":" sendo interpretados como separador de tempo e '/' como separador de data, e substituídos pelos respectivos caracteres sensíveis ao local em exibição).<br /></p> <borda de mesa="1" width="100%" cellpadding="4" cellspacing="0"> <tr><<largitude="20%">Código</th>>th>Meaning</th></tr> <tr>>d>d>/td>>> o dia como número sem um zero inicial (1 a 31)</td>></tr> <tr>>dd>dd</td>>> o dia como número com um zero inicial (01 a 31)</td></tr> <tr>>d>ddd</td>>> o nome abreviado do dia localizado (por exemplo, 'Seg' a 'Dom').</td>></tr> <tr>>d>dddd</td>>> o longo nome do dia localizado (por exemplo, 'segunda-feira' a 'domingo').</td>></tr> <tr>>>M</td>>> o mês como número sem um zero inicial (1-12)</td></tr> <tr>>MM</td>>>> o mês como número com um zero inicial (01-12)</td>></tr> <tr>>MMM</td>>>> o nome abreviado do mês localizado (por exemplo, 'Jan' a 'Dez').</td>></tr> <tr>>MMMM</td>>>> o longo nome do mês localizado (por exemplo, 'Janeiro' a 'Dezembro').</td>></tr> <tr><<<</td>>> o ano como número de dois dígitos (00-99)</td>></tr> <tr>>yyyyy</td>>>o ano como número de quatro dígitos</td></tr> <tr><<</td>h</td>> a hora sem um zero inicial (0 a 23 ou 1 a 12 se visualização AM/PM)</td></tr> <tr>>hh</td></td>> a hora com um zero inicial (00 a 23 ou 01 a 12 se visualização AM/PM)</td></tr> <tr><<<</td>>> a hora sem um zero inicial (0 a 23, mesmo com visualização AM/PM)</td></tr> <tr><<</td>HH</td>> a hora com um zero inicial (00 a 23, mesmo com visualização AM/PM)</td></tr> <tr><</td>m</td>>>o minuto sem um zero inicial (0 a 59)</td></tr> <tr><</td>mm</td>>>o minuto com um zero inicial (00 a 59)</td></tr> <tr>>>s</td>>> segundo sem um zero inicial (0 a 59)</td></tr> <tr><</td>ss</td>>> o segundo com um zero inicial (00 a 59)</td></tr> <tr><<<td>AP <i>ou</i> A</td>>>utilizar visor AM/PM. <b>A/AP</b> será substituído ou por "AM" ou "PM".</td></tr> <tr><<<td>ap <i>ou</i> a</td>>>use visualização am/pm. <b>a/ap</b> será substituído ou por "am" ou "pm".</td></tr> <tr>>td>t</td>>td> o fuso horário (por exemplo, "CEST")</td></tr> <tr>>td>T</td>>> o offset da UTC</td>>/tr> <tr>>TT</td>>> o fuso horário IANA id</td></tr> <tr>>TTTT</td>>> a abreviatura de fuso horário</td></tr> <tr>>TTTTT</td>>> o nome de exibição curta do fuso horário</td></tr> <tr>>TTTTTT</td>>> o nome do fuso horário de exibição longo</td></tr> <tr>>TTTTTTT</td>>td> o nome personalizado do fuso horário. Pode alterar o separador 'Fusos horários' da janela de configuração</td></tr></tabela> <br /><b>Notas:</b> <ul><li>Quaisquer caracteres do padrão que não se encontrem no intervalo de ['a'...'z'] e ['A'...'Z'] serão tratados como texto citado. Por exemplo, caracteres como ':', '.', ' '', '#' e '@' aparecerão no texto resultante, mesmo que não estejam entre aspas simples. A citação única é utilizada para 'escapar' às letras. Duas aspas simples seguidas, dentro ou fora de uma sequência citada, representam uma única citação 'real'.</li><li>O intervalo de actualização mínimo é de 1 segundo. Se z ou zzz for configurado o tempo é mostrado com a fracção de milissegundos, mas não actualizado na base de milissegundos (evitando um grande impacto de desempenho).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fusos horários do relógio mundial Time zone Fuso horário Name Nome Comment Comentário Country País UTC UTC Other Outro Local timezone Fuso horário local ================================================ FILE: plugin-worldclock/translations/worldclock_pt_BR.desktop.yaml ================================================ Desktop Entry/Name: "Relógio mundial" Desktop Entry/Comment: "Exibe um relógio com calendário e fusos horários" ================================================ FILE: plugin-worldclock/translations/worldclock_pt_BR.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d 'de' MMM 'de' yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Configurações do Relógio Mundial Display &format Exibir &formato &Time &Tempo F&ormat: F&ormato: Short Curto Long Longo Custom Personalizado Sho&w seconds E&xibir segundos Pad &hour with zero Mostrar &hora com zero T&ime zone Fuso Horár&io &Position: &Posição: For&mat: For&mato: Below Abaixo Above Acima Before Antes After Depois Offset from UTC Deslocamento de UTC Abbreviation Abreviação IANA id Id IANA Custom name Nome personalizado &Use 12-hour format &Usar formato 12-horas Location identifier Identificador de localização &Date &Data Po&sition: Po&sição: Fo&rmat: Fo&rmato: ISO 8601 ISO 8601 Show &year Exibir A&no Show day of wee&k Exibir dia da &semana Pad d&ay with zero Pad di&a com zero &Long month and day of week names Nomes &longos do mês e dia da semana Ad&vanced manual format Formato do manual avançado &Customize ... &Customizar ... Time &zones Fusos &horários &Add ... &Adicionar ... &Remove &Remover Set as &default Definir como pa&drão &Edit custom name ... &Editar nome personalizado ... Move &up Mover para ci&ma Move do&wn Mover para bai&xo Change displayed time zone with mouse wheel Altere o fuso horário exibido com a roda do mouse <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Nota:</b> Clique com o botão do meio do mouse sobre o relógio para visualizar hora e data de todos os fusos horários configurados. &General &Geral Auto&rotate when the panel is vertical Gi&rar automaticamente quando o painel está na vertical Show &week numbers in popup calendar Exibir os números da &semana no calendário pop-up S&how tooltip E&xibir dicas '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br /><font size="-2">'ddd, d MMM yyyy'<br />'TT'</font>' Input custom time zone name Inserir nome do fuso horário personalizado LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Configuração Manual do Formato Relógio Mundial <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1> Sintaxe de formato de data / hora personalizado </h1> <p> Um padrão de data é uma sequência de caracteres, em que sequências específicas de caracteres são substituídas por dados de data e hora de um calendário durante a formatação ou usados para gerar dados para um calendário durante a análise. </p> <p> A Tabela de símbolos do campo de data abaixo contém os caracteres usados em padrões para mostrar os formatos apropriados para um determinado local, como aaaa para o ano. Os caracteres podem ser usados várias vezes. Por exemplo, se y for usado para o ano, 'yy' pode produzir '99', enquanto 'yyyy' produz '1999'. Para a maioria dos campos numéricos, o número de caracteres especifica a largura do campo. Por exemplo, se h é a hora, 'h' pode produzir '5', mas 'hh' produz '05'. Para alguns caracteres, a contagem especifica se uma forma abreviada ou completa deve ser usada, mas pode haver outras opções, conforme mostrado abaixo. </p> <p> Duas aspas simples representam uma aspa simples literal, dentro ou fora das aspas simples. O texto entre aspas simples não é interpretado de forma alguma (exceto para duas aspas simples adjacentes). Caso contrário, todas as letras ASCII de a a z e de A a Z são reservadas como caracteres de sintaxe e requerem aspas para representar caracteres literais. Além disso, certos caracteres de pontuação ASCII podem se tornar variáveis no futuro (por exemplo, ":" sendo interpretado como o separador de hora e '/' como um separador de data, e substituído pelos respectivos caracteres sensíveis ao local no display). <br /> < / p> <table border = "1" width = "100%" cellpadding = "4" cellspacing = "0"> <tr> <th width = "20%"> Código </th> <th> Significado </th> </tr> <tr><td>d</td> <td> o dia como um número sem zero à esquerda (1 a 31) </td> </tr> <tr><td>dd</td> <td> o dia como um número com um zero à esquerda (01 a 31) </td> </tr> <tr><td>ddd</td> <td> o nome abreviado do dia localizado (por exemplo, 'Seg' para 'Sol'). </td> </tr> <tr><td>dddd</td> <td> o nome longo do dia localizado (por exemplo, 'Segunda-feira' a 'Domingo'). </td> </tr> <tr><td>M</td> <td> o mês como um número sem zero à esquerda (1-12) </td> </tr> <tr><td>MM</td> <td> o mês como um número com um zero à esquerda (01-12) </td> </tr> <tr><td>MMM</td> <td> o nome abreviado do mês localizado (por exemplo, 'Jan' a 'Dez'). </td> </tr> <tr><td>MMMM</td> <td> o nome longo do mês localizado (por exemplo, 'janeiro' a 'dezembro'). </td> </tr> <tr><td>yy</td> <td> o ano como um número de dois dígitos (00-99) </td> </tr> <tr><td>yyyy</td> <td> o ano como um número de quatro dígitos </td> </tr> <tr><td>h</td> <td> a hora sem zero à esquerda (0 a 23 ou 1 a 12 se exibir AM / PM) </td> </tr> <tr><td>hh</td> <td> a hora com um zero à esquerda (00 a 23 ou 01 a 12 se exibir AM / PM) </td> </tr> <tr><td>H</td> <td> a hora sem zero à esquerda (0 a 23, mesmo com exibição de AM / PM) </td> </tr> <tr><td>HH</td> <td> a hora com um zero à esquerda (00 a 23, mesmo com exibição de AM / PM) </td> </tr> <tr><td>m</td> <td> o minuto sem zero à esquerda (0 a 59) </td> </tr> <tr><td>mm</td> <td> o minuto com um zero à esquerda (00 a 59) </td> </tr> <tr><td>s</td> <td> o segundo sem zero à esquerda (0 a 59) </td> </tr> <tr><td>ss</td> <td> o segundo com um zero à esquerda (00 a 59) </td> </tr> <tr> <td> AP <i> ou </i> A </td> <td> usa exibição AM / PM. <b> A / AP </b> será substituído por "AM" ou "PM". </td> </tr> <tr> <td> ap <i> ou </i> a </td> <td> use a exibição am / pm. <b> a / ap </b> será substituído por "am" ou "pm". </td> </tr> <tr><td>t</td> <td> o fuso horário (por exemplo, "CEST") </td> </tr> <tr><td>T</td> <td> o deslocamento do UTC </td> </tr> <tr><td>TT</td> <td> o ID do fuso horário IANA </td> </tr> <tr><td>TTT</td> <td> a abreviação do fuso horário </td> </tr> <tr><td>TTTT</td> <td> o nome de exibição abreviado do fuso horário </td> </tr> <tr><td>TTTTT</td> <td> o nome de exibição longo do fuso horário </td> </tr> <tr><td>TTTTTT</td> <td> o nome personalizado do fuso horário. Você pode alterá-lo na guia 'Fusos horários' da janela de configuração </td> </tr> </table> <br /> <b> Observações: </b> <ul> <li> Quaisquer caracteres no padrão que não estejam nos intervalos de ['a' .. 'z'] e ['A' .. 'Z '] será tratado como texto citado. Por exemplo, caracteres como ':', '.', '', '#' E '@' aparecerão no texto da hora resultante, mesmo que não estejam entre aspas simples. A aspa simples é usada para 'escapar' letras. Duas aspas simples consecutivas, seja dentro ou fora de uma sequência entre aspas, representam uma aspa simples 'real'. </li> <li> O intervalo mínimo de atualização é de 1 segundo. Se z ou zzz for configurado, o tempo é mostrado com a fração de milissegundos, mas não atualizado em uma base de milissegundos (evitando grande impacto no desempenho). </li> <ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Fusos Horários Relógio Mundial Time zone Fuso horário Name Nome Comment Comentário Country País UTC UTC Other Outro Local timezone Fuso horário local ================================================ FILE: plugin-worldclock/translations/worldclock_ru.desktop.yaml ================================================ Desktop Entry/Name: "Мировое время" Desktop Entry/Comment: "Плагин мирового времени" ================================================ FILE: plugin-worldclock/translations/worldclock_ru.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Настройки мирового времени Time &zones Часовые &пояса &Add ... &Добавить… &Remove &Удалить Set as &default Установить &по умолчанию Move &up &Выше Move do&wn &Ниже Display &format Формат &отображения &Time &Время F&ormat: Ф&ормат: Short Короткий Long Длинный Custom Свой Sho&w seconds П&оказывать секунды Pad &hour with zero Дополнить &час нулём T&ime zone Ч&асовой пояс &Position: &Расположение: For&mat: Ф&ормат: Below Ниже Above Выше Before До After После Offset from UTC Сдвиг относительно UTC Abbreviation Сокращение IANA id Change displayed time zone with mouse wheel Изменять отображаемый часовой пояс колесом мыши <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Замечание:</b> По среднему щелчку мыши можно посмотреть время и дату во всех заданных часовых поясах. Show &week numbers in popup calendar Показывать номера &недель во всплывающем календаре S&how tooltip Показывать всплывающую под&сказку Custom name Своё имя &Use 12-hour format &Использовать 12-часовой формат Location identifier Идентификатор местоположения &Date &Дата Po&sition: &Расположение: Fo&rmat: Ф&ормат: ISO 8601 Show &year П&оказывать год Show day of wee&k Показывать день &недели Pad d&ay with zero Дополнить &день нулём &Long month and day of week names &Длинные названия месяцев и дней недели Ad&vanced manual format &Продвинутый ручной формат &Customize ... &Настроить ... &Edit custom name ... &Изменить своё имя ... &General &Общие Auto&rotate when the panel is vertical Авто&поворот для вертикальной панели '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Введите своё имя для часового пояса LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Настройка пользовательского формата мирового времени <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Синтаксис пользовательского формата даты/времени</h1> <p>Шаблон даты — это строка, в которой определённые последовательности символов при форматировании заменяются значениями календарных даты и времени или при синтаксическом анализе используются для раздора соответствующих календарных данных.</p> <p>Таблица ниже содержит буквы, используемые в шаблонах для отображения соответствующих форматов в данной локали, например, «yyyy» — это год. Отдельные буквы могут повторяться разное количество раз. Например, «y» означает год, тогда значение «yy» может вывести «99», а «yyyy» — «1999». Для большинства числовых полей количество повторяющихся букв определяет ширину поля. Например, «h» — это час, тогда «h» выведет «5», а «hh» — «05». Для некоторых букв количество повторений указывает, следует ли использовать сокращённую или полную форму, но может иметь и другие значения, как указано далее.</p> <p>Две одинарные кавычки, идущие подряд, дают одну фактическую одинарную кавычку в выводе (как внутри, так и снаружи других кавычек). Если текст заключён внутрь одинарных кавычек, то он никоим образом не интерпретируется (за исключением двух соседних кавычек). В противном случае все латинские буквенные символы таблицы ASCII (от a до z и от A до Z) считаются имеющими специальные значения и требуют обрамления в кавычки, в случае если они подразумеваются непосредственно как буквы. Кроме того, некоторые знаки препинания ASCII также могут стать переменными в будущем (например, «:» может интерпретироваться как разделитель времени, а «/» — как разделитель даты и заменяться соответствующими зависящими от локали символами при отображении).<br/></р> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Код</th><th>Значение</th></tr> <tr><td>d</td><td>день в виде числа без ведущего нуля (от 1 до 31)</td></tr> <tr><td>dd</td><td>день в виде числа с ведущим нулём (от 01 до 31)</td></tr> <tr><td>ddd</td><td>сокращённое локализованное название дня (например, от «пн» до «вс»).</td></tr> <tr><td>dddd</td><td>длинное локализованное название дня (например, от «понедельник» до «воскресенье»).</td></tr> <tr><td>M</td><td>месяц в виде числа без ведущего нуля (1-12)</td></tr> <tr><td>MM</td><td>месяц как число с ведущим нулём (01-12)</td></tr> <tr><td>MMM</td><td>сокращённое локализованное название месяца (например, от «янв» до «дек»).</td></tr> <tr><td>MMMM</td><td>длинное локализованное название месяца (например, от «январь» до «декабрь»).</td></tr> <tr><td>yy</td><td>год в виде двузначного числа (00-99)</td></tr> <tr><td>yyyy</td><td>год в виде четырёхзначного числа</td></tr> <tr><td>h</td><td>час без ведущего нуля (от 0 до 23 или от 1 до 12, если используется AM/PM)</td></tr> <tr><td>hh</td><td>час с ведущим нулём (от 00 до 23 или от 01 до 12, если используется AM/PM)</td></tr> <tr><td>H</td><td>час без ведущего нуля (от 0 до 23, даже при использовании AM/PM)</td></tr> <tr><td>HH</td><td>час с ведущим нулём (от 00 до 23, даже при использовании AM/PM)</td></tr> <tr><td>m</td><td>минуты без ведущего нуля (от 0 до 59)</td></tr> <tr><td>mm</td><td>минуты с ведущим нулём (от 00 до 59)</td></tr> <tr><td>s</td><td>секунды без ведущего нуля (от 0 до 59)</td></tr> <tr><td>ss</td><td>секунды с ведущим нулём (от 00 до 59)</td></tr> <tr><td>AP<i>или</i>A</td><td>использовать формат AM/PM.<b>A/AP</b>будет заменено на «ДП» (до полудня) или «ПП» (после полудня). Конкретные значения могут зависят от локали.</td></tr> <tr><td>ap<i>или</i>a</td><td>использовать формат am/pm.<b>a/ap</b>будет заменено на «дп» или «пп». Конкретные значения могут зависят от локали.</td></tr> <tr><td>t</td><td>часовой пояс (например, «MSK»)</td></tr> <tr><td>T</td><td>смещение относительно UTC (например, «+03:00»)</td></tr> <tr><td>TT</td><td>идентификатор IANA часового пояса (например «Europe/Moscow»)</td></tr> <tr><td>TTT</td><td>аббревиатура имени часового пояса (например «MSK»)</td></tr> <tr><td>TTTT</td><td>краткое имя часового пояса (например «GMT+3»)</td></tr> <tr><td>TTTTT</td><td>длинное имя часового пояса (например «Москва, стандартное время»)</td></tr> <tr><td>TTTTTT</td><td>пользовательское имя часового пояса. Вы можете изменить его на вкладке «Часовые пояса»</td></tr> </table> <br/><b>Примечания.</b> <ul> <li>Любые символы в шаблоне, не входящие в диапазоны ['a' … 'z'] и ['A' … 'Z'] будут рассматриваться как фактический текст. В частности, такие символы, как ':', '.', ' ', '#' и '@', будут отображаться в результирующем тексте, даже если они не заключены в одинарные кавычки. Одиночная кавычка используется для «экранирования» латинских букв. Две одинарные кавычки подряд, внутри или вне других кавычек, представляют собой «настоящие» одинарные кавычки.</li> <li>Минимальный период обновления равен 1 секунде. Если z или zzz включены в формат, то время будет отображаться с миллисекундами, но не обновляется каждую миллисекунду (во избежание значительного снижения производительности).</li> </ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Часовые пояса мирового времени Time zone Часовой пояс Name Название Comment Коментарий Country Страна UTC UTC Other Другое Local timezone Местный часовой пояс ================================================ FILE: plugin-worldclock/translations/worldclock_si.desktop.yaml ================================================ Desktop Entry/Name: "" Desktop Entry/Comment: "" ================================================ FILE: plugin-worldclock/translations/worldclock_si.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Display &format &Time F&ormat: Short Long Custom Sho&w seconds Pad &hour with zero T&ime zone &Position: For&mat: Below Above Before After Offset from UTC Abbreviation IANA id Custom name &Use 12-hour format Location identifier &Date Po&sition: Fo&rmat: ISO 8601 Show &year Show day of wee&k Pad d&ay with zero &Long month and day of week names Ad&vanced manual format &Customize ... Time &zones &Add ... &Remove Set as &default &Edit custom name ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General Auto&rotate when the panel is vertical Show &week numbers in popup calendar S&how tooltip '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Time zone Name Comment Country UTC Other Local timezone ================================================ FILE: plugin-worldclock/translations/worldclock_sk.desktop.yaml ================================================ Desktop Entry/Name: "Svetový čas" Desktop Entry/Comment: "Zobrazuje hodiny s kalendárom v rôznych časových pásmach" ================================================ FILE: plugin-worldclock/translations/worldclock_sk_SK.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Nastavenie hodín zobrazujúcich miestny čas z rôznych časových pásiem Display &format &Formát zobrazenia &Time &Čas F&ormat: &Formát: Short Krátky Long Dlhý Custom Určený užívateľom Sho&w seconds &Ukazovateľ sekúnd Pad &hour with zero &Zarovnať zobrazenie hodín nulou na začiatku T&ime zone &Časové pásmo &Position: &Poloha: For&mat: &Formát: Below Pod Above Nad Before Pred After Za Offset from UTC Posuv voči svetovému času (UTC) Abbreviation Skratka IANA id ID- IANA Custom name Užívateľom určený názov &Use 12-hour format &Použiť 12-hodinový formát Location identifier Názov lokality &Date &Dátum Po&sition: &Umiestnenie: Fo&rmat: &Formát: ISO 8601 ISO 8601 Show &year &Zobraziť rok Show day of wee&k &Zobraziť deň v týždni Pad d&ay with zero &Zarovnať zobrazenie dňa v mesiaci nulou na začiatku &Long month and day of week names &Dlhé názvy mesiacov a dní v týždni Ad&vanced manual format &Pokročilý ručný formát &Customize ... &Prispôsobiť... Time &zones &Časové pásma &Add ... &Pridať... &Remove &Odstrániť Set as &default &Nastaviť na preddefinované &Edit custom name ... &Upraviť užívateľom stanovený názov... Move &up &Posunúť smerom hore Move do&wn &Posunúť smerom dole Change displayed time zone with mouse wheel Zmeň zobrazované časové pásmo pomocou kolieska myši <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Poznámka:</b> Kliknutím na hodiny prostredným tlačidlom zobrazíte čas a dátum pre všetky nastavené časové pásma. &General &Všeobecné Auto&rotate when the panel is vertical &Pri zvisle orientovanom paneli natočiť tak, aby boli vodorovne Show &week numbers in popup calendar V &kalendári zobraziť čísla týždňov S&how tooltip &Zobraziť popisy ikon '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM rrrr'<br/>'ČČ'</font>' Input custom time zone name Zadať užívateľom stanovený názov časového pásma LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Ručné nastavenie formátu svetových hodín <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Vlastná syntax formátu dátumu/času</h1> <p>Vzor dátumu je reťazec znakov, v ktorom sú špecifické reťazce znakov nahradené údajmi dátumu a času z kalendára pri formátovaní alebo sa používajú na generovanie údajov pre kalendár pri analýze.</p> <p>Tabuľka symbolov poľa dátumu nižšie obsahuje znaky používané vo vzoroch na zobrazenie vhodných formátov pre dané miestne nastavenie, ako napríklad yyyy pre rok. Znaky môžu byť použité viackrát. Napríklad, ak sa pre rok použije y, „yy“ môže vytvoriť „99“, zatiaľ čo „yyyy“ vytvorí „1999“. Pre väčšinu číselných polí počet znakov určuje šírku poľa. Napríklad, ak h je hodina, „h“ môže vytvoriť „5“, ale „hh“ vytvorí „05“. Pre niektoré znaky počet určuje, či sa má použiť skrátená alebo úplná forma, ale môžu mať aj iné možnosti, ako je uvedené nižšie.</p> <p>Dve jednoduché úvodzovky predstavujú doslovné jednoduché úvodzovky, či už vo vnútri alebo mimo jednoduchých úvodzoviek. Text v jednoduchých úvodzovkách nie je žiadnym spôsobom interpretovaný (okrem dvoch susediacich jednoduchých úvodzoviek). V opačnom prípade sú všetky písmená ASCII od a po z a od A po Z vyhradené ako znaky syntaxe a vyžadujú citácie, ak majú reprezentovať doslovné znaky. Okrem toho sa niektoré interpunkčné znaky ASCII môžu v budúcnosti stať premenlivými (napr. „:“ sa bude interpretovať ako oddeľovač času a „/“ ako oddeľovač dátumu a na displeji sa nahradí príslušnými znakmi citlivými na miestne nastavenie).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kód</th><th>Význam</th></tr> <tr><td>d</td><td>deň ako číslo bez úvodnej nuly (1 až 31)</td></tr> <tr><td>dd</td><td>deň ako číslo s nulou na začiatku (01 až 31)</td></tr> <tr><td>ddd</td><td>skrátený lokalizovaný názov dňa (napr. „Pon“ až „Ne“).</td></tr> <tr><td>dddd</td><td>dlhý lokalizovaný názov dňa (napr. „pondelok“ až „nedeľa“).</td></tr> <tr><td>M</td><td>mesiac ako číslo bez úvodnej nuly (1-12)</td></tr> <tr><td>MM</td><td>mesiac ako číslo s nulou na začiatku (01-12)</td></tr> <tr><td>MMM</td><td>skrátený lokalizovaný názov mesiaca (napr. 'Jan' až 'Dec').</td></tr> <tr><td>MMMM</td><td>dlhý lokalizovaný názov mesiaca (napr. 'Január' až 'December').</td></tr> <tr><td>yy</td><td>rok ako dvojciferné číslo (00-99)</td></tr> <tr><td>yyyy</td><td>rok ako štvormiestne číslo</td></tr> <tr><td>h</td><td>hodina bez úvodnej nuly (0 až 23 alebo 1 až 12, ak sa zobrazuje AM/PM)</td></tr> <tr><td>hh</td><td>hodina s nulou na začiatku (00 až 23 alebo 01 až 12, ak sa zobrazuje AM/PM)</td></tr> <tr><td>H</td><td>hodina bez úvodnej nuly (0 až 23, dokonca aj pri zobrazení AM/PM)</td></tr> <tr><td>HH</td><td>hodina s úvodnou nulou (00 až 23, dokonca aj pri zobrazení AM/PM)</td></tr> <tr><td>m</td><td>minúta bez úvodnej nuly (0 až 59)</td></tr> <tr><td>mm</td><td>minúta s úvodnou nulou (00 až 59)</td></tr> <tr><td>s</td><td>druhá bez úvodnej nuly (0 až 59)</td></tr> <tr><td>ss</td><td>druhá s úvodnou nulou (00 až 59)</td></tr> <tr><td>AP <i>alebo</i> A</td><td>použite zobrazenie AM/PM. <b>A/AP</b> bude nahradené buď „AM“ alebo „PM“.</td></tr> <tr><td>ap <i>alebo</i> a</td><td>použite zobrazenie ráno/popoludní. <b>a/ap</b> bude nahradené buď "am" alebo "pm".</td></tr> <tr><td>t</td><td>časové pásmo (napr. „CEST“)</td></tr> <tr><td>T</td><td>posun od UTC</td></tr> <tr><td>TT</td><td>ID časového pásma IANA</td></tr> <tr><td>TTT</td><td>skratka časového pásma</td></tr> <tr><td>TTTT</td><td>krátky zobrazovaný názov časového pásma</td></tr> <tr><td>TTTTT</td><td>dlhý zobrazovaný názov časového pásma</td></tr> <tr><td>TTTTTT</td><td>vlastný názov časového pásma. Môžete to zmeniť na karte „Časové pásma“ v konfiguračnom okne</td></tr></table> <br /><b>Poznámky:</b> <ul><li>Akékoľvek znaky vo vzore, ktoré nie sú v rozsahu ['a'..'z'] a ['A'..'Z'], budú považované za text v úvodzovkách. Napríklad znaky ako ':', '.', ' ', '#' a '@' sa objavia vo výslednom časovom texte, aj keď nie sú uzavreté v jednoduchých úvodzovkách. Jednoduchá úvodzovka sa používa na „únikové“ písmená. Dve jednoduché úvodzovky za sebou, či už vo vnútri alebo mimo sekvencie úvodzoviek, predstavujú „skutočné“ jednoduché úvodzovky.</li><li>Minimálny interval aktualizácie je 1 sekunda. Ak je nakonfigurované z alebo zzz, čas sa zobrazuje v milisekundách, ale neaktualizuje sa na milisekúnd (aby sa predišlo veľkému zásahu do výkonu).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Časové pásma, z ktorých ukazovať miestny čas Time zone Časové pásmo Name Názov Comment Poznámka Country Krajina UTC Svetový čas (UTC) Other Ostatné Local timezone Miestne časové pásmo ================================================ FILE: plugin-worldclock/translations/worldclock_sr.desktop.yaml ================================================ Desktop Entry/Name: "Светски сат" Desktop Entry/Comment: "Приказује сат са календаром и временским зонама" ================================================ FILE: plugin-worldclock/translations/worldclock_sr.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd,d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Подешавања светског сата Display &format Прикажи &формат &Time &Време F&ormat: Ф&ормат: Short Кратко Long Дугачко Custom Sho&w seconds Прика&жи секунде Pad &hour with zero Постави &сат са нулом T&ime zone В&ременска зона &Position: &Позиција: For&mat: Фор&мат: Below Испод Above Изнад Before Пре After После Offset from UTC Помак од UTC Abbreviation Скраћеница IANA id IANA id Custom name Прилагођено име &Use 12-hour format &Користи 12-о часовни формат Location identifier Идентификатор локације &Date &Датум Po&sition: По&зиција: Fo&rmat: Фо&рмат: ISO 8601 ISO 8601 Show &year Прикажи &годину Show day of wee&k Прикажи дан седмиц&е Pad d&ay with zero Постави д&ан са нулом &Long month and day of week names &Дуги називи месеци и дана седмице Ad&vanced manual format На&предни ручни формат &Customize ... &Прилагоди ... Time &zones Временске &зоне &Add ... &Додај ... &Remove &Уклони Set as &default Постави као &подразумевано &Edit custom name ... &Измени прилагођено име ... Move &up Move do&wn Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General &Опште Auto&rotate when the panel is vertical Ауто&ротирај када је панел вертикалан Show &week numbers in popup calendar Прикажи &бројеве седмица у искачућем календару S&how tooltip П&рикажи поруку '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Унеси прилагођено име временске зоне LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Конфигурација ручног формата светског сата <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Прилагођено време/Синтакса временског формата</h1> <p>Образац датума је низ знакова, где се одређени низови знакова замењују подацима о датуму и времену из календара приликом форматирања или се користе за генерисање података за календар приликом рашчлањивања.</p> <p>Табела са симболима поља датума у наставку садржи знакове који се користе у обрасцима за приказивање одговарајућих формата за дати локал, као што је yyyy за годину. Знакови се могу користити више пута. На пример, ако се и користи за годину, 'yy' може произвести '99', док 'yyyy' производи '1999'. За већину нумеричких поља, број знакова одређује ширину поља. На пример, ако је h сат, 'h' може произвести '5', али 'hh' производи '05'. За неке знакове, број одређује да ли треба користити скраћени или пуни образац, али може имати и друге могућности, као што је дато у наставку.</п> <p>Два појединачна наводника представљају дословни појединачни наводник, унутар или изван једноструких наводника. Текст унутар појединачних наводника се не тумачи ни на који начин (осим два суседна једнострука наводника). У супротном, сва ASCII слова од а до з и од А до З су резервисана као знакови синтаксе и захтевају навођење ако желе да представљају литералне знакове. Поред тога, одређени ASCII знакови интерпункције могу постати променљиви у будућности (нпр. ":" се тумачи као сепаратор времена и '/' као сепаратор датума и замењен одговарајућим знаковима осетљивим на локализацију на екрану).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Код</th><th>Значење</th></tr> <tr><td>d</td><td>дан као број без нуле (1 до 31)</td></tr> <tr><td>dd</td><td>дан као број са нулом (01 до 31)</td></tr> <tr><td>ddd</td><td>сраћено локализовано име дана (Нпр. 'Mon' до 'Sun').</td></tr> <tr><td>dddd</td><td>дугачко локализивано име дана (нпр 'Monday' до 'Sunday).</td></tr> <tr><td>M</td><td>месец без нуле (1-12)</td></tr> <tr><td>MM</td><td>месец са нулом (01-12)</td></tr> <tr><td>MMM</td><td>скраћено локализовано име месеца (нпр. 'Jan' до 'Dec').</td></tr> <tr><td>MMMM</td><td>дугачко локализовано име месеца (нпр. 'January' до 'December').</td></tr> <tr><td>yy</td><td>година као две цифре (00-99)</td></tr> <tr><td>yyyy</td><td>година као четвороцифрени број</td></tr> <tr><td>h</td><td>сат без нуле (0 до 23 или 1 до 12 ако се AM/PM приказују)</td></tr> <tr><td>hh</td><td>сат са нулом (00 до 23 или 01 до 12 ако се AM/PM приказују)</td></tr> <tr><td>H</td><td>сат са нулом (0 до 23, иако се AM/PM приказују)</td></tr> <tr><td>HH</td><td>сат без нзле (00 до 23, иако се AM/PM приказује)</td></tr> <tr><td>m</td><td>минут без нуле (0 до 59)</td></tr> <tr><td>mm</td><td>минута са нулом (00 до 59)</td></tr> <tr><td>s</td><td>секунда без нуле (0 до 59)</td></tr> <tr><td>ss</td><td>секунда са нулом (00 до 59)</td></tr> <tr><td>AP <i>или</i> A</td><td>користи AM/PM приказ. <b>A/AP</b> ће бити замењен или са "AM" или са "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>временска зона (нпр. "CEST")</td></tr> <tr><td>T</td><td>помак од UTC</td></tr> <tr><td>TT</td><td>временска зона IANA id</td></tr> <tr><td>TTT</td><td>скраћеница временске зоне</td></tr> <tr><td>TTTT</td><td>приказивање скраћеног имена временске зоне</td></tr> <tr><td>TTTTT</td><td>приказивање дугог имена временске зоне</td></tr> <tr><td>TTTTTT</td><td>прилагоди име временске зоне. Можеш променити име у 'Time zones' картици конфигурацијског прозора</td></tr></table> <br /><b>Напомене:</b> <ul><li>Сви знакови у обрасцу који нису у опсезима ['а'..'з'] и ['А'..'З'] биће третирани као цитирани текст. На пример, знакови као што су ':', '.', ' ', '#' и '@' ће се појавити у резултујућем временском тексту чак и ако нису затворени у једноструким наводницима. Једноструки наводник се користи за „избегавање“ слова. Два појединачна наводника у низу, без обзира да ли се налазе унутар или изван цитираног низа, представљају 'прави' појединачни наводник.</li><li>Минимални интервал ажурирања је 1 секунда. Ако је конфигурисано z или zzzz време се приказује у милисекундама, али се не ажурира на бази милисекунди (избегавајући велики учинак).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Временске зоне светског сата Time zone Временска зона Name Име Comment Коментар Country Држава UTC UTC Other Остало Local timezone Локална временска зона ================================================ FILE: plugin-worldclock/translations/worldclock_sv.desktop.yaml ================================================ Desktop Entry/Name: "Världsklocka" Desktop Entry/Comment: "Visar en klocka med kalender och tidszoner" ================================================ FILE: plugin-worldclock/translations/worldclock_sv.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'</font>' LXQtWorldClockConfiguration World Clock Settings Inställningar för världsklocka Display &format Visnings&format &Time &Tid F&ormat: F&ormat: Short Kort Long Långt Custom Anpassat Sho&w seconds &Visa sekunder Pad &hour with zero &Skriv alltid timmar med 2 tecken T&ime zone &Tidszon &Position: &Placering: For&mat: For&mat: Below Under Above Över Before Före After Efter Offset from UTC Avvikelse från UTC Abbreviation Förkortning IANA id IANA-id Custom name Anpassat namn &Use 12-hour format &Använd 12-timmarsklocka Location identifier Platsidentifierare &Date &Datum Po&sition: &Placering: Fo&rmat: Fo&rmat: ISO 8601 ISO 8601 Show &year Visa &år Show day of wee&k Visa &veckodag Pad d&ay with zero D&ag med ledande nolla &Long month and day of week names &Långt namn på dagar och månader Ad&vanced manual format &Avancerad manuell formatering &Customize ... &Anpassa ... Time &zones &Tidszoner &Add ... &Lägg til... &Remove &Ta bort Set as &default Ställ in som &standard &Edit custom name ... &Redigera anpassat namn ... Move &up Flytta &upp Move do&wn Flytta &ner Change displayed time zone with mouse wheel Justera vilken tidszon som visas med mushjulet <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Notera:</b> Mittenklicka på klockan för att se tid och datum för de tillagda tidzonerna. &General &Allmänt Auto&rotate when the panel is vertical Rotera &automatiskt när panelen är vertikal Show &week numbers in popup calendar Visa &veckonummer i popup-kalendern S&how tooltip &Visa inforuta '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'dddd, d MMMM yyyy'</font>' Input custom time zone name Ange namn på tidszon LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Manuell konfigurering av världsklockan <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Syntax för anpassat format av tid och datum</h1> <p>Ett datummönster är en sträng med tecken, där specifika teckensträngar ersätts med datum- och tidsdata från en kalender vid formatering.</p> <p>Tabellen med datumfältssymboler nedan innehåller de tecken som används i mönster för att visa lämpliga format för ett visst språk, till exempel yyyy för året. Tecken kan användas flera gånger. Till exempel: Om året är 1999 så kan "99" genereras av "yy" och "yyyy" framkallar "1999". För de flesta numeriska fält är det antalet tecken som anger fältets bredd. Om "h" (= timme ) genererar "5", så genererar "hh" "05". För vissa tecken anger antalet om utskriften blir en förkortning eller fullständig form.</p> <p>Två enkla citattecken (' ') representerar ett ordagrant enkelt citattecken, antingen inom eller utanför enkla citattecken. Text inom enkla citattecken genererar varken tid eller datum utan tolkas som vanlig text. Annars är alla ASCII-bokstäver från a till z och A till Z reserverade som syntaxtecken och kräver citattecken om de ska representera literaltecken. Dessutom kan vissa ASCII-skiljetecken bli variabler i framtiden (t.ex. ":" tolkas som tidsavgränsare och "/" som en datumavgränsare och ersätts av respektive språkkänsliga tecken i displayen).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Kod</th><th>Betydelse</th></tr> <tr><td>d</td><td>dag i månaden (1-31)</td></tr> <tr><td>dd</td><td>dag i månaden (01-31)</td></tr> <tr><td>ddd</td><td>förkortad veckodagsnamn (dvs. 'mån' t.o.m. 'sön')</td></tr> <tr><td>dddd</td><td>fullständigt veckodagsnamn (dvs. 'måndag' t.o.m. 'söndag')</td></tr> <tr><td>M</td><td>månad (1-12)</td></tr> <tr><td>MM</td><td>månad (01-12)</td></tr> <tr><td>MMM</td><td>förkortat månadsnamn (dvs. 'jan' t.o.m. 'dec')</td></tr> <tr><td>MMMM</td><td>fullständigt måndadsnamn (dvs. 'januari' t.o.m. 'december')</td></tr> <tr><td>yy</td><td>de sista två siffrorna i året (00-99)</td></tr> <tr><td>yyyy</td><td>fullständigt år</td></tr> <tr><td>h</td><td>timme (0-23 eller 1-12 i 12-timmarsklocka, dvs. FM/EM-format)</td></tr> <tr><td>hh</td><td>timme (00-23 eller 01-12 i 12-timmarsklocka)</td></tr> <tr><td>H</td><td>timme (0-23, oavsett systemets tidsformat)</td></tr> <tr><td>HH</td><td>timme (00-23, oavsett systemets tidsformat)</td></tr> <tr><td>m</td><td>minut (0-59)</td></tr> <tr><td>mm</td><td>minut (00-59)</td></tr> <tr><td>s</td><td>sekund (0-59)</td></tr> <tr><td>ss</td><td>sekund (00-59)</td></tr> <tr><td>AP <i>eller</i> A</td><td>visa FM/EM. <b>A/AP</b> kommer att ersättas av antingen "FM" eller "EM"</td></tr> <tr><td>ap <i>eller</i> a</td><td>visa fm/em. <b>a/ap</b> kommer att ersättas av antingen "fm" eller "em"</td></tr> <tr><td>t</td><td>tidszon (t.ex. "CEST")</td></tr> <tr><td>T</td><td>avvikelse från UTC</td></tr> <tr><td>TT</td><td>tidszonens IANA id</td></tr> <tr><td>TTT</td><td>tidszonsförkortning</td></tr> <tr><td>TTTT</td><td>tidszonens namn i förkortat form</td></tr> <tr><td>TTTTT</td><td>tidszonens namn i fullständig form</td></tr> <tr><td>TTTTTT</td><td>anpassat namn för tidszon. Namnet ändras under fliken 'Tidszoner' i konfigurationsfönstret</td></tr></table> <br /><b>Notera:</b> <ul><li>Alla tecken i mönstret som inte ligger inom intervallen ['a'..' z'] och ['A'.." Z'] kommer att behandlas som citerad text. Till exempel kommer tecken som ':', '.', ' ', '#' och '@' att visas i den resulterande tidstexten även om de inte omges av enkla citattecken. Två enkla citattecken i rad, oavsett om de är inom eller utanför en citerad sekvens, representerar ett "riktigt" enkelt citattecken.</li><li>Minsta uppdateringsintervall är 1 sekund. Om z eller zzz är konfigurerat visas tiden i millisekunder, men uppdateras inte på millisekundsbasis då det är alltför prestandakrävande.</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Tidszoner för världsklocka Time zone Tidszon Name Namn Comment Kommentar Country Land UTC UTC Other Annat Local timezone Lokal tidszon ================================================ FILE: plugin-worldclock/translations/worldclock_tr.desktop.yaml ================================================ Desktop Entry/Name: "Dünya Saati" Desktop Entry/Comment: "Takvim ve saat dilimleri ile bir saat görüntüler" ================================================ FILE: plugin-worldclock/translations/worldclock_tr.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ggg, g AAA yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Dünya Saati Ayarları Display &format Görünüm &biçimi &Time &Zaman F&ormat: &Biçim: Short Kısa Long Uzun Custom Özel Sho&w seconds Saniyeleri &göster Pad &hour with zero Sıfırlı Ped saati T&ime zone Zaman d&ilimi &Position: &Konum: For&mat: &Biçim: Below Altta Above Üstte Before Önce After Sonra Offset from UTC UTC Kapalı Abbreviation Kısaltma IANA id IANA id Custom name Özel isim &Use 12-hour format 12 saat biçimini k&ullan Location identifier Konum belirteci &Date &Tarih Po&sition: &Konum: Fo&rmat: &Biçim: ISO 8601 ISO 8601 Show &year &Yılı göster Show day of wee&k Haftanın gününü &göster Pad d&ay with zero Sıfırlı Ped günü &Long month and day of week names &Uzun ay ve gün isimleri Ad&vanced manual format Ge&lişmiş elle biçimlendirme &Customize ... &Özelleştir ... Time &zones &Zaman dilimi &Add ... &Ekle ... &Remove &Kaldır Set as &default &Varsayılan olarak ayarla &Edit custom name ... Özel adı &düzenle ... Move &up Y&ukarı taşı Move do&wn Aş&ağı taşı Change displayed time zone with mouse wheel Fare tekerleği ile görüntülenen saat dilimini değiştir <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Not:</b> Yapılandırılmış tüm saat dilimlerinde saat ve tarihi görüntülemek için saate orta tıklayın. &General &Genel Auto&rotate when the panel is vertical Panel dikey olduğunda otomatik yönlendi&r Show &week numbers in popup calendar Açılır takvimde &hafta numaralarını göster S&how tooltip İ&puçlarını göster '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'SS:dd:ss'</b><br/><font size="-2">'ggg, g AAA yyyy'<br/>'TT'</font>' Input custom time zone name Özel zaman dilimi adı girin LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Dünya Saati Elle Biçim Yapılandırma <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1> Özel Tarih/Saat Biçimi Sözdizimi </h1> <p> Tarih deseni, biçimlendirme sırasında belirli karakter dizilerinin bir takvimdeki tarih ve saat verileriyle değiştirildiği veya ayrıştırma sırasında bir takvim için veri oluşturmak için kullanıldığı bir karakter dizisidir. </p> <p> Aşağıdaki Tarih Alanı Sembolü Tablosu, yıl için yyyy gibi belirli bir yerel ayara uygun biçimleri göstermek için kalıplarda kullanılan karakterleri içerir. Karakterler birden çok kez kullanılabilir. Örneğin, yıl için y kullanılırsa, 'yy' '99' üretirken 'yyyy', '1999' üretir. Çoğu sayısal alan için, karakter sayısı alan genişliğini belirtir. Örneğin, h saat ise, "h" "5" üretebilir, ancak "hh", "05" üretir. Bazı karakterler için sayı, kısaltılmış biçimin mi yoksa tam biçimin mi kullanılması gerektiğini belirtir, ancak aşağıda belirtildiği gibi başka seçenekler de olabilir. </p> <p> İki tek tırnak, tek tırnak içinde veya dışında gerçek tek bir alıntıyı temsil eder. Tek tırnak içindeki metinler hiçbir şekilde yorumlanmaz (bitişik iki tek tırnak hariç). Aksi takdirde, a'dan z'ye ve A'dan Z'ye tüm ASCII harfleri sözdizimi karakterleri olarak ayrılır ve değişmez karakterleri temsil edeceklerse, alıntı yapılmasını gerektirir. Ek olarak, belirli ASCII noktalama karakterleri gelecekte değişken hale gelebilir (örneğin, ":" zaman ayırıcı olarak yorumlanır ve '/' bir tarih ayırıcı olarak yorumlanır ve ekranda ilgili yerel ayara duyarlı karakterlerle değiştirilir). <br /> < / p> <table border = "1" width = "100%" cellpadding = "4" cellspacing = "0"> <tr> <th width = "20%"> Kod </th> <th> Anlamı </th> </tr> <tr><td>d</td> <td> başında sıfır olmadan sayı olarak gün (1'den 31'e) </td> </tr> <tr><td>dd</td> <td> başında sıfır olan sayı olarak gün (01 - 31) </td> </tr> <tr><td>ddd</td> <td> kısaltılmış yerelleştirilmiş gün adı (ör. "Pzt" ila "Güneş"). </td> </tr> <tr><td>dddd</td> <td> uzun yerelleştirilmiş gün adı (ör. 'Pazartesi'den' Pazar'a '). </td> </tr> <tr><td>M</td> <td> başında sıfır olmadan sayı olarak ay (1-12) </td> </tr> <tr><td>MM</td> <td> başında sıfır olan ay (01-12) </td> </tr> <tr><td>MMM</td> <td> kısaltılmış yerelleştirilmiş ay adı (ör. "Oca" dan "Ara" ya). </td> </tr> <tr><td>MMMM</td> <td> uzun yerelleştirilmiş ay adı (ör. "Ocak" dan "Aralık" a). </td> </tr> <tr><td>yy</td> <td> iki basamaklı sayı olarak yıl (00-99) </td> </tr> <tr><td>yyyy</td> <td> dört basamaklı sayı olarak yıl </td> </tr> <tr><td>h</td> <td> başında sıfır olmadan saat (0 - 23 veya AM / PM gösteriliyorsa 1 - 12) </td> </tr> <tr><td>hh</td> <td> başında sıfır olan saat (00-23 veya 01-12, AM / PM görüntüleniyorsa) </td> </tr> <tr><td>H</td> <td> başında sıfır olmadan saat (0'dan 23'e, AM / PM ekranıyla bile) </td> </tr> <tr><td>HH</td> <td> başında sıfır olan saat (00'dan 23'e, AM / PM ekranıyla bile) </td> </tr> <tr><td>m</td> <td> başında sıfır olmadan dakika (0'dan 59'a) </td> </tr> <tr><td>mm</td> <td> önde sıfır (00'dan 59'a) ile dakika </td> </tr> <tr><td>s</td> <td> başında sıfır olmadan saniye (0 - 59) </td> </tr> <tr><td>ss</td> <td> başında sıfır (00 - 59) </td> </tr> <tr> <td> AP <i> veya </i> A </td> <td> AM / PM ekranı kullanır. <b> A / AP </b>, "ÖÖ" veya "ÖS" ile değiştirilecektir. </td> </tr> <tr> <td> ap <i> veya </i> a </td> <td> am / pm görüntüsünü kullanın. <b> a / ap </b>, "am" veya "pm" ile değiştirilecektir. </td> </tr> <tr><td>t</td> <td> saat dilimi (ör. "CEST") </td> </tr> <tr><td>T</td> <td> UTC'den uzaklık </td> </tr> <tr><td>TT</td> <td> saat dilimi IANA kimliği </td> </tr> <tr><td>TTT</td> <td> saat dilimi kısaltması </td> </tr> <tr><td>TTTT</td> <td> saat dilimi kısa görünen adı </td> </tr> <tr><td>TTTTT</td> <td> saat dilimi uzun görünen adı </td> </tr> <tr><td>TTTTTT</td> <td> saat dilimi özel adı. Bunu, yapılandırma penceresinin 'Saat dilimleri' sekmesinden değiştirebilirsiniz </td> </tr> </table> <br /> <b> Notlar: </b> <ul> <li> Kalıpta ['a' .. 'z'] ve ['A' .. 'Z aralığında olmayan karakterler '], alıntılanmış metin olarak değerlendirilecektir. Örneğin, ':', '.', '', '#' Ve '@' gibi karakterler, tek tırnak içine alınmasalar bile ortaya çıkan zaman metninde görünecektir. Tek alıntı, harflerden 'kaçış' için kullanılır. Bir satırdaki iki tek tırnak, alıntılanan bir dizinin içinde veya dışında, 'gerçek' tek bir alıntıyı temsil eder. </li> <li> Minimum güncelleme aralığı 1 saniyedir. Z veya zzz yapılandırılırsa, zaman milisaniye kesiriyle gösterilir, ancak milisaniye bazında güncellenmez (büyük performans vuruşundan kaçınarak). </li> <ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Dünya Saati Zaman Dilimi Time zone Zaman dilimi Name Adı Comment Açıklama Country Ülke UTC Other Diğer Local timezone Yerel zaman dilimi ================================================ FILE: plugin-worldclock/translations/worldclock_uk.desktop.yaml ================================================ Desktop Entry/Name: "Світовий годинник" Desktop Entry/Comment: "Показує годинник з календарем та часовими поясами" ================================================ FILE: plugin-worldclock/translations/worldclock_uk.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings Налаштування Світового годинника Display &format &Формат показу &Time &Час F&ormat: Ф&ормат: Short Короткий Long Довгий Custom Власний Sho&w seconds Пока&зувати секунди Pad &hour with zero &Години з нулем T&ime zone &Часовий пояс &Position: &Позиція: For&mat: Ф&ормат: Below Внизу Above Вгорі Before Перед After Після Offset from UTC Зсув від UTC Abbreviation Абревіатура IANA id IANA id Custom name Власна назва &Use 12-hour format За&стосовувати 12-годинний формат Location identifier Ідентифікатор місцеперебування &Date &Дата Po&sition: &Позиція: Fo&rmat: Ф&ормат: ISO 8601 ISO 8601 Show &year Показувати &рік Show day of wee&k Показувати день ти&жня Pad d&ay with zero День з н&улем &Long month and day of week names &Довгі назви місяця і дня тижня Ad&vanced manual format Роз&ширений власний формат &Customize ... &Налаштувати ... Time &zones Часові &пояси &Add ... &Додати ... &Remove &Вилучити Set as &default Встановити &типовим &Edit custom name ... &Змінити власну назву ... Move &up Пересунути &вище Move do&wn Пересунути &нижче Change displayed time zone with mouse wheel Змініть показаний часовий пояс за допомогою коліщатка миші <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>Примітка:</b> Натискання на годинник середньою кнопкою миші, щоб переглянути час і дату в усіх обраних часових поясах. &General &Загальне Auto&rotate when the panel is vertical Авто&обертання, коли панель вертикальна Show &week numbers in popup calendar Показувати номери &тижнів у розгортуваному календарі S&how tooltip П&оказувати підказку '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name Введіть власну назву часового поясу LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration Власноручне налаштування формату світового годинника <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>Власний синтаксис форматів дати/часу</h1> <p>Шаблон дат — це рядок символів, де спеціальні рядки символів замінюються даними дати та часу з календаря під час форматування або використання даних для генерації даних для календаря під час зчитування.</p> <p>Наведена далі таблиця символів дат містить символи, що застосовуються, щоб показати відповідні формати для певної місцевості, такі як yyyy на позначення року. Символи можна застосовувати кілька разів. Наприклад, якщо «y» використовується на позначення року, «yy» може показати «99», тоді як «yyyy» стане «1999». Для більшості чисельних полів кількість символів визначає ширину поля. Наприклад, якщо «h» — година, це може бути «5», але «hh» буде «05». Для деяких символів кількість визначає використання скорочення або повної форми, але може мати інші варіанти, як зазначено далі.</p> <p>Дві одинарні лапки позначають буквально одинарну лапку, як усередині, так і зовні одинарних лапок. Текст в одинарних лапках не трактується жодним чином (за винятком двох суміжних одинарних лапок). В іншому випадку всі букви ASCII від a до z та від A до Z зарезервовані як синтаксичні символи й вимагають виділення лапками, якщо вони повинні представляти літеральні символи. Крім того, певні пунктуаційні символи ASCII можуть у майбутньому стати змінними (наприклад, «:» інтерпретується роздільником часу та «/» роздільником дати, а на дисплеї замінюються відповідними символами залежно від локалі) .<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Позначення</th><th>Значення</th></tr> <tr><td>d</td><td>день як число без нуля (від 1 до 31)</td></tr> <tr><td>dd</td><td>день як число з початковим нулем (від 01 до 31)</td></tr> <tr><td>ddd</td><td>скорочена локалізована назва дня (наприклад, від «Пн» до «Нд»).</td></tr> <tr><td>dddd</td><td>повна локалізована назва дня (наприклад, від «Понеділка» до «П'ятниці»).</td></tr> <tr><td>M</td><td>місяць як число без нуля (1-12)</td></tr> <tr><td>MM</td><td>місяць як число з початковим нулем (01-12)</td></tr> <tr><td>MMM</td><td>скорочена локалізована назва місяця (наприклад, від «Січ» до «Гру»).</td></tr> <tr><td>MMMM</td><td>повна локалізована назва місяця (наприклад, від «Січня» до «Грудня»).</td></tr> <tr><td>yy</td><td>рік як двозначне число (00-99)</td></tr> <tr><td>yyyy</td><td>рік як чотиризначне число</td></tr> <tr><td>h</td><td>година без початкового нуля (від 0 до 23 або від 1 до 12, якщо в режимі ДП/ПП)</td></tr> <tr><td>hh</td><td>година з початковим нулем (від 00 до 23 або від 01 до 12, якщо в режимі ДП/ПП)</td></tr> <tr><td>H</td><td>година без початкового нуля (від 0 до 23, навіть в режимі ДП/ПП)</td></tr> <tr><td>HH</td><td>година з початковим нулем (від 00 до 23, навіть в режимі ДП/ПП)</td></tr> <tr><td>m</td><td>хвилина без початкового нуля (від 0 до 59)</td></tr> <tr><td>mm</td><td>хвилина з початковим нулем (від 00 до 59)</td></tr> <tr><td>s</td><td>секунда без початкового нуля (від 0 до 59)</td></tr> <tr><td>ss</td><td>секунда з початковим нулем (від 00 до 59)</td></tr> <tr><td>AP <i>або</i> A</td><td>режим ДП/ПП. <b>A/AP</b> заміниться на «ДП» або «ПП».</td></tr> <tr><td>ap <i>або</i> a</td><td>режим дп/пп. <b>a/ap</b> заміниться на «дп» або «пп».</td></tr> <tr><td>t</td><td>часовий пояс (наприклад «CEST»)</td></tr> <tr><td>T</td><td>відхилення від UTC</td></tr> <tr><td>TT</td><td>часовий пояс IANA id</td></tr> <tr><td>TTT</td><td>абревіатура часового пояса</td></tr> <tr><td>TTTT</td><td>коротка назва часового пояса</td></tr> <tr><td>TTTTT</td><td>повна назва часового пояса</td></tr> <tr><td>TTTTTT</td><td>власна назва часового пояса. Ви можете змінити її у вкладці «Часові пояси» вікна налаштувань </td></tr></table> <br /><b>Примітки:</b> <ul><li>Будь-які символи в шаблоні, які не знаходяться в діапазонах ['a'..'z'] та ['A'..'Z'] розглядатимуться як цитований текст. Наприклад, символи «:», «.», « », «#» та «@» з'являться в отриманому тексті часу, навіть якщо вони не обрамлені одинарними лапками. Одинарні лапки застосовуються для виокремлення літер. Дві одинарні лапки підряд, будь то всередині чи за межами обрамленої лапками послідовності, представляють «справжню» одну лапку.</li><li>Найменший інтервал оновлення становить 1 секунду. Якщо z або zzz є налаштованим часом з мілісекундами, то вони не оновлюються (задля уникнення сповільнення швидкодії).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones Часові пояси Світового годинника Time zone Часовий пояс Name Назва Comment Коментар Country Країна UTC UTC Other Інше Local timezone Локальний часовий пояс ================================================ FILE: plugin-worldclock/translations/worldclock_zh_CN.desktop.yaml ================================================ Desktop Entry/Name: "世界时钟" Desktop Entry/Comment: "世界时钟插件" ================================================ FILE: plugin-worldclock/translations/worldclock_zh_CN.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings 世界时钟设置 Display &format 显示格式(&F) &Time 时间(&T) F&ormat: 格式(&O): Short Long Custom 自定义 Sho&w seconds 显示秒(&W) Pad &hour with zero 小时前加零(&0) T&ime zone 时区(&I) &Position: 位置(&P): For&mat: 格式(&M): Below 下面 Above 上面 Before 左侧 After 右侧 Offset from UTC 与 UTC 间的时差 Abbreviation 缩写 IANA id IANA 编号 Custom name 自定义名称 &Use 12-hour format 使用 12 小时格式(&U) Location identifier 区域标识符 &Date 日期(&D) Po&sition: 位置(&S): Fo&rmat: 格式(&M): ISO 8601 Show &year 显示年份(&Y) Show day of wee&k 显示星期(&K) Pad d&ay with zero 日前加零(&A) &Long month and day of week names 长月份名与星期名(&L) Ad&vanced manual format 高级格式(&V) &Customize ... 自定义(&C)... Time &zones 时区(&I) &Add ... 新增(&A)... &Remove 移除(&R) Set as &default 设置为默认(&D) &Edit custom name ... 编辑自定义名称(&E)... Move &up 上移(&U) Move do&wn 下移(&W) Change displayed time zone with mouse wheel <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. &General 常规(&G) Auto&rotate when the panel is vertical 纵置面板时自动旋转(&R) Show &week numbers in popup calendar 在弹出日历中显示周数(&W) S&how tooltip 显示工具提示(&H) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name 输入自定义时区名称 LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration 世界时钟手动格式配置 <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>自定义日期和时间格式</h1> <p>日期模式是一串字符串,其中特定的字符串在格式化时用日历中的日期和时间数据替换,或者在解析时用于为日历生成数据。</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">编码</th><th>含义</th></tr> <tr><td>d</td><td>不带前置 0 的日期 (1 to 31)</td></tr> <tr><td>dd</td><td>带有前置 0 的日期 (01 to 31)</td></tr> <tr><td>ddd</td><td>本地化的星期简称 (例如 'Mon' 到 'Sun')。</td></tr> <tr><td>dddd</td><td>本地化的星期全称 (例如 'Monday' 到 'Sunday')。</td></tr> <tr><td>M</td><td>不带前置 0 的月份 (1-12)</td></tr> <tr><td>MM</td><td>带有前置 0 的小时 (01-12)</td></tr> <tr><td>MMM</td><td>本地化的月份简称 (例如 'Jan' to 'Dec')。</td></tr> <tr><td>MMMM</td><td>本地化的月份全称 (例如 'January' 到 'December')。</td></tr> <tr><td>yy</td><td>年份的后两位 (00-99)</td></tr> <tr><td>yyyy</td><td>四位数的年份</td></tr> <tr><td>h</td><td>不带前置 0 的小时 (0 to 23 or 1 to 12 如果有 AM/PM 显示)</td></tr> <tr><td>hh</td><td>带有前置 0 的小时 (00 to 23 or 01 to 12 如果有 AM/PM 显示)</td></tr> <tr><td>H</td><td>不带前置 0 的小时 (0 to 23, 即使有 AM/PM 显示)</td></tr> <tr><td>HH</td><td>带有前置 0 的小时 (00 to 23, 即使有 AM/PM 显示)</td></tr> <tr><td>m</td><td>不带前置 0 的分钟 (0 to 59)</td></tr> <tr><td>mm</td><td>带有前置 0 的分钟 (00 to 59)</td></tr> <tr><td>s</td><td>不带前置 0 的秒 (0 to 59)</td></tr> <tr><td>ss</td><td>带有前置 0 的秒 (00 to 59)</td></tr> <tr><td>AP <i>或</i> A</td><td>显示 AM/PM。 <b>A/AP</b> 会被 "AM" 或 "PM" 之一替换。</td></tr> <tr><td>ap <i>或</i> a</td><td>显示 am/pm。 <b>a/ap</b> 会被 "am" 或 "pm" 之一替换。</td></tr> <tr><td>t</td><td>时区 (例如 "CEST")</td></tr> <tr><td>T</td><td>相对 UTC 的偏移值</td></tr> <tr><td>TT</td><td>时区的 IANA 编号</td></tr> <tr><td>TTT</td><td>时区的缩写</td></tr> <tr><td>TTTT</td><td>时区的短显示名称</td></tr> <tr><td>TTTTT</td><td>时区的长显示名称</td></tr> <tr><td>TTTTTT</td><td>时区的自定义名称。你可以在设置窗口的 '时区' 标签中修改</td></tr></table> <br /><b>注意:</b> <ul><li>模式中的任何不属于 ['a'..'z'] 和 ['A'..'Z'] 的字符会被当成带引号的文本。 For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones 世界时钟时区 Time zone 时区 Name 名称 Comment 备注 Country 国家 UTC Other 其它 Local timezone 本地时区 ================================================ FILE: plugin-worldclock/translations/worldclock_zh_TW.desktop.yaml ================================================ Desktop Entry/Name: "世界時鐘" Desktop Entry/Comment: "顯示時鐘附有日曆及時區" ================================================ FILE: plugin-worldclock/translations/worldclock_zh_TW.ts ================================================ LXQtWorldClock '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' LXQtWorldClockConfiguration World Clock Settings 世界時鐘設定 Display &format 顯示格式(&F) &Time 時間(&T) F&ormat: 格式(&O): Short 短式 Long 長式 Custom 自訂 Sho&w seconds 顯示秒數(&W) Pad &hour with zero 小時數字前加零(&H) T&ime zone 時區(&T) &Position: 位置(&P): For&mat: 格式(&M): Below 下方 Above 上方 Before 左方 After 右方 Offset from UTC 與 UTC 的差移 Abbreviation 縮寫 IANA id IANA 編號 Custom name 自訂名稱 &Use 12-hour format 使用 12小時 格式(&U) Location identifier 地區標識 &Date 日期(&D) Po&sition: 位置(&S): Fo&rmat: 格式(&R): ISO 8601 ISO 8601 Show &year 顯示年份(&Y) Show day of wee&k 顯示星期(&K) Pad d&ay with zero 日數之前加零(&A) &Long month and day of week names 長式月份星期名稱(&L) Ad&vanced manual format 進階格式(&V) &Customize ... 自訂(&C)… Time &zones 時區(&Z) &Add ... 增加(&A)… &Remove 移除(&R) Set as &default 設作預設(&D) &Edit custom name ... 編輯自訂名稱(&E)… Move &up 上移(&U) Move do&wn 下移(&W) Change displayed time zone with mouse wheel 使用滑鼠滾輪來變更顯示的時區 <b>Note:</b> Middle-click the clock to view the time and date for all configured timezones. <b>註:</b> 滑鼠中鍵點按時鐘可以查看全部已經設定時區的時間和日期。 &General 通則(&G) Auto&rotate when the panel is vertical 當面板直立時自動旋轉(&R) Show &week numbers in popup calendar 在彈出日曆之中顯示週數(&W) S&how tooltip 顯示工具提示(&H) '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' '<b>'HH:mm:ss'</b><br/><font size="-2">'ddd, d MMM yyyy'<br/>'TT'</font>' Input custom time zone name 輸入自訂時區名稱 LXQtWorldClockConfigurationManualFormat World Clock Manual Format Configuration 世界時鐘手動格式設定 <h1>Custom Date/Time Format Syntax</h1> <p>A date pattern is a string of characters, where specific strings of characters are replaced with date and time data from a calendar when formatting or used to generate data for a calendar when parsing.</p> <p>The Date Field Symbol Table below contains the characters used in patterns to show the appropriate formats for a given locale, such as yyyy for the year. Characters may be used multiple times. For example, if y is used for the year, 'yy' might produce '99', whereas 'yyyy' produces '1999'. For most numerical fields, the number of characters specifies the field width. For example, if h is the hour, 'h' might produce '5', but 'hh' produces '05'. For some characters, the count specifies whether an abbreviated or full form should be used, but may have other choices, as given below.</p> <p>Two single quotes represents a literal single quote, either inside or outside single quotes. Text within single quotes is not interpreted in any way (except for two adjacent single quotes). Otherwise all ASCII letter from a to z and A to Z are reserved as syntax characters, and require quoting if they are to represent literal characters. In addition, certain ASCII punctuation characters may become variable in the future (eg ":" being interpreted as the time separator and '/' as a date separator, and replaced by respective locale-sensitive characters in display).<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">Code</th><th>Meaning</th></tr> <tr><td>d</td><td>the day as number without a leading zero (1 to 31)</td></tr> <tr><td>dd</td><td>the day as number with a leading zero (01 to 31)</td></tr> <tr><td>ddd</td><td>the abbreviated localized day name (e.g. 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>the long localized day name (e.g. 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>the month as number without a leading zero (1-12)</td></tr> <tr><td>MM</td><td>the month as number with a leading zero (01-12)</td></tr> <tr><td>MMM</td><td>the abbreviated localized month name (e.g. 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>the long localized month name (e.g. 'January' to 'December').</td></tr> <tr><td>yy</td><td>the year as two digit number (00-99)</td></tr> <tr><td>yyyy</td><td>the year as four digit number</td></tr> <tr><td>h</td><td>the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)</td></tr> <tr><td>hh</td><td>the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)</td></tr> <tr><td>H</td><td>the hour without a leading zero (0 to 23, even with AM/PM display)</td></tr> <tr><td>HH</td><td>the hour with a leading zero (00 to 23, even with AM/PM display)</td></tr> <tr><td>m</td><td>the minute without a leading zero (0 to 59)</td></tr> <tr><td>mm</td><td>the minute with a leading zero (00 to 59)</td></tr> <tr><td>s</td><td>the second without a leading zero (0 to 59)</td></tr> <tr><td>ss</td><td>the second with a leading zero (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>use AM/PM display. <b>A/AP</b> will be replaced by either "AM" or "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>use am/pm display. <b>a/ap</b> will be replaced by either "am" or "pm".</td></tr> <tr><td>t</td><td>the timezone (e.g. "CEST")</td></tr> <tr><td>T</td><td>the offset from UTC</td></tr> <tr><td>TT</td><td>the timezone IANA id</td></tr> <tr><td>TTT</td><td>the timezone abbreviation</td></tr> <tr><td>TTTT</td><td>the timezone short display name</td></tr> <tr><td>TTTTT</td><td>the timezone long display name</td></tr> <tr><td>TTTTTT</td><td>the timezone custom name. You can change it the 'Time zones' tab of the configuration window</td></tr></table> <br /><b>Notes:</b> <ul><li>Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '@' will appear in the resulting time text even they are not enclosed within single quotes. The single quote is used to 'escape' letters. Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.</li><li>Minimal update interval is 1 second. If z or zzz is configured time is shown with the milliseconds fraction, but not updated on millisecond basis (avoiding big performance hit).</li><ul> <h1>自訂 日期/時間 格式語法</h1> <p>日期型式是一串字符,其中特定的字串在格式化時被替換為日曆中的日期和時間資料,或在解析時用於生成日曆的資料。</p> <p>下面的日期欄位符號表包含型式中使用的字符,以顯示給定區域設定的適當格式,例如 yyyy 表示年份。字元可以多次使用。例如,如果使用 y 表示年份,則“yy”可能會產生“99”,而“yyyy”產生“1999”。對於大多數數字字段,字元數指定了字段寬度。例如,如果 h 是小時,則“h”可能產生“5”,但“hh”產生“05”。對於某些字符,計數指定是否應使用縮寫或完整形式,但可能有其他選擇,如下所示。</p> <p>兩個單引號代表一個文字單引號,可以在單引號內或單引號外。單引號內的文字不會以任何方式解釋(兩個相鄰的單引號除外)。否則,從 a 到 z 和從 A 到 Z 的全部 ASCII 字母都保留為語法字符,如果它們要表示文字字符,則需要引用。此外,某些 ASCII 標點符號將來可能會發生變化(例如“:”被解釋為時間分隔符,而“/”被解釋為日期分隔符,並在顯示中被相應的區域敏感字元取代)。<br /></p> <table border="1" width="100%" cellpadding="4" cellspacing="0"> <tr><th width="20%">代碼</th><th>意義</th></tr> <tr><td>d</td><td>日期數字,前位無零 (1 to 31)</td></tr> <tr><td>dd</td><td>日期數字,前位帶零 (01 to 31)</td></tr> <tr><td>ddd</td><td>星期縮寫 (例 'Mon' to 'Sun').</td></tr> <tr><td>dddd</td><td>長式星期 (例 'Monday' to 'Sunday').</td></tr> <tr><td>M</td><td>月份數字,前位無零 (1-12)</td></tr> <tr><td>MM</td><td>月份數字,前位帶零 (01-12)</td></tr> <tr><td>MMM</td><td>月份縮寫 (例 'Jan' to 'Dec').</td></tr> <tr><td>MMMM</td><td>長式月份名稱 (例 'January' to 'December').</td></tr> <tr><td>yy</td><td>年份二位數字 (00-99)</td></tr> <tr><td>yyyy</td><td>年份四位數字</td></tr> <tr><td>h</td><td>小時數字,前位無零 (0 to 23 or 1 to 12 若有 AM/PM 顯示)</td></tr> <tr><td>hh</td><td>小時數字,前位帶零 (00 to 23 or 01 to 12 若有 AM/PM 顯示)</td></tr> <tr><td>H</td><td>小時數字,前位無零 (0 to 23 無 AM/PM 顯示)</td></tr> <tr><td>HH</td><td>小時數字,前位帶零 (00 to 23 無 AM/PM 顯示)</td></tr> <tr><td>m</td><td>分鐘數字,前位無零 (0 to 59)</td></tr> <tr><td>mm</td><td>分鐘數字,前位帶零 (00 to 59)</td></tr> <tr><td>s</td><td>秒鐘數字,前位無零 (0 to 59)</td></tr> <tr><td>ss</td><td>秒鐘數字,前位帶零 (00 to 59)</td></tr> <tr><td>AP <i>or</i> A</td><td>顯示 AM/PM <b>A/AP</b> 將會取代 "AM" 或 "PM".</td></tr> <tr><td>ap <i>or</i> a</td><td>顯示 am/pm <b>a/ap</b> 將會取代 "am" 或 "pm".</td></tr> <tr><td>t</td><td>時區 (例 "CEST")</td></tr> <tr><td>T</td><td>時區偏差 UTC</td></tr> <tr><td>TT</td><td>時區 IANA 代號</td></tr> <tr><td>TTT</td><td>時區縮寫</td></tr> <tr><td>TTTT</td><td>時區短式顯示名稱</td></tr> <tr><td>TTTTT</td><td>時區長式顯示名稱</td></tr> <tr><td>TTTTTT</td><td>時區自訂名稱。您可變更 '時區' 分頁於設定視窗</td></tr></table> <br /><b>Notes:</b> <ul><li>型式中任何不在 ['a'..'z'] 和 ['A'..'Z'] 範圍內的字元都將被視為引用文字。例如,即使未用單引號括起來,':'、'.'、' '、'#' 和 '@' 等字元,也會出現在結果時間文字中。單引號用於“轉義”字母。連續的兩個單引號,無論是在引用序列之內或之外,都代表「真正的」單引號。</li><li>最小更新間隔為 1 秒。如果設定 z 或 zzz,時間將以毫秒分數顯示,但不以毫秒為基礎更新(避免對效能造成重大影響)。</li><ul> LXQtWorldClockConfigurationTimeZones World Clock Time Zones 世界時鐘時區 Time zone 時區 Name 名稱 Comment 備註 Country 國家 UTC UTC Other 其它 Local timezone 本地時區