Page 1 sur 1
[Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 11:08
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
Re: [Openbox] Coordonnées souris en temps réel (non résolu
Publié : dim. 24 avr. 2011, 11:23
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.

Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 11:34
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
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 12:02
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?
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 12:22
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) ... ...
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 12:30
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" .
Re: [Openbox] Coordonnées souris en temps réel (non résolu
Publié : dim. 24 avr. 2011, 19:52
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)
Re: [Openbox] Coordonnées souris en temps réel (non résolu
Publié : dim. 24 avr. 2011, 20:41
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 ...
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : dim. 24 avr. 2011, 23:38
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

Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : lun. 25 avr. 2011, 10:18
par FoolEcho
Je réitère car tu n'as pas vu mon conseil à ce sujet (petite police

), récupère le résultat de:
dans une variable puis fais tes if (ou un switch)... sinon tu fais des évaluations pour rien. En plus...

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).
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : lun. 25 avr. 2011, 18:12
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 ...
Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : lun. 25 avr. 2011, 18:53
par FoolEcho
Au moins xdpyinfo et xrandr peuvent te sortir ces infos.

Re: [Openbox] Coordonnées souris en temps réel (résolu)
Publié : mar. 17 mai 2011, 23:53
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 ^^
