- support Big5 encoding with chinese/xcin

- integrate COMMENT
- bump NEED_VERSION
--
ok'd by maintainer
This commit is contained in:
kevlo 2001-04-17 03:40:57 +00:00
parent ce1278566c
commit 4160eb6463
7 changed files with 240 additions and 4 deletions

View File

@ -1,9 +1,11 @@
# $OpenBSD: Makefile,v 1.20 2000/10/17 11:55:52 brad Exp $
# $OpenBSD: Makefile,v 1.21 2001/04/17 03:40:57 kevlo Exp $
# $FreeBSD: Makefile,v 1.3 1999/03/08 20:59:19 steve Exp $
COMMENT= "color vt102 terminal emulator with transparency support"
DISTNAME= aterm-0.4.0
CATEGORIES= x11
NEED_VERSION= 1.330
NEED_VERSION= 1.384
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= aterm
@ -24,6 +26,10 @@ CONFIGURE_ARGS+=--enable-utmp --enable-wtmp \
--with-xpm --enable-transparency \
--enable-xgetdefault --enable-ttygid \
--enable-background-image --enable-fading \
--with-jpeg --with-png
--with-jpeg --with-png --enable-big5
post-patch:
cd ${FILESDIR}; cp -f {cli_xcin.c,protocol.h,state.h} \
${WRKSRC}/src
.include <bsd.port.mk>

146
x11/aterm/files/cli_xcin.c Normal file
View File

@ -0,0 +1,146 @@
/*
Copyright (C) 1994,1995 Edward Der-Hua Liu, Hsin-Chu, Taiwan
*/
#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include "state.h"
#include "protocol.h"
/*static void p_err(char *fmt,...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr,"%s:", "cli_xcin:");
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr,"\n");
exit(-1);
}
*/
static Atom xcin_atom=0;
static Window xcin_win=None;
static InmdState inmdstate;
#define ENDIAN_TEST() (*(int *)"\x11\x22\x33\x44"==0x11223344)
char my_endian;
static int connect_xcin(Display *display)
{
/*Window twin;*/
xcin_atom=XInternAtom(display, XCIN_ATOM,False);
my_endian=ENDIAN_TEST(); /* if == 11223344, it is big-endian */
xcin_win=XGetSelectionOwner(display,xcin_atom);
return xcin_win;
}
void send_FocusIn(Display *display, Window window)
{
XClientMessageEvent event;
/*XEvent erreve;*/
char *tmp=event.data.b;
if (connect_xcin(display)==None) return;
/* Ensure xcin exists, or the process will be hanged */
event.type=ClientMessage;
event.window=window;
event.message_type=xcin_atom;
event.format=8;
tmp[0]=tmp[1]=tmp[2]=0xff;
tmp[3]=CLI_FOCUS_IN;
memcpy(&tmp[4],&inmdstate, sizeof(inmdstate));
XSendEvent(display, xcin_win, False, 0, (XEvent *)&event);
}
void send_FocusOut(Display *display, Window window)
{
XClientMessageEvent event;
/* XEvent erreve; */
char *tmp=event.data.b;
if (connect_xcin(display)==None) return;
/* Ensure xcin exists, or the process will be hanged */
event.type=ClientMessage;
event.window=window;
event.message_type=xcin_atom;
event.format=8;
tmp[0]=tmp[1]=tmp[2]=0xff;
tmp[3]=CLI_FOCUS_OUT;
memcpy(&tmp[4],&inmdstate, sizeof(inmdstate));
XSendEvent(display, xcin_win, False, 0, (XEvent *)&event);
}
static void big_little(char *i)
{
char t;
t=*i; *i=*(i+3); *(i+3)=t;
t=*(i+1); *(i+1)=*(i+2); *(i+2)=t;
}
static int read_keys(Display *display, char *buf)
{
Atom actual_type;
int actual_format/*,i*/;
u_long nitems,bytes_after;
char *ttt, *cp;
XCIN_RES res;
int ofs;
cp=(char *)&res;
ofs=0;
do {
if (XGetWindowProperty(display,xcin_win,xcin_atom,
ofs/4,(sizeof(XCIN_RES)+3)/4,
True, AnyPropertyType, &actual_type,&actual_format,
&nitems,&bytes_after,(unsigned char **)&ttt) != Success)
puts("err property");
memcpy((char *)(&res)+(ofs & ~0x3), ttt, nitems);
XFree(ttt);
ofs=(ofs & ~0x3) + nitems;
} while ((!nitems && !ofs) || bytes_after>0);
if (my_endian) {
big_little((char *)&res.len);
big_little((char *)&res.status);
}
memcpy(buf,res.tkey, res.len);
inmdstate=res.inmdstate;
buf[res.len]=0;
return res.status;
}
#include <X11/Xutil.h>
static XComposeStatus compose_status = {NULL, 0};
int send_key(Display *display, Window win, XKeyEvent *eve, char *buf)
{
XClientMessageEvent event;
/*XEvent erreve;*/
char *tmp=event.data.b;
u_char tttt[8];
/*KeySym keysym;*/
int count;
if (xcin_win==None && connect_xcin(display)==None)
return K_REJECT;
if ((xcin_win=XGetSelectionOwner(display,xcin_atom))==None)
return K_REJECT;
event.type=ClientMessage;
event.window=win;
event.message_type=xcin_atom;
event.format=32;
count = XLookupString (eve, tttt, sizeof(tmp), (KeySym *)tmp, &compose_status);
memcpy(&tmp[4],&eve->state,4);
XSendEvent(display, xcin_win, False, 0, (XEvent *)&event);
XSync(display,False);
return (read_keys(display, buf));
}

