mirror of https://github.com/aseprite/aseprite.git
				
				
				
			Added IAppHook interface for a cleaner event/hook interface.
This commit is contained in:
		
							parent
							
								
									b758b113e8
								
							
						
					
					
						commit
						f2f78377ad
					
				|  | @ -1,3 +1,10 @@ | |||
| 2009-10-14  David Capello  <davidcapello@gmail.com> | ||||
| 
 | ||||
| 	* src/core/app.h (IAppHook, AppEvent): Added IAppHook interface | ||||
| 	for a cleaner event/hook interface. | ||||
| 
 | ||||
| 	* src/core/app.cpp (Option): Converted to a class. | ||||
| 
 | ||||
| 2009-10-08  David Capello  <davidcapello@gmail.com> | ||||
| 
 | ||||
| 	* src/modules/tools.cpp (tool_marker): Modified marquee tooltip. | ||||
|  |  | |||
|  | @ -65,7 +65,7 @@ void AboutCommand::execute(Context* context) | |||
| 
 | ||||
|   box1 = jbox_new(JI_VERTICAL); | ||||
|   label1 = jlabel_new("Allegro Sprite Editor - " VERSION); | ||||
|   label2 = jlabel_new(_("Just Another Tool to Create Sprites")); | ||||
|   label2 = jlabel_new(_("Just another tool to create sprites")); | ||||
|   separator1 = ji_separator_new(NULL, JI_HORIZONTAL); | ||||
| 
 | ||||
