Fensterverwaltung

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Gibt es irgendeine Möglichkeit über python Fenster zu verwalten?
Ich meine damit genau genommen, alle Fenster auflisten, minimieren und maximieren.
Also nicht die Fenster von einem Python Programm, sondern von dem System die nichts direkt mit python zu tun haben.
Falls das funktioniert würde ich versuchen eine Art Taskleiste oder panel (oder wie man es auch immer nennen mag) zu programmieren.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Pygoscelis papua
Der i3 window manager bietet die Möglichkeit, das Verhalten "von außen" zu beeinflussen. Inwieweit das mit anderen window managern möglich ist, weiß ich nicht.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

ok das ist cool, den benutze ich sogar teilweise, muss ich mir genauer ansehen.
Aber es gibt doch auch docks und so, die die fenster anzeigen
bei anderen wms oder liege ich da falsch?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Pygoscelis papua
Um beim i3wm zu bleiben: Die Statusbar, die Dir neben den offenen workspaces weitere Infos wie Netzwerk, CPU, Zeit… anzeigt ist auch ein eigenständiges Programm, das sich neben Systeminformationen eben auch Informationen vom i3wm holt und daraus dann die Statusbar erstellt.

Und ob so eine Anwendung nun Statusbar, Dock, Panel oder wie auch immer heißt, ist ja wurschd. Wenn Du also via dem i3 IPC Interface, dem i3bar protocol (nichts anderes als json) und vom X Server die nötigen Schnittstellen bedienen kannst, sollte eine solche Anwendung machbar sein.

Bleibt natürlich noch die Frage: Warum willst Du das machen? Bringt nicht so gut wie jeder window manager eine solche Anwendung mit?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

die Frage bleibt, ob das nur für i3 geht oder auch z.B. für kwin etc.
Dann könnte ich mir eine eigene auf mich eingepasste Oberfläche erstellen, was total genial wäre.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ich meine z.B. lxqt kann man mit allen wms verwenden, und das gleiche panel für alle. so muss es doch irgendwas geben, womit man alle wms ansprechen kann oder?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Pygoscelis papua
Wenn es "nur" darum geht, geöffnete Programme zu verwalten, lässt sich das sicher über den X Server direkt kommunizieren und eine solche Anwendung kann dann auch unter jedem wm, der auf X aufbaut, eingesetzt werden. Für spezielle Sachen wie i3 workspaces oder container und gerade auch Eigenheiten von tiling window managern muss IMHO schon auf die API's des jeweiligen wm zurückgegriffen werden.

Wobei ich ab jetzt nicht mehr sicher bin, ob Python für Dein Vorhaben die erste Wahl ist oder Du nicht besser auf eine systemnähere Sprache wie C setzen solltest…

Könnte vielleicht auch mal jemand was sagen, der mehr Ahnung als ich hat? :mrgreen:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

die frage war nicht nach i3, i3 habe ich nur kurz erwähnt. es geht lediglich um minimieren, maximieren, schließen von Fenstern über befehle.
Bzw. laufende anwendungen auflisten. Wenn jemand meint das es etwas besseres unter c gibt, gerne kann ich auch.
(aber dann bitte nicht einfach soetwas wie blackbox durchlesen. Habe ich schon versucht und irgendwie keinen anfang gefunden.)
hier noch ein link den ich gefunden habe: http://pywm.sourceforge.net
scheint aber schon sehr veraltet zu sein (python 2.2.1 oder höher steht in der readme)

