Etwas im Bitformat an den X-Server senden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hallo!

Ich setze mich derzeit mit dem Modul python-xlib auseinander.

Nachdem ich schon ein paar Sachen hinbekommen habe (Titel und ID's offener Fenster abfragen, eingestellte Bildschirmauflösung ermitteln), möchte in nun die Größe bestehender Fenster ändern.

Das besagte Modul bringt zwar die Funktion configure() mit. Wenn ich diese jedoch benutze, bleibt die Größe des angesprochenen Fensters die alte und es kommt auch keine Fehlermeldung.

Daher versuche ich nun, eigene Events zu implementieren und diese zu senden. Ein Beispiel in Python-Code findet sich hier und die Doku für mein gewünschtes Event dort.

Was ich nun nicht verstehe: Es muss ja offenbar ein einzelner String gesendet werden, der alle Attribute zur Veränderung des Fensters an der dafür vorgegebenen Stelle enthalten soll. So bestimmen die Bits 8-11 z.B. die Werte für x, y, Breite und Höhe. Was ist aber nun, wenn x = 20 wäre? Dann nimmt es doch schon das nächste Bit, welches eigentlich für y reserviert ist, ein. Oder nicht?

Wie kann ich also mehrstellige Werte in einem Bit ausdrücken?
madfrog
User
Beiträge: 19
Registriert: Montag 19. Januar 2009, 01:56

Hi, kenne die xlib selber nicht. Habe mir aber eben die von dir verlinkte Seite angeschaut. Es heißt
The bits 8 to 11 indicate the presence of x, y, width and height.
Also die bits 8 bis 11 beinhalten nicht die Koordinaten, sondern zeigen nur an, daß du die Daten innerhalb einer Datenstruktur mitschickst. Im Klartext:

Bits -> 8 9 10 11
Wert-> 1 1 0 0 -> ich schicke dir x,y Koordinaten mit. Verarbeite sie bitte. Es sind also flags! Die Koordinaten schickst du, so wie es mir auf den ersten Blick erscheint in
data.l[1] = x
data.l[2] = y
data.l[3] = width
data.l[4] = height
mit.


Ich würd vielleicht sowas mal probieren:

Code: Alles auswählen

#===============================================================================
# Bitmasks
#===============================================================================
BIT08     = 0x0100 # 00000001 00000000 --- sets new x
BIT09     = 0x0200 # 00000010 00000000 --- sets new y
BIT10     = 0x0400 # 00000100 00000000 --- sets new width
BIT11     = 0x0800 # 00001000 00000000 --- sets new height
BIT12     = 0x1000 # 00010000 00000000 --- sends request to app window

flags = BIT08|BIT09|BIT12 # uses standard gravity and sets new
                          # x,y-coords, sends request to an app window
newX = 200 # new x coord
newY = 100 # new y coord

cm_event = Xlib.protocol.event.ClientMessage(
    window = dest,
    message_type = _NET_MOVERESIZE_WINDOW,
    data = (flags, newX, newY))

dest.send_event(cm_event)
Vielleicht hilfts ja.
Zuletzt geändert von madfrog am Donnerstag 22. Januar 2009, 13:08, insgesamt 1-mal geändert.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Bits sind ja auch nur 0 oder 1, selbst 2 könnte man nicht in einem Bit ausdrücken.
Zu deinem Problem: Wie schon im Ubuntuusers-Forum gesagt, musst du bei der Xlib oft 'flush'en, das heißt die gespeicherten Requests senden. Das geht mit Display.flush. Das heißt, viele Requests werden nicht sofort an den Server gesendet, sondern (soweit ich das verstanden habe) erst, wenn nach einem Event 'gefragt' wird. Wenn du in der App also beispielsweise nie nach Events fragst, musst du explizit flushen. Hier ist da noch was kurzes dazu ;)

Auch wenn es mit der python-xlib eigentlich nicht nötig sein sollte, auf dieser niedrigen Ebene zu arbeiten: das X-Protokoll wird z.B. hier festgelegt ('The Core X Protocol').

Gruß,

Fred

Edit: Oh, ich seh grad, ich hab das Thema ein bisschen verfehlt. Sorry, ich lass das trotzdem mal hier so stehen :D
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Danke für die Hilfe. Es lag zum Glück wirklich nur am nicht erfolgten flush(). Entschuldigung, dass sich das jetzt ein bißchen mit dem UU-Thread überschnitten hatte...
Antworten