00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "jed_defs.h"
00023
00024
00025 #include <stdio.h>
00026 #include <string.h>
00027 #include "jed_gl.h"
00028 #include "framework/gui/_tk.h"
00029
00030
00031
00032
00033
00034 #ifndef TK_ENABLED
00035
00036 JED_GUI_CLASE_NULA(JED_TK_INTERFACE, "JED_TK_INTERFACE",
00037 "TK/aux", "tk, que viene incluida\n con las versiones de Mesa "
00038 "anteriores a la 2.5", "TK_ENABLED");
00039
00040 #endif
00041
00042 #ifdef TK_ENABLED
00043
00044
00045
00046
00047
00048 static BOOLEAN MODO_rgb_activo;
00049 static BOOLEAN RENDER_directo_a_hardware;
00050 static BOOLEAN QUIERO_pintarme_tk = FALSE;
00051 static EVENTO_GUI ESTADO_de_entradas_gui;
00052
00053 void (*TKGUI_draw_callback)(int);
00054 int (*TKGUI_tick_callback)(int);
00055 void (*TKGUI_resize_callback)(int x_tam, int y_tam, int);
00056 int (*TKGUI_keyboard_callback)(EVENTO_GUI *e, int);
00057 int (*TKGUI_mouse_callback)(EVENTO_GUI *e, int);
00058
00059 GLenum
00060 tk_keyboard(int tecla, GLenum mask)
00079 {
00080 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_KEY_DOWN;
00081 TKkeycode2JEDkeycode(EVNT_EVENTO_GUI, tecla);
00082 EVNT_EVENTO_GUI->key_mask = 0x00;
00083
00084
00085 if ( mask & TK_SHIFT ) EVNT_EVENTO_GUI->key_mask += EKEY_SHIFT;
00086 if ( mask & TK_CONTROL ) EVNT_EVENTO_GUI->key_mask += EKEY_CTRL;
00087
00088
00089
00090 if ( TKGUI_keyboard_callback(EVNT_EVENTO_GUI, 0) ) {
00091 QUIERO_pintarme_tk = TRUE;
00092 return GL_FALSE;
00093 }
00094 return GL_FALSE;
00095 }
00096
00097
00098
00099
00100
00101 #define MANEJO_DE_MOUSE_TK() \
00102 EVNT_EVENTO_GUI->mouse_button_mask = mask;\
00103 EVNT_EVENTO_GUI->mouse_old_x = EVNT_EVENTO_GUI->mouse_x;\
00104 EVNT_EVENTO_GUI->mouse_old_y = EVNT_EVENTO_GUI->mouse_y;\
00105 EVNT_EVENTO_GUI->mouse_x = x;\
00106 EVNT_EVENTO_GUI->mouse_y = y;\
00107 EVNT_EVENTO_GUI->mouse_delta_x=x-EVNT_EVENTO_GUI->mouse_old_x;\
00108 EVNT_EVENTO_GUI->mouse_delta_y=y-EVNT_EVENTO_GUI->mouse_old_y;\
00109 if ( TKGUI_mouse_callback(EVNT_EVENTO_GUI, 0) ) {\
00110 QUIERO_pintarme_tk = TRUE; \
00111 return GL_FALSE;\
00112 }\
00113 return GL_FALSE;
00114
00115
00116 GLenum
00117 tk_mousedown(int x, int y, GLenum mask)
00118 {
00119 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_DOWN;
00120 MANEJO_DE_MOUSE_TK();
00121 }
00122
00123 GLenum
00124 tk_mouseup(int x, int y, GLenum mask)
00125 {
00126 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_UP;
00127 MANEJO_DE_MOUSE_TK();
00128 }
00129
00130 GLenum
00131 tk_mousemove(int x, int y, GLenum mask)
00132 {
00133 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_MOUSE_MOVE;
00134 MANEJO_DE_MOUSE_TK();
00135 }
00136
00137 void
00138 tk_draw(void)
00149 {
00150
00151 TKGUI_draw_callback(0);
00152 glFlush(); glFinish();
00153 if ( BUFFER_doble ) tkSwapBuffers();
00154
00155 }
00156
00157 void
00158 tk_idle(void)
00159 {
00160 if ( TKGUI_tick_callback(0) ) QUIERO_pintarme_tk = TRUE;
00161 if ( QUIERO_pintarme_tk ) tk_draw();
00162 QUIERO_pintarme_tk = FALSE;
00163 }
00164
00165 void
00166 tk_idle_nulo(void)
00167 {
00168 if ( QUIERO_pintarme_tk ) tk_draw();
00169 QUIERO_pintarme_tk = FALSE;
00170 }
00171
00172
00173
00174
00175
00176 static void pintar_nulo(int ) { ; }
00177 static int evento_nulo(EVENTO_GUI * , int ) { return FALSE; }
00178 static void resize_nulo(int , int , int ) { ; }
00179
00180 static void
00181 tk_resize(int x, int y)
00182 {
00183 TKGUI_resize_callback(x, y, 0);
00184 }
00185
00186 JED_TK_INTERFACE::JED_TK_INTERFACE()
00187 {
00188 MODO_rgb_activo = TRUE;
00189 RENDER_directo_a_hardware = FALSE;
00190 BUFFER_doble = TRUE;
00191
00192 TKGUI_draw_callback = pintar_nulo;
00193 TKGUI_tick_callback = NULL;
00194 TKGUI_mouse_callback = evento_nulo;
00195 TKGUI_keyboard_callback = evento_nulo;
00196 TKGUI_resize_callback = resize_nulo;
00197 }
00198
00199 JED_TK_INTERFACE::~JED_TK_INTERFACE()
00200 {
00201 ;
00202 }
00203
00204 void JED_TK_INTERFACE::solicitar_repintado(void){;}
00205
00206 void
00207 JED_TK_INTERFACE::set_draw_callback( void (*p)(int context_id) )
00208 {
00209 TKGUI_draw_callback = p;
00210 }
00211
00212 void
00213 JED_TK_INTERFACE::set_tick_callback( int (*p)(int context_id) )
00214 {
00215 TKGUI_tick_callback = p;
00216 }
00217
00218 void
00219 JED_TK_INTERFACE::set_keyboard_callback(
00220 int (*p)(EVENTO_GUI *e, int context_id) )
00221 {
00222 TKGUI_keyboard_callback = p;
00223 }
00224
00225 void
00226 JED_TK_INTERFACE::set_mouse_callback(
00227 int (*p)(EVENTO_GUI *e, int context_id) )
00228 {
00229 TKGUI_mouse_callback = p;
00230 }
00231
00232 void
00233 JED_TK_INTERFACE::set_resize_callback(
00234 void (*p)(int x_tam, int y_tam, int context_id) )
00235 {
00236 TKGUI_resize_callback = p;
00237 }
00238
00239 void
00240 JED_TK_INTERFACE::set_ejecutor( int (* )(int idc, int context_id) )
00241 {
00242 ;
00243 }
00244
00245 void
00246 JED_TK_INTERFACE::set_multiview_callback
00247 ( void (* )(int operacion, int id_vista, char *detalles,
00248 char *menu, char *botonera) )
00249 {
00250 ;
00251 }
00252
00253 BOOLEAN
00254 JED_TK_INTERFACE::crear(int * , char * [], int x_tam, int y_tam, char *nombre)
00255 {
00256 int type;
00257
00258 tkInitPosition(0, 0, x_tam, y_tam);
00259 type = TK_DEPTH;
00260 type |= (MODO_rgb_activo) ? TK_RGB : TK_INDEX;
00261 type |= (BUFFER_doble) ? TK_DOUBLE : TK_SINGLE;
00262 type |= (RENDER_directo_a_hardware) ? TK_DIRECT : TK_INDIRECT;
00263 tkInitDisplayMode((GLenum)type);
00264 if ( tkInitWindow(nombre) == GL_FALSE ) {
00265 return FALSE;
00266 }
00267
00268 leer_gui("etc/spanish.gui");
00269
00270 return TRUE;
00271 }
00272
00273 void
00274 JED_TK_INTERFACE::ejecutar(void)
00275 {
00276 EVNT_EVENTO_GUI = &ESTADO_de_entradas_gui;
00277 tkDisplayFunc(tk_draw);
00278 tkKeyDownFunc(tk_keyboard);
00279 tkMouseDownFunc(tk_mousedown);
00280 tkMouseUpFunc(tk_mouseup);
00281 tkMouseMoveFunc(tk_mousemove);
00282 tkExposeFunc(tk_resize);
00283 tkReshapeFunc(tk_resize);
00284 if ( TKGUI_tick_callback ) tkIdleFunc(tk_idle);
00285 else tkIdleFunc(tk_idle_nulo);
00286
00287
00288 tkExec();
00289 }
00290
00291
00292 void
00293 JED_TK_INTERFACE::finalizar(void)
00294 {
00295 tkQuit();
00296 }
00297
00298 BOOLEAN
00299 JED_TK_INTERFACE::anexar_controles(LISTA <CONTROL_GUI *> * ,
00300 REPOSITORIO_DE_ENTIDADES * )
00301 {
00302 fprintf(stderr, "<JED_TK_INTERFACE> ERROR: Los controles GUI no estan\n"
00303 " implemetados en la interface actual. Intente Motif.\n");
00304 fflush(stderr);
00305 return FALSE;
00306 }
00307
00308 #endif // TK_ENABLED
00309
00310
00311
00312
00313
00314