GL4Dummies  0.1.7
Référence du fichier gl4duw_SDL2.c

Fonctions haut-niveau de GL4Dummies pour la gestion des fenêtres avec SDL2. Plus de détails...

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "bin_tree.h"
#include "gl4duw_SDL2.h"
Graphe des dépendances par inclusion de gl4duw_SDL2.c:

Aller au code source de ce fichier.

Structures de données

struct  window_t
 structure de données englobant le nom de la fenêtre, le pointeur vers sa structure SDL, son contexte OpenGL et les pointeurs vers ses fonctions callback. Plus de détails...
 

Définitions de type

typedef struct window_t window_t
 type lié à la structure de données struct window_t. Plus de détails...
 

Fonctions

static int initGL4DUW (int argc, char **argv)
 initialise SDL et GL4Dummies. Plus de détails...
 
static window_tnewWindow (const char *name, SDL_Window *win, SDL_GLContext oglc)
 créé la fenêtre de type window_t. Plus de détails...
 
static int windowCmpFunc (const void *w1, const void *w2)
 fonction de comparaison de deux fenêtres window_t en fonction du nom pour insertion dans l'arbre binaire. Plus de détails...
 
static void freeWindows (void *window)
 libère la fenêtre Plus de détails...
 
static void quit (void)
 est appelée au moment de sortir du programme (atexit), elle libère la (les) fenêtre(s) SDL et le(s) contexte(s) OpenGL lié(s). Plus de détails...
 
static void resize (window_t *win)
 est appelée au moment du redimensionnement de la fenêtre win, elle récupère la taille de la fenêtre à l'aide de SDL_GetWindowSize puis appelle la callback resize de la fenêtre. Plus de détails...
 
static void manageEvents (void)
 dispatche les événement selon le type en utilisant les callbacks de la fenêtre ayant le focus. Plus de détails...
 
static void mainLoopBody (void *window, void **data)
 corps de la boucle principale événement/simulation/affichage Plus de détails...
 
static void fake_resize (int w, int h)
 fonction fictive liée au callback de resize de la fenêtre. Plus de détails...
 
static void fake_keydown (int keycode)
 fonction fictive liée au callback de touche clavier enfoncée. Plus de détails...
 
static void fake_keyup (int keycode)
 fonction fictive liée au callback de touche clavier relachée. Plus de détails...
 
static void fake_mousebutton (int button, int state, int x, int y)
 fonction fictive liée au callback d'un bouton de souris enfoncé ou relaché. Plus de détails...
 
static void fake_mousemotion (int x, int y)
 fonction fictive liée au callback du mouvement de la souris avec bouton enfoncé. Plus de détails...
 
static void fake_passivemousemotion (int x, int y)
 fonction fictive liée au callback du mouvement de la souris sans bouton enfoncé. Plus de détails...
 
static void fake_idle (void)
 fonction fictive liée au callback de l'état idle de la fenêtre. Plus de détails...
 
static void fake_display (void)
 fonction fictive liée au callback de display. Plus de détails...
 
static int fake_catchSDL_Event (SDL_Event *event)
 fonction fictive liée au callback de catchSDL_Event. Plus de détails...
 
void gl4duwSetGLAttributes (int glMajorVersion, int glMinorVersion, int glProfileMask, int glDoubleBuffer, int glDepthSize)
 modifie les paramètre par défaut du contexte OpenGL. Plus de détails...
 
GLboolean gl4duwCreateWindow (int argc, char **argv, const char *title, int x, int y, int width, int height, Uint32 wflags)
 créé une fenêtre SDL avec un contexte OpenGL. Plus de détails...
 
SDL_Window * gl4duwGetSDL_Window (void)
 retourne le pointeur vers la structure SDL_Window de la fenêtre courante (suite à un gl4duwCreateWindow ou gl4duwBindWindow ...). Plus de détails...
 
GLboolean gl4duwBindWindow (const char *title)
 recherche et positionne "courant" une fenêtre en fonction de son titre. Plus de détails...
 
void gl4duwMainLoop (void)
 boucle principale événement/simulation/affichage Plus de détails...
 
void gl4duwResizeFunc (void(*func)(int width, int height))
 affecte la fonction appelée lors du resize. Plus de détails...
 
void gl4duwKeyDownFunc (void(*func)(int keycode))
 affecte la fonction appelée lors de l'événement key down. Plus de détails...
 
void gl4duwKeyUpFunc (void(*func)(int keycode))
 affecte la fonction appelée lors de l'événement key up. Plus de détails...
 
void gl4duwMouseFunc (void(*func)(int button, int state, int x, int y))
 affecte la fonction appelée lorsqu'un utilisateur appuie ou relache un bouton de la souris dans la fenêtre. Plus de détails...
 
void gl4duwMotionFunc (void(*func)(int x, int y))
 affecte la fonction appelée lorsqu'un utilisateur déplace la souris dans la fenêtre tout en ayant un ou plusieurs boutons enfoncés. Plus de détails...
 
