From c96f961c4d67945cf684a31b744ebf82462ebf44 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 6 Jan 2016 11:02:23 -1000 Subject: [PATCH] Made IM context optional functionality --- lib/x11/ApplicationXlib.hpp | 71 +++++++++++++++++----------------- lib/x11/WindowXlib.cpp | 76 ++++++++++++++++++++----------------- 2 files changed, 75 insertions(+), 72 deletions(-) diff --git a/lib/x11/ApplicationXlib.hpp b/lib/x11/ApplicationXlib.hpp index d97c348..745e0fa 100644 --- a/lib/x11/ApplicationXlib.hpp +++ b/lib/x11/ApplicationXlib.hpp @@ -163,7 +163,7 @@ class ApplicationXlib final : public IApplication std::unordered_map m_windows; Display* m_xDisp = nullptr; - XIM m_xIM; + XIM m_xIM = nullptr; XFontSet m_fontset; XIMStyle m_bestStyle = 0; int m_xDefaultScreen = 0; @@ -260,45 +260,42 @@ public: if (XSetLocaleModifiers("") == nullptr) Log.report(LogVisor::Warning, "Cannot set locale modifiers."); - if ((m_xIM = XOpenIM(m_xDisp, nullptr, nullptr, nullptr)) == nullptr) + if ((m_xIM = XOpenIM(m_xDisp, nullptr, nullptr, nullptr))) { - Log.report(LogVisor::FatalError, "Couldn't open input method."); - return; - } + char** missing_charsets; + int num_missing_charsets = 0; + char* default_string; + m_fontset = XCreateFontSet(m_xDisp, + "-adobe-helvetica-*-r-*-*-*-120-*-*-*-*-*-*,\ + -misc-fixed-*-r-*-*-*-130-*-*-*-*-*-*", + &missing_charsets, &num_missing_charsets, + &default_string); - char** missing_charsets; - int num_missing_charsets = 0; - char* default_string; - m_fontset = XCreateFontSet(m_xDisp, - "-adobe-helvetica-*-r-*-*-*-120-*-*-*-*-*-*,\ - -misc-fixed-*-r-*-*-*-130-*-*-*-*-*-*", - &missing_charsets, &num_missing_charsets, - &default_string); - - /* figure out which styles the IM can support */ - XIMStyles* im_supported_styles; - XIMStyle app_supported_styles; - XGetIMValues(m_xIM, XNQueryInputStyle, &im_supported_styles, nullptr); - /* set flags for the styles our application can support */ - app_supported_styles = XIMPreeditNone | XIMPreeditNothing | XIMPreeditPosition; - app_supported_styles |= XIMStatusNone | XIMStatusNothing; - /* - * now look at each of the IM supported styles, and - * chose the "best" one that we can support. - */ - for (int i=0 ; icount_styles ; ++i) - { - XIMStyle style = im_supported_styles->supported_styles[i]; - if ((style & app_supported_styles) == style) /* if we can handle it */ - m_bestStyle = ChooseBetterStyle(style, m_bestStyle); + /* figure out which styles the IM can support */ + XIMStyles* im_supported_styles; + XIMStyle app_supported_styles; + XGetIMValues(m_xIM, XNQueryInputStyle, &im_supported_styles, nullptr); + /* set flags for the styles our application can support */ + app_supported_styles = XIMPreeditNone | XIMPreeditNothing | XIMPreeditPosition; + app_supported_styles |= XIMStatusNone | XIMStatusNothing; + /* + * now look at each of the IM supported styles, and + * chose the "best" one that we can support. + */ + for (int i=0 ; icount_styles ; ++i) + { + XIMStyle style = im_supported_styles->supported_styles[i]; + if ((style & app_supported_styles) == style) /* if we can handle it */ + m_bestStyle = ChooseBetterStyle(style, m_bestStyle); + } + /* if we couldn't support any of them, print an error and exit */ + if (m_bestStyle == 0) + { + Log.report(LogVisor::FatalError, "interaction style not supported."); + return; + } + XFree(im_supported_styles); } - /* if we couldn't support any of them, print an error and exit */ - if (m_bestStyle == 0) - { - Log.report(LogVisor::FatalError, "interaction style not supported."); - return; - } - XFree(im_supported_styles); m_xDefaultScreen = DefaultScreen(m_xDisp); X_CURSORS.m_pointer = XCreateFontCursor(m_xDisp, XC_left_ptr); diff --git a/lib/x11/WindowXlib.cpp b/lib/x11/WindowXlib.cpp index 252e549..1b7fc3f 100644 --- a/lib/x11/WindowXlib.cpp +++ b/lib/x11/WindowXlib.cpp @@ -510,7 +510,7 @@ class WindowXlib : public IWindow Colormap m_colormapId; Window m_windowId; XIMStyle m_bestStyle; - XIC m_xIC; + XIC m_xIC = nullptr; GraphicsContextGLX m_gfxCtx; uint32_t m_visualId; @@ -603,26 +603,24 @@ public: * Now go create an IC using the style we chose. * Also set the window and fontset attributes now. */ - XPoint pt = {0,0}; - XVaNestedList nlist; - m_xIC = XCreateIC(xIM, XNInputStyle, bestInputStyle, - XNClientWindow, m_windowId, - XNFocusWindow, m_windowId, - XNPreeditAttributes, nlist = XVaCreateNestedList(0, - XNSpotLocation, &pt, - XNFontSet, fontset, - nullptr), - nullptr); - XFree(nlist); - if (m_xIC == nullptr) + if (xIM) { - Log.report(LogVisor::FatalError, "Couldn't create input context."); - return; + XPoint pt = {0,0}; + XVaNestedList nlist; + m_xIC = XCreateIC(xIM, XNInputStyle, bestInputStyle, + XNClientWindow, m_windowId, + XNFocusWindow, m_windowId, + XNPreeditAttributes, nlist = XVaCreateNestedList(0, + XNSpotLocation, &pt, + XNFontSet, fontset, + nullptr), + nullptr); + XFree(nlist); + long im_event_mask; + XGetICValues(m_xIC, XNFilterEvents, &im_event_mask, nullptr); + XSelectInput(display, m_windowId, swa.event_mask | im_event_mask); + XSetICFocus(m_xIC); } - long im_event_mask; - XGetICValues(m_xIC, XNFilterEvents, &im_event_mask, nullptr); - XSelectInput(display, m_windowId, swa.event_mask | im_event_mask); - XSetICFocus(m_xIC); /* The XInput 2.1 extension enables per-pixel smooth scrolling trackpads */ XIEventMask mask = {XIAllMasterDevices, XIMaskLen(XI_LASTEVENT)}; @@ -905,20 +903,23 @@ public: void claimKeyboardFocus(const int coord[2]) { - XLockDisplay(m_xDisp); - if (!coord) + if (m_xIC) { - XUnsetICFocus(m_xIC); + XLockDisplay(m_xDisp); + if (!coord) + { + XUnsetICFocus(m_xIC); + XUnlockDisplay(m_xDisp); + return; + } + getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]); + XPoint pt = {short(coord[0]), short(m_wrect.size[1] - coord[1])}; + XVaNestedList list = XVaCreateNestedList(0, XNSpotLocation, &pt, nullptr); + XSetICValues(m_xIC, XNPreeditAttributes, list, nullptr); + XFree(list); + XSetICFocus(m_xIC); XUnlockDisplay(m_xDisp); - return; } - getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]); - XPoint pt = {short(coord[0]), short(m_wrect.size[1] - coord[1])}; - XVaNestedList list = XVaCreateNestedList(0, XNSpotLocation, &pt, nullptr); - XSetICValues(m_xIC, XNPreeditAttributes, list, nullptr); - XFree(list); - XSetICFocus(m_xIC); - XUnlockDisplay(m_xDisp); } bool clipboardCopy(EClipboardType type, const uint8_t* data, size_t sz) @@ -1141,6 +1142,7 @@ public: }; } +#if 0 /* This procedure sets the application's size constraints and returns * the IM's preferred size for either the Preedit or Status areas, * depending on the value of the name argument. The area argument is @@ -1167,6 +1169,7 @@ public: XSetICValues(m_xIC, name, list, nullptr); XFree(list); } +#endif void _incomingEvent(void* e) { @@ -1230,13 +1233,16 @@ public: EModifierKey modifierKey; unsigned int state = event->xkey.state; event->xkey.state &= ~ControlMask; - std::string utf8Frag = translateUTF8(&event->xkey, m_xIC); ITextInputCallback* inputCb = m_callback->getTextInputCallback(); - if (utf8Frag.size()) + if (m_xIC) { - if (inputCb) - inputCb->insertText(utf8Frag); - return; + std::string utf8Frag = translateUTF8(&event->xkey, m_xIC); + if (utf8Frag.size()) + { + if (inputCb) + inputCb->insertText(utf8Frag); + return; + } } char charCode = translateKeysym(&event->xkey, specialKey, modifierKey); EModifierKey modifierMask = translateModifiers(state);