IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques Discussion :

Xlib Events et animations.


Sujet :

Bibliothèques

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Xlib Events et animations.
    Salut les C,
    Je débute avec la Xlib et je voulait créer une animation ou plutôt un chronomètre a titre de code d'exemple expliquant le problème qui est que l'appel a la fonction de gestion d'événement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    XEvent event ;
    XNextEvent(display,&event) ;
    est bloquante ce qui est plutôt gênant pour incrémenter le compteur toutes les secondes.
    Dans le code suivant il faut cliquer avec la souris sur la fenêtre pour l'incrémenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    #include <stdio.h>
    #include <string.h>
     
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <X11/keysym.h>
     
    #include <tgmath.h>
     
    #define MAXPX 360
     
    #ifndef M_PI
      M_PI=3.1415
    #endif  
     
    struct pixels {
      float x ;
      float y ;
    } ;
     
    unsigned int pixel_idx=0 ;
     
     
    struct pixels get_coords(int position,int scale,float radius,int center_x, int center_y) {
     
      struct pixels res_px ;
      int offset=-90 ;
      float degrees=360/scale*position+offset ;
      float rad=degrees/180.0*M_PI ;
      float xpos=cos(rad) * radius + center_x ;
      float ypos=sin(rad) * radius + center_y ;
      res_px.x=xpos ;
      res_px.y=ypos ;
      return res_px ;
     
    }
     
     
    int main() {
     
     Display *display ;
     Window root_win, win ;
     GC clock_pointer_gc,clock_circle_gc ;
     XGCValues clock_circle_values, clock_pointer_values ;
     int screen_num,width=450,height=450 ;
     unsigned long background, clock_circle ;
     
     display=XOpenDisplay(NULL) ;           //set root display
     
     root_win=RootWindow(display,0) ;      // set root window
     screen_num=DefaultScreen(display) ;   // get the root screen number
     
     /* start of settings for color getting */ 
     Colormap cmap ;
     XColor xc, xc1 ;
     cmap=DefaultColormap(display,screen_num) ;
     
     XAllocNamedColor(display,cmap,"Red",&xc,&xc1) ; // getting the Red color
     background=xc.pixel ; //color for background
     
     XAllocNamedColor(display,cmap,"White",&xc,&xc1) ; // getting the white color
     clock_circle=xc.pixel ; // color for clock circle
     
     /* settings for the clock pointer */
     clock_pointer_values.foreground=BlackPixel(display,screen_num) ;
     clock_pointer_values.line_width=10 ;
     clock_pointer_values.line_style=LineSolid ;
     clock_pointer_values.cap_style=CapRound ;    /* CapNotLast, CapButt,CapRound, CapProjecting */
     
     /* settings for the clock circle */
     clock_circle_values.foreground=clock_circle ;
     clock_circle_values.line_width=1 ;
     clock_circle_values.line_style=LineSolid ;
     clock_circle_values.cap_style=CapRound ;     /* CapNotLast, CapButt,CapRound, CapProjecting */
     clock_circle_values.join_style= JoinRound ;  /* JoinMiter, JoinRound, JoinBevel */
     
     
     win=XCreateSimpleWindow(display,root_win,
    			 0,0,              //x,y
    			 width,height,    //width height
    			 0,0,        // borderwidth && bordercolor
    			 background      // background color
    			) ; 
     
     
     clock_pointer_gc=XCreateGC(display,win,GCForeground | GCLineWidth | GCLineStyle| GCCapStyle | GCJoinStyle,&clock_circle_values) ;
     clock_circle_gc=XCreateGC(display,win,GCForeground| GCLineWidth | GCLineStyle| GCCapStyle ,&clock_pointer_values) ;
     XSelectInput(display,win,ButtonPressMask  | KeyPressMask | ExposureMask | StructureNotifyMask ) ;
     
     XMapWindow(display,win) ; // start the display
     
     struct pixels tmp_px1 ;
     struct pixels tmp_px2 ;
     float center_x=450/2 ;
     float center_y=450/2 ;
     XPoint clock_circle_px[360] ;
     int clock_pointer_pos=0 ;
     for (;;) {
     
     
       XEvent event ;
       XNextEvent(display,&event) ;
       switch(event.type) {
         case Expose :
           ;
         case ConfigureNotify :
           if (event.xconfigure.width != 450 || event.xconfigure.height != 450) {
    	 width=event.xconfigure.width   ;
    	 height=event.xconfigure.height ;
    	 XClearWindow(display,event.xany.window) ;
    	 printf("size changed to width: %i ancd height: %i\n",width,height) ;
           }
           break ;
     
         case ButtonPress :  
     
     
             XClearWindow(display,event.xany.window) ;  
     
             int c ;
    	 for ( c=0 ; c < 360 ; c++) {
    	   tmp_px1=get_coords(c,360,200,450/2,450/2) ;
    	   clock_circle_px[c].x=tmp_px1.x ;
    	   clock_circle_px[c].y=tmp_px1.y ;
    	 }
     
    	 XFillPolygon(display, win, clock_pointer_gc, clock_circle_px, 360, 0, 0) ;
     
    	 tmp_px2=get_coords(clock_pointer_pos,60,150,450/2,450/2) ;
     
     
    	 clock_pointer_pos++ ;
    	 XDrawLine(display, win, clock_circle_gc,center_x,center_y,tmp_px2.x,tmp_px2.y) ;
     
     
    	 break ;
         case KeyPress : 
             printf("keycode %i == %c\n",(int) event.xkey.keycode,event.xkey.keycode) ;
             XCloseDisplay(display) ;
             return 0 ;
     
           }
      }
    }
    Et implémenter la boucle principale de cette façon n'est pas une solution car l'aiguille apparaît par flash et aléatoirement sur le cadran au lieu de chaque seconde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     for (;; ) {
       XClearWindow(display,event.xany.window) ;  
     
      int c ;
      for ( c=0 ; c < 360 ; c++) {
        tmp_px1=get_coords(c,360,200,450/2,450/2) ;
        clock_circle_px[c].x=tmp_px1.x ;
        clock_circle_px[c].y=tmp_px1.y ;
      }
     
      XFillPolygon(display, win, clock_pointer_gc, clock_circle_px, 360, 0, 0) ;
     
      tmp_px2=get_coords(clock_pointer_pos,60,150,450/2,450/2) ;
     
     
      clock_pointer_pos++ ;
      XDrawLine(display, win, clock_circle_gc,center_x,center_y,tmp_px2.x,tmp_px2.y) ;
      sleep(1)  ;     
    }
    Si vous savez comment contrôler la boucle principale de manière a pouvoir créer une animation c.a.d pourvoir la faire tourner (sans appuyer sur la souris pour afficher l'image suivante) et en pouvant gérer le timing ça serai sympa de poster.

    Merci pour vos réponses éclairées.

    PS: j'ai chercher dans la doc sans succès mais celle-ci est trop vaste (j'ai wget la doc depuis internet)

    PS1: Est-il vrai que Xlib est a la base de XWindow et de GTK ?
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    J'ai trouver la réponse sur le sujet dans un autre forum.
    Il suffit de mettre le code de l'animation dans une boucle for (; et appeler les fonctions:
    -XFlush(display)
    -sleep(1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    for (;;) {
     
             for ( c=0 ; c < 360 ; c++) {
               tmp_px1=get_coords(c,360,200,450/2,450/2) ;
               clock_circle_px[c].x=tmp_px1.x ;
               clock_circle_px[c].y=tmp_px1.y ;
             }
     
             XFillPolygon(display, win, clock_pointer_gc, clock_circle_px, 360, 0, 0) ;
     
             tmp_px2=get_coords(clock_pointer_pos,60,150,450/2,450/2) ;
     
     
             clock_pointer_pos++ ;
             XDrawLine(display, win, clock_circle_gc,center_x,center_y,tmp_px2.x,tmp_px2.y) ;
             XFlush(display) ;
             sleep(1);
     
      }
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  3. #3
    Membre du Club

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 62
    Points
    62
    Par défaut Une mini-bibliothèque basée sur XLib : EZ-Draw
    Bonjour,

    vous pourriez utiliser EZ-Draw, une mini-librairie pour l'apprentissage de la programmation événementielle et des interfaces graphiques en C. Elle tourne sur Linux, Mac OS X (Xlib) et sur Windows (win32). Tous les sources sont disponibles et vous pouvez réutiliser ce que vous voulez.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pause des events pendant animation jquery
    Par Spatule dans le forum jQuery
    Réponses: 2
    Dernier message: 12/12/2011, 13h48
  2. Réponses: 4
    Dernier message: 25/06/2007, 18h21
  3. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03
  4. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo