#1 Le 01/12/2009, à 01:04
- bece
Souris-mètre en C
Bonjour (ou bonsoir cela dépend du point de vue )
Voila je compte développer un souris mètre en C ou C++ (j'ai pas encore choisi).
Donc j'ai pensé à utiliser un librairie externe graphique qui aurait donc forcément des fonctions de coordonnées de la souris. Et en prenant par exemple un frame à 10 par seconde, les coordonnées seraient donc calculées tous les dixièmes de seconde. Mais bon cette solution me plait qu'à moitié je trouve que c'est un peu lourd d'avoir à importer un librairie externe, peut-être que l'on peut obtenir les coordonnées de la souris avec la librairie standard ?
En suite peut-être que cela consommerait trop de ressource pour un programme qui ne devrait pas en utiliser trop ?
Voila mon petit projet, si vous pouvez me dire si je me goure totalement au niveau des choix pour l'implémentation ?
Merci.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#2 Le 01/12/2009, à 01:24
- compte supprimé
Re : Souris-mètre en C
Salut, tu peux regarder la librairie X11 (libx11). Voici des exemples en C, java, tcl,... : http://rosettacode.org/wiki/Get_mouse_position
#3 Le 01/12/2009, à 02:08
- helly
Re : Souris-mètre en C
En C avec la lib SDL ca doit être possible ...
Archlinux-wmii-dwb.
Un problème résolu ? Faites le savoir en mettant [résolu] à côté du titre de votre topic.
Un problème non résolu ? Faites le savoir en insultant ceux qui cherchent à vous aider.
Un site bleu super remasterised©, un wiki cherchant des volontaires pour traduire un site.
Hors ligne
#4 Le 01/12/2009, à 08:20
- grim7reaper
Re : Souris-mètre en C
Salut,
À ma connaissance, il est impossible en C standard de récupérer les coordonnées de la souris. Donc il va forcément falloir utiliser une bibliothèque externe (ou en coder une toi même ).
Ensuite, pour ce qui est des performances, SDL ou Xlib ça consomme pas des masses (c'est les bibliothèques bas niveau au final, dont l'une orienté jeu vidéo). Après tout dépend de ce que tu veux faire.
Si c'est pour récupérer les événements uniquement dans une fenêtre que tu as ouverte, alors SDL ou Xlib le font très bien donc c'est à toi de choisir selon ta préférence.
En revanche, si tu veux récupérer les événements n'importe où sur l'écran et dans les autres fenêtres aussi là il va falloir passer par la Xlib car SDL ne gère rien en dehors de ses fenêtre il me semble(pas taper si je me trompe).
Dernière modification par grim7reaper (Le 01/12/2009, à 08:22)
Hors ligne
#5 Le 01/12/2009, à 12:03
- bece
Re : Souris-mètre en C
Ok, bon je vais regarder la xlib puisque le programme serait un programme qui tournerai en arrière plan dans le system tray mais qui prendrait les coordonnées de n'importe quel endroit sur l'écran (fenêtres, bureau, etc...)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#6 Le 01/12/2009, à 13:09
- mika
Re : Souris-mètre en C
En C avec la lib SDL ca doit être possible ...
Je crois pas, de mémoire SDL se contente de gérer la souris dans sa propre surface et pas au delà.
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#7 Le 01/12/2009, à 13:35
- grim7reaper
Re : Souris-mètre en C
Ok, bon je vais regarder la xlib puisque le programme serait un programme qui tournerai en arrière plan dans le system tray mais qui prendrait les coordonnées de n'importe quel endroit sur l'écran (fenêtres, bureau, etc...)
Je ne connais pas ton niveau mais si tu veux de la doc tu peux jeter un oeil ici pour commencer et acquérir quelques notions de base.
Ensuite, pour approfondir et si l'anglais ne te fais pas peur tu pourras consulter cette source là et celle-ci qui sont bien plus complète. Enfin, il ne faut pas oublier les incontournables pages du man.
Hors ligne
#8 Le 01/12/2009, à 14:02
- bece
Re : Souris-mètre en C
Je sais pas comment on peut qualifier mon niveau en C. Disons que j'ai pas mal fait de C mais sous windows, je pense que c'est la même chose sous ubuntu.
Et merci pour vos liens je vais regarder ça, et non l'anglais ne me fait pas peur.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#9 Le 01/12/2009, à 14:40
- helly
Re : Souris-mètre en C
du C reste du C xD la seule chose qui change c'est le compilateur !!
Archlinux-wmii-dwb.
Un problème résolu ? Faites le savoir en mettant [résolu] à côté du titre de votre topic.
Un problème non résolu ? Faites le savoir en insultant ceux qui cherchent à vous aider.
Un site bleu super remasterised©, un wiki cherchant des volontaires pour traduire un site.
Hors ligne
#10 Le 01/12/2009, à 16:45
- bece
Re : Souris-mètre en C
Oui, ça c'est normal, quand je disais que ça changeait, c'était pour les installations des bibliothèques externes. Cela je l'ai jamais fait sous ubuntu (je suis un grand débutant sous ubuntu)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#11 Le 01/12/2009, à 21:12
- huit_six
Re : Souris-mètre en C
Bonjour, je me disais, ça ne serait pas possible en lisant directement le fichier /dev/psaux ?
[Edit] Il semblerait que /dev/input/mice soit plus approprié.
[Edit2] la solution était foireuse... en effet, ce qui est récupérable dans ces fichiers, c'est le déplacement de la souris, pas la position du pointeur qui elle, est créée par l'OS... Mauvaise que j'ai eue !
Dernière modification par huit_six (Le 01/12/2009, à 21:29)
Hors ligne
#12 Le 20/12/2009, à 15:57
- bece
Re : Souris-mètre en C
Bonjour je reviens vers vous car une question me torture l'esprit.
J'ai testé le code donné ici par :
Salut, tu peux regarder la librairie X11 (libx11). Voici des exemples en C, java, tcl,... : http://rosettacode.org/wiki/Get_mouse_position
Et voici ma question : est-ce normal que lorsque j'execute ce code il utilise le processeur à 100% ->
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#13 Le 20/12/2009, à 16:13
- mika
Re : Souris-mètre en C
Ben non, j'ai testé, c'est normal chez moi. T'as rien touché au code ?
A la limite y aurait eu un event mais là rien, juste un affichage des coordonnées x, y, ça doit pas te prendre 100%.
[edit]
Après vérif de ta capture, je vois que tu as adapté le code, tu devrais le poster ici. Je pense que la solution est dedans.
Dernière modification par mika (Le 20/12/2009, à 16:13)
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#14 Le 20/12/2009, à 16:28
- bece
Re : Souris-mètre en C
Ben voici le code, mais ce que j'ai fait ne devrait pas prendre tous le processeur sinon il faudrait des processeurs de malade pour des calculs mathématiques simple.
#include <stdio.h>
#include <X11/Xlib.h>
#include <math.h>
// To run this software : gcc main.c -o main -I /usr/X11R6/include/X11/ -L/usr/openwin/lib/X11 -lX11
int main()
{
Display *d;
Window inwin; /* root window the pointer is in */
Window inchildwin; /* child win the pointer is in */
int rootx, rooty; /* relative to the "root" window; we are not interested in these,
but we can't pass NULL */
int childx, childy; /* the values we are interested in */
Atom atom_type_prop; /* not interested */
int actual_format; /* should be 32 after the call */
unsigned int mask; /* status of the buttons */
unsigned long n_items, bytes_after_ret;
Window *props; /* since we are interested just in the first value, which is
a Window id */
/* default DISPLAY */
d = XOpenDisplay(NULL);
/* Variables */
int coorX = 0;
int coorY = 0;
int distanceX = 0;
int distanceY = 0;
int longueurX = 0;
int longueurY = 0;
int longueurT = 0;
int c = 0; /* compteur */
while (1) {
/* ask for active window (no error check); the client must be freedesktop
compliant */
(void)XGetWindowProperty(d, DefaultRootWindow(d),
XInternAtom(d, "_NET_ACTIVE_WINDOW", True),
0, 1, False, AnyPropertyType,
&atom_type_prop, &actual_format,
&n_items, &bytes_after_ret, (unsigned char**)&props);
XQueryPointer(d, props[0], &inwin, &inchildwin,
&rootx, &rooty, &childx, &childy, &mask);
/* Calcul de la distance */
if (c==1) {
distanceX = childx - coorX;
distanceX = fabs((double)distanceX);
longueurX += distanceX;
coorX = childx;
distanceY = childy - coorY;
distanceY = fabs((double)distanceY);
longueurY += distanceY;
coorY = childy;
longueurT = longueurX + longueurY;
/* printf("affichage du résultat : %d\n", longueurX); */
}
else {
coorX = childx;
coorY = childy;
c = 1;
}
/* printf("relative to active window: %d,%d\n", childx, childy); */
}
XFree(props); /* free mem */
(void)XCloseDisplay(d); /* and close the display */
return 0;
}
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#15 Le 20/12/2009, à 16:45
- mika
Re : Souris-mètre en C
Bah les boucle tu sais
Pourquoi ne pas faire un event : si la souris bouge et que si la souris bouge tu exécutes la boucle. Ça éviterait déjà de faire des calculs quand il n'y en a pas à faire.
Tu devrais regarder du coté de XGrabPointer et surtout de XQueryPointer.
En espérant t'aider.
Dernière modification par mika (Le 20/12/2009, à 16:57)
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#16 Le 20/12/2009, à 16:51
- bece
Re : Souris-mètre en C
Ok, merci je vais regarder.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#17 Le 20/12/2009, à 16:57
- mika
Re : Souris-mètre en C
Tu as des exemples ici
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#18 Le 20/12/2009, à 17:36
- bece
Re : Souris-mètre en C
Je viens de mettre une boucle événementielle à la place sauf que maintenant le programme tourne à l'infini sans rentrer dans cette boucle.
#include <stdio.h>
#include <X11/Xlib.h>
#include <math.h>
// To run this software : gcc main.c -o main -I /usr/X11R6/include/X11/ -L/usr/openwin/lib/X11 -lX11
int main()
{
Display *d;
XEvent ev; /* ne fonctionne pas */
Window inwin; /* root window the pointer is in */
Window inchildwin; /* child win the pointer is in */
int rootx, rooty; /* relative to the "root" window; we are not interested in these,
but we can't pass NULL */
int childx, childy; /* the values we are interested in */
Atom atom_type_prop; /* not interested */
int actual_format; /* should be 32 after the call */
unsigned int mask; /* status of the buttons */
unsigned long n_items, bytes_after_ret;
Window *props; /* since we are interested just in the first value, which is
a Window id */
/* default DISPLAY */
d = XOpenDisplay(NULL);
/* Variables */
int coorX = 0;
int coorY = 0;
int distanceX = 0;
int distanceY = 0;
int longueurX = 0;
int longueurY = 0;
int longueurT = 0;
int c = 0; /* compteur */
/* ask for active window (no error check); the client must be freedesktop
compliant */
(void)XGetWindowProperty(d, DefaultRootWindow(d),
XInternAtom(d, "_NET_ACTIVE_WINDOW", True),
0, 1, False, AnyPropertyType,
&atom_type_prop, &actual_format,
&n_items, &bytes_after_ret, (unsigned char**)&props);
do {
XNextEvent(d, &ev);
if (ev.type==MotionNotify) {
XQueryPointer(d, props[0], &inwin, &inchildwin, &rootx, &rooty, &childx, &childy, &mask);
/* Calcul de la distance */
if (c==1) {
distanceX = childx - coorX;
distanceX = fabs((double)distanceX);
longueurX += distanceX;
coorX = childx;
distanceY = childy - coorY;
distanceY = fabs((double)distanceY);
longueurY += distanceY;
coorY = childy;
longueurT = longueurX + longueurY;
printf("affichage du résultat : %d\n", longueurT);
}
else {
coorX = childx;
coorY = childy;
c = 1;
}
}
} while (1);
XFree(props); /* free mem */
(void)XCloseDisplay(d); /* and close the display */
return 0;
}
Edit :
Après quelqies essais, j'ai trouvé la ligne qui fait planter l'exécution. ->
XEvent ev;
J'ai donc mis cette ligne dans le code précédent qui lui fonctionne parfaitement. Pas de problème à la compilation par contre après un ./main j'ai ces retours :
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 38 (X_QueryPointer)
Resource id in failed request: 0x69617700
Serial number of failed request: 7
Current serial number in output stream: 7
Dernière modification par bece (Le 20/12/2009, à 18:17)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#19 Le 20/12/2009, à 20:52
- mika
Re : Souris-mètre en C
J'ai testé ton code, en enlevant l'event et sa condition, ça fonctionne nickel (enfin ça incrémente).
#include <stdio.h>
#include <X11/Xlib.h>
#include <math.h>
// To run this software : gcc main.c -o main -I /usr/X11R6/include/X11/ -L/usr/openwin/lib/X11 -lX11
int main()
{
Display *d;
Window inwin; /* root window the pointer is in */
Window inchildwin; /* child win the pointer is in */
int rootx, rooty; /* relative to the "root" window; we are not interested in these,
but we can't pass NULL */
int childx, childy; /* the values we are interested in */
Atom atom_type_prop; /* not interested */
int actual_format; /* should be 32 after the call */
unsigned int mask; /* status of the buttons */
unsigned long n_items, bytes_after_ret;
Window *props; /* since we are interested just in the first value, which is
a Window id */
/* default DISPLAY */
d = XOpenDisplay(NULL);
/* Variables */
int coorX = 0;
int coorY = 0;
int distanceX = 0;
int distanceY = 0;
int longueurX = 0;
int longueurY = 0;
int longueurT = 0;
int c = 0; /* compteur */
/* ask for active window (no error check); the client must be freedesktop
compliant */
(void)XGetWindowProperty(d, DefaultRootWindow(d),
XInternAtom(d, "_NET_ACTIVE_WINDOW", True),
0, 1, False, AnyPropertyType,
&atom_type_prop, &actual_format,
&n_items, &bytes_after_ret, (unsigned char**)&props);
do {
XQueryPointer(d, props[0], &inwin, &inchildwin, &rootx, &rooty, &childx, &childy, &mask);
/* Calcul de la distance */
if (c==1) {
distanceX = childx - coorX;
distanceX = fabs((double)distanceX);
longueurX += distanceX;
coorX = childx;
distanceY = childy - coorY;
distanceY = fabs((double)distanceY);
longueurY += distanceY;
coorY = childy;
longueurT = longueurX + longueurY;
printf("affichage du résultat : %d\n", longueurT);
}
else {
coorX = childx;
coorY = childy;
c = 1;
}
} while (1);
XFree(props); /* free mem */
(void)XCloseDisplay(d); /* and close the display */
return 0;
}
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#20 Le 20/12/2009, à 20:59
- bece
Re : Souris-mètre en C
Ben oui mais justement ce que tu me conseillait de faire c'était de mettre une boucle événemetielle plutôt qu'une boucle infini. Or si je l'ajoute j'ai cette belle erreur de "badwindow"
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#21 Le 20/12/2009, à 21:38
- mika
Re : Souris-mètre en C
Vi c'est galère les événements xlib. Je regarderais ton code au calme.
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#22 Le 20/12/2009, à 21:47
- bece
Re : Souris-mètre en C
Ok, merci. Je vais chercher de mon côté aussi.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#23 Le 20/12/2009, à 22:06
- mika
Re : Souris-mètre en C
#include <X11/Xlib.h>
#include <stdio.h>
int main(void)
{
Display *d;
Window root;
XEvent ev;
if(!(d = XOpenDisplay(0x0))){
return 1;
}
root = DefaultRootWindow(d);
XGrabPointer(d, root, True, PointerMotionMask,
GrabModeAsync, GrabModeAsync, root, None, CurrentTime);
for(;;)
{
XNextEvent(d, &ev);
if(ev.type == MotionNotify){
printf("la souris bouge");
/*
* place ton code ici
*/
}
}
}
Voila un bout de code event qui fonctionne. Je te laisse finir de l'adapter à tes besoins.
Dernière modification par mika (Le 20/12/2009, à 22:06)
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne
#24 Le 20/12/2009, à 22:31
- bece
Re : Souris-mètre en C
Merci je vais tester mais si il n'y a pas le XQueryPointer, comment je vais faire pour récupérer les coordonnées de la souris ?
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#25 Le 20/12/2009, à 23:03
- mika
Re : Souris-mètre en C
En fait après essais je te déconseille l'événement MotionNotify, je suis pas sur que ça capture tout (mais tu peux essayer).
Autrement ce test (qui permet juste de capturer le X et le Y) fonctionne très bien, inspire t'en.
Bon courage.
#include <X11/Xlib.h>
#include <stdio.h>
int main(void)
{
Display *d;
Window root;
Window root_return, child_return;
unsigned int mask;
int root_x, root_y, win_x, win_y;
if(!(d = XOpenDisplay(0x0))){
return 1;
}
root = DefaultRootWindow(d);
XGrabPointer(d, root, True, PointerMotionMask,
GrabModeAsync, GrabModeAsync, root, None, CurrentTime);
for(;;)
{
XQueryPointer (d, root, &root_return, &child_return, &root_x, &root_y, &win_x, &win_y, &mask);
printf(" x:%d y:%d\n",win_x,win_y);
}
}
Dernière modification par mika (Le 20/12/2009, à 23:05)
Pinard m'a tueR (in vino veritas ?)
Cherche logiciel pour tagger ses vinyles.
Hors ligne