X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FWorkArea.C;h=ea9324e037d1889905e6f870b78d77ec16bdf1cb;hb=32ef0d04c48a1751abbb5e3b17d1bec25f22c255;hp=0821f000f48e4698d0fa2f264f7aad4bc127a10a;hpb=dc584364e9abcadf734216e412df7fe96947acc7;p=lyx.git diff --git a/src/WorkArea.C b/src/WorkArea.C index 0821f000f4..ea9324e037 100644 --- a/src/WorkArea.C +++ b/src/WorkArea.C @@ -4,13 +4,13 @@ * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. + * Copyright 1995-2001 The LyX Team. * * ====================================================== */ #include #include - +#include #ifdef __GNUG__ #pragma implementation #endif @@ -18,11 +18,9 @@ #include "WorkArea.h" #include "debug.h" #include "support/lstrings.h" -#include "BufferView.h" #include "LyXView.h" -#include "lyxfunc.h" -#if FL_REVISION < 89 +#if FL_REVISION < 89 || (FL_REVISION == 89 && FL_FIXLEVEL < 5) #include "lyxlookup.h" #endif @@ -34,12 +32,16 @@ FL_OBJECT * figinset_canvas; // This is at least true for g++. //using std::abs; -static inline +namespace { + +inline void waitForX() { XSync(fl_get_display(), 0); } +} // anon namespace + extern "C" { // Just a bunch of C wrappers around static members of WorkArea @@ -58,9 +60,8 @@ extern "C" { } - -WorkArea::WorkArea(BufferView * o, int xpos, int ypos, int width, int height) - : owner_(o), workareapixmap(0), painter_(*this) +WorkArea::WorkArea(int xpos, int ypos, int width, int height) + : workareapixmap(0), painter_(*this) { fl_freeze_all_forms(); @@ -72,7 +73,7 @@ WorkArea::WorkArea(BufferView * o, int xpos, int ypos, int width, int height) << width << 'x' << height << endl; // FL_OBJECT * obj; - const int bw = int(std::abs(float(fl_get_border_width()))); + int const bw = int(std::abs(float(fl_get_border_width()))); // We really want to get rid of figinset_canvas. ::figinset_canvas = figinset_canvas = obj = @@ -169,7 +170,7 @@ void WorkArea::resize(int xpos, int ypos, int width, int height) { fl_freeze_all_forms(); - const int bw = int(std::abs(float(fl_get_border_width()))); + int const bw = int(std::abs(float(fl_get_border_width()))); // a box fl_set_object_geometry(backgroundbox, xpos, ypos, width - 15, height); @@ -261,7 +262,7 @@ void WorkArea::scroll_cb(FL_OBJECT * ob, long) // If we really want the accellerating scroll we can do that // from here. IMHO that is a waste of effort since we already // have other ways to move fast around in the document. (Lgb) - area->owner_->scrollCB(fl_get_scrollbar_value(ob)); + area->scrollCB(fl_get_scrollbar_value(ob)); waitForX(); } @@ -293,7 +294,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, Lgb_bug_find_hack = false; break; case FL_PUSH: - if (!ev) break; + if (!ev || ev->xbutton.button == 0) break; // Should really have used xbutton.state lyxerr[Debug::GUI] << "Workarea event: PUSH" << endl; area->workAreaButtonPress(ev->xbutton.x - ob->x, @@ -302,7 +303,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, //area->workAreaKeyPress(XK_Pointer_Button1, ev->xbutton.state); break; case FL_RELEASE: - if (!ev) break; + if (!ev || ev->xbutton.button == 0) break; // Should really have used xbutton.state lyxerr[Debug::GUI] << "Workarea event: RELEASE" << endl; area->workAreaButtonRelease(ev->xbutton.x - ob->x, @@ -336,8 +337,8 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, KeySym keysym = 0; char dummy[1]; XKeyEvent * xke = reinterpret_cast(ev); -#if FL_REVISION < 89 - // XForms < 0.89 does not have compose support +#if FL_REVISION < 89 || (FL_REVISION == 89 && FL_FIXLEVEL < 5) + // XForms < 0.89.5 does not have compose support // so we are using our own compose support LyXLookupString(ev, dummy, 1, &keysym); #else @@ -346,8 +347,8 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, if (lyxerr.debugging(Debug::KEY)) { char const * tmp = XKeysymToString(key); char const * tmp2 = XKeysymToString(keysym); - string stm = (tmp ? tmp : ""); - string stm2 = (tmp2 ? tmp2 : ""); + string const stm = (tmp ? tmp : ""); + string const stm2 = (tmp2 ? tmp2 : ""); lyxerr << "WorkArea: Key is `" << stm << "' [" << key << "]" << endl; @@ -355,7 +356,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, << keysym << "]" << endl; } -#if FL_REVISION < 89 +#if FL_REVISION < 89 || (FL_REVISION == 89 && FL_FIXLEVEL < 5) if (keysym == NoSymbol) { lyxerr[Debug::KEY] << "Empty kdb action (probably composing)" @@ -372,28 +373,43 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, if (!key) { // We migth have to add more keysyms here also, // we will do that as the issues arise. (Lgb) - if (keysym == XK_space) + if (keysym == XK_space) { ret_key = keysym; - else + lyxerr[Debug::KEY] << "Using keysym [A]" + << endl; + } else break; } else { - ret_key = (keysym ? keysym : key); + // It seems that this was a bit optimistic... + // With this hacking things seems to be better (Lgb) + //if (!iscntrl(key)) { + // ret_key = key; + // lyxerr[Debug::KEY] + // << "Using key [B]\n" + // << "Uchar[" + // << static_cast(key) + // << endl; + //} else { + ret_key = (keysym ? keysym : key); + lyxerr[Debug::KEY] << "Using keysym [B]" + << endl; + //} } -#endif - unsigned int ret_state = xke->state; +#endif + unsigned int const ret_state = xke->state; // If you have a better way to handle "wild-output" of // characters after the key has been released than the one // below, please contact me. (Lgb) - static Time last_time_pressed = 0; - static unsigned int last_key_pressed = 0; - static unsigned int last_state_pressed = 0; + static Time last_time_pressed; + static unsigned int last_key_pressed; + static unsigned int last_state_pressed; lyxerr[Debug::KEY] << "Workarea Diff: " << xke->time - last_time_pressed << endl; - if (xke->time - last_time_pressed < 35 // should perhaps be tunable - && xke->state == last_state_pressed + if (xke->time - last_time_pressed < 25 // should perhaps be tunable + && ret_state == last_state_pressed && xke->keycode == last_key_pressed) { lyxerr[Debug::KEY] << "Workarea: Purging X events." << endl; @@ -411,7 +427,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, } last_time_pressed = xke->time; last_key_pressed = xke->keycode; - last_state_pressed = xke->state; + last_state_pressed = ret_state; area->workAreaKeyPress(ret_key, ret_state); } @@ -464,11 +480,12 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, } -static string clipboard_selection; -static bool clipboard_read = false; +namespace { -extern "C" { - static +string clipboard_selection; +bool clipboard_read = false; + +extern "C" int request_clipboard_cb(FL_OBJECT * /*ob*/, long /*type*/, void const * data, long size) { @@ -481,8 +498,8 @@ int request_clipboard_cb(FL_OBJECT * /*ob*/, long /*type*/, clipboard_read = true; return 0; } -} // extern "C" +} // namespace anon string const WorkArea::getClipboard() const { @@ -508,5 +525,5 @@ void WorkArea::putClipboard(string const & s) const static string hold; hold = s; - fl_stuff_clipboard(work_area, 0, hold.c_str(), hold.size(), 0); + fl_stuff_clipboard(work_area, 0, hold.data(), hold.size(), 0); }