]> git.lyx.org Git - lyx.git/blobdiff - src/WorkArea.C
Fix paragraph spacing
[lyx.git] / src / WorkArea.C
index 13d557e65bdd95e38811e0e5072a56ae64fdf231..ea9324e037d1889905e6f870b78d77ec16bdf1cb 100644 (file)
@@ -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 <config.h>
 #include <cmath>
-
+#include <cctype>
 #ifdef __GNUG__
 #pragma implementation
 #endif
 #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 =
@@ -121,7 +122,7 @@ WorkArea::WorkArea(BufferView * o, int xpos, int ypos, int width, int height)
                       << width - 15 - 2 * bw << 'x'
                       << height - 2 * bw << endl;
        
-       work_area = obj = fl_add_free(FL_INPUT_FREE,
+       work_area = obj = fl_add_free(FL_ALL_FREE,
                                      xpos + bw, ypos + bw,
                                      width - 15 - 2 * bw, // scrollbarwidth
                                      height - 2 * bw, "",
@@ -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,14 +303,18 @@ 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,
                                      ev->xbutton.y - ob->y,
                                      ev->xbutton.button);
                break;
+#if FL_REVISION < 89
        case FL_MOUSE:
+#else
+       case FL_DRAG:
+#endif
                if (!ev || ! area->scrollbar) break;
                if (ev->xmotion.x != x_old ||
                    ev->xmotion.y != y_old ||
@@ -321,15 +326,19 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event,
                                             ev->xbutton.state);
                }
                break;
+#if FL_REVISION < 89
        case FL_KEYBOARD:
+#else
+       case FL_KEYPRESS:
+#endif
        {
                lyxerr[Debug::KEY] << "Workarea event: KEYBOARD" << endl;
                
                KeySym keysym = 0;
                char dummy[1];
                XKeyEvent * xke = reinterpret_cast<XKeyEvent *>(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
@@ -338,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;
@@ -347,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)"
@@ -364,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<unsigned char>(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;
@@ -403,11 +427,18 @@ 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);
        }
        break;
+
+#if FL_REVISION >= 89
+       case FL_KEYRELEASE:
+               lyxerr << "Workarea event: KEYRELEASE" << endl;
+               break;
+#endif
+
        case FL_FOCUS:
                lyxerr[Debug::GUI] << "Workarea event: FOCUS" << endl;
                area->workAreaFocus();
@@ -449,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) 
 {
@@ -466,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 
 {
@@ -493,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);
 }