From dd94925cf7cde621307ae5570e890be36c789831 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 29 Jul 2015 18:12:35 -0300 Subject: [PATCH] Move display flip logic to ui library (ui::Manager class) --- src/app/app.cpp | 2 +- src/app/commands/cmd_options.cpp | 11 ++++--- src/app/commands/cmd_undo.cpp | 5 ++- src/app/modules/gui.cpp | 54 +++++--------------------------- src/app/modules/gui.h | 4 --- src/app/ui/editor/editor.cpp | 3 +- src/ui/manager.cpp | 37 ++++++++++++++++++++-- src/ui/manager.h | 7 ++++- src/ui/system.cpp | 25 ++------------- src/ui/system.h | 8 ++--- 10 files changed, 65 insertions(+), 91 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 0ea98bbe7..9c78ddeef 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -525,7 +525,7 @@ void App::run() sendCrash.search(); // Run the GUI main message loop - gui_run(); + ui::Manager::getDefault()->run(); } // Start shell to execute scripts. diff --git a/src/app/commands/cmd_options.cpp b/src/app/commands/cmd_options.cpp index 5bb8fad4e..6fe07ac93 100644 --- a/src/app/commands/cmd_options.cpp +++ b/src/app/commands/cmd_options.cpp @@ -16,8 +16,6 @@ #include "app/ini_file.h" #include "app/launcher.h" #include "app/load_widget.h" -#include "app/modules/editors.h" -#include "app/modules/gui.h" #include "app/pref/preferences.h" #include "app/resource_finder.h" #include "app/send_crash.h" @@ -27,6 +25,7 @@ #include "base/path.h" #include "doc/image.h" #include "render/render.h" +#include "she/display.h" #include "she/system.h" #include "ui/ui.h" @@ -233,8 +232,12 @@ public: "||&OK", warnings.c_str()); } - if (reset_screen) - gui_setup_screen(); + if (reset_screen) { + ui::Manager* manager = ui::Manager::getDefault(); + she::Display* display = manager->getDisplay(); + display->setScale(newScreenScale); + manager->setDisplay(display); + } } private: diff --git a/src/app/commands/cmd_undo.cpp b/src/app/commands/cmd_undo.cpp index e3cb4fffb..0b38c3106 100644 --- a/src/app/commands/cmd_undo.cpp +++ b/src/app/commands/cmd_undo.cpp @@ -22,6 +22,7 @@ #include "app/ui/status_bar.h" #include "base/thread.h" #include "doc/sprite.h" +#include "ui/manager.h" #include "ui/system.h" namespace app { @@ -87,9 +88,7 @@ void UndoCommand::onExecute(Context* context) current_editor->drawSpriteClipped( gfx::Region(gfx::Rect(0, 0, sprite->width(), sprite->height()))); - ui::dirty_display_flag = true; - gui_feedback(); - + current_editor->getManager()->flipDisplay(); base::this_thread::sleep_for(0.01); } } diff --git a/src/app/modules/gui.cpp b/src/app/modules/gui.cpp index 857968614..da66f710c 100644 --- a/src/app/modules/gui.cpp +++ b/src/app/modules/gui.cpp @@ -75,6 +75,7 @@ class CustomizedGuiManager : public Manager protected: bool onProcessMessage(Message* msg) override; LayoutIO* onGetLayoutIO() override { return this; } + void onNewDisplayConfiguration() override; // LayoutIO implementation std::string loadLayout(Widget* widget) override; @@ -154,8 +155,6 @@ int init_module_gui() if (maximized) main_display->maximize(); - gui_setup_screen(); - // Set graphics options for next time save_gui_config(); @@ -214,47 +213,6 @@ void update_screen_for_document(const Document* document) } } -void gui_run() -{ - manager->run(); -} - -void gui_feedback() -{ - OverlayManager* overlays = OverlayManager::instance(); - - ui::update_cursor_overlay(); - - // Avoid updating a non-dirty screen over and over again. -#if 0 // TODO It doesn't work yet - if (!dirty_display_flag) - return; -#endif - - // Draw overlays. - overlays->captureOverlappedAreas(); - overlays->drawOverlays(); - - if (!manager->getDisplay()->flip()) { - // In case that the display was resized. - gui_setup_screen(); - } - else - overlays->restoreOverlappedAreas(); - - dirty_display_flag = false; -} - -// Refresh the UI display, font, etc. -void gui_setup_screen() -{ - main_display->setScale(get_screen_scale()); - ui::set_display(main_display); - manager->layout(); - - save_gui_config(); -} - void load_window_pos(Widget* window, const char *section) { // Default position @@ -397,10 +355,6 @@ bool CustomizedGuiManager::onProcessMessage(Message* msg) } break; - case kQueueProcessingMessage: - gui_feedback(); - break; - case kKeyDownMessage: { #ifdef _DEBUG // Left Shift+Ctrl+Q generates a crash (useful to test the anticrash feature) @@ -516,6 +470,12 @@ bool CustomizedGuiManager::onProcessMessage(Message* msg) return Manager::onProcessMessage(msg); } +void CustomizedGuiManager::onNewDisplayConfiguration() +{ + Manager::onNewDisplayConfiguration(); + save_gui_config(); +} + std::string CustomizedGuiManager::loadLayout(Widget* widget) { if (widget->getRoot() == NULL) diff --git a/src/app/modules/gui.h b/src/app/modules/gui.h index 0ca91eb53..8f6b39948 100644 --- a/src/app/modules/gui.h +++ b/src/app/modules/gui.h @@ -37,10 +37,6 @@ namespace app { void update_screen_for_document(const Document* document); - void gui_run(); - void gui_feedback(); - void gui_setup_screen(); - void load_window_pos(ui::Widget* window, const char *section); void save_window_pos(ui::Widget* window, const char *section); diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index d251c356b..0b55a870d 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -790,7 +790,8 @@ void Editor::flashCurrentLayer() drawSpriteClipped(gfx::Region( gfx::Rect(0, 0, m_sprite->width(), m_sprite->height()))); - gui_feedback(); + + getManager()->flipDisplay(); m_document->setExtraCelBlendMode(BlendMode::NORMAL); m_document->destroyExtraCel(); diff --git a/src/ui/manager.cpp b/src/ui/manager.cpp index f56662c8d..72e6fbbd1 100644 --- a/src/ui/manager.cpp +++ b/src/ui/manager.cpp @@ -147,6 +147,8 @@ void Manager::setDisplay(she::Display* display) { m_display = display; m_eventQueue = she::instance()->eventQueue(); + + onNewDisplayConfiguration(); } void Manager::setClipboard(she::Clipboard* clipboard) @@ -169,6 +171,24 @@ void Manager::run() loop.pumpMessages(); } +void Manager::flipDisplay() +{ + OverlayManager* overlays = OverlayManager::instance(); + + update_cursor_overlay(); + + // Draw overlays. + overlays->captureOverlappedAreas(); + overlays->drawOverlays(); + + if (!m_display->flip()) { + // In case that the display was resized. + onNewDisplayConfiguration(); + } + else + overlays->restoreOverlappedAreas(); +} + bool Manager::generateMessages() { // First check: there are windows to manage? @@ -454,6 +474,7 @@ void Manager::dispatchMessages() get_mouse_position(), _internal_get_mouse_buttons())); pumpQueue(); + flipDisplay(); } void Manager::addToGarbage(Widget* widget) @@ -1020,6 +1041,20 @@ LayoutIO* Manager::onGetLayoutIO() return NULL; } +void Manager::onNewDisplayConfiguration() +{ + if (m_display) { + int w = m_display->width() / m_display->scale(); + int h = m_display->height() / m_display->scale(); + if ((getBounds().w != w || + getBounds().h != h)) { + setBounds(gfx::Rect(0, 0, w, h)); + } + } + + _internal_set_mouse_display(m_display); +} + void Manager::onPreferredSize(PreferredSizeEvent& ev) { int w = 0, h = 0; @@ -1131,8 +1166,6 @@ void Manager::pumpQueue() gfx::Rect oldClip = surface->getClipBounds(); if (surface->intersectClipRect(paintMsg->rect())) { - dirty_display_flag = true; - #ifdef REPORT_EVENTS std::cout << " - clip(" << paintMsg->rect().x << ", " diff --git a/src/ui/manager.h b/src/ui/manager.h index 443b4bde8..20b4a9688 100644 --- a/src/ui/manager.h +++ b/src/ui/manager.h @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2001-2013 David Capello +// Copyright (C) 2001-2013, 2015 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -39,8 +39,12 @@ namespace ui { void setDisplay(she::Display* display); void setClipboard(she::Clipboard* clipboard); + // Executes the main message loop. void run(); + // Refreshes the real display with the UI content. + void flipDisplay(); + // Returns true if there are messages in the queue to be // distpatched through jmanager_dispatch_messages(). bool generateMessages(); @@ -90,6 +94,7 @@ namespace ui { void onPreferredSize(PreferredSizeEvent& ev) override; void onBroadcastMouseMessage(WidgetsList& targets) override; virtual LayoutIO* onGetLayoutIO(); + virtual void onNewDisplayConfiguration(); private: void generateSetCursorMessage(const gfx::Point& mousePos); diff --git a/src/ui/system.cpp b/src/ui/system.cpp index 1b695f911..d526828ee 100644 --- a/src/ui/system.cpp +++ b/src/ui/system.cpp @@ -24,8 +24,6 @@ namespace ui { -bool dirty_display_flag = true; - // Current mouse cursor type. static CursorType mouse_cursor_type = kNoCursor; @@ -140,8 +138,6 @@ static void update_mouse_cursor() // Hide the overlay if we are using a native cursor. update_mouse_overlay(NULL); } - - dirty_display_flag = true; } int init_system() @@ -152,7 +148,7 @@ int init_system() void exit_system() { - set_display(NULL); + _internal_set_mouse_display(NULL); update_mouse_overlay(NULL); } @@ -161,27 +157,13 @@ int clock() return she::clock_value(); } -void set_display(she::Display* display) +void _internal_set_mouse_display(she::Display* display) { CursorType cursor = get_mouse_cursor(); - set_mouse_cursor(kNoCursor); mouse_display = display; - - if (display) { - Manager* manager = Manager::getDefault(); - if (manager) { - manager->setDisplay(display); - - // Update default-manager size - if ((manager->getBounds().w != ui::display_w() || - manager->getBounds().h != ui::display_h())) { - manager->setBounds(gfx::Rect(0, 0, ui::display_w(), ui::display_h())); - } - } - + if (display) set_mouse_cursor(cursor); // Restore mouse cursor - } } int display_w() @@ -208,7 +190,6 @@ void update_cursor_overlay() if (newPos != mouse_cursor_overlay->getPosition()) { mouse_cursor_overlay->moveOverlay(newPos); - dirty_display_flag = true; } } } diff --git a/src/ui/system.h b/src/ui/system.h index a98957559..89561ee91 100644 --- a/src/ui/system.h +++ b/src/ui/system.h @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2001-2013 David Capello +// Copyright (C) 2001-2013, 2015 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -19,11 +19,6 @@ namespace ui { class Widget; - // Simple flag to indicate that something in the screen was modified - // so a flip to the real screen is needed. - extern bool dirty_display_flag; - - void set_display(she::Display* display); int display_w(); int display_h(); @@ -44,6 +39,7 @@ namespace ui { void hide_mouse_cursor(); void show_mouse_cursor(); + void _internal_set_mouse_display(she::Display* display); void _internal_no_mouse_position(); void _internal_set_mouse_position(const gfx::Point& newPos); void _internal_set_mouse_buttons(MouseButtons buttons);