mirror of https://github.com/AxioDL/boo.git
Made IM context optional functionality
This commit is contained in:
parent
939c0250be
commit
c96f961c4d
|
@ -163,7 +163,7 @@ class ApplicationXlib final : public IApplication
|
||||||
std::unordered_map<Window, IWindow*> m_windows;
|
std::unordered_map<Window, IWindow*> m_windows;
|
||||||
|
|
||||||
Display* m_xDisp = nullptr;
|
Display* m_xDisp = nullptr;
|
||||||
XIM m_xIM;
|
XIM m_xIM = nullptr;
|
||||||
XFontSet m_fontset;
|
XFontSet m_fontset;
|
||||||
XIMStyle m_bestStyle = 0;
|
XIMStyle m_bestStyle = 0;
|
||||||
int m_xDefaultScreen = 0;
|
int m_xDefaultScreen = 0;
|
||||||
|
@ -260,12 +260,8 @@ public:
|
||||||
if (XSetLocaleModifiers("") == nullptr)
|
if (XSetLocaleModifiers("") == nullptr)
|
||||||
Log.report(LogVisor::Warning, "Cannot set locale modifiers.");
|
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;
|
char** missing_charsets;
|
||||||
int num_missing_charsets = 0;
|
int num_missing_charsets = 0;
|
||||||
char* default_string;
|
char* default_string;
|
||||||
|
@ -299,6 +295,7 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XFree(im_supported_styles);
|
XFree(im_supported_styles);
|
||||||
|
}
|
||||||
|
|
||||||
m_xDefaultScreen = DefaultScreen(m_xDisp);
|
m_xDefaultScreen = DefaultScreen(m_xDisp);
|
||||||
X_CURSORS.m_pointer = XCreateFontCursor(m_xDisp, XC_left_ptr);
|
X_CURSORS.m_pointer = XCreateFontCursor(m_xDisp, XC_left_ptr);
|
||||||
|
|
|
@ -510,7 +510,7 @@ class WindowXlib : public IWindow
|
||||||
Colormap m_colormapId;
|
Colormap m_colormapId;
|
||||||
Window m_windowId;
|
Window m_windowId;
|
||||||
XIMStyle m_bestStyle;
|
XIMStyle m_bestStyle;
|
||||||
XIC m_xIC;
|
XIC m_xIC = nullptr;
|
||||||
GraphicsContextGLX m_gfxCtx;
|
GraphicsContextGLX m_gfxCtx;
|
||||||
uint32_t m_visualId;
|
uint32_t m_visualId;
|
||||||
|
|
||||||
|
@ -603,6 +603,8 @@ public:
|
||||||
* Now go create an IC using the style we chose.
|
* Now go create an IC using the style we chose.
|
||||||
* Also set the window and fontset attributes now.
|
* Also set the window and fontset attributes now.
|
||||||
*/
|
*/
|
||||||
|
if (xIM)
|
||||||
|
{
|
||||||
XPoint pt = {0,0};
|
XPoint pt = {0,0};
|
||||||
XVaNestedList nlist;
|
XVaNestedList nlist;
|
||||||
m_xIC = XCreateIC(xIM, XNInputStyle, bestInputStyle,
|
m_xIC = XCreateIC(xIM, XNInputStyle, bestInputStyle,
|
||||||
|
@ -614,15 +616,11 @@ public:
|
||||||
nullptr),
|
nullptr),
|
||||||
nullptr);
|
nullptr);
|
||||||
XFree(nlist);
|
XFree(nlist);
|
||||||
if (m_xIC == nullptr)
|
|
||||||
{
|
|
||||||
Log.report(LogVisor::FatalError, "Couldn't create input context.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
long im_event_mask;
|
long im_event_mask;
|
||||||
XGetICValues(m_xIC, XNFilterEvents, &im_event_mask, nullptr);
|
XGetICValues(m_xIC, XNFilterEvents, &im_event_mask, nullptr);
|
||||||
XSelectInput(display, m_windowId, swa.event_mask | im_event_mask);
|
XSelectInput(display, m_windowId, swa.event_mask | im_event_mask);
|
||||||
XSetICFocus(m_xIC);
|
XSetICFocus(m_xIC);
|
||||||
|
}
|
||||||
|
|
||||||
/* The XInput 2.1 extension enables per-pixel smooth scrolling trackpads */
|
/* The XInput 2.1 extension enables per-pixel smooth scrolling trackpads */
|
||||||
XIEventMask mask = {XIAllMasterDevices, XIMaskLen(XI_LASTEVENT)};
|
XIEventMask mask = {XIAllMasterDevices, XIMaskLen(XI_LASTEVENT)};
|
||||||
|
@ -904,6 +902,8 @@ public:
|
||||||
} m_clipData;
|
} m_clipData;
|
||||||
|
|
||||||
void claimKeyboardFocus(const int coord[2])
|
void claimKeyboardFocus(const int coord[2])
|
||||||
|
{
|
||||||
|
if (m_xIC)
|
||||||
{
|
{
|
||||||
XLockDisplay(m_xDisp);
|
XLockDisplay(m_xDisp);
|
||||||
if (!coord)
|
if (!coord)
|
||||||
|
@ -920,6 +920,7 @@ public:
|
||||||
XSetICFocus(m_xIC);
|
XSetICFocus(m_xIC);
|
||||||
XUnlockDisplay(m_xDisp);
|
XUnlockDisplay(m_xDisp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool clipboardCopy(EClipboardType type, const uint8_t* data, size_t sz)
|
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
|
/* This procedure sets the application's size constraints and returns
|
||||||
* the IM's preferred size for either the Preedit or Status areas,
|
* the IM's preferred size for either the Preedit or Status areas,
|
||||||
* depending on the value of the name argument. The area argument is
|
* depending on the value of the name argument. The area argument is
|
||||||
|
@ -1167,6 +1169,7 @@ public:
|
||||||
XSetICValues(m_xIC, name, list, nullptr);
|
XSetICValues(m_xIC, name, list, nullptr);
|
||||||
XFree(list);
|
XFree(list);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void _incomingEvent(void* e)
|
void _incomingEvent(void* e)
|
||||||
{
|
{
|
||||||
|
@ -1230,14 +1233,17 @@ public:
|
||||||
EModifierKey modifierKey;
|
EModifierKey modifierKey;
|
||||||
unsigned int state = event->xkey.state;
|
unsigned int state = event->xkey.state;
|
||||||
event->xkey.state &= ~ControlMask;
|
event->xkey.state &= ~ControlMask;
|
||||||
std::string utf8Frag = translateUTF8(&event->xkey, m_xIC);
|
|
||||||
ITextInputCallback* inputCb = m_callback->getTextInputCallback();
|
ITextInputCallback* inputCb = m_callback->getTextInputCallback();
|
||||||
|
if (m_xIC)
|
||||||
|
{
|
||||||
|
std::string utf8Frag = translateUTF8(&event->xkey, m_xIC);
|
||||||
if (utf8Frag.size())
|
if (utf8Frag.size())
|
||||||
{
|
{
|
||||||
if (inputCb)
|
if (inputCb)
|
||||||
inputCb->insertText(utf8Frag);
|
inputCb->insertText(utf8Frag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
char charCode = translateKeysym(&event->xkey, specialKey, modifierKey);
|
char charCode = translateKeysym(&event->xkey, specialKey, modifierKey);
|
||||||
EModifierKey modifierMask = translateModifiers(state);
|
EModifierKey modifierMask = translateModifiers(state);
|
||||||
if (charCode)
|
if (charCode)
|
||||||
|
|
Loading…
Reference in New Issue