// // Kommentar: Huvudprogrammets anrop till system.enter_event_loop() // ger samma principiella beteende som lab2s // anrop menu.prompt(). I system.enter_event_loop() ligger // grain i en slinga som tar emot input från användaren // (och fönsterhanteraren). Beroende på typen av input // ( händelse=event ) anropas olika funktioner i EventHandler- // objektet: // key_press vid tangentbordstryckningar. // press_event nertryckning av knapp på musen. // release_event musknappen släpps upp. // refresh_event Fönsterhanteraren talar om att fönstret // behöver ritas om, tex. om det varit dolt // och tagits fram i förgrunden igen. // // #include class MyEventHandler : public GrainWindowEventHandler { public: MyEventHandler(); void press_event( GrainWindow* w, const GrainCoord& pos, size_t button, const set& modifiers); void release_event( GrainWindow* w, const GrainCoord& pos, size_t button ); void refresh_event( GrainWindow* w, const GrainRect& bounds ); void key_event( GrainWindow* w, const string& value, const set& modifiers ); private: bool inverted_; GrainWindow *wsub; }; int main() { try { GrainXWindowingSystem system; GrainWindow* window = system.create_base_window(GrainRect(GrainCoord(0,0),system.text_size("9x15","hello u")),false,"Mytest"); MyEventHandler handler; window->set_event_handler(&handler); system.enter_event_loop(); } catch(const exception& e ) { cerr << "Main " << e.what() << endl; } } MyEventHandler::MyEventHandler() : inverted_(false) {} void MyEventHandler::press_event( GrainWindow* w, const GrainCoord& pos, size_t button, const set& modifiers) { cout << "press event " << pos << " " << button << endl; for( set::iterator i = modifiers.begin() ; i != modifiers.end() ; i++ ) cout << "press mod " << *i << endl; inverted_ = true; w->refresh(); } void MyEventHandler::release_event( GrainWindow* w, const GrainCoord& pos, size_t button ) { inverted_ = false; w->refresh(w->bounds()); } void MyEventHandler::refresh_event( GrainWindow* w, const GrainRect& bounds ) { GrainColor background = GrainColor::white; GrainColor foreground = GrainColor::black; cout << "refresh " << bounds << endl; if( inverted_ ) swap(background,foreground); w->draw_rectangle( w->bounds(), background, background ); w->draw_text( GrainCoord(0,0), "hej", "9x15", foreground ); } void MyEventHandler::key_event(GrainWindow* w, const string& value, const set& modifiers) { cout << "x" << value << "x" << endl; for( set::iterator i = modifiers.begin() ; i != modifiers.end() ; i++ ) cout << "mod " << *i << endl; if( value == "q" ) w->system().exit_event_loop(); if( value == "s" ) { GrainRect bnds = GrainRect(GrainCoord(0,0),GrainCoord(100,30)); wsub = w->create_subwindow( bnds ); } }