void gl4duwPassiveMotionFunc (void(*func)(int x, int y))
 affecte la fonction appelée lorsqu'un utilisateur déplace la souris dans la fenêtre sans qu'aucun bouton ne soit enfoncé Plus de détails...
 
void gl4duwIdleFunc (void(*func)(void))
 affecte la fonction appelée lors de l'idle (calcul/simulation avant affichage). Plus de détails...
 
void gl4duwDisplayFunc (void(*func)(void))
 affecte la fonction appelée lors de l'affichage. Plus de détails...
 
void gl4duwCatchSDL_EventFunc (int(*func)(SDL_Event *))
 affecte la fonction appelée lors de la gestion manuelle par le programmeur des événements SDL. Plus de détails...
 
void gl4duwEnableManageEvents (void)
 
void gl4duwDisableManageEvents (void)
 
void gl4duwGetWindowSize (int *w, int *h)
 récupère la largeur et la hauteur de la fenêtre courante. Plus de détails...
 

Variables

static bin_tree_t_btWindows = NULL
 arbre binaire contenant l'ensemble des fenêtres créées. Plus de détails...
 
static bin_tree_t ** _lastWindown = NULL
 adresse du pointeur vers le noeud référençant la dernière fenêtre créée. Plus de détails...
 
static window_t_curWindow = NULL
 la fenêtre window_t courante (coté code, Plus de détails...
 
static window_t_focusedWindow = NULL
 la fenêtre window_t ayant le focus ( Plus de détails...
 
static int _glMajorVersion = 3
 les paramètres par défaut du contexte OpenGL Plus de détails...
 
static int _glMinorVersion = 2
 
static int _glProfileMask = SDL_GL_CONTEXT_PROFILE_CORE
 
static int _glDoubleBuffer = 1
 
static int _glDepthSize = 16
 
static int _hasInit = 0
 flag permettant de savoir si la lib a déjà été initialisée Plus de détails...
 
static int _hasManageEvents = 1
 flag permettant de savoir si la lib gère les événements Plus de détails...
 

Description détaillée

Fonctions haut-niveau de GL4Dummies pour la gestion des fenêtres avec SDL2.

Auteur
Farès BELHADJ, amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
Februry 01 2016

Définition dans le fichier gl4duw_SDL2.c.

Documentation des définitions de type

◆ window_t

typedef struct window_t window_t

type lié à la structure de données struct window_t.

Documentation des fonctions

◆ fake_catchSDL_Event()

static int fake_catchSDL_Event ( SDL_Event *  event)
inlinestatic

fonction fictive liée au callback de catchSDL_Event.

93  {
94  (void)event; /* silenced warning */
95  return 0;
96 }

Référencé par gl4duwCatchSDL_EventFunc(), et newWindow().

◆ fake_display()

static void fake_display ( void  )
inlinestatic

fonction fictive liée au callback de display.

91 {}

Référencé par gl4duwDisplayFunc(), et newWindow().

◆ fake_idle()

static void fake_idle ( void  )
inlinestatic

fonction fictive liée au callback de l'état idle de la fenêtre.

89 {}

Référencé par gl4duwIdleFunc(), et newWindow().

◆ fake_keydown()

static void fake_keydown ( int  keycode)
inlinestatic

fonction fictive liée au callback de touche clavier enfoncée.

64  {
65  (void)keycode; /* silenced warning */
66 }

Référencé par gl4duwKeyDownFunc(), et newWindow().

◆ fake_keyup()

static void fake_keyup ( int  keycode)
inlinestatic

fonction fictive liée au callback de touche clavier relachée.

68  {
69  (void)keycode; /* silenced warning */
70 }

Référencé par gl4duwKeyUpFunc(), et newWindow().

◆ fake_mousebutton()

static void fake_mousebutton ( int  button,
int  state,
int  x,
int  y 
)
inlinestatic

fonction fictive liée au callback d'un bouton de souris enfoncé ou relaché.

72  {
73  (void)button; /* silenced warning */
74  (void)state; /* silenced warning */
75  (void)x; /* silenced warning */
76  (void)y; /* silenced warning */
77 }

Référencé par gl4duwMouseFunc(), et newWindow().

◆ fake_mousemotion()

static void fake_mousemotion ( int  x,
int  y 
)
inlinestatic

fonction fictive liée au callback du mouvement de la souris avec bouton enfoncé.

79  {
80  (void)x; /* silenced warning */
81  (void)y; /* silenced warning */
82 }

Référencé par gl4duwMotionFunc(), et newWindow().

◆ fake_passivemousemotion()

static void fake_passivemousemotion ( int  x,
int  y 
)
inlinestatic

fonction fictive liée au callback du mouvement de la souris sans bouton enfoncé.

84  {
85  (void)x; /* silenced warning */
86  (void)y; /* silenced warning */
87 }

Référencé par gl4duwPassiveMotionFunc(), et newWindow().

◆ fake_resize()

static void fake_resize ( int  w,
int  h 
)
inlinestatic

fonction fictive liée au callback de resize de la fenêtre.

59  {
60  (void)w; /* silenced warning */
61  (void)h; /* silenced warning */
62 }

Référencé par gl4duwResizeFunc(), et newWindow().

◆ freeWindows()

static void freeWindows ( void *  window)
inlinestatic

libère la fenêtre

Paramètres
windowest la fenêtre de type window_t.
287  {
288  free(((window_t *)window)->name);
289  SDL_GL_DeleteContext(((window_t *)window)->glContext);
290  SDL_DestroyWindow(((window_t *)window)->window);
291  free(window);
292 }

Référencé par quit().

◆ gl4duwBindWindow()

GLboolean gl4duwBindWindow ( const char *  title)

recherche et positionne "courant" une fenêtre en fonction de son titre.

La fenêtre courante est celle qui est affectée par les appelles des fonctions telles que gl4duwResizeFunc, gl4duwKeyDownFunc, gl4duwKeyUpFunc, gl4duwIdleFunc, gl4duwDisplayFunc.

Paramètres
titletitre de la fenêtre SDL recherchée.
Renvoie
GL_TRUE en cas de réussite, GL_FALSE en cas d'échec.
154  {
155  window_t wt = {(char *)title, NULL, 0, NULL, NULL, NULL,
156  NULL, NULL, NULL, NULL, NULL, NULL};
157  pair_t pair;
158  pair = btFind(&_btWindows, &wt, windowCmpFunc);
159  if(pair.compResult)
160  return GL_FALSE;
161  _curWindow = (window_t *)((*(bin_tree_t **)pair.ptr)->data);
162  SDL_GL_MakeCurrent(_curWindow->window, _curWindow->glContext);
163  return GL_TRUE;
164 }

Références _btWindows, _curWindow, btFind(), pair_t::compResult, window_t::glContext, pair_t::ptr, window_t::window, et windowCmpFunc().

◆ gl4duwCatchSDL_EventFunc()

void gl4duwCatchSDL_EventFunc ( int(*)(SDL_Event *)  func)

affecte la fonction appelée lors de la gestion manuelle par le programmeur des événements SDL.

Paramètres
funcpointeur vers fonction utilisateur à appeler pour la gestion manuelle des événements SDL. Cette fonction reçoit le pointeur vers l'événement bas-niveau SDL à traiter. Si la fonction utilisateur traitant l'événement renvoie une valeur non nulle ceci implique que l'événement est traité et ne doit plus figurer dans la liste des événements à traiter, sinon, potentiellement l'événement pourra être traité par une des "autres" fonctions "événements" spécialisées.
209  {
211 }

Références _curWindow, window_t::catchSDL_Event, et fake_catchSDL_Event().

◆ gl4duwCreateWindow()

GLboolean gl4duwCreateWindow ( int  argc,
char **  argv,
const char *  title,
int  x,
int  y,
int  width,
int  height,
Uint32  wflags 
)

créé une fenêtre SDL avec un contexte OpenGL.

Pour modifier les valeurs utilisée par le contexte OpenGL, utiliser la fonction gl4duwSetGLAttributes.

Paramètres
argcnombre d'arguments passés au programme (premier argument de la fonction main).
argvliste des arguments passés au programme (second argument de la fonction main).
titletitre de la fenêtre SDL à créer.
xla postion x de la fenêtre à créer ou GL4DW_POS_CENTERED, ou GL4DW_POS_UNDEFINED.
yla postion y de la fenêtre à créer ou GL4DW_POS_CENTERED, ou GL4DW_POS_UNDEFINED.
widthla largeur de la fenêtre à créer.
heightla hauteur de la fenêtre à créer.
wflagsdes options sur la fenêtre à créer. Peut être 0 ou une ou toute combinaison (via OR "|") de : GL4DW_FULLSCREEN, GL4DW_FULLSCREEN_DESKTOP, GL4DW_OPENGL, GL4DW_HIDDEN, GL4DW_BORDERLESS, GL4DW_RESIZABLE, GL4DW_MINIMIZED, GL4DW_MAXIMIZED, GL4DW_INPUT_GRABBED, GL4DW_ALLOW_HIGHDPI.
Renvoie
GL_TRUE en cas de réussite, GL_FALSE en cas d'échec.
Voir également
gl4duwSetGLAttributes
SDL_CreateWindow
107  {
108  (void)x; /* silenced warning */
109  (void)y; /* silenced warning */
110  SDL_Window * win = NULL;
111  SDL_GLContext oglc = NULL;
112  window_t wt = {(char *)title, NULL, 0, NULL, NULL, NULL,
113  NULL, NULL, NULL, NULL, NULL, NULL};
114  pair_t pair;
115  static int ft = 1;
116  pair = btFind(&_btWindows, &wt, windowCmpFunc);
117  if(!pair.compResult) {
118  fprintf(stderr, "%s (%d): %s:\n\tErreur lors de la creation de la fenetre SDL : une fenetre portant le meme nom existe deja\n",
119  __FILE__, __LINE__, __func__);
120  return GL_FALSE;
121  }
122  initGL4DUW(argc, argv);
123  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, _glMajorVersion);
124  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, _glMinorVersion);
125  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, _glProfileMask);
126  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, _glDoubleBuffer);
127  SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, _glDepthSize);
128  if( (win = SDL_CreateWindow(title, GL4DW_POS_CENTERED, GL4DW_POS_CENTERED,
129  width, height, GL4DW_OPENGL | wflags)) == NULL ) {
130  fprintf(stderr, "%s (%d): %s:\n\tErreur lors de la creation de la fenetre SDL : %s",
131  __FILE__, __LINE__, __func__, SDL_GetError());
132  return GL_FALSE;
133  }
134  if( (oglc = SDL_GL_CreateContext(win)) == NULL ) {
135  SDL_DestroyWindow(win);
136  fprintf(stderr, "%s (%d): %s:\n\tErreur lors de la creation du contexte OpenGL : %s",
137  __FILE__, __LINE__, __func__, SDL_GetError());
138  return GL_FALSE;
139  }
140  _curWindow = newWindow(title, win, oglc);
142  if(ft) {
143  fprintf(stderr, "OpenGL version: %s\n", glGetString(GL_VERSION));
144  fprintf(stderr, "Supported shaders version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
145  ft = 0;
146  }
147  return GL_TRUE;
148 }

