Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 21/01/2013, à 14:36

sined79

XFCE - Positionnement des fenêtres

Bonjour,

Je viens d'une distribution Linux Mint avec laquelle j'avais la possibilité de bloquer les fenêtres avec les raccourcis claviers suivant: <ctrl><alt><1> - <ctrl><alt><2> ... - <ctrl><alt><9>, permettant donc de bloquer respectivement les fenetres, en bas à gauche - en bas sur toute la largeur... - bloquer en haut à droite. Et tout le pavé numérique était utile pour la mise en place de mes fenetres dans les positions souhaitées.
C'est raccourcis étaient vraiment pratiques... J'ai décidé de passer sur Xubuntu que je préfère nettement grâce à sa légèreté mais qui en natif ne propose pas les mêmes raccourcis.
Pensez-vous qu'il soit possible de configurer le même type de comportement ? Si oui, comment ? Car c'était à peu près la seule chose que j'appréciais vraiment avec Mint et qui me manque maintenant.

Merci d'avance de vos réponses,
Sined79

Hors ligne

#2 Le 21/01/2013, à 17:31

The Uploader

Re : XFCE - Positionnement des fenêtres

Salut

Quelle version de Linux Mint était-ce exactement ?

Cela ne semble pas être supporté par xfwm4. Un addon existe cependant :  http://askubuntu.com/questions/122674/i … the-screen

C'est un script python, fourni sous forme de PPA installable. https://launchpad.net/~serge-hallyn/+archive/stiler

Ensuite, j'imagine qu'il te reste à lui attribuer des raccourcis claviers dans le gestionnaire de paramètres => Clavier => Raccourcis d'applications comme montré en exemple sur la page.

Dommage de ne pas pouvoir trouver juste le script python, plutôt que d'avoir à installer forcément un PPA. Voici le contenu du paquet pour Precise (donc le script seul) ci-dessous :

#!/usr/bin/python

############################################################################
# Copyright (c) 2009   unohu <unohu0@gmail.com>                            #
#                                                                          #
# Permission to use, copy, modify, and/or distribute this software for any #
# purpose with or without fee is hereby granted, provided that the above   #
# copyright notice and this permission notice appear in all copies.        #
#                                                                          #
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES #
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF         #
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR  #
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   #
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    #
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF  #
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.           #
#                                                                          #
############################################################################

import sys
import os
import commands
import pickle
import ConfigParser

def initconfig():
    rcfile=os.getenv('HOME')+"/.stilerrc"
    if not os.path.exists(rcfile):
        cfg=open(rcfile,'w')
        cfg.write("""#Tweak these values 
[default]
BottomPadding = 0
TopPadding = 0
LeftPadding = 0
RightPadding = 0
WinTitle = 21
WinBorder = 1
MwFactor = 0.65
TempFile = /tmp/tile_winlist
""")
        cfg.close()

    config=ConfigParser.RawConfigParser()
    config.read(rcfile)
    return config

def get_screen_size():
    s = commands.getoutput('''xdpyinfo | grep 'dimension' | awk -F: '{ print $2 }' | awk '{ print $1 }' ''')
    (x,y) = s.split('x')
    return (int(x), int(y))

(resx, resy) = get_screen_size()

def initialize():
    desk_output = commands.getoutput("wmctrl -d").split("\n")
    desk_list = [line.split()[0] for line in desk_output]

    current =  filter(lambda x: x.split()[1] == "*" , desk_output)[0].split()

    desktop = current[0]
    width =  current[8].split("x")[0]
    height =  current[8].split("x")[1]
    orig_x =  current[7].split(",")[0]
    orig_y =  current[7].split(",")[1]
    (resx, resy) = get_screen_size()

    win_output = commands.getoutput("wmctrl -lG").split("\n")
    win_list = {}

    win_filtered = []
    for win in win_output:
	w = win.split()
	x = int(w[2])
	y = int(w[3])
	if x < 0 or x >= resx:
		continue
	if y < 0 or y >= resy:
		continue
	if w[7] == '<unknown>':
		continue
	if w[6] == 'N/A':
		continue
	if w[7] == 'x-nautilus-desktop':
		continue
	win_filtered.append(win)

    for desk in desk_list:
        win_list[desk] = map(lambda y: hex(int(y.split()[0],16)) , filter(lambda x: x.split()[1] == desk, win_filtered ))

    return (desktop,orig_x,orig_y,width,height,win_list)

def get_active_window():
    return str(hex(int(commands.getoutput("xdotool getactivewindow 2>/dev/null").split()[0])))
    

def store(object,file):
    with open(file, 'w') as f:
        pickle.dump(object,f)
    f.close()


