Ablakváltás

 ( stage81 | 2006. április 25., kedd - 15:36 )

Sziasztok!

A kérdésem a következő lenne... Hogy lehet tudatni az ablakkezelővel, hogy ablakot szeretnék váltani? Kérlek, ne gyors billentyűt mondjatok (alapértelmezésben ALT+TAB), hanem valamilyen beépített programocskát (mint mondjuk a chvt, ami konzolt vált)

A válaszokat előre is köszönöm!
Üdv.: S81

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ennek mi koze a C/C++ -hoz?

Milyen ablakkezelo? Mire gondolsz "ablakvaltas" alatt? Le akarod cserelni a Windows-t? ;-)

Zsiraf

p.s.: BTW "konzolt" nem valt semmi, mert konzolbol csak egy van :-) a chvt virtualis terminalt "valt" (change foreground virtual terminal).

:-D Nem windows cserére gondolok (Már az megvolt).

Bocsi a pontatlan fogalmazásért... Ablak váltás alatt az aktuális ablak (amelyiken a fókusz van) változtatását értem, mint pl amikor KDE alatt megnyomod az ALT + TAB -ot.
A C/C++ témakörbe azért raktam (igaz ezt nem írtam), mert mindezt szeretném szoftverből végrehajtani (mármint az ablakváltást ;-) ).

ICCCM - ha van valami szabvanyos dolog, akkor azt itt talalod, vagy kenytelen vagy atnezni annak a specialis "ablakkezelonek" a feature-jeit amire meg akarod irni...

http://tronche.com/gui/x/icccm/

vagy google://icccm

Zsiraf

Tök jó, kár hogy nem értek belőle semmit :-(
Na jó, az értékeket "felismerem", de dunsztom sincs, hogy minek-hogyan kell ezeket átadni

Minden esetre köszi, hogy megpróbáltál segíteni

Üdv.: S81

No, hogy egy kicsit elkeseritselek... Az ablakkezeles, az az ablakkezelo dolga... Az ICCCM-ben megprobaljak szabalyozni, hogy milyen minimal faturekat kene tudnia egy ablakkezelonek. Az input focus kiosztasa a WM dolga. Altalaban a segitseget ehhez a WM a felhasznalotol varja, nem programtol. Van egy ket bevett jatek, pl. a Windows-tol elteroen a legtobb WM lehetoseget biztosit arra, hogy mindig az egerkurzor alatti Window kapja meg a focus-t (mar ha igenyt tart ra)... Vagy pl. egy listabol kivalaszd azt az "ablakot" amire szeretnel valtani...

Az, hogy a WM feje folott bele turkalj nem nagyon jo, meg talan nem is sok ertelme van, mert a WM valoszinuleg az elso adando alkalommal visszaveszi az iranyitast (abban a hiszemben, hogy o a korlatlan ur a Windows Management teruleten ;-), igy ha ertelmesen lehet, akkor valoszinu, hogy valamit kene az ICCCM-ben arrol talalnod, hogy A kliens kerheti-e a WM-et, hogy B,C,... kliens-e legyen az input focus (en ketlem, hogy lenne ilyen...).

Az mar mas kerdes, hogy maga a WM hagy-e beleszolast "kulso" programtol abba, hogy o kinek osztja az input focus-t... Szerintem ez se nagyon valoszinu... De, meg kell nezni az adott WM-et.

Zsiraf

ha a wm-et tudod szkriptelni, akkor úgy kell csinálni. nézd meg a wm-ed (vagy a de wm-jének) manual-ját.

Megint eljutunk odaig, hogy de min keresztul szeretned ezt veghezvinni. Mert ugye Xlib hasznalataval ott a rise es a lower, amivel a window stacken tudod mozgatni az ablakokat. Persze ehhez le kell kerdezned, hogy melyik wint is akarod mozgatni. De erre meg ugye ott a XQueryTree() . Szoval ha Xlib.
Aztan gondolom, hogy magasabb szinten egyes widgetset-ekben konnyebben is meg lehet oldani, mittom en strukturakban taroljak a listat stb.

Ajanlott olvasmany:
http://users.actcom.co.il/~choo/lupg/tutorials/xlib-programming/xlib-programming.html
persze ha Xlib-en keresztul akarod megoldani.

Igen, erre szoktam néha írni, hogy input, input, még input!

Mert a kérdés így csak lóg a levegőben...

ott a rise es a lower

:-) talan raise...de ez most hogy jon ide?

Baratunk az "aktiv" ablakot szeretne kijelolni, s ennek messze nincs koze (legalabbis X alatt) a window stack-en elfoglalt hellyel, ezt inkabb az input focus hatarozza meg...

Zsiraf

p.s.: amugy stage81, talan ezt nezd meg: http://tronche.com/gui/x/xlib/input/XSetInputFocus.html