Références _btWindows, _curWindow, _glDepthSize, _glDoubleBuffer, _glMajorVersion, _glMinorVersion, _glProfileMask, _lastWindown, btFind(), btInsert(), pair_t::compResult, GL4DW_OPENGL, GL4DW_POS_CENTERED, initGL4DUW(), newWindow(), pair_t::ptr, et windowCmpFunc().

◆ gl4duwDisableManageEvents()

void gl4duwDisableManageEvents ( void  )
217  {
218  _hasManageEvents = 0;
219 }

Références _hasManageEvents.

◆ gl4duwDisplayFunc()

void gl4duwDisplayFunc ( void(*)(void)  func)

affecte la fonction appelée lors de l'affichage.

Paramètres
funcpointeur vers fonction utilisateur à appeler pour réaliser le display (dessin).
205  {
206  _curWindow->display = func ? func : fake_display;
207 }

Références _curWindow, window_t::display, et fake_display().

◆ gl4duwEnableManageEvents()

void gl4duwEnableManageEvents ( void  )
213  {
214  _hasManageEvents = 1;
215 }

Références _hasManageEvents.

◆ gl4duwGetSDL_Window()

SDL_Window* gl4duwGetSDL_Window ( void  )

retourne le pointeur vers la structure SDL_Window de la fenêtre courante (suite à un gl4duwCreateWindow ou gl4duwBindWindow ...).

