Correct backtrace() array size argument
[forms.git] / src / F_Text_Display.C
blob669ba36111c03bf055c3ea7a5ba1abb69bd65c94
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #include <F_Text_Display.H>
7 #include <F_Window.H>
9 using namespace F;
10 using namespace std;
11 F_Text_Display *F::f_text_display;
13 // ÔÅÏÒÅÔÉÞÅÓËÉ ÍÁÐÕ ÎÁÄÏÔØ ×ÙÞÉÔÙ×ÁÔØ ÉÚ ÑÄÒÁ, ioctl'ÅÍ
14 unsigned char F_Text_Display::koi2alt[128] = {
16   196,179,218,191,192,217,195,180,194,193,197,223,220,
17   219,221,222,176,177,178,244,254,250,251,247,243,242,
18   253,245,248,252,249,246,205,186,213,241,213,201,184,
19   183,187,212,211,200,190,189,188,198,199,204,181,240,
20   182,185,209,210,203,207,208,202,216,215,206,255,238,
21   160,161,230,164,165,228,163,229,168,169,170,171,172,
22   173,174,175,239,224,225,226,227,166,162,236,235,167,
23   232,237,233,231,234,158,128,129,150,132,133,148,131,
24   149,136,137,138,139,140,141,142,143,159,144,145,146,
25   147,134,130,156,155,135,152,157,153,151,154
29 // ÄÏÌÖÎÁ ÒÉÓÏ×ÁÔØ w->draw_buf × back_buf ÏËÏÎ, ËÏÔÏÒÙÅ ÄÁÎÎÏÅ ÐÅÒÅËÒÙ×ÁÀÔ
30 void F_Text_Display::flush(F_Window *w)
32 // debug("flushing for wid %d", w->id());
33  // copy all widgets draw_buf to window draw_buf
34  w->flush();
35  // refresh window in display draw_buf
36  F_Region r(w->w(), w->h());
37  draw_buf.copy(r, w->draw_buf, w);
40 void F_Text_Display::delete_window(F_Window &w)
42  hide_window(w);
43  windows.remove(&w);
46 void F_Text_Display::show_window(F_Window &w)
48  // ËÏÐÉÒÕÅÍ ÞÁÓÔØ ÜËÒÁÎÁ ÐÏÄ ÏËÎÏÍ × ÅÅÊÎÙÊ back_buf
49  F_Region r(w.w(), w.h());
50  w.back_buf.copy(w, draw_buf, r);
51  // map the window
52  flush(&w);
53  // add expose event
54  F_Event_t ev;
55  ev.dev = F_DISPLAY;
56  ev.type = F_WINDOW_SHOW;
57  ev.delay = 0;
58  ev.display.window = &w;
59  event_queue.push_back(ev);
60  if (window_in_focus() != &w)
61    take_focus(&w);
64 // ÄÏÌÖÎÁ ÂÙÔØ ÉÎÔÅÌÌÅËÕÔÁÌØÎÏÊ - ÏÐÒÅÄÅÌÑÔØ ËÁËÉÅ ÞÁÓÔÉ ÏËÎÁ ÐÅÒÅËÒÙÔÙ ÄÒÕÇÉÍÉ
65 // ÏËÎÁÍÉ É ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÔØ w.back_buf × back_buf ÔÅÈ ÏËÏÎ
67 void F_Text_Display::hide_window(F_Window &w)
69  // ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÅÍ ÞÁÓÔØ ÜËÒÁÎÁ ÐÏÄ ÏËÎÏÍ
70  F_Region r(w.w(), w.h());
71  draw_buf.copy(r, w.back_buf, w);
72  // add expose event
73  F_Event_t ev;
74  ev.dev = F_DISPLAY;
75  ev.type = F_WINDOW_HIDE;
76  ev.delay = 0;
77  ev.display.window = &w;
78  event_queue.push_back(ev);
79  if (window_in_focus() == &w)
80    take_focus(0);
83 // ÐÏËÁ ÉÍÅÅÍ @#$%ÓÔ×Ï
84 void F_Text_Display::top(F_Window *w)
86  for (unsigned int i = 0; i < windows.size(); i++)
87    windows[i]->hide();
88  windows.remove(w);
89  windows.push_front(w, w->id());
90  int depth = windows.size() - 1;
91  for (int i = depth; i >= 0; i--) {
92    windows[i]->depth(depth--);
93    windows[i]->show();
94   }
97 F_Window *F_Text_Display::top()
99  if (windows.size()) {
100    F_Window *w = windows[0];
101    if (w->depth())
102      bug();
103    return w;
105   return NULL;
108 unsigned int F_Text_Display::new_window(F_Window &w)
110  // increment w->depth()
111  for (unsigned int i = 0; i < windows.size(); i++)
112    windows[i]->depth(windows[i]->depth() + 1);
113  windows.push_front(&w, ++wid_);
114  current_window = &w;
115  // ÄÙË, ÎÁÄÅÅÍÓÑ ÞÔÏ wrap ÎÅ ÐÒÏÉÚÏÊÄÅÔ ÐÒÉ ÖÉÚÎÉ ÐÒÏÇÒÁÍÍÙ ;)
116  return wid_;
119 bool F_Text_Display::check(F_Event_t *event)
121  if (event_queue.size()) { // process internal events first
122    if (event_queue[0].delay) {
123      event_queue[0].delay--;
124   } else {
125    *event = event_queue[0];
126    event_queue.erase(event_queue.begin());
127    return true;
128   }
130  unsigned int i = 0;
131  for (; i < windows.size(); i++) {
132    if (windows[i]->visible() && (windows[i]->damage() & F_DAMAGE_FLUSH)) {
133      if (windows[i]->depth()) { // mark all higher windows as damaged
134        for (int ir = i; ir >= 0; ir--)
135          flush(windows[ir]);
136     } else
137           flush(windows[i]);
138      // generate flush event
139      event->dev = F_DISPLAY;
140      event->type = F_WINDOW_FLUSH;
141      event->display.window = windows[i];
142      return true;
143    }
145   return false;
149 void F_Text_Display::redraw()
151  list <F_Window *>::reverse_iterator w;
152  for (w = windows.rbegin(); w != windows.rend(); w++) {
153    if ((*w)->visible()) {
154      // draw window
155      (*w)->draw();
156      refresh(*w);
157    }