View File

@ -0,0 +1,13 @@
/*
Copyright (C) 1994 Edward Der-Hua Liu, Hsin-Chu, Taiwan
*/
#define K_REJECT (0)
#define K_ACCEPT (1)
#define CLI_FOCUS_IN (1)
#define CLI_FOCUS_OUT (3)
#define LOAD_KEYWORD (2)
#define XCIN_ATOM "XCIN_A"

23
x11/aterm/files/state.h Normal file
View File

@ -0,0 +1,23 @@
/*
Copyright (C) 1994 Edward Der-Hua Liu, Hsin-Chu, Taiwan
*/
typedef struct {
char kb_state;
char _CurInMethod;
} InmdState;
#define EngChiMask (1)
#define HalfFullMask (2)
typedef struct {
int len;
int status;
InmdState inmdstate;
char tkey[512];
} XCIN_RES;
#define EngChi ((inmdstate.kb_state & EngChiMask) ? 1:0)
#define HalfFull ((inmdstate.kb_state & HalfFullMask) ? 1:0)
#define CurInMethod (inmdstate._CurInMethod)
/* extern InmdState inmdstate; */

View File

@ -0,0 +1,20 @@
--- src/Makefile.in.orig Tue Apr 17 10:26:08 2001
+++ src/Makefile.in Tue Apr 17 10:27:25 2001
@@ -19,13 +19,14 @@
SRCS = command.c graphics.c grkelot.c main.c menubar.c misc.c \
netdisp.c rmemset.c screen.c @SBARFILE@.c utmp.c xdefaults.c \
- pixmap.c ximage_utils.c
+ pixmap.c ximage_utils.c cli_xcin.c
OBJS = command.o graphics.o grkelot.o main.o menubar.o misc.o \
netdisp.o rmemset.o screen.o @SBARFILE@.o utmp.o xdefaults.o \
- pixmap.o ximage_utils.o
+ pixmap.o ximage_utils.o cli_xcin.o
-HDRS = feature.h protos.h grkelot.h rxvt.h rxvtgrx.h screen.h version.h
+HDRS = feature.h protos.h grkelot.h rxvt.h rxvtgrx.h screen.h version.h \
+ state.h protocol.h
PROS = command.pro graphics.pro grkelot.pro main.pro menubar.pro misc.pro \
netdisp.pro rmemset.pro screen.pro @SBARFILE@.pro utmp.pro xdefaults.pro \

View File

@ -0,0 +1,29 @@
--- src/command.c.orig Tue Apr 17 10:27:59 2001
+++ src/command.c Tue Apr 17 10:31:19 2001
@@ -2128,11 +2128,17 @@
static int bypass_keystate = 0;
int reportmode;
static int csrO = 0; /* Hops - csr offset in thumb/slider */
+ int k_status;
+ char kbuf[256];
/* to give proper Scroll behaviour */
switch (ev->type) {
case KeyPress:
- lookup_key(ev);
+ k_status = send_key(Xdisplay, TermWin.parent, &ev->xkey, kbuf);
+ if (!k_status)
+ lookup_key(ev);
+ else if (kbuf[0])
+ tt_write(kbuf, strlen(kbuf));
break;
case ClientMessage:
@@ -2197,6 +2203,7 @@
case FocusIn:
if (!TermWin.focus) {
+ send_FocusIn(Xdisplay, TermWin.parent);
TermWin.focus = 1;
#ifdef OFF_FOCUS_FADING
if( rs_fade != NULL )

View File

@ -1 +0,0 @@
color vt102 terminal emulator with transparency support