Fensterverwaltung
-
- 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
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
ja den Fehler meine ich. Ich habe die Funktion einfach nur aus dem Quelltext abgeschrieben, das war wahrscheinlich das Problem.
Ich hatte irgendwie vorher da mal True verwendet, deshalb habe ich nicht dran gedacht, dass das ja so gehen müsste. also doch
Gut.
Aber für mein Problem mit dem minimieren habe ich noch keine wirkliche Lösung gefunden.
ich habe etwas von der funktion 'XIconifyWindow' gelesen, habe sie aber bis jetzt nicht finden können.
Aber das mit dem setState... müsste doch eigentlich gehen, oder was habe ich falsch gemacht?
Ich hatte irgendwie vorher da mal True verwendet, deshalb habe ich nicht dran gedacht, dass das ja so gehen müsste. also doch
Code: Alles auswählen
window_type = EWMH._getAtomName(EWMH.getWmWindowType(win)[0])
Aber für mein Problem mit dem minimieren habe ich noch keine wirkliche Lösung gefunden.
ich habe etwas von der funktion 'XIconifyWindow' gelesen, habe sie aber bis jetzt nicht finden können.
Aber das mit dem setState... müsste doch eigentlich gehen, oder was habe ich falsch gemacht?
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
ist das hier hilfreich?
Wi minimiert man das fenster dann?
Kann ich dafür eventuell '_NET_WM_ACTION_MINIMIZE' verwenden?
Ich habe irgendwie nicht gefunden, wie man diese ACTIONS verwenden kann.
Da steht doch, das '_NET_WM_STATE_HIDDEN' ignoriert wird, wenn ich das recht verstehe._NET_WM_STATE_HIDDEN should be set by the Window Manager to indicate that a window would not be visible on the screen if its desktop/viewport were active and its coordinates were within the screen bounds. The canonical example is that minimized windows should be in the _NET_WM_STATE_HIDDEN state. Pagers and similar applications should use _NET_WM_STATE_HIDDEN instead of WM_STATE to decide whether to display a window in miniature representations of the windows on a desktop.
Implementation note: if an Application asks to toggle _NET_WM_STATE_HIDDEN the Window Manager should probably just ignore the request, since _NET_WM_STATE_HIDDEN is a function of some other aspect of the window such as minimization, rather than an independent state.
Wi minimiert man das fenster dann?
Kann ich dafür eventuell '_NET_WM_ACTION_MINIMIZE' verwenden?
Ich habe irgendwie nicht gefunden, wie man diese ACTIONS verwenden kann.
@Pygoscelis papua: Etwas weiter oben, im ersten Absatz des Abschnitts _NET_WM_STATE, aus dem Du zitierst, steht folgendes:
Wobei das `setWmState()` eigentlich machen sollte. Schau mal die Signatur: `setWmState(win, action, state, state2=0)`. Das zweite Argument heisst `action`. Nun rate mal wo man die *ACTION*-Konstanten verwenden kann.A Client wishing to change the state of a window MUST send a _NET_WM_STATE client message to the root window (see below).
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
??? Ich glaub ich bin einfach zu dumm dafür.
Wenn ich dort '_NET_WM_ACTION_MINIMIZE' einsetze was nehme ich dann als state?
etwa so:
Ich möchte ja einfach nur, dass das Fenster minimiert wird. wie würdest du es den schreiben?
Da wird mir ausgegeben wie erwartet:
Aber da steht doch
Wenn ich dort '_NET_WM_ACTION_MINIMIZE' einsetze was nehme ich dann als state?
etwa so:
Code: Alles auswählen
EWMH.setWmState(win, '_NET_WM_ACTION_MINIMIZE', '_NET_WM_STATE_HIDDEN')
Da wird mir ausgegeben wie erwartet:
Code: Alles auswählen
TypeError: an integer is required (got type str)
if an Application asks to toggle _NET_WM_STATE_HIDDEN the Window Manager should probably just ignore the request, since _NET_WM_STATE_HIDDEN is a function of some other aspect of the window such as minimization, rather than an independent state.
@Pygoscelis papua: Okay, als `state` nimmst Du die *_ACTION_* (nicht sehr intuitiv ) und als `action` musst Du 0, 1, oder 2 angeben. Deswegen die Fehlermeldung das ein `int` erwartet wird. Die Zahlen stehen dafür ob Du das löschen, setzen, oder toggeln willst.
Edit: Und wahrscheinlich doch nicht die *_ACTION_* sondern die entsprechende *_STATE_* als `state`.
Edit: Und wahrscheinlich doch nicht die *_ACTION_* sondern die entsprechende *_STATE_* als `state`.
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
Ich habe das Programm jetzt mal auf das nötigste begrenzt, es geht aber immer noch nicht.
Also irgendwas muss es da doch geben.
Edit:
Ich habe das hier gefunden, aber ich glaube es geht nur für gnome/gtk ich habe es noch nicht testen können.
http://unix.stackexchange.com/questions ... the-others
Code: Alles auswählen
from ewmh import EWMH
EWMH = EWMH()
win = EWMH.getActiveWindow()
EWMH.setWmState(win, 2, '_NET_WM_ACTION_MINIMIZE')
EWMH.display.flush()
Edit:
Ich habe das hier gefunden, aber ich glaube es geht nur für gnome/gtk ich habe es noch nicht testen können.
http://unix.stackexchange.com/questions ... the-others
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
Ich glaube ich versuche das ganze erst mal in C und dann versuche ich es in Python zu integrieren.
Vielleicht erstelle ich dann einfache eine shared-libary und binde sie über ctypes ein.
Vielleicht erstelle ich dann einfache eine shared-libary und binde sie über ctypes ein.