Intrensics

Post Reply
Message
Author
grisu1972
Posts: 16
Joined: 22. Jul 2008 11:03

Intrensics

#1 Post by grisu1972 »

Hallo Leute,

ich möchte eine X Anwendung die auf Intrinsics aufbaut wemm sie das Signal SIGUSR2 bekommt in den Vordergrund bekommen.
Das Signal habe ich abgefangen, aber ich bin absoluter Anfänger bzg. intrinsics!

Wenn ich es richtig verstanden habe muß ich mittels eines Xevent an den XServer eine Botschaft schicken, der XServer schickt dann eine Nachricht an alle Applikationen unter anderen meine die das Signal Expose bekommt und in den Vordergrund kommt!

Ist das vom Konzept richtig?
Und wenn ja, wie realsiere ich das?

Kann mir jemand helfen?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Das hast du falsch verstanden.

"Expose" ist ein Event, den eine Anwendung zugestellt bekommt, wenn ihr Fenster aus der kompletten Verdeckung heraustritt, also zumindest 1 Pixel des Fensters sichtbar ist. Normalerweise schickt der Windowmanager dieses Event.

Die Anwendung kann das Expose-Event nutzen, um erst in diesem Moment den Fensterinhalt neu zu zeichnen. Das zu tun, wenn er eh nicht sichtbar ist, wäre ja Unsinn.

Wenn du ein Fenster ganz nach oben schieben willst, musst du dem Windowmanager eine Nachricht schicken. *Der* ändert dann die Stacking order, wenn der Benutzer das so möchte. Es gibt auch Windowmanager, die nur Tiles benutzen, also nie irgendein Fenster verdecken.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

grisu1972
Posts: 16
Joined: 22. Jul 2008 11:03

#3 Post by grisu1972 »

Hallo Janka,

das Problem ergibt sich daraus, das diese Applikation beim Start überprüft ob es schon eine Instanz gibt. Ist dies der Fall wir an die ältere Applikation ein SIGUSR2 geschickt und die neue Applikation beendet sich!
Wenn die Applikation ein SIGUSR2 bekommt soll sie in den Vordergrund popen!
Dazu möchte ich das Expose Signal verwenden.
Die Vorgehensweise wäre wiefolgt:
1. DIe Applikation erhält ein SIGUSR2
2. Die Appl. sendet ein Expose Signal an den XServer
3. Der XServer organisiert die Fenster neu und meine Appl. ist in den Vordergrund gepopt

Dazu meine Fragen:
Ist das Vorgehen so richtig, du schreibts das dies über den Window Manager gehn muss, wo ist mein Denkfehler?
Zu meiner Vorgehnsweise:Muss das Expose Signal muss mittels xevent geschickt werden, und wenn wie?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

Du hast meinen Kommentar nicht richtig gelesen. Der Expose-Event ist ein Event, den deine Applikation
*bekommt*, wenn sie eins ihrer Fenster neu zeichnen soll.
"Expose" heißt nur "Expose", nicht "Raise".
Es gibt weiterhin kein "Expose-Signal". Richtige Termini beachten!

Die Reihenfolge der Fenster im Fensterstapel kannst du mit XCirculateSubwindows() und XRaiseWindow() vorschlagen.
Der Windowmanager muss sich nicht daran halten. Es gibt keine Möglichkeit, die Reihenfolge zu erzwingen (außer mit OverrideRedirect, aber dann werden dich deine Benutzer *hassen*). Die meisten Windowmanager werden sich aber an Vorschläge halten.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

grisu1972
Posts: 16
Joined: 22. Jul 2008 11:03

#5 Post by grisu1972 »

Hallo Janka,

Danke für die Hilfe und den letztendlich zielführenden Tip:

Benutzt habe ich folgendes:

void receiveSIGUSR2(int sig)
{
XMapRaised(g_display, g_window);
XFlush(display);
}


Wichtig ist das XFlush(), ohne das es nicht funktioniert (hat mich 1 Stunde gekostet)!

Danke und Gruß



Neinnnnn
es kappt noch nicht ganz, es wir angezeigt wenn es minimiert wurde aber nicht wenn es im Hintergrund ist, muss noch malk forschen!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#6 Post by Janka »

XMapRaised() ändert Fenster, die bereits gemappt sind nicht. Logisch, oder?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

grisu1972
Posts: 16
Joined: 22. Jul 2008 11:03

#7 Post by grisu1972 »

Das Fenster popt auf wenn es minimiert ist. Es popt aber nicht in den Vordergrund. Das möchte ich aber haben. Mit XCirculateSubwindows() kann man die Fenster einer Applikation organisieren.
Was ich such ist ein "raiseToTop"?

grisu1972
Posts: 16
Joined: 22. Jul 2008 11:03

#8 Post by grisu1972 »

Ahhh ich bin wissend (naja, ein bisschen zumindest!)!

Es sind zwei Schritte notwendig:
1. dafür sorgen das die Appl. nicht minimiert ist
2. die Appl. in der stacking order nach vorne bringen

void receiveSIGUSR2(int sig)
{
Window tmpWin = XtWindowOfObject(widgetParent);

XMapWindow(display, tmpWin);
XMapRaised(display, tmpWin);
XFlush(display);

XWindowChanges werte;
werte.stack_mode = Above;
XReconfigureWMWindow(display, tmpWin, DefaultScreen(display), CWStackMode, &werte);
}


Anmerkung:
Unter KDE wird die Applikation nicht in den Vordergrund gebracht sondern in der Taskleiste blinkt sie. Das Zielsystem benutz den mwm und dort funktioniert es!

Danke an Janka!

Post Reply