Tiling ablakezelő készítés

Sziasztok.

Arra gondoltam, készítenék magamnak egy saját tiling stílusú ablakkezelőt. Nem tud valaki valami okos módszer vagy valami programot ami köré lehet építeni egy "egyedi" ablakkezelőt? Van rá lehetőség, hogy ne nulláról keljen kezdeni. Nem valamelyik kész ablakkezelőnek akarok saját kinézetet csinálni. Hanem egy saját ablakkezelőt.

Hozzászólások

Miert?

Nem kotozkodok, hanem kivancsi vagyok. Maga a fejlesztes resze erdekel? Vagy van valami olyan feature, amit eddig nem talaltal meg, es jo lenne, ha lenne?

[troll]Ha nem nulláról akarod kezdeni, akkor mitől is lesz saját?[/troll]

Ha egy meglévőt akarsz fejlesztgetni, akkor az awesome egy jó kiindulás lehet, ui. a Lua nyelv használata miatt elég tág lehetőségeid vannak.
Ha esetleg nem dinamikus, hanem manuális tiling érdekel, akkor a notion lehet egy jó kiindulás, szintén Lua nyelven (gyakorlatilag az Ion3 forkja).
Esetleg az i3 is megér egy megtekintést, a hacking-howto tanulságos olvasmány lehet.
Az xmonad bővítése Haskell nyelven lehetséges, a subtle pedig Ruby nyelven.

Persze a kedvencemet se felejtsük ki, bár valószínűleg nem ennek a forrásából tanulhatsz a legtöbbet: herbstluftwm.

Legelőször azért egy koncepciót ki kellene találni, hogy pontosan mit szeretnél, mert a "tiling ablakkezelőt" eléggé pontatlan válasz.

/off

az ajánlásodra múltkor kipróbáltam a herbstluftwm-et,de valahogy nem tudom megszokni,hogy egyáltalán nincs floating window. i3-ban azt szeretem, hogy van egy terminal, vagy gvim a scratchpad-ban és bármikor előhozom ott van előtérben a többi window felett, amíg gyorsan használom valamire, aztán pedig újra elrejtem.

Igen, egyedi floating ablak nincs, csak egy egész munkaasztalt (tag) tudsz float-ra beállítani.
A scratchpad-et herbstluftwm alatt én speciel monitorral oldottam meg (nem, nem vettem egy új monitort :) ):

herbstclient add "scratchpad"
herbstclient add_monitor 400x300+20+80 scratchpad scratchpad
herbstclient lock_tag scratchpad

Azaz létrehoztam egy tag-et "scratchpad" néven, majd létrehoztam egy virtuális monitort (add_monitor), amelyen a scratchpad tag látszik, és a (virtuális) monitor neve scratchpad. Ezután nem engedem, hogy ezen a monitoron tag-et váltsak (lock_tag).
Ezután, hogy rendesen használjam is:

herbstclient chain X cycle_monitor X raise_monitor

Persze ezt egy billentyűnyomásra rakod (speciel az sxhkd-t használom), melynek hatására teker egyet az aktuális monitoron (cycle_monitor), majd előtérbe helyezi (raise_monitor). A parancs újbóli meghívására (mégegyszer megnyomva a hotkey-t) a következő monitor lesz az aktív (mivel két monitort használok, ezért újra az eredeti lesz).
Mondjuk én egy számológépet raktam ide, de úgy vélem, hogy a célunk ugyanaz :)
De ha egy kész megoldást akarsz, akkor a scratchpad.sh szkriptet javaslom ("a i3-like scratchpad for arbitrary applications").

Az i3-mal kapcsolatban meg egy-két dolgot nem bírtam megszokni:

  • nehézkes beégetett elrendezést (layout) létrehozni (bár nem lehetlen, Layout saving in i3), ui. LaTeX-fájl szerkesztésekor úgy szeretem, ha a képernyő bal felén terminálban a vim, jobb felén az előnézet. Azt nemigen lehet megoldani, hogy a szerkesztő terminál mindig a bal felén jelenjen meg, míg az előnézet a jobb felén (bár talán a swallows opcióval mintha bűvészkedtem volna, viszonylag szerény eredményekkel).
  • az előbbi példánál maradva: bal frame, jobb frame. A jobb frame-ben az előnézet illetve egy másik pdf, amiből "ihletet merítek" (pl. átmásolok egy feladatot). Ezt tabbed-szerűen oldom meg (előnézet csak fordítás után érdekes). Ebből a frame-ből nem kilépve akarok váltani ebben a frame-ben levő alkalmazások között (pl. több pdf-fájl, amiből ihlet kell), illetve ebből a frame-ből át tudjak váltani a bal frame-re. Erre herbstluftwm-re kész megoldás van, de i3 alatt nemigen oldható meg (volt itt erről kérdésem, de aztán kiderült, mégse tökéletes a megoldás, ekkor dobtam az i3-at)

