Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

glwidget.cpp File Reference

#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <gtk/gtkgl.h>
#include <celestia/celestiacore.h>
#include "glwidget.h"
#include "actions.h"
#include "common.h"

Include dependency graph for glwidget.cpp:

Go to the source code of this file.

Functions

static gint glarea_button_press (GtkWidget *, GdkEventButton *event, AppData *app)
static gint glarea_button_release (GtkWidget *, GdkEventButton *event, AppData *app)
static gint glarea_configure (GtkWidget *widget, GdkEventConfigure *, AppData *app)
static gint glarea_expose (GtkWidget *widget, GdkEventExpose *event, AppData *app)
static gint glarea_idle (AppData *app)
static gint glarea_key_press (GtkWidget *widget, GdkEventKey *event, AppData *app)
static gint glarea_key_release (GtkWidget *widget, GdkEventKey *event, AppData *app)
static gint glarea_motion_notify (GtkWidget *, GdkEventMotion *event, AppData *app)
static gint glarea_mouse_scroll (GtkWidget *, GdkEventScroll *event, AppData *app)
static gint glDrawFrame (AppData *app)
static bool handleSpecialKey (int key, int state, bool down, AppData *app)
void initGLCallbacks (AppData *app)


Function Documentation

static gint glarea_button_press GtkWidget *  ,
GdkEventButton *  event,
AppData app
[static]
 

Definition at line 145 of file glwidget.cpp.

Referenced by initGLCallbacks().

00146 {
00147         app->lastX = (int) event->x;
00148         app->lastY = (int) event->y;
00149 
00150         if (event->button == 1)
00151                 app->core->mouseButtonDown(event->x, event->y, CelestiaCore::LeftButton);
00152         else if (event->button == 2)
00153                 app->core->mouseButtonDown(event->x, event->y, CelestiaCore::MiddleButton);
00154         else if (event->button == 3)
00155                 app->core->mouseButtonDown(event->x, event->y, CelestiaCore::RightButton);
00156 
00157         return TRUE;
00158 }

static gint glarea_button_release GtkWidget *  ,
GdkEventButton *  event,
AppData app
[static]
 

Definition at line 162 of file glwidget.cpp.

Referenced by initGLCallbacks().

00163 {
00164         app->lastX = (int) event->x;
00165         app->lastY = (int) event->y;
00166 
00167         if (event->button == 1)
00168                 app->core->mouseButtonUp(event->x, event->y, CelestiaCore::LeftButton);
00169         else if (event->button == 2)
00170                 app->core->mouseButtonUp(event->x, event->y, CelestiaCore::MiddleButton);
00171         else if (event->button == 3)
00172                 app->core->mouseButtonUp(event->x, event->y, CelestiaCore::RightButton);
00173 
00174         return TRUE;
00175 }

static gint glarea_configure GtkWidget *  widget,
GdkEventConfigure *  ,
AppData app
[static]
 

Definition at line 75 of file glwidget.cpp.

Referenced by initGLCallbacks().

00076 {
00077         GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
00078         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
00079 
00080         if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
00081                 return FALSE;
00082 
00083         app->core->resize(widget->allocation.width, widget->allocation.height);
00084 
00085         /* GConf changes only saved upon exit, since caused a lot of CPU activity
00086          * while saving intermediate steps. */
00087 
00088         gdk_gl_drawable_gl_end (gldrawable);
00089         return TRUE;
00090 }

static gint glarea_expose GtkWidget *  widget,
GdkEventExpose *  event,
AppData app
[static]
 

Definition at line 94 of file glwidget.cpp.

References glDrawFrame().

Referenced by initGLCallbacks().

00095 {
00096         /* Draw only the last expose */
00097         if (event->count > 0)
00098                 return TRUE;
00099 
00100         /* Redraw -- draw checks are made in function */
00101         return glDrawFrame(app);
00102 }

static gint glarea_idle AppData app  )  [static]
 

Definition at line 67 of file glwidget.cpp.

References glDrawFrame().

Referenced by initGLCallbacks().

00068 {
00069         app->core->tick();
00070         return glDrawFrame(app);
00071 }

static gint glarea_key_press GtkWidget *  widget,
GdkEventKey *  event,
AppData app
[static]
 

Definition at line 179 of file glwidget.cpp.

References handleSpecialKey().

Referenced by initGLCallbacks().

