Add copyright notice
[forms.git] / F / F_Input_Device.H
blob8c25093810b47227208732bbd8ce67145ac61426
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #ifndef _F_INPUT_DEVICE_H_
7 #define _F_INPUT_DEVICE_H_
9 #include <F_Types.H>
10 #include <vector>
11 #include <cc++/thread.h>
13 namespace F {
15  class F_Input_Device {
17  protected:
19   ost::Mutex device_l;
20   std::vector <F_Event_t> pending_events;
21   bool good_; // state of this input subsystem
22   bool enabled_;
25   virtual bool check_for_events(F_Event_t *event) = 0;
26   void add_event(F_Event_t &ev) {
27     device_l.enterMutex();
28     pending_events.push_back(ev);
29     device_l.leaveMutex();
30   }
32  public:
34   F_Input_Device() { enabled_ = good_ = false; }
35   virtual ~F_Input_Device() { device_l.enterMutex(); }
36   virtual void sigstop() { }
37   virtual void sigcont() { }
38   bool good() { return good_; }
39   void disable() { enabled_ = false; }
40   void enable() { enabled_ = true; }
41   bool enabled() { return enabled_; }
42   bool check_for_events() {
43     if (!enabled_)
44       return false;
45     device_l.enterMutex();
46     bool res = false;
47     if (!pending_events.empty())
48       res = true;
49     F_Event_t event;
50     if (check_for_events(&event)) { // got one
51       pending_events.push_back(event);
52       res = true;
53     }
54     device_l.leaveMutex();
55     return res;
56   }
57   // get last event, false = no pending event
58   bool get_event(F_Event_t *event) {
59     if (!enabled_)
60       return false;
61     device_l.enterMutex();
62     bool res = false;
63     if (pending_events.empty())
64       goto out;
65     else {
66       *event = pending_events[0];
67       pending_events.erase(pending_events.begin());
68       res = true;
69     }
70  out:  
71     device_l.leaveMutex();
72     return res;
73   }
74   // set event type mask
75   bool event_type_mask(std::vector <F_Event_Type_t> &mask);
76  };
79 #endif