X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2Flyx_gui.C;h=3c7daf746b105ceba1b1cf5a18c99a0878269546;hb=c5e3aebca35f1870d0e4062e6deb15e524a1fff7;hp=f95ee8331d7c26c45f2febc20676771032be97ce;hpb=37b0280356122786e2b8532ab19b0fef33f2ee01;p=lyx.git diff --git a/src/frontends/xforms/lyx_gui.C b/src/frontends/xforms/lyx_gui.C index f95ee8331d..3c7daf746b 100644 --- a/src/frontends/xforms/lyx_gui.C +++ b/src/frontends/xforms/lyx_gui.C @@ -8,18 +8,19 @@ */ #include - + #include "lyx_gui.h" - + #include "support/lyxlib.h" #include "support/os.h" #include "support/filetools.h" - + #include "debug.h" #include "gettext.h" - + #include "lyx_main.h" #include "lyxrc.h" +#include "lyxfont.h" // FIXME: move this stuff out again #include "bufferlist.h" @@ -27,21 +28,22 @@ #include "lyxserver.h" #include "BufferView.h" #include "XFormsView.h" - + #include FORMS_H_LOCATION #include "ColorHandler.h" #include "xforms_helpers.h" +#include "xfont_loader.h" #ifdef USE_XFORMS_IMAGE_LOADER -#include "xformsGImage.h" +#include "xformsImage.h" #else #include "graphics/GraphicsImageXPM.h" #endif - +#include "Lsstream.h" +#include #include - #include - + #ifndef CXX_GLOBAL_CSTD using std::exit; #endif @@ -49,15 +51,18 @@ using std::exit; using std::vector; using std::hex; using std::endl; - +using std::setbase; +using std::setfill; +using std::setw; + extern bool finished; extern BufferList bufferlist; - + // FIXME: wrong place ! LyXServer * lyxserver; - + namespace { - + /// set default GUI configuration void setDefaults() { @@ -80,7 +85,7 @@ void setDefaults() | FL_PDBorderWidth, &cntl); } - + extern "C" { int LyX_XErrHandler(Display * display, XErrorEvent * xeev) { @@ -103,19 +108,19 @@ int LyX_XErrHandler(Display * display, XErrorEvent * xeev) { lyx::abort(); return 0; } - + } - + /// read in geometry specification char geometry[40]; - + } // namespace anon - + void lyx_gui::parse_init(int & argc, char * argv[]) { setDefaults(); - + FL_CMD_OPT cmdopt[] = { {"-geometry", "*.geometry", XrmoptionSepArg, "690x510"} }; @@ -125,36 +130,48 @@ void lyx_gui::parse_init(int & argc, char * argv[]) }; const int num_res = sizeof(res)/sizeof(FL_resource); - + fl_initialize(&argc, argv, "LyX", cmdopt, num_res); - + // It appears that, in xforms >=0.89.5, fl_initialize() // calls setlocale() and ruins our LC_NUMERIC setting. locale_init(); - + fl_get_app_resources(res, num_res); - + Display * display = fl_get_display(); - + if (!display) { lyxerr << "LyX: unable to access X display, exiting" << endl; os::warn("Unable to access X display, exiting"); ::exit(1); } - + fcntl(ConnectionNumber(display), F_SETFD, FD_CLOEXEC); - + XSetErrorHandler(LyX_XErrHandler); lyxColorHandler.reset(new LyXColorHandler()); -} + using namespace grfx; + +#ifdef USE_XFORMS_IMAGE_LOADER + // connect the image loader based on the xforms library + Image::newImage = boost::bind(&xformsImage::newImage); + Image::loadableFormats = boost::bind(&xformsImage::loadableFormats); +#else + // connect the image loader based on the XPM library + Image::newImage = boost::bind(&ImageXPM::newImage); + Image::loadableFormats = boost::bind(&ImageXPM::loadableFormats); +#endif +} + void lyx_gui::parse_lyxrc() { - // FIXME !!!! + // FIXME !!!! lyxrc.dpi = 95; - + XformsColor::read(AddName(user_lyxdir, "preferences.xform")); if (lyxrc.popup_font_encoding.empty()) @@ -207,7 +224,7 @@ void lyx_gui::parse_lyxrc() #endif } - + void lyx_gui::start(string const & batch, vector files) { // initial geometry @@ -215,7 +232,7 @@ void lyx_gui::start(string const & batch, vector files) int ypos = -1; unsigned int width = 690; unsigned int height = 510; - + static const int geometryBitmask = XParseGeometry(geometry, &xpos, &ypos, &width, &height); @@ -235,7 +252,7 @@ void lyx_gui::start(string const & batch, vector files) } Screen * s = ScreenOfDisplay(fl_get_display(), fl_screen); - + // recalculate xpos if it's not set if (xpos == -1) xpos = (WidthOfScreen(s) - width) / 2; @@ -246,17 +263,17 @@ void lyx_gui::start(string const & batch, vector files) lyxerr[Debug::GUI] << "Creating view: " << width << "x" << height << "+" << xpos << "+" << ypos << endl; - + XFormsView view(width, height); view.show(xpos, ypos, "LyX"); view.init(); Buffer * last = 0; - + // FIXME: some code below needs moving lyxserver = new LyXServer(view.getLyXFunc(), lyxrc.lyxpipes); - + vector::const_iterator cit = files.begin(); vector::const_iterator end = files.end(); for (; cit != end; ++cit) { @@ -276,7 +293,7 @@ void lyx_gui::start(string const & batch, vector files) view.getLyXFunc()->verboseDispatch(batch, false); } - // enter the event loop + // enter the event loop while (!finished) { if (fl_check_forms() == FL_EVENT) { XEvent ev; @@ -287,24 +304,67 @@ void lyx_gui::start(string const & batch, vector files) } } - // FIXME + // FIXME delete lyxserver; } - - -// Called by the graphics cache to connect the appropriate frontend -// image loading routines to the LyX kernel. -void lyx_gui::init_graphics() + + +string const lyx_gui::hexname(LColor::color col) { - using namespace grfx; + string const name = lcolor.getX11Name(col); + Display * const display = fl_get_display(); + Colormap const cmap = fl_state[fl_get_vclass()].colormap; + XColor xcol, ccol; + + if (XLookupColor(display, cmap, name.c_str(), &xcol, &ccol) == 0) { + lyxerr << "X can't find color \"" + << lcolor.getLyXName(col) + << "\"" << endl; + return string(); + } -#ifdef USE_XFORMS_IMAGE_LOADER - // connect the image loader based on the xforms library - GImage::newImage.connect(boost::bind(&xformsGImage::newImage)); - GImage::loadableFormats.connect(boost::bind(&xformsGImage::loadableFormats)); -#else - // connect the image loader based on the XPM library - GImage::newImage.connect(boost::bind(&GImageXPM::newImage)); - GImage::loadableFormats.connect(boost::bind(&GImageXPM::loadableFormats)); -#endif + ostringstream os; + + // Note that X stores the RGB values in the range 0 - 65535 + // whilst we require them in the range 0 - 255. + os << setbase(16) << setfill('0') + << setw(2) << (xcol.red / 256) + << setw(2) << (xcol.green / 256) + << setw(2) << (xcol.blue / 256); + + return os.str().c_str(); +} + + +void lyx_gui::update_color(LColor::color col) +{ + lyxColorHandler->updateColor(col); +} + + +void lyx_gui::update_fonts() +{ + fontloader.update(); +} + + +bool lyx_gui::font_available(LyXFont const & font) +{ + return fontloader.available(font); +} + +namespace { + +extern "C" +void C_read_callback(int, void * data) +{ + LyXComm * comm = static_cast(data); + comm->read_ready(); +} + +} + +void lyx_gui::set_read_callback(int fd, LyXComm * comm) +{ + fl_add_io_callback(fd, FL_READ, C_read_callback, comm); }