00180 {
00181         gtk_signal_emit_stop_by_name(GTK_OBJECT(widget),"key_press_event");
00182 
00183         switch (event->keyval)
00184         {
00185                 case GDK_Escape:
00186                         app->core->charEntered('\033');
00187                         break;
00188                 case GDK_BackSpace:
00189                         app->core->charEntered('\b');
00190                         break;
00191                 case GDK_Tab:
00192                         /* Tab has to be handled specially because keyDown and keyUp
00193                          * do not trigger auto-completion. */
00194                         app->core->charEntered(event->keyval);
00195                         break;
00196                 case GDK_ISO_Left_Tab:
00197                         /* This is what Celestia calls BackTab */
00198                         app->core->charEntered(CelestiaCore::Key_BackTab);
00199                         break;
00200                 /* Temporary until galaxy brightness added as GtkAction */
00201                 case GDK_bracketleft:
00202                         app->core->charEntered('(');
00203                         break;
00204                 case GDK_bracketright:
00205                         app->core->charEntered(')');
00206                         break;
00207                 default:
00208                         if (!handleSpecialKey(event->keyval, event->state, true, app))
00209                         {
00210                                 if ((event->string != NULL) && (*(event->string)))
00211                                 {
00212                                         /* See if our key accelerators will handle this event. */
00213                                         if((!app->core->getTextEnterMode()) && gtk_accel_groups_activate (G_OBJECT (app->mainWindow), event->keyval, GDK_SHIFT_MASK))
00214                                                 return TRUE;
00215 
00216                                         char* s = event->string;
00217 
00218                                         while (*s != '\0')
00219                                         {
00220                                                 char c = *s++;
00221                                                 app->core->charEntered(c);
00222                                         }
00223                                 }
00224                         }
00225                         if (event->state & GDK_MOD1_MASK)
00226                                 return FALSE;
00227         }
00228 
00229         return TRUE;
00230 }

static gint glarea_key_release GtkWidget *  widget,
GdkEventKey *  event,
AppData app
[static]
 

Definition at line 234 of file glwidget.cpp.

References handleSpecialKey().

Referenced by initGLCallbacks().

00235 {
00236         gtk_signal_emit_stop_by_name(GTK_OBJECT(widget),"key_release_event");
00237         return handleSpecialKey(event->keyval, event->state, false, app);
00238 }

static gint glarea_motion_notify GtkWidget *  ,
GdkEventMotion *  event,
AppData app
[static]
 

Definition at line 106 of file glwidget.cpp.

Referenced by initGLCallbacks().

00107 {
00108         int x = (int) event->x;
00109         int y = (int) event->y;
00110 
00111         int buttons = 0;
00112         if ((event->state & GDK_BUTTON1_MASK) != 0)
00113                 buttons |= CelestiaCore::LeftButton;
00114         if ((event->state & GDK_BUTTON2_MASK) != 0)
00115                 buttons |= CelestiaCore::MiddleButton;
00116         if ((event->state & GDK_BUTTON3_MASK) != 0)
00117                 buttons |= CelestiaCore::RightButton;
00118         if ((event->state & GDK_SHIFT_MASK) != 0)
00119                 buttons |= CelestiaCore::ShiftKey;
00120         if ((event->state & GDK_CONTROL_MASK) != 0)
00121                 buttons |= CelestiaCore::ControlKey;
00122 
00123         app->core->mouseMove(x - app->lastX, y - app->lastY, buttons);
00124 
00125         app->lastX = x;
00126         app->lastY = y;
00127 
00128         return TRUE;
00129 }

static gint glarea_mouse_scroll GtkWidget *  ,
GdkEventScroll *  event,
AppData app
[static]
 

Definition at line 133 of file glwidget.cpp.

Referenced by initGLCallbacks().

00134 {
00135         if (event->direction == GDK_SCROLL_UP)
00136                 app->core->mouseWheel(-1.0f, 0);
00137         else 
00138                 app->core->mouseWheel(1.0f, 0);
00139 
00140         return TRUE;
00141 }

static gint glDrawFrame AppData app  )  [static]
 

Definition at line 243 of file glwidget.cpp.

Referenced by glarea_expose(), and glarea_idle().

00244 {
00245         GdkGLContext *glcontext = gtk_widget_get_gl_context(app->glArea);
00246         GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(app->glArea);
00247 
00248         if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
00249                 return FALSE;
00250 
00251         if (app->bReady)
00252         {
00253                 app->core->draw();
00254                 gdk_gl_drawable_swap_buffers(GDK_GL_DRAWABLE(gldrawable));
00255         }
00256 
00257         gdk_gl_drawable_gl_end(gldrawable);
00258         return TRUE;
00259 }

static bool handleSpecialKey int  key,
int  state,
bool  down,
AppData app
[static]
 

Definition at line 264 of file glwidget.cpp.

References actionCaptureImage().

Referenced by glarea_key_press(), and glarea_key_release().