Xorg helyett esetleg próbálj meg portolni már létező wm-et Wayland-re. Közben alakíthatod is tetszés szerint.

Mi lenne ha az xinit lenne a kiindulási pont és ez köré építem a többit? Egyáltalán megfelel a célra?

Szia,
Csak jelezném, hogy a xinit csak az indításért felel,mielőtt félreértésbe csúszol :) ( https://en.wikipedia.org/wiki/Xinit )
Ez talán jó kiindulási alap lehet az X felépítésére ( ha WM-et készülsz írni, célszerű, ha ismered mire is :) ): https://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture
Üdv,
LuiseX

Sziasztok.

Lenne egy olyan kérdésem, van e olyan program, amivel billentyűzet kombinációhoz hozzá lehet rendelni program indításokat. PL: "win+alt+f" elindítja a firefox-ot. Nem kell grafikus legyen. Csak valami jól használható kis program.

off
Milyen nyelven szeretnéd leprogramozni a saját ablakkezelődet?
/off

Ablakkezelőnek az "swn"-t fogom használni. Viszont, bajba vagyok a telepítésével. Tudna esetleg segíteni valaki? A következő hibát írja:

root [ /home/pusztito/Downloads/swm-master ]# make
c99 -c swm.c -o swm.o -Wall -I/opt/X11/include -I/usr/X11R6/include
make: c99: Command not found
Makefile:12: recipe for target 'swm.o' failed
make: *** [swm.o] Error 127

Sziasztok.

Majdnem teljesen készen van az ablakkezelőm. Összeállítás:

swm: window manager
sxhkd: hotkey kezelő (uzsolt ajánlásával. Köszönöm !)
feh: kezeli a háttérképet
wmutils: ablakok kezeléséért felel

Picit még finomhangolok aztán mutatok róla képet, hogy milyen lett.
Köszönöm mindenkinek a segítségét !

Wnck-val nekem jo tapasztalataim vannak, en arra epitve irtam lightos wm szeruseget (annyira, hogy kb 30 sorbol megvolt, persze nem is kellett sokat tudnia).

--
|8]

Sziasztok.

Szeretnék még egy kis segítséget kérni. Arra gondoltam, jó lenne egy panelt berakni felülre, amin lenne a munka asztal váltás és még egy két dolog. Tudtok ajánlani ilyen panelt? Valami hasonló kellene mint amik szoktak lenni a tilling window manager-nél.
Tudnátok ajánlani ilyent? Kicsi és jól konfigurálhatót szeretnék.

Sziasztok.

Egy kis segítséget szeretnék kérni. Kettő panelt szeretnék létrehozni dzen-el. Méghozzá úgy hogy egy config fileból álljon lehetőleg. Eddig így nézz ki a dzen config file http://pastebin.com/4k5GGh7g
Egy panelnál jól működik de kettőnél megzavarodik és az alsó panelra nem rak semmit csak a felső panelon jelenik meg minden és az is "mozog" folyamatosan azt kilép a programból.

Meg lehet valósítani, hogy a 2 panel egy config fileból szedje az infókat amit meg szeretnék jeleníteni?

Először is: a függvény-deklarációkat a while-cikluson kívülre raknám.
A done | $DZEN | $DZENDOWN sorodban lesz a hiba. Ui. a dzen úgy működik, hogy amit kap, azt jeleníti meg. Az első $DZEN megkapja az infót, megjeleníti, király. Ennek a $DZEN-nek az output-ját kapja meg a $DZENDOWN - azaz a semmit, hiszen az stdout-ra a dzen nemigen ír semmit...
Ezt én inkább úgy csinálnám meg, hogy:
dzen_common.sh:

### Színek
 
BG_COLOR="#000000"
FG_COLOR="#FFFFFF"
COLOR_ICON="#F90000"
 
### Ikonok
 
ICONPATH="/usr/share/icons/stlarch_icons-1.2"
 
### Elhelyezkedés
 
HEIGHT=16
WIDTH=1910
 
### Font
 
FONT="-*-terminus-medium-r-*-*-12-*-*-*-*-*-iso10646-*"

### Funciók
...

dzen_top.sh:

#!/bin/sh
. dzen_common.sh

while :; do
  Date
  sleep 1