Aber eigentlich wollte ich keinen wm programmieren, sondern einfach nur ein widget um fenster zu minimieren und zu schließen.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Den Link zur Wikipedia-Seite X-Server hast Du ja schon. Schnapp Dir eine Python Anbindung um mit dem zu sprechen (gibt's für `xlib` und `libxcb`).
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Und gibts dazu irgendnen tutorial (zu xlib und libxcb)?
Oder wo kann ich fragen wenn ich nicht weiterkomme?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Manchmal, in ganz seltenen Fällen, haben Projekte und Bibliotheken Webseiten. Die von libxcb ist beispielsweise hier: https://xcb.freedesktop.org/

Ansonsten ist das X-Server-Protokoll ja auch nicht mehr das allerneueste. Es würde mich sehr wundern wenn es dazu keine Literatur, Tutorials, etc. gibt.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Das ist nicht das Problem. Ich habe tutorials gefunden, aber sie scheinen nur auf das erstellen von Fenstern einzugehen. Es sind einfach zu viele tutorials.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Pygoscelis papua
Irgendwann muss man halt einfach mal irgendwo beginnen… Die xcb Seite hat Dir BlackJack ja schon verlinkt, daneben würde ich einfach mal so Sachen wie 'python xlib minimize window' suchen. Auch wenn da natürlich nicht immer gleich exakt das kommt, was man selbst gerade machen möchte bekommt man über das Lesen von Codebeispielen anderer Leute einfach schon mal ein Gefühl dafür, wie etwas ausschauen kann. Und dann würde ich mir Gedanken darüber machen, mit was ich mich sinnigerweise als erstes beschäftige. Sowas wie z. B. wie erhalte ich eine Übersicht aller geöffneten X-Anwendungen ('python xlib list open x windows')? Und so weiter und so weiter…

Rom wurde auch nicht an einem Tag erbaut! :twisted:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@Pygoscelis papua: Was mutetella sagt. Und das X-Server-Protokoll ist über Jahrzehnte gewachsen und recht „low level”. Eine Liste der laufenden X-Anwendungen ist da wohl eher nicht in zwei oder drei Zeilen zu haben, da muss man ein paar mehr Babyschritte gehen. Und es scheint mehr als einen Weg zu geben, denn man kann wohl sowohl die Windows alle durchgehen und schauen ob man ein Toplevel erwischt hat, aber für Fenstermanager gibt es auch Konventionen/Protokolle die diese Daten über X zur Verfügung stellen. Zum Beispiel Extended Window Manager Hints (EWMH). Fenstermanager die sich daran halten, legen am `root`-Fenster (also der Desktophintergrund) eine `_NET_CLIENT_LIST`-Property an, die man nach den Fenstern befragen kann. Der Abschnitt „Pagers and Taskbars” ist für Dich wahrscheinlich interessant. EWMH baut seinerseits auf dem „Inter-Client Communication Conventions Manual” (ICCCM) auf. Das wiederum die X-Architektur benutzt. Man muss sich da durch einen Haufen geschichteter Spezifikationen durcharbeiten.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Vielen Dank ich bin schon ein Stück weiter gekommen.
Ich habe jetzt ewmh und python3-xlib installiert und wie es aussieht schon die wichtigsten dinge gefunden.

Code: Alles auswählen

import ewmh
EWMH = ewmh.ewmh.EWMH()
win_list = EWMH.getClientList()
for win in win_list:
    print(win)
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Da ist ein `ewmh` zu viel. `ewmh = ewmh.EWMH()` reicht.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

ok ich habe mein programm jetzt etwas geändert:

Code: Alles auswählen

#!/usr/bin/python3
from ewmh import EWMH
EWMH = EWMH()

win_list = EWMH.getClientList()
print('WINDOWS:')
for win in win_list:
    #name = win.get_wm_name()
    real_name = win.get_wm_class()[1]
    window_type = list(map(EWMH._getAtomName, EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)))[0]
    print(real_name, window_type)
        
print('ACTIVE WINDOW:')
win = EWMH.getActiveWindow()
EWMH.setWmState(win, 2, '_NET_WM_STATE_HIDDEN')

window_type = list(map(EWMH._getAtomName, EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)))[0]
print(win.get_wm_class()[1], window_type)

EWMH.display.flush()

print('DESKTOPS:')
print(EWMH.getNumberOfDesktops())
EWMH.setNumberOfDesktops(4)
EWMH.display.flush()
Aber ich verstehe nicht wieso das "ActiveWindow" nicht minimiert wird (Z.15:

Code: Alles auswählen

EWMH.setWmState(win, 2, '_NET_WM_STATE_HIDDEN')
)
wenn ich statt dessen schreibe

Code: Alles auswählen

EWMH.setWmState(win, 2, '_NET_WM_STATE_FULLSCREEN')
geht das fenster in den FULLSCREEN modus

Damit sich keiner wundert: das hier

Code: Alles auswählen

window_type = list(map(EWMH._getAtomName, EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)))[0]
habe ich so geschrieben, weil es dort glaube ich einen Fehler in der Bibliothek gibt. Ich habe diesen schon auf GitHub gemeldet.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Also ich wundere mich trotzdem über die `window_type`-Zeile. Warum ``EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)``? Das liefert bei mir das gleiche Ergebnis wie die offizielle API ``EWMH.getWmWindowType(win)``. Und warum wendest Du mit `list()` und `map()` die `_getAtomName()`-Methode auf die Sequenz an, wenn Du am Ende dann doch nur das erste Element haben willst? ``EWMH._getAtomName(EWMH.getWmWindowType(win)[0])`` wäre da kürzer, benutzt weniger nicht-öffentliche Aufrufe, und ist direkter.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Das problem liegt ja fenau in der Funktion EWMH.getWmWindowType()
mit dem andern hatest du recht. ist wahrscheinlich etwas spät geworden beim Programmieren gestern.
Änderung:

Code: Alles auswählen

window_type = EWMH._getAtomName(EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)[0])


Aber das war auch nicht mein problem.
Das Problem war, dass sich das Fenster nicht minimiert.
trotzdem danke.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Was für einen Fehler hat denn Deine `getWmWindowType()`-Methode? Bei mir funktioniert die ohne das zweite Argument problemlos. Nur wenn ich da `True` übergebe und die Namen als Zeichenketten haben möchte, dann gibt es da das Problem das ein Wert an den Namen `types` gebunden wird, aber zwei Zeilen später versucht wird darauf als `wtypes` zuzugreifen → `NameError`. Kann man hier sehr schön sehen, sind ja nur ein paar Zeilen: https://github.com/parkouss/pyewmh/blob ... mh.py#L271
Antworten