diff --git a/README.md b/README.md index 215e09e..9b5a7cf 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - [fixime](https://st.suckless.org/patches/fix_ime/) - adds better Input Method Editor (IME) support + - (included in the base as per [35f7db](https://git.suckless.org/st/commit/e85b6b64660214121164ea97fb098eaa4935f7db.html)) - [fix-keyboard-input](https://st.suckless.org/patches/fix_keyboard_input/) - allows cli applications to use all the fancy key combinations that are available to GUI applications diff --git a/patch/fixime.c b/patch/fixime.c deleted file mode 100644 index 43ee06f..0000000 --- a/patch/fixime.c +++ /dev/null @@ -1,49 +0,0 @@ -void -ximopen(Display *dpy) -{ - XIMCallback destroy = { .client_data = NULL, .callback = ximdestroy }; - - if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { - XSetLocaleModifiers("@im=local"); - if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { - XSetLocaleModifiers("@im="); - if ((xw.xim = XOpenIM(xw.dpy, - NULL, NULL, NULL)) == NULL) { - die("XOpenIM failed. Could not open input" - " device.\n"); - } - } - } - if (XSetIMValues(xw.xim, XNDestroyCallback, &destroy, NULL) != NULL) - die("XSetIMValues failed. Could not set input method value.\n"); - xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, xw.win, XNFocusWindow, xw.win, NULL); - if (xw.xic == NULL) - die("XCreateIC failed. Could not obtain input method.\n"); -} - -void -ximinstantiate(Display *dpy, XPointer client, XPointer call) -{ - ximopen(dpy); - XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); -} - -void -ximdestroy(XIM xim, XPointer client, XPointer call) -{ - xw.xim = NULL; - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); -} - -void -xximspot(int x, int y) -{ - XPoint spot = { borderpx + x * win.cw, borderpx + (y + 1) * win.ch }; - XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spot, NULL); - - XSetICValues(xw.xic, XNPreeditAttributes, attr, NULL); - XFree(attr); -} \ No newline at end of file diff --git a/patch/fixime_st.h b/patch/fixime_st.h deleted file mode 100644 index 42038f1..0000000 --- a/patch/fixime_st.h +++ /dev/null @@ -1 +0,0 @@ -void xximspot(int, int); \ No newline at end of file diff --git a/patch/fixime_x.h b/patch/fixime_x.h deleted file mode 100644 index 959e178..0000000 --- a/patch/fixime_x.h +++ /dev/null @@ -1,4 +0,0 @@ -static void ximopen(Display *); -static void ximinstantiate(Display *, XPointer, XPointer); -static void ximdestroy(XIM, XPointer, XPointer); -void xximspot(int, int); \ No newline at end of file diff --git a/patch/st_include.h b/patch/st_include.h index b6df8ac..6ba2ea1 100644 --- a/patch/st_include.h +++ b/patch/st_include.h @@ -5,9 +5,6 @@ #if EXTERNALPIPE_PATCH #include "externalpipe.h" #endif -#if FIXIME_PATCH -#include "fixime_st.h" -#endif #if ISO14755_PATCH #include "iso14755.h" #endif diff --git a/patch/x_include.c b/patch/x_include.c index 85bed54..bd32652 100644 --- a/patch/x_include.c +++ b/patch/x_include.c @@ -5,9 +5,6 @@ #if OPENCOPIED_PATCH #include "opencopied.c" #endif -#if FIXIME_PATCH -#include "fixime.c" -#endif #if FIXKEYBOARDINPUT_PATCH #include "fixkeyboardinput.c" #endif diff --git a/patch/x_include.h b/patch/x_include.h index 8d01dfe..7115db2 100644 --- a/patch/x_include.h +++ b/patch/x_include.h @@ -5,9 +5,6 @@ #if OPENCOPIED_PATCH #include "opencopied.h" #endif -#if FIXIME_PATCH -#include "fixime_x.h" -#endif #if FONT2_PATCH #include "font2.h" #endif diff --git a/patches.def.h b/patches.def.h index 566e3e5..9f55d48 100644 --- a/patches.def.h +++ b/patches.def.h @@ -68,11 +68,6 @@ */ #define EXTERNALPIPE_PATCH 0 -/* This patch adds better Input Method Editor (IME) support. - * https://st.suckless.org/patches/fix_ime/ - */ -#define FIXIME_PATCH 0 - /* This patch allows command line applications to use all the fancy key combinations * that are available to GUI applications. * https://st.suckless.org/patches/fix_keyboard_input/ diff --git a/st.c b/st.c index 1ed81ff..5312a2f 100644 --- a/st.c +++ b/st.c @@ -2752,9 +2752,7 @@ draw(void) term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx, term.ocy = term.c.y; xfinishdraw(); - #if FIXIME_PATCH xximspot(term.ocx, term.ocy); - #endif // FIXIME_PATCH } void diff --git a/win.h b/win.h index 820a4a3..3c17fb2 100644 --- a/win.h +++ b/win.h @@ -39,3 +39,4 @@ void xsetmode(int, unsigned int); void xsetpointermotion(int); void xsetsel(char *); int xstartdraw(void); +void xximspot(int, int); diff --git a/x.c b/x.c index 2fa5094..f3f0dab 100644 --- a/x.c +++ b/x.c @@ -166,6 +166,9 @@ static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); static void xdrawglyph(Glyph, int, int); static void xclear(int, int, int, int); static int xgeommasktogravity(int); +static void ximopen(Display *); +static void ximinstantiate(Display *, XPointer, XPointer); +static void ximdestroy(XIM, XPointer, XPointer); static void xinit(int, int); static void cresize(int, int); static void xresize(int, int); @@ -946,6 +949,46 @@ xgeommasktogravity(int mask) return SouthEastGravity; } +void +ximopen(Display *dpy) +{ + XIMCallback destroy = { .client_data = NULL, .callback = ximdestroy }; + + if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { + XSetLocaleModifiers("@im=local"); + if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { + XSetLocaleModifiers("@im="); + if ((xw.xim = XOpenIM(xw.dpy, + NULL, NULL, NULL)) == NULL) { + die("XOpenIM failed. Could not open input" + " device.\n"); + } + } + } + if (XSetIMValues(xw.xim, XNDestroyCallback, &destroy, NULL) != NULL) + die("XSetIMValues failed. Could not set input method value.\n"); + xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, xw.win, XNFocusWindow, xw.win, NULL); + if (xw.xic == NULL) + die("XCreateIC failed. Could not obtain input method.\n"); +} + +void +ximinstantiate(Display *dpy, XPointer client, XPointer call) +{ + ximopen(dpy); + XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); +} + +void +ximdestroy(XIM xim, XPointer client, XPointer call) +{ + xw.xim = NULL; + XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); +} + int xloadfont(Font *f, FcPattern *pattern) { @@ -1196,10 +1239,7 @@ xinit(int cols, int rows) xw.attrs.background_pixel = dc.col[defaultbg].pixel; xw.attrs.border_pixel = dc.col[defaultbg].pixel; xw.attrs.bit_gravity = NorthWestGravity; - xw.attrs.event_mask = FocusChangeMask | KeyPressMask - #if FIXIME_PATCH - | KeyReleaseMask - #endif // FIXIME_PATCH + xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask #if ST_EMBEDDER_PATCH @@ -1243,26 +1283,7 @@ xinit(int cols, int rows) xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); /* input methods */ - #if FIXIME_PATCH ximopen(xw.dpy); - #else - if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { - XSetLocaleModifiers("@im=local"); - if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { - XSetLocaleModifiers("@im="); - if ((xw.xim = XOpenIM(xw.dpy, - NULL, NULL, NULL)) == NULL) { - die("XOpenIM failed. Could not open input" - " device.\n"); - } - } - } - xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing - | XIMStatusNothing, XNClientWindow, xw.win, - XNFocusWindow, xw.win, NULL); - if (xw.xic == NULL) - die("XCreateIC failed. Could not obtain input method.\n"); - #endif // FIXIME_PATCH /* white cursor, black outline */ #if HIDECURSOR_PATCH @@ -1885,6 +1906,16 @@ xfinishdraw(void) defaultfg : defaultbg].pixel); } +void +xximspot(int x, int y) +{ + XPoint spot = { borderpx + x * win.cw, borderpx + (y + 1) * win.ch }; + XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spot, NULL); + + XSetICValues(xw.xic, XNPreeditAttributes, attr, NULL); + XFree(attr); +} + void expose(XEvent *ev) {