]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/XWorkArea.C
Introduce LFUN_PRINT.
[lyx.git] / src / frontends / xforms / XWorkArea.C
index 3bf532b96031f38568914f5c5d6e7f80ac072c00..379e1d82e8fa6e202530174e69d3919193b4b71f 100644 (file)
@@ -6,27 +6,28 @@
  * \author unknown
  * \author John Levon
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
 
-
 #include "XWorkArea.h"
+
 #include "debug.h"
 #include "XLyXKeySym.h"
 #include "funcrequest.h"
 #include "Timeout.h"
 
-using std::endl;
 using std::abs;
-using std::hex;
 using std::dec;
+using std::endl;
+using std::hex;
+using std::string;
+
 
 namespace {
 
-inline
-void waitForX(bool discard)
+inline void waitForX(bool discard)
 {
        XSync(fl_get_display(), discard);
 }
@@ -270,15 +271,18 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
        XEvent * ev = static_cast<XEvent*>(xev);
        XWorkArea * area = static_cast<XWorkArea*>(ob->u_vdata);
 
-       if (!area) return 1;
+       if (!area)
+               return 1;
 
        switch (event) {
+
        case FL_DRAW:
                if (!area->work_area || !area->work_area->form->visible)
                        return 1;
                lyxerr[Debug::WORKAREA] << "Workarea event: DRAW" << endl;
                area->redraw(area->workWidth(), area->workHeight());
                break;
+
        case FL_PUSH:
                if (!ev || ev->xbutton.button == 0) break;
                // Should really have used xbutton.state
@@ -289,6 +293,7 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                                    ev->xbutton.y - ob->y,
                                    x_button_state(key)));
                break;
+
        case FL_RELEASE:
                if (!ev || ev->xbutton.button == 0) break;
                // Should really have used xbutton.state
@@ -299,8 +304,8 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                                    ev->xbutton.y - ob->y,
                                    x_button_state(key)));
                break;
-       case FL_DRAG:
-       {
+
+       case FL_DRAG: {
                if (!ev || !area->scrollbar)
                        break;
 
@@ -365,23 +370,57 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                break;
        }
 
-       case FL_KEYPRESS:
-       {
+       case FL_KEYPRESS: {
                lyxerr[Debug::WORKAREA] << "Workarea event: KEYPRESS" << endl;
+
+               KeySym keysym = 0;
+               char dummy[1];
                XKeyEvent * xke = reinterpret_cast<XKeyEvent *>(ev);
+               XLookupString(xke, dummy, 1, &keysym, 0);
 
                if (lyxerr.debugging(Debug::KEY)) {
                        char const * const tmp  = XKeysymToString(key);
-                       lyxerr << "XWorkArea: Key is `" << tmp
-                              << "' [" << key << "]" << endl;
+                       char const * const tmp2 = XKeysymToString(keysym);
+                       string const stm  = (tmp ? tmp : string());
+                       string const stm2 = (tmp2 ? tmp2 : string());
+
+                       lyxerr << "XWorkArea: Key is `" << stm
+                              << "' [" << key << "]\n"
+                              << "XWorkArea: Keysym is `" << stm2
+                              << "' [" << keysym << ']' << endl;
                }
 
+               // Note that we need this handling because of a bug
+               // in XForms 0.89, if this bug is resolved in the way I hope
+               // we can just use the keysym directly without looking
+               // at key at all. (Lgb)
+               KeySym ret_key = 0;
                if (!key) {
-                       lyxerr << "Probably composing" << endl;
-                       break;
+                       // We might have to add more keysyms here also,
+                       // we will do that as the issues arise. (Lgb)
+                       if (keysym == XK_space) {
+                               ret_key = keysym;
+                               lyxerr[Debug::KEY] << "Using keysym [A]"
+                                                  << endl;
+                       } else
+                               break;
+               } else {
+                       // 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;
+                               //}
                }
 
-               KeySym ret_key = key;
                unsigned int const ret_state = xke->state;
 
                // If you have a better way to handle "wild-output" of
@@ -419,8 +458,8 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
 
                area->workAreaKeyPress(LyXKeySymPtr(xlk),
                                       x_key_state(ret_state));
+               break;
        }
-       break;
 
        case FL_KEYRELEASE:
                lyxerr[Debug::WORKAREA] << "Workarea event: KEYRELEASE" << endl;
@@ -430,11 +469,13 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                lyxerr[Debug::WORKAREA] << "Workarea event: ENTER" << endl;
                fl_set_cursor(FL_ObjWin(area->work_area), XC_xterm);
                break;
+
        case FL_LEAVE:
                lyxerr[Debug::WORKAREA] << "Workarea event: LEAVE" << endl;
                // There should be no need for this. But there is.
                fl_set_cursor(FL_ObjWin(area->work_area), FL_DEFAULT_CURSOR);
                break;
+
        case FL_DBLCLICK:
                if (ev) {
                        lyxerr[Debug::WORKAREA] << "Workarea event: DBLCLICK" << endl;
@@ -445,6 +486,7 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                        area->dispatch(cmd);
                }
                break;
+
        case FL_TRPLCLICK:
                if (ev) {
                        lyxerr[Debug::WORKAREA] << "Workarea event: TRPLCLICK" << endl;
@@ -455,6 +497,7 @@ int XWorkArea::work_area_handler(FL_OBJECT * ob, int event,
                        area->dispatch(cmd);
                }
                break;
+
        case FL_OTHER:
                if (ev)
                        lyxerr[Debug::WORKAREA] << "Workarea event: OTHER" << endl;