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.
Fensterverwaltung
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
@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.
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 )
-
- 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?
Aber es gibt doch auch docks und so, die die fenster anzeigen
bei anderen wms oder liege ich da falsch?
@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?
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 )
-
- 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.
Dann könnte ich mir eine eigene auf mich eingepasste Oberfläche erstellen, was total genial wäre.
-
- 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?
@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?
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?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
-
- 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.
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.
@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`).
-
- 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?
Oder wo kann ich fragen wenn ich nicht weiterkomme?
@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.
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.
-
- 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.
@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!
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!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@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.
-
- 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.
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)
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
ok ich habe mein programm jetzt etwas geändert:
Aber ich verstehe nicht wieso das "ActiveWindow" nicht minimiert wird (Z.15:
)
wenn ich statt dessen schreibe
geht das fenster in den FULLSCREEN modus
Damit sich keiner wundert: das hier habe ich so geschrieben, weil es dort glaube ich einen Fehler in der Bibliothek gibt. Ich habe diesen schon auf GitHub gemeldet.
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()
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')
Damit sich keiner wundert: das hier
Code: Alles auswählen
window_type = list(map(EWMH._getAtomName, EWMH._getProperty('_NET_WM_WINDOW_TYPE', win)))[0]
@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.
-
- 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:
Aber das war auch nicht mein problem.
Das Problem war, dass sich das Fenster nicht minimiert.
trotzdem danke.
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.
@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