$NetBSD: patch-ag,v 1.1 2001/02/12 14:09:25 wiz Exp $ --- display.c.orig Tue Aug 25 15:56:02 1998 +++ display.c Tue Feb 6 15:02:19 2001 @@ -272,8 +272,13 @@ } 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 @@ 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 KeySym keysym; static XComposeStatus compose; - int count, bufsize, in; + int count, bufsize, in, i, code; char buffer[8]; bufsize = 8; @@ -511,16 +527,55 @@ 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 @@ 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 @@ XtNborder, BlackPixel(xcpDisplay, xcpScreenNum), NULL); XtAddEventHandler(topWidget, ButtonPressMask | KeyPressMask | - OwnerGrabButtonMask, False, HandleXEvents, + KeyReleaseMask | OwnerGrabButtonMask, False, HandleXEvents, (XtPointer)shptr); /*