Fensterverwaltung

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
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
Pygoscelis papua
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

Code: Alles auswählen

window_type = EWMH._getAtomName(EWMH.getWmWindowType(win)[0])
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?
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

ist das hier hilfreich?
_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.
Da steht doch, das '_NET_WM_STATE_HIDDEN' ignoriert wird, wenn ich das recht verstehe.
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.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Etwas weiter oben, im ersten Absatz des Abschnitts _NET_WM_STATE, aus dem Du zitierst, steht folgendes:
A Client wishing to change the state of a window MUST send a _NET_WM_STATE client message to the root window (see below).
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. ;-)
Pygoscelis papua
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:

Code: Alles auswählen

EWMH.setWmState(win, '_NET_WM_ACTION_MINIMIZE', '_NET_WM_STATE_HIDDEN')
Ich möchte ja einfach nur, dass das Fenster minimiert wird. wie würdest du es den schreiben?
Da wird mir ausgegeben wie erwartet:

Code: Alles auswählen

TypeError: an integer is required (got type str)
Aber da steht doch
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.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@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`. :oops:
Pygoscelis papua
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.

Code: Alles auswählen

from ewmh import EWMH
EWMH = EWMH()
win = EWMH.getActiveWindow()
EWMH.setWmState(win, 2, '_NET_WM_ACTION_MINIMIZE')
EWMH.display.flush()
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
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 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.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Antworten