Renvoie
le pointeur vers la structure SDL_Window de la fenêtre courante.
150  {
151  return _curWindow ? _curWindow->window : NULL;
152 }

Références _curWindow, et window_t::window.

◆ gl4duwGetWindowSize()

void gl4duwGetWindowSize ( int *  w,
int *  h 
)

récupère la largeur et la hauteur de la fenêtre courante.

Paramètres
wpointeur vers entier où sera renseignée la largeur de la fenêtre.
hpointeur vers entier où sera renseignée la hauteur de la fenêtre.
312  {
313  SDL_GetWindowSize(_curWindow->window, w, h);
314 }

Références _curWindow, et window_t::window.

◆ gl4duwIdleFunc()

void gl4duwIdleFunc ( void(*)(void)  func)

affecte la fonction appelée lors de l'idle (calcul/simulation avant affichage).

Paramètres
funcpointeur vers fonction utilisateur à appeler pour réaliser la phase calcul/simulation.
201  {
202  _curWindow->idle = func ? func : fake_idle;
203 }

Références _curWindow, fake_idle(), et window_t::idle.

◆ gl4duwKeyDownFunc()

void gl4duwKeyDownFunc ( void(*)(int keycode)  func)

affecte la fonction appelée lors de l'événement key down.

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du de l'événement keydown. Cette dernière reçoit en paramètre le code keycode de la touche enfoncée (voir les macros GL4DK_xxx).
181  {
182  _curWindow->keydown = func ? func : fake_keydown;
183 }

Références _curWindow, fake_keydown(), et window_t::keydown.

◆ gl4duwKeyUpFunc()

void gl4duwKeyUpFunc ( void(*)(int keycode)  func)

affecte la fonction appelée lors de l'événement key up.

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du de l'événement keyup. Cette dernière reçoit en paramètre le code keycode de la touche relachée (voir les macros GL4DK_xxx).
185  {
186  _curWindow->keyup = func ? func : fake_keyup;
187 }

Références _curWindow, fake_keyup(), et window_t::keyup.

◆ gl4duwMainLoop()

void gl4duwMainLoop ( void  )

boucle principale événement/simulation/affichage

166  {
167  for(;;) {
168  if(_hasManageEvents)
169  manageEvents();
171  SDL_GL_MakeCurrent(_curWindow->window, _curWindow->glContext);
172  gl4duPrintFPS(stderr);
174  }
175 }

