@ -139,6 +139,9 @@ static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int);
static void xdrawglyph ( Glyph , int , int ) ;
static void xdrawglyph ( Glyph , int , int ) ;
static void xclear ( int , int , int , int ) ;
static void xclear ( int , int , int , int ) ;
static int xgeommasktogravity ( 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 xinit ( int , int ) ;
static void cresize ( int , int ) ;
static void cresize ( int , int ) ;
static void xresize ( int , int ) ;
static void xresize ( int , int ) ;
@ -996,6 +999,43 @@ xunloadfonts(void)
xunloadfont ( & dc . ibfont ) ;
xunloadfont ( & dc . ibfont ) ;
}
}
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
void
xinit ( int cols , int rows )
xinit ( int cols , int rows )
{
{
@ -1033,7 +1073,7 @@ xinit(int cols, int rows)
xw . attrs . background_pixel = dc . col [ defaultbg ] . pixel ;
xw . attrs . background_pixel = dc . col [ defaultbg ] . pixel ;
xw . attrs . border_pixel = dc . col [ defaultbg ] . pixel ;
xw . attrs . border_pixel = dc . col [ defaultbg ] . pixel ;
xw . attrs . bit_gravity = NorthWestGravity ;
xw . attrs . bit_gravity = NorthWestGravity ;
xw . attrs . event_mask = FocusChangeMask | KeyPressMask
xw . attrs . event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask
| ExposureMask | VisibilityChangeMask | StructureNotifyMask
| ExposureMask | VisibilityChangeMask | StructureNotifyMask
| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask ;
| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask ;
xw . attrs . colormap = xw . cmap ;
xw . attrs . colormap = xw . cmap ;
@ -1061,22 +1101,7 @@ xinit(int cols, int rows)
xw . draw = XftDrawCreate ( xw . dpy , xw . buf , xw . vis , xw . cmap ) ;
xw . draw = XftDrawCreate ( xw . dpy , xw . buf , xw . vis , xw . cmap ) ;
/* input methods */
/* input methods */
if ( ( xw . xim = XOpenIM ( xw . dpy , NULL , NULL , NULL ) ) = = NULL ) {
ximopen ( xw . dpy ) ;
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 " ) ;
/* white cursor, black outline */
/* white cursor, black outline */
cursor = XCreateFontCursor ( xw . dpy , mouseshape ) ;
cursor = XCreateFontCursor ( xw . dpy , mouseshape ) ;
@ -1554,6 +1579,16 @@ xfinishdraw(void)
defaultfg : defaultbg ] . pixel ) ;
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
void
expose ( XEvent * ev )
expose ( XEvent * ev )
{
{