[Openbox] Coordonnées souris en temps réel (résolu)

Xorg, Compiz, KDE / Gnome / Xfce / Fluxbox / e17 / fvwm ... GDM/KDM/XDM...
Répondre
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

[Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

Bonjour,
Voila mon but est de recreer en version light la fonction aero snap de Windows 7 qui a été implémenté à gnome 3 et KDE, c'est-à-dire le faite de pouvoir maximiser ou agrandir sur la moitiée de l'écran la fênètre.
Le but étant de pouvoir l'utiliser sur n'importe qu'elle gestionnaire, en l'occurence openbox.

J'ai trouvé comment agrandir la fenêtre en prenant la moitiée de l'écran avec la commande shell wmctrl exemple: wmctrl -r :ACTIVE: -e 0,0,0,625,800. Mais je n'arrive pas à savoir en temps réel le position du curseur sur l'écran.
Je n'ai pas trouvé de commande shell, pour cette usage mais j'ai trouvé une fonction que je pourrai peut-être utiliser en C++ XQueryPointer(): voici la source http://www.developpez.net/forums/d8487 [...] -clic-gauche/

Code : Tout sélectionner

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <iostream>

using namespace std;

int main(){
Display *display = XOpenDisplay(NULL);
XEvent event;
Window root, child;
int root_x,root_y;
int window_x, window_y;


XQueryPointer (display, RootWindow(display, DefaultScreen(display)), &root, &child, &root_x, &root_y, &window_x, &window_y, &event.xbutton.state);

cout<<"x: "<<window_x<<endl;
cout<<"y: "<<window_y<<endl;

XCloseDisplay(display);
}
Mais je n'arrive pas à le rendre opérationnel, ensuite je n'aurai plus qu'à tester si le curseur touche le bord droit, gauche, ou haut pour lancer la commande shell.
Ou bien je vien de penser utiliser une fonction, comme dans tint2: la fonction "auto-hide" détecte si la souris se trouve sur la zone de la barre de tache pour ensuite l'afficher, il y aurai donc moyen de l'utiliser, mais je cherche encore dans le code..

Cordialement
Dernière modification par xyoos le dim. 24 avr. 2011, 23:17, modifié 7 fois.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Openbox] Coordonnées souris en temps réel (non résolu

Message par FoolEcho »

xyoos a écrit :Mais je n'arrive pas à savoir en temps réel le position du curseur sur l'écran.
Ce sujet te fournit d'autres éléments: https://bbs.archlinux.org/viewtopic.php?id=55495, notamment xdotool qui à l'air de fonctionner au poil. :)
«The following statement is not true. The previous statement is true.» :nage:
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

Merci bien! malgré de nombreuse recherche et analyse de code source, je n'avai pas réussi à trouver la perle rare merci beaucoup. Pour ceux que ca peut intéressait je mettrais mon script en ligne si certains sont interressé! merci
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

Par contre comment faire pour que le script s'éxécute en permanence, sans faire de boucle infini qui utiliserai les ressources processeurs?
Faut-il faire un daemon ou utiliser cron?
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par FoolEcho »