Références _btWindows, _curWindow, _hasManageEvents, btForAll(), gl4duPrintFPS(), gl4duUpdateShaders(), window_t::glContext, mainLoopBody(), manageEvents(), et window_t::window.

◆ gl4duwMotionFunc()

void gl4duwMotionFunc ( void(*)(int x, int y)  func)

affecte la fonction appelée lorsqu'un utilisateur déplace la souris dans la fenêtre tout en ayant un ou plusieurs boutons enfoncés.

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du déplacement "drag" de la souris. Cette dernière reçoit en paramètre : l'abscisse x de la souris et son ordonée y.
193  {
194  _curWindow->mousemotion = func ? func : fake_mousemotion;
195 }

Références _curWindow, fake_mousemotion(), et window_t::mousemotion.

◆ gl4duwMouseFunc()

void gl4duwMouseFunc ( void(*)(int button, int state, int x, int y)  func)

affecte la fonction appelée lorsqu'un utilisateur appuie ou relache un bouton de la souris dans la fenêtre.

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du de l'événement lié à la souris. Cette dernière reçoit en paramètre : le code button du bouton concerné (voir les macros GL4D_MOUSE_xxx), l'état state du bouton, l'abscisse x de la souris et son ordonée y.
189  {
190  _curWindow->mousebutton = func ? func : fake_mousebutton;
191 }

Références _curWindow, fake_mousebutton(), et window_t::mousebutton.

◆ gl4duwPassiveMotionFunc()

void gl4duwPassiveMotionFunc ( void(*)(int x, int y)  func)

affecte la fonction appelée lorsqu'un utilisateur déplace la souris dans la fenêtre sans qu'aucun bouton ne soit enfoncé

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du "drop" de la souris. Cette dernière reçoit en paramètre : l'abscisse x de la souris et son ordonée y.
197  {
199 }

Références _curWindow, fake_passivemousemotion(), et window_t::passivemousemotion.

◆ gl4duwResizeFunc()

void gl4duwResizeFunc ( void(*)(int width, int height)  func)

affecte la fonction appelée lors du resize.

Paramètres
funcpointeur vers fonction utilisateur à appeler lors du resize. Cette dernière reçoit en paramètre la largeur width et la hauteur height de la fenêtre.
177  {
178  _curWindow->resize = func ? func : fake_resize;
179 }

Références _curWindow, fake_resize(), et window_t::resize.

◆ gl4duwSetGLAttributes()

void gl4duwSetGLAttributes ( int  glMajorVersion,
int  glMinorVersion,
int  glProfileMask,
int  glDoubleBuffer,
int  glDepthSize 
)

modifie les paramètre par défaut du contexte OpenGL.

Cette fonction est à appeler avant gl4duwCreateWindow si vous souhaitez que ses paramètres soient pris en compte. Si vous souhaitez modifier plus de paramètres voir la fonction SDL_GL_SetAttribute.

Paramètres
glMajorVersionversion majeure d'OpenGL, par défaut vaut 3.
glMinorVersionversion mineure d'OpenGL, par défaut vaut 2.
glProfileMaskmodifie le profile d'OpenGL, par défaut vaut GL4DW_CONTEXT_PROFILE_CORE mais peut aussi prendre GL4DW_CONTEXT_PROFILE_COMPATIBILITY, GL4DW_CONTEXT_PROFILE_ES.
glDoubleBuffermodifie l'état actif ou non du double buffer, par défaut vaut 1 (vrai).
glDepthSizemodifie la dimension (nombre de bits utilisés) du buffer de profondeur, par défaut vaut 16.
Voir également
gl4duwCreateWindow
98  {
99  _glMajorVersion = glMajorVersion;
100  _glMinorVersion = glMinorVersion;
101  _glProfileMask = glProfileMask;
102  _glDoubleBuffer = glDoubleBuffer;
103  _glDepthSize = glDepthSize;
104 }

Références _glDepthSize, _glDoubleBuffer, _glMajorVersion, _glMinorVersion, et _glProfileMask.

◆ initGL4DUW()

static int initGL4DUW ( int  argc,
char **  argv 
)
inlinestatic

initialise SDL et GL4Dummies.

Paramètres
argcnombre d'arguments passés au programme (premier argument de la fonction main).
argvliste des arguments passés au programme (second argument de la fonction main).
Renvoie
0 en cas d'échec, !=0 sinon.
227  {
228  if(_hasInit) return 1;
229  if(SDL_Init(SDL_INIT_VIDEO) < 0) {
230  fprintf(stderr, "%s (%d): %s:\n\tErreur lors de l'initialisation de SDL : %s",
231  __FILE__, __LINE__, __func__, SDL_GetError());
232  return 0;
233  }
234  atexit(SDL_Quit);
235  atexit(quit);
236  gl4duInit(argc, argv);
237  _hasInit = 1;
238  return 1;
239 }

Références _hasInit, gl4duInit(), et quit().

Référencé par gl4duwCreateWindow().

