Advance Wayland and KDE package bring-up

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-14 10:51:06 +01:00
parent 51f3c21121
commit cf12defd28
15214 changed files with 20594243 additions and 269 deletions
@@ -0,0 +1,56 @@
# KI18N Translation Domain for this library
add_definitions(-DTRANSLATION_DOMAIN=\"kcmkwinscreenedges\")
set(kcm_screenedges_SRCS
monitor.cpp
screenpreviewwidget.cpp
kwinscreenedge.cpp
kwinscreenedgeconfigform.cpp
)
qt_add_dbus_interface(kcm_screenedges_SRCS ${KWin_SOURCE_DIR}/src/org.kde.kwin.Effects.xml kwin_effects_interface)
set(kcm_kwinscreenedges_PART_SRCS main.cpp ${kcm_screenedges_SRCS})
kcmutils_generate_module_data(
kcm_kwinscreenedges_PART_SRCS
MODULE_DATA_HEADER kwinscreenedgedata.h
MODULE_DATA_CLASS_NAME KWinScreenEdgeData
SETTINGS_HEADERS kwinscreenedgesettings.h
SETTINGS_CLASSES KWinScreenEdgeSettings
NAMESPACE KWin
)
ki18n_wrap_ui(kcm_kwinscreenedges_PART_SRCS main.ui)
kconfig_add_kcfg_files(kcm_kwinscreenedges_PART_SRCS kwinscreenedgesettings.kcfgc kwinscreenedgescriptsettings.kcfgc kwinscreenedgeeffectsettings.kcfgc)
kcoreaddons_add_plugin(kcm_kwinscreenedges SOURCES ${kcm_kwinscreenedges_PART_SRCS} INSTALL_NAMESPACE "plasma/kcms/systemsettings_qwidgets")
set(kcm_screenedges_LIBS
Qt::DBus
KF6::ConfigCore
KF6::KCMUtils
KF6::I18n
KF6::Package
KF6::Svg
)
target_link_libraries(kcm_kwinscreenedges ${X11_LIBRARIES} ${kcm_screenedges_LIBS})
set(kcm_kwintouchscreenedges_PART_SRCS
touch.cpp
kwintouchscreenedgeconfigform.cpp
${kcm_screenedges_SRCS}
)
kcmutils_generate_module_data(
kcm_kwintouchscreenedges_PART_SRCS
MODULE_DATA_HEADER kwintouchscreendata.h
MODULE_DATA_CLASS_NAME KWinTouchScreenData
SETTINGS_HEADERS kwintouchscreensettings.h
SETTINGS_CLASSES KWinTouchScreenSettings
NAMESPACE KWin
)
ki18n_wrap_ui(kcm_kwintouchscreenedges_PART_SRCS main.ui touch.ui)
kconfig_add_kcfg_files(kcm_kwintouchscreenedges_PART_SRCS kwintouchscreensettings.kcfgc kwintouchscreenscriptsettings.kcfgc kwintouchscreenedgeeffectsettings.kcfgc)
kcoreaddons_add_plugin(kcm_kwintouchscreen SOURCES ${kcm_kwintouchscreenedges_PART_SRCS} INSTALL_NAMESPACE "plasma/kcms/systemsettings_qwidgets")
target_link_libraries(kcm_kwintouchscreen ${X11_LIBRARIES} ${kcm_screenedges_LIBS})
@@ -0,0 +1,4 @@
#! /usr/bin/env bash
$EXTRACTRC *.ui >> rc.cpp || exit 11
$XGETTEXT *.cpp -o $podir/kcmkwinscreenedges.pot
rm -f rc.cpp
@@ -0,0 +1,138 @@
{
"KPlugin": {
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=systemsettings&component=kcm_kwinscreenedges",
"Description": "Configure active screen corners and edges",
"Description[ar]": "اضبط زوايا وحواف الشاشة",
"Description[az]": "Aktiv ekran künclərini və kənarlarını tənzimləyin",
"Description[be]": "Наладжванне актыўных кутоў і краёў экрана",
"Description[bg]": "Настройки на активните краища и ъгли на екрана",
"Description[ca@valencia]": "Configura els cantons i vores actives de la pantalla",
"Description[ca]": "Configura les cantonades i vores actives de la pantalla",
"Description[cs]": "Nastavit aktivní hrany a okraje obrazovky",
"Description[da]": "Konfigurér aktive skærmhjørner og -kanter",
"Description[de]": "Aktive Bildschirmränder und -ecken einrichten",
"Description[en_GB]": "Configure active screen corners and edges",
"Description[eo]": "Agordi aktivajn ekranajn angulojn kaj randojn",
"Description[es]": "Configurar las esquinas y los bordes activos de la pantalla",
"Description[et]": "Aktiivsete ekraani nurkade ja servade seadistamine",
"Description[eu]": "Konfiguratu pantailaren izkina eta ertz aktiboak",
"Description[fi]": "Aktiivisen näytön kulmien ja reunojen asetukset",
"Description[fr]": "Configurer les coins et les bords de l'écran actif",
"Description[gl]": "Configurar os bordos e esquinas activos da pantalla.",
"Description[he]": "הגדרת פינות וקצוות מסך פעילים",
"Description[hu]": "Az aktív képernyőszélek és sarkok beállítása",
"Description[ia]": "Configura margines e angulos de schermo active",
"Description[id]": "Konfigurasikan tepian dan sudut layar aktif",
"Description[is]": "Grunnstilla horn og brúnir á virkum skjá",
"Description[it]": "Configura angoli e bordi attivi dello schermo",
"Description[ja]": "スクリーンエッジ機能を設定",
"Description[ka]": "აქტიური ეკრანის კუთხისა და კიდეების მორგება",
"Description[ko]": "활성 화면 경계와 꼭짓점 설정",
"Description[lt]": "Konfigūruoti aktyvius ekrano kampus ir kraštus",
"Description[lv]": "Konfigurēt aktīvā ekrāna stūrus un malas",
"Description[nb]": "Sett opp aktive skjermhjørne og skjermkanter",
"Description[nl]": "Actieve schermhoeken en -randen configureren",
"Description[nn]": "Set opp aktive skjermhjørne og skjermkantar",
"Description[pl]": "Ustawienia czułych narożników i krawędzi ekranu",
"Description[pt]": "Configurar os cantos e extremos activos do ecrã",
"Description[pt_BR]": "Configurar os cantos de bordas da tela ativa",
"Description[ro]": "Configurează colțurile și marginile active ale ecranului",
"Description[ru]": "Настройка действий для краёв и углов экрана",
"Description[sa]": "सक्रियपर्दे कोणान् किनारेश्च विन्यस्यताम्",
"Description[sk]": "Nastavenie aktívnych okrajov obrazovky a hrán",
"Description[sl]": "Prilagodite aktivna oglišča in robove zaslona",
"Description[sv]": "Anpassa aktiva skärmhörn och kanter",
"Description[ta]": "திரையின் ஓரங்களையும் மூலைகளையும் அமையுங்கள்",
"Description[tr]": "Etkin ekran köşeleri ve kenarlarını yapılandır",
"Description[uk]": "Налаштовування активних кутів і країв екрана",
"Description[vi]": "Cấu hình các góc và cạnh của màn hình hoạt động",
"Description[x-test]": "xxConfigure active screen corners and edgesxx",
"Description[zh_CN]": "配置活动屏幕的四角和边缘操作",
"Description[zh_TW]": "設定作用中螢幕角落與邊緣",
"Icon": "preferences-desktop-gestures-screenedges",
"Name": "Screen Edges",
"Name[ar]": "حواف الشاشة",
"Name[az]": "Ekran kənarları",
"Name[be]": "Краі экрана",
"Name[bg]": "Краища на екрана",
"Name[ca@valencia]": "Vores de la pantalla",
"Name[ca]": "Vores de la pantalla",
"Name[cs]": "Hrany obrazovky",
"Name[da]": "Skærmkanter",
"Name[de]": "Bildschirmränder",
"Name[en_GB]": "Screen Edges",
"Name[eo]": "Ekranaj randoj",
"Name[es]": "Bordes de la pantalla",
"Name[et]": "Ekraani servad",
"Name[eu]": "Pantailaren ertzak",
"Name[fi]": "Näytön reunat",
"Name[fr]": "Bords de l'écran",
"Name[gl]": "Bordos da pantalla",
"Name[he]": "קצוות חלון",
"Name[hu]": "Képernyőszélek",
"Name[ia]": "Margines de schermo",
"Name[id]": "Tepian Layar",
"Name[is]": "Skjájaðrar",
"Name[it]": "Bordi dello schermo",
"Name[ja]": "スクリーンエッジ",
"Name[ka]": "ეკრანის კიდეები",
"Name[ko]": "화면 경계",
"Name[lt]": "Ekrano kraštai",
"Name[lv]": "Ekrāna malas",
"Name[nb]": "Skjermkanter",
"Name[nl]": "Schermranden",
"Name[nn]": "Skjerm­kantar",
"Name[pl]": "Krawędzie ekranu",
"Name[pt]": "Extremos do Ecrã",
"Name[pt_BR]": "Bordas da tela",
"Name[ro]": "Marginile ecranului",
"Name[ru]": "Края экрана",
"Name[sa]": "स्क्रीन एज्स्",
"Name[sk]": "Okraje obrazovky",
"Name[sl]": "Robovi zaslona",
"Name[sv]": "Skärmkanter",
"Name[ta]": "திரையின் ஓரங்கள்",
"Name[tr]": "Ekran Kenarları",
"Name[uk]": "Краї екрана",
"Name[vi]": "Cạnh màn hình",
"Name[x-test]": "xxScreen Edgesxx",
"Name[zh_CN]": "屏幕边缘",
"Name[zh_TW]": "螢幕邊緣"
},
"X-DocPath": "kcontrol/kwinscreenedges/index.html",
"X-KDE-Keywords": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers",
"X-KDE-Keywords[ar]": "كوين،نافذة،مدير،تأثير،زاوية،حافة،حدود،إجراء،تبديل،سطح المكتب،حواف شاشة كوين،حواف سطح المكتب،حواف الشاشة،تكبير النوافذ،تجانب النوافذ،جانب الشاشة،سلوك الشاشة،تبديل سطح المكتب،سطح المكتب الافتراضي،شاشة زوايا,حدود,حدود الشاشة,حدود سطح المكتب,زوايا سطح المكتب,زوايا,زوايا لاصقة,حواف لاصقة,حواجز الحافة,حواجز الزاوية",
"X-KDE-Keywords[bg]": "kwin,прозорец,мениджър,ефект,ъгъл,ръб,граница,действие,превключвател,работен плот,ръбове на екрана на kwin,ръбове на работния плот,ръбове на екрана,увеличаване на прозорците,прозорци с плочки,страна на екрана,поведение на екрана,превключване на работния плот,виртуален работен плот,екран ъгли,граници,граници на екрана,граници на работния плот,ъгли на работния плот,ъгли,лепкави ъгли,лепкави ръбове,бариери по ръбовете,бариери по ъглите",
"X-KDE-Keywords[ca@valencia]": "kwin,finestra,gestor,efecte,cantó,vora,acció,commutació,escriptori,vores de pantalla del kwin,vores d'escriptori,vores de pantalla,maximitzar les finestres,mosaic de finestres,costat de pantalla,comportament de pantalla,canviar escriptori,escriptori virtual,cantons de pantalla,vores,vores de pantalla,vores d'escriptori,cantons d'escriptori,cantons,cantons apegaloses,vores apegaloses,barreres de vores,barreres de cantons",
"X-KDE-Keywords[ca]": "kwin,finestra,gestor,efecte,cantonada,vora,acció,commutació,escriptori,vores de pantalla del kwin,vores d'escriptori,vores de pantalla,maximitzar les finestres,mosaic de finestres,costat de pantalla,comportament de pantalla,commutar escriptori,escriptori virtual,cantonades de pantalla,vores,vores de pantalla,vores d'escriptori,cantonades d'escriptori,cantonades,cantonades apegaloses,vores apegaloses,barreres de vores,barreres de cantonades",
"X-KDE-Keywords[en_GB]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers",
"X-KDE-Keywords[es]": "kwin,ventana,gestor,efecto,esquina,borde,acción,cambio,cambiar,escritorio,bordes de la pantalla de kwin,bordes del escritorio,bordes de la pantalla,maximizar ventanas,ventanas en mosaico,lado de la pantalla,comportamiento de la pantalla,cambiar escritorio,escritorio virtual,esquinas de la pantalla,bordes,bordes de la pantalla,bordes del escritorio,esquinas del escritorio,esquinas,esquinas adhesivas,bordes adhesivos,barreras de los bordes,barreras de las esquinas",
"X-KDE-Keywords[eu]": "kwin,leihoa,kudeatzailea,efektua,izkina,ertza,muga,bazterra,ekintza,aldatu,mahaigaina,kwin pantaila-ertzak,mahaiganaren ertzak,pantailaren ertzak,maximizatu leihoak,teilakatu leihoak,pantailaren alboa,pantailaren jokabidea,aldatu mahaigaina,alegiazko mahaigaina,mahaigain birtuala,pantailaren izkinak,mugak,pantailaren mugak,mahaigainaren mugak,mahaigainaren izkinak,izkinak,izkina itsaskorrak,ertz itsaskorrak,ertzeko hesiak,izkinako hesiak",
"X-KDE-Keywords[fi]": "kwin,ikkuna,hallinta,tehoste,nurkka,kulma,reuna,laita,toiminta,toiminto,vaihto,vaihda,työpöytä,työpöydän reunat,työpöydän laidat,suurenna ikkunat,laatoita ikkunat,asettele ikkunat,asettelu,näytön toiminta,vaihda työpöytää,työpöytävaihto,virtuaalityöpöytä,tahmeat reunat,tahmeat laidat,laitaesteet,nurkkaesteet,kulmaesteet",
"X-KDE-Keywords[fr]": "kwin, fenêtre, gestionnaire, effet, coin, bord, bords, bordure, action, commutateur, bureau, bords d'écran de KWin, bords de bureau, bords d'écran,maximiser les fenêtres, fenêtres en mosaïque, côté de l'écran, comportement de l'écran, changer de bureau, bureau virtuel, coins d'écran, bordures, bordures d'écran, bordures de bureau, coins de bureau, coins, coins aimantés, bords aimantés, barrières de bord, barrières de coin",
"X-KDE-Keywords[gl]": "kwin,xanela,xestor,efecto,esquina,beira,bordo,bordo,acción,trocar,escritorio,bordo do escritorio,maximizar xanelas,escritorio virtual,esquinas da pantalla,borders,bordos,extremos,screen borders,desktop borders,desktop corners,corners,esquinas,sticky corners,pegañentas,pegañentos,sticky edges,edge barriers,barreiras,límites,corner barriers",
"X-KDE-Keywords[he]": "kwin,חלון,מנהל,אפקט,פינה,קצה,גבול,פעולה,החלפה,שולחן־עבודה,קצוות מסך של kwin,קצוות שולחן עבודה,קצוות מסך,הגדלת חלונות,אריחי חלונות,צד המסך,התנהגות מסך,החלפת שולחן עבודה,שולחן־עבודה וירטואלי,פינות מסך,גבולות,גבולות מסך,גבולותשולחן עבודה,פינות שולחן עבודה,פינות,פינות דביקות,קצוות דביקים,מחסומי קצה,מחסומי פינה,מחסומי גבול,מסגרות גבול,מסגרות קצה",
"X-KDE-Keywords[hu]": "kwin,ablak,kezelő,effektusok,sarok,szegély,keret,művelet,váltás,asztal,kwin képernyőszélek,asztalszélek,képernyőszélek,ablakok maximalizálása,mozaikablakok,képernyő oldala,képernyőműködés,asztalváltás,virtuális asztal,képernyősarkok,szegélyek,képernyőszegélyek,asztalszegélyek,asztalsarkok,sarkok,ragadós sarkok,ragadós élek,élkorlátok,sarokkorlátok",
"X-KDE-Keywords[ia]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers",
"X-KDE-Keywords[is]": "kwin,gluggi,stjóri,brella,horn,jaðar,brún,aðgerð,skiipta,skjáborð,kwin skjájaðrar,skjáborðsjaðrar,skjájaðrar,fullstækka glugga,reitaraða gluggum,hlið á skjá,skjáhegðun,skipta um skjáborð,sýndarskjáborð,skjáhorn,brúnir,skjábrúnir,skjáborðsbrúnir,skjáborðshorn,horn,festihorn, ,brúnaþröskuldar,hornþröskuldar",
"X-KDE-Keywords[it]": "kwin,finestra,gestore,effetto,angolo,bordo,bordo,azione,cambia,desktop,bordi dello schermo di kwin,bordi del desktop,bordi dello schermo,ingrandisci le finestre,affianca le finestre,lato dello schermo,comportamento dello schermo,cambia desktop,desktop virtuale,angoli dello schermo,bordi,bordi dello schermo,bordi del desktop,angoli del desktop,angoli,angoli fissi,bordi fissi,barriere dei bordi,barriere degli angoli",
"X-KDE-Keywords[ka]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers,ფანჯარა,მმართველი,ეფექტები,წიბო,კუთხე,საზღვარი,ქმედება,ეკრანის კუთხეები,სამუშაო მაგიდის კუთხეები",
"X-KDE-Keywords[ko]": "창,관리자,효과,모서리,경계선,테두리,동작,액션,전환,kwin 화면 경계,화면 경계,창 최대화,최대화,바둑판식 배열,화면 행동,데스크톱 전환,가상 데스크톱,화면 모서리,꼭짓점,바탕 화면 전환,가상 바탕 화면,화면 모서리",
"X-KDE-Keywords[lv]": "kwin,logs,pārvaldnieks,efekts,stūris,mala,apmale,darbība,slēdzis,darbvirsma,kwin ekrāna malas,darbvirsmas malas,ekrāna malas,maksimizēt logus,flīzēt logus,ekrāna mala,ekrāna uzvedība,pārslēgt darbvirsmu,virtuālā darbvirsma,ekrāna stūri,robežas,ekrāna robežas,darbvirsmas robežas,darbvirsmas stūri,stūri,lipīgie stūri,lipīgās malas,malu barjeras,stūru barjeras",
"X-KDE-Keywords[nb]": "kwin,vindu,behandler,effekt,kant,hjørne,ramme,handling,bytte,skrivebord,kwin skjermkanter,skrivebordskanter,skjermkanter,maksimere vindu,flislegge vindu,skjermside,skjermatferd,bytte skrivebord,virtuelt skrivebord,skjermhjørne,kanter,ramme,hjørne,skrivebordskanter,skrivebordshjørner,hjørnebarriere,kantbarriere",
"X-KDE-Keywords[nl]": "kwin,venster,beheerder,effect,hoek,rand,grens,actie,schakelaar,bureaublad,kwin-schermrand,bureaubladranden,schermrand,vensters maximaliseren,vensters schuin achter elkaar zetten,zijkant van het scherm,schermgedrag,bureaublad wisselen,virtueel bureaublad,schermhoeken,randen,schermranden,bureaubladranden,bureaubladhoeken,hoeken,plakkende hoeken,plakkende randen,randbarrières,hoekbarrières",
"X-KDE-Keywords[nn]": "kwin,vindauge,handsamar,effekt,kant,hjørne,ramme,handling,byte,skrivebord,kwin skjermkantar,skrivebordskantar,skjermkantar,maksimera vindauge,flisleggja vindauge,skjermside,skjermåtferd,byte skrivebord,virtuelt skrivebord,skjermhjørne,kantar,ramme,hjørne,skrivebordskantar,skrivebordshjørner,hjørnebarriere,kantbarriere",
"X-KDE-Keywords[pl]": "kwin,okno,menadżer,efekt,narożnik,krawędź,granica,działanie,przełącz,pulpit,krawędzie ekranu kwin,krawędzie pulpitu,krawędzie ekranu,zmaksymalizuj okna,okna do kafelków,bok ekranu,zachowanie ekranu,przełącz pulpit,pulpit wirtualny,narożniki ekranu,krawędzie,krawędzie ekranu,krawędzie pulpitu,narożniki pulpitu,narożniki,lepkie narożniki,lepkie krawędzie,bariery krawędziowe,bariery narożnikowe",
"X-KDE-Keywords[pt_BR]": "kwin,janela,gerenciador,efeito,canto,borda,ação,trocar,área de trabalho,limites de tela kwin,limites de área de trabalho,limites de tela,maximizar janelas,ajustar janelas,lado da tela,comportamento da tela,trocar área de trabalho,área de trabalho virtual,cantos da tela,bordas da tela,bordas de área de trabalho,cantos de área de trabalho,cantos,bordas fixas,bordas fixas,barreiras de borda,barreiras de canto",
"X-KDE-Keywords[ru]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers,окно,диспетчер,эффект,угол,край,граница,действие,переключатель,рабочий стол,края экрана kwin,края экрана,края рабочего стола,развернуть окна,распахнуть окна,сторона экрана,поведение экрана,переключить рабочий стол,виртуальный рабочий стол,углы экрана,границы,границы экрана,границы рабочего стола,углы рабочего стола,углы,липкие углы,липкие края,краевые барьеры,угловые барьеры",
"X-KDE-Keywords[sa]": "kwin,विंडो,प्रबन्धक,प्रभाव,कोने,धार,सीमा,क्रिया,स्विच,डेस्कटॉप,kwin स्क्रीन किनारे,डेस्कटॉप किनारे,स्क्रीन किनारे,विंडोज,टाइल विंडोज,स्क्रीन के पक्ष,स्क्रीन व्यवहार,स्विच डेस्कटॉप,वर्चुअल डेस्कटॉप,स्क्रीन कोण,सीमा,स्क्रीन सीमा,डेस्कटॉप सीमा,डेस्कटॉप कोण,कोने,चिपचिपा कोणाः,चिपचिपाधाराः,धारबाधाः,कोणबाधाः",
"X-KDE-Keywords[sl]": "kwin,okno,upravitelj,učinek,kotiček,rob,obroba,dejanje,stikalo,namizje,kwin robovi zaslona,robovi namizja,robovi zaslona,maksimiraj okna,okroži okna,stran zaslona,vedenje zaslona,preklopi namizje,virtualno namizje,zaslon vogali,obrobe,obrobe zaslona, obrobe namizja, vogali namizja,vogali,lepljivi vogali,lepljivi robovi,robne ovire,kotne ovire",
"X-KDE-Keywords[sv]": "kwin,fönster,hanterare,effekt,hörn,kant,kant,åtgärd,byta,skrivbord,kwin-skärmkanter,skrivbordskanter,skärmkanter,maximera fönster,fönster sida vid sida,sidan av skärmen,skärmbeteende,byt skrivbord,virtuellt skrivbord,skärm hörn,kanter,skärmkanter,skrivbordskanter,skrivbordshörn,hörn,klistriga hörn,klistriga kanter,kantbarriärer,hörnbarriärer",
"X-KDE-Keywords[tr]": "kwin,pencere,yönetici,efekt,köşe,kenar,kenarlık,eylem,değiştir,masaüstü,kwin ekran kenarları,ekran kenarları,ekranı kapla,simge durumuna küçült,küçült,döşe,ekranın kenarı,ekran davranışı,masaüstü kenarları,yapışkan köşeler,yapışkan kenarlar,kenar bariyerleri,köşe bariyerleri",
"X-KDE-Keywords[uk]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,borders,screen borders,desktop borders,desktop corners,corners,sticky corners,sticky edges,edge barriers,corner barriers,квін,вікно,керування,засіб,ефект,кут,край,рамка,дія,перемикання,стільниця,краї екрана,краї стільниці,максимізація,максимізувати,мозаїка,бік екрана,поведінка,перемикання,віртуальна,кути екрана,рамки,кути,липкі кути,бар'єри краю,бар'єри кута",
"X-KDE-Keywords[x-test]": "xxkwinxx,xxwindowxx,xxmanagerxx,xxeffectxx,xxcornerxx,xxedgexx,xxborderxx,xxactionxx,xxswitchxx,xxdesktopxx,xxkwin screen edgesxx,xxdesktop edgesxx,xxscreen edgesxx,xxmaximize windowsxx,xxtile windowsxx,xxside of screenxx,xxscreen behaviorxx,xxswitch desktopxx,xxvirtual desktopxx,xxscreen cornersxx,xxbordersxx,xxscreen bordersxx,xxdesktop bordersxx,xxdesktop cornersxx,xxcornersxx,xxsticky cornersxx,xxsticky edgesxx,xxedge barriersxx,xxcorner barriersxx",
"X-KDE-Keywords[zh_CN]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,chuangkou,guanli,texiao,sijiao,bianjiao,jiaoluo,bianyuan,caozuo,qiehuan,zhuomian,kwin pingmubianyuan,zhuomianbianyuan,zuidahuachuangkou,pingpuchuangkou,pingmuxingwei,zhuomianqiehuan,xunizhuomian,xunizhuomianqiehuan,pingmujiaoluo,pingmubianjiao,biankuang,pingmubiankuang,bianyan,pingmubianyan,zhuomianbiankuang,zhuomianbianyan,zhuomianbianyuan,zhuomiansijiao,zhuomianjiaoluo,zhuomianbianjiao,zhanxing,zhanzhi,zhanxingjiao,zhanxingjiaoluo,zhanxingpingmujiaoluo,zhanxingbian,zhanxingbianyuan,zhanxingpingmubianyuan,zhangai,bianyuanzhangai,pingmubianyuanzhangai,jiaoluozhangai,pingmujiaoluozhangai,窗口,管理,特效,四角,边角,角落,边缘,操作,切换,桌面,kwin 屏幕边缘,桌面边缘,最大化窗口,平铺窗口,屏幕行为,桌面切换,虚拟桌面,虚拟桌面切换,屏幕角落,屏幕边角,边框,屏幕边框,边沿,屏幕边沿,桌面边框,桌面边沿,桌面边缘,桌面四角,桌面角落,桌面边角,粘性,粘滞,粘性角,粘性角落,粘性屏幕角落,粘性边,粘性边缘,粘性屏幕边缘,障碍,边缘障碍,屏幕边缘障碍,角落障碍,屏幕角落障碍",
"X-KDE-Keywords[zh_TW]": "kwin,視窗,視窗管理員,效果,角落,邊緣,邊框,動作,切換,桌面,螢幕邊緣,桌面邊緣,最大化視窗,鋪排視窗,螢幕行為,切換桌面,虛擬桌面,螢幕角落,角落屏障,邊緣屏障",
"X-KDE-System-Settings-Parent-Category": "pointing-devices",
"X-KDE-Weight": 100
}
@@ -0,0 +1,138 @@
{
"KPlugin": {
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=systemsettings&component=kcm_kwintouchscreen",
"Description": "Configure touch screen swipe gestures",
"Description[ar]": "اضبط إيماءات شاشة اللمس ",
"Description[az]": "Toxunma ekranı jestlərini tənzimləyin",
"Description[be]": "Наладжванне жэстаў вядзення пальцам па сэнсарным экране",
"Description[bg]": "Конфигуриране на жестове за плъзгане на сензорен екран",
"Description[ca@valencia]": "Configura els gestos de lliscament en la pantalla tàctil",
"Description[ca]": "Configura els gestos de lliscament en la pantalla tàctil",
"Description[cs]": "Nastavit gesta tahem na dotykové obrazovce",
"Description[da]": "Konfigurér swipegestus for touchskærme",
"Description[de]": "Wischgesten für Touchscreens einrichten",
"Description[en_GB]": "Configure touch screen swipe gestures",
"Description[eo]": "Agordi tuŝekranajn glitajn gestojn",
"Description[es]": "Configurar los gestos de deslizamiento de la pantalla táctil",
"Description[et]": "Puuteekraani žestide seadistamine",
"Description[eu]": "Konfiguratu ukimen-pantailako kolpe arinen keinuak",
"Description[fi]": "Kosketusnäytön pyyhkäisyeleiden asetukset",
"Description[fr]": "Configurer les gestes de balayage de l'écran tactile",
"Description[gl]": "Configurar os acenos de pantalla táctil.",
"Description[he]": "הגדרת מחוות החלקה למסך מגע",
"Description[hu]": "Az érintőképernyő áthúzó kézmozdulatainak beállítása",
"Description[ia]": "Configura gestos e glissar de schermo tactil",
"Description[id]": "Konfigurasikan gestur usapan layar sentuh",
"Description[is]": "Grunnstilla hreyfiskipanir á snertiskjá",
"Description[it]": "Configura gesti dello schermo a sfioramento",
"Description[ja]": "スワイプジェスチャー機能を設定",
"Description[ka]": "სენსორიანი ეკრანის გასმის ჟესტების მორგება",
"Description[ko]": "터치스크린 밀기 제스처 설정",
"Description[lt]": "Konfigūruoti jutiklinio ekrano braukymo gestus",
"Description[lv]": "Konfigurēt skārienekrāna vilkšanas žestus",
"Description[nb]": "Sett opp fingerbevegelser på trykkskjerm",
"Description[nl]": "Veeggebaren voor aanraakscherm configureren",
"Description[nn]": "Set opp fingerrørsler på trykkskjerm",
"Description[pl]": "Ustawienia gestów na ekranie dotykowym",
"Description[pt]": "Configurar os gestos de deslizamento do ecrã táctil",
"Description[pt_BR]": "Configurar os gestos da tela sensível ao toque",
"Description[ro]": "Configurează gesturi de tragere pe ecran tactil",
"Description[ru]": "Настройка действий при проведении по сенсорному экрану",
"Description[sa]": "स्पर्शपर्दे स्वाइप् इशारान् विन्यस्यताम्",
"Description[sk]": "Nastaviť ťahacie gestá dotykovej obrazovky",
"Description[sl]": "Prilagodite geste drsenja po zaslonu z dotikom",
"Description[sv]": "Anpassa draggester för pekskärm",
"Description[ta]": "தொடுதிரையில் பயன்படுத்தக்கூடிய சைகைகளை அமையுங்கள்",
"Description[tr]": "Dokunmatik ekran süpürme hareketlerini yapılandır",
"Description[uk]": "Налаштовування жестів на сенсорному екрані",
"Description[vi]": "Cấu hình các động tác hất của màn hình cảm ứng",
"Description[x-test]": "xxConfigure touch screen swipe gesturesxx",
"Description[zh_CN]": "配置触摸屏滑动手势",
"Description[zh_TW]": "設定觸控螢幕滑動手勢",
"Icon": "preferences-desktop-gestures-touch",
"Name": "Touchscreen Gestures",
"Name[ar]": "إيماءات شاشة اللمس",
"Name[ast]": "Xestos de la pantalla táctil",
"Name[be]": "Жэсты сэнсарнага экрана",
"Name[bg]": "Жестове за сензорен екран",
"Name[ca@valencia]": "Gestos de pantalla tàctil",
"Name[ca]": "Gestos de pantalla tàctil",
"Name[cs]": "Gesta dotykové obrazovky",
"Name[da]": "Touchskærmsgestus",
"Name[de]": "Wischgesten für Touchscreens",
"Name[en_GB]": "Touchscreen Gestures",
"Name[eo]": "Tuŝekranaj Gestoj",
"Name[es]": "Gestos de la pantalla táctil",
"Name[eu]": "Ukimen-pantailako keinuak",
"Name[fi]": "Kosketusnäyttöeleet",
"Name[fr]": "Gestes de balayage de l'écran tactile",
"Name[gl]": "Acenos de pantalla táctil",
"Name[he]": "מחוות מסך מגע",
"Name[hu]": "Érintőképernyős mozdulatok",
"Name[ia]": "Gestures de schermo tactile",
"Name[id]": "Gestur Layar Sentuh",
"Name[is]": "Hreyfiskipanir á snertiskjá",
"Name[it]": "Gesti dello schermo tattile",
"Name[ja]": "タッチスクリーンジェスチャー",
"Name[ka]": "სენსორული ეკრანის ჟესტები",
"Name[ko]": "터치스크린 제스처",
"Name[lt]": "Jutiklinio ekrano gestai",
"Name[lv]": "Skārienjutības žesti",
"Name[nb]": "Fingerbevegelser",
"Name[nl]": "Veeggebaren voor aanraakscherm",
"Name[nn]": "Fingerrørsler",
"Name[pl]": "Gesty na ekranie dotykowym",
"Name[pt]": "Gestos do Ecrã Táctil",
"Name[pt_BR]": "Gestos da tela sensível ao toque",
"Name[ro]": "Gesturi pe ecran tactil",
"Name[ru]": "Поддержка жестов для сенсорных экранов",
"Name[sa]": "टचस्क्रीन् इशारा",
"Name[sk]": "Gestá dotykovej obrazovky",
"Name[sl]": "Geste po zaslonu z dotikom",
"Name[sv]": "Pekskärmsgester",
"Name[ta]": "தொடுதிரைக்கான சைகைகள்",
"Name[tr]": "Dokunmatik Ekran Hareketleri",
"Name[uk]": "Жести на сенсорній панелі",
"Name[vi]": "Các động tác của màn hình cảm ứng",
"Name[x-test]": "xxTouchscreen Gesturesxx",
"Name[zh_CN]": "触摸屏手势",
"Name[zh_TW]": "觸控螢幕手勢"
},
"X-DocPath": "kcontrol/kwintouchscreen/index.html",
"X-KDE-Keywords": "kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen",
"X-KDE-Keywords[ar]": "كوين،نافذة،مدير،تأثير،حافة،حدود،إجراء،تبديل،سطح المكتب،حواف سطح المكتب،حواف الشاشة،جانب الشاشة،سلوك الشاشة،شاشة تعمل باللمس",
"X-KDE-Keywords[bg]": "kwin,прозорец,мениджър,ефект,ръб,рамка,действие,превключвател,работен плот,ръбове на работния плот,ръбове на екрана,страна на екрана,поведение на екрана,сензорен екран",
"X-KDE-Keywords[ca@valencia]": "kwin,finestra,gestor,efecte,vora,acció,canvia,escriptori,vores d'escriptori,vores de pantalla,costat de pantalla,comportament de pantalla,pantalla tàctil",
"X-KDE-Keywords[ca]": "kwin,finestra,gestor,efecte,vora,acció,commuta,escriptori,vores d'escriptori,vores de pantalla,costat de pantalla,comportament de pantalla,pantalla tàctil",
"X-KDE-Keywords[de]": "KWin,Fenster,Verwaltung,Effekt,Kante,Rand,Aktion,umschalten,Arbeitsfläche,Arbeitsflächenränder,Bildschirmränder,Seite des Bildschirms,Bildschirmseite,Bildschirmverhalten,Touchscreen",
"X-KDE-Keywords[en_GB]": "kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen",
"X-KDE-Keywords[es]": "kwin,ventana,gestor,administrador,efecto,borde,filo,lado,acción,cambio,escritorio,bordes del escritorio,bordes de la pantalla,lados de la pantalla,comportamiento de la ventana,pantalla táctil",
"X-KDE-Keywords[eu]": "kwin,leihoa,kudeatzailea,efektua,ertza,muga,bazterra,ekintza,aldatu,ekintza,mahaigaina,mahaigainaren ertzak,pantailaren ertzak,pantailaren alboa,pantailaren jokabidea,ukimen-pantaila",
"X-KDE-Keywords[fi]": "kwin,ikkuna,hallinta,tehoste,efekti,reuna,laita,toiminto,toiminta,vaihda,vaihto,työpöytä,työpöydän nurkat,työpöydän kulmat,näytön laita,näytön toiminta,näytön käyttäytyminen,kosketusnäyttö",
"X-KDE-Keywords[fr]": "kwin, fenêtre, gestionnaire, effet, bord, bordure, action, commutateur, bureau, bords de bureau, bords de l'écran, côté de l'écran, comportement de l'écran, écran tactile",
"X-KDE-Keywords[gl]": "kwin,window,xanela,manager,xestor,effect,efecto,edge,beira,bordo,contorno,esquina,border,action,acción,switch,cambiar,conmutar,trocar,desktop,escritorio,desktop edges,screen edges,pantalla,side of screen,screen behavior,comportamento,touch screen,táctil",
"X-KDE-Keywords[he]": "kwin,חלון,מנהל,ניהול,אפקט,קצה,שול,גבול,פעולה,החלפה,בורר,שולחן עבודה,קצוות שולחן עבודה,פינות שולחן עבודה,קצוות מסך,פינות מסך,צד המסך,התנהגות מסך,מסך מגע",
"X-KDE-Keywords[hu]": "kwin,ablak,kezelő,effektus,él,szegély,művelet,váltás,asztal,asztalélek,képernyőélek,képernyő oldala,képernyőműködés,érintőképernyő",
"X-KDE-Keywords[ia]": "kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen",
"X-KDE-Keywords[is]": "kwin,gluggi,stjóri,brella,jaðar,brún,aðgerð,skipta,skjáborð,skjáborðsjaðrar,skjájaðrar,hliðar á skjá,skjáhegðun,snertiskjár",
"X-KDE-Keywords[it]": "kwin,finestra,gestore,effetto,angolo,bordo,azione,selettore,desktop,bordi desktop,bordi schermo,lato dello schermo,comportamento schermo,schermo a sfioramento",
"X-KDE-Keywords[ka]": "kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen,სენსორული ეკრანი,ეკრანის ქცევა,ეკრანის წიბოები,ეკრანის კუთხეები,გადართვა,სამუშაო მაგიდა,წიბო,ქმედება,ეფექტი,მართვა,ფანჯარა",
"X-KDE-Keywords[ko]": "창,관리자,효과,경계,경계선,동작,액션,데스크톱,화면 경계,경계,터치,터치 스크린,터치스크린,바탕 화면",
"X-KDE-Keywords[lv]": "kwin,logs,pārvaldība,efekts,malas,apmale,darbība,pārslēgt,darbvirsma,darbvirsmas malas,ekrāna malas,ekrāna mala,ekrāna uzvedība,skārienjutīgs ekrāns",
"X-KDE-Keywords[nb]": "kwin,vindu,behandler,effekt,kant,ramme,handling,bytte,skrivebord,skrivebordkanter,skjermkanter,skjermside,skjermatferd,trykkskjerm",
"X-KDE-Keywords[nl]": "kwin,vensterbeheerder,effect,rand,grens,actie,schakelaar,bureaublad,bureaubladranden,schermranden,zijkant van scherm,schermgedrag,aanraakscherm",
"X-KDE-Keywords[nn]": "kwin,vindauge,handsamar,effekt,kant,ramme,handling,byte,skrivebord,skrivebordkantar,skjermkantar,skjermside,skjermåtferd,trykkskjerm",
"X-KDE-Keywords[pl]": "kwin,okno,menadżer,efekt,krawędź,obramowanie,działanie,przełącz,pulpit,krawędzie pulpitu,krawędzie ekranu,strona ekranu,zachowanie ekranu,ekran dotykowy",
"X-KDE-Keywords[pt_BR]": "kwin,janela,gerenciador,efeito,borda,ação,trocar,área de trabalho,limites de área de trabalho,limites de tela,lado da tela,comportamento da tela,tela sensível ao toque,touchscreen, touch screen",
"X-KDE-Keywords[ru]": "kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen,окно,диспетчер,эффект,край,граница,действие,переключатель,рабочий стол,края рабочего стола,края экрана,сторона экрана,поведение экрана,прикосновение,касаться,коснуться",
"X-KDE-Keywords[sa]": "kwin,विंडो,प्रबंधक,प्रभाव,धार,सीमा,क्रिया,स्विच,डेस्कटॉप,डेस्कटॉप किनारे,स्क्रीन किनारे,स्क्रीन के पक्ष,स्क्रीन व्यवहार,स्पर्श स्क्रीन",
"X-KDE-Keywords[sl]": "kwin,okno,upravljalnik,učinek,rob,obroba,dejanje,stikalo,namizje,robovi namizja,robovi zaslona,stran zaslona,vedenje zaslona,zaslon na dotik",
"X-KDE-Keywords[sv]": "kwin,fönster,hanterare,effekt,kant,kant,åtgärd,byta,skrivbord,skrivbordskanter,skärmkanter,sidan av skärmen,skärmbeteende,pekskärm",
"X-KDE-Keywords[tr]": "kwin,pencere,yönetici,efekt,kenar,kenarlık,eylem,değiştir,masaüstü,masaüstü kenarları,ekran kenarları,ekranın kenarı,ekran davranışı,dokunmatik ekran",
"X-KDE-Keywords[uk]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen,вікно,керування,край,кут,межа,сторона,бік,дія,перемикання,стільниця,плитка,край екрана,поведінка екрана,перемикання стільниць,віртуальна стільниця,сенсорна панель",
"X-KDE-Keywords[x-test]": "xxkwinxx,xxwindowxx,xxmanagerxx,xxeffectxx,xxedgexx,xxborderxx,xxactionxx,xxswitchxx,xxdesktopxx,xxdesktop edgesxx,xxscreen edgesxx,xxside of screenxx,xxscreen behaviorxx,xxtouch screenxx",
"X-KDE-Keywords[zh_CN]": "kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,chuangkou,guanli,texiao,sijiao,bianyuan,caozuo,qiehuan,zhuomian,kwin pingmubianyuan,zhuomianbianyuan,zuidahuachuangkou,pingpuchuangkou,pingmuxingwei,zhuomianqiehuan,xunizhuomian,xunizhuomianqiehuan,pingmujiaoluo,chumo,chumoping,chukong,chukongping,pingmu,窗口,管理,特效,四角,边缘,操作,切换,桌面,kwin 屏幕边缘,桌面边缘,最大化窗口,平铺窗口,屏幕行为,桌面切换,虚拟桌面,虚拟桌面切换,屏幕角落,触摸,触摸屏,触控,触控屏,屏幕",
"X-KDE-Keywords[zh_TW]": "kwin,視窗,視窗管理員,效果,邊緣,角落,邊框,動作,切換,桌面,桌面邊緣,觸控螢幕,螢幕行為",
"X-KDE-System-Settings-Parent-Category": "hardware-input-touchscreen",
"X-KDE-Weight": 20
}
@@ -0,0 +1,224 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "kwinscreenedge.h"
#include "monitor.h"
namespace KWin
{
KWinScreenEdge::KWinScreenEdge(QWidget *parent)
: QWidget(parent)
{
QMetaObject::invokeMethod(this, &KWinScreenEdge::createConnection, Qt::QueuedConnection);
}
KWinScreenEdge::~KWinScreenEdge()
{
}
void KWinScreenEdge::monitorHideEdge(ElectricBorder border, bool hidden)
{
const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
monitor()->setEdgeHidden(edge, hidden);
}
void KWinScreenEdge::monitorEnableEdge(ElectricBorder border, bool enabled)
{
const int edge = KWinScreenEdge::electricBorderToMonitorEdge(border);
monitor()->setEdgeEnabled(edge, enabled);
}
void KWinScreenEdge::monitorAddItem(const QString &item)
{
for (int i = 0; i < 8; i++) {
monitor()->addEdgeItem(i, item);
}
}
void KWinScreenEdge::monitorItemSetEnabled(int index, bool enabled)
{
for (int i = 0; i < 8; i++) {
monitor()->setEdgeItemEnabled(i, index, enabled);
}
}
void KWinScreenEdge::monitorChangeEdge(const QList<int> &borderList, int index)
{
for (int border : borderList) {
monitorChangeEdge(static_cast<ElectricBorder>(border), index);
}
}
void KWinScreenEdge::monitorChangeEdge(ElectricBorder border, int index)
{
if (ELECTRIC_COUNT == border || ElectricNone == border) {
return;
}
m_reference[border] = index;
monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border), index);
}
QList<int> KWinScreenEdge::monitorCheckEffectHasEdge(int index) const
{
QList<int> list;
if (monitor()->selectedEdgeItem(Monitor::Top) == index) {
list.append(ElectricTop);
}
if (monitor()->selectedEdgeItem(Monitor::TopRight) == index) {
list.append(ElectricTopRight);
}
if (monitor()->selectedEdgeItem(Monitor::Right) == index) {
list.append(ElectricRight);
}
if (monitor()->selectedEdgeItem(Monitor::BottomRight) == index) {
list.append(ElectricBottomRight);
}
if (monitor()->selectedEdgeItem(Monitor::Bottom) == index) {
list.append(ElectricBottom);
}
if (monitor()->selectedEdgeItem(Monitor::BottomLeft) == index) {
list.append(ElectricBottomLeft);
}
if (monitor()->selectedEdgeItem(Monitor::Left) == index) {
list.append(ElectricLeft);
}
if (monitor()->selectedEdgeItem(Monitor::TopLeft) == index) {
list.append(ElectricTopLeft);
}
if (list.isEmpty()) {
list.append(ElectricNone);
}
return list;
}
int KWinScreenEdge::selectedEdgeItem(ElectricBorder border) const
{
return monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(border));
}
void KWinScreenEdge::monitorChangeDefaultEdge(ElectricBorder border, int index)
{
if (ELECTRIC_COUNT == border || ElectricNone == border) {
return;
}
m_default[border] = index;
}
void KWinScreenEdge::monitorChangeDefaultEdge(const QList<int> &borderList, int index)
{
for (int border : borderList) {
monitorChangeDefaultEdge(static_cast<ElectricBorder>(border), index);
}
}
void KWinScreenEdge::reload()
{
for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
}
onChanged();
}
void KWinScreenEdge::setDefaults()
{
for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
monitor()->selectEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()), it.value());
}
onChanged();
}
int KWinScreenEdge::electricBorderToMonitorEdge(ElectricBorder border)
{
switch (border) {
case ElectricTop:
return Monitor::Top;
case ElectricTopRight:
return Monitor::TopRight;
case ElectricRight:
return Monitor::Right;
case ElectricBottomRight:
return Monitor::BottomRight;
case ElectricBottom:
return Monitor::Bottom;
case ElectricBottomLeft:
return Monitor::BottomLeft;
case ElectricLeft:
return Monitor::Left;
case ElectricTopLeft:
return Monitor::TopLeft;
default: // ELECTRIC_COUNT and ElectricNone
return Monitor::None;
}
}
ElectricBorder KWinScreenEdge::monitorEdgeToElectricBorder(int edge)
{
const Monitor::Edges monitorEdge = static_cast<Monitor::Edges>(edge);
switch (monitorEdge) {
case Monitor::Left:
return ElectricLeft;
case Monitor::Right:
return ElectricRight;
case Monitor::Top:
return ElectricTop;
case Monitor::Bottom:
return ElectricBottom;
case Monitor::TopLeft:
return ElectricTopLeft;
case Monitor::TopRight:
return ElectricTopRight;
case Monitor::BottomLeft:
return ElectricBottomLeft;
case Monitor::BottomRight:
return ElectricBottomRight;
default:
return ElectricNone;
}
}
void KWinScreenEdge::onChanged()
{
bool needSave = isSaveNeeded();
for (auto it = m_reference.cbegin(); it != m_reference.cend(); ++it) {
needSave |= it.value() != monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
}
Q_EMIT saveNeededChanged(needSave);
bool defaults = isDefault();
for (auto it = m_default.cbegin(); it != m_default.cend(); ++it) {
defaults &= it.value() == monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key()));
}
Q_EMIT defaultChanged(defaults);
}
void KWinScreenEdge::createConnection()
{
connect(monitor(),
&Monitor::changed,
this,
&KWinScreenEdge::onChanged);
}
bool KWinScreenEdge::isSaveNeeded() const
{
return false;
}
bool KWinScreenEdge::isDefault() const
{
return true;
}
} // namespace
#include "moc_kwinscreenedge.cpp"
@@ -0,0 +1,71 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include <QWidget>
#include "effect/globals.h"
namespace KWin
{
class Monitor;
class KWinScreenEdge : public QWidget
{
Q_OBJECT
public:
explicit KWinScreenEdge(QWidget *parent = nullptr);
~KWinScreenEdge() override;
void monitorHideEdge(ElectricBorder border, bool hidden);
void monitorEnableEdge(ElectricBorder border, bool enabled);
void monitorAddItem(const QString &item);
void monitorItemSetEnabled(int index, bool enabled);
QList<int> monitorCheckEffectHasEdge(int index) const;
int selectedEdgeItem(ElectricBorder border) const;
void monitorChangeEdge(ElectricBorder border, int index);
void monitorChangeEdge(const QList<int> &borderList, int index);
void monitorChangeDefaultEdge(ElectricBorder border, int index);
void monitorChangeDefaultEdge(const QList<int> &borderList, int index);
// revert to reference settings and assess for saveNeeded and default changed
virtual void reload();
// reset to default settings and assess for saveNeeded and default changed
virtual void setDefaults();
public Q_SLOTS:
void onChanged();
void createConnection();
Q_SIGNALS:
void saveNeededChanged(bool isNeeded);
void defaultChanged(bool isDefault);
private:
virtual Monitor *monitor() const = 0;
virtual bool isSaveNeeded() const;
virtual bool isDefault() const;
// internal use, return Monitor::None if border equals ELECTRIC_COUNT or ElectricNone
static int electricBorderToMonitorEdge(ElectricBorder border);
static ElectricBorder monitorEdgeToElectricBorder(int edge);
private:
QHash<ElectricBorder, int> m_reference; // reference settings
QHash<ElectricBorder, int> m_default; // default settings
};
} // namespace
@@ -0,0 +1,135 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "kwinscreenedgeconfigform.h"
#include "ui_main.h"
namespace KWin
{
KWinScreenEdgesConfigForm::KWinScreenEdgesConfigForm(QWidget *parent)
: KWinScreenEdge(parent)
, ui(std::make_unique<Ui::KWinScreenEdgesConfigUI>())
{
ui->setupUi(this);
connect(ui->kcfg_ElectricBorderDelay, qOverload<int>(&QSpinBox::valueChanged), this, &KWinScreenEdgesConfigForm::sanitizeCooldown);
// Visual feedback of action group conflicts
connect(ui->kcfg_ElectricBorders, qOverload<int>(&QComboBox::currentIndexChanged), this, &KWinScreenEdgesConfigForm::groupChanged);
connect(ui->kcfg_ElectricBorderMaximize, &QCheckBox::stateChanged, this, &KWinScreenEdgesConfigForm::groupChanged);
connect(ui->kcfg_ElectricBorderTiling, &QCheckBox::stateChanged, this, &KWinScreenEdgesConfigForm::groupChanged);
connect(ui->remainActiveOnFullscreen, &QCheckBox::stateChanged, this, &KWinScreenEdgesConfigForm::onChanged);
connect(ui->electricBorderCornerRatioSpin, qOverload<int>(&QSpinBox::valueChanged), this, &KWinScreenEdgesConfigForm::onChanged);
connect(ui->electricBorderCornerRatioSpin, qOverload<int>(&QSpinBox::valueChanged), this, &KWinScreenEdgesConfigForm::updateDefaultIndicators);
}
KWinScreenEdgesConfigForm::~KWinScreenEdgesConfigForm() = default;
void KWinScreenEdgesConfigForm::setElectricBorderCornerRatio(double value)
{
m_referenceCornerRatio = value;
ui->electricBorderCornerRatioSpin->setValue(m_referenceCornerRatio * 100.);
}
void KWinScreenEdgesConfigForm::setDefaultElectricBorderCornerRatio(double value)
{
m_defaultCornerRatio = value;
updateDefaultIndicators();
}
void KWinScreenEdgesConfigForm::setRemainActiveOnFullscreen(bool remainActive)
{
m_remainActiveOnFullscreen = remainActive;
ui->remainActiveOnFullscreen->setChecked(remainActive);
updateDefaultIndicators();
}
double KWinScreenEdgesConfigForm::electricBorderCornerRatio() const
{
return ui->electricBorderCornerRatioSpin->value() / 100.;
}
void KWinScreenEdgesConfigForm::setElectricBorderCornerRatioEnabled(bool enable)
{
ui->electricBorderCornerRatioSpin->setEnabled(enable);
}
void KWinScreenEdgesConfigForm::reload()
{
ui->electricBorderCornerRatioSpin->setValue(m_referenceCornerRatio * 100.);
KWinScreenEdge::reload();
}
void KWinScreenEdgesConfigForm::setDefaults()
{
ui->electricBorderCornerRatioSpin->setValue(m_defaultCornerRatio * 100.);
ui->remainActiveOnFullscreen->setChecked(false);
KWinScreenEdge::setDefaults();
}
void KWinScreenEdgesConfigForm::setDefaultsIndicatorsVisible(bool visible)
{
if (m_defaultIndicatorVisible != visible) {
m_defaultIndicatorVisible = visible;
updateDefaultIndicators();
}
}
bool KWinScreenEdgesConfigForm::remainActiveOnFullscreen() const
{
return ui->remainActiveOnFullscreen->isChecked();
}
Monitor *KWinScreenEdgesConfigForm::monitor() const
{
return ui->monitor;
}
bool KWinScreenEdgesConfigForm::isSaveNeeded() const
{
return m_referenceCornerRatio != electricBorderCornerRatio() || m_remainActiveOnFullscreen != remainActiveOnFullscreen();
}
bool KWinScreenEdgesConfigForm::isDefault() const
{
return m_defaultCornerRatio == electricBorderCornerRatio() && m_remainActiveOnFullscreen == false;
}
void KWinScreenEdgesConfigForm::sanitizeCooldown()
{
ui->kcfg_ElectricBorderCooldown->setMinimum(ui->kcfg_ElectricBorderDelay->value() + 50);
}
void KWinScreenEdgesConfigForm::groupChanged()
{
// Monitor conflicts
bool hide = false;
if (ui->kcfg_ElectricBorders->currentIndex() == 2) {
hide = true;
}
monitorHideEdge(ElectricTop, hide);
monitorHideEdge(ElectricRight, hide);
monitorHideEdge(ElectricBottom, hide);
monitorHideEdge(ElectricLeft, hide);
}
void KWinScreenEdgesConfigForm::updateDefaultIndicators()
{
ui->electricBorderCornerRatioSpin->setProperty("_kde_highlight_neutral", m_defaultIndicatorVisible && (electricBorderCornerRatio() != m_defaultCornerRatio));
ui->electricBorderCornerRatioSpin->update();
ui->remainActiveOnFullscreen->setProperty("_kde_highlight_neutral", m_defaultIndicatorVisible && remainActiveOnFullscreen() == true);
ui->remainActiveOnFullscreen->update();
}
} // namespace
#include "moc_kwinscreenedgeconfigform.cpp"
@@ -0,0 +1,71 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "kwinscreenedge.h"
namespace Ui
{
class KWinScreenEdgesConfigUI;
}
namespace KWin
{
class KWinScreenEdgesConfigForm : public KWinScreenEdge
{
Q_OBJECT
public:
KWinScreenEdgesConfigForm(QWidget *parent = nullptr);
~KWinScreenEdgesConfigForm() override;
void setRemainActiveOnFullscreen(bool remainActive);
bool remainActiveOnFullscreen() const;
// value is between 0. and 1.
void setElectricBorderCornerRatio(double value);
void setDefaultElectricBorderCornerRatio(double value);
// return value between 0. and 1.
double electricBorderCornerRatio() const;
void setElectricBorderCornerRatioEnabled(bool enable);
void reload() override;
void setDefaults() override;
public Q_SLOTS:
void setDefaultsIndicatorsVisible(bool visible);
protected:
Monitor *monitor() const override;
bool isSaveNeeded() const override;
bool isDefault() const override;
private Q_SLOTS:
void sanitizeCooldown();
void groupChanged();
void updateDefaultIndicators();
private:
bool m_remainActiveOnFullscreen = false;
// electricBorderCornerRatio value between 0. and 1.
double m_referenceCornerRatio = 0.;
double m_defaultCornerRatio = 0.;
bool m_defaultIndicatorVisible = false;
std::unique_ptr<Ui::KWinScreenEdgesConfigUI> ui;
};
} // namespace
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc">
<parameter name="EffectName"/>
</kcfgfile>
<group name="Effect-$(EffectName)">
<entry key="BorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwinscreenedgeeffectsettings.kcfg
NameSpace=KWin
ClassName=KWinScreenEdgeEffectSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc">
<parameter name="ScriptName"/>
</kcfgfile>
<group name="Script-$(ScriptName)">
<entry key="BorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwinscreenedgescriptsettings.kcfg
NameSpace=KWin
ClassName=KWinScreenEdgeScriptSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc"/>
<group name="Windows">
<entry key="ElectricBorders" type="Int">
<default>0</default>
</entry>
<entry key="ElectricBorderDelay" type="Int">
<default>75</default>
</entry>
<entry key="ElectricBorderCooldown" type="Int">
<default>350</default>
</entry>
<entry key="ElectricBorderMaximize" type="Bool">
<default>true</default>
</entry>
<entry key="ElectricBorderTiling" type="Bool">
<default>true</default>
</entry>
<entry key="ElectricBorderCornerRatio" type="Double">
<default>0.25</default>
</entry>
</group>
<group name="ElectricBorders">
<entry key="Top" type="String">
<default>None</default>
</entry>
<entry key="TopRight" type="String">
<default>None</default>
</entry>
<entry key="Right" type="String">
<default>None</default>
</entry>
<entry key="BottomRight" type="String">
<default>None</default>
</entry>
<entry key="Bottom" type="String">
<default>None</default>
</entry>
<entry key="BottomLeft" type="String">
<default>None</default>
</entry>
<entry key="Left" type="String">
<default>None</default>
</entry>
<entry key="TopLeft" type="String">
<default>None</default>
</entry>
</group>
<group name="Effect-windowview">
<entry key="BorderActivateAll" type="IntList">
<default>ElectricNone</default>
</entry>
<entry name="BorderActivatePresentWindows" key="BorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
<entry key="BorderActivateClass" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
<group name="Effect-overview">
<entry name="BorderActivateOverview" key="BorderActivate" type="IntList">
<default>ElectricTopLeft</default>
</entry>
<entry name="BorderActivateGrid" key="GridBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
<group name="TabBox">
<entry name="BorderActivateTabBox" key="BorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
<entry key="BorderAlternativeActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
<group name="ScreenEdges">
<entry name="RemainActiveOnFullscreen" type="Bool">
<default>false</default>
</entry>
</group>
<group name="EdgeBarrier">
<entry name="CornerBarrier" type="Bool">
<default>true</default>
</entry>
<entry name="EdgeBarrier" type="Int">
<default>100</default>
<min>0</min>
<max>1000</max>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwinscreenedgesettings.kcfg
NameSpace=KWin
ClassName=KWinScreenEdgeSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,33 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "kwintouchscreenedgeconfigform.h"
#include "ui_touch.h"
namespace KWin
{
KWinTouchScreenEdgeConfigForm::KWinTouchScreenEdgeConfigForm(QWidget *parent)
: KWinScreenEdge(parent)
, ui(std::make_unique<Ui::KWinTouchScreenConfigUi>())
{
ui->setupUi(this);
}
KWinTouchScreenEdgeConfigForm::~KWinTouchScreenEdgeConfigForm() = default;
Monitor *KWinTouchScreenEdgeConfigForm::monitor() const
{
return ui->monitor;
}
} // namespace
#include "moc_kwintouchscreenedgeconfigform.cpp"
@@ -0,0 +1,38 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "kwinscreenedge.h"
namespace Ui
{
class KWinTouchScreenConfigUi;
}
namespace KWin
{
class KWinTouchScreenEdgeConfigForm : public KWinScreenEdge
{
Q_OBJECT
public:
KWinTouchScreenEdgeConfigForm(QWidget *parent = nullptr);
~KWinTouchScreenEdgeConfigForm() override;
protected:
Monitor *monitor() const override;
private:
std::unique_ptr<Ui::KWinTouchScreenConfigUi> ui;
};
} // namespace
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc">
<parameter name="EffectName"/>
</kcfgfile>
<group name="Effect-$(EffectName)">
<entry key="TouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwintouchscreenedgeeffectsettings.kcfg
NameSpace=KWin
ClassName=KWinTouchScreenEdgeEffectSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc">
<parameter name="ScriptName"/>
</kcfgfile>
<group name="Script-$(ScriptName)">
<entry key="TouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwintouchscreenscriptsettings.kcfg
NameSpace=KWin
ClassName=KWinTouchScreenScriptSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kwinrc"/>
<group name="TouchEdges">
<entry key="Top" type="String">
<default>None</default>
</entry>
<entry key="Right" type="String">
<default>None</default>
</entry>
<entry key="Bottom" type="String">
<default>None</default>
</entry>
<entry key="Left" type="String">
<default>None</default>
</entry>
</group>
<group name="Effect-windowview">
<entry key="TouchBorderActivateAll" type="IntList">
<default>ElectricNone</default>
</entry>
<entry name="TouchBorderActivatePresentWindows" key="TouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
<entry key="TouchBorderActivateClass" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
<group name="Effect-overview">
<entry name="TouchBorderActivateOverview" key="TouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
<entry name="TouchBorderActivateGrid" key="GridTouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
<group name="TabBox">
<entry name="TouchBorderActivateTabBox" key="TouchBorderActivate" type="IntList">
<default>ElectricNone</default>
</entry>
<entry key="TouchBorderAlternativeActivate" type="IntList">
<default>ElectricNone</default>
</entry>
</group>
</kcfg>
@@ -0,0 +1,7 @@
File=kwintouchscreensettings.kcfg
NameSpace=KWin
ClassName=KWinTouchScreenSettings
IncludeFiles=\"effect/globals.h\"
Mutators=true
DefaultValueGetters=true
ParentInConstructor=true
@@ -0,0 +1,405 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2008 Martin Gräßlin <mgraesslin@kde.org>
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "main.h"
#include <kwin_effects_interface.h>
#include <KConfigGroup>
#include <KLocalizedString>
#include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <KPluginFactory>
#include <QDBusConnection>
#include <QVBoxLayout>
#include "kwinscreenedgeconfigform.h"
#include "kwinscreenedgedata.h"
#include "kwinscreenedgeeffectsettings.h"
#include "kwinscreenedgescriptsettings.h"
#include "kwinscreenedgesettings.h"
K_PLUGIN_FACTORY_WITH_JSON(KWinScreenEdgesConfigFactory, "kcm_kwinscreenedges.json", registerPlugin<KWin::KWinScreenEdgesConfig>(); registerPlugin<KWin::KWinScreenEdgeData>();)
namespace KWin
{
KWinScreenEdgesConfig::KWinScreenEdgesConfig(QObject *parent, const KPluginMetaData &data)
: KCModule(parent, data)
, m_form(new KWinScreenEdgesConfigForm(widget()))
, m_config(KSharedConfig::openConfig("kwinrc"))
, m_data(new KWinScreenEdgeData(this))
{
QVBoxLayout *layout = new QVBoxLayout(widget());
layout->addWidget(m_form);
addConfig(m_data->settings(), m_form);
monitorInit();
connect(this, &KWinScreenEdgesConfig::defaultsIndicatorsVisibleChanged, m_form, [this]() {
m_form->setDefaultsIndicatorsVisible(defaultsIndicatorsVisible());
});
connect(m_form, &KWinScreenEdgesConfigForm::saveNeededChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetChangeState);
connect(m_form, &KWinScreenEdgesConfigForm::defaultChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetDefaultState);
}
KWinScreenEdgesConfig::~KWinScreenEdgesConfig()
{
}
void KWinScreenEdgesConfig::load()
{
KCModule::load();
m_data->settings()->load();
for (KWinScreenEdgeScriptSettings *setting : std::as_const(m_scriptSettings)) {
setting->load();
}
for (KWinScreenEdgeEffectSettings *setting : std::as_const(m_effectSettings)) {
setting->load();
}
monitorLoadSettings();
monitorLoadDefaultSettings();
m_form->setRemainActiveOnFullscreen(m_data->settings()->remainActiveOnFullscreen());
m_form->setElectricBorderCornerRatio(m_data->settings()->electricBorderCornerRatio());
m_form->setDefaultElectricBorderCornerRatio(m_data->settings()->defaultElectricBorderCornerRatioValue());
m_form->reload();
}
void KWinScreenEdgesConfig::save()
{
monitorSaveSettings();
m_data->settings()->setRemainActiveOnFullscreen(m_form->remainActiveOnFullscreen());
m_data->settings()->setElectricBorderCornerRatio(m_form->electricBorderCornerRatio());
m_data->settings()->save();
for (KWinScreenEdgeScriptSettings *setting : std::as_const(m_scriptSettings)) {
setting->save();
}
for (KWinScreenEdgeEffectSettings *setting : std::as_const(m_effectSettings)) {
setting->save();
}
// Reload saved settings to ScreenEdge UI
monitorLoadSettings();
m_form->setElectricBorderCornerRatio(m_data->settings()->electricBorderCornerRatio());
m_form->setRemainActiveOnFullscreen(m_data->settings()->remainActiveOnFullscreen());
m_form->reload();
// Reload KWin.
QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
QDBusConnection::sessionBus().send(message);
// and reconfigure the effects
OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/Effects"),
QDBusConnection::sessionBus());
interface.reconfigureEffect(QStringLiteral("overview"));
interface.reconfigureEffect(QStringLiteral("windowview"));
for (const auto &effectId : std::as_const(m_effects)) {
interface.reconfigureEffect(effectId);
}
KCModule::save();
}
void KWinScreenEdgesConfig::defaults()
{
m_form->setDefaults();
KCModule::defaults();
}
//-----------------------------------------------------------------------------
// Monitor
static QList<KPluginMetaData> listBuiltinEffects()
{
const QString rootDirectory = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
QStringLiteral("kwin/builtin-effects"),
QStandardPaths::LocateDirectory);
QList<KPluginMetaData> ret;
const QStringList nameFilters{QStringLiteral("*.json")};
QDirIterator it(rootDirectory, nameFilters, QDir::Files);
while (it.hasNext()) {
it.next();
if (const KPluginMetaData metaData = KPluginMetaData::fromJsonFile(it.filePath()); metaData.isValid()) {
ret.append(metaData);
}
}
return ret;
}
static QList<KPluginMetaData> listScriptedEffects()
{
return KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Effect"), QStringLiteral("kwin/effects/"));
}
void KWinScreenEdgesConfig::monitorInit()
{
m_form->monitorAddItem(i18n("No Action"));
m_form->monitorAddItem(i18n("Peek at Desktop"));
m_form->monitorAddItem(i18n("Lock Screen"));
m_form->monitorAddItem(i18n("Show KRunner"));
m_form->monitorAddItem(i18n("Activity Manager"));
m_form->monitorAddItem(i18n("Application Launcher"));
// TODO: Find a better way to get the display name of the present windows,
// Maybe install metadata.json files?
const QString presentWindowsName = i18n("Present Windows");
m_form->monitorAddItem(i18n("%1 - All Desktops", presentWindowsName));
m_form->monitorAddItem(i18n("%1 - Current Desktop", presentWindowsName));
m_form->monitorAddItem(i18n("%1 - Current Application", presentWindowsName));
m_form->monitorAddItem(i18n("Overview"));
m_form->monitorAddItem(i18n("Grid"));
m_form->monitorAddItem(i18n("Toggle window switching"));
m_form->monitorAddItem(i18n("Toggle alternative window switching"));
KConfigGroup config(m_config, QStringLiteral("Plugins"));
const auto effects = listBuiltinEffects() << listScriptedEffects();
for (const KPluginMetaData &effect : effects) {
if (!effect.value(QStringLiteral("X-KWin-Border-Activate"), false)) {
continue;
}
if (!config.readEntry(effect.pluginId() + QStringLiteral("Enabled"), effect.isEnabledByDefault())) {
continue;
}
m_effects << effect.pluginId();
m_form->monitorAddItem(effect.name());
m_effectSettings[effect.pluginId()] = new KWinScreenEdgeEffectSettings(effect.pluginId(), this);
}
const QString scriptFolder = QStringLiteral("kwin/scripts/");
const auto scripts = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Script"), scriptFolder);
for (const KPluginMetaData &script : scripts) {
if (script.value(QStringLiteral("X-KWin-Border-Activate"), false) != true) {
continue;
}
if (!config.readEntry(script.pluginId() + QStringLiteral("Enabled"), script.isEnabledByDefault())) {
continue;
}
m_scripts << script.pluginId();
m_form->monitorAddItem(script.name());
m_scriptSettings[script.pluginId()] = new KWinScreenEdgeScriptSettings(script.pluginId(), this);
}
monitorShowEvent();
}
void KWinScreenEdgesConfig::monitorLoadSettings()
{
// Load ElectricBorderActions
m_form->monitorChangeEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->top()));
m_form->monitorChangeEdge(ElectricTopRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->topRight()));
m_form->monitorChangeEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->right()));
m_form->monitorChangeEdge(ElectricBottomRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->bottomRight()));
m_form->monitorChangeEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->bottom()));
m_form->monitorChangeEdge(ElectricBottomLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->bottomLeft()));
m_form->monitorChangeEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->left()));
m_form->monitorChangeEdge(ElectricTopLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->topLeft()));
// Load effect-specific actions:
// PresentWindows BorderActivateAll
m_form->monitorChangeEdge(m_data->settings()->borderActivateAll(), PresentWindowsAll);
// PresentWindows BorderActivate
m_form->monitorChangeEdge(m_data->settings()->borderActivatePresentWindows(), PresentWindowsCurrent);
// PresentWindows BorderActivateClass
m_form->monitorChangeEdge(m_data->settings()->borderActivateClass(), PresentWindowsClass);
// Overview
m_form->monitorChangeEdge(m_data->settings()->borderActivateOverview(), Overview);
m_form->monitorChangeEdge(m_data->settings()->borderActivateGrid(), Grid);
// TabBox
m_form->monitorChangeEdge(m_data->settings()->borderActivateTabBox(), TabBox);
// Alternative TabBox
m_form->monitorChangeEdge(m_data->settings()->borderAlternativeActivate(), TabBoxAlternative);
// Dinamically loaded effects
int lastIndex = EffectCount;
for (int i = 0; i < m_effects.size(); i++) {
m_form->monitorChangeEdge(m_effectSettings[m_effects[i]]->borderActivate(), lastIndex);
++lastIndex;
}
// Scripts
for (int i = 0; i < m_scripts.size(); i++) {
m_form->monitorChangeEdge(m_scriptSettings[m_scripts[i]]->borderActivate(), lastIndex);
++lastIndex;
}
}
void KWinScreenEdgesConfig::monitorLoadDefaultSettings()
{
// Load ElectricBorderActions
m_form->monitorChangeDefaultEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultTopValue()));
m_form->monitorChangeDefaultEdge(ElectricTopRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultTopRightValue()));
m_form->monitorChangeDefaultEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultRightValue()));
m_form->monitorChangeDefaultEdge(ElectricBottomRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultBottomRightValue()));
m_form->monitorChangeDefaultEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultBottomValue()));
m_form->monitorChangeDefaultEdge(ElectricBottomLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultBottomLeftValue()));
m_form->monitorChangeDefaultEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultLeftValue()));
m_form->monitorChangeDefaultEdge(ElectricTopLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultTopLeftValue()));
// Load effect-specific actions:
// PresentWindows BorderActivateAll
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivateAllValue(), PresentWindowsAll);
// PresentWindows BorderActivate
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivatePresentWindowsValue(), PresentWindowsCurrent);
// PresentWindows BorderActivateClass
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivateClassValue(), PresentWindowsClass);
// Overview
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivateOverviewValue(), Overview);
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivateGridValue(), Grid);
// TabBox
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderActivateTabBoxValue(), TabBox);
// Alternative TabBox
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultBorderAlternativeActivateValue(), TabBoxAlternative);
}
void KWinScreenEdgesConfig::monitorSaveSettings()
{
// Save ElectricBorderActions
m_data->settings()->setTop(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTop)));
m_data->settings()->setTopRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTopRight)));
m_data->settings()->setRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricRight)));
m_data->settings()->setBottomRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottomRight)));
m_data->settings()->setBottom(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottom)));
m_data->settings()->setBottomLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottomLeft)));
m_data->settings()->setLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricLeft)));
m_data->settings()->setTopLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTopLeft)));
// Save effect-specific actions:
// Present Windows
m_data->settings()->setBorderActivateAll(m_form->monitorCheckEffectHasEdge(PresentWindowsAll));
m_data->settings()->setBorderActivatePresentWindows(m_form->monitorCheckEffectHasEdge(PresentWindowsCurrent));
m_data->settings()->setBorderActivateClass(m_form->monitorCheckEffectHasEdge(PresentWindowsClass));
// Overview
m_data->settings()->setBorderActivateOverview(m_form->monitorCheckEffectHasEdge(Overview));
m_data->settings()->setBorderActivateGrid(m_form->monitorCheckEffectHasEdge(Grid));
// TabBox
m_data->settings()->setBorderActivateTabBox(m_form->monitorCheckEffectHasEdge(TabBox));
m_data->settings()->setBorderAlternativeActivate(m_form->monitorCheckEffectHasEdge(TabBoxAlternative));
// Dinamically loaded effects
int lastIndex = EffectCount;
for (int i = 0; i < m_effects.size(); i++) {
m_effectSettings[m_effects[i]]->setBorderActivate(m_form->monitorCheckEffectHasEdge(lastIndex));
++lastIndex;
}
// Scripts
for (int i = 0; i < m_scripts.size(); i++) {
m_scriptSettings[m_scripts[i]]->setBorderActivate(m_form->monitorCheckEffectHasEdge(lastIndex));
++lastIndex;
}
}
void KWinScreenEdgesConfig::monitorShowEvent()
{
// Check if they are enabled
KConfigGroup config(m_config, QStringLiteral("Plugins"));
// Present Windows
bool enabled = config.readEntry("windowviewEnabled", true);
m_form->monitorItemSetEnabled(PresentWindowsCurrent, enabled);
m_form->monitorItemSetEnabled(PresentWindowsAll, enabled);
// Overview
const bool overviewEnabled = config.readEntry("overviewEnabled", true);
m_form->monitorItemSetEnabled(Overview, overviewEnabled);
m_form->monitorItemSetEnabled(Grid, overviewEnabled);
// tabbox, depends on reasonable focus policy.
KConfigGroup config2(m_config, QStringLiteral("Windows"));
QString focusPolicy = config2.readEntry("FocusPolicy", QString());
bool reasonable = focusPolicy != "FocusStrictlyUnderMouse" && focusPolicy != "FocusUnderMouse";
m_form->monitorItemSetEnabled(TabBox, reasonable);
m_form->monitorItemSetEnabled(TabBoxAlternative, reasonable);
// Disable Edge if ElectricBorders group entries are immutable
m_form->monitorEnableEdge(ElectricTop, !m_data->settings()->isTopImmutable());
m_form->monitorEnableEdge(ElectricTopRight, !m_data->settings()->isTopRightImmutable());
m_form->monitorEnableEdge(ElectricRight, !m_data->settings()->isRightImmutable());
m_form->monitorEnableEdge(ElectricBottomRight, !m_data->settings()->isBottomRightImmutable());
m_form->monitorEnableEdge(ElectricBottom, !m_data->settings()->isBottomImmutable());
m_form->monitorEnableEdge(ElectricBottomLeft, !m_data->settings()->isBottomLeftImmutable());
m_form->monitorEnableEdge(ElectricLeft, !m_data->settings()->isLeftImmutable());
m_form->monitorEnableEdge(ElectricTopLeft, !m_data->settings()->isTopLeftImmutable());
// Disable ElectricBorderCornerRatio if entry is immutable
m_form->setElectricBorderCornerRatioEnabled(!m_data->settings()->isElectricBorderCornerRatioImmutable());
}
ElectricBorderAction KWinScreenEdgesConfig::electricBorderActionFromString(const QString &string)
{
QString lowerName = string.toLower();
if (lowerName == QLatin1StringView("showdesktop")) {
return ElectricActionShowDesktop;
}
if (lowerName == QLatin1StringView("lockscreen")) {
return ElectricActionLockScreen;
}
if (lowerName == QLatin1StringView("krunner")) {
return ElectricActionKRunner;
}
if (lowerName == QLatin1StringView("activitymanager")) {
return ElectricActionActivityManager;
}
if (lowerName == QLatin1StringView("applicationlauncher")) {
return ElectricActionApplicationLauncher;
}
return ElectricActionNone;
}
QString KWinScreenEdgesConfig::electricBorderActionToString(int action)
{
switch (action) {
case 1:
return QStringLiteral("ShowDesktop");
case 2:
return QStringLiteral("LockScreen");
case 3:
return QStringLiteral("KRunner");
case 4:
return QStringLiteral("ActivityManager");
case 5:
return QStringLiteral("ApplicationLauncher");
default:
return QStringLiteral("None");
}
}
} // namespace
#include "main.moc"
#include "moc_main.cpp"
@@ -0,0 +1,68 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include <kcmodule.h>
#include <ksharedconfig.h>
#include "effect/globals.h"
namespace KWin
{
class KWinScreenEdgeData;
class KWinScreenEdgesConfigForm;
class KWinScreenEdgeScriptSettings;
class KWinScreenEdgeEffectSettings;
class KWinScreenEdgesConfig : public KCModule
{
Q_OBJECT
public:
explicit KWinScreenEdgesConfig(QObject *parent, const KPluginMetaData &data);
~KWinScreenEdgesConfig() override;
public Q_SLOTS:
void save() override;
void load() override;
void defaults() override;
private:
KWinScreenEdgesConfigForm *m_form;
KSharedConfigPtr m_config;
QStringList m_effects; // list of effect IDs ordered in the list they are presented in the menu
QStringList m_scripts; // list of script IDs ordered in the list they are presented in the menu
QHash<QString, KWinScreenEdgeScriptSettings *> m_scriptSettings;
QHash<QString, KWinScreenEdgeEffectSettings *> m_effectSettings;
KWinScreenEdgeData *m_data;
enum EffectActions {
PresentWindowsAll = ELECTRIC_ACTION_COUNT, // Start at the end of built in actions
PresentWindowsCurrent,
PresentWindowsClass,
Overview,
Grid,
TabBox,
TabBoxAlternative,
EffectCount
};
void monitorInit();
void monitorLoadSettings();
void monitorLoadDefaultSettings();
void monitorSaveSettings();
void monitorShowEvent();
static ElectricBorderAction electricBorderActionFromString(const QString &string);
static QString electricBorderActionToString(int action);
};
} // namespace
@@ -0,0 +1,401 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>KWinScreenEdgesConfigUI</class>
<widget class="QWidget" name="KWinScreenEdgesConfigUI">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>525</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>525</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="infoLabel">
<property name="text">
<string>You can trigger an action by pushing the mouse cursor against the corresponding screen edge or corner.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="KWin::Monitor" name="monitor" native="true">
<property name="minimumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<property name="formAlignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="quickMaximizeLabel">
<property name="text">
<string>&amp;Maximize:</string>
</property>
<property name="buddy">
<cstring>kcfg_ElectricBorderMaximize</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="kcfg_ElectricBorderMaximize">
<property name="text">
<string>Windows dragged to top edge</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="quickTileLabel">
<property name="text">
<string>&amp;Tile:</string>
</property>
<property name="buddy">
<cstring>kcfg_ElectricBorderTiling</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="kcfg_ElectricBorderTiling">
<property name="text">
<string>Windows dragged to left or right edge</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Behavior:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="remainActiveOnFullscreen">
<property name="text">
<string>Remain active when windows are fullscreen</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="electricBorderCornerRatioLabel">
<property name="text">
<string>Trigger &amp;quarter tiling in:</string>
</property>
<property name="buddy">
<cstring>electricBorderCornerRatioSpin</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QSpinBox" name="electricBorderCornerRatioSpin">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="prefix">
<string>Outer </string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>49</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_1">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>of the screen</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="1">
<spacer name="verticalSpacer_1">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>4</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLabel" name="desktopSwitchLabel">
<property name="toolTip">
<string>Change desktop when the mouse cursor is pushed against the edge of the screen</string>
</property>
<property name="text">
<string>&amp;Switch desktop on edge:</string>
</property>
<property name="buddy">
<cstring>kcfg_ElectricBorders</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="kcfg_ElectricBorders">
<item>
<property name="text">
<string comment="Switch desktop on edge">Disabled</string>
</property>
</item>
<item>
<property name="text">
<string>Only when moving windows</string>
</property>
</item>
<item>
<property name="text">
<string>Always enabled</string>
</property>
</item>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="activationDelayLabel">
<property name="toolTip">
<string>Amount of time required for the mouse cursor to be pushed against the edge of the screen before the action is triggered</string>
</property>
<property name="text">
<string>Activation &amp;delay:</string>
</property>
<property name="buddy">
<cstring>kcfg_ElectricBorderDelay</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="kcfg_ElectricBorderDelay">
<property name="suffix">
<string> ms</string>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>50</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="triggerCooldownLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Amount of time required after triggering an action until the next trigger can occur</string>
</property>
<property name="text">
<string>&amp;Reactivation delay:</string>
</property>
<property name="buddy">
<cstring>kcfg_ElectricBorderCooldown</cstring>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="kcfg_ElectricBorderCooldown">
<property name="enabled">
<bool>true</bool>
</property>
<property name="suffix">
<string> ms</string>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>50</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="CornerBarrierLabel">
<property name="text">
<string>&amp;Corner barrier:</string>
</property>
<property name="buddy">
<cstring>kcfg_CornerBarrier</cstring>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QCheckBox" name="kcfg_CornerBarrier">
<property name="whatsThis">
<string>Here you can enable or disable the virtual corner barrier between screens. The barrier prevents the cursor from moving to another screen when it is already touching a screen corner. This makes it easier to trigger user interface elements like maximized windows' close buttons when using multiple screens.</string>
</property>
<property name="toolTip">
<string comment="@info:tooltip">Prevents cursors from crossing at screen corners.</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="EdgeBarrierLabel">
<property name="text">
<string>&amp;Edge barrier:</string>
</property>
<property name="buddy">
<cstring>kcfg_EdgeBarrier</cstring>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QSpinBox" name="kcfg_EdgeBarrier">
<property name="whatsThis">
<string>Here you can set size of the edge barrier between different screens. The barrier adds additional distance you have to move your pointer before it crosses the edge onto the other screen. This makes it easier to access user interface elements like Plasma Panels that are located on an edge between screens.</string>
</property>
<property name="toolTip">
<string comment="@info:tooltip">Additional distance cursor needs to travel to cross screen edges.</string>
</property>
<property name="specialValueText">
<string>None</string>
</property>
<property name="suffix">
<string> px</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KWin::Monitor</class>
<extends>QWidget</extends>
<header>monitor.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>kcfg_ElectricBorderTiling</sender>
<signal>toggled(bool)</signal>
<receiver>label_1</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>kcfg_ElectricBorderTiling</sender>
<signal>toggled(bool)</signal>
<receiver>electricBorderCornerRatioSpin</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>kcfg_ElectricBorderTiling</sender>
<signal>toggled(bool)</signal>
<receiver>electricBorderCornerRatioLabel</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
</connections>
</ui>
@@ -0,0 +1,288 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2008 Lubos Lunak <l.lunak@suse.cz>
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "monitor.h"
#include <KLocalizedString>
#include <KSvg/FrameSvg>
#include <QApplication>
#include <QDebug>
#include <QGraphicsScene>
#include <QGraphicsSceneEvent>
#include <QGraphicsView>
#include <QMenu>
#include <QScreen>
#include <QWindow>
namespace KWin
{
static QScreen *screenFromWidget(const QWidget *widget)
{
QScreen *screen = widget->screen();
if (screen) {
return screen;
}
return QGuiApplication::primaryScreen();
}
Monitor::Monitor(QWidget *parent)
: ScreenPreviewWidget(parent)
{
for (auto &popup : m_popups) {
popup = std::make_unique<QMenu>(this);
}
m_scene = std::make_unique<QGraphicsScene>(this);
m_view = std::make_unique<QGraphicsView>(m_scene.get(), this);
m_view->setBackgroundBrush(Qt::black);
m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->setFocusPolicy(Qt::NoFocus);
m_view->setFrameShape(QFrame::NoFrame);
for (size_t i = 0; i < m_items.size(); i++) {
m_items[i] = std::make_unique<Corner>(this);
m_scene->addItem(m_items[i].get());
m_hidden[i] = false;
m_actionGroups[i] = std::make_unique<QActionGroup>(this);
}
QRect avail = screenFromWidget(this)->geometry();
setMinimumContentWidth(20 * 3 + 5 * 2); // 3 buttons in a row and some spacing between them
setRatio((qreal)avail.width() / (qreal)avail.height());
checkSize();
}
Monitor::~Monitor() = default;
void Monitor::clear()
{
for (size_t i = 0; i < m_popups.size(); i++) {
m_popups[i]->clear();
m_items[i]->setActive(false);
setEdgeHidden(i, false);
m_actionGroups[i] = std::make_unique<QActionGroup>(this);
}
}
void Monitor::resizeEvent(QResizeEvent *e)
{
ScreenPreviewWidget::resizeEvent(e);
checkSize();
}
bool Monitor::event(QEvent *event)
{
const bool r = ScreenPreviewWidget::event(event);
if (event->type() == QEvent::ScreenChangeInternal) {
QRect avail = screenFromWidget(this)->geometry();
setRatio((qreal)avail.width() / (qreal)avail.height());
checkSize();
}
return r;
}
void Monitor::checkSize()
{
QRect contentsRect = previewRect();
m_view->setGeometry(contentsRect);
m_scene->setSceneRect(QRect(QPoint(0, 0), contentsRect.size()));
const int x2 = (contentsRect.width() - 20) / 2;
const int x3 = contentsRect.width() - 20;
const int y2 = (contentsRect.height() - 20) / 2;
const int y3 = contentsRect.height() - 20;
m_items[0]->setRect(0, y2, 20, 20);
m_items[1]->setRect(x3, y2, 20, 20);
m_items[2]->setRect(x2, 0, 20, 20);
m_items[3]->setRect(x2, y3, 20, 20);
m_items[4]->setRect(0, 0, 20, 20);
m_items[5]->setRect(x3, 0, 20, 20);
m_items[6]->setRect(0, y3, 20, 20);
m_items[7]->setRect(x3, y3, 20, 20);
}
void Monitor::setEdgeEnabled(int edge, bool enabled)
{
for (QAction *action : std::as_const(m_popupActions[edge])) {
action->setEnabled(enabled);
}
}
void Monitor::setEdgeHidden(int edge, bool set)
{
m_hidden[edge] = set;
if (set) {
m_items[edge]->hide();
} else {
m_items[edge]->show();
}
}
bool Monitor::edgeHidden(int edge) const
{
return m_hidden[edge];
}
void Monitor::addEdgeItem(int edge, const QString &item)
{
QAction *act = m_popups[edge]->addAction(item);
act->setCheckable(true);
m_popupActions[edge].append(act);
m_actionGroups[edge]->addAction(act);
if (m_popupActions[edge].count() == 1) {
act->setChecked(true);
m_items[edge]->setToolTip(item);
}
m_items[edge]->setActive(!m_popupActions[edge].front()->isChecked());
}
void Monitor::setEdgeItemEnabled(int edge, int index, bool enabled)
{
m_popupActions[edge][index]->setEnabled(enabled);
}
bool Monitor::edgeItemEnabled(int edge, int index) const
{
return m_popupActions[edge][index]->isEnabled();
}
void Monitor::selectEdgeItem(int edge, int index)
{
m_popupActions[edge][index]->setChecked(true);
m_items[edge]->setActive(!m_popupActions[edge].front()->isChecked());
QString actionText = m_popupActions[edge][index]->text();
// remove accelerators added by KAcceleratorManager
actionText = KLocalizedString::removeAcceleratorMarker(actionText);
m_items[edge]->setToolTip(actionText);
}
int Monitor::selectedEdgeItem(int edge) const
{
const auto &actions = m_popupActions[edge];
for (QAction *act : actions) {
if (act->isChecked()) {
return actions.indexOf(act);
}
}
Q_UNREACHABLE();
}
void Monitor::popup(Corner *c, QPoint pos)
{
for (size_t i = 0; i < m_items.size(); i++) {
if (m_items[i].get() == c) {
if (m_popupActions[i].empty()) {
return;
}
if (QAction *a = m_popups[i]->exec(pos)) {
selectEdgeItem(i, m_popupActions[i].indexOf(a));
Q_EMIT changed();
Q_EMIT edgeSelectionChanged(i, m_popupActions[i].indexOf(a));
c->setToolTip(KLocalizedString::removeAcceleratorMarker(a->text()));
}
return;
}
}
Q_UNREACHABLE();
}
void Monitor::flip(Corner *c, QPoint pos)
{
for (size_t i = 0; i < m_items.size(); i++) {
if (m_items[i].get() == c) {
if (m_popupActions[i].empty()) {
m_items[i]->setActive(m_items[i]->brush() != Qt::green);
} else {
popup(c, pos);
}
return;
}
}
Q_UNREACHABLE();
}
Monitor::Corner::Corner(Monitor *m)
: m_monitor(m)
, m_button(std::make_unique<KSvg::FrameSvg>())
{
m_button->setImageSet(m->svgImageSet());
m_button->setImagePath("widgets/button");
setAcceptHoverEvents(true);
}
Monitor::Corner::~Corner() = default;
void Monitor::Corner::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
{
m_monitor->popup(this, e->screenPos());
}
void Monitor::Corner::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
m_monitor->flip(this, e->screenPos());
}
void Monitor::Corner::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
if (m_hover) {
m_button->setElementPrefix("normal");
qreal left, top, right, bottom;
m_button->getMargins(left, top, right, bottom);
m_button->setElementPrefix("active");
qreal activeLeft, activeTop, activeRight, activeBottom;
m_button->getMargins(activeLeft, activeTop, activeRight, activeBottom);
QRectF activeRect = QRectF(QPointF(0, 0), rect().size());
activeRect.adjust(left - activeLeft, top - activeTop,
-(right - activeRight), -(bottom - activeBottom));
m_button->setElementPrefix("active");
m_button->resizeFrame(activeRect.size());
m_button->paintFrame(painter, rect().topLeft() + activeRect.topLeft());
} else {
m_button->setElementPrefix(m_active ? "pressed" : "normal");
m_button->resizeFrame(rect().size());
m_button->paintFrame(painter, rect().topLeft());
}
if (m_active) {
QPainterPath roundedRect;
painter->setRenderHint(QPainter::Antialiasing);
roundedRect.addRoundedRect(rect().adjusted(5, 5, -5, -5), 2, 2);
painter->fillPath(roundedRect, QApplication::palette().text());
}
}
void Monitor::Corner::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
{
m_hover = true;
update();
}
void Monitor::Corner::hoverLeaveEvent(QGraphicsSceneHoverEvent *e)
{
m_hover = false;
update();
}
void Monitor::Corner::setActive(bool active)
{
m_active = active;
update();
}
bool Monitor::Corner::active() const
{
return m_active;
}
} // namespace
#include "moc_monitor.cpp"
@@ -0,0 +1,106 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2008 Lubos Lunak <l.lunak@suse.cz>
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "screenpreviewwidget.h"
#include <QActionGroup>
#include <QGraphicsItem>
#include <QList>
#include <array>
#include <memory>
class QAction;
class QGraphicsView;
class QGraphicsScene;
class QMenu;
namespace KSvg
{
class FrameSvg;
}
namespace KWin
{
class Monitor : public ScreenPreviewWidget
{
Q_OBJECT
public:
explicit Monitor(QWidget *parent);
~Monitor();
void setEdgeEnabled(int edge, bool enabled);
void setEdgeHidden(int edge, bool set);
bool edgeHidden(int edge) const;
void clear();
void addEdgeItem(int edge, const QString &item);
void setEdgeItemEnabled(int edge, int index, bool enabled);
bool edgeItemEnabled(int edge, int index) const;
void selectEdgeItem(int edge, int index);
int selectedEdgeItem(int edge) const;
enum Edges {
Left,
Right,
Top,
Bottom,
TopLeft,
TopRight,
BottomLeft,
BottomRight,
None
};
Q_SIGNALS:
void changed();
void edgeSelectionChanged(int edge, int index);
protected:
void resizeEvent(QResizeEvent *e) override;
bool event(QEvent *event) override;
private:
class Corner;
void popup(Corner *c, QPoint pos);
void flip(Corner *c, QPoint pos);
void checkSize();
std::unique_ptr<QGraphicsScene> m_scene;
std::unique_ptr<QGraphicsView> m_view;
std::array<std::unique_ptr<Corner>, 8> m_items;
std::array<bool, 8> m_hidden;
std::array<std::unique_ptr<QMenu>, 8> m_popups;
std::array<QList<QAction *>, 8> m_popupActions;
std::array<std::unique_ptr<QActionGroup>, 8> m_actionGroups;
};
class Monitor::Corner : public QGraphicsRectItem
{
public:
Corner(Monitor *m);
~Corner() override;
void setActive(bool active);
bool active() const;
protected:
void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) override;
void mousePressEvent(QGraphicsSceneMouseEvent *e) override;
void hoverEnterEvent(QGraphicsSceneHoverEvent *e) override;
void hoverLeaveEvent(QGraphicsSceneHoverEvent *e) override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
private:
Monitor *const m_monitor;
const std::unique_ptr<KSvg::FrameSvg> m_button;
bool m_active = false;
bool m_hover = false;
};
} // namespace
@@ -0,0 +1,161 @@
/*
SPDX-FileCopyrightText: 2009 Marco Martin <notmart@gmail.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "screenpreviewwidget.h"
#include <QPaintEvent>
#include <QPainter>
#include <QResizeEvent>
#include <QDebug>
#include <QMimeData>
#include <KSvg/FrameSvg>
#include <KSvg/ImageSet>
#include <memory>
class ScreenPreviewWidgetPrivate
{
public:
ScreenPreviewWidgetPrivate(ScreenPreviewWidget *screen)
: q(screen)
, ratio(1)
, minimumContentWidth(0)
{
}
~ScreenPreviewWidgetPrivate()
{
}
void updateRect(const QRectF &rect)
{
q->update(rect.toRect());
}
void updateScreenGraphics()
{
int bottomElements = screenGraphics->elementSize("base").height() + screenGraphics->marginSize(KSvg::FrameSvg::BottomMargin);
QRect bounds(QPoint(0, 0), QSize(q->width(), q->height() - bottomElements));
QSizeF monitorSize(1.0, 1.0 / ratio);
monitorSize.scale(bounds.size(), Qt::KeepAspectRatio);
if (monitorSize.isEmpty()) {
return;
}
const auto minFrameWidth = minimumContentWidth + screenGraphics->marginSize(KSvg::FrameSvg::LeftMargin) + screenGraphics->marginSize(KSvg::FrameSvg::RightMargin);
if (monitorSize.width() < minFrameWidth) {
monitorSize.setWidth(minFrameWidth);
}
monitorRect = QRect(QPoint(0, 0), monitorSize.toSize());
monitorRect.moveCenter(bounds.center());
screenGraphics->resizeFrame(monitorRect.size());
previewRect = screenGraphics->contentsRect().toRect();
previewRect.moveCenter(bounds.center());
}
ScreenPreviewWidget *q;
std::unique_ptr<KSvg::ImageSet> svgImageSet;
KSvg::FrameSvg *screenGraphics;
QPixmap preview;
QRect monitorRect;
qreal ratio;
qreal minimumContentWidth;
QRect previewRect;
};
ScreenPreviewWidget::ScreenPreviewWidget(QWidget *parent)
: QWidget(parent)
, d(std::make_unique<ScreenPreviewWidgetPrivate>(this))
{
d->svgImageSet = std::make_unique<KSvg::ImageSet>();
d->svgImageSet->setBasePath("plasma/desktoptheme");
d->screenGraphics = new KSvg::FrameSvg(this);
d->screenGraphics->setImageSet(d->svgImageSet.get());
d->screenGraphics->setImagePath("widgets/monitor");
d->updateScreenGraphics();
}
ScreenPreviewWidget::~ScreenPreviewWidget() = default;
void ScreenPreviewWidget::setPreview(const QPixmap &preview)
{
d->preview = preview;
update();
}
const QPixmap ScreenPreviewWidget::preview() const
{
return d->preview;
}
void ScreenPreviewWidget::setRatio(const qreal ratio)
{
d->ratio = ratio;
d->updateScreenGraphics();
}
qreal ScreenPreviewWidget::ratio() const
{
return d->ratio;
}
void ScreenPreviewWidget::setMinimumContentWidth(const qreal minw)
{
d->minimumContentWidth = minw;
d->updateScreenGraphics();
}
qreal ScreenPreviewWidget::minimumContentWidth() const
{
return d->minimumContentWidth;
}
QRect ScreenPreviewWidget::previewRect() const
{
return d->previewRect;
}
KSvg::ImageSet *ScreenPreviewWidget::svgImageSet() const
{
return d->svgImageSet.get();
}
void ScreenPreviewWidget::resizeEvent(QResizeEvent *e)
{
d->updateScreenGraphics();
}
void ScreenPreviewWidget::paintEvent(QPaintEvent *event)
{
if (d->monitorRect.size().isEmpty()) {
return;
}
QPainter painter(this);
QPoint standPosition(d->monitorRect.center().x() - d->screenGraphics->elementSize("base").width() / 2, d->previewRect.bottom());
d->screenGraphics->paint(&painter, QRect(standPosition, d->screenGraphics->elementSize("base").toSize()), "base");
d->screenGraphics->paintFrame(&painter, d->monitorRect.topLeft());
painter.save();
if (!d->preview.isNull()) {
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.drawPixmap(d->previewRect, d->preview, d->preview.rect());
}
painter.restore();
d->screenGraphics->paint(&painter, d->previewRect, "glass");
}
#include "moc_screenpreviewwidget.cpp"
@@ -0,0 +1,45 @@
/*
SPDX-FileCopyrightText: 2009 Marco Martin <notmart@gmail.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#pragma once
#include <QWidget>
namespace KSvg
{
class ImageSet;
}
class ScreenPreviewWidgetPrivate;
class ScreenPreviewWidget : public QWidget
{
Q_OBJECT
public:
ScreenPreviewWidget(QWidget *parent);
~ScreenPreviewWidget() override;
void setPreview(const QPixmap &preview);
const QPixmap preview() const;
void setRatio(const qreal ratio);
qreal ratio() const;
void setMinimumContentWidth(qreal minw);
qreal minimumContentWidth() const;
QRect previewRect() const;
KSvg::ImageSet *svgImageSet() const;
protected:
void resizeEvent(QResizeEvent *event) override;
void paintEvent(QPaintEvent *event) override;
private:
void updateRect(const QRectF &rect);
const std::unique_ptr<ScreenPreviewWidgetPrivate> d;
};
@@ -0,0 +1,346 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2008 Martin Gräßlin <mgraesslin@kde.org>
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "touch.h"
#include <kwin_effects_interface.h>
#include <KConfigGroup>
#include <KLocalizedString>
#include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <KPluginFactory>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QVBoxLayout>
#include "kwintouchscreendata.h"
#include "kwintouchscreenedgeconfigform.h"
#include "kwintouchscreenedgeeffectsettings.h"
#include "kwintouchscreenscriptsettings.h"
#include "kwintouchscreensettings.h"
K_PLUGIN_FACTORY_WITH_JSON(KWinScreenEdgesConfigFactory, "kcm_kwintouchscreen.json", registerPlugin<KWin::KWinScreenEdgesConfig>(); registerPlugin<KWin::KWinTouchScreenData>();)
namespace KWin
{
KWinScreenEdgesConfig::KWinScreenEdgesConfig(QObject *parent, const KPluginMetaData &data)
: KCModule(parent, data)
, m_form(new KWinTouchScreenEdgeConfigForm(widget()))
, m_config(KSharedConfig::openConfig("kwinrc"))
, m_data(new KWinTouchScreenData(this))
{
QVBoxLayout *layout = new QVBoxLayout(widget());
layout->addWidget(m_form);
monitorInit();
connect(m_form, &KWinTouchScreenEdgeConfigForm::saveNeededChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetChangeState);
connect(m_form, &KWinTouchScreenEdgeConfigForm::defaultChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetDefaultState);
}
KWinScreenEdgesConfig::~KWinScreenEdgesConfig()
{
}
void KWinScreenEdgesConfig::load()
{
KCModule::load();
m_data->settings()->load();
for (KWinTouchScreenScriptSettings *setting : std::as_const(m_scriptSettings)) {
setting->load();
}
for (KWinTouchScreenEdgeEffectSettings *setting : std::as_const(m_effectSettings)) {
setting->load();
}
monitorLoadSettings();
monitorLoadDefaultSettings();
m_form->reload();
}
void KWinScreenEdgesConfig::save()
{
monitorSaveSettings();
m_data->settings()->save();
for (KWinTouchScreenScriptSettings *setting : std::as_const(m_scriptSettings)) {
setting->save();
}
for (KWinTouchScreenEdgeEffectSettings *setting : std::as_const(m_effectSettings)) {
setting->save();
}
// Reload saved settings to ScreenEdge UI
monitorLoadSettings();
m_form->reload();
// Reload KWin.
QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
QDBusConnection::sessionBus().send(message);
// and reconfigure the effects
OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/Effects"),
QDBusConnection::sessionBus());
interface.reconfigureEffect(QStringLiteral("windowview"));
interface.reconfigureEffect(QStringLiteral("overview"));
for (const auto &effectId : std::as_const(m_effects)) {
interface.reconfigureEffect(effectId);
}
KCModule::save();
}
void KWinScreenEdgesConfig::defaults()
{
m_form->setDefaults();
KCModule::defaults();
}
//-----------------------------------------------------------------------------
// Monitor
void KWinScreenEdgesConfig::monitorInit()
{
m_form->monitorHideEdge(ElectricTopLeft, true);
m_form->monitorHideEdge(ElectricTopRight, true);
m_form->monitorHideEdge(ElectricBottomRight, true);
m_form->monitorHideEdge(ElectricBottomLeft, true);
m_form->monitorAddItem(i18n("No Action"));
m_form->monitorAddItem(i18n("Peek at Desktop"));
m_form->monitorAddItem(i18n("Lock Screen"));
m_form->monitorAddItem(i18n("Show KRunner"));
m_form->monitorAddItem(i18n("Activity Manager"));
m_form->monitorAddItem(i18n("Application Launcher"));
// TODO: Find a better way to get the display name of the present windows,
// Maybe install metadata.json files?
const QString presentWindowsName = i18n("Present Windows");
m_form->monitorAddItem(i18n("%1 - All Desktops", presentWindowsName));
m_form->monitorAddItem(i18n("%1 - Current Desktop", presentWindowsName));
m_form->monitorAddItem(i18n("%1 - Current Application", presentWindowsName));
m_form->monitorAddItem(i18n("Overview"));
m_form->monitorAddItem(i18n("Grid"));
m_form->monitorAddItem(i18n("Toggle window switching"));
m_form->monitorAddItem(i18n("Toggle alternative window switching"));
KConfigGroup config(m_config, QStringLiteral("Plugins"));
const auto effects = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Script"), QStringLiteral("kwin/builtin-effects/")) << KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Script"), QStringLiteral("kwin/effects/"));
for (const KPluginMetaData &effect : effects) {
if (!effect.value(QStringLiteral("X-KWin-Border-Activate"), false)) {
continue;
}
if (!config.readEntry(effect.pluginId() + QStringLiteral("Enabled"), effect.isEnabledByDefault())) {
continue;
}
m_effects << effect.pluginId();
m_form->monitorAddItem(effect.name());
m_effectSettings[effect.pluginId()] = new KWinTouchScreenEdgeEffectSettings(effect.pluginId(), this);
}
const QString scriptFolder = QStringLiteral("kwin/scripts/");
const auto scripts = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Script"), scriptFolder);
for (const KPluginMetaData &script : scripts) {
if (script.value(QStringLiteral("X-KWin-Border-Activate"), false) != true) {
continue;
}
if (!config.readEntry(script.pluginId() + QStringLiteral("Enabled"), script.isEnabledByDefault())) {
continue;
}
m_scripts << script.pluginId();
m_form->monitorAddItem(script.name());
m_scriptSettings[script.pluginId()] = new KWinTouchScreenScriptSettings(script.pluginId(), this);
}
monitorShowEvent();
}
void KWinScreenEdgesConfig::monitorLoadSettings()
{
// Load ElectricBorderActions
m_form->monitorChangeEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->top()));
m_form->monitorChangeEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->right()));
m_form->monitorChangeEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->bottom()));
m_form->monitorChangeEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->left()));
// Load effect-specific actions:
// Present Windows BorderActivateAll
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivateAll(), PresentWindowsAll);
// PresentWindows BorderActivate
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivatePresentWindows(), PresentWindowsCurrent);
// PresentWindows BorderActivateClass
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivateClass(), PresentWindowsClass);
// Overview
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivateOverview(), Overview);
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivateGrid(), Grid);
// TabBox BorderActivate
m_form->monitorChangeEdge(m_data->settings()->touchBorderActivateTabBox(), TabBox);
// Alternative TabBox
m_form->monitorChangeEdge(m_data->settings()->touchBorderAlternativeActivate(), TabBoxAlternative);
// Dinamically loaded effects
int lastIndex = EffectCount;
for (int i = 0; i < m_effects.size(); i++) {
m_form->monitorChangeEdge(m_effectSettings[m_effects[i]]->touchBorderActivate(), lastIndex);
++lastIndex;
}
// Scripts
for (int i = 0; i < m_scripts.size(); i++) {
m_form->monitorChangeEdge(m_scriptSettings[m_scripts[i]]->touchBorderActivate(), lastIndex);
++lastIndex;
}
}
void KWinScreenEdgesConfig::monitorLoadDefaultSettings()
{
m_form->monitorChangeDefaultEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultTopValue()));
m_form->monitorChangeDefaultEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultRightValue()));
m_form->monitorChangeDefaultEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultBottomValue()));
m_form->monitorChangeDefaultEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_data->settings()->defaultLeftValue()));
// Present Windows BorderActivateAll
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivateAllValue(), PresentWindowsAll);
// PresentWindows BorderActivate
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivatePresentWindowsValue(), PresentWindowsCurrent);
// PresentWindows BorderActivateClass
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivateClassValue(), PresentWindowsClass);
// Overview
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivateOverviewValue(), Overview);
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivateGridValue(), Grid);
// TabBox BorderActivate
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderActivateTabBoxValue(), TabBox);
// Alternative TabBox
m_form->monitorChangeDefaultEdge(m_data->settings()->defaultTouchBorderAlternativeActivateValue(), TabBoxAlternative);
}
void KWinScreenEdgesConfig::monitorSaveSettings()
{
// Save ElectricBorderActions
m_data->settings()->setTop(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTop)));
m_data->settings()->setRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricRight)));
m_data->settings()->setBottom(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottom)));
m_data->settings()->setLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricLeft)));
// Save effect-specific actions:
// Present Windows
m_data->settings()->setTouchBorderActivateAll(m_form->monitorCheckEffectHasEdge(PresentWindowsAll));
m_data->settings()->setTouchBorderActivatePresentWindows(m_form->monitorCheckEffectHasEdge(PresentWindowsCurrent));
m_data->settings()->setTouchBorderActivateClass(m_form->monitorCheckEffectHasEdge(PresentWindowsClass));
// Overview
m_data->settings()->setTouchBorderActivateOverview(m_form->monitorCheckEffectHasEdge(Overview));
m_data->settings()->setTouchBorderActivateGrid(m_form->monitorCheckEffectHasEdge(Grid));
// TabBox
m_data->settings()->setTouchBorderActivateTabBox(m_form->monitorCheckEffectHasEdge(TabBox));
m_data->settings()->setTouchBorderAlternativeActivate(m_form->monitorCheckEffectHasEdge(TabBoxAlternative));
// Dinamically loaded effects
int lastIndex = EffectCount;
for (int i = 0; i < m_effects.size(); i++) {
m_effectSettings[m_effects[i]]->setTouchBorderActivate(m_form->monitorCheckEffectHasEdge(lastIndex));
++lastIndex;
}
// Scripts
for (int i = 0; i < m_scripts.size(); i++) {
m_scriptSettings[m_scripts[i]]->setTouchBorderActivate(m_form->monitorCheckEffectHasEdge(lastIndex));
++lastIndex;
}
}
void KWinScreenEdgesConfig::monitorShowEvent()
{
// Check if they are enabled
KConfigGroup config(m_config, QStringLiteral("Plugins"));
// Present Windows
bool enabled = config.readEntry("windowviewEnabled", true);
m_form->monitorItemSetEnabled(PresentWindowsCurrent, enabled);
m_form->monitorItemSetEnabled(PresentWindowsAll, enabled);
// Overview
const bool overviewEnabled = config.readEntry("overviewEnabled", true);
m_form->monitorItemSetEnabled(Overview, overviewEnabled);
m_form->monitorItemSetEnabled(Grid, overviewEnabled);
// tabbox, depends on reasonable focus policy.
KConfigGroup config2(m_config, QStringLiteral("Windows"));
QString focusPolicy = config2.readEntry("FocusPolicy", QString());
bool reasonable = focusPolicy != "FocusStrictlyUnderMouse" && focusPolicy != "FocusUnderMouse";
m_form->monitorItemSetEnabled(TabBox, reasonable);
m_form->monitorItemSetEnabled(TabBoxAlternative, reasonable);
// Disable Edge if TouchEdges group entries are immutable
m_form->monitorEnableEdge(ElectricTop, !m_data->settings()->isTopImmutable());
m_form->monitorEnableEdge(ElectricRight, !m_data->settings()->isRightImmutable());
m_form->monitorEnableEdge(ElectricBottom, !m_data->settings()->isBottomImmutable());
m_form->monitorEnableEdge(ElectricLeft, !m_data->settings()->isLeftImmutable());
}
ElectricBorderAction KWinScreenEdgesConfig::electricBorderActionFromString(const QString &string)
{
QString lowerName = string.toLower();
if (lowerName == QLatin1StringView("showdesktop")) {
return ElectricActionShowDesktop;
}
if (lowerName == QLatin1StringView("lockscreen")) {
return ElectricActionLockScreen;
}
if (lowerName == QLatin1StringView("krunner")) {
return ElectricActionKRunner;
}
if (lowerName == QLatin1StringView("activitymanager")) {
return ElectricActionActivityManager;
}
if (lowerName == QLatin1StringView("applicationlauncher")) {
return ElectricActionApplicationLauncher;
}
return ElectricActionNone;
}
QString KWinScreenEdgesConfig::electricBorderActionToString(int action)
{
switch (action) {
case 1:
return QStringLiteral("ShowDesktop");
case 2:
return QStringLiteral("LockScreen");
case 3:
return QStringLiteral("KRunner");
case 4:
return QStringLiteral("ActivityManager");
case 5:
return QStringLiteral("ApplicationLauncher");
default:
return QStringLiteral("None");
}
}
} // namespace
#include "touch.moc"
#include "moc_touch.cpp"
@@ -0,0 +1,70 @@
/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include <kcmodule.h>
#include <ksharedconfig.h>
#include "effect/globals.h"
class QShowEvent;
namespace KWin
{
class KWinTouchScreenData;
class KWinTouchScreenEdgeConfigForm;
class KWinTouchScreenScriptSettings;
class KWinTouchScreenEdgeEffectSettings;
class KWinScreenEdgesConfig : public KCModule
{
Q_OBJECT
public:
explicit KWinScreenEdgesConfig(QObject *parent, const KPluginMetaData &data);
~KWinScreenEdgesConfig() override;
public Q_SLOTS:
void save() override;
void load() override;
void defaults() override;
private:
KWinTouchScreenEdgeConfigForm *m_form;
KSharedConfigPtr m_config;
QStringList m_effects; // list of effect IDs ordered in the list they are presented in the menu
QStringList m_scripts; // list of script IDs ordered in the list they are presented in the menu
QHash<QString, KWinTouchScreenScriptSettings *> m_scriptSettings;
QHash<QString, KWinTouchScreenEdgeEffectSettings *> m_effectSettings;
KWinTouchScreenData *m_data;
enum EffectActions {
PresentWindowsAll = ELECTRIC_ACTION_COUNT, // Start at the end of built in actions
PresentWindowsCurrent,
PresentWindowsClass,
Overview,
Grid,
TabBox,
TabBoxAlternative,
EffectCount
};
void monitorInit();
void monitorLoadSettings();
void monitorLoadDefaultSettings();
void monitorSaveSettings();
void monitorShowEvent();
static ElectricBorderAction electricBorderActionFromString(const QString &string);
static QString electricBorderActionToString(int action);
};
} // namespace
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>KWinTouchScreenConfigUi</class>
<widget class="QWidget" name="KWinTouchScreenConfigUi">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>500</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_1">
<property name="text">
<string>You can trigger an action by swiping from the screen edge towards the center of the screen.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_1">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="KWin::Monitor" name="monitor" native="true">
<property name="minimumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KWin::Monitor</class>
<extends>QWidget</extends>
<header>monitor.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>