From: <tj...@us...> - 2008-12-01 04:28:54
|
Revision: 11250 http://alleg.svn.sourceforge.net/alleg/?rev=11250&view=rev Author: tjaden Date: 2008-12-01 04:28:46 +0000 (Mon, 01 Dec 2008) Log Message: ----------- Make nihgui only redraw if a widget requests it, or the display generates an expose event. Make the key-focus widget always lose focus if another widget is clicked, even if the other widget doesn't explicitly want key focus. Modified Paths: -------------- allegro/branches/4.9/examples/ex_blend2.cpp allegro/branches/4.9/examples/nihgui.cpp allegro/branches/4.9/examples/nihgui.hpp Modified: allegro/branches/4.9/examples/ex_blend2.cpp =================================================================== --- allegro/branches/4.9/examples/ex_blend2.cpp 2008-12-01 01:25:59 UTC (rev 11249) +++ allegro/branches/4.9/examples/ex_blend2.cpp 2008-12-01 04:28:46 UTC (rev 11250) @@ -27,15 +27,15 @@ VSlider a; public: - explicit Prog(const Theme & theme); + Prog(const Theme & theme, ALLEGRO_DISPLAY *display); void run(); private: void draw_samples(); }; -Prog::Prog(const Theme & theme) : - d(Dialog(theme, 20, 20)), +Prog::Prog(const Theme & theme, ALLEGRO_DISPLAY *display) : + d(Dialog(theme, display, 20, 20)), r(VSlider(255, 255)), g(VSlider(255, 255)), b(VSlider(255, 255)), @@ -61,13 +61,15 @@ void Prog::run() { - d.prepare(al_get_current_display()); + d.prepare(); while (!d.is_quit_requested()) { - al_clear(al_map_rgb(128, 128, 128)); - draw_samples(); - d.draw(); - al_flip_display(); + if (d.is_draw_requested()) { + al_clear(al_map_rgb(128, 128, 128)); + draw_samples(); + d.draw(); + al_flip_display(); + } d.run_step(true); } @@ -126,6 +128,7 @@ al_font_init(); al_iio_init(); + al_set_new_display_flags(ALLEGRO_GENERATE_EXPOSE_EVENTS); display = al_create_display(640, 480); if (!display) { TRACE("Unable to create display\n"); @@ -156,7 +159,7 @@ /* Don't remove these braces. */ { Theme theme(font); - Prog prog(theme); + Prog prog(theme, display); prog.run(); } Modified: allegro/branches/4.9/examples/nihgui.cpp =================================================================== --- allegro/branches/4.9/examples/nihgui.cpp 2008-12-01 01:25:59 UTC (rev 11249) +++ allegro/branches/4.9/examples/nihgui.cpp 2008-12-01 04:28:46 UTC (rev 11250) @@ -66,23 +66,28 @@ /*---------------------------------------------------------------------------*/ -Dialog::Dialog(const Theme & theme, int grid_m, int grid_n): +Dialog::Dialog(const Theme & theme, ALLEGRO_DISPLAY *display, + int grid_m, int grid_n): theme(theme), + display(display), grid_m(grid_m), grid_n(grid_n), x_padding(1), y_padding(1), + + draw_requested(true), quit_requested(false), mouse_over_widget(NULL), mouse_down_widget(NULL), - key_widget(NULL), - display(NULL) + key_widget(NULL) { this->event_queue = al_create_event_queue(); al_register_event_source(this->event_queue, (ALLEGRO_EVENT_SOURCE *) al_get_keyboard()); al_register_event_source(this->event_queue, (ALLEGRO_EVENT_SOURCE *) al_get_mouse()); + al_register_event_source(this->event_queue, + (ALLEGRO_EVENT_SOURCE *) display); } Dialog::~Dialog() @@ -111,9 +116,8 @@ widget.dialog = this; } -void Dialog::prepare(ALLEGRO_DISPLAY *display) +void Dialog::prepare() { - this->display = display; this->configure_all(); /* XXX this isn't working right in X. The mouse position is reported as @@ -164,6 +168,10 @@ on_mouse_button_up(event.mouse); break; + case ALLEGRO_EVENT_DISPLAY_EXPOSE: + this->request_draw(); + break; + default: break; } @@ -238,13 +246,15 @@ this->mouse_down_widget->on_mouse_button_down(event.x, event.y); /* transfer key focus */ - if (this->mouse_down_widget != this->key_widget && - this->mouse_down_widget->want_key_focus()) { + if (this->mouse_down_widget != this->key_widget) { if (this->key_widget) { this->key_widget->lost_key_focus(); + this->key_widget = NULL; } - this->key_widget = this->mouse_down_widget; - this->key_widget->got_key_focus(); + if (this->mouse_down_widget->want_key_focus()) { + this->key_widget = this->mouse_down_widget; + this->key_widget->got_key_focus(); + } } } @@ -272,6 +282,16 @@ return this->quit_requested; } +void Dialog::request_draw() +{ + this->draw_requested = true; +} + +bool Dialog::is_draw_requested() const +{ + return this->draw_requested; +} + void Dialog::draw() { int cx, cy, cw, ch; @@ -287,6 +307,8 @@ } al_set_clipping_rectangle(cx, cy, cw, ch); + + this->draw_requested = false; } const Theme & Dialog::get_theme() const @@ -305,11 +327,13 @@ void Button::on_mouse_button_down(int mx, int my) { this->pushed = true; + dialog->request_draw(); } void Button::on_mouse_button_up(int mx, int my) { this->pushed = false; + dialog->request_draw(); } void Button::draw() @@ -352,6 +376,7 @@ unsigned int i = (my - this->y1) / al_font_text_height(theme.font); if (i < this->items.size()) { this->selected_item = i; + dialog->request_draw(); } } @@ -415,6 +440,7 @@ double r = (double) (this->y2 - 1 - my) / (this->height() - 2); r = CLAMP(0.0, r, 1.0); cur_value = (int) (r * max_value); + dialog->request_draw(); } void VSlider::draw() @@ -454,11 +480,13 @@ void TextEntry::got_key_focus() { this->focused = true; + dialog->request_draw(); } void TextEntry::lost_key_focus() { this->focused = false; + dialog->request_draw(); } void TextEntry::on_key_down(const ALLEGRO_KEYBOARD_EVENT & event) @@ -499,6 +527,7 @@ } maybe_scroll(); + dialog->request_draw(); } void TextEntry::maybe_scroll() Modified: allegro/branches/4.9/examples/nihgui.hpp =================================================================== --- allegro/branches/4.9/examples/nihgui.hpp 2008-12-01 01:25:59 UTC (rev 11249) +++ allegro/branches/4.9/examples/nihgui.hpp 2008-12-01 04:28:46 UTC (rev 11250) @@ -68,31 +68,34 @@ class Dialog { private: const Theme & theme; + ALLEGRO_DISPLAY * display; + ALLEGRO_EVENT_QUEUE *event_queue; int grid_m; int grid_n; int x_padding; int y_padding; + bool draw_requested; bool quit_requested; std::list<Widget *> all_widgets; Widget * mouse_over_widget; Widget * mouse_down_widget; Widget * key_widget; - ALLEGRO_DISPLAY * display; - ALLEGRO_EVENT_QUEUE *event_queue; - public: - Dialog(const Theme & theme, int grid_m, int grid_n); + Dialog(const Theme & theme, ALLEGRO_DISPLAY *display, + int grid_m, int grid_n); ~Dialog(); void set_padding(int x_padding, int y_padding); void add(Widget & widget, int grid_x, int grid_y, int grid_w, int grid_h); - void prepare(ALLEGRO_DISPLAY *display); + void prepare(); void run_step(bool block); void request_quit(); bool is_quit_requested() const; + void request_draw(); + bool is_draw_requested() const; void draw(); const Theme & get_theme() const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |