📄 nxscribble.c
字号:
/* * Copyright (c) 2000 Greg Haerr <greg@censoft.com> * Copyright (c) 2000 Century Software <embedded.centurysoftware.com> * * Scribble Handwriting Recognition for Nano-X! */#include <stdio.h>#include <stdlib.h>#define MWINCLUDECOLORS#include "nano-X.h"#include "scrib.h"#define TEXTWIN_WIDTH 200 /* text window width/height*/#define TEXTWIN_HEIGHT 150static ScribbleWidget w;static GR_BOOL bTextwin = GR_FALSE;static GR_WINDOW_ID wt = 0;static GR_GC_ID gct = 0;static GR_GC_ID gctb = 0;static GR_COORD xpos = 0;static GR_COORD ypos = 0;static GR_SIZE width; /* width of character */static GR_SIZE height; /* height of character */static GR_SIZE base; /* height of baseline */static void char_out(GR_CHAR ch);static void char_del(GR_COORD x, GR_COORD y);void do_buttondown(GR_EVENT_BUTTON *bp);void do_buttonup(GR_EVENT_BUTTON *bp);void do_motion(GR_EVENT_MOUSE *mp);void do_focusin(GR_EVENT_GENERAL *gp);void do_keystroke(GR_EVENT_KEYSTROKE *kp);void do_exposure(GR_EVENT_EXPOSURE *ep);intmain(int argc, char **argv){ int t = 1; GR_EVENT event; /* current event */ while (t < argc) { if (!strcmp("-t", argv[t])) { bTextwin = GR_TRUE; ++t; continue; } } if (GrOpen() < 0) { fprintf(stderr, "cannot open graphics\n"); exit(1); } if (bTextwin) { /* create text output window for debugging*/ wt = GrNewWindow(GR_ROOT_WINDOW_ID, 50, 20, TEXTWIN_WIDTH, TEXTWIN_HEIGHT, 5, BLACK, GREEN); GrSelectEvents(wt, GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_KEY_DOWN | GR_EVENT_MASK_EXPOSURE); GrMapWindow(wt); gct = GrNewGC(); GrSetGCForeground(gct, GREEN); GrGetGCTextSize(gct, "A",1, GR_TFASCII, &width, &height, &base); GrSetGCFont(gct, GrCreateFont(GR_FONT_OEM_FIXED, 0, NULL)); gctb = GrNewGC(); GrSetGCForeground(gctb, BLACK); } /* create scribble input window*/ w = create_scribble(); while (1) { GrGetNextEvent(&event); switch (event.type) { case GR_EVENT_TYPE_BUTTON_DOWN: do_buttondown(&event.button); break; case GR_EVENT_TYPE_BUTTON_UP: do_buttonup(&event.button); break; case GR_EVENT_TYPE_MOUSE_POSITION: case GR_EVENT_TYPE_MOUSE_MOTION: do_motion(&event.mouse); break; case GR_EVENT_TYPE_FOCUS_IN: do_focusin(&event.general); break; case GR_EVENT_TYPE_KEY_DOWN: do_keystroke(&event.keystroke); break; case GR_EVENT_TYPE_EXPOSURE: do_exposure(&event.exposure); break; case GR_EVENT_TYPE_CLOSE_REQ: GrClose(); exit(0); } }}/* * Here when a button is pressed. */voiddo_buttondown(GR_EVENT_BUTTON *bp){ ActionStart(w, bp->x, bp->y);}/* * Here when a button is released. */voiddo_buttonup(GR_EVENT_BUTTON *bp){ ActionEnd(w, bp->x, bp->y);}/* * Here when the mouse has a motion event. */voiddo_motion(GR_EVENT_MOUSE *mp){ ActionMove(w, mp->x, mp->y);}/* * Here when our window gets focus */voiddo_focusin(GR_EVENT_GENERAL *gp){#if 0 /* if the window receiving focus is scribble, remember last window*/ if (gp->wid == w->win && gp->wid != 1) w->lastfocusid = gp->otherid;#endif}/* * Here when an exposure event occurs. */voiddo_exposure(GR_EVENT_EXPOSURE *ep){ if (ep->wid == w->win) Redisplay(w);}/* * Here when a keyboard press or injection occurs. */voiddo_keystroke(GR_EVENT_KEYSTROKE *kp){ if (bTextwin) char_out(kp->ch);}static voidchar_del(GR_COORD x, GR_COORD y){ xpos -= width; GrFillRect(wt, gctb, x+1, y /*- height*/ /*+ base*/, width, height);}static voidchar_out(GR_CHAR ch){ switch(ch) { case '\r': case '\n': xpos = 0; ypos += height; if(ypos >= TEXTWIN_HEIGHT - height) { ypos -= height; /* FIXME: changing FALSE to TRUE crashes nano-X*/ /* clear screen, no scroll*/ ypos = 0; GrClearWindow(wt, GR_FALSE); } return; case '\007': /* bel*/ return; case '\t': xpos += width; while((xpos/width) & 7) char_out(' '); return; case '\b': /* assumes fixed width font!!*/ if (xpos <= 0) return; char_del(xpos, ypos); char_out(' '); char_del(xpos, ypos); return; } GrText(wt, gct, xpos+1, ypos, &ch, 1, GR_TFTOP); xpos += width; if (xpos >= TEXTWIN_WIDTH-width) char_out('\n');}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -