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;
}
}