#include #include #include #include "mw2.h" /*************************************/ /* BXW: Buttonの横幅 */ /* BYW: Buttonの縦幅 */ /* BXS: Button間の隙間の横幅 */ /* BXM: ButtonとWindow端の隙間の横幅 */ /* BYM: ButtonとWindow端の隙間の縦幅 */ /*************************************/ #define BXW 56 #define BYW 20 #define BXM 10 #define BYM 8 #define BXS 6 MW mw; /***************************************/ /* MW環境の初期化 (Event Loop前にCall) */ /***************************************/ void MW_Open(char *s,unsigned char *extcol) { int i; char **mlist; int mcount; char *defst; setlocale(LC_CTYPE,"ja_JP.EUC"); mw.d=XOpenDisplay(s); mw.r=RootWindow(mw.d,0); mw.g=XCreateGC(mw.d,mw.r,0,0); /**************************/ /* Font Tableの生成・定義 */ /**************************/ mw.f[0]=XCreateFontSet(mw.d,MWFONT_14,&mlist,&mcount,&defst); mw.f[1]=XCreateFontSet(mw.d,MWFONT_16,&mlist,&mcount,&defst); mw.f[2]=XCreateFontSet(mw.d,MWFONT_24,&mlist,&mcount,&defst); MW_Font(16); /*******************************************************/ /* Color Tableの生成・定義 */ /* */ /* extcol[3*n ]:n=0-127に定義される色の赤成分の強度 */ /* extcol[3*n+1]:n=0-127に定義される色の緑成分の強度 */ /* extcol[3*n+2]:n=0-127に定義される色の青成分の強度 */ /*******************************************************/ if (extcol!=0) { for (i=0;i<=127;i++){ mw.c[i].red =extcol[i*3+0]*0x100; mw.c[i].green=extcol[i*3+1]*0x100; mw.c[i].blue =extcol[i*3+2]*0x100; } } i=C_BLACK ;mw.c[i].red=0x0000;mw.c[i].green=0x0000;mw.c[i].blue=0x0000; i=C_BLUE ;mw.c[i].red=0x0000;mw.c[i].green=0x0000;mw.c[i].blue=0xFFFF; i=C_RED ;mw.c[i].red=0xFFFF;mw.c[i].green=0x0000;mw.c[i].blue=0x0000; i=C_PINK ;mw.c[i].red=0xFFFF;mw.c[i].green=0x0000;mw.c[i].blue=0xFFFF; i=C_GREEN ;mw.c[i].red=0x0000;mw.c[i].green=0xFFFF;mw.c[i].blue=0x0000; i=C_SKY ;mw.c[i].red=0x0000;mw.c[i].green=0xFFFF;mw.c[i].blue=0xFFFF; i=C_YELLOW;mw.c[i].red=0xFFFF;mw.c[i].green=0xFFFF;mw.c[i].blue=0x0000; i=C_WHITE ;mw.c[i].red=0xFFFF;mw.c[i].green=0xFFFF;mw.c[i].blue=0xFFFF; mw.cm=DefaultColormap(mw.d,0); for (i=0;i<136;i++) XAllocColor(mw.d,mw.cm,&(mw.c[i])); if (mw.rev) {mw.fg=C_WHITE;mw.bg=C_BLACK;} else {mw.fg=C_BLACK;mw.bg=C_WHITE;} XSetForeground(mw.d,mw.g,mw.c[mw.fg].pixel); XSetBackground(mw.d,mw.g,mw.c[mw.bg].pixel); /********************************************/ /* Window-0(親Window)の生成 */ /* */ /* w.xs[0]: Windowの横幅 */ /* w.ys[0]: Windowの縦幅 */ /* w.wn[0]: Title barに表示されるWindow名 */ /********************************************/ //mw.a.backing_store=Always; mw.w=XCreateSimpleWindow( mw.d,mw.r,0,0,mw.xw,mw.yw,0, mw.c[mw.fg].pixel,mw.c[mw.bg].pixel); mw.p=XCreatePixmap(mw.d,mw.w,mw.xw,mw.yw,DefaultDepth(mw.d,0)); //XChangeWindowAttributes(mw.d,mw.w[0],CWBackingStore,&mw.a); XSelectInput(mw.d,mw.w,ButtonPressMask|KeyPressMask|ExposureMask); XStoreName(mw.d,mw.w,mw.wn); /**********************************/ /* Window-0上のCLOSE Buttonの生成 */ /**********************************/ mw.bc=XCreateSimpleWindow( mw.d,mw.w,mw.xw-BXM-BXW,mw.yw-BYM-BYW,BXW,BYW,2, mw.c[mw.fg].pixel,mw.c[mw.bg].pixel); //XChangeWindowAttributes(mw.d,mw.bc[0],CWBackingStore,&mw.a); XSelectInput(mw.d,mw.bc,ButtonPressMask|ExposureMask); //XSetForeground(mw.d,mw.g,mw.c[mw.fg].pixel); //XmbDrawImageString(mw.d,mw.bc,mw.f[1],mw.g,0,16," CLOSE ",7); /************************/ /* Display上へのMapping */ /************************/ XMapWindow(mw.d,mw.w); XMapSubwindows(mw.d,mw.w); XSetForeground(mw.d,mw.g,mw.c[mw.bg].pixel); XFillRectangle(mw.d,mw.p,mw.g,0,0,mw.xw,mw.yw); XSetForeground(mw.d,mw.g,mw.c[mw.fg].pixel); //XCopyArea(mw.d,mw.w,mw.p,mw.g,0,0,mw.xw,mw.yw,0,0); } /********************************************/ /* MW環境下のEvent処理 (Event Loop中にCall) */ /* */ /* 戻値: CLOSEの有無 (1:継続,0:終了) */ /********************************************/ int MW_Event(void) { int i,j,c0; static char buf[64]; /*********************************/ /* CLOSE Buttonがclickされた場合 */ /*********************************/ if (XCheckTypedWindowEvent(mw.d,mw.bc,ButtonPress,&(mw.e))) { XDestroyWindow(mw.d,mw.w); mw.w=(Window)NULL; return 0; } if (XCheckTypedWindowEvent(mw.d,mw.bc,Expose,&(mw.e))) { XSetForeground(mw.d,mw.g,mw.c[mw.fg].pixel); XmbDrawImageString(mw.d,mw.bc,mw.f[1],mw.g,0,16," CLOSE ",7); } if (XCheckTypedWindowEvent(mw.d,mw.w,Expose,&(mw.e))) { XCopyArea(mw.d,mw.p,mw.w,mw.g,0,0,mw.xw,mw.yw,0,0); } return 1; } /***********************************/ /* Window有無調査関数 */ /* */ /* n: Windowの指定 */ /* 戻値: Windowの有無(1:有,0:無) */ /***********************************/ int MW_Exist(void) { if ((Window)NULL != (mw.w)) return 1; else return 0; } /**********************************/ /* Pointer状態調査関数 */ /* */ /* n: Windowの指定 */ /* 戻値: Clickの有無(1:有,0:無) */ /* mw.x: Pointerのx座標 */ /* mw.y: Pointerのy座標 */ /* mw.button: Button番号(1-3) */ /**********************************/ int MW_Click(void) { if ((Window)NULL==mw.w) return 0; if (XCheckTypedWindowEvent(mw.d,mw.w,ButtonPress,&(mw.e))) { mw.x=mw.e.xbutton.x; mw.y=mw.e.xbutton.y; mw.button=mw.e.xbutton.button; return 1; } else return 0; } /**********************************/ /* KeyBoard状態調査関数 */ /* */ /* n: Windowの指定 */ /* 戻値: Clickの有無(1:有,0:無) */ /* mw.key_x: Pointerのx座標 */ /* mw.key_y: Pointerのy座標 */ /* mw.keycode: Keycode */ /**********************************/ int MW_Key(void) { static char s[16]; if ((Window)NULL==mw.w) return 0; if (XCheckTypedWindowEvent(mw.d,mw.w,KeyPress,&(mw.e))) { mw.key_x=mw.e.xkey.x; mw.key_y=mw.e.xkey.y; mw.keycode=mw.e.xkey.keycode; return 1; } else return 0; } /*********************************************/ /* 描画色の変更 */ /* */ /* c: 色コード(0-127:連続色/128-135:固定色 */ /*********************************************/ void MW_Color(int c) { //if (c==mw.color) return; mw.color=c; XSetForeground(mw.d,mw.g,mw.c[c].pixel); } /*************************************/ /* Fontの変更 */ /* */ /* c: fontの縦幅(14,16,24のみ有効) */ /*************************************/ void MW_Font(int c) { //if (c==mw.font) return; mw.font=c; switch (c) { case 14:mw.fs=0;break; case 16:mw.fs=1;break; case 24:mw.fs=2;break; default:mw.fs=0;break; } } /**************************/ /* /を描く */ /* */ /* x1,y1: 始点のx,y座標 */ /* x2,y2: 終点のx,y座標 */ /* n: Windowの指定 */ /**************************/ void MW_Line(int x1,int y1,int x2,int y2) { XDrawLine(mw.d,mw.w,mw.g,x1,y1,x2,y2); XDrawLine(mw.d,mw.p,mw.g,x1,y1,x2,y2); //XFlush(mw.d); } /**************************/ /* □を描く */ /* */ /* x1,y1: 始点のx,y座標 */ /* x2,y2: 終点のx,y座標 */ /* n: Windowの指定 */ /**************************/ void MW_Rect(int x1,int y1,int x2,int y2) { XDrawRectangle(mw.d,mw.w,mw.g,x1,y1,x2-x1,y2-y1); XDrawRectangle(mw.d,mw.p,mw.g,x1,y1,x2-x1,y2-y1); //XFlush(mw.d); } /**************************/ /* ■を描く */ /* */ /* x1,y1: 始点のx,y座標 */ /* x2,y2: 終点のx,y座標 */ /* n: Windowの指定 */ /**************************/ void MW_FRect(int x1,int y1,int x2,int y2) { XFillRectangle(mw.d,mw.w,mw.g,x1,y1,x2-x1,y2-y1); XFillRectangle(mw.d,mw.p,mw.g,x1,y1,x2-x1,y2-y1); //XFlush(mw.d); } /********************************************/ /* 文字列描く */ /* */ /* x1,y1: 基準点のx,y座標 */ /* orig: 基準点定義(7:左上,8:中上,9:右上, */ /* 4:左中,5:中央,6:右中, */ /* 1:左下,2:中下,3:右下) */ /* str: 文字列 */ /* md: 背景色 (0:透明,1:不透明) */ /* n: Windowの指定 */ /********************************************/ void MW_String(int x,int y,int orig,char *str,int md) { int l,x0,y0; l=strlen(str); switch (orig) { case 1:x0=x ;y0=y ;break; case 2:x0=x-l*mw.font/4;y0=y ;break; case 3:x0=x-l*mw.font/2;y0=y ;break; case 4:x0=x ;y0=y+mw.font/2;break; case 5:x0=x-l*mw.font/4;y0=y+mw.font/2;break; case 6:x0=x-l*mw.font/2;y0=y+mw.font/2;break; case 7:x0=x ;y0=y+mw.font ;break; case 8:x0=x-l*mw.font/4;y0=y+mw.font ;break; case 9:x0=x-l*mw.font/2;y0=y+mw.font ;break; } if (md) XmbDrawImageString(mw.d,mw.w,mw.f[mw.fs],mw.g,x0,y0,str,l); else XmbDrawString (mw.d,mw.w,mw.f[mw.fs],mw.g,x0,y0,str,l); if (md) XmbDrawImageString(mw.d,mw.p,mw.f[mw.fs],mw.g,x0,y0,str,l); else XmbDrawString (mw.d,mw.p,mw.f[mw.fs],mw.g,x0,y0,str,l); //XFlush(mw.d); } /*******************************************/ /* 画像Data File(XWD形式)の出力 */ /* */ /* fn: File名 */ /* n: Windowの指定 (">"の場合は標準出力) */ /*******************************************/ void MW_XWD(void) { static char buf[64]; time_t tt; struct tm *t; if ((Window)NULL == mw.w) return; else { time(&tt);t=localtime(&tt); sprintf (buf,"xwd -nobdrs -out %02d%02d%02d.%02d%02d%02d.xwd -id %lu", (t->tm_year)%100,(t->tm_mon)+1,t->tm_mday, t->tm_hour,t->tm_min,t->tm_sec,mw.w); } //printf("%s\n",buf); system(buf); } void MW_LPR(void) { static char buf[256]; time_t tt; struct tm *t; if ((Window)NULL == mw.w) return; else { time(&tt);t=localtime(&tt); sprintf (buf,"xwd -nobdrs -out %02d%02d%02d.%02d%02d%02d.xwd -id %lu", (t->tm_year)%100,(t->tm_mon)+1,t->tm_mday, t->tm_hour,t->tm_min,t->tm_sec,mw.w); } //printf("%s\n",buf); system(buf); sprintf (buf,"./mw_lpr.sh %02d%02d%02d.%02d%02d%02d", (t->tm_year)%100,(t->tm_mon)+1,t->tm_mday, t->tm_hour,t->tm_min,t->tm_sec); system(buf); } void MW_LPR2(char *fn) { static char buf[256]; if ((Window)NULL == mw.w) return; else { sprintf (buf,"xwd -nobdrs -out %s.xwd -id %lu",fn,mw.w); } system(buf); sprintf (buf,"convert %s.xwd %s.png ; rm %s.xwd",fn,fn,fn); system(buf); } /****/ void MW_Copy(int x0,int y0,int x1,int y1,int xw,int yw) { XCopyArea(mw.d,mw.w,mw.w,mw.g,x0,y0,xw,yw,x1,y1); XCopyArea(mw.d,mw.p,mw.p,mw.g,x0,y0,xw,yw,x1,y1); }