diff -cNr aterm-0.4.2.orig/autoconf/acconfig.h aterm-0.4.2/autoconf/acconfig.h *** aterm-0.4.2.orig/autoconf/acconfig.h Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/autoconf/acconfig.h Sun Sep 30 15:13:21 2001 *************** *** 38,44 **** --- 38,49 ---- /* Define if Xlocale support doesn't work */ #undef NO_XLOCALE + #undef USE_XIM + /* Define is setlocale (defined to Xsetlocale) doesn't work */ + #undef NO_XSETLOCALE + + /* Define is plain setlocale doesn't work */ #undef NO_SETLOCALE /* Define if you want Menubar support */ diff -cNr aterm-0.4.2.orig/autoconf/config.h.in aterm-0.4.2/autoconf/config.h.in *** aterm-0.4.2.orig/autoconf/config.h.in Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/autoconf/config.h.in Sun Sep 30 15:14:08 2001 *************** *** 88,94 **** --- 88,99 ---- /* Define if Xlocale support doesn't work */ #undef NO_XLOCALE + #undef USE_XIM + /* Define is setlocale (defined to Xsetlocale) doesn't work */ + #undef NO_XSETLOCALE + + /* Define is plain setlocale doesn't work */ #undef NO_SETLOCALE /* Define if you want Menubar support */ diff -cNr aterm-0.4.2.orig/autoconf/configure.in aterm-0.4.2/autoconf/configure.in *** aterm-0.4.2.orig/autoconf/configure.in Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/autoconf/configure.in Sun Sep 30 15:18:11 2001 *************** *** 106,111 **** --- 106,117 ---- AC_DEFINE(ZH) fi]) + AC_ARG_ENABLE(xim, + [ --enable-xim enable xim support], + [if test x$enableval = xyes; then + AC_DEFINE(USE_XIM) + fi]) + AC_ARG_ENABLE(greek, [ --enable-greek enable greek keyboard support], [if test x$enableval = xyes; then *************** *** 642,647 **** --- 648,654 ---- dnl# this is a really hack test for some basic Xlocale stuff SAVETHELIBS=$LIBS LIBS="$LIBS $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11" + CFLAGS="$CFLAGS $X_CFLAGS" AC_CACHE_CHECK(for working Xlocale, rxvt_cv_func_xlocale, [AC_TRY_RUN( [#define X_LOCALE 1 *************** *** 667,672 **** --- 674,687 ---- [setlocale(LC_CTYPE, "");], rxvt_cv_func_xsetlocale=yes, rxvt_cv_func_xsetlocale=no)]) if test "${rxvt_cv_func_xsetlocale}" = no; then + AC_DEFINE(NO_XSETLOCALE) + fi + + AC_CACHE_CHECK(for working plain setlocale, rxvt_cv_func_setlocale, + [AC_TRY_LINK([#include ], + [setlocale(LC_CTYPE, "");], + rxvt_cv_func_setlocale=yes, rxvt_cv_func_setlocale=no)]) + if test x${rxvt_cv_func_setlocale} = xno; then AC_DEFINE(NO_SETLOCALE) fi diff -cNr aterm-0.4.2.orig/configure aterm-0.4.2/configure *** aterm-0.4.2.orig/configure Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/configure Sun Sep 30 17:00:35 2001 *************** *** 36,41 **** --- 36,43 ---- ac_help="$ac_help --enable-big5 enable big5 support" ac_help="$ac_help + --enable-xim enable xim support" + ac_help="$ac_help --enable-greek enable greek keyboard support" ac_help="$ac_help --enable-thai enable thai support" *************** *** 786,791 **** --- 788,804 ---- fi fi + # Check whether --enable-xim or --disable-xim was given. + if test "${enable_xim+set}" = set; then + enableval="$enable_xim" + if test x$enableval = xyes; then + cat >> confdefs.h <<\EOF + #define USE_XIM 1 + EOF + + fi + fi + # Check whether --enable-greek or --disable-greek was given. if test "${enable_greek+set}" = set; then *************** *** 4649,4654 **** --- 4662,4668 ---- SAVETHELIBS=$LIBS LIBS="$LIBS $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11" + CFLAGS="$CFLAGS $X_CFLAGS" echo $ac_n "checking for working Xlocale""... $ac_c" 1>&6 echo "configure:4654: checking for working Xlocale" >&5 if eval "test \"`echo '$''{'rxvt_cv_func_xlocale'+set}'`\" = set"; then *************** *** 4724,4730 **** echo "$ac_t""$rxvt_cv_func_xsetlocale" 1>&6 if test "${rxvt_cv_func_xsetlocale}" = no; then cat >> confdefs.h <<\EOF ! #define NO_SETLOCALE 1 EOF fi --- 4738,4777 ---- echo "$ac_t""$rxvt_cv_func_xsetlocale" 1>&6 if test "${rxvt_cv_func_xsetlocale}" = no; then cat >> confdefs.h <<\EOF ! #define NO_XSETLOCALE 1 ! EOF ! ! fi ! ! echo $ac_n "checking for working plain setlocale""... $ac_c" 1>&6 ! echo "configure:4659: checking for working plain setlocale" >&5 ! if eval "test \"`echo '$''{'rxvt_cv_func_setlocale'+set}'`\" = set"; then ! echo $ac_n "(cached) $ac_c" 1>&6 ! else ! cat > conftest.$ac_ext < ! int main() { ! setlocale(LC_CTYPE, ""); ! ; return 0; } ! EOF ! if { (eval echo configure:4671: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ! rm -rf conftest* ! rxvt_cv_func_setlocale=yes ! else ! echo "configure: failed program was:" >&5 ! cat conftest.$ac_ext >&5 ! rm -rf conftest* ! rxvt_cv_func_setlocale=no ! fi ! rm -f conftest* ! fi ! ! echo "$ac_t""$rxvt_cv_func_setlocale" 1>&6 ! if test x${rxvt_cv_func_setlocale} = xno; then ! cat >> confdefs.h <<\EOF ! efine NO_SETLOCALE 1 EOF fi diff -cNr aterm-0.4.2.orig/scripts/random_colors aterm-0.4.2/scripts/random_colors *** aterm-0.4.2.orig/scripts/random_colors Thu Jan 1 08:00:00 1970 --- aterm-0.4.2/scripts/random_colors Sun Sep 30 17:01:24 2001 *************** *** 0 **** --- 1,18 ---- + #!/bin/bash + + # This script will launch aterm with different tinting color + # every time you start it + # I don't really know how that can be of any use at all, but some + # folks like it - so here it is + + CLRCODE=`expr $RANDOM % 6` + ATRMPATH=$DESTDIR/usr/local/bin + + { [ "$CLRCODE" -eq "0" ] && CLRNAME="-tint blue -fg yellow -bg black"; } || + { [ "$CLRCODE" -eq "1" ] && CLRNAME="-tint red -fg white -bg black"; } || + { [ "$CLRCODE" -eq "2" ] && CLRNAME="-tint green -fg white -bg white"; } || + { [ "$CLRCODE" -eq "3" ] && CLRNAME="-tint cyan -fg white -bg white"; } || + { [ "$CLRCODE" -eq "4" ] && CLRNAME="-tint magenta -fg white -bg black"; } || + { [ "$CLRCODE" -eq "5" ] && CLRNAME="-tint yellow -fg blue -bg white"; } + + exec $ATRMPATH/aterm -fg white -tr $CLRNAME $@ diff -cNr aterm-0.4.2.orig/src/command.c aterm-0.4.2/src/command.c *** aterm-0.4.2.orig/src/command.c Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/command.c Sun Sep 30 14:36:49 2001 *************** *** 69,80 **** #ifndef NO_XLOCALE # if (XtSpecificationRelease < 6) # define NO_XLOCALE - # else - # define X_LOCALE - # include # endif #endif /* NO_XLOCALE */ #ifdef TTY_GID_SUPPORT # include #endif --- 69,87 ---- #ifndef NO_XLOCALE # if (XtSpecificationRelease < 6) # define NO_XLOCALE # endif #endif /* NO_XLOCALE */ + #ifndef NO_XSETLOCALE + # define X_LOCALE + # include + #else + # ifndef NO_SETLOCALE + # include + # endif + #endif /* NO_XLOCALE */ + + #ifdef TTY_GID_SUPPORT # include #endif *************** *** 182,190 **** /*{{{ defines: */ ! #define KBUFSZ 8 /* size of keyboard mapping buffer */ ! #define STRING_MAX 512 /* max string size for process_xterm_seq() */ ! #define ESC_ARGS 32 /* max # of args for esc sequences */ /* a large REFRESH_PERIOD causes problems with `cat' */ #define REFRESH_PERIOD 1 --- 189,201 ---- /*{{{ defines: */ ! #ifdef USE_XIM ! # define KBUFSZ 64 /* size of keyboard mapping buffer */ ! #else ! # define KBUFSZ 8 /* size of keyboard mapping buffer */ ! #endif ! #define STRING_MAX 512 /* max string size for process_xterm_seq() */ ! #define ESC_ARGS 32 /* max # of args for esc sequences */ /* a large REFRESH_PERIOD causes problems with `cat' */ #define REFRESH_PERIOD 1 *************** *** 308,318 **** --- 319,333 ---- static Atom DndProtocol, DndSelection; #endif /* OFFIX_DND */ + #ifdef USE_XIM + static XIC Input_Context; /* input context */ + #else #ifndef NO_XLOCALE static char *rs_inputMethod = ""; /* XtNinputMethod */ static char *rs_preeditType = NULL; /* XtNpreeditType */ static XIC Input_Context; /* input context */ #endif /* NO_XLOCALE */ + #endif /* USE_XIM */ /* command input buffering */ #ifndef BUFSIZ *************** *** 534,540 **** ttydev = tty_name; # define PTYCHAR1 "pqrstuvwxyz" ! # define PTYCHAR2 "0123456789abcdef" for (c1 = PTYCHAR1; *c1; c1++) { ptydev[len - 2] = ttydev[len - 2] = *c1; for (c2 = PTYCHAR2; *c2; c2++) { --- 549,555 ---- ttydev = tty_name; # define PTYCHAR1 "pqrstuvwxyz" ! # define PTYCHAR2 "0123456789abcdefghijklmnopqrstuvwxyz" for (c1 = PTYCHAR1; *c1; c1++) { ptydev[len - 2] = ttydev[len - 2] = *c1; for (c2 = PTYCHAR2; *c2; c2++) { *************** *** 1137,1143 **** --- 1152,1167 ---- DndSelection = XInternAtom(Xdisplay, "DndSelection", False); #endif /* OFFIX_DND */ + #ifndef NO_XLOCALE init_xlocale(); + #else + setlocale(LC_CTYPE, ""); + #endif + + #ifdef USE_XIM + setTermFontSet(); + XRegisterIMInstantiateCallback(Xdisplay, NULL, NULL, NULL, IMInstantiateCallback, NULL); + #endif /* get number of available file descriptors */ #ifdef _POSIX_VERSION *************** *** 1204,1209 **** --- 1228,1234 ---- init_xlocale(void) { #ifndef NO_XLOCALE + #ifndef USE_XIM char *p, *s, buf[32], tmp[1024]; XIM xim = NULL; XIMStyle input_style = 0; *************** *** 1212,1218 **** Input_Context = NULL; ! # ifndef NO_SETLOCALE /* setlocale(LC_CTYPE, ""); /* XXX: should we do this? */ # endif if (rs_inputMethod == NULL || !*rs_inputMethod) { --- 1237,1243 ---- Input_Context = NULL; ! # if !defined(NO_SETLOCALE) || !defined(NO_XSETLOCALE) /* setlocale(LC_CTYPE, ""); /* XXX: should we do this? */ # endif if (rs_inputMethod == NULL || !*rs_inputMethod) { *************** *** 1311,1316 **** --- 1336,1342 ---- print_error("Failed to create input context"); XCloseIM(xim); } + #endif /* USE_XIM */ #endif /* NO_XLOCALE */ } /*}}} */ *************** *** 1379,1400 **** numlock_state = (ev->xkey.state & ModNumLockMask); /* numlock toggle */ PrivMode((!numlock_state), PrivMode_aplKP); } ! #ifndef NO_XLOCALE ! if (!XFilterEvent(ev, *(&ev->xkey.window))) { ! if (Input_Context != NULL) { ! Status status_return; ! ! len = XmbLookupString(Input_Context, &ev->xkey, kbuf, ! sizeof(kbuf), &keysym, ! &status_return); ! } else { ! len = XLookupString(&ev->xkey, kbuf, ! sizeof(kbuf), &keysym, ! &compose); ! } ! } else ! len = 0; ! #else /* NO_XLOCALE */ len = XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, &compose); /* * have unmapped Latin[2-4] entries -> Latin1 --- 1405,1425 ---- numlock_state = (ev->xkey.state & ModNumLockMask); /* numlock toggle */ PrivMode((!numlock_state), PrivMode_aplKP); } ! #ifdef USE_XIM ! len = 0; ! if (Input_Context != NULL) { ! Status status_return; ! ! kbuf[0] = '\0'; ! len = XmbLookupString(Input_Context, &ev->xkey, kbuf, ! sizeof(kbuf), &keysym, ! &status_return); ! } else { ! len = XLookupString(&ev->xkey, kbuf, ! sizeof(kbuf), &keysym, ! &compose); ! } ! #else /* USE_XIM */ len = XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, &compose); /* * have unmapped Latin[2-4] entries -> Latin1 *************** *** 1404,1410 **** len = 1; kbuf[0] = (keysym & 0xFF); } ! #endif /* NO_XLOCALE */ if (len && (Options & Opt_scrollKeypress)) TermWin.view_start = 0; --- 1429,1435 ---- len = 1; kbuf[0] = (keysym & 0xFF); } ! #endif /* USE_XIM */ if (len && (Options & Opt_scrollKeypress)) TermWin.view_start = 0; *************** *** 1977,1984 **** --- 2002,2013 ---- XEvent ev; refreshed = 0; + #ifdef USE_XIM + XProcessEvent(Xdisplay); + #else XNextEvent(Xdisplay, &ev); process_x_event(&ev); + #endif /* in case button actions pushed chars to cmdbuf */ if (cmdbuf_ptr < cmdbuf_endp) *************** *** 2050,2055 **** --- 2079,2087 ---- refreshed = 1; scr_refresh(refresh_type); scrollbar_show(1); + #ifdef USE_XIM + IMSendSpot(); + #endif } } } *************** *** 2225,2231 **** on_colors_changed(Color_bg); } #endif ! #ifndef NO_XLOCALE if (Input_Context != NULL) XSetICFocus(Input_Context); #endif --- 2257,2263 ---- on_colors_changed(Color_bg); } #endif ! #ifndef USE_XIM if (Input_Context != NULL) XSetICFocus(Input_Context); #endif *************** *** 2242,2248 **** on_colors_changed(Color_bg); } #endif ! #ifndef NO_XLOCALE if (Input_Context != NULL) XUnsetICFocus(Input_Context); #endif --- 2274,2280 ---- on_colors_changed(Color_bg); } #endif ! #ifndef USE_XIM if (Input_Context != NULL) XUnsetICFocus(Input_Context); #endif *************** *** 2720,2725 **** --- 2752,2760 ---- scr_refresh(refresh_type); refresh_count = refresh_limit = 0; scrollbar_show(1); + #ifdef USE_XIM + IMSendSpot(); + #endif } break; } *************** *** 3444,3449 **** --- 3479,3487 ---- } } Gr_do_graphics(cmd, nargs, args, text); + #ifdef USE_XIM + IMSendSpot(); + #endif #endif } /*}}} */ *************** *** 3611,3617 **** --- 3649,4013 ---- } } + #ifdef USE_XIM + /* PROTO */ + void + setSize( XRectangle *size ) + { + size->x = TermWin_internalBorder; + size->y = TermWin_internalBorder; + size->width = Width2Pixel (TermWin.ncol); + size->height = Height2Pixel(TermWin.nrow); + return; + } + + /* PROTO */ + void + setColor( unsigned long *fg, unsigned long *bg ) + { + *fg = PixColors[Color_fg]; + *bg = PixColors[Color_bg]; + return; + } + /* PROTO */ + void + IMSendSpot( void ) + { + XPoint spot; + XVaNestedList preedit_attr; + XIMStyle input_style; + + if( Input_Context == NULL ) + return; + else { + XGetICValues(Input_Context,XNInputStyle,&input_style,NULL); + if (!(input_style & XIMPreeditPosition)) + return; + } + setPosition( &spot ); + + preedit_attr = XVaCreateNestedList( 0, XNSpotLocation, &spot, NULL ); + XSetICValues( Input_Context, XNPreeditAttributes, preedit_attr, NULL ); + XFree( preedit_attr ); + return; + } + + /* PROTO */ + void + setTermFontSet( void ) + { + char *string; + long length, i; + + if( TermWin.fontset != NULL ){ + XFreeFontSet( Xdisplay, TermWin.fontset ); + TermWin.fontset = NULL; + } + + length = 0; + for( i = 0 ; i < NFONTS ; i ++){ + if( rs_font[ i ] ) + length += strlen( rs_font[ i ] ) + 1; + # ifdef MULTICHAR_SET + if( rs_mfont[ i ] ) + length += strlen( rs_mfont[ i ] ) + 1; + # endif + } + if( ( string = malloc( length ) ) != NULL ){ + char **missing_charsetlist, *def_string; + int missing_charsetcount; + + string[ 0 ] = '\0'; + for( i = 0 ; i < NFONTS ; i ++){ + if( rs_font[ i ] ){ + strcat( string, rs_font[ i ] ); + strcat( string, "," ); + } + # ifdef MULTICHAR_SET + if( rs_mfont[ i ] ){ + strcat( string, rs_mfont[ i ] ); + strcat( string, "," ); + } + # endif + } + length = strlen( string ); + if( length > 0 && string[ length - 1 ] == ',' ){ + string[ length - 1 ] = '\0'; + length --; + } + if( length > 0 ){ + TermWin.fontset = XCreateFontSet + ( Xdisplay, string, + &missing_charsetlist, &missing_charsetcount, &def_string ); + } + free( string ); + } else { + TermWin.fontset = NULL; + } + return; + } + + /* PROTO */ + void + setPreeditArea(XRectangle *preedit_rect, XRectangle *status_rect, XRectangle *needed_rect) + { + preedit_rect->x = needed_rect->width + + (scrollbar_visible() && !(Options & Opt_scrollBar_right) + ? (SB_WIDTH + sb_shadow * 2) : 0); + preedit_rect->y = Height2Pixel(TermWin.nrow - 1) + + ((menuBar.state == 1) ? menuBar_TotalHeight() : 0); + + preedit_rect->width = Width2Pixel(TermWin.ncol + 1) - needed_rect->width + + (!(Options & Opt_scrollBar_right) + ? (SB_WIDTH + sb_shadow * 2) : 0); + preedit_rect->height = Height2Pixel(1); + + status_rect->x = (scrollbar_visible() && !(Options & Opt_scrollBar_right)) + ? (SB_WIDTH + sb_shadow * 2) : 0; + status_rect->y = Height2Pixel(TermWin.nrow - 1) + + ((menuBar.state == 1) ? menuBar_TotalHeight() : 0); + + status_rect->width = needed_rect->width ? needed_rect->width + : Width2Pixel(TermWin.ncol + 1); + status_rect->height = Height2Pixel(1); + } + + /* PROTO */ + void + IMDestroyCallback(XIM xim, XPointer client_data, XPointer call_data) + { + Input_Context = NULL; + XRegisterIMInstantiateCallback(Xdisplay, NULL, NULL, NULL, IMInstantiateCallback, NULL); + } + + + /* PROTO */ + void + IMInstantiateCallback(Display *display, XPointer client_data, XPointer call_data) + { + char *p, *s, buf[64], tmp[1024]; + char *end, *next_s; + XIM xim = NULL; + XIMStyle input_style = 0; + XIMStyles *xim_styles = NULL; + int found; + XPoint spot; + XRectangle rect, status_rect, needed_rect; + unsigned long fg, bg; + XVaNestedList preedit_attr = NULL; + XVaNestedList status_attr = NULL; + XIMCallback ximcallback; + + Input_Context = NULL; + + if (Input_Context) + return; + + ximcallback.callback = IMDestroyCallback; + ximcallback.client_data = NULL; + + if (rs_inputMethod && *rs_inputMethod) { + STRNCPY(tmp, rs_inputMethod, sizeof(tmp) - 1); + for (s = tmp; *s; s = next_s + 1) { + for (; *s && isspace(*s); s++); + if (!*s) + break; + for (end = s; (*end && (*end != ',')); end++); + for (next_s = end--; ((end >= s) && isspace(*end)); end--); + *(end + 1) = '\0'; + + if (*s) { + STRCPY(buf, "@im="); + strncat(buf, s, sizeof(buf) - 4 - 1); + if ((p = XSetLocaleModifiers(buf)) != NULL && *p + && (xim = XOpenIM(Xdisplay, NULL, NULL, NULL)) != NULL) + break; + } + if (!*next_s) + break; + } + } + + /* try with XMODIFIERS env. var. */ + if (xim == NULL && (p = XSetLocaleModifiers("")) != NULL && *p) + xim = XOpenIM(Xdisplay, NULL, NULL, NULL); + + /* try with no modifiers base */ + if (xim == NULL && (p = XSetLocaleModifiers("@im=none")) != NULL && *p) + xim = XOpenIM(Xdisplay, NULL, NULL, NULL); + + if (xim == NULL) + return; + XSetIMValues(xim, XNDestroyCallback, &ximcallback, NULL); + + if (XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL) + || !xim_styles) { + print_error("input method doesn't support any style"); + XCloseIM(xim); + return; + } + STRNCPY(tmp, (rs_preeditType ? rs_preeditType + : "OverTheSpot,OffTheSpot,Root"), + sizeof(tmp) - 1); + for (found = 0, s = tmp; *s && !found; s = next_s + 1) { + unsigned short i; + + for (; *s && isspace(*s); s++); + if (!*s) + break; + for (end = s; (*end && (*end != ',')); end++); + for (next_s = end--; ((end >= s) && isspace(*end)); end--); + *(end + 1) = '\0'; + + if (!strcmp(s, "OverTheSpot")) + input_style = (XIMPreeditPosition | XIMStatusNothing); + else if (!strcmp(s, "OffTheSpot")) + input_style = (XIMPreeditArea | XIMStatusArea); + else if (!strcmp(s, "Root")) + input_style = (XIMPreeditNothing | XIMStatusNothing); + + for (i = 0; i < xim_styles->count_styles; i++) + if (input_style == xim_styles->supported_styles[i]) { + found = 1; + break; + } + } + XFree(xim_styles); + + if (found == 0) { + print_error("input method doesn't support my preedit type"); + XCloseIM(xim); + return; + } + if ((input_style != (XIMPreeditNothing | XIMStatusNothing)) + && (input_style != (XIMPreeditArea | XIMStatusArea)) + && (input_style != (XIMPreeditPosition | XIMStatusNothing))) { + print_error("This program does not support the preedit type"); + XCloseIM(xim); + return; + } + if (input_style & XIMPreeditPosition) { + setSize(&rect); + setPosition(&spot); + setColor(&fg, &bg); + + preedit_attr = XVaCreateNestedList(0, XNArea, &rect, + XNSpotLocation, &spot, + XNForeground, fg, + XNBackground, bg, + XNFontSet, TermWin.fontset, + NULL); + } else if (input_style & XIMPreeditArea) { + setColor(&fg, &bg); + + /* + * The necessary width of preedit area is unknown + * until create input context. + */ + needed_rect.width = 0; + + setPreeditArea(&rect, &status_rect, &needed_rect); + + preedit_attr = XVaCreateNestedList(0, XNArea, &rect, + XNForeground, fg, + XNBackground, bg, + XNFontSet, TermWin.fontset, + NULL); + status_attr = XVaCreateNestedList(0, XNArea, &status_rect, + XNForeground, fg, + XNBackground, bg, + XNFontSet, TermWin.fontset, + NULL); + } + Input_Context = XCreateIC(xim, XNInputStyle, input_style, + XNClientWindow, TermWin.parent, + XNFocusWindow, TermWin.parent, + XNDestroyCallback, &ximcallback, + preedit_attr ? XNPreeditAttributes : NULL, + preedit_attr, + status_attr ? XNStatusAttributes : NULL, + status_attr, + NULL); + XFree(preedit_attr); + XFree(status_attr); + if (Input_Context == NULL) { + print_error("Failed to create input context"); + XCloseIM(xim); + } + if (input_style & XIMPreeditArea) + IMSetStatusPosition(); + } + + /* PROTO */ + void + IMSetStatusPosition(void) + { + XIMStyle input_style; + XRectangle rect, status_rect, *needed_rect; + XVaNestedList preedit_attr, status_attr; + + if (Input_Context == NULL) + return; + + XGetICValues(Input_Context, XNInputStyle, &input_style, NULL); + + if (input_style & XIMPreeditArea) { + status_attr = XVaCreateNestedList(0, XNAreaNeeded, &needed_rect, NULL); + XGetICValues(Input_Context, XNStatusAttributes, status_attr, NULL); + XFree(status_attr); + + rect.x = needed_rect->width; + if (menuBar.state == 1) { + rect.y = Height2Pixel(TermWin.nrow - 1) - menuBar_TotalHeight(); + } else { + rect.y = Height2Pixel(TermWin.nrow - 1); + } + if (Options & Opt_scrollBar_right) { + rect.width = Width2Pixel(TermWin.ncol + 1) - needed_rect->width; + } else { + rect.width = Width2Pixel(TermWin.ncol + 1) + SB_WIDTH + SHADOW * 2 - needed_rect->width; + } + rect.height = needed_rect->height; + preedit_attr = XVaCreateNestedList(0, XNArea, &rect, NULL); + + if (scrollbar_visible()) { + if (Options & Opt_scrollBar_right) { + status_rect.x = 0; + } else { + status_rect.x = SB_WIDTH + SHADOW * 2; + } + } else { + status_rect.x = 0; + } + if (menuBar.state == 1) { + status_rect.y = Height2Pixel(TermWin.nrow - 1) + menuBar_TotalHeight(); + } else { + status_rect.y = Height2Pixel(TermWin.nrow - 1); + } + status_rect.width = needed_rect->width; + status_rect.height = needed_rect->height; + status_attr = XVaCreateNestedList(0, XNArea, &status_rect, NULL); + XSetICValues(Input_Context, + XNPreeditAttributes, preedit_attr, + XNStatusAttributes, status_attr, NULL); + XFree(preedit_attr); + XFree(status_attr); + } + } + + /* PROTO */ + void + XProcessEvent( Display *display ) + { + XEvent xev; + XNextEvent( display, &xev ); + if( !XFilterEvent( &xev, xev.xany.window ) ) + process_x_event( &xev ); + return; + } + + #endif /*}}} */ /*----------------------- end-of-file (C source) -----------------------*/ diff -cNr aterm-0.4.2.orig/src/feature.h aterm-0.4.2/src/feature.h *** aterm-0.4.2.orig/src/feature.h Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/feature.h Sun Sep 30 14:38:03 2001 *************** *** 306,311 **** --- 306,317 ---- */ #define SAVELINES 64 + /* + * Default line space + */ + #define LINESPACE 0 + + /* (Hops) Set to choose a number of lines of context between pages * (rather than a proportion (1/5) of savedlines buffer) * when paging the savedlines with SHIFT-{Prior,Next} keys. diff -cNr aterm-0.4.2.orig/src/main.c aterm-0.4.2/src/main.c *** aterm-0.4.2.orig/src/main.c Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/main.c Sun Sep 30 14:56:48 2001 *************** *** 901,906 **** --- 901,909 ---- XResizeWindow(Xdisplay, TermWin.parent, width, height); resize_window1(width, height); + #ifdef USE_XIM + IMSetStatusPosition(); + #endif scr_clear(); } } *************** *** 1357,1363 **** fw = TermWin.font->min_bounds.width; /* can be error !!!! */ if( fw > 1000 ) fw = 0 ; /* added by suggestion from */ ! fh = TermWin.font->ascent + TermWin.font->descent; if (TermWin.font->min_bounds.width == TermWin.font->max_bounds.width) TermWin.fprop = 0; /* Mono-spaced (fixed width) font */ --- 1360,1370 ---- fw = TermWin.font->min_bounds.width; /* can be error !!!! */ if( fw > 1000 ) fw = 0 ; /* added by suggestion from */ ! #ifdef USE_LINESPACE ! fh = TermWin.font->ascent + TermWin.font->descent + TermWin.lineSpace; ! #else ! fh = TermWin.font->ascent + TermWin.font->descent; ! #endif if (TermWin.font->min_bounds.width == TermWin.font->max_bounds.width) TermWin.fprop = 0; /* Mono-spaced (fixed width) font */ *************** *** 1624,1629 **** --- 1631,1639 ---- rs_geometry = NULL; /* window geometry */ rs_minBufferWidth = NULL; rs_saveLines = NULL; /* scrollback buffer [lines] */ + #ifdef USE_LINESPACE + rs_lineSpace = NULL; + #endif rs_borderWidth = NULL; rs_modifier = NULL; /* modifier */ #if defined (HOTKEY_CTRL) || defined (HOTKEY_META) *************** *** 1750,1755 **** --- 1760,1769 ---- TermWin.min_bcol = 1; if (!rs_saveLines || (TermWin.saveLines = atoi(rs_saveLines)) < 0) TermWin.saveLines = SAVELINES; + #ifdef USE_LINESPACE + if (!rs_lineSpace || (TermWin.lineSpace = atoi(rs_lineSpace)) < 0) + TermWin.lineSpace = LINESPACE; + #endif if (!rs_borderWidth || (TermWin.borderWidth = atoi(rs_borderWidth)) < 0) TermWin.borderWidth = BORDERWIDTH; *************** *** 1797,1802 **** --- 1811,1819 ---- rs_mfont[i] = def_mfontName[i]; #endif } + #ifdef USE_XIM + TermWin.fontset = NULL; + #endif #ifdef XTERM_REVERSE_VIDEO /* this is how xterm implements reverseVideo */ diff -cNr aterm-0.4.2.orig/src/rxvt.h aterm-0.4.2/src/rxvt.h *** aterm-0.4.2.orig/src/rxvt.h Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/rxvt.h Sun Sep 30 15:01:00 2001 *************** *** 266,271 **** --- 266,274 ---- ncol, nrow, /* window size [characters] */ bcol, /* current number of columns in the buffer */ min_bcol, /* minimum horizontal columns in the buffer */ + #ifdef USE_LINESPACE + lineSpace, /* linespace */ + #endif focus, /* window has focus */ saveLines, /* number of lines that fit in scrollback */ borderWidth,/* number of pixels in window border */ *************** *** 280,285 **** --- 283,291 ---- #ifdef MULTICHAR_SET XFontStruct *mfont; /* Multichar font structure */ #endif + #ifdef USE_XIM + XFontSet fontset; + #endif #if defined(BACKGROUND_IMAGE) || defined(TRANSPARENT) || defined(_MYSTYLE_) BackgroundInfo background; #endif *************** *** 928,933 **** --- 934,942 ---- EXTERN const char *rs_geometry; /* window geometry */ EXTERN const char *rs_minBufferWidth; /* minimum buffer width - so we can scroll horizontally */ EXTERN const char *rs_saveLines; /* scrollback buffer [lines] */ + #ifdef USE_LINESPACE + EXTERN const char *rs_lineSpace; /* line space [pixels] */ + #endif EXTERN const char *rs_borderWidth; /* border width [pixels] */ EXTERN const char *rs_cutchars; /* chars for selection boundaries */ #ifdef META8_OPTION *************** *** 948,953 **** --- 957,966 ---- #endif #ifdef PRINTPIPE EXTERN const char *rs_print_pipe; + #endif + #ifdef USE_XIM + EXTERN const char *rs_preeditType; + EXTERN const char *rs_inputMethod; #endif #ifndef NO_BRIGHTCOLOR EXTERN unsigned int colorfgbg; diff -cNr aterm-0.4.2.orig/src/screen.c aterm-0.4.2/src/screen.c *** aterm-0.4.2.orig/src/screen.c Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/screen.c Sun Sep 30 15:03:36 2001 *************** *** 3439,3441 **** --- 3439,3455 ---- #endif fprintf(stderr, "%s\n", name[color]); } + + #ifdef USE_XIM + /* PROTO */ + void + setPosition(XPoint *pos) + { + XWindowAttributes xwa ; + + XGetWindowAttributes( Xdisplay, TermWin.vt, &xwa ) ; + pos->x = Col2Pixel ( screen.cur.col ) + xwa.x; + pos->y = Height2Pixel((screen.cur.row + 1)) + xwa.y; + return ; + } + #endif diff -cNr aterm-0.4.2.orig/src/xdefaults.c aterm-0.4.2/src/xdefaults.c *** aterm-0.4.2.orig/src/xdefaults.c Fri Sep 7 00:38:07 2001 --- aterm-0.4.2/src/xdefaults.c Sun Sep 30 15:06:21 2001 *************** *** 276,281 **** --- 276,286 ---- STRG(rs_multichar_encoding, "multichar_encoding", "km", "mode", "multiple-character font encoding; mode = eucj | sjis | big5"), #endif /* MULTICHAR_SET */ + #ifdef USE_XIM + STRG(rs_preeditType, "preeditType", "pt", "style", + "input style of input method; style = OverTheSpot | OffTheSpot | Root"), + STRG(rs_inputMethod, "inputMethod", "im", "name", "name of input method"), + #endif /* USE_XIM */ #ifdef GREEK_SUPPORT STRG(rs_greek_keyboard, "greek_keyboard", "grk", "mode", "greek keyboard mapping; mode = iso | ibm"), *************** *** 313,318 **** --- 318,327 ---- "minimum number of columns stored in buffer"), STRG(rs_saveLines, "saveLines", "sl", "number", "number of scrolled lines to save"), + #ifdef USE_LINESPACE + STRG(rs_lineSpace, "lineSpace", "lsp", "number", + "line space"), + #endif BOOL(rs_utmpInhibit, "utmpInhibit", "ut", Opt_utmpInhibit, "utmp inhibit"), BOOL(rs_visualBell, "visualBell", "vb", Opt_visualBell, "visual bell"),