Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

_tk.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= _tk.cc                                                   Agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definicion de elementos GUI especificos a TK                            =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include "jed_defs.h"  // Incluir antes que nada, en ese modulo se definen 
00023                        // aspectos importantes para la portabilidad del sistema
00024 
00025 #include <stdio.h>
00026 #include <string.h>
00027 #include "jed_gl.h"
00028 #include "framework/gui/_tk.h"
00029 
00030 //===========================================================================
00031 //= Chequeo de activacion de esta interfaz                                  =
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 //= Variables globales                                                      =
00046 //===========================================================================
00047 
00048 static BOOLEAN MODO_rgb_activo;          // Si es FALSE usa una paleta indexada
00049 static BOOLEAN RENDER_directo_a_hardware;// Saltarse el GUI (solo modo consola)
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     // OJO: Estas dos condiciones son constantes?
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     //printf(".");  fflush(stdout);
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 // Las siguientes tres funciones tienen el mismo espiritu que la anterior,
00098 // pero esta ves para el manejo generico del mouse.  Notese que en TK la
00099 // mascara contiene un bit para cada boton del mouse (i.e. 2^0, 2^1, ... 2^n)
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     //printf("[");  fflush(stdout);
00151     TKGUI_draw_callback(0);
00152     glFlush();    glFinish();
00153     if ( BUFFER_doble ) tkSwapBuffers();
00154     //printf("]");  fflush(stdout);
00155 }
00156 
00157 void
00158 tk_idle(void)
00159 {
00160     if ( TKGUI_tick_callback(0) ) QUIERO_pintarme_tk = TRUE;
00161     if ( QUIERO_pintarme_tk /*|| PLAY_state*/ ) tk_draw();
00162     QUIERO_pintarme_tk = FALSE;
00163 }
00164 
00165 void
00166 tk_idle_nulo(void)
00167 {
00168     if ( QUIERO_pintarme_tk /*|| PLAY_state*/ ) tk_draw();
00169     QUIERO_pintarme_tk = FALSE;
00170 }
00171 
00172 //===========================================================================
00173 //= Encapsulamiento de la interface especifica de la aplicacion             =
00174 //===========================================================================
00175 
00176 static void pintar_nulo(int /*context_id*/) {    ;    }
00177 static int evento_nulo(EVENTO_GUI * /*e*/, int /*context_id*/) { return FALSE; }
00178 static void resize_nulo(int /*x*/, int /*y*/, int /*context_id*/) {    ;    }
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 (* /* p */ )(int idc, int context_id) )
00241 {
00242     ;
00243 }
00244 
00245 void
00246 JED_TK_INTERFACE::set_multiview_callback
00247 ( void (* /* p */ )(int operacion, int id_vista, char *detalles,
00248                     char *menu, char *botonera) )
00249 {
00250     ;
00251 }
00252 
00253 BOOLEAN
00254 JED_TK_INTERFACE::crear(int * /*Argc*/, char * /*argv*/ [], 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;   // Esto puede encapsularse
00277     tkDisplayFunc(tk_draw);        // Los callbacks ya estan encapsu-
00278     tkKeyDownFunc(tk_keyboard);    // lados en jed_evnt, y estas
00279     tkMouseDownFunc(tk_mousedown); // lineas pueden encapsularse en
00280     tkMouseUpFunc(tk_mouseup);     // algo como "inicialice_tk"
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 *> * /*Controles*/, 
00300                                    REPOSITORIO_DE_ENTIDADES * /*Repositorio*/)
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 //= EOF                                                                     =
00313 //===========================================================================
00314 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.