2007/06/25(月)
みなさんご存知のとおり(?)、MC/R3xx(モノクロモバ)は2bpp機種のため 8bpp,16bppが前提のXhpc(Xserver)は利用できません。しかし、なんとか モノクロ機で X を利用したいと考えた優秀な先達が居られました。 彼らはvncserverとmgl(またはmgl2)に移植したvncviewer(=mgvncviewer) を駆使してモノクロ機上で X の利用を可能にして いたのです。だいたい2000年前後のことだったようです。
その後、時は流れて、情報の散逸や消失、またベースとなるvncやNetBSD のバージョンが進化するにつれて残された情報が必ずしも当てはまらなく なってきました。
そこで、今回 MC/R300にXvnc, mgvncviewer導入した際に収集した情報と 私自身が試行錯誤した部分をまとめておこうと思います。 先達が残されたこの貴重な財産を継承して行くための一助と 成れば幸いです。
環境は MC/R300 + NetBSD-1.6.2/hpcmips です。現時点では かなり古いバージョンのNetBSDですが、以下の情報は最新NetBSD 環境でも役立つと思います。
以下は手パッチの情報
*** xc/programs/Xserver/cfb/cfb8line.c.ORG Tue Jun 26 01:12:36 2007
--- xc/programs/Xserver/cfb/cfb8line.c Wed Jun 20 23:04:56 2007
***************
*** 696,712 ****
# if PSZ == 24
y1_or_e1 = xOffset & 3;
# else
! y1_or_e1 = ((long) addrp) & (PGSZB - 1);
! addrp = (PixelType *) (((unsigned char *) addrp) - y1_or_e1);
! #if PGSZ == 32
! # if PWSH != 2
! y1_or_e1 >>= (2 - PWSH);
! # endif
! #else /* PGSZ == 64 */
! # if PWSH != 3
! y1_or_e1 >>= (3 - PWSH);
! # endif
! #endif /* PGSZ */
# endif /* PSZ == 24 */
#if PSZ == 24
{
--- 696,706 ----
# if PSZ == 24
y1_or_e1 = xOffset & 3;
# else
! /* Round addrp down to the next PixelGroup boundary, and
! * set y1_or_e1 to the excess (in pixels)
! * (assumes PGSZB is a power of 2). */
! y1_or_e1 = (((unsigned long) addrp) & (PGSZB - 1)) / (PSZ / 8);
! addrp -= y1_or_e1;
# endif /* PSZ == 24 */
#if PSZ == 24
{
*** ./unix/tx/TXDialog.h.ORG Thu Jun 21 09:21:46 2007
--- ./unix/tx/TXDialog.h Thu Jun 21 09:23:45 2007
***************
*** 30,35 ****
--- 30,40 ----
#include "TXWindow.h"
#include <errno.h>
+ #if defined(__NetBSD__)
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <unistd.h>
+ #endif
class TXDialog : public TXWindow, public TXDeleteWindowCallback {
public:
*** ./unix/xc/programs/Xserver/vnc/Xvnc/Imakefile.ORG Thu Jun 21 16:35:37 2007
--- ./unix/xc/programs/Xserver/vnc/Xvnc/Imakefile Fri Jun 22 12:42:25 2007
***************
*** 3,9 ****
VNCINCLUDE = -I$(VNCCOMMONDIR)
VNCLIBS = VncExtLibs
! #if defined(XFree86Version) && XFree86Version < 4000
VNCDEFINES = -DNO_INIT_BACKING_STORE
#endif
--- 3,9 ----
VNCINCLUDE = -I$(VNCCOMMONDIR)
VNCLIBS = VncExtLibs
! #if (defined(XFree86Version) && XFree86Version < 4000) || defined(MIPSEL)
VNCDEFINES = -DNO_INIT_BACKING_STORE
#endif
*** ./unix/xc/programs/Xserver/vnc/vncHooks.cc.ORG Thu Jun 21 12:49:08 2007
--- ./unix/xc/programs/Xserver/vnc/vncHooks.cc Thu Jun 21 12:52:14 2007
***************
*** 102,109 ****
--- 102,114 ----
static void vncHooksStoreColors(ColormapPtr pColormap, int ndef,
xColorItem* pdef);
static Bool vncHooksDisplayCursor(ScreenPtr pScreen, CursorPtr cursor);
+ #if defined(__NetBSD__)
+ static void vncHooksBlockHandler(int i, pointer blockData, timeval ** pTimeout,
+ pointer pReadmask);
+ #else
static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout,
pointer pReadmask);
+ #endif
// GC "funcs"
***************
*** 456,463 ****
--- 461,473 ----
// BlockHandler - ignore any changes during the block handler - it's likely
// these are just drawing the cursor.
+ #if defined(__NetBSD__)
+ static void vncHooksBlockHandler(int i, pointer blockData, timeval ** pTimeout,
+ pointer pReadmask)
+ #else
static void vncHooksBlockHandler(int i, pointer blockData, pointer pTimeout,
pointer pReadmask)
+ #endif
{
SCREEN_UNWRAP(screenInfo.screens[i], BlockHandler);
モノクロ機上で動いているけれど、vncserverの中はカラー表示:)
上のスクリーンショットはMC/R300で動いているvncserverに、別のLinux機
からvncviewerでつないだ様子。意外な程サーバ(Xvnc on MC/R300)のレスポンス
は良いです。逆に言うと、MC/R300のもっさり感は液晶への描画処理が
ネックになってることがよく分かります(^^;。
前提条件として、X一式とmgl2がインストールされていることが要求されます。
特徴はマウスモード、入力モードというモード切替え(F8)があり、 マウスモードではタッチパネル以外にキーボードでもマウスの移動、 クリックが出来ます。タッチパネルを利用する際に問題になるマウスの Button2, Button3もキーに割り当てられているので、問題無く入力 できます。ただし、モード切替えに慣れが必要なのと、全体的に 処理が重いように思います。
こちらは上記のmgvncviewerと違ってモード切替えはありません。マウスの 操作はタッチパネルのみになります。マウスのButton2, Button3に相当する 操作が無い(?)ように思うのですが、これは私の調査不足のせいかもしれません。 ただしレスポンスは上記の物に比べて軽快だと感じたので、個人的にはこちらの KAMIKI版mgvncviewerを常用しようと思ってます。
*** mgvncviewer/Imakefile.ORG Sat Jun 23 18:52:52 2007
--- mgvncviewer/Imakefile Sat Jun 23 19:25:38 2007
***************
*** 8,16 ****
SRCS = args.c rfbproto.c sockets.c mgvncviewer.c mgl-util.c # kbd.c
OBJS = args.o rfbproto.o sockets.o mgvncviewer.o mgl-util.o # kbd.o
! INCLUDES = -I../include -I${LOCALBASE}/include -I.
! VNCAUTH_LIB = ../libvncauth/libvncauth.a
! MGLLIB = -L${LOCALBASE}/lib -lmgl2
all:: mgvncviewer
--- 8,17 ----
SRCS = args.c rfbproto.c sockets.c mgvncviewer.c mgl-util.c # kbd.c
OBJS = args.o rfbproto.o sockets.o mgvncviewer.o mgl-util.o # kbd.o
! INCLUDES = -I../include -I${LOCALBASE}/include -I. -I../rfb -I/usr/local/mgl2/include
! ##VNCAUTH_LIB = ../libvncauth/libvncauth.a
! VNCAUTH_LIB = ../rfb/librfb.a
! MGLLIB = -L${LOCALBASE}/lib -L/usr/local/mgl2/lib -lmgl2
all:: mgvncviewer
*** mgvncviewer/mgl-util.c.ORG Mon Jun 25 13:47:03 2007
--- mgvncviewer/mgl-util.c Mon Jun 25 13:50:55 2007
***************
*** 29,74 ****
char *bitmap[]={
/* MOUSE_MODE */
! "\
! #MGR000200160016
! ****........****
! ***.@@@@@@@@.***
! **.@..@..@.+@.**
! *.@...@..@+++@.*
! *.@...@..@.++@.*
! *.@@@@@@@@@@@@.*
! *.@........++@.*
! *.@.......+++@.*
! *.@......+.++@.*
! *.@.......+++@.*
! *.@....+.+.++@.*
! *.@.+.+.+.+++@.*
! **.@++++++++@.**
! **.@++++++++@.**
! ***.@@@@@@@@.***
! ****........****
! ",
/* INPUT_MODE */
! "\
! #MGR000200160016
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! ****************
! "};
static struct screen *mode_icon[MODE_NUM];
--- 29,71 ----
char *bitmap[]={
/* MOUSE_MODE */
! "#MGR000200160016\n"
! "****........****\n"
! "***.@@@@@@@@.***\n"
! "**.@..@..@.+@.**\n"
! "*.@...@..@+++@.*\n"
! "*.@...@..@.++@.*\n"
! "*.@@@@@@@@@@@@.*\n"
! "*.@........++@.*\n"
! "*.@.......+++@.*\n"
! "*.@......+.++@.*\n"
! "*.@.......+++@.*\n"
! "*.@....+.+.++@.*\n"
! "*.@.+.+.+.+++@.*\n"
! "**.@++++++++@.**\n"
! "**.@++++++++@.**\n"
! "***.@@@@@@@@.***\n"
! "****........****\n",
/* INPUT_MODE */
! "#MGR000200160016\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! "****************\n"
! };
static struct screen *mode_icon[MODE_NUM];
ついにモノクロモバでX Window Systemが!
左上のマウスアイコンがマウスモード、入力モードの状態を表しています
(今はマウスモード)。
*** mgvncviewer/Imakefile.ORG Sat Jun 23 22:15:44 2007 --- mgvncviewer/Imakefile Sat Jun 23 22:23:41 2007 *************** *** 9,17 **** SRCS = args.c rfbproto.c sockets.c mgvncviewer.c mgl-util.c # kbd.c OBJS = args.o rfbproto.o sockets.o mgvncviewer.o mgl-util.o # kbd.o ! INCLUDES = -I../include -I/usr/local/lib/mgl2 -I. ! VNCAUTH_LIB = ../libvncauth/libvncauth.a ! MGLLIB = -L/usr/local/lib -lmgl2 -ldl all:: mgvncviewer --- 9,18 ---- SRCS = args.c rfbproto.c sockets.c mgvncviewer.c mgl-util.c # kbd.c OBJS = args.o rfbproto.o sockets.o mgvncviewer.o mgl-util.o # kbd.o ! INCLUDES = -I../include -I/usr/local/lib/mgl2 -I. -I../rfb -I/usr/local/mgl2/include ! ##VNCAUTH_LIB = ../libvncauth/libvncauth.a ! VNCAUTH_LIB = ../rfb/librfb.a ! MGLLIB = -L/usr/local/lib -L/usr/local/mgl2/lib -lmgl2 # -ldl all:: mgvncviewer *** mgvncviewer/mgl-util.c.ORG Sat Jun 23 22:21:03 2007 --- mgvncviewer/mgl-util.c Sat Jun 23 22:21:36 2007 *************** *** 5,11 **** --- 5,13 ---- /* #include <machine/endian.h> */ #include <unistd.h> + #if !defined(__NetBSD__) #include <asm/byteorder.h> + #endif #include <vncviewer.h> #include <err.h> #include <mgl2.h>
*** mgvncviewer/mgl-util.c.ORG2 Sun Jul 1 23:17:36 2007
--- mgvncviewer/mgl-util.c Tue Jul 3 22:52:03 2007
***************
*** 36,41 ****
--- 36,48 ----
#define MK_MOUSE_MOVE MK_V0 + 6
#define MK_MOUSE_UP MK_V0 + 7
+ /*
+ * prototype (by m-ito)
+ */
+ int KeyConvert(int c);
+ int ModControl(int mod, int value, int control);
+ #define ModSet(mod, value) ModControl((mod), (value), 0)
+ #define ModGet(mod) ModControl((mod), -1, 1)
extern int em_key_buf_cnt;
extern struct key_buf {
***************
*** 381,387 ****
--- 388,398 ----
case MGL_SKM_RCAPS: c = XK_Caps_Lock; name = "caps_r"; break;
case MGL_SKM_RMENU: c = XK_Meta_R; name = "menu_r"; break;
default:
+ #if 0 /* typo ? */
fprintf(stderr, "warning unknwon key event 0x%08\n", d);
+ #else
+ fprintf(stderr, "warning unknwon key event 0x%08x\n", d);
+ #endif
continue;
};
#if 0
***************
*** 391,396 ****
--- 402,413 ----
fprintf(stderr, "key press %s/0x%08x\n", name, d);
}
#endif
+
+ /*
+ * Save Modifier status (by m-ito)
+ */
+ ModSet(c, 1 - flag);
+
SendKeyEvent(c, 1 - flag);
continue;
}
***************
*** 416,421 ****
--- 433,444 ----
#if 0
fprintf(stderr, "key press/release %d 0x%x\n", c, c);
#endif
+
+ /*
+ * convert some function keys and ctrl-? to right value (by m-ito)
+ */
+ c = KeyConvert(c);
+
SendKeyEvent(c, 1);
SendKeyEvent(c, 0);
break;
***************
*** 469,472 ****
--- 492,720 ----
draw_line(x,y,x,y + height - 1);
}
pop_screen();
+ }
+
+ /*
+ * convert some function keys and ctrl-? to right value (by m-ito)
+ */
+ int KeyConvert(c)
+ int c;
+ {
+ /*
+ * Convert some function keys to X's keysym. (by m-ito)
+ */
+ switch(c){
+ case MK_F1: c = XK_F1; break;
+ case MK_F2: c = XK_F2; break;
+ case MK_F3: c = XK_F3; break;
+ case MK_F4: c = XK_F4; break;
+ case MK_F5: c = XK_F5; break;
+ case MK_F6: c = XK_F6; break;
+ case MK_F7: c = XK_F7; break;
+ case MK_F8: c = XK_F8; break;
+ case MK_F9: c = XK_F9; break;
+ case MK_F10: c = XK_F10; break;
+ case MK_F11: c = XK_F11; break;
+ case MK_F12: c = XK_F12; break;
+ case MK_HOME: c = XK_Home; break;
+ case MK_END: c = XK_End; break;
+ case MK_UP: c = XK_Up; break;
+ case MK_DOWN: c = XK_Down; break;
+ case MK_RIGHT: c = XK_Right; break;
+ case MK_LEFT: c = XK_Left; break;
+ case MK_PAGE_UP: c = XK_Page_Up; break;
+ case MK_PAGE_DOWN: c = XK_Page_Down; break;
+ case MK_INS: c = XK_Insert; break;
+ case MK_DEL: c = XK_Delete; break;
+ case MK_MENU: c = XK_Menu; break;
+ case MK_NUMLOCK: c = XK_Num_Lock; break;
+ }
+
+ /*
+ * Convert 'null' by Ctrl-@ to '@'
+ */
+ if (c == 0){
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = '@';
+ }
+ }
+
+ /*
+ * Convert Ctrl-A ... Ctrl-Z to A ... z, XK_BackSpace, XK_Tab, XK_Return (by m-ito)
+ */
+ if (c >= 1 && c <= 26){
+ if ((ModGet(XK_Shift_L) == 0 &&
+ ModGet(XK_Shift_R) == 0 &&
+ ModGet(XK_Caps_Lock) == 0) ||
+ (ModGet(XK_Shift_L) == 0 &&
+ ModGet(XK_Shift_R) == 1 &&
+ ModGet(XK_Caps_Lock) == 1) ||
+ (ModGet(XK_Shift_L) == 1 &&
+ ModGet(XK_Shift_R) == 0 &&
+ ModGet(XK_Caps_Lock) == 1) ||
+ (ModGet(XK_Shift_L) == 1 &&
+ ModGet(XK_Shift_R) == 1 &&
+ ModGet(XK_Caps_Lock) == 1)){
+ switch (c){
+ case 8:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'a' - 1;
+ }else{
+ c = XK_BackSpace;
+ }
+ break;
+ case 9:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'a' - 1;
+ }else{
+ c = XK_Tab;
+ }
+ break;
+ case 13:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'a' - 1;
+ }else{
+ c = XK_Return;
+ }
+ break;
+ default:
+ c = c + 'a' - 1;
+ break;
+ }
+ }else{
+ switch (c){
+ case 8:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'A' - 1;
+ }else{
+ c = XK_BackSpace;
+ }
+ break;
+ case 9:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'A' - 1;
+ }else{
+ c = XK_Tab;
+ }
+ break;
+ case 13:
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = c + 'A' - 1;
+ }else{
+ c = XK_Return;
+ }
+ break;
+ default:
+ c = c + 'A' - 1;
+ break;
+ }
+ }
+ }
+
+ /*
+ * Convert '0x1b' to Ctrl-[ or 'XK_Escape'
+ */
+ if (c == 27){
+ if (ModGet(XK_Control_L) == 1 ||
+ ModGet(XK_Control_R) == 1){
+ c = '[';
+ }else{
+ c = XK_Escape;
+ }
+ }
+
+ /*
+ * Convert '0x7f' to 'XK_Delete'
+ */
+ if (c == 127){
+ c = XK_Delete;
+ }
+
+ return c;
+ }
+
+ /*
+ * Save/Get Modifier status (by m-ito)
+ */
+ int ModControl(mod, value, control)
+ int mod;
+ int value; /* press = 1, release = 0 */
+ int control; /* set = 0, get = 1 */
+ {
+ static int XK_Shift_L_flg = 0;
+ static int XK_Shift_R_flg = 0;
+ static int XK_Control_L_flg = 0;
+ static int XK_Control_R_flg = 0;
+ static int XK_Meta_L_flg = 0;
+ static int XK_Meta_R_flg = 0;
+ static int XK_Caps_Lock_flg = 0;
+
+ switch (control){
+ case 0:
+ switch (mod){
+ case XK_Shift_L:
+ XK_Shift_L_flg = value;
+ break;
+ case XK_Shift_R:
+ XK_Shift_R_flg = value;
+ break;
+ case XK_Control_L:
+ XK_Control_L_flg = value;
+ break;
+ case XK_Control_R:
+ XK_Control_R_flg = value;
+ break;
+ case XK_Meta_L:
+ XK_Meta_L_flg = value;
+ break;
+ case XK_Meta_R:
+ XK_Meta_R_flg = value;
+ break;
+ case XK_Caps_Lock:
+ XK_Caps_Lock_flg = value;
+ break;
+ default:
+ return -1;
+ break;
+ }
+ return 0;
+ break;
+ case 1:
+ switch (mod){
+ case XK_Shift_L:
+ return XK_Shift_L_flg;
+ break;
+ case XK_Shift_R:
+ return XK_Shift_R_flg;
+ break;
+ case XK_Control_L:
+ return XK_Control_L_flg;
+ break;
+ case XK_Control_R:
+ return XK_Control_R_flg;
+ break;
+ case XK_Meta_L:
+ return XK_Meta_L_flg;
+ break;
+ case XK_Meta_R:
+ return XK_Meta_R_flg;
+ break;
+ case XK_Caps_Lock:
+ return XK_Caps_Lock_flg;
+ break;
+ default:
+ return -1;
+ break;
+ }
+ return -1;
+ break;
+ }
+ return -1;
}
*** mgvncviewer/mgl-util.c.ORG3 Fri Jul 13 13:48:28 2007
--- mgvncviewer/mgl-util.c Fri Jul 13 13:55:01 2007
***************
*** 44,49 ****
--- 44,62 ----
#define ModSet(mod, value) ModControl((mod), (value), 0)
#define ModGet(mod) ModControl((mod), -1, 1)
+ /*
+ * for 3button emulation (by m-ito)
+ */
+
+ /*
+ * mgl2により、[MENU]+1,2,3 にしたがって、0,1,2が設定され、
+ * ポインタクリックにて0クリアされる。
+ *
+ * mgl2のドキュメントでは mgl_mouse_shift になっているが、mgl_button_shift が正解。
+ *
+ */
+ extern int mgl_button_shift;
+
extern int em_key_buf_cnt;
extern struct key_buf {
int code;
***************
*** 417,432 ****
case MK_V5: /*press*/
button_status = 1;
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
break;
case MK_V6: /*move*/
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
break;
case MK_V7: /*release*/
button_status = 0;
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
break;
default:
--- 430,478 ----
case MK_V5: /*press*/
button_status = 1;
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! switch (mgl_button_shift) {
! case 2:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton3Mask : 0);
! break;
! case 1:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton2Mask : 0);
! break;
! case 0:
! default:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
! break;
! }
break;
case MK_V6: /*move*/
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! switch (mgl_button_shift) {
! case 2:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton3Mask : 0);
! break;
! case 1:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton2Mask : 0);
! break;
! case 0:
! default:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
! break;
! }
break;
case MK_V7: /*release*/
button_status = 0;
// fprintf(stderr, "HandleMouseEvent 0x%03x (%d, %d)\n", c, vk_x, vk_y);
! switch (mgl_button_shift) {
! case 2:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton3Mask : 0);
! break;
! case 1:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton2Mask : 0);
! break;
! case 0:
! default:
! SendPointerEvent(vk_x, vk_y, button_status ? rfbButton1Mask : 0);
! break;
! }
break;
default:
操作は以下のとおり
#! /bin/sh vncserver -kill :1 sleep 3 vncserver :1 -depth 8 -geometry 640x240 sleep 3 mglsrvcons -t -m -e "mgvncviewer -bgr233 -depth 2 -raw -passwd ~/.vnc/passwd localhost:1"
Color
{
BorderColor "grey0"
DefaultBackground "gray0"
DefaultForeground "gray100"
TitleBackground "gray0"
TitleForeground "gray100"
MenuBackground "gray0"
MenuForeground "gray100"
MenuTitleBackground "gray0"
MenuTitleForeground "gray100"
IconBackground "gray0"
IconForeground "gray100"
IconBorderColor "gray0"
IconManagerBackground "gray0"
IconManagerForeground "gray100"
}
KTerm*VT100*translations: #override Shift<Key>space: begin-conversion(_JAPANESE_CONVERSION) \n \
Ctrl ~Shift <Btn1Down>: popup-menu(mainMenu) \n \
~Ctrl Shift <Btn1Down>: popup-menu(vtMenu) \n \
Ctrl Shift <Btn1Down>: popup-menu(fontMenu)
本来は、Xhpcと同じ操作でButton2, Button3が入力できるようにmgvncviewer側を改造するべきか?
2007/07/13 MGL2側でグローバル変数 mgl_button_shift に(ドキュメントMGLAPI.doc中では mgl_mouse_shift と 説明されているが、これは間違い) [MENU]+[1],[2],[3] に応じて 0,1,2 を 設定することが判明。この仕様を利用してXhpc同様の3button emulationを実装中。しばしお待ちを...。
2007/07/14 上記のインストール手順の中に修正情報(パッチ)を含めました。
KTerm*VT100*translations: #override Shift<Key>space: begin-conversion(_JAPANESE_CONVERSION) \n \
<Key>0x113: string(0x1b) string("[A") \n \
<Key>0x114: string(0x1b) string("[B") \n \
<Key>0x115: string(0x1b) string("[C") \n \
<Key>0x116: string(0x1b) string("[D") \n \
<Key>0x117: string(0x1b) string("[5~") \n \
<Key>0x118: string(0x1b) string("[6~")
みたいな事をすればとりあえずこれらのキーが機能するようです。ただこれも本来はmgvncviewer側でmgl2のイベントコードから
Xのイベントコードに変換できれば一番スマートだと思うので、この件に関してはなんとかしてみようと思ってます。
2007/07/02 上記のインストール手順の中に修正情報(パッチ)を含めました。
KTerm*VT100*translations: #override Ctrl<Key>O: begin-conversion(_JAPANESE_CONVERSION)ただし、以下のように、SHIFT-SPACEだと設定できました。なぜ?
KTerm*VT100*translations: #override Shift<Key>space: begin-conversion(_JAPANESE_CONVERSION)また、他のマシンからX版vncviewerで接続するとCTRL-Oが機能します...。
こちらもxevで観察してみると、コントロールコードがそのままXのイベントとして渡されているようです。 つまりCTRL-Oは`0xf'がイベントとして発生しています(通常は`Ctrl'と`o'のイベントが別々に発生するのですが)。 対処療法では、.Xresourcesにて
KTerm*VT100*translations: #override Shift<Key>0xf: begin-conversion(_JAPANESE_CONVERSION)とすれば目的は達するのですが、やはりmgvncviewer側でCTRL-Oは`Ctrl'と`o'の(別々の)イベントに変換 してあげるのが筋でしょう。こちらもなんとかしてみたいと考えてます。
2007/07/02 上記のインストール手順の中に修正情報(パッチ)を含めました。
2007/07/13 別マシンからのvncviewerでの接続も一定時間(?)後切れてしまうので、Xvncが切断している事を確信...。
別の復帰方法を発見。[ 漢字 ](変換ウィンドウ)部分をクリックすればキー入力が復活するよう。 これなら何とか我慢できるかな...。