X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlookup.C;h=39916ed893366559d45c3e75fe4771ca26cda4ab;hb=757e2c55d8c15db0db5b4127bb3f6f22e4d7d81b;hp=0b4854011618e79fb57f975ff6cd7ff5bff83bb8;hpb=adaef99e60e28eba8c413a3472cc71e234718af0;p=lyx.git diff --git a/src/lyxlookup.C b/src/lyxlookup.C index 0b48540116..39916ed893 100644 --- a/src/lyxlookup.C +++ b/src/lyxlookup.C @@ -4,7 +4,7 @@ * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX team. + * Copyright 1995-2001 The LyX team. * * ====================================================== */ @@ -17,11 +17,9 @@ #ifdef HAVE_XOPENIM // This part is the full blown Input Method manager for X11R5 and up. // For the plain-and-old-X11R4 version, see later. -#include FORMS_H_LOCATION -//#include -//#include -//#include -#if FL_REVISION < 89 +#include +#include +#include #ifdef HAVE_LOCALE_H #include #endif @@ -33,41 +31,59 @@ using std::endl; -static XIM xim; -static XIC xic; +namespace { + +XIM xim; +XIC xic; XComposeStatus compose_status= {0, 0}; +} // namespace anon + + // This is called after the main LyX window has been created void InitLyXLookup(Display * display, Window window) { xic = 0; - + + lyxerr[Debug::KEY] + << "InitLyXLookup: creating an input context." + << endl; + // This part could be done before opening display + string oldlocale = setlocale(LC_CTYPE, 0); setlocale(LC_CTYPE, ""); if (!XSupportsLocale()) { lyxerr[Debug::KEY] << "InitLyXLookup: X does not support this locale." << endl; return; - } - if (!XSetLocaleModifiers("")) { + } + // reset the LC_CTYPE locale to previous value. + setlocale(LC_CTYPE, oldlocale.c_str()); + + char const * locmod; + if (!(locmod = XSetLocaleModifiers(""))) { lyxerr[Debug::KEY] << "InitLyXLookup: Could not set modifiers " "for this locale." << endl; return; } + else + lyxerr[Debug::KEY] << "InitLyXLookup: X locale modifiers are `" + << locmod << '\'' << endl; // This part will have to be done for each frame xim = XOpenIM (display, 0, 0, 0); if (xim) { - xic = XCreateIC(xim, XNInputStyle, - XIMPreeditNothing | XIMStatusNothing, + xic = XCreateIC(xim, + XNInputStyle, + XIMPreeditNothing|XIMStatusNothing, XNClientWindow, window, XNFocusWindow, window, 0); if (!xic) { - lyxerr[Debug::KEY] << "InitLyXLookup: could not create " - "an input context" << endl; + lyxerr[Debug::KEY] << "InitLyXLookup: " + "could not create an input context" << endl; XCloseIM (xim); xim = 0; } @@ -78,22 +94,13 @@ void InitLyXLookup(Display * display, Window window) } -static -bool isDeadEvent(XEvent * event, - char * buffer_return, int bytes_buffer, - KeySym * keysym_return) -{ - XLookupString(&event->xkey, buffer_return, - bytes_buffer, keysym_return, - 0); - - // somehow it is necessary to do the lookup. Why? (JMarc) - if (!lyxrc.override_x_deadkeys) - return false; +namespace { +bool isDeadEvent(KeySym keysym) +{ // Can this be done safely in any other way? // This is all the dead keys I know of in X11R6.1 - switch (*keysym_return) { + switch (keysym) { #ifdef XK_dead_grave case XK_dead_grave: #endif @@ -151,20 +158,35 @@ bool isDeadEvent(XEvent * event, } } +} // namespace anon + // This is called instead of XLookupString() int LyXLookupString(XEvent * event, char * buffer_return, int bytes_buffer, KeySym * keysym_return) { + if (event->type != KeyPress) { + lyxerr << "LyXLookupString: wrong event type: " + << event->type << endl; + return 0; + } + int result = 0; if (xic) { - if (isDeadEvent(event, buffer_return, bytes_buffer, - keysym_return)) { +#if 1 + // somehow it is necessary to do the lookup. Why? (JMarc) + XLookupString(&event->xkey, buffer_return, + bytes_buffer, keysym_return, + 0); + + if (lyxrc.override_x_deadkeys && + isDeadEvent(*keysym_return)) { lyxerr[Debug::KEY] << "LyXLookupString: found DeadEvent" << endl; return 0; } +#endif #if 1 if (XFilterEvent (event, None)) { lyxerr[Debug::KEY] <<"XFilterEvent" << endl; @@ -172,9 +194,6 @@ int LyXLookupString(XEvent * event, return 0; } #endif - if (event->type != KeyPress) - lyxerr << "LyXLookupString: wrong event type" - << event->type << endl; Status status_return = 0; result = XmbLookupString(xic, &event->xkey, buffer_return, @@ -185,7 +204,7 @@ int LyXLookupString(XEvent * event, lyxerr[Debug::KEY] << "XBufferOverflow" << endl; break; case XLookupBoth: - lyxerr[Debug::KEY] << "XLookupBoth" + lyxerr[Debug::KEY] << "XLookupBoth " << string(buffer_return, result) << endl; break; @@ -264,4 +283,3 @@ void CloseLyXLookup() #endif // HAVE_XOPENIM -#endif