X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FWorkArea.C;h=232e2e1651cf2f64688d471dcb43fdf8fb990d55;hb=98c966c64594611e469313314abd1e59524adb4a;hp=c70a8c720c76ac02867508af9d4ea7bfd3fe9bf8;hpb=39eec46bd31753afaec103fcc45f9d6ba75bdb3e;p=lyx.git diff --git a/src/WorkArea.C b/src/WorkArea.C index c70a8c720c..232e2e1651 100644 --- a/src/WorkArea.C +++ b/src/WorkArea.C @@ -1,40 +1,43 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 The LyX Team. * * ====================================================== */ #include -#include -#include + #ifdef __GNUG__ #pragma implementation #endif #include "WorkArea.h" #include "debug.h" -#include "support/lstrings.h" #include "LyXView.h" -#include "support/filetools.h" // LibFileSearch #include "lyxrc.h" // lyxrc.show_banner #include "version.h" // lyx_version -#include "support/LAssert.h" #if FL_REVISION < 89 || (FL_REVISION == 89 && FL_FIXLEVEL < 5) #include "lyxlookup.h" #endif -using std::endl; +#include "support/filetools.h" // LibFileSearch +#include "support/lstrings.h" +#include "support/LAssert.h" -FL_OBJECT * figinset_canvas; +#include +#include -// needed to make the c++ compiler find the correct version of abs. -// This is at least true for g++. -//using std::abs; +// xforms doesn't define this (but it should be in ). +extern "C" +FL_APPEVENT_CB fl_set_preemptive_callback(Window, FL_APPEVENT_CB, void *); + +using std::endl; +using std::abs; +using std::hex; namespace { @@ -51,19 +54,25 @@ extern "C" { // Just a bunch of C wrappers around static members of WorkArea static void C_WorkArea_scroll_cb(FL_OBJECT * ob, long buf) - { + { WorkArea::scroll_cb(ob, buf); - } + } + - static int C_WorkArea_work_area_handler(FL_OBJECT * ob, int event, - FL_Coord, FL_Coord, + FL_Coord, FL_Coord, int key, void * xev) - { + { return WorkArea::work_area_handler(ob, event, 0, 0, key, xev); - } + } + + static + int C_WorkAreaEventCB(FL_FORM * form, void * xev) { + WorkArea * wa = static_cast(form->u_vdata); + return wa->event_cb(static_cast(xev)); + } } @@ -72,23 +81,13 @@ WorkArea::WorkArea(int xpos, int ypos, int width, int height) { fl_freeze_all_forms(); - figinset_canvas = 0; - if (lyxerr.debugging(Debug::WORKAREA)) lyxerr << "Creating work area: +" << xpos << '+' << ypos << ' ' << width << 'x' << height << endl; // FL_OBJECT * obj; - 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 = - fl_add_canvas(FL_NORMAL_CANVAS, - xpos + 1, ypos + 1, 1, 1, ""); - fl_set_object_boxtype(obj, FL_NO_BOX); - fl_set_object_resize(obj, FL_RESIZE_ALL); - fl_set_object_gravity(obj, NorthWestGravity, NorthWestGravity); + int const bw = int(abs(fl_get_border_width())); // a box if (lyxerr.debugging(Debug::WORKAREA)) @@ -113,7 +112,7 @@ WorkArea::WorkArea(int xpos, int ypos, int width, int height) int const splash_y = ypos + (height - splash_h) / 2; splash_ = obj = fl_add_pixmapbutton(FL_NORMAL_BUTTON, - splash_x, splash_y, + splash_x, splash_y, splash_w, splash_h, ""); fl_set_pixmapbutton_file(obj, splash_file.c_str()); fl_set_pixmapbutton_focus_outline(obj, 3); @@ -145,6 +144,7 @@ WorkArea::WorkArea(int xpos, int ypos, int width, int height) fl_set_object_gravity(obj, NorthEastGravity, SouthEastGravity); obj->u_vdata = this; fl_set_object_callback(obj, C_WorkArea_scroll_cb, 0); + setScrollbarBounds(0.0, 0.0); /// /// The free object @@ -159,7 +159,7 @@ WorkArea::WorkArea(int xpos, int ypos, int width, int height) << xpos + bw << '+' << ypos + bw << ' ' << width - 15 - 2 * bw << 'x' << height - 2 * bw << endl; - + work_area = obj = fl_add_free(FL_ALL_FREE, xpos + bw, ypos + bw, width - 15 - 2 * bw, // scrollbarwidth @@ -172,6 +172,10 @@ WorkArea::WorkArea(int xpos, int ypos, int width, int height) fl_set_object_resize(obj, FL_RESIZE_ALL); fl_set_object_gravity(obj, NorthWestGravity, SouthEastGravity); + /// X selection hook - xforms gets it wrong + fl_current_form->u_vdata = this; + fl_register_raw_callback(fl_current_form, FL_ALL_EVENT, C_WorkAreaEventCB); + fl_unfreeze_all_forms(); } @@ -201,8 +205,8 @@ bool WorkArea::belowMouse() const void WorkArea::resize(int xpos, int ypos, int width, int height) { fl_freeze_all_forms(); - - int const bw = int(std::abs(float(fl_get_border_width()))); + + int const bw = int(abs(fl_get_border_width())); // a box fl_set_object_geometry(backgroundbox, xpos, ypos, width - 15, height); @@ -238,7 +242,7 @@ void destroy_object(FL_OBJECT * obj) fl_free_object(obj); } } // namespace anon - + void WorkArea::createPixmap(int width, int height) { @@ -257,7 +261,7 @@ void WorkArea::createPixmap(int width, int height) if (cur_width == width && cur_height == height && workareapixmap) return; - + cur_width = width; cur_height = height; @@ -267,11 +271,11 @@ void WorkArea::createPixmap(int width, int height) if (lyxerr.debugging(Debug::WORKAREA)) lyxerr << "Creating pixmap (" << width << 'x' << height << ")" << endl; - + workareapixmap = XCreatePixmap(fl_get_display(), RootWindow(fl_get_display(), 0), width, - height, + height, fl_get_visual_depth()); if (lyxerr.debugging(Debug::WORKAREA)) lyxerr << "\tpixmap=" << workareapixmap << endl; @@ -332,13 +336,13 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, static int x_old = -1; static int y_old = -1; static long scrollbar_value_old = -1; - + XEvent * ev = static_cast(xev); WorkArea * area = static_cast(ob->u_vdata); if (!area) return 1; - - switch (event){ + + switch (event) { case FL_DRAW: if (!area->work_area || !area->work_area->form->visible) @@ -355,7 +359,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, ev->xbutton.y - ob->y, ev->xbutton.button); //area->workAreaKeyPress(XK_Pointer_Button1, ev->xbutton.state); - break; + break; case FL_RELEASE: if (!ev || ev->xbutton.button == 0) break; // Should really have used xbutton.state @@ -387,7 +391,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, #endif { lyxerr[Debug::WORKAREA] << "Workarea event: KEYBOARD" << endl; - + KeySym keysym = 0; char dummy[1]; XKeyEvent * xke = reinterpret_cast(ev); @@ -403,7 +407,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, char const * tmp2 = XKeysymToString(keysym); string const stm = (tmp ? tmp : ""); string const stm2 = (tmp2 ? tmp2 : ""); - + lyxerr[Debug::KEY] << "WorkArea: Key is `" << stm << "' [" << key << "]" << endl; lyxerr[Debug::KEY] << "WorkArea: Keysym is `" << stm2 << "' [" @@ -449,7 +453,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, << endl; //} } - + #endif unsigned int const ret_state = xke->state; @@ -482,7 +486,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, last_time_pressed = xke->time; last_key_pressed = xke->keycode; last_state_pressed = ret_state; - + area->workAreaKeyPress(ret_key, ret_state); } break; @@ -528,7 +532,7 @@ int WorkArea::work_area_handler(FL_OBJECT * ob, int event, lyxerr[Debug::WORKAREA] << "Workarea event: OTHER" << endl; break; } - + return 1; } @@ -539,13 +543,13 @@ string clipboard_selection; bool clipboard_read = false; extern "C" { - + static int request_clipboard_cb(FL_OBJECT * /*ob*/, long /*type*/, - void const * data, long size) + void const * data, long size) { clipboard_selection.erase(); - + if (size > 0) clipboard_selection.reserve(size); for (int i = 0; i < size; ++i) @@ -559,31 +563,62 @@ extern "C" { } // namespace anon -string const WorkArea::getClipboard() const + +int WorkArea::event_cb(XEvent * xev) +{ + int ret = 0; + switch (xev->type) { + case SelectionRequest: + lyxerr[Debug::GUI] << "X requested selection." << endl; + selectionRequested.emit(); +// ret = 1; + break; + case SelectionClear: + lyxerr[Debug::GUI] << "Lost selection." << endl; + selectionLost.emit(); +// ret = 1; + break; + } + return ret; +} + + +void WorkArea::haveSelection(bool yes) const +{ + if (!yes) { + XSetSelectionOwner(fl_get_display(), XA_PRIMARY, None, CurrentTime); + return; + } + + XSetSelectionOwner(fl_get_display(), XA_PRIMARY, FL_ObjWin(work_area), CurrentTime); +} + + +string const WorkArea::getClipboard() const { clipboard_read = false; - + if (fl_request_clipboard(work_area, 0, request_clipboard_cb) == -1) return string(); XEvent ev; - + while (!clipboard_read) { if (fl_check_forms() == FL_EVENT) { fl_XNextEvent(&ev); - lyxerr << "Received unhandled X11 event" << endl; - lyxerr << "Type: 0x" << std::hex << ev.xany.type << - "Target: 0x" << std::hex << ev.xany.window << endl; + lyxerr << "Received unhandled X11 event" << endl; + lyxerr << "Type: 0x" << hex << ev.xany.type << + " Target: 0x" << hex << ev.xany.window << endl; } } return clipboard_selection; } - + void WorkArea::putClipboard(string const & s) const { static string hold; hold = s; - + fl_stuff_clipboard(work_area, 0, hold.data(), hold.size(), 0); }