def retrieve(file):
    try:
        with open(file,'r+') as f:
            obj = pickle.load(f)
        f.close()
        return(obj)
    except:
        f = open(file,'w')
        f.close
        dict = {}
        return (dict)


# Get all global variables
Config = initconfig()
BottomPadding = Config.getint("default","BottomPadding")
TopPadding = Config.getint("default","TopPadding")
LeftPadding = Config.getint("default","LeftPadding")
RightPadding = Config.getint("default","RightPadding")
WinTitle = Config.getint("default","WinTitle")
WinBorder = Config.getint("default","WinBorder")
MwFactor = Config.getfloat("default","MwFactor")
TempFile = Config.get("default","TempFile")
(Desktop,OrigXstr,OrigYstr,MaxWidthStr,MaxHeightStr,WinList) = initialize()
MaxWidth = int(MaxWidthStr) - LeftPadding - RightPadding
MaxHeight = int(MaxHeightStr) - TopPadding - BottomPadding
OrigX = int(OrigXstr) + LeftPadding
OrigY = int(OrigYstr) + TopPadding 
OldWinList = retrieve(TempFile)

def get_simple_tile(wincount):
    rows = wincount - 1
    layout = [] 
    if rows == 0:
        layout.append((OrigX,OrigY,MaxWidth,MaxHeight-WinTitle-WinBorder))
        return layout
    else:
        layout.append((OrigX,OrigY,int(MaxWidth*MwFactor),MaxHeight-WinTitle-WinBorder))

    x=OrigX + int((MaxWidth*MwFactor)+(2*WinBorder))
    width=int((MaxWidth*(1-MwFactor))-2*WinBorder)
    height=int(MaxHeight/rows - WinTitle-WinBorder)
    
    for n in range(0,rows):
        y= OrigY+int((MaxHeight/rows)*(n))
        layout.append((x,y,width,height))

    return layout


def get_vertical_tile(wincount):
    layout = [] 
    y = OrigY
    width = int(MaxWidth/wincount)
    height = MaxHeight - WinTitle - WinBorder
    for n in range(0,wincount):
        x= OrigX + n * width
        layout.append((x,y,width,height))

    return layout


def get_horiz_tile(wincount):
    layout = [] 
    x = OrigX
    height = int(MaxHeight/wincount - WinTitle - WinBorder)
    width = MaxWidth
    for n in range(0,wincount):
        y= OrigY + int((MaxHeight/wincount)*(n))
        layout.append((x,y,width,height))

    return layout

def get_max_all(wincount):
    layout = [] 
    x = OrigX
    y = OrigY 
    height = MaxHeight - WinTitle - WinBorder
    width = MaxWidth
    for n in range(0,wincount):
        layout.append((x,y,width,height))

    return layout



def move_active(PosX,PosY,Width,Height):
    command =  " wmctrl -r :ACTIVE: -e 0," + str(PosX) + "," + str(PosY)+ "," + str(Width) + "," + str(Height)
    os.system(command)


def unmaximize_one(windowid):
    command =  " wmctrl -i -r " + windowid +  " -bremove,maximized_vert,maximized_horz"
    os.system(command)


def maximize_one(windowid):
    command =  " wmctrl -i -r " + windowid +  " -badd,maximized_vert,maximized_horz"
    os.system(command)


def move_window(windowid,PosX,PosY,Width,Height):
    # Unmaximize window
    unmaximize_one(windowid)
    # Now move it
    command =  " wmctrl -i -r " + windowid +  " -e 0," + str(PosX) + "," + str(PosY)+ "," + str(Width) + "," + str(Height)
    os.system(command)
    command = "wmctrl -i -r " + windowid + " -b remove,hidden,shaded"
    os.system(command)


def raise_window(windowid):
    if windowid == ":ACTIVE:":
        command = "wmctrl -a :ACTIVE: "
    else:
        command = "wmctrl -i -a " + windowid
    
    os.system(command)


def left():
    Width=MaxWidth/2-1
    Height=MaxHeight - WinTitle -WinBorder
    PosX=LeftPadding
    PosY=TopPadding
    move_active(PosX,PosY,Width,Height)
    raise_window(":ACTIVE:")


def right():
    Width=MaxWidth/2-1
    Height=MaxHeight - WinTitle - WinBorder 
    PosX=MaxWidth/2
    PosY=TopPadding
    move_active(PosX,PosY,Width,Height)
    raise_window(":ACTIVE:")
    

def compare_win_list(newlist,oldlist):
    templist = []
    for window in oldlist:
        if newlist.count(window) != 0:
            templist.append(window)
    for window in newlist:
        if oldlist.count(window) == 0: 
            templist.append(window)
    return templist


