| 1 | /* Copyright (c) 2006 by Arkkra Enterprises */ |
| 2 | /* All rights reserved */ |
| 3 | |
| 4 | #ifndef _RUN_H_ |
| 5 | #define _RUN_H_ |
| 6 | |
| 7 | // Classes for Run menu off of main toolbar |
| 8 | |
| 9 | #include <FL/Fl.H> |
| 10 | #include <FL/Fl_Double_Window.H> |
| 11 | #include <FL/Fl_Text_Editor.H> |
| 12 | #include <FL/Fl_Input.H> |
| 13 | #include <FL/Fl_Button.H> |
| 14 | #include <FL/Fl_Return_Button.H> |
| 15 | #include <FL/Fl_Check_Button.H> |
| 16 | #include <FL/Fl_Value_Input.H> |
| 17 | #include "globals.H" |
| 18 | #include "File.H" |
| 19 | #include "Config.H" |
| 20 | #include <stdio.h> |
| 21 | #include <sys/types.h> |
| 22 | #ifdef OS_LIKE_UNIX |
| 23 | #include <signal.h> |
| 24 | #endif |
| 25 | #ifdef OS_LIKE_WIN32 |
| 26 | #include <windef.h> |
| 27 | #include <winbase.h> |
| 28 | #include <winnt.h> |
| 29 | #include <process.h> |
| 30 | #endif |
| 31 | |
| 32 | // Information about a non-waited-for process |
| 33 | #ifdef OS_LIKE_WIN32 |
| 34 | typedef PROCESS_INFORMATION Proc_Info; |
| 35 | #else |
| 36 | typedef pid_t Proc_Info; |
| 37 | #endif |
| 38 | |
| 39 | // We limit the number of macros user can define, |
| 40 | // to fit in a reasonably small dialog window. |
| 41 | #define MAX_MACROS 5 |
| 42 | |
| 43 | |
| 44 | // Class for asking user what arguments to pass to Mup when running it |
| 45 | |
| 46 | class Run_parameters_dialog : Fl_Double_Window { |
| 47 | |
| 48 | friend class Run; |
| 49 | |
| 50 | public: |
| 51 | Run_parameters_dialog(void); |
| 52 | ~Run_parameters_dialog(void); |
| 53 | |
| 54 | // Callbacks |
| 55 | static void combine_cb(Fl_Widget *, void * data); |
| 56 | static void extract_cb(Fl_Widget *, void * data); |
| 57 | static void selected_pages_cb(Fl_Widget *, void * data); |
| 58 | static void clear_form_cb(Fl_Widget *, void * data); |
| 59 | static void Macros_cb(Fl_Widget *, void * data); |
| 60 | static void Save_cb(Fl_Widget *, void * data); |
| 61 | static void Cancel_cb(Fl_Widget *, void * data); |
| 62 | |
| 63 | // Returns true if macro definition is invalid. |
| 64 | static bool macro_error(const char * macro); |
| 65 | |
| 66 | private: |
| 67 | // Callbacks |
| 68 | void combine(void); |
| 69 | void extract(void); |
| 70 | void selected_pages(void); |
| 71 | void clear_form(void); |
| 72 | void Macros(void); |
| 73 | void Save(void); |
| 74 | void Cancel(void); |
| 75 | |
| 76 | // Widgets |
| 77 | Fl_Check_Button * enable_combine_p; |
| 78 | Positive_Int_Input * rest_combine_p; |
| 79 | Positive_Int_Input * first_page_p; |
| 80 | Fl_Group * pages_p; |
| 81 | Fl_Check_Button * all_p; |
| 82 | Fl_Check_Button * odd_p; |
| 83 | Fl_Check_Button * even_p; |
| 84 | Fl_Check_Button * selected_p; |
| 85 | Fl_Input * page_list_p; |
| 86 | Fl_Input * staff_list_p; |
| 87 | Int_Input * extract_begin_p; |
| 88 | Int_Input * extract_end_p; |
| 89 | Fl_Group * macros_group_p; |
| 90 | Fl_Input * macro_definitions_p[MAX_MACROS]; |
| 91 | Fl_Return_Button * save_p; |
| 92 | Fl_Button * clear_form_p; |
| 93 | Fl_Button * cancel_p; |
| 94 | |
| 95 | // Saved values for run parameters |
| 96 | bool saved_enable_combine; |
| 97 | char saved_combine_measures[8]; |
| 98 | char saved_first_page[8]; |
| 99 | enum { ALL_PAGES, ODD_PAGES, EVEN_PAGES, SELECTED_PAGES } saved_pages; |
| 100 | char * saved_page_list; |
| 101 | char * saved_staff_list; |
| 102 | char saved_extract_begin[8]; |
| 103 | char saved_extract_end[8]; |
| 104 | char * saved_macro_definitions[MAX_MACROS]; |
| 105 | }; |
| 106 | |
| 107 | |
| 108 | // Class for displaying stderr output from Mup to user |
| 109 | |
| 110 | class Error_report : public Fl_Double_Window |
| 111 | { |
| 112 | public: |
| 113 | Error_report(void); |
| 114 | ~Error_report(void); |
| 115 | |
| 116 | // Reads the file where stderr was saved |
| 117 | int loadfile(const char * filename); |
| 118 | |
| 119 | // Callbacks |
| 120 | static void OK_cb(Fl_Widget *, void *); |
| 121 | static void font_change_cb(void * data, Fl_Font font, unsigned char size); |
| 122 | |
| 123 | private: |
| 124 | // Callbacks |
| 125 | void font_change(Fl_Font font, unsigned char size); |
| 126 | void OK(void); |
| 127 | |
| 128 | // Widgets |
| 129 | Fl_Text_Display * text_p; |
| 130 | Font_change_registration * font_change_reg_p; |
| 131 | Fl_Return_Button * ok_p; |
| 132 | }; |
| 133 | |
| 134 | |
| 135 | |
| 136 | // Class for the Run menu on the main menu bar |
| 137 | |
| 138 | class Run { |
| 139 | |
| 140 | friend class File; // For auto-display |
| 141 | |
| 142 | public: |
| 143 | Run(void); |
| 144 | ~Run(void); |
| 145 | |
| 146 | // To know which file to run Mup on |
| 147 | void set_file(File * file); |
| 148 | // Kill off child processes |
| 149 | void clean_up(void); |
| 150 | |
| 151 | // Callbacks |
| 152 | static void Display_cb(Fl_Widget *, void * data); |
| 153 | static void Play_cb(Fl_Widget *, void * data); |
| 154 | static void WritePostScript_cb(Fl_Widget *, void * data); |
| 155 | static void WriteMIDI_cb(Fl_Widget *, void * data); |
| 156 | static void Options_cb(Fl_Widget *, void * data); |
| 157 | |
| 158 | private: |
| 159 | // Callbacks |
| 160 | void Display(void); |
| 161 | void Play(void); |
| 162 | void WritePostScript(void); |
| 163 | void WriteMIDI(void); |
| 164 | void Options(void); |
| 165 | |
| 166 | // This runs Mup and maybe viewer/player |
| 167 | void Run_Mup(bool midi, bool show_or_play); |
| 168 | |
| 169 | // Execute the command with given argv. |
| 170 | // If proc_info_p is zero, wait for the process to complete, |
| 171 | // otherwise fill it in with information about the spawned process, |
| 172 | // so that the caller can keep track of it while it runs independently. |
| 173 | // The hide_window parameter is only used for Windows and causes the |
| 174 | // spawned process to be created with flags to not create a window, |
| 175 | // This lets us use a console mode version of Mup, so traditional users |
| 176 | // can continue to run Mup in a console without mupmate, but we can |
| 177 | // run the same .exe without the annoyance of a console popping up. |
| 178 | // Returns 0 on success, -1 on failure to create process, |
| 179 | // or what the process returned if it had non-zero exit code |
| 180 | // and was waited for. If a not-waited-for process returns 0, |
| 181 | // proc_info_p will contain handle or pid information. |
| 182 | int execute_command(const char **argv, Proc_Info * proc_info_p, |
| 183 | bool hide_window = false); |
| 184 | |
| 185 | // kill off a previously spawned child process |
| 186 | void kill_process(const Proc_Info * const proc_info_p, |
| 187 | const char * const description); |
| 188 | |
| 189 | // Report if we have running helper programs |
| 190 | bool has_MIDI_child(void); |
| 191 | bool has_display_child(void); |
| 192 | |
| 193 | #ifdef OS_LIKE_WIN32 |
| 194 | // To check if using displayer/player we know how to handle specially |
| 195 | static bool is_gsview(const char * command); |
| 196 | static bool is_mplayer(const char * command); |
| 197 | #endif |
| 198 | |
| 199 | // Widgets |
| 200 | Run_parameters_dialog * parameters_p; |
| 201 | Error_report * report_p; |
| 202 | File * file_p; |
| 203 | |
| 204 | // Handles for child processes |
| 205 | Proc_Info display_child; |
| 206 | Proc_Info MIDI_child; |
| 207 | }; |
| 208 | |
| 209 | #endif |