00265 {
00266         int k = -1;
00267 
00268         switch (key)
00269         {
00270                 case GDK_Up:
00271                         k = CelestiaCore::Key_Up;
00272                         break;
00273                 case GDK_Down:
00274                         k = CelestiaCore::Key_Down;
00275                         break;
00276                 case GDK_Left:
00277                         k = CelestiaCore::Key_Left;
00278                         break;
00279                 case GDK_Right:
00280                         k = CelestiaCore::Key_Right;
00281                         break;
00282                 case GDK_Home:
00283                         k = CelestiaCore::Key_Home;
00284                         break;
00285                 case GDK_End:
00286                         k = CelestiaCore::Key_End;
00287                         break;
00288                 case GDK_F1:
00289                         k = CelestiaCore::Key_F1;
00290                         break;
00291                 case GDK_F2:
00292                         k = CelestiaCore::Key_F2;
00293                         break;
00294                 case GDK_F3:
00295                         k = CelestiaCore::Key_F3;
00296                         break;
00297                 case GDK_F4:
00298                         k = CelestiaCore::Key_F4;
00299                         break;
00300                 case GDK_F5:
00301                         k = CelestiaCore::Key_F5;
00302                         break;
00303                 case GDK_F6:
00304                         k = CelestiaCore::Key_F6;
00305                         break;
00306                 case GDK_F7:
00307                         k = CelestiaCore::Key_F7;
00308                         break;
00309                 case GDK_F10:
00310                         if (down) actionCaptureImage(NULL, app);
00311                         break;
00312                 case GDK_KP_Insert:
00313                 case GDK_KP_0:
00314                         k = CelestiaCore::Key_NumPad0;
00315                         break;
00316                 case GDK_KP_End:
00317                 case GDK_KP_1:
00318                         k = CelestiaCore::Key_NumPad1;
00319                         break;
00320                 case  GDK_KP_Down:
00321                 case GDK_KP_2:
00322                         k = CelestiaCore::Key_NumPad2;
00323                         break;
00324                 case GDK_KP_Next:
00325                 case GDK_KP_3:
00326                         k = CelestiaCore::Key_NumPad3;
00327                         break;
00328                 case GDK_KP_Left:
00329                 case GDK_KP_4:
00330                         k = CelestiaCore::Key_NumPad4;
00331                         break;
00332                 case GDK_KP_Begin:
00333                 case GDK_KP_5:
00334                         k = CelestiaCore::Key_NumPad5;
00335                         break;
00336                 case GDK_KP_Right:
00337                 case GDK_KP_6:
00338                         k = CelestiaCore::Key_NumPad6;
00339                         break;
00340                 case GDK_KP_Home:
00341                 case GDK_KP_7:
00342                         k = CelestiaCore::Key_NumPad7;
00343                         break;
00344                 case GDK_KP_Up:
00345                 case GDK_KP_8:
00346                         k = CelestiaCore::Key_NumPad8;
00347                         break;
00348                 case GDK_KP_Prior:
00349                 case GDK_KP_9:
00350                         k = CelestiaCore::Key_NumPad9;
00351                         break;
00352                 case GDK_A:
00353                 case GDK_a:
00354                         k = 'A';
00355                         break;
00356                 case GDK_Z:
00357                 case GDK_z:
00358                         k = 'Z';
00359                         break;
00360         }
00361 
00362         if (k >= 0)
00363         {
00364                 if (down)
00365                         app->core->keyDown(k, (state & GDK_SHIFT_MASK) 
00366                                            ? CelestiaCore::ShiftKey 
00367                                            : 0);
00368                 else
00369                         app->core->keyUp(k);
00370                 return (k < 'A' || k > 'Z');
00371         }
00372         else
00373         {
00374                 return false;
00375         }
00376 }

void initGLCallbacks AppData app  ) 
 

Definition at line 41 of file glwidget.cpp.

References glarea_button_press(), glarea_button_release(), glarea_configure(), glarea_expose(), glarea_idle(), glarea_key_press(), glarea_key_release(), glarea_motion_notify(), and glarea_mouse_scroll().

Referenced by main().

00042 {
00043         g_signal_connect(GTK_OBJECT(app->glArea), "expose_event",
00044                          G_CALLBACK(glarea_expose), app);
00045         g_signal_connect(GTK_OBJECT(app->glArea), "configure_event",
00046                          G_CALLBACK(glarea_configure), app);
00047         g_signal_connect(GTK_OBJECT(app->glArea), "button_press_event",
00048                          G_CALLBACK(glarea_button_press), app);
00049         g_signal_connect(GTK_OBJECT(app->glArea), "button_release_event",
00050                          G_CALLBACK(glarea_button_release), app);
00051         g_signal_connect(GTK_OBJECT(app->glArea), "scroll_event",
00052                          G_CALLBACK(glarea_mouse_scroll), app);
00053         g_signal_connect(GTK_OBJECT(app->glArea), "motion_notify_event",
00054                          G_CALLBACK(glarea_motion_notify), app);
00055         g_signal_connect(GTK_OBJECT(app->glArea), "key_press_event",
00056                          G_CALLBACK(glarea_key_press), app);
00057         g_signal_connect(GTK_OBJECT(app->glArea), "key_release_event",
00058                          G_CALLBACK(glarea_key_release), app);
00059         
00060         /* Main call to execute redraw during GTK main loop */
00061         g_idle_add((GSourceFunc)glarea_idle, app);
00062 
00063 }


Generated on Sat Jan 14 22:31:58 2006 for Celestia by  doxygen 1.4.1