done | dzen2 -h $HEIGHT -w $WIDTH -fn $FONT -ta r -bg $BG_COLOR -fg $FG_COLOR -dock

dzen_bottom.sh:

#!/bin/sh
. dzen_common.sh

while :; do
  Disk
  Separator
  Disk2
  Separator
  Mem
  sleep 1
done | dzen2 -h $HEIGHT -w $WIDTH -y 1100 -fn $FONT -ta r -bg $BG_COLOR -fg $FG_COLOR -dock

Ami még: a sleep parancs jó lenne a while-ciklusba, hogy ne kérje le az adatokat másodpercenként ezerszer, és jelenítse meg 1000FPS-sel, hanem másodpercenként elég egyszer (vagy akár ritkábban).

Rendszerinformációk megjelenítésére egyébként inkább conky-t javasolnék. Ha gondolod, nézd meg az én dzen-szkriptemet (gyakorlatilag csak az ablakkezelő információt jeleníti meg).

De, sokáig azt használtam. Aztán a 3.5 verziónál (levelezőlistára küldött levél) valahogy a grafikus widgetek sok CPU-t ettek, ami laptopon a ventilátor folyamatos ki-be-kapcsolását eredményezte, ami nemigen tetszett. Meg kb. ennél a verziónál sokalltam be az API folyamatos változásától. Aztán hosszabb-rövidebb idő után megtaláltam a herbstluftwm-et, amit azóta is nagy megelégedéssel haszználok (volt egy kis kitérő i3 felé és fluxbox felé) :)

[subs] Engem is érdekelnek a tiling wm-ek, de még nem léptem openbox-tól errefelé...

Sziasztok!

Még egy utolsó segítséget szeretnék kérni és elméletileg, készen van. Szeretném, ha több munka területem lenne nem csak egy. Erre van valami jó program?
Másik kérdésem, nem sikerült rájönnöm, hogyan tudom beállítani, hogy az ablakokat előtérbe tudjam helyezni. Eddig úgy oldottam meg, hogy átméretezésnél előtérbe kerül.

u.i: Ha A munkaterület is megvan akkor már csak egy scriptet szeretnék írni amibe benne lesz az összes használt program és a config file-ok helye. De ez a legvégső művelet.

Úgy látom, az swm nem kezel munkaasztalokat. Lehetőségeid:

  • bővíted az swm-et, hogy kezelje
  • megbütykölöd a wmutils-szal (első felindulásra a munkaterület-váltást egy szkript segítségével végzed, tárolod valahogy, hogy melyik kliens/ablak melyik munkaterületen van, és váltáskor csak ezeket jeleníted meg)
  • választasz egy olyan ablakkezelőt, amelyik kezeli a munkaasztalokat

Sziasztok !

Az első variáció nagyon jól használhatóra sikerült. Azóta, lecseréltem az swm-t egy saját X indítóra. Még kisebb lett. Az egész 6 sorból áll 'C' nyelven.
Viszont, kedvet kaptam ezt tovább fejleszteni. Csak azt nem tudtam eldönteni, hogy egy fő programot csináljak ami tartalmaz mindent, vagy bontsam fel "külön workspace,fókusz managert stb." Ti mit javasoltok? Minden funkciót külön írjam meg vagy mehet egybe az egész? Mondjuk személy szerint, külön külön programot írnék hozzá, hogy mégjobban áttekinthető legyen.

Én szívesen látnám azt a 6 sort, érdekes a project-ed.

Ezen kívül mindig, mindenek felett a moduláris, kis elemekből építkezést javaslom, nem tudom mik a terveid, akarod-e másokkal teszteltetni a programjaid, akár részekben is használhatóvá tenni, de hirtelen nem tudok érvet hozni az egybe építés mellett.

Én FrankenWM -et használok. Istenkirály.

- Amit előre megírt programok bash-ból futtatásával ollóztál össze, anélkül, hogy direktben egy X hívást bárhol leírtál volna (kommentjeid alapján nem WM, hanem DE, amit csináltál. Már ott csóváltam a fejem, amikor azt írtad, bash-ban rakod össze)
- Amit lényegében mások raktak össze neked
- De legalább meg sem mutatod

Sziasztok.

Sikerült össze mókulni majdnem egy teljes wm-et. Most a billentyűzettel kínlódok. Úgy szeretném megcsinálni, hogy egy külső config fileból vegye az adatokat. Például a home könyvtárba lenne egy keybord.cfg file ahol tartalmazza a billentyűzet kombinációkat, hogy bármikor tudjak hozzáírni vagy módosítani.
Ezt hogyan tudnám kivitelezni?

