$NetBSD: patch-ag,v 1.2 2021/08/27 03:41:41 ryoon Exp $

--- display.c.orig	1998-08-25 13:56:02.000000000 +0000
+++ display.c
@@ -272,8 +272,13 @@ static void xcpPutImage(int x, int y, in
 }
 
 static int xcpHandleExpose(XEvent *event) {
-  xcpPutImage(event->xexpose.x, event->xexpose.y, event->xexpose.width,
-              event->xexpose.height);
+  if (shared->LcdPower == lcdOff) {
+      XClearWindow (xcpDisplay, xcpLCDWindow);
+      XFlush(xcpDisplay);
+  }
+  else
+    xcpPutImage(event->xexpose.x, event->xexpose.y, event->xexpose.width,
+                event->xexpose.height);
   return event->xexpose.count;
 }
 
@@ -360,15 +365,26 @@ static void xcpKeyEvent(int down, int ke
 typedef struct _Key {
   const char *name;
   XRectangle bounds;
+  KeySym key;
 } Key;
 
-static Key keys[] = {{"power", {0, 281, 16, 22}},
-                     {"up", {100, 280, 25, 12}},
-                     {"down", {100, 302, 25, 12}},
-                     {"datebook", {24, 277, 28, 29}},
-                     {"phone", {63, 277, 28, 29}},
-                     {"todo", {134, 277, 28, 29}},
-                     {"memo", {173, 277, 28, 29}}};
+typedef struct _NonprintKey {
+  KeySym sym;
+  int code;
+} NonprintKey;
+
+static Key keys[] = {{"power", {0, 281, 16, 22}, XK_Escape},
+                     {"up", {100, 280, 25, 12}, XK_Page_Up},
+                     {"down", {100, 302, 25, 12}, XK_Page_Down},
+                     {"datebook", {24, 277, 28, 29}, XK_F9},
+                     {"phone", {63, 277, 28, 29}, XK_F10},
+                     {"todo", {134, 277, 28, 29}, XK_F11},
+                     {"memo", {173, 277, 28, 29}, XK_F12}};
+
+static NonprintKey nonprint_keys[] = {{XK_Left, 0x1c /* chrLeftArrow */},
+				  {XK_Right, 0x1d /* chrRightArrow */},
+				  {XK_Down, 0x103 /* vchrNextField */},
+				  {XK_Up, 0x10c /* vchrPrevField */}};
 
 static void HandleKey(Widget w, XtPointer client_data, XEvent *event,
                       Boolean *continue_to_dispatch)
@@ -502,7 +518,7 @@ static void xcpKBtoASCII(shared_img *shp
 {
   static KeySym		keysym;
   static XComposeStatus	compose;
-  int			count, bufsize, in;
+  int			count, bufsize, in, i, code;
   char			buffer[8];
 
   bufsize = 8;
@@ -511,16 +527,55 @@ static void xcpKBtoASCII(shared_img *shp
 			bufsize,
 			&keysym,
 			&compose);
+
+  for (i = 0; i < XtNumber(keys); i++)
+    if (keysym == keys[i].key) {
+      xcpKeyEvent(1, i);
+      return;
+  }
+
+  if (count > 0) {
+    if (buffer[0] == '\r')
+      code = '\n';
+    else
+      code = buffer[0];
+  }
+  else {
+    for (i = 0; i < XtNumber(nonprint_keys); i++)
+      if (keysym == nonprint_keys[i].sym) {
+        count = 1;
+        code = nonprint_keys[i].code;
+      }
+  }
+
   if (count > 0) {
-    if (buffer[0] == '\r') {
-      buffer[0] = '\n';
-    }
     in = shptr->kbin;
-    shptr->kb[in] = buffer[0];
+    shptr->kb[in] = code;
     shptr->kbin = (in + 1) & 7;
   }
 }
 
+static void xcpKBKey(XEvent *event)
+{
+  static KeySym		keysym;
+  static XComposeStatus	compose;
+  int			count, bufsize, in, i;
+  char			buffer[8];
+
+  bufsize = 8;
+  count = XLookupString((XKeyEvent *) event,
+			buffer,
+			bufsize,
+			&keysym,
+			&compose);
+
+  for (i = 0; i < XtNumber(keys); i++)
+    if (keysym == keys[i].key) {
+      xcpKeyEvent(0, i);
+      return;
+    }
+}
+
 static void HandleClientMessage(Widget w, XtPointer client_data, XEvent *event,
                                 Boolean *continue_to_dispatch)
 {
@@ -542,6 +597,8 @@ static void HandleXEvents(Widget w, XtPo
   case KeyPress:
     xcpKBtoASCII(shptr, event);
     break;
+  case KeyRelease:
+    xcpKBKey(event);
   case ButtonPress:		/* a mouse button was pressed */
     if (event->xbutton.button == 3)
       do_menu(event->xbutton.x_root, event->xbutton.y_root);
@@ -623,7 +680,7 @@ char *xcpInitialize(shared_img *shptr, X
                 XtNborder, BlackPixel(xcpDisplay, xcpScreenNum), NULL);
 
   XtAddEventHandler(topWidget, ButtonPressMask | KeyPressMask |
-                    OwnerGrabButtonMask, False, HandleXEvents,
+                    KeyReleaseMask | OwnerGrabButtonMask, False, HandleXEvents,
                     (XtPointer)shptr);
 
   /*
@@ -936,8 +993,14 @@ static void xcpUpdateLCD(char *sbuf, con
 #ifdef WORDS_BIGENDIAN
 #define GOOD_ENDIAN(x) (x)
 #else
+#  if __INTPTR_WIDTH__ == 32
 /* Wonk: sizeof(unsigned char *) must be == sizeof(uint32)  - Ian */
-#define GOOD_ENDIAN(x) ((unsigned char *)(((uint32)(x))^1UL))
+#  define GOOD_ENDIAN(x) ((unsigned char *)(((uint32)(x))^1UL))
+#  elif __INTPTR_WIDTH__ == 64
+#  define GOOD_ENDIAN(x) ((unsigned char *)(((__uint64_t)(x))^1UL))
+#  else
+#  error This architecture is not supported.
+#  endif
 #endif
 
 #define PUTPIXEL(type, dstptr, x) {                                        \
