3 * Copyright (C) 2007, Harbour, All rights reserved.
6 #include <F_Text_Display.H>
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
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)
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);
56 ev.type = F_WINDOW_SHOW;
58 ev.display.window = &w;
59 event_queue.push_back(ev);
60 if (window_in_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);
75 ev.type = F_WINDOW_HIDE;
77 ev.display.window = &w;
78 event_queue.push_back(ev);
79 if (window_in_focus() == &w)
83 // ÐÏËÁ ÉÍÅÅÍ @#$%ÓÔ×Ï
84 void F_Text_Display::top(F_Window *w)
86 for (unsigned int i = 0; i < windows.size(); i++)
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--);
97 F_Window *F_Text_Display::top()
100 F_Window *w = windows[0];
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_);
115 // ÄÙË, ÎÁÄÅÅÍÓÑ ÞÔÏ wrap ÎÅ ÐÒÏÉÚÏÊÄÅÔ ÐÒÉ ÖÉÚÎÉ ÐÒÏÇÒÁÍÍÙ ;)
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--;
125 *event = event_queue[0];
126 event_queue.erase(event_queue.begin());
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--)
138 // generate flush event
139 event->dev = F_DISPLAY;
140 event->type = F_WINDOW_FLUSH;
141 event->display.window = windows[i];
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()) {