Sziasztok.

Egy kis segítséget szeretnék kérni a "Makefile" létrehozásába. Az eddig létrehozott ablakkezelőt szeretném letesztelni. Ha jól működik, akkor még egy kis bővítés és kész.
A makefile : http://pastebin.com/xh36WLyw

terminál kimenet:
root [ /home/pusztito/windowsmanager/nemesiswm ]# make
Makefile:29: *** missing separator. Stop.
root [ /home/pusztito/windowsmanager/nemesiswm ]#

A "Makefile"-t sikerült megcsinálni. A lenne még két kérdésem. Minden funkciót hozzá külön külön raktam. pl. billentyűzet, ablak fókusz, ablak mozgatás. Hogyan tudom megcsinálni, hogy a fő programhoz tartozzanak? A másik kérdésem, billentyűzet "deamon"-om egy meghatározott helyről vegye a konfig adatokat.

Sziasztok. Egy kis segítséget szeretnék kérni. Elkezdtek összemokolni egy ablakkezelőt. Több project-ből szedem az inspirációt. Viszont, az egér gombok funkcióknál elakadtam. Ebbe kérnék egy kis segítséget. http://pastebin.com/0KmdeDfx
Forgatásnál a következő hibát írja:

bash-4.3$ make
cc -o nemesiswm.o -c -I/usr/local/include -O2 -std=c99 -Wall -pedantic -DDEBUG nemesiswm.c
nemesiswm.c: In function 'window_manage':
nemesiswm.c:139:5: warning: implicit declaration of function 'mouse_buttons' [-Wimplicit-function-declaration]
mouse_buttons(win->id);
^~~~~~~~~~~~~
nemesiswm.c: At top level:
nemesiswm.c:249:1: warning: conflicting types for 'mouse_buttons'
mouse_buttons(xcb_window_t id)
^~~~~~~~~~~~~
nemesiswm.c:249:1: error: static declaration of 'mouse_buttons' follows non-static declaration
nemesiswm.c:139:5: note: previous implicit declaration of 'mouse_buttons' was here
mouse_buttons(win->id);
^~~~~~~~~~~~~
nemesiswm.c:249:1: warning: 'mouse_buttons' defined but not used [-Wunused-function]
mouse_buttons(xcb_window_t id)
^~~~~~~~~~~~~
Makefile:8: recipe for target 'nemesiswm.o' failed
make: *** [nemesiswm.o] Error 1

Ha sikerült kijavítani utána folytatom tovább. Szeretnék még bár dolgot hozzáépíteni.

Sziasztok ! Elkészült az alapja a window manageremnek. El is indul, és működik is rendesen. Viszont, szeretném tovább fejleszteni. Jó lenne ha lenne benne panel és kezelné a háttérképet is. Viszont, nem tudom merre is induljak el. Az egész ablakkezelőm XCB alapszik és szeretném ezen folytatni. Leírás nem nagyon találtam ami segítene ebben. Tudna valaki segíteni?

Panel: valami gui toolkit X fölött. Low level is lehet: Xaw, Motif. Normál ablak, úgyhogy a wm-ed rakja el majd valahová.

Hátteret meg rárajzolod a root windowra. De minek, a tilingnél mikor fog látszódni?

Off: amúgy ki írja? Te vagy mi? Tessék már megnézni egynek a forrását, vagy valami... Ezek azért kereshető dolgok.

Sziasztok !

Sikerült egy kicsit továbbfejleszteni az ablakkezelőmet. Eddig remekül működöt az ablak mozgatás de valami miatt most nem megy. Már napok óta keresem benne a hibát de még nem sikerült ráakadnom. Ebbe szeretnék egy kis segítséget kérni. Hátha így előbb megvan a hiba.

http://pastebin.com/BPQbqdGz

A segítséget előre is köszönöm.

Tanacsot tudok adni, merre lenne erdemes elindulnod. Alakits ki egy kornyezetet amiben tudod debuggolni az ablak kezelot. Mondjuk Xnest jut eszembe amiben tudod futtatni az ablakkezelot ugy hogy a grafikus kornyezet is hasznalhato marad. Futtastd az ablakezelot gdb-vel. Tegyel break pontot az ablakmozgatas esemeny kezelojere. Lepj keresztul a fugvenyen gdb-vel. Ha valami nem ugy mukodik ahogy varod forumon kerdezz utana. Ha bemasolsz 5 sor C-t azzal hogy a 3.dik soron mert lep ki, tobb segitseget fogsz kapni mint igy