Backport auf gcc 4.6
[hackover2013-badge-firmware.git] / mock / mock / lcd-window.cc
1 #include "lcd-window.hh"
2 #include "badge_worker.hh"
3 #include "mock/event.h"
4
5 #include <gtkmm/main.h>
6
7 namespace badge2013 {
8 lcd_drawingarea::lcd_drawingarea(BaseObjectType *cobject,
9 Glib::RefPtr<Gtk::Builder> const &)
10 : Gtk::DrawingArea(cobject)
11 {
12 sig_redraw_.connect(sigc::mem_fun(*this, &lcd_drawingarea::force_redraw));
13 badge_framebuffer_clear(&framebuffer_);
14 }
15
16 lcd_drawingarea::~lcd_drawingarea() { }
17
18 void lcd_drawingarea::push_framebuffer(badge_framebuffer const &fb) {
19 framebuffer_ = fb;
20 sig_redraw_();
21 }
22
23 void lcd_drawingarea::force_redraw() {
24 Glib::RefPtr<Gdk::Window> win = get_window();
25 if(win) {
26 win->invalidate(true);
27 }
28 }
29
30 bool lcd_drawingarea::on_draw(Cairo::RefPtr<Cairo::Context> const &cr) {
31 Gtk::Allocation alloc = get_allocation();
32 double w_width = alloc.get_width ();
33 double w_height = alloc.get_height();
34
35 double c_width = w_width / BADGE_DISPLAY_WIDTH;
36 double c_height = w_height / BADGE_DISPLAY_HEIGHT;
37
38 cr->save();
39
40 for(int i = 0; i < BADGE_DISPLAY_WIDTH; ++i) {
41 for(int j = 0; j < BADGE_DISPLAY_HEIGHT; ++j) {
42 if(badge_framebuffer_pixel(&framebuffer_, i, j)) {
43 cr->rectangle(c_width * i, c_height * j,
44 c_width , c_height);
45 }
46 }
47 }
48
49 cr->fill();
50 cr->restore();
51
52 return true;
53 }
54
55 ///////////////////////////////////////////////////////
56 ///////////////////////////////////////////////////////
57 ///////////////////////////////////////////////////////
58
59 lcd_window::lcd_window(BaseObjectType *cobject, Glib::RefPtr<Gtk::Builder> const &glade)
60 : Gtk::Window(cobject),
61 running_(false),
62 worker_(this),
63 canvas_(0),
64 key_state_(0),
65 ticks_(0)
66 {
67 glade->get_widget_derived("canvas", canvas_);
68
69 Glib::signal_timeout().connect(sigc::mem_fun(*this, &lcd_window::on_game_tick ), 11);
70 sig_close_.connect(sigc::mem_fun(*this, &lcd_window::hide));
71 }
72
73 lcd_window::~lcd_window() { }
74
75 void lcd_window::push_framebuffer(badge_framebuffer const &fb) {
76 canvas_->push_framebuffer(fb);
77 }
78
79 void lcd_window::request_close() {
80 sig_close_();
81 }
82
83 bool lcd_window::on_key_press_event (GdkEventKey* event) {
84 uint8_t new_state = key_state_;
85
86 switch(event->keyval) {
87 case GDK_KEY_e: new_state |= BADGE_EVENT_KEY_UP; break;
88 case GDK_KEY_s: new_state |= BADGE_EVENT_KEY_LEFT; break;
89 case GDK_KEY_d: new_state |= BADGE_EVENT_KEY_DOWN; break;
90 case GDK_KEY_f: new_state |= BADGE_EVENT_KEY_RIGHT; break;
91 case GDK_KEY_a: new_state |= BADGE_EVENT_KEY_CENTER; break;
92 case GDK_KEY_j: new_state |= BADGE_EVENT_KEY_BTN_A; break;
93 case GDK_KEY_k: new_state |= BADGE_EVENT_KEY_BTN_B; break;
94 }
95
96 badge_event_push(badge_event_new(BADGE_EVENT_USER_INPUT, key_state_, new_state));
97 key_state_ = new_state;
98
99 return true;
100 }
101
102 bool lcd_window::on_key_release_event(GdkEventKey* event) {
103 uint8_t new_state = key_state_;
104
105 switch(event->keyval) {
106 case GDK_KEY_e: new_state &= ~BADGE_EVENT_KEY_UP; break;
107 case GDK_KEY_s: new_state &= ~BADGE_EVENT_KEY_LEFT; break;
108 case GDK_KEY_d: new_state &= ~BADGE_EVENT_KEY_DOWN; break;
109 case GDK_KEY_f: new_state &= ~BADGE_EVENT_KEY_RIGHT; break;
110 case GDK_KEY_a: new_state &= ~BADGE_EVENT_KEY_CENTER; break;
111 case GDK_KEY_j: new_state &= ~BADGE_EVENT_KEY_BTN_A; break;
112 case GDK_KEY_k: new_state &= ~BADGE_EVENT_KEY_BTN_B; break;
113 }
114
115 badge_event_push(badge_event_new(BADGE_EVENT_USER_INPUT, key_state_, new_state));
116 key_state_ = new_state;
117
118 return true;
119 }
120
121 bool lcd_window::on_game_tick() {
122 badge_event_push(badge_event_new(BADGE_EVENT_GAME_TICK, key_state_, key_state_));
123
124 return true;
125 }
126
127 void lcd_window::on_show() {
128 Gtk::Window::on_show();
129
130 if(!running_) {
131 running_ = true;
132 Glib::Thread::create(sigc::mem_fun(worker_, &badge_worker::run));
133 }
134 }
135 }
This page took 0.056896 seconds and 5 git commands to generate.