[pytyle et e17] : Échec dans l'utilisation de pytyle

Applications, problèmes de configuration réseau
niccoper
Hankyu
Messages : 28
Inscription : jeu. 09 avr. 2015, 17:04

[pytyle et e17] : Échec dans l'utilisation de pytyle

Message par niccoper »

Bonjour,

je suis en train d'installer et de configurer pour la première fois une Arch. J'ai choisi comme WM Enlightenment.

J'ai essaye d'installer pytyle sous enlightment (sur les dépôts de AUR, les version 1, 2 et 3). Cependant je ne n'arrive pas à le faire fonctionner, j'ai systématiquement des

J'ai copié/collé les messages d'erreurs. est-ce que quelqu'un aurait une idée de correction des problèmes .svp ? Par ailleurs, l'un(e) de vous sait-il si pytyle peut seulement fonctionner avec enlightenment ? Sinon connaissez vous un programme de tiling aussi ergonomie et pratique que pytyle svp ? J'ai essayé le tiling de enlightenment et tile-windows mais ils sont loins de me donner satisfaction svp ? J'ai fait des recherches tant pour les messages d'erreur que les alternatives à pytyle mais sans succès.

Merci de votre attention.

Message d'erreur des pytyle affiché lorsqu'ils sont lancés après l'installation

pytyle

Code : Tout sélectionner

$ pytyle
Xlib.protocol.request.QueryExtension
Le message s'affiche mais rien ne se passe

pytyle2

Code : Tout sélectionner

$ pytyle2 
Traceback (most recent call last):
  File "/usr/bin/pytyle2", line 27, in <module>
    import pt.state as state
  File "/usr/lib/python2.7/site-packages/pt/state.py", line 272, in <module>
    init()
  File "/usr/lib/python2.7/site-packages/pt/state.py", line 20, in init
    load_properties()
  File "/usr/lib/python2.7/site-packages/pt/state.py", line 109, in load_properties
    update_property(pname)
  File "/usr/lib/python2.7/site-packages/pt/state.py", line 155, in update_property
    m()
  File "/usr/lib/python2.7/site-packages/pt/state.py", line 199, in update_NET_CURRENT_DESKTOP
    properties['_NET_CURRENT_DESKTOP'] = ptxcb.XROOT.get_current_desktop()
  File "/usr/lib/python2.7/site-packages/pt/ptxcb/window.py", line 564, in get_current_desktop
    return self._get_property('_NET_CURRENT_DESKTOP')[0]
IndexError: list index out of range

pytyle3

Code : Tout sélectionner

$ pytyle3 
Enlightenment window manager is running...
Could not bind Control-Mod1-r
Could not bind Control-Mod1-s
Could not bind Control-Mod1-d
Could not bind Control-Mod1-f
Could not bind Control-Mod1-q
Traceback (most recent call last):
  File "/usr/bin/pytyle3", line 18, in <module>
    tile.update_tilers()
  File "/usr/lib/python2.7/site-packages/pt3/tile.py", line 97, in update_tilers
    for d in xrange(state.desk_num):
TypeError: an integer is required
niccoper
Hankyu
Messages : 28
Inscription : jeu. 09 avr. 2015, 17:04

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par niccoper »

up svp
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par FoolEcho »

Salut,

