Archive / / / gui_nativeapi.cpp
2007-10-02 02:39:54 UTC
previous next
#include <stack> #include <cassert> #include <gtkmm.h> #include <iostream> #include "gui_nativeapi.h" namespace GUI { class NativeAPIPrivate { private: // Variables private to the native API boost::scoped_ptr<Gtk::Main> kit; boost::scoped_ptr<Gtk::Window> window; boost::scoped_ptr<Gtk::DrawingArea> drawing_area; std::stack<boost::shared_ptr<NativeAPI::EventReceiver> > event_receivers; private: // Event handlers bool catch_expose_event(GdkEventExpose* event); bool catch_key_press_event(GdkEventKey* event); friend class NativeAPI; }; boost::scoped_ptr<NativeAPIPrivate> NativeAPI::_private; void NativeAPI::push_event_receiver(boost::shared_ptr<NativeAPI::EventReceiver> event_receiver) { if (!_private) _private.reset(new NativeAPIPrivate()); _private->event_receivers.push(event_receiver); } void NativeAPI::run_event_loop(int argc, char** argv) { assert(_private); assert(_private->event_receivers.size() > 0); _private->kit.reset(new Gtk::Main(argc, argv)); _private->window.reset(new Gtk::Window()); _private->window->set_title("nova-client"); _private->window->signal_key_press_event().connect( sigc::mem_fun(_private.get(), &NativeAPIPrivate::catch_key_press_event)); _private->drawing_area.reset(new Gtk::DrawingArea()); _private->drawing_area->signal_expose_event().connect( sigc::mem_fun(_private.get(), &NativeAPIPrivate::catch_expose_event)); _private->window->add(*_private->drawing_area); _private->drawing_area->show(); _private->kit->run(*_private->window); } bool NativeAPIPrivate::catch_expose_event(GdkEventExpose* event) { Cairo::RefPtr<Cairo::Context> cr = drawing_area->get_window()->create_cairo_context(); cr->rectangle(event->area.x, event->area.y, event->area.width, event->area.height); cr->clip(); Gtk::Allocation allocation = drawing_area->get_allocation(); //cr->scale(allocation.get_width(), allocation.get_height()); event_receivers.top()->on_redraw_event(cr, allocation.get_width(), allocation.get_height()); return true; } bool NativeAPIPrivate::catch_key_press_event(GdkEventKey* event) { static bool is_fullscreen = false; if (event->keyval == GDK_F || event->keyval == GDK_f) if (is_fullscreen) { is_fullscreen = false; window->unfullscreen(); } else { is_fullscreen = true; window->fullscreen(); } return true; } }