def create_win_list():
    Windows = WinList[Desktop]

    if OldWinList == {}:
        pass
    else:
        OldWindows = OldWinList[Desktop]
        if Windows == OldWindows:
            pass
        else:
            Windows = compare_win_list(Windows,OldWindows)

    return Windows


def arrange(layout,windows):
    for win , lay  in zip(windows,layout):
        move_window(win,lay[0],lay[1],lay[2],lay[3])
    WinList[Desktop]=windows
    store(WinList,TempFile)


def simple():
    Windows = create_win_list()
    arrange(get_simple_tile(len(Windows)),Windows)
   

def swap():
    winlist = create_win_list()
    if len(winlist) == 1:
        # only one window, maximize it
        maximize_active()
        return
    active = get_active_window()
    winlist.remove(active)
    winlist.insert(0,active)
    arrange(get_simple_tile(len(winlist)),winlist)


def vertical():
    winlist = create_win_list()
    active = get_active_window()
    winlist.remove(active)
    winlist.insert(0,active)
    arrange(get_vertical_tile(len(winlist)),winlist)


def horiz():
    winlist = create_win_list()
    active = get_active_window()
    winlist.remove(active)
    winlist.insert(0,active)
    arrange(get_horiz_tile(len(winlist)),winlist)


def cycle():
    winlist = create_win_list()
    winlist.insert(0,winlist[len(winlist)-1])
    winlist = winlist[:-1]
    arrange(get_simple_tile(len(winlist)),winlist)

def focus_next():
    Windows = create_win_list()
    # we need to find which window is the active one
    # then pick the next one
    # for now just pick the second window always
    active = get_active_window()
    found = 0
    for win in Windows:
	    if found == 1:
		    raise_window(win)
		    return
	    if win == active:
		    found = 1
    raise_window(Windows[0])

def focus_prev():
    Windows = create_win_list()
    active = get_active_window()
    prev = Windows[len(Windows)-1]
    for win in Windows:
	    if win == active:
		    raise_window(prev)
            prev = win


def maximize_active():
    os.system("wmctrl -r :ACTIVE: -badd,maximized_vert,maximized_horz")


def maximize():
    Width=MaxWidth
    Height=MaxHeight - WinTitle -WinBorder
    PosX=LeftPadding
    PosY=TopPadding
    move_active(PosX,PosY,Width,Height)
    raise_window(":ACTIVE:")

def old_max_all():
    winlist = create_win_list()
    active = get_active_window()
    winlist.remove(active)
    winlist.insert(0,active)
    arrange(get_max_all(len(winlist)),winlist)

# new max_all(), use real 'maximize'
# this way unity can remove the title bar
def max_all():
    winlist = create_win_list()
    for win in winlist:
        maximize_one(win)

if sys.argv[1] == "left":
    left()
elif sys.argv[1] == "right":
    right()
elif sys.argv[1] == "simple":
    simple()
elif sys.argv[1] == "vertical":
    vertical()
elif sys.argv[1] == "horizontal":
    horiz()
elif sys.argv[1] == "swap":
    swap()
elif sys.argv[1] == "cycle":
    cycle()
elif sys.argv[1] == "maximize":
    maximize()
elif sys.argv[1] == "next":
    focus_next()
elif sys.argv[1] == "prev":
    focus_prev()
elif sys.argv[1] == "max_all":
    max_all()

Nom du script : styler.py

wink

Dernière modification par The Uploader (Le 21/01/2013, à 17:35)


Passer de Ubuntu 10.04 à Xubuntu 12.04 LTS
ASUS N56VV (UEFI + GPT, Core i5-3230M @ 2.60GHz, Intel HD4000 + GeForce 750M, 12 Go de RAM, SSD 1 To)
Système principal : Archlinux (amd64), avec KDE 4
Système oublié la plupart du temps : Windows 8.1 Update 1 (x64, OEM)

Hors ligne

#3 Le 21/01/2013, à 19:08

adjoint

Re : XFCE - Positionnement des fenêtres

Bonjour,

Tu as un autre programme ici : http://ssokolow.com/quicktile/

Je ne l'ai pas essayé.

styler.py semble nécessiter "wmctrl" pour fonctionner.

Hors ligne

#4 Le 21/01/2013, à 19:10

The Uploader

Re : XFCE - Positionnement des fenêtres

wmctrl est sur les dépôts.


Passer de Ubuntu 10.04 à Xubuntu 12.04 LTS
ASUS N56VV (UEFI + GPT, Core i5-3230M @ 2.60GHz, Intel HD4000 + GeForce 750M, 12 Go de RAM, SSD 1 To)
Système principal : Archlinux (amd64), avec KDE 4
Système oublié la plupart du temps : Windows 8.1 Update 1 (x64, OEM)

Hors ligne

Haut de page ↑