◆ mainLoopBody()

static void mainLoopBody ( void *  window,
void **  data 
)
inlinestatic

corps de la boucle principale événement/simulation/affichage

381  {
382  (void)data; /* warning silenced */
383  window_t * w = (window_t *)window;
384  SDL_GL_MakeCurrent(w->window, w->glContext);
385  w->idle();
386  w->display();
387  SDL_GL_SwapWindow(w->window);
388 }

Références window_t::display, window_t::glContext, window_t::idle, et window_t::window.

Référencé par gl4duwMainLoop().

◆ manageEvents()

static void manageEvents ( void  )
inlinestatic

dispatche les événement selon le type en utilisant les callbacks de la fenêtre ayant le focus.

319  {
320  SDL_Event event;
321  while(SDL_PollEvent(&event)) {
323  continue;
324  switch (event.type) {
325  case SDL_KEYDOWN:
326  if(_focusedWindow)
327  _focusedWindow->keydown(event.key.keysym.sym);
328  break;
329  case SDL_KEYUP:
330  if(_focusedWindow)
331  _focusedWindow->keyup(event.key.keysym.sym);
332  break;
333  case SDL_MOUSEBUTTONDOWN:
334  case SDL_MOUSEBUTTONUP:
335  if(_focusedWindow)
336  _focusedWindow->mousebutton(event.button.button, event.button.state, event.button.x, event.button.y);
337  break;
338  case SDL_MOUSEMOTION:
339  if (_focusedWindow){
340  if (event.motion.state & (SDL_BUTTON_LMASK | SDL_BUTTON_MMASK | SDL_BUTTON_RMASK))
341  _focusedWindow->mousemotion(event.motion.x, event.motion.y);
342  else
343  _focusedWindow->passivemousemotion(event.motion.x, event.motion.y);
344  }
345  break;
346  case SDL_WINDOWEVENT: {
347  SDL_Window * focusedw = SDL_GetWindowFromID(event.window.windowID);
348  window_t wt = {(char *)SDL_GetWindowTitle(focusedw),
349  NULL,
350  0,
351  NULL,
352  NULL,
353  NULL,
354  NULL,
355  NULL,
356  NULL,
357  NULL,
358  NULL,
359  NULL};
360  pair_t pair;
361  pair = btFind(&_btWindows, &wt, windowCmpFunc);
362  _focusedWindow = (window_t *)(*(bin_tree_t **)(pair.ptr))->data;
363  switch (event.window.event) {
364  case SDL_WINDOWEVENT_RESIZED:
366  break;
367  case SDL_WINDOWEVENT_CLOSE:
368  event.type = SDL_QUIT;
369  SDL_PushEvent(&event);
370  break;
371  }
372  break;
373  }
374  case SDL_QUIT:
375  exit(0);
376  }
377  }
378 }

Références _btWindows, _focusedWindow, btFind(), window_t::catchSDL_Event, window_t::keydown, window_t::keyup, window_t::mousebutton, window_t::mousemotion, window_t::passivemousemotion, pair_t::ptr, resize(), et windowCmpFunc().

Référencé par gl4duwMainLoop().

◆ newWindow()

static window_t * newWindow ( const char *  name,
SDL_Window *  win,
SDL_GLContext  oglc 
)
inlinestatic

créé la fenêtre de type window_t.

Paramètres
nametitre de la fenêtre
winle pointeur vers la structure de fenêtre SDL
oglcla référence vers le contexte OpenGL lié à la fenêtre
Renvoie
le pointeur vers la fenêtre de type window_t créée
248  {
249  window_t * w = malloc(sizeof *w);
250  assert(w);
251  w->name = strdup(name);
252  w->window = win;
253  w->glContext = oglc;
254  w->resize = fake_resize;
255  w->keydown = fake_keydown;
256  w->keyup = fake_keyup;
260  w->idle = fake_idle;
261  w->display = fake_display;
263  return w;
264 }

Références window_t::catchSDL_Event, window_t::display, fake_catchSDL_Event(), fake_display(), fake_idle(), fake_keydown(), fake_keyup(), fake_mousebutton(), fake_mousemotion(), fake_passivemousemotion(), fake_resize(), window_t::glContext, window_t::idle, window_t::keydown, window_t::keyup, window_t::mousebutton, window_t::mousemotion, window_t::name, window_t::passivemousemotion, window_t::resize, et window_t::window.

Référencé par gl4duwCreateWindow().

◆ quit()

static void quit ( void  )
inlinestatic

est appelée au moment de sortir du programme (atexit), elle libère la (les) fenêtre(s) SDL et le(s) contexte(s) OpenGL lié(s).

297  {
299 }

Références _btWindows, btFree(), et freeWindows().

Référencé par initGL4DUW().

◆ resize()

static void resize ( window_t win)
inlinestatic

est appelée au moment du redimensionnement de la fenêtre win, elle récupère la taille de la fenêtre à l'aide de SDL_GetWindowSize puis appelle la callback resize de la fenêtre.