|   if (authors_txt) { | ||||
|  |  | |||
|  | @ -40,6 +40,17 @@ | |||
| #include "widgets/statebar.h" | ||||
| #include "sprite_wrappers.h" | ||||
| 
 | ||||
| class FreeWidget : public IAppHook | ||||
| { | ||||
|   JWidget m_widget; | ||||
| public: | ||||
|   FreeWidget(JWidget widget) : m_widget(widget) { } | ||||
|   void on_event() | ||||
|   { | ||||
|     jwidget_free(m_widget); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| static JWidget window = NULL; | ||||
| 
 | ||||
| static bool brush_preview_msg_proc(JWidget widget, JMessage msg); | ||||
|  | @ -201,9 +212,7 @@ void ConfigureTools::execute(Context* context) | |||
|     HOOK(cursor_color, SIGNAL_COLORBUTTON_CHANGE, cursor_button_change_hook, 0); | ||||
|     HOOK(check_onionskin, JI_SIGNAL_CHECK_CHANGE, onionskin_check_change_hook, 0); | ||||
| 
 | ||||
|     app_add_hook(APP_EXIT, | ||||
| 		 reinterpret_cast<void(*)(void*)>(jwidget_free), | ||||
| 		 window); | ||||
|     App::instance()->add_hook(AppEvent::Exit, new FreeWidget(window)); | ||||
|   } | ||||
| 
 | ||||
|   /* default position */ | ||||
|  |  | |||
|  | @ -72,6 +72,17 @@ bool ColorCurveCommand::enabled(Context* context) | |||
|     sprite != NULL; | ||||
| } | ||||
| 
 | ||||
| class DestroyCurve : public IAppHook | ||||
| { | ||||
|   Curve* m_curve; | ||||
| public: | ||||
|   DestroyCurve(Curve* curve) : m_curve(curve) { } | ||||
|   void on_event() | ||||
|   { | ||||
|     curve_free(m_curve); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| void ColorCurveCommand::execute(Context* context) | ||||
| { | ||||
|   const CurrentSpriteReader sprite(context); | ||||
|  | @ -85,9 +96,7 @@ void ColorCurveCommand::execute(Context* context) | |||
|     curve_add_point(the_curve, curve_point_new(0, 0)); | ||||
|     curve_add_point(the_curve, curve_point_new(255, 255)); | ||||
| 
 | ||||
|     app_add_hook(APP_EXIT, | ||||
| 		 reinterpret_cast<void(*)(void*)>(curve_free), | ||||
| 		 the_curve); | ||||
|     App::instance()->add_hook(AppEvent::Exit, new DestroyCurve(the_curve)); | ||||
|   } | ||||
| 
 | ||||
|   JWidgetPtr window(load_widget("colcurv.jid", "color_curve")); | ||||
|  |  | |||
							
								
								
									
										260
									
								
								src/core/app.cpp
								
								
								
								
							
							
						
						
									
										260
									
								
								src/core/app.cpp
								
								
								
								
							|  | @ -68,34 +68,44 @@ | |||
|   #include <winalleg.h> | ||||
| #endif | ||||
| 
 | ||||
| /* options */ | ||||
| enum { | ||||
|   OPEN_GFX_FILE, | ||||
| }; | ||||
| 
 | ||||
| struct Option | ||||
| class Option | ||||
| { | ||||
|   int type; | ||||
|   char *data; | ||||
| }; | ||||
|   int m_type; | ||||
|   jstring m_data; | ||||
| 
 | ||||
| struct AppHook | ||||
| { | ||||
|   void (*proc)(void *); | ||||
|   void *data; | ||||
| public: | ||||
| 
 | ||||
|   AppHook(void (*proc)(void *), void *data) { | ||||
|     this->proc = proc; | ||||
|     this->data = data; | ||||
|   enum { | ||||
|     OpenSprite, | ||||
|   }; | ||||
| 
 | ||||
|   Option(int type, const char* data) | ||||
|   { | ||||
|     m_type = type; | ||||
|     m_data = data; | ||||
|   } | ||||
| 
 | ||||
|   int type() const { return m_type; } | ||||
|   const char* data() const { return m_data.c_str(); } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| class App::Pimpl | ||||
| { | ||||
| public: | ||||
|   const char* m_exe_name; | ||||
|   std::vector<Option*> m_options; | ||||
|   CommandsModule m_commands_modules; | ||||
|   UIContext m_ui_context; | ||||
|   int m_return_code; | ||||
|   std::vector<std::vector<IAppHook*> > m_apphooks; | ||||
| 
 | ||||
|   Pimpl() { } | ||||
|   ~Pimpl() { } | ||||
| }; | ||||
| 
 | ||||
| App* App::m_instance = NULL; | ||||
| 
 | ||||
| static char *exe_name;		      /* name of the program */ | ||||
| 
 | ||||
| static JList apphooks[APP_EVENTS]; | ||||
| 
 | ||||
| static JWidget top_window = NULL;     /* top level window (the desktop) */ | ||||
| static JWidget box_menubar = NULL;    /* box where the menu bar is */ | ||||
| static JWidget box_colorbar = NULL;   /* box where the color bar is */ | ||||
|  | @ -108,26 +118,10 @@ static JWidget colorbar = NULL;	      /* the color bar widget */ | |||
| static JWidget toolbar = NULL;	      /* the tool bar widget */ | ||||
| static JWidget tabsbar = NULL;	      /* the tabs bar widget */ | ||||
| 
 | ||||
| static JList options; /* list of "Option" structures (options to execute) */ | ||||
| static char *palette_filename = NULL; | ||||
| 
 | ||||
| static void tabsbar_select_callback(JWidget tabs, void *data, int button); | ||||
| 
 | ||||
| static void check_args(int argc, char *argv[]); | ||||
| static void usage(int status); | ||||
| 
 | ||||
| static Option *option_new(int type, const char *data); | ||||
| static void option_free(Option *option); | ||||
| 
 | ||||
| class App::Pimpl | ||||
| { | ||||
|   CommandsModule m_commands_modules; | ||||
|   UIContext m_ui_context; | ||||
| public: | ||||
|   Pimpl() { } | ||||
|   ~Pimpl() { } | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Initializes the application loading the modules, setting the | ||||
|  * graphics mode, loading the configuration and resources, etc. | ||||
|  | @ -137,11 +131,11 @@ App::App(int argc, char *argv[]) | |||
|   assert(m_instance == NULL); | ||||
|   m_instance = this; | ||||
| 
 | ||||
|   exe_name = argv[0]; | ||||
| 
 | ||||
|   /* initialize application hooks */ | ||||
|   for (int c=0; c<APP_EVENTS; ++c) | ||||
|     apphooks[c] = NULL; | ||||
|   // create private implementation data
 | ||||
|   m_pimpl = new Pimpl; | ||||
|   m_pimpl->m_exe_name = argv[0]; | ||||
|   m_pimpl->m_return_code = 0; | ||||
|   m_pimpl->m_apphooks.resize(AppEvent::NumEvents); | ||||
| 
 | ||||
|   /* initialize language suppport */ | ||||
|   intl_init(); | ||||
|  | @ -155,7 +149,7 @@ App::App(int argc, char *argv[]) | |||
|   /* init configuration */ | ||||
|   ase_config_init(); | ||||
| 
 | ||||
|   /* load the language file */ | ||||
|   // load the language file
 | ||||
|   intl_load_lang(); | ||||
| 
 | ||||
|   /* search options in the arguments */ | ||||
|  | @ -168,11 +162,8 @@ App::App(int argc, char *argv[]) | |||
|   /* install 'raster' stuff */ | ||||
|   gfxobj_init(); | ||||
| 
 | ||||
|   // create singletons
 | ||||
|   m_pimpl = new Pimpl; | ||||
| 
 | ||||
|   // install the modules
 | ||||
|   modules_init(REQUIRE_INTERFACE); | ||||
|   modules_init(ase_mode & MODE_GUI ? REQUIRE_INTERFACE: 0); | ||||
| 
 | ||||
|   /* custom default palette? */ | ||||
|   if (palette_filename) { | ||||
|  | @ -197,11 +188,8 @@ App::App(int argc, char *argv[]) | |||
|  * Runs the ASE application. In GUI mode it's the top-level window, in | ||||
|  * console/scripting it just runs the specified scripts. | ||||
|  */ | ||||
| void App::run() | ||||
| int App::run() | ||||
| { | ||||
|   Option *option; | ||||
|   JLink link; | ||||
| 
 | ||||
|   /* initialize GUI interface */ | ||||
|   if (ase_mode & MODE_GUI) { | ||||
|     JWidget view, editor; | ||||
|  | @ -217,7 +205,7 @@ void App::run() | |||
|     if (!top_window) { | ||||
|       allegro_message("Error loading data data/jids/main.jid file.\n" | ||||
| 		      "You have to reinstall the program.\n"); | ||||
|       exit(1); | ||||
|       return 1; | ||||
|     } | ||||
| 
 | ||||
|     box_menubar = jwidget_find_name(top_window, "menubar"); | ||||
|  | @ -285,23 +273,24 @@ void App::run() | |||
| /*     set_display_switch_mode(SWITCH_BACKAMNESIA); */ | ||||
|     set_display_switch_mode(SWITCH_BACKGROUND); | ||||
| 
 | ||||
|   /* procress options */ | ||||
|     // procress options
 | ||||
|   PRINTF("Processing options...\n"); | ||||
|    | ||||
|   for (std::vector<Option*>::iterator | ||||
| 	 it = m_pimpl->m_options.begin(); it != m_pimpl->m_options.end(); ++it) { | ||||
|     Option* option = *it; | ||||
| 
 | ||||
|   JI_LIST_FOR_EACH(options, link) { | ||||
|     option = reinterpret_cast<Option*>(link->data); | ||||
|     switch (option->type()) { | ||||
| 
 | ||||
|     switch (option->type) { | ||||
| 
 | ||||
|       case OPEN_GFX_FILE: { | ||||
|       case Option::OpenSprite: { | ||||
| 	/* load the sprite */ | ||||
| 	Sprite *sprite = sprite_load(option->data); | ||||
| 	Sprite *sprite = sprite_load(option->data()); | ||||
| 	if (!sprite) { | ||||
| 	  /* error */ | ||||
| 	  if (ase_mode & MODE_GUI) | ||||
| 	    jalert(_("Error<<Error loading file \"%s\"||&Close"), option->data); | ||||
| 	    jalert(_("Error<<Error loading file \"%s\"||&Close"), option->data()); | ||||
| 	  else | ||||
| 	    user_printf(_("Error loading file \"%s\"\n"), option->data); | ||||
| 	    user_printf(_("Error loading file \"%s\"\n"), option->data()); | ||||
| 	} | ||||
| 	else { | ||||
| 	  /* mount and select the sprite */ | ||||
|  | @ -314,16 +303,15 @@ void App::run() | |||
| 	    set_sprite_in_more_reliable_editor(context->get_first_sprite()); | ||||
| 
 | ||||
| 	    /* recent file */ | ||||
| 	    recent_file(option->data); | ||||
| 	    recent_file(option->data()); | ||||
| 	  } | ||||
| 	} | ||||
| 	break; | ||||
|       } | ||||
|     } | ||||
|     option_free(option); | ||||
|     delete option; | ||||
|   } | ||||
| 
 | ||||
|   jlist_free(options); | ||||
|   m_pimpl->m_options.clear(); | ||||
| 
 | ||||
|   /* just batch mode */ | ||||
|   if (ase_mode & MODE_BATCH) { | ||||
|  | @ -357,6 +345,7 @@ void App::run() | |||
|     jwidget_free(top_window); | ||||
|     top_window = NULL; | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -364,63 +353,63 @@ void App::run() | |||
|  */ | ||||
| App::~App() | ||||
| { | ||||
|   assert(m_instance == this); | ||||
|   try { | ||||
|     assert(m_instance == this); | ||||
| 
 | ||||
|   // remove ase handlers
 | ||||
|   PRINTF("Uninstalling ASE\n"); | ||||
|     // remove ase handlers
 | ||||
|     PRINTF("Uninstalling ASE\n"); | ||||
| 
 | ||||
|   app_trigger_event(APP_EXIT); | ||||
|     App::trigger_event(AppEvent::Exit); | ||||
| 
 | ||||
|   // destroy application hooks
 | ||||
|   for (int c=0; c<APP_EVENTS; ++c) { | ||||
|     if (apphooks[c] != NULL) { | ||||
|       JLink link; | ||||
|       JI_LIST_FOR_EACH(apphooks[c], link) { | ||||
| 	AppHook* apphook = reinterpret_cast<AppHook*>(link->data); | ||||
|     // destroy application hooks
 | ||||
|     for (int c=0; c<AppEvent::NumEvents; ++c) { | ||||
|       for (std::vector<IAppHook*>::iterator | ||||
| 	     it = m_pimpl->m_apphooks[c].begin();  | ||||
| 	   it != m_pimpl->m_apphooks[c].end(); ++it) { | ||||
| 	IAppHook* apphook = *it; | ||||
| 	delete apphook; | ||||
|       } | ||||
|       jlist_free(apphooks[c]); | ||||
|       apphooks[c] = NULL; | ||||
| 
 | ||||
|       // clear the list of hooks (so nobody can call the deleted hooks)
 | ||||
|       m_pimpl->m_apphooks[c].clear(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // finalize modules, configuration and core
 | ||||
|   modules_exit(); | ||||
|   delete m_pimpl; | ||||
|   editor_cursor_exit(); | ||||
|   boundary_exit(); | ||||
|     // finalize modules, configuration and core
 | ||||
|     modules_exit(); | ||||
|     delete m_pimpl; | ||||
|     editor_cursor_exit(); | ||||
|     boundary_exit(); | ||||
| 
 | ||||
|   gfxobj_exit(); | ||||
|   ase_config_exit(); | ||||
|   file_system_exit(); | ||||
|   core_exit(); | ||||
|   intl_exit(); | ||||
|     gfxobj_exit(); | ||||
|     ase_config_exit(); | ||||
|     file_system_exit(); | ||||
|     core_exit(); | ||||
|     intl_exit(); | ||||
|    | ||||
|   m_instance = NULL; | ||||
|     m_instance = NULL; | ||||
|   } | ||||
|   catch (...) { | ||||
|     allegro_message("Uncaught exception in ~App"); | ||||
|     // no throw
 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void app_add_hook(int app_event, void (*proc)(void *data), void *data) | ||||
| void App::add_hook(AppEvent::Type event, IAppHook* hook) | ||||
| { | ||||
|   assert(app_event >= 0 && app_event < APP_EVENTS); | ||||
|   assert(event >= 0 && event < AppEvent::NumEvents); | ||||
| 
 | ||||
|   if (apphooks[app_event] == NULL) | ||||
|     apphooks[app_event] = jlist_new(); | ||||
| 
 | ||||
|   jlist_append(apphooks[app_event], new AppHook(proc, data)); | ||||
|   m_pimpl->m_apphooks[event].push_back(hook); | ||||
| } | ||||
| 
 | ||||
| void app_trigger_event(int app_event) | ||||
| void App::trigger_event(AppEvent::Type event) | ||||
| { | ||||
|   assert(app_event >= 0 && app_event < APP_EVENTS); | ||||
|   assert(event >= 0 && event < AppEvent::NumEvents); | ||||
| 
 | ||||
|   if (apphooks[app_event] != NULL) { | ||||
|     JList list = apphooks[app_event]; | ||||
|     JLink link; | ||||
| 
 | ||||
|     JI_LIST_FOR_EACH(list, link) { | ||||
|       AppHook *h = (AppHook *)link->data; | ||||
|       (h->proc)(h->data); | ||||
|     } | ||||
|   for (std::vector<IAppHook*>::iterator | ||||
| 	 it = m_pimpl->m_apphooks[event].begin(); | ||||
|        it != m_pimpl->m_apphooks[event].end(); ++it) { | ||||
|     IAppHook* apphook = *it; | ||||
|     apphook->on_event(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -589,14 +578,12 @@ static void tabsbar_select_callback(JWidget tabs, void *data, int button) | |||
| /**
 | ||||
|  * Looks the inpunt arguments in the command line. | ||||
|  */ | ||||
| static void check_args(int argc, char *argv[]) | ||||
| void App::check_args(int argc, char *argv[]) | ||||
| { | ||||
|   Console console; | ||||
|   int i, n, len; | ||||
|   char *arg; | ||||
| 
 | ||||
|   options = jlist_new(); | ||||
| 
 | ||||
|   for (i=1; i<argc; i++) { | ||||
|     arg = argv[i]; | ||||
| 
 | ||||
|  | @ -610,7 +597,7 @@ static void check_args(int argc, char *argv[]) | |||
|         if (++i < argc) | ||||
| 	  palette_filename = argv[i]; | ||||
|         else | ||||
|           usage(1); | ||||
|           usage(false); | ||||
|       } | ||||
|       /* video resolution */ | ||||
|       else if (strncmp(arg+n, "resolution", len) == 0) { | ||||
|  | @ -646,8 +633,9 @@ static void check_args(int argc, char *argv[]) | |||
| 	  } | ||||
| 	} | ||||
|         else { | ||||
| 	  console.printf(_("%s: option \"res\" requires an argument\n"), exe_name); | ||||
|           usage(1); | ||||
| 	  console.printf(_("%s: option \"res\" requires an argument\n"),  | ||||
| 			 m_pimpl->m_exe_name); | ||||
|           usage(false); | ||||
| 	} | ||||
|       } | ||||
|       /* verbose mode */ | ||||
|  | @ -656,7 +644,7 @@ static void check_args(int argc, char *argv[]) | |||
|       } | ||||
|       /* show help */ | ||||
|       else if (strncmp(arg+n, "help", len) == 0) { | ||||
|         usage(0); | ||||
|         usage(true); | ||||
|       } | ||||
|       /* show version */ | ||||
|       else if (strncmp(arg+n, "version", len) == 0) { | ||||
|  | @ -666,34 +654,38 @@ static void check_args(int argc, char *argv[]) | |||
|       } | ||||
|       /* invalid argument */ | ||||
|       else { | ||||
|         usage(1); | ||||
|         usage(false); | ||||
|       } | ||||
|     } | ||||
|     /* graphic file to open */ | ||||
|     else if (n == 0) | ||||
|       jlist_append(options, option_new(OPEN_GFX_FILE, argv[i])); | ||||
|       m_pimpl->m_options.push_back(new Option(Option::OpenSprite, argv[i])); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Shows the available options for the program | ||||
|  */ | ||||
| static void usage(int status) | ||||
| void App::usage(bool show_help) | ||||
| { | ||||
|   Console console; | ||||
| 
 | ||||
|   /* show options */ | ||||
|   if (!status) { | ||||
|     /* copyright */ | ||||
|     console.printf | ||||
|       ("ase %s -- allegro-sprite-editor, %s\n" | ||||
|        COPYRIGHT "\n\n", | ||||
|        VERSION, _("The Ultimate Sprites Factory")); | ||||
|   ase_mode |= MODE_BATCH; | ||||
|   if (!show_help) | ||||
|     m_pimpl->m_return_code = 1; | ||||
| 
 | ||||
|     /* usage */ | ||||
|   // show options
 | ||||
|   if (show_help) { | ||||
|     // copyright
 | ||||
|     console.printf | ||||
|       ("ase %s -- Allegro Sprite Editor, %s\n" | ||||
|        COPYRIGHT "\n\n", | ||||
|        VERSION, _("Just another tool to create sprites")); | ||||
| 
 | ||||
|     // usage
 | ||||
|     console.printf | ||||
|       ("%s\n  %s [%s] [%s]...\n\n", | ||||
|        _("Usage:"), exe_name, _("OPTION"), _("FILE")); | ||||
|        _("Usage:"), m_pimpl->m_exe_name, _("OPTION"), _("FILE")); | ||||
| 
 | ||||
|     /* options */ | ||||
|     console.printf | ||||
|  | @ -713,28 +705,12 @@ static void usage(int status) | |||
| 
 | ||||
|     /* web-site */ | ||||
|     console.printf | ||||
|       ("%s: %s\n%s\n\n  %s\n\n", | ||||
|       ("%s: %s\n\n", | ||||
|        _("Find more information in the ASE's official web site at:"), WEBSITE); | ||||
|   } | ||||
|   /* how to show options */ | ||||
|   else { | ||||
|     console.printf(_("Try \"%s --help\" for more information.\n"), exe_name); | ||||
|     console.printf(_("Try \"%s --help\" for more information.\n"),  | ||||
| 		   m_pimpl->m_exe_name); | ||||
|   } | ||||
|   exit(status); | ||||
| } | ||||
| 
 | ||||
| static Option *option_new(int type, const char *data) | ||||
| { | ||||
|   Option *option = new Option; | ||||
| 
 | ||||
|   option->type = type; | ||||
|   option->data = jstrdup(data); | ||||
| 
 | ||||
|   return option; | ||||
| } | ||||
| 
 | ||||
| static void option_free(Option* option) | ||||
| { | ||||
|   jfree(option->data); | ||||
|   delete option; | ||||
| } | ||||
|  |  | |||
|  | @ -21,19 +21,30 @@ | |||
| 
 | ||||
| #include "jinete/jbase.h" | ||||
| 
 | ||||
| // enumeration of ASE events in the highest application level
 | ||||
| enum { | ||||
|   APP_EXIT, | ||||
|   APP_PALETTE_CHANGE, | ||||
|   APP_EVENTS | ||||
| }; | ||||
| 
 | ||||
| class Layer; | ||||
| class Sprite; | ||||
| class Params; | ||||
| class Command; | ||||
| class CommandsModule; | ||||
| 
 | ||||
| class AppEvent | ||||
| { | ||||
| public: | ||||
|   // enumeration of ASE events in the highest application level
 | ||||
|   enum Type { | ||||
|     Exit, | ||||
|     PaletteChange, | ||||
|     NumEvents | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| class IAppHook | ||||
| { | ||||
| public: | ||||
|   virtual ~IAppHook() { } | ||||
|   virtual void on_event() = 0; | ||||
| }; | ||||
| 
 | ||||
| class App | ||||
| { | ||||
|   static App* m_instance; | ||||
|  | @ -47,11 +58,16 @@ public: | |||
| 
 | ||||
|   static App* instance() { return m_instance; } | ||||
| 
 | ||||
|   void run(); | ||||
| }; | ||||
|   int run(); | ||||
| 
 | ||||
| void app_add_hook(int app_event, void (*proc)(void *data), void *data); | ||||
| void app_trigger_event(int app_event); | ||||
|   void add_hook(AppEvent::Type event, IAppHook* hook); | ||||
|   void trigger_event(AppEvent::Type event); | ||||
| 
 | ||||
| private: | ||||
|   void check_args(int argc, char *argv[]); | ||||
|   void usage(bool show_help); | ||||
|    | ||||
| }; | ||||
| 
 | ||||
| void app_refresh_screen(const Sprite* sprite); | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| #include "modules/tools.h" | ||||
| 
 | ||||
| #define DEF_MODULE(name, reqs) \ | ||||
|   { #name, init_module_##name, exit_module_##name, (reqs), FALSE } | ||||
|   { #name, init_module_##name, exit_module_##name, (reqs), false } | ||||
| 
 | ||||
| typedef struct Module | ||||
| { | ||||
|  | @ -38,7 +38,7 @@ typedef struct Module | |||
|   int (*init)(); | ||||
|   void (*exit)(); | ||||
|   int reqs; | ||||
|   int installed; | ||||
|   bool installed; | ||||
| } Module; | ||||
| 
 | ||||
| static Module module[] = | ||||
|  | @ -46,9 +46,9 @@ static Module module[] = | |||
|   /* This sorting is very important because last modules depend of
 | ||||
|      first ones.  */ | ||||
| 
 | ||||
|   DEF_MODULE(palette,		REQUIRE_INTERFACE), | ||||
|   DEF_MODULE(effect,		REQUIRE_INTERFACE), | ||||
|   DEF_MODULE(tools,		REQUIRE_INTERFACE), | ||||
|   DEF_MODULE(palette,		0), | ||||
|   DEF_MODULE(effect,		0), | ||||
|   DEF_MODULE(tools,		0), | ||||
|   DEF_MODULE(graphics,		REQUIRE_INTERFACE), | ||||
|   DEF_MODULE(gui,		REQUIRE_INTERFACE), | ||||
|   DEF_MODULE(recent,		REQUIRE_INTERFACE), | ||||
|  | @ -61,13 +61,13 @@ static int modules = sizeof(module) / sizeof(Module); | |||
| void modules_init(int requirements) | ||||
| { | ||||
|   for (int c=0; c<modules; c++) | ||||
|     if (module[c].reqs & requirements) { | ||||
|     if ((module[c].reqs & requirements) == module[c].reqs) { | ||||
|       PRINTF("Installing module: %s\n", module[c].name); | ||||
| 
 | ||||
|       if ((*module[c].init)() < 0) | ||||
| 	throw ase_exception(std::string("Error initializing module: ") + module[c].name); | ||||
| 
 | ||||
|       module[c].installed = TRUE; | ||||
|       module[c].installed = true; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -77,6 +77,6 @@ void modules_exit() | |||
|     if (module[c].installed) { | ||||
|       PRINTF("Unstalling module: %s\n", module[c].name); | ||||
|       (*module[c].exit)(); | ||||
|       module[c].installed = FALSE; | ||||
|       module[c].installed = false; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -46,6 +46,17 @@ | |||
| #  define MAX_PATH 4096		/* TODO this is needed for Linux, is it correct? */ | ||||
| #endif | ||||
| 
 | ||||
| class FreeList : public IAppHook | ||||
| { | ||||
|   JList m_list; | ||||
| public: | ||||
|   FreeList(JList list) : m_list(list) { } | ||||
|   void on_event() | ||||
|   { | ||||
|     jlist_free(m_list); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /* Variables used only to maintain the history of navigation. */ | ||||
| static JLink navigation_position = NULL; /* current position in the navigation history */ | ||||
| static JList navigation_history = NULL;	/* set of FileItems navigated */ | ||||
|  | @ -89,9 +100,8 @@ jstring ase_file_selector(const jstring& message, | |||
| 
 | ||||
|   if (!navigation_history) { | ||||
|     navigation_history = jlist_new(); | ||||
|     app_add_hook(APP_EXIT, | ||||
| 		 reinterpret_cast<void(*)(void*)>(jlist_free), | ||||
| 		 navigation_history); | ||||
|     App::instance()->add_hook(AppEvent::Exit,  | ||||
| 			      new FreeList(navigation_history)); | ||||
|   } | ||||
| 
 | ||||
|   // we have to find where the user should begin to browse files (start_folder)
 | ||||
|  |  | |||
|  | @ -52,13 +52,14 @@ public: | |||
|  */ | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   int status = 1;		// 1 = error
 | ||||
|   try { | ||||
|     Allegro allegro; | ||||
|     try { | ||||
|       Jinete jinete; | ||||
|       App app(argc, argv); | ||||
| 
 | ||||
|       app.run(); | ||||
|       status = app.run(); | ||||
|     } | ||||
|     catch (std::exception& e) { | ||||
|       allegro_message(e.what()); | ||||
|  | @ -70,7 +71,7 @@ int main(int argc, char *argv[]) | |||
|   catch (...) { | ||||
|     printf("Uncaught exception"); | ||||
|   } | ||||
|   return 0; | ||||
|   return status; | ||||
| } | ||||
| 
 | ||||
| END_OF_MAIN(); | ||||
|  |  | |||
|  | @ -68,34 +68,32 @@ static void convert_data_to_bitmap(DATA *data, BITMAP **bmp) | |||
|   } | ||||
| } | ||||
| 
 | ||||
| static void gen_gfx(void *data) | ||||
| class GenGfx : public IAppHook | ||||
| { | ||||
|   int c; | ||||
| public: | ||||
|   void on_event() | ||||
|   { | ||||
|     for (int c=0; c<GFX_BITMAP_COUNT; c++) { | ||||
|       if (gfx_bmps[c]) | ||||
| 	destroy_bitmap(gfx_bmps[c]); | ||||
| 
 | ||||
|   for (c=0; c<GFX_BITMAP_COUNT; c++) { | ||||
|     if (gfx_bmps[c]) | ||||
|       destroy_bitmap(gfx_bmps[c]); | ||||
| 
 | ||||
|     gfx_bmps[c] = NULL; | ||||
|       gfx_bmps[c] = NULL; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| }; | ||||
| 
 | ||||
| int init_module_graphics() | ||||
| { | ||||
|   int c; | ||||
|    | ||||
|   for (c=0; c<GFX_BITMAP_COUNT; c++) | ||||
|   for (int c=0; c<GFX_BITMAP_COUNT; c++) | ||||
|     gfx_bmps[c] = NULL; | ||||
| 
 | ||||
|   app_add_hook(APP_PALETTE_CHANGE, gen_gfx, NULL); | ||||
|   App::instance()->add_hook(AppEvent::PaletteChange, new GenGfx); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| void exit_module_graphics() | ||||
| { | ||||
|   int c; | ||||
| 
 | ||||
|   for (c=0; c<GFX_BITMAP_COUNT; c++) | ||||
|   for (int c=0; c<GFX_BITMAP_COUNT; c++) | ||||
|     if (gfx_bmps[c]) { | ||||
|       destroy_bitmap(gfx_bmps[c]); | ||||
|       gfx_bmps[c] = NULL; | ||||
|  |  | |||
|  | @ -149,7 +149,11 @@ static void save_gui_config(); | |||
| static bool button_with_icon_msg_proc(JWidget widget, JMessage msg); | ||||
| static bool manager_msg_proc(JWidget widget, JMessage msg); | ||||
| 
 | ||||
| static void regen_theme_and_fixup_icons(void *data); | ||||
| class RegenIcons : public IAppHook | ||||
| { | ||||
| public: | ||||
|   void on_event(); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Used by set_display_switch_callback(SWITCH_IN, ...). | ||||
|  | @ -298,7 +302,7 @@ int init_module_gui() | |||
|   reload_default_font(); | ||||
| 
 | ||||
|   /* hook for palette change to regenerate the theme */ | ||||
|   app_add_hook(APP_PALETTE_CHANGE, regen_theme_and_fixup_icons, NULL); | ||||
|   App::instance()->add_hook(AppEvent::PaletteChange, new RegenIcons()); | ||||
| 
 | ||||
|   /* icon buttons */ | ||||
|   icon_buttons = jlist_new(); | ||||
|  | @ -955,9 +959,9 @@ void* get_monitor_data(Monitor* monitor) | |||
|   return monitor->data; | ||||
| } | ||||
| 
 | ||||
| /**********************************************************************/ | ||||
| /* manager event handler */ | ||||
| 
 | ||||
| /**
 | ||||
|  * Manager event handler. | ||||
|  */ | ||||
| static bool manager_msg_proc(JWidget widget, JMessage msg) | ||||
| { | ||||
|   switch (msg->type) { | ||||
|  | @ -1069,10 +1073,10 @@ static bool manager_msg_proc(JWidget widget, JMessage msg) | |||
|   return false; | ||||
| } | ||||
| 
 | ||||
| /**********************************************************************/ | ||||
| /* graphics */ | ||||
| 
 | ||||
| static void regen_theme_and_fixup_icons(void *data) | ||||
| /**
 | ||||
|  * IAppHook to regenerate graphics when the App palette is changed. | ||||
|  */ | ||||
| void RegenIcons::on_event() | ||||
| { | ||||
|   JWidget button; | ||||
|   JLink link; | ||||
|  |  | |||
|  | @ -195,8 +195,8 @@ bool set_current_palette(Palette *_palette, bool forced) | |||
|     create_rgb_table(my_rgb_map, rgbpal, NULL); | ||||
|     set_palette(rgbpal);	/* change system color palette */ | ||||
| 
 | ||||
|     /* call hooks */ | ||||
|     app_trigger_event(APP_PALETTE_CHANGE); | ||||
|     // call hooks
 | ||||
|     App::instance()->trigger_event(AppEvent::PaletteChange); | ||||
| 
 | ||||
|     ret = TRUE; | ||||
|   } | ||||
|  |  | |||
|  | @ -137,7 +137,7 @@ static AlgoHLine inks_hline[][3] = | |||
| /* CURSOR COLOR                                            */ | ||||
| /***********************************************************/ | ||||
| 
 | ||||
| static void update_cursor_color(void *data) | ||||
| static void update_cursor_color() | ||||
| { | ||||
|   if (ji_screen) | ||||
|     _cursor_color = get_color_for_allegro(bitmap_color_depth(ji_screen), | ||||
|  | @ -148,6 +148,15 @@ static void update_cursor_color(void *data) | |||
|   _cursor_mask = (color_type(cursor_color) == COLOR_TYPE_MASK); | ||||
| } | ||||
| 
 | ||||
| class UpdateCursorColor : public IAppHook | ||||
| { | ||||
| public: | ||||
|   void on_event() | ||||
|   { | ||||
|     update_cursor_color(); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /***********************************************************/ | ||||
| /* TOOLS                                                   */ | ||||
| /***********************************************************/ | ||||
|  | @ -192,7 +201,7 @@ int init_module_tools() | |||
|   air_speed   = MID(1, air_speed, 100); | ||||
|   tiled_mode  = (tiled_t)MID(0, (int)tiled_mode, TILED_BOTH); | ||||
| 
 | ||||
|   app_add_hook(APP_PALETTE_CHANGE, update_cursor_color, NULL); | ||||
|   App::instance()->add_hook(AppEvent::PaletteChange, new UpdateCursorColor); | ||||
| 
 | ||||
|   return 0; | ||||
| } | ||||
|  | @ -309,7 +318,7 @@ color_t get_cursor_color() | |||
| void set_cursor_color(color_t color) | ||||
| { | ||||
|   cursor_color = color; | ||||
|   update_cursor_color(NULL); | ||||
|   update_cursor_color(); | ||||
| } | ||||
| 
 | ||||
| /* returns the size which use the current tool */ | ||||
|  |  | |||
|  | @ -35,8 +35,6 @@ static std::map<gfxobj_id, GfxObj*>* objects_map; // graphics objects map | |||
| static void insert_gfxobj(GfxObj* gfxobj); | ||||
| static void erase_gfxobj(GfxObj* gfxobj); | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| void gfxobj_init() | ||||
| { | ||||
|   objects_map = new std::map<gfxobj_id, GfxObj*>; | ||||
|  | @ -52,7 +50,7 @@ void gfxobj_exit() | |||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////
 | ||||
| // GfxObj class
 | ||||
|  | ||||
| 
 | ||||
| GfxObj::GfxObj(int type) | ||||
| { | ||||
|   this->type = type; | ||||
|  | @ -89,7 +87,6 @@ void GfxObj::assign_id() | |||
| } | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////
 | ||||
|  | ||||
| 
 | ||||
| GfxObj* gfxobj_find(gfxobj_id id) | ||||
| { | ||||
|  |  | |||
|  | @ -79,7 +79,6 @@ enum { | |||
|   ACTION_ROTATE_BR, | ||||
| }; | ||||
| 
 | ||||
| static void destroy_clipboard(void* data); | ||||
| static void set_clipboard(Image* image, Palette* palette, bool set_system_clipboard); | ||||
| static bool copy_from_sprite(const Sprite* sprite); | ||||
| 
 | ||||
|  | @ -106,17 +105,21 @@ static bool first_time = true; | |||
| static Palette* clipboard_palette = NULL; | ||||
| static Image* clipboard_image = NULL; | ||||
| 
 | ||||
| static void destroy_clipboard(void* data) | ||||
| class DestroyClipboard : public IAppHook | ||||
| { | ||||
|   delete clipboard_palette; | ||||
|   delete clipboard_image; | ||||
| } | ||||
| public: | ||||
|   void on_event() | ||||
|   { | ||||
|     delete clipboard_palette; | ||||
|     delete clipboard_image; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| static void set_clipboard(Image* image, Palette* palette, bool set_system_clipboard) | ||||
| { | ||||
|   if (first_time) { | ||||
|     first_time = false; | ||||
|     app_add_hook(APP_EXIT, destroy_clipboard, NULL); | ||||
|     App::instance()->add_hook(AppEvent::Exit, new DestroyClipboard()); | ||||
|   } | ||||
| 
 | ||||
|   delete clipboard_palette; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue