Initial commit
[forms.git] / F / F_App.H
blob04fdb4bfa4be33b0f0cce090ee0827fd635c3c8e
2 #ifndef _F_APP_H_
3 #define _F_APP_H_
5 #include <signal.h>
6 #include <string>
7 #include <new>
8 #include <cc++/thread.h>
9 #include <cc++/cmdoptns.h>
10 #include <F_Types.H>
11 #include <F_Log.H>
13 // available generic ui's
14 #include <F_Batch_UI.H>
15 #include <F_Linux_Console_UI.H>
16 #include <F_FLTK_UI.H>
18 //! ×ËÌÀÞÁÅÔ × ÓÅÂÑ ×ÓÅ ËÌÁÓÓÙ ÂÉÂÌÉÏÔÅËÉ Forms
19 namespace F {
21 /*!
22  * ëÌÁÓÓ F_App :
23  *
24  *  ÷ÓÐÏÍÏÇÁÔÅÌØÎÙÊ ËÌÁÓÓ ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÒÉÌÏÖÅÎÉÊ, ÐÏÒÑÄÏË ÒÁÂÏÔÙ Ó app :
25  *
26  *  - ÒÁÚÂÏÒ ÏÐÃÉÊ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ
27  *  - app-oriented ÉÎÉÃÉÁÌÉÚÁÃÉÑ
28  *  - app-oriented run() ÆÕÎËÃÉÑ / app-oriented callback's
29  *  - app-oriented quit()
30  *
31  */
33 class F_App {
35   static F_App *this_; //!< needed for signal handlers
36   static std::string name_; //!< ÎÁÚ×ÁÎÉÅ ÐÒÉÌÏÖÅÎÉÑ
37   std::string version_; //!< ×ÅÒÓÉÑ ÐÒÉÌÏÖÅÎÉÑ
38   std::string author_; //!< Á×ÔÏÒ ÐÒÉÌÏÖÅÎÉÑ
39   std::string license_; //!< ÌÉÃÅÎÚÉÑ ÐÒÉÌÏÖÅÎÉÑ
40   pid_t main_pid;
41 //  ost::Mutex app_l;
42   
43   ost::CommandOptionParse *cmd_opts_;
45   std::new_handler old_new_handler;
47   //! all signals going here first
48   static void signal_handler(int signo, siginfo_t* siginfo, void* ptr);
49   static void signals_setup(void);
51   static void (*idle_)(void); //!< ÕËÁÚÁÔÅÌØ ÎÁ idle-ÆÕÎËÃÉÀ
54  public:
56   F_UI *ui_;
58   static int argc_; //!< original argc
59   static char **argv_; //!< original argv
61   //! F_App ËÏÎÓÔÒÕËÔÏÒ, ÐÒÁÍÅÔÒÙ :
62   // name - ÉÍÑ ÐÒÏÇÒÁÍÍÙ
63   F_App(int argc, char **argv, const char *name = 0, const char *version = 0,
64     const char *author = 0, const char *license = 0,
65     ost::CommandOption *user_cmd_opts = ost::defaultCommandOptionList,
66     const char *comment = 0, const char *log_prefix = 0);
67   virtual ~F_App();
68   static const char *name() { return name_.c_str(); }
69   static const char argc() { return argc_; }
70   static const char *argv(int idx) { return argv_[idx]; }
72   virtual void parse_command_options(void) { } //!< called before ui creation
73   virtual void sigcont() { log("sigcont", "Continuing app"); }
74   virtual bool sigstop() { log("sigstop", "app is stopped"); return true; }
75   virtual bool exit_confirm(bool from_sighandler) { return (ui_ ? ui_->exit_confirm(from_sighandler) : true); }
77   void wait(int how) {
78     start_ui(); // start ui
79     if (how == start_only)
80       return;
81     while (1) // wait for ui events
82       idle();
83   }
85   void start_ui() {
86     init(); // parse command options, create ui
87     // ui_->pid = getpid();
88     ui_->start();
89     // wait for main thread to run
90     ui_->wait_for_started();
91  }
93   void idle(void (*cb)()) { idle_ = cb; }
94   static void idle() { idle_(); }
95   static void shutdown() {
96     std::set_new_handler(this_->old_new_handler);
97     if (this_->ui_)
98       this_->ui_->shutdown();
99     this_->ui_ = 0;
100   } 
101   // int get_key() { return ui->get_key(); }
102   // virtual void beep() { ui->beep(); }
103   virtual void run(void) { start_ui(); while(1) default_idle(); }
105  private :
107   static void default_idle(void);
108   void init(void);
110  }; // class F_App
111 } // namespace F
113 #endif