Cela dépend de ce que fait ton script et comment, de quelle façon tu comptes le déclencher, etc. ... Faut nous donner plus de détails (pas forcément le source, mais les grandes lignes de l'algorithme).
Côté automatisation: tu as cron (sur une période de temps, donc à priori pas le plus pertinent ici... mais j'en sais rien, c'est vraiment fonction de ton script), en faire un service (démon) ou le faire tourner ton script en arrière-plan ("&" ) ou un appel ponctuel (sur une action clavier/souris/menu) ... ...
«The following statement is not true. The previous statement is true.» :nage:
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

oui je sais bien faut que je fasse le script pour que ca soit plus concret,
voila les grandes lignes:

Code : Tout sélectionner

while :
do
echo $(xdotool getmouselocation|cut -d 's' -f 1)

if [ "$(xdotool getmouselocation|cut -d 's' -f 1)" = "x:0 y:0 " ]
then
wmctrl -r :ACTIVE: -e 0,0,0,682,717
fi

if [ "$(xdotool getmouselocation|cut -d 's' -f 1)" = "x:1365 y:0 " ]
then
wmctrl -r :ACTIVE: -e 0,684,0,681,717
fi

#if [ "$(xdotool getmouselocation|cut -d 's' -f 1)" = "x:0 y:0 " ]
#then
#wmctrl -r :ACTIVE: -e 0,0,0,683,717
#fi


done
en gros je voudrai que la tache tourne constamment, et que si le pointeur de la souris arrive dans le coin gauche de l'écran sa redimmensionne la fênètre, mais je voudrai ne pas utiliser de boucle infini sinon les ressource systeme "en prenne un coup" .
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Openbox] Coordonnées souris en temps réel (non résolu

Message par FoolEcho »

Dans un premier temps, je te suggère de te concentrer sur le script qui fait/supprime l'effet désiré puis simplement de l'associer à un raccourci clavier (comme ça nul besoin de vérifier la position de la souris).
Puis, voir s'il y a moyen de déclencher l'action comme tu le veux sur le coin gauche... ça doit être possible vu que certaines actions peuvent se déclencher sur tout bon environnement de bureau qui se respecte, mais je ne sais pas comment par contre (la solution du pire, étant effectivement de laisser tourner le script durant toute la session, mais bon... bof, bof, bof... pourquoi réinventer la roue si on peut s'en passer ? ). A creuser.

(conseil inutile si tu fais autrement: ne définis qu'une fois la position de la souris avant de vérifier les conditions, le processus sera moins gourmand)
«The following statement is not true. The previous statement is true.» :nage:
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (non résolu

Message par xyoos »

ben en raccourci clavier c facile: il y a juste a mettre wmctrl -r :ACTIVE: -e 0,0,0,682,717, cette commande redimensionne la fenetre active
voivi mon code un peu modifier:

Code : Tout sélectionner

while :
do
echo $(xdotool getmouselocation|cut -d 's' -f 1)

if [ "$(xdotool getmouselocation|cut -d 's' -f 1)" = "x:0 y:0 " ]
then
wmctrl -r :ACTIVE: -e 0,0,0,682,717
fi

if [ "$(xdotool getmouselocation|cut -d 's' -f 1)" = "x:1365 y:0 " ]
then
wmctrl -r :ACTIVE: -e 0,684,0,681,717
fi

sleep 0.5  # pour restreindre les processus

done
Est ce que le fait de le mettre en daemon sans la boucle pourrai marcher?
sinon
a chaque clique sur la barre de la fenetre cela lancerai le script et il y aura un compteur dans le script qui au bout d'un certain temps arriverai par exemple a 40 avec un sleep 0.1 et une conditon quand le compteur arrive a 40 on arrete le script, c'est artisanale mais ça devrai marcher
Seul truc qui me dérange c'est que genre la barre tint2 ou wbar on une fonction auto-hide qui cache la barre et quand la souris arrive dessus la barre apparait ses paquet arrive a le faire et j'etudie leur source pour savoir comment ses paquets font-il, à suivre ...
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

voila j'ai reussit je publie mon code pour ceux que ça pourrai interressé:

Code : Tout sélectionner

for i in `seq 1 40`;
do   
echo $(xdotool getmouselocation|cut -d ' ' -f 2|cut -d ' ' -f 1)

if [ "$(xdotool getmouselocation|cut -d 'y' -f 1)" = "x:0 " ]
then
wmctrl -r :ACTIVE: -e 0,0,0,682,718  
fi

if [ "$(xdotool getmouselocation|cut -d 'y' -f 1)" = "x:1365 " ]
then
wmctrl -r :ACTIVE: -e 0,684,0,681,718  
fi

if [ "$(xdotool getmouselocation|cut -d ' ' -f 2|cut -d ' ' -f 1)" = "y:0" ]
then
wmctrl -r :ACTIVE: -e 0,0,0,1365,718
fi

sleep 0.1
# wmctrl -l -G pour récuperer les coordonnées de la fenetre a l'état actuel

done
ce code consiste a faire un boucle et incrémenté toute les 0.1 secondes jusqu'à 40 donc le script marche pendant 4 secondes
et je declanche ce script quand je deplace la fenetre jusquau bord
grace à un raccourci d'openbox dans le ~/.config/openbox/rc.xml

Code : Tout sélectionner

<mousebind action="Drag" button="Left">
<action name="Execute">
<command>/home/xyoos/script_souris.sh</command>
</action>
<action name="Move"/>
</mousebind>
voila ceci coorespond à un version light de aero snap de windows 7

Merci à toi FoolEcho pour 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: [Openbox] Coordonnées souris en temps réel (résolu)

Message par FoolEcho »

Je réitère car tu n'as pas vu mon conseil à ce sujet (petite police :mrgreen: ), récupère le résultat de:

Code : Tout sélectionner

$(xdotool getmouselocation|cut -d ' ' -f 2|cut -d ' ' -f 1)

dans une variable puis fais tes if (ou un switch)... sinon tu fais des évaluations pour rien. En plus... :rtfm: de xdotool et tu pourras faire des trucs plus sympas pour récupérer x,y.

Quelque chose comme:

Code : Tout sélectionner

eval $(xdotool getmouselocation --shell)

echo "X= $X"
echo "Y= $Y"

#x:0 
#"case" if more situations... easier to follow than "if"...
if [ $X = "0" ]
then
    wmctrl -r :ACTIVE: -e 0,0,0,682,718 
else 
#x:1365
    if [ $X  = "1365" ]
    then
	wmctrl -r :ACTIVE: -e 0,684,0,681,718 
    fi
fi

#y:0
if [ $Y = "0" ]
then
    wmctrl -r :ACTIVE: -e 0,0,0,1365,718
fi
Un bon script est un script réutilisable, donc il faudrait récupérer les coordonnées de l'écran... et pas caler pour toi. ;)
... et bien sûr, je ne suis pas fan du script à temps d'usage limité (et encore moins du sleep)... mais bon, je ne connais pas assez les outils de X et des WM pour savoir s'il y a moyen de faire mieux (sans doute).
«The following statement is not true. The previous statement is true.» :nage:
xyoos
Hankyu
Messages : 49
Inscription : lun. 14 févr. 2011, 19:39

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par xyoos »

oui Merci bien je prend note! Merci bien oui faudrai que je le fasse pour tout le monde que le script prenne la résolution de l'écran ...
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10711
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par FoolEcho »

Au moins xdpyinfo et xrandr peuvent te sortir ces infos. :mrgreen:
«The following statement is not true. The previous statement is true.» :nage:
maxoxo
Hankyu
Messages : 17
Inscription : mar. 17 mai 2011, 23:49

Re: [Openbox] Coordonnées souris en temps réel (résolu)

Message par maxoxo »

Salut,

Je sais pas si ça intéresse et si ça un rapport (surtout 3 semaines après) mais perso j'utilise une sorte d’ersatz d'aero snap directement dans mon rc.xml.

Code : Tout sélectionner

   
    <keybind key="W-Right">
      <action name="GrowtoEdgeEast" />
    </keybind>
    <keybind key="W-Up">
      <action name="GrowtoEdgeNorth" />
    </keybind>
    <keybind key="W-Left">
      <action name="GrowtoEdgeWest" />
    </keybind>
    <keybind key="W-Down">
      <action name="GrowtoEdgeSouth" />
    </keybind>
De cette façon j'arrive à aligner avec le clavier deux fenêtres côtes à côtes ^^ :)
« Il n’y a aucun autre système que GNU et Linux est un de ses noyaux »
Répondre