Paramètres
winla fenêtre redimensionnée
306  {
307  int w, h;
308  SDL_GetWindowSize(win->window, &w, &h);
309  win->resize(w, h);
310 }

Références window_t::resize, et window_t::window.

Référencé par manageEvents().

◆ windowCmpFunc()

static int windowCmpFunc ( const void *  w1,
const void *  w2 
)
inlinestatic

fonction de comparaison de deux fenêtres window_t en fonction du nom pour insertion dans l'arbre binaire.

Cette fonction utilise strcmp.

Paramètres
w1première fenêtre (de type window_t).
w2seconde fenêtre (de type window_t).
Renvoie
entier négatif, nul ou positif selon que le nom de la première soit respectivement inférieur, égal ou supérieur à la seconde.
279  {
280  return strcmp( ((window_t *)w1)->name, ((window_t *)w2)->name );
281 }

Référencé par gl4duwBindWindow(), gl4duwCreateWindow(), et manageEvents().

Documentation des variables

◆ _btWindows

bin_tree_t* _btWindows = NULL
static

arbre binaire contenant l'ensemble des fenêtres créées.

Référencé par gl4duwBindWindow(), gl4duwCreateWindow(), gl4duwMainLoop(), manageEvents(), et quit().

◆ _curWindow

◆ _focusedWindow

window_t* _focusedWindow = NULL
static

la fenêtre window_t ayant le focus (

Voir également
manageEvents).

Référencé par manageEvents().

◆ _glDepthSize

int _glDepthSize = 16
static

◆ _glDoubleBuffer

int _glDoubleBuffer = 1
static

◆ _glMajorVersion

int _glMajorVersion = 3
static

les paramètres par défaut du contexte OpenGL

Référencé par gl4duwCreateWindow(), et gl4duwSetGLAttributes().

◆ _glMinorVersion

int _glMinorVersion = 2
static

◆ _glProfileMask

int _glProfileMask = SDL_GL_CONTEXT_PROFILE_CORE
static

◆ _hasInit

int _hasInit = 0
static

flag permettant de savoir si la lib a déjà été initialisée

Référencé par initGL4DUW().

◆ _hasManageEvents

int _hasManageEvents = 1
static

flag permettant de savoir si la lib gère les événements

Référencé par gl4duwDisableManageEvents(), gl4duwEnableManageEvents(), et gl4duwMainLoop().

◆ _lastWindown

bin_tree_t** _lastWindown = NULL
static

adresse du pointeur vers le noeud référençant la dernière fenêtre créée.

Référencé par gl4duwCreateWindow().

