static void onKeyboardKey(unsigned char key, int, int) // // handle a keyboard press (of a normal ASCII character) // { switch (key) { case 'b': onMenuSelection(MENU_TOGGLE_BACK_FACE_CULLING); break; case 'c': onMenuSelection(MENU_TOGGLE_COORDINATE_AXES); break; case 'F': onMenuSelection(MENU_TOGGLE_FULL_SCREEN); break; case 'h': onMenuSelection(MENU_TOGGLE_VIEW_HELP); break; case 'f': onMenuSelection(MENU_USE_FACE_NORMALS); break; case 'N': onMenuSelection(MENU_TOGGLE_NORMAL_HEDGEHOG); break; case 'q': case '\027': // ESC: common alternative (was '\e', MSVC++ doesn't like that) onMenuSelection(MENU_QUIT); break; case 'r': onMenuSelection(MENU_RESET_VIEW); break; case 's': onMenuSelection(MENU_TOGGLE_STATS); break; case 'v': onMenuSelection(MENU_USE_VERTEX_NORMALS); break; case '-': onMouseButton(FRAMEWORK_WHEEL_DOWN_BUTTON, FRAMEWORK_UP, 0, 0); break; case '+': onMouseButton(FRAMEWORK_WHEEL_UP_BUTTON, FRAMEWORK_UP, 0, 0); break; } // ignore unknown keyboard keys }
void COSXScreen::handleSystemEvent(const CEvent& event, void*) { EventRef* carbonEvent = reinterpret_cast<EventRef*>(event.getData()); assert(carbonEvent != NULL); UInt32 eventClass = GetEventClass(*carbonEvent); switch (eventClass) { case kEventClassMouse: switch (GetEventKind(*carbonEvent)) { case kEventMouseDown: { UInt16 myButton; GetEventParameter(*carbonEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(myButton), NULL, &myButton); onMouseButton(true, myButton); break; } case kEventMouseUp: { UInt16 myButton; GetEventParameter(*carbonEvent, kEventParamMouseButton, typeMouseButton, NULL, sizeof(myButton), NULL, &myButton); onMouseButton(false, myButton); break; } case kEventMouseDragged: case kEventMouseMoved: { HIPoint point; GetEventParameter(*carbonEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(point), NULL, &point); onMouseMove((SInt32)point.x, (SInt32)point.y); break; } case kEventMouseWheelMoved: { EventMouseWheelAxis axis; SInt32 delta; GetEventParameter(*carbonEvent, kEventParamMouseWheelAxis, typeMouseWheelAxis, NULL, sizeof(axis), NULL, &axis); if (axis == kEventMouseWheelAxisX || axis == kEventMouseWheelAxisY) { GetEventParameter(*carbonEvent, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(delta), NULL, &delta); if (axis == kEventMouseWheelAxisX) { onMouseWheel(-mapScrollWheelToSynergy((SInt32)delta), 0); } else { onMouseWheel(0, mapScrollWheelToSynergy((SInt32)delta)); } } break; } case kSynergyEventMouseScroll: { OSStatus r; long xScroll; long yScroll; // get scroll amount r = GetEventParameter(*carbonEvent, kSynergyMouseScrollAxisX, typeLongInteger, NULL, sizeof(xScroll), NULL, &xScroll); if (r != noErr) { xScroll = 0; } r = GetEventParameter(*carbonEvent, kSynergyMouseScrollAxisY, typeLongInteger, NULL, sizeof(yScroll), NULL, &yScroll); if (r != noErr) { yScroll = 0; } if (xScroll != 0 || yScroll != 0) { onMouseWheel(-mapScrollWheelToSynergy(xScroll), mapScrollWheelToSynergy(yScroll)); } } } break; case kEventClassKeyboard: switch (GetEventKind(*carbonEvent)) { case kEventRawKeyUp: case kEventRawKeyDown: case kEventRawKeyRepeat: case kEventRawKeyModifiersChanged: onKey(*carbonEvent); break; case kEventHotKeyPressed: case kEventHotKeyReleased: onHotKey(*carbonEvent); break; } break; case kEventClassWindow: SendEventToWindow(*carbonEvent, m_userInputWindow); switch (GetEventKind(*carbonEvent)) { case kEventWindowActivated: LOG((CLOG_DEBUG1 "window activated")); break; case kEventWindowDeactivated: LOG((CLOG_DEBUG1 "window deactivated")); break; case kEventWindowFocusAcquired: LOG((CLOG_DEBUG1 "focus acquired")); break; case kEventWindowFocusRelinquish: LOG((CLOG_DEBUG1 "focus released")); break; } break; default: SendEventToEventTarget(*carbonEvent, GetEventDispatcherTarget()); break; } }
static void onKeyboardKey(unsigned char key, int, int) // // handle a keyboard press (of a normal ASCII character) // { switch (key) { case '1': onMenuSelection(MENU_TOGGLE_FIRST_PERSON); break; case ' ': onMenuSelection(MENU_STEP); break; case 'A': onMenuSelection(MENU_TOGGLE_AMBIENT_REFLECTION); break; case 'a': // no conflict, as PA ranges are disjoint onMenuSelection(MENU_TOGGLE_ANIMATION); break; case 'b': onMenuSelection(MENU_TOGGLE_BACK_FACE_CULLING); break; case 'c': onMenuSelection(MENU_TOGGLE_COORDINATE_AXES); break; case 'D': onMenuSelection(MENU_TOGGLE_DIFFUSE_REFLECTION); break; case 'F': onMenuSelection(MENU_TOGGLE_FULL_SCREEN); break; case 'h': onMenuSelection(MENU_TOGGLE_VIEW_HELP); break; case 'f': onMenuSelection(MENU_USE_FACE_NORMALS); break; case 'L': onMenuSelection(MENU_CYCLE_LIGHT_HEDGEHOG); break; case 'N': onMenuSelection(MENU_TOGGLE_NORMAL_HEDGEHOG); break; case 'P': onMenuSelection(MENU_TOGGLE_PERSPECTIVE); break; case 'p': onMenuSelection(MENU_TOGGLE_POLYGON_FILL); break; case 'q': case '\027': // ESC: common alternative (was '\e', MSVC++ doesn't like that) onMenuSelection(MENU_QUIT); break; case 'r': onMenuSelection(MENU_RESET_VIEW); break; case 'S': onMenuSelection(MENU_TOGGLE_SPECULAR_REFLECTION); break; case 's': onMenuSelection(MENU_TOGGLE_STATS); break; case 'v': onMenuSelection(MENU_USE_VERTEX_NORMALS); break; case '-': onMouseButton(FRAMEWORK_WHEEL_DOWN_BUTTON, FRAMEWORK_UP, 0, 0); break; case '+': onMouseButton(FRAMEWORK_WHEEL_UP_BUTTON, FRAMEWORK_UP, 0, 0); break; } // ignore unknown keyboard keys }
int main(int argc, char *argv[]) { SDL_Event event; SDL_TimerID timer = 0; /* nacteni modelu */ polymodel = modLoad((argc == 2) ? argv[1] : DEFAULT_MODEL); IZG_CHECK(polymodel, "Failed to read input model"); /* vytvoreni default SW rendereru */ #ifdef USE_STUDENT_RENDERER renderer = studrenCreate(); #else renderer = renCreate(); #endif /* USE_STUDENT_RENDERER */ /* pocatecni velikost bufferu */ renderer->createBuffersFunc(renderer, DEFAULT_WIDTH, DEFAULT_HEIGHT); /* inicializace SDL knihovny */ if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1 ) { IZG_SDL_ERROR("Could not initialize SDL library"); } /* nastaveni titulku okna */ #ifdef USE_STUDENT_RENDERER SDL_WM_SetCaption(PROGRAM_TITLE_STUDENT, 0); #else SDL_WM_SetCaption(PROGRAM_TITLE, 0); #endif // USE_STUDENT_RENDERER /* screen */ screen = SDL_SetVideoMode(DEFAULT_WIDTH, DEFAULT_HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE); /* enable Unicode translation */ SDL_EnableUNICODE(1); /* dalsi inicializace */ onInit(renderer, polymodel); /* nastavime timer, ktery bude volat zadanou callback fci */ timer = SDL_AddTimer(TIMER_INTERVAL, timerCallback, NULL); /* kreslime dokud nenarazime na SDL_QUIT event */ while( !quit ) { /* vycteni udalosti */ while( SDL_PollEvent(&event) ) { switch( event.type ) { /* udalost klavesnice */ case SDL_KEYDOWN: onKeyboard(&event.key); break; /* zmena velikosti okna */ case SDL_VIDEORESIZE: onResize(&event.resize); break; /* udalost mysi - pohyb */ case SDL_MOUSEMOTION: onMouseMotion(&event.motion); break; /* udalost mysi - tlacitka */ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: onMouseButton(&event.button); break; /* tiknuti timeru */ case SDL_USEREVENT: if( event.user.code == IZG_TIMER_EVENT ) { onTimer((int)SDL_GetTicks()); } break; /* SDL_QUIT event */ case SDL_QUIT: quit = 1; break; default: break; } } /* vykresleni pres SDL knihovnu */ draw(); } /* ukonceni timeru */ SDL_RemoveTimer(timer); /* ukonceni SDL */ SDL_FreeSurface(screen); /* shutdown all SDL subsystems */ SDL_Quit(); /* zrusime co jsme vytvorili a ukoncime program */ modRelease(&polymodel); renderer->releaseFunc(&renderer); return 0; }