p.s2: de szerintem meg mindig alapveto problema, hogy az input focus mozgatasa a WM terulete es a ket dudas egy csardaban mindig problemakat okozott...

p.s3: a fenti manualbol:

12.5 Controlling Input Focus
Xlib provides functions that you can use to set and get the input focus. The input focus is a shared resource, and cooperation among clients is required for correct interaction. See the Inter-Client Communication Conventions Manual for input focus policy.

To set the input focus, use XSetInputFocus().

To obtain the current input focus, use XGetInputFocus(). 

Köszönöm az összes hozzászólást!
Volt pár félreértés, amit szeretnék tisztázni... Én nem a WM-et akarom felülbírálni, hanem megkérni, hogy az adott ablakra fókuszáljon. Hogy egy kicsit pontosítsam a problémám, leírom a konkrét feladatot:
Van egy QWidgetem (Qt alatt "berhelek"), mely a system parancssal behív egy böngészőt. Hogy a böngésző látszódjon, a QWidgetet leteszem tálcára. Ha a program állapota megváltozik, akkor a QWidgetet szeretném ismét előtérbe hozni. Sajnos ez nem meg. Tudom, hogy a QWidgetnek vannak saját fókuszálási slotjai, viszont ezek csak a saját programon belül oldják meg az ablakkezelést. (Ha más alkalmazás is fut, és az van fókuszban, akkor a Qt ablakváltó mechanizmusait sutba dobhatom). Ami ilyenkor működik, az az ellenörzés, hogy az adott widget fókuszban van-e (isActiveWindow()).
Ennyit a problémámról. Akkor ha jól értem, érdemes átnézegetni az Xlibet, hogy milyen utasításokat engedélyez.

Mégegyszer köszi mindent!
Stage 81

No, ha mar tisztaztad a dolgot, akkor nezzuk: gondolom KDE alatt dolgozol (habar ezt meg mindig nem arultad el :-)... Igy semmi esetre se az Xlib-et nezegesd, ugyanis elso korben a problemad nem raise/lower ill. input-focus kategoriaba esik, hanem a KDE "talcaval" kapcsolatos szolgaltatasait kene alaposan atnezned...

Zsiraf

p.s.: talan ebbol is latszik, hogy erdemes az elejen tisztazni az erdekes reszeket, s ennek fenyeben kerdezni ;-)

Azt elfeledtem :-) Igen, KDE alá dolgozok.
Esetleg nincs valami tipped, hogy hol találom a tálca kezelő részt KDE-ben? (Kicsit hosszú lenne, míg átnyálaznám az egész forrását + nem biztos hogy túl sok mindent megértenék belőle)

Ezeket már próbálgattam, igaz nem KWinnel, hanem QWidgettel (QApplication -t használok). Az eredmény cáfolható... Ha a program több ablakból állna, akkor valószínűleg jól működne mondjuk a setActiveWindow, viszont itt több egymástól független programablak között kellene váltani.
Megjegyzésként viszont megemlíteném, hogy az isActivWindow() úgy működik, ahogy elvárja tőle az ember.
Minden esetre próbálkozok még a qapplication -nal is, hátha találok valami "használhatót".

dcop-on keresztül nem lehet aktiválni a win-t?

dcop-ot nem ismerem... Tudnál róla valamit még mondani?

DCOP stands for Desktop COmmunications Protocol, IPC stands for Inter-Process Communication; RPC stands for Remote Procedure Call. In essence, they are means by which two programs can communicate, whether on the same machine or across a network. In this regard, DCOP is similar to Microsoft's OLE Automation: it provides a simple way for developers to provide access to the functions available in an application.

Ahogy én tudom, minden progi, ami elindul regisztárlja magát és a kopmonenseit a DCOP szerveren, amik azután programból, vagy parancssorból elérhetőek, pl hogy éppen mit játszik az amarok:
dcop amarok player 'nowPlaying()'

Guglin elég sok mindent lehet találni. Meg a kdeveloper-en is. Valahogy le is tudod kérdezni az alkalmazás összes objektumát és azok függvényeit, hogy használni tudd. Egyzser játszottam vele, de már nem emlékszem.

Megvan! Beírod dcop. Kilistázza, mi van beregisztárlva. Utána dcop [appnév], erre kilistázza az objektumokat. Utána dcop [appnév] [objektum] erre kilistázza a függvényeket, amiket használhatsz.
pl a dcop kmix Mixer0 kimenete között van ilyen:
void setVolume(int deviceidx,int percentage) vagy int masterVolume().
Ez utóbbi visszaadja a százalékot: dcop kmix Mixer0 masterVolume (kimenet nálam 65).

Ez kegyetlen joo :-)
Egész este a dcop -pal játszottam. Nagyon tetszik :-) Sajna csak desktop váltást találtam benne, ablak váltást nem :-(
Esetleg még egyéb ötlet?