Vu que ces 3 paquets sont sur AUR... ... le premier (pytyle) est sans doute trop vieux. Problème de dépendances par rapport à la version de python sûrement d'une part, et de l'autre le code interne de pytyle doit aussi poser problème et c'est ce qui se retrouve vraisemblablement dans les version 2 et 3: /usr/lib/python2.7/site-packages/pt/state.py vient-il de pytyle2 ? si oui, il est plus que probable qu'il utilise la mauvaise version de python en entête ... et idem pour pytyle3 (pour résumer et peut-être solutionner: montre-nous le contenu du fichier /usr/lib/python2.7/site-packages/pt3/tile.py pour voir... s'il n'indique pas python2, c'est là le problème sans doute :chinois: )...
«The following statement is not true. The previous statement is true.» :nage:
niccoper
Hankyu
Messages : 28
Inscription : jeu. 09 avr. 2015, 17:04

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par niccoper »

Bonjour FoolEcho,

merci de t'intéresser à ton problème.

1 - /usr/lib/python2.7/site-packages/pt/state.py

J'ai réinstallé une version vierge de toute installation de pytyle/2/3. Avant de réinstaller ces paquets, je ne trouvait pas le fichier en question et après l'install des 3 versions de pytyle, ce fichier existait bien.

A tout hasard, je colle le contenu de ce fichier.

Code : Tout sélectionner

import time

import ptxcb

import config
from command import Command
from window import Window
from monitor import Monitor
from workspace import Workspace
from container import Container

_ACTIVE = None
pointer_grab = False
moving = False
properties = {}
xinerama = ptxcb.connection.xinerama_get_screens()

def init():
    reset_properties()
    load_properties()

def apply_config():
    Command.init()

    for mon in Workspace.iter_all_monitors():
        if config.get_option('tile_on_startup', mon.workspace.id, mon.id):
            mon.tile(force_tiling=True)

def get_active():
    global _ACTIVE

    return _ACTIVE

def get_active_monitor():
    wsid, mid = get_active_wsid_and_mid()

    return get_monitor(wsid, mid)

def get_active_wsid_and_mid():
    wsid = -1
    mid = -1
    win = get_active()

    if win and win.monitor and win.monitor.workspace:
        wsid = win.monitor.workspace.id
        mid = win.monitor.id
    else:
        wsid, mid = get_pointer_wsid_and_mid()

    return (wsid, mid)

def get_monitor(wsid, mid):
    return Workspace.WORKSPACES[wsid].get_monitor(mid)

def get_pointer_wsid_and_mid():
    wsid = -1
    mid = -1

    px, py = ptxcb.XROOT.get_pointer_position()
    wsid = properties['_NET_CURRENT_DESKTOP']

    for mon in Workspace.WORKSPACES[wsid].iter_monitors():
        if mon.contains(px, py):
            mid = mon.id
            break

    return wsid, mid

def iter_tilers(workspaces=None, monitors=None):
    if isinstance(workspaces, int):
        workspaces = [workspaces]

    if isinstance(monitors, int):
        monitors = [monitors]

    for wsid in Workspace.WORKSPACES:
        if workspaces is None or wsid in workspaces:
            for mon in Workspace.WORKSPACES[wsid].iter_monitors():
                if monitors is None or mon.id in monitors:
                    tiler = mon.get_tiler()

                    if tiler and tiler.tiling:
                        yield tiler

def iter_windows(workspaces=None, monitors=None):
    if isinstance(workspaces, int):
        workspaces = [workspaces]

    if isinstance(monitors, int):
        monitors = [monitors]

    for wsid in Workspace.WORKSPACES:
        if workspaces is None or wsid in workspaces:
            for mon in Workspace.WORKSPACES[wsid].iter_monitors():
                if monitors is None or mon.id in monitors:
                    for win in mon.iter_windows():
                        yield win

def load_properties():
    property_order = [
        '_NET_CURRENT_DESKTOP',
        '_NET_NUMBER_OF_DESKTOPS',
        '_NET_WORKAREA',
        '_NET_CLIENT_LIST',
        '_NET_ACTIVE_WINDOW',
    ]

    for pname in property_order:
        update_property(pname)

def print_hierarchy(workspaces=None, monitors=None):
    if isinstance(workspaces, int):
        workspaces = [workspaces]

    if isinstance(monitors, int):
        monitors = [monitors]

    for wsid in Workspace.WORKSPACES:
        if workspaces is None or wsid in workspaces:
            print Workspace.WORKSPACES[wsid]

            for mon in Workspace.WORKSPACES[wsid].iter_monitors():
                if monitors is None or mon.id in monitors:
                    print '\t%s' % mon

                    for win in mon.windows:
                        print '\t\t%s' % win

def reset_properties():
    global properties

    properties = {
        '_NET_ACTIVE_WINDOW': '',
        '_NET_CLIENT_LIST': set(),
        '_NET_WORKAREA': [],
        '_NET_NUMBER_OF_DESKTOPS': 0,
        '_NET_DESKTOP_GEOMETRY': {},
        '_NET_CURRENT_DESKTOP': -1,
    }

def set_active(wid):
    global _ACTIVE

    if wid in Window.WINDOWS:
        _ACTIVE = Window.WINDOWS[wid]
    else:
        _ACTIVE = None

def update_property(pname):
    mname = 'update%s' % pname
    gs = globals()

    if mname in gs:
        m = gs[mname]
        m()

def update_NET_ACTIVE_WINDOW():
    global properties

    active = ptxcb.XROOT.get_active_window()
    
    if not active:
        return

    set_active(active)

    properties['_NET_ACTIVE_WINDOW'] = get_active()

    active = get_active()
    if active and active.monitor:
        active.monitor.active = active

    Container.manage_focus(active)

def update_NET_CLIENT_LIST():
    global properties

    old = properties['_NET_CLIENT_LIST']
    new = set(ptxcb.XROOT.get_window_ids())

    properties['_NET_CLIENT_LIST'] = new

    if old != new:
        for wid in new.difference(old):
            Window.add(wid)

        for wid in old.difference(new):
            Window.remove(wid)

        # This might be redundant, but it's important to know
        # the new active window if the old one was destroyed
        # as soon as possible
        update_NET_ACTIVE_WINDOW()

def update_NET_CURRENT_DESKTOP():
    global properties

    old = properties['_NET_CURRENT_DESKTOP']
    properties['_NET_CURRENT_DESKTOP'] = ptxcb.XROOT.get_current_desktop()

    if old != properties['_NET_CURRENT_DESKTOP']:
        Container.active = None

        for tiler in iter_tilers(old):
            tiler.callback_hidden()

        for tiler in iter_tilers(properties['_NET_CURRENT_DESKTOP']):
            tiler.callback_visible()

def update_NET_WORKAREA():
    global properties

    properties['_NET_WORKAREA'] = ptxcb.XROOT.get_workarea()

    for mon in Workspace.iter_all_monitors():
        mon.calculate_workarea()

def update_NET_NUMBER_OF_DESKTOPS():
    global properties, xinerama

    old = properties['_NET_NUMBER_OF_DESKTOPS']
    properties['_NET_NUMBER_OF_DESKTOPS'] = ptxcb.XROOT.get_number_of_desktops()

    # Add destops...
    if old < properties['_NET_NUMBER_OF_DESKTOPS']:
        for wsid in xrange(old, properties['_NET_NUMBER_OF_DESKTOPS']):
            Workspace.add(wsid)
            Monitor.add(wsid, xinerama)

    # Remove desktops
    elif old > properties['_NET_NUMBER_OF_DESKTOPS']:
        for wsid in xrange(properties['_NET_NUMBER_OF_DESKTOPS'], old):
            Monitor.remove(wsid)
            Workspace.remove(wsid)

def update_NET_DESKTOP_GEOMETRY(force=False):
    global properties, xinerama

    old_geom = properties['_NET_DESKTOP_GEOMETRY']
    old_xinerama = xinerama

    time.sleep(1)

    properties['_NET_DESKTOP_GEOMETRY'] = ptxcb.XROOT.get_desktop_geometry()
    xinerama = ptxcb.connection.xinerama_get_screens()

    if old_xinerama != xinerama or force:
        if not force and len(old_xinerama) == len(xinerama):
            for mon in Workspace.iter_all_monitors():
                mon.refresh_bounds(
                    xinerama[mid]['x'],
                    xinerama[mid]['y'],
                    xinerama[mid]['width'],
                    xinerama[mid]['height']
                )
                mon.calculate_workarea()
        else:
            for mon in Workspace.iter_all_monitors():
                for tiler in mon.tilers:
                    tiler.destroy()

            for wid in Window.WINDOWS.keys():
                Window.remove(wid)

            for wsid in Workspace.WORKSPACES.keys():
                Monitor.remove(wsid)
                Workspace.remove(wsid)

            reset_properties()
            load_properties()

init()
2 - /usr/lib/python2.7/site-packages/pt3/tile.py

Ci-dessous le contenu de /usr/lib/python2.7/site-packages/pt3/tile.py.

Code : Tout sélectionner

import xpybutil
import xpybutil.event as event
import xpybutil.util as util

from debug import debug

import state
from layouts import layouts

try:
    from config import tile_on_startup
except ImportError:
    tile_on_startup = False

tilers = {}

def debug_state():
    debug('-' * 45)
    for d in tilers:
        if d not in state.visibles:
            continue
        tiler, _ = get_active_tiler(d)
        debug(tiler)
        debug(tiler.store)
        debug('-' * 45)

def cmd(action):
    def _cmd():
        if state.desktop not in tilers:
            return

        tiler, _ = get_active_tiler(state.desktop)

        if action == 'tile':
            tiler.tile()
        elif tiler.tiling:
            if action == 'cycle':
                cycle_current_tiler()
            else:
                getattr(tiler, action)()

    return _cmd

def cycle_current_tiler():
    assert state.desktop in tilers

    tiler, i = get_active_tiler(state.desktop)
    newtiler = tilers[state.desktop][(i + 1) % len(tilers[state.desktop])]

    tiler.active = False
    tiler.tiling = False
    newtiler.active = True

    debug('Switching tiler from %s to %s on desktop %d' % (
           tiler.__class__.__name__, newtiler.__class__.__name__, 
           state.desktop))

    newtiler.tile(save=False)

def get_active_tiler(desk):
    assert desk in tilers

    for i, tiler in enumerate(tilers[desk]):
        if tiler.active:
            return tiler, i

def update_client_moved(c):
    assert c.desk in tilers

    tiler, _ = get_active_tiler(c.desk)
    if tiler.tiling:
        tiler.tile()

def update_client_desktop(c, olddesk):
    assert c.desk in tilers

    if olddesk in tilers:
        for tiler in tilers[olddesk]:
            tiler.remove(c)

    for tiler in tilers[c.desk]:
        tiler.add(c)

def update_client_add(c):
    assert c.desk in tilers
    
    for tiler in tilers[c.desk]:
        tiler.add(c)

def update_client_removal(c):
    assert c.desk in tilers

    for tiler in tilers[c.desk]:
        tiler.remove(c)

def update_tilers():
    for d in xrange(state.desk_num):
        if d not in tilers:
            debug('Adding tilers to desktop %d' % d)
            tilers[d] = []
            for lay in layouts:
                t = lay(d)
                tilers[d].append(t)
            tilers[d][0].active = True
            if tile_on_startup:
                tilers[d][0].tiling = True
                tilers[d][0].tile()
    for d in tilers.keys():
        if d >= state.desk_num:
            debug('Removing tilers from desktop %d' % d)
            del tilers[d]

def cb_property_notify(e):
    aname = util.get_atom_name(e.atom)

    if aname == '_NET_NUMBER_OF_DESKTOPS':
        update_tilers()
    elif aname == '_NET_CURRENT_DESKTOP':
        if len(state.visibles) == 1:
            tiler, _ = get_active_tiler(state.desktop)
            if tiler.tiling:
                tiler.tile()
    elif aname == '_NET_VISIBLE_DESKTOPS':
        for d in state.visibles:
            tiler, _ = get_active_tiler(d)
            if tiler.tiling:
                tiler.tile()

event.connect('PropertyNotify', xpybutil.root, cb_property_notify)

3 - Petite précision
J'utilise pytyle sur ma debian et cela marche comme un charme. J'imagine que cette appli est ancienne, mais pas obsolète et opérante.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par FoolEcho »

niccoper a écrit :

Code : Tout sélectionner

File "/usr/lib/python2.7/site-packages/pt/ptxcb/window.py", line 564, in get_current_desktop
    return self._get_property('_NET_CURRENT_DESKTOP')[0]
IndexError: list index out of range
niccoper a écrit :

Code : Tout sélectionner

File "/usr/lib/python2.7/site-packages/pt3/tile.py", line 97, in update_tilers
    for d in xrange(state.desk_num):
TypeError: an integer is required
Mmmm... après réexamen de tes messages d'erreur (fatigué moi...), je pense que les versions de python employées sont les bonnes (d'après les dépôts github utilisés pour pytyle3...) ... du coup il s'agit peut-être de bugs (une version plus ancienne de python2 ?) ... Quelle version de python as-tu sur ta Debian ? (Arch utilise la 2.7.9 pour la mouture python2 qui nous intéresse ici)
«The following statement is not true. The previous statement is true.» :nage:
niccoper
Hankyu
Messages : 28
Inscription : jeu. 09 avr. 2015, 17:04

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par niccoper »