window_t::mousemotion
void(* mousemotion)(int x, int y)
Definition: gl4duw_SDL2.c:27
fake_mousebutton
static void fake_mousebutton(int button, int state, int x, int y)
fonction fictive liée au callback d'un bouton de souris enfoncé ou relaché.
Definition: gl4duw_SDL2.c:72
btInsert
pair_t btInsert(bin_tree_t **tree, void *data, int(*compar)(const void *newData, const void *nodeData))
Definition: bin_tree.c:13
freeWindows
static void freeWindows(void *window)
libère la fenêtre
Definition: gl4duw_SDL2.c:287
pair_t::ptr
void ** ptr
Definition: bin_tree.h:23
window_t::glContext
SDL_GLContext glContext
Definition: gl4duw_SDL2.c:22
window_t::keydown
void(* keydown)(int keycode)
Definition: gl4duw_SDL2.c:24
btFree
void btFree(bin_tree_t **tree, void(*freeData)(void *))
Definition: bin_tree.c:104
GL4DW_POS_CENTERED
#define GL4DW_POS_CENTERED
Used to indicate that the window position should be centered.
Definition: gl4duw_SDL2.h:316
quit
static void quit(void)
est appelée au moment de sortir du programme (atexit), elle libère la (les) fenêtre(s) SDL et le(s) c...
Definition: gl4duw_SDL2.c:297
window_t::mousebutton
void(* mousebutton)(int button, int state, int x, int y)
Definition: gl4duw_SDL2.c:26
GL4DW_OPENGL
#define GL4DW_OPENGL
window usable with OpenGL context
Definition: gl4duw_SDL2.h:256
window_t::keyup
void(* keyup)(int keycode)
Definition: gl4duw_SDL2.c:25
_curWindow
static window_t * _curWindow
la fenêtre window_t courante (coté code,
Definition: gl4duw_SDL2.c:39
_btWindows
static bin_tree_t * _btWindows
arbre binaire contenant l'ensemble des fenêtres créées.
Definition: gl4duw_SDL2.c:35
_hasManageEvents
static int _hasManageEvents
flag permettant de savoir si la lib gère les événements
Definition: gl4duw_SDL2.c:47
btFind
pair_t btFind(bin_tree_t **tree, const void *data, int(*compar)(const void *newData, const void *nodeData))
Definition: bin_tree.c:32
_focusedWindow
static window_t * _focusedWindow
la fenêtre window_t ayant le focus (
Definition: gl4duw_SDL2.c:41
fake_catchSDL_Event
static int fake_catchSDL_Event(SDL_Event *event)
fonction fictive liée au callback de catchSDL_Event.
Definition: gl4duw_SDL2.c:93
gl4duInit
void gl4duInit(int argc, char **argv)
Initialise la bibliothèque.
Definition: gl4du.c:194
manageEvents
static void manageEvents(void)
dispatche les événement selon le type en utilisant les callbacks de la fenêtre ayant le focus.
Definition: gl4duw_SDL2.c:319
window_t
structure de données englobant le nom de la fenêtre, le pointeur vers sa structure SDL,...
Definition: gl4duw_SDL2.c:19
bin_tree_t
Definition: bin_tree.h:28
newWindow
static window_t * newWindow(const char *name, SDL_Window *win, SDL_GLContext oglc)
créé la fenêtre de type window_t.
Definition: gl4duw_SDL2.c:248
window_t::passivemousemotion
void(* passivemousemotion)(int x, int y)
Definition: gl4duw_SDL2.c:28
fake_passivemousemotion
static void fake_passivemousemotion(int x, int y)
fonction fictive liée au callback du mouvement de la souris sans bouton enfoncé.
Definition: gl4duw_SDL2.c:84
pair_t
Definition: bin_tree.h:22
window_t::window
SDL_Window * window
Definition: gl4duw_SDL2.c:21
fake_keydown
static void fake_keydown(int keycode)
fonction fictive liée au callback de touche clavier enfoncée.
Definition: gl4duw_SDL2.c:64
window_t::idle
void(* idle)(void)
Definition: gl4duw_SDL2.c:29
window_t::name
char * name
Definition: gl4duw_SDL2.c:20
pair_t::compResult
int compResult
Definition: bin_tree.h:24
fake_mousemotion
static void fake_mousemotion(int x, int y)
fonction fictive liée au callback du mouvement de la souris avec bouton enfoncé.
Definition: gl4duw_SDL2.c:79
gl4duUpdateShaders
int gl4duUpdateShaders(void)
parcours la liste des shaders shaders_list et vérifie s'il y a besoin de mettre à jour le shader (rec...
Definition: gl4du.c:659
_glMinorVersion
static int _glMinorVersion
Definition: gl4duw_SDL2.c:43
window_t::catchSDL_Event
int(* catchSDL_Event)(SDL_Event *event)
Definition: gl4duw_SDL2.c:31
_glMajorVersion
static int _glMajorVersion
les paramètres par défaut du contexte OpenGL
Definition: gl4duw_SDL2.c:43
gl4duPrintFPS
void gl4duPrintFPS(FILE *fp)
imprime dans le fichier pointé par fp le Frame-Per-Second.
Definition: gl4du.c:252
fake_display
static void fake_display(void)
fonction fictive liée au callback de display.
Definition: gl4duw_SDL2.c:91
_lastWindown
static bin_tree_t ** _lastWindown
adresse du pointeur vers le noeud référençant la dernière fenêtre créée.
Definition: gl4duw_SDL2.c:37
windowCmpFunc
static int windowCmpFunc(const void *w1, const void *w2)
fonction de comparaison de deux fenêtres window_t en fonction du nom pour insertion dans l'arbre bina...
Definition: gl4duw_SDL2.c:279
fake_idle
static void fake_idle(void)
fonction fictive liée au callback de l'état idle de la fenêtre.
Definition: gl4duw_SDL2.c:89
fake_keyup
static void fake_keyup(int keycode)
fonction fictive liée au callback de touche clavier relachée.
Definition: gl4duw_SDL2.c:68
initGL4DUW
static int initGL4DUW(int argc, char **argv)
initialise SDL et GL4Dummies.
Definition: gl4duw_SDL2.c:227
window_t::display
void(* display)(void)
Definition: gl4duw_SDL2.c:30
_hasInit
static int _hasInit
flag permettant de savoir si la lib a déjà été initialisée
Definition: gl4duw_SDL2.c:45
btForAll
void btForAll(bin_tree_t *ptr, void(*todo)(void *, void **), void **ldata)
Definition: bin_tree.c:113
_glProfileMask
static int _glProfileMask
Definition: gl4duw_SDL2.c:43
window_t::resize
void(* resize)(int w, int h)
Definition: gl4duw_SDL2.c:23
mainLoopBody
static void mainLoopBody(void *window, void **data)
corps de la boucle principale événement/simulation/affichage
Definition: gl4duw_SDL2.c:381
_glDepthSize
static int _glDepthSize
Definition: gl4duw_SDL2.c:43
fake_resize
static void fake_resize(int w, int h)
fonction fictive liée au callback de resize de la fenêtre.
Definition: gl4duw_SDL2.c:59
_glDoubleBuffer
static int _glDoubleBuffer
Definition: gl4duw_SDL2.c:43
resize
static void resize(window_t *win)
est appelée au moment du redimensionnement de la fenêtre win, elle récupère la taille de la fenêtre à...
Definition: gl4duw_SDL2.c:306