Sous debian, la version de python est la 2.7.3. ($ python -V)

Or, effectivement, sur mon arch j'ai les versions 2.7.9 et 3.4.3

Par ailleurs, j'ai copié les fichiers de pytyle de ma Debian sur mon arch mais sans succès.

Les messages varient en fonction de la version de python utisée

Code : Tout sélectionner

[user@host ~] $ python3 /opt/pytyle-0.7.5/pytyle
  File "/opt/pytyle-0.7.5/pytyle", line 134
    print 'nice!'
                ^
SyntaxError: Missing parentheses in call to 'print'

Code : Tout sélectionner

[user@host ~]$ python2 /opt/pytyle-0.7.5/pytyle
Xlib.protocol.request.QueryExtension
Pour ce dernier retour, la phrase "Xlib.protocol.request.QueryExtension" persiste sans que l'on puisse reprendre la main sur la console.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par FoolEcho »

Tout tourne avec python2 a priori... mais effectivement se pose le problème de la version (et pour rappel, Arch ne supporte pas les mises à jour partielles donc à moins de vouloir faire un essai pour isoler la cause de façon certaine, n'essaie pas de rétrograder python2).
«The following statement is not true. The previous statement is true.» :nage:
niccoper
Hankyu
Messages : 28
Inscription : jeu. 09 avr. 2015, 17:04

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par niccoper »

bonjour FoolEcho,

désolé, je n'avais pas vu ton message. J'ai laissé tomber pour pytyle. Quanf j'aurais l'occasion de me pencher sur python j'essayerais de débugguer pytytle.

Merci de ton aide.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [pytyle et e17] : Échec dans l'utilisation de pytyle

Message par FoolEcho »

Tu peux mettre le sujet en (abandonné) alors. :chinois:
«The following statement is not true. The previous statement is true.» :nage:
Répondre