commit bbb408e08c57d98bd5c0a345bac00316997f39bb Author: Morgan Aldridge Date: Tue Mar 3 18:49:26 2020 -0500 Imported mlclock 1.1 release diff --git a/Imakefile b/Imakefile new file mode 100644 index 0000000..837c9b1 --- /dev/null +++ b/Imakefile @@ -0,0 +1,21 @@ +# mlclock is macintosh like clock + +RCFILE = .mlclockrc +CC = gcc +OPTION = + +# If function dosen't find , add -lsocket or whatever you need . +# This is example . +#ADD_LIBRARIES = -lxpg4 -lsocket -lnsl +ADD_LIBRARIES = -lxpg4 + +#---You shouldn't have to change anything below this line.--- + +LOCAL_LIBRARIES = $(XLIB) $(ADD_LIBRARIES) + +SRCS = mlclock.c +OBJS = $(SRCS:.c=.o) + +DEFINES = $(OPTION) -DRCFILE=\"${RCFILE}\" + +ComplexProgramTarget( mlclock ) diff --git a/Makefile.std b/Makefile.std new file mode 100644 index 0000000..6de665d --- /dev/null +++ b/Makefile.std @@ -0,0 +1,11 @@ +# コンパイル + +a:: mlclock + +mlclock :mlclock.c + gcc -O2 -Wall mlclock.c -o mlclock -I/usr/X11R6/include \ + -L/usr/X11R6/lib -lX11 -lxpg4 -DRCFILE=\".mlclockrc\" + +clean:: + rm -f *.o core *~ *.core "#"* mlclock + diff --git a/README b/README new file mode 100644 index 0000000..386ccb6 --- /dev/null +++ b/README @@ -0,0 +1,15 @@ + MLCLOCK is "Macintosh like clock" + +HOW TO COMPILE + + 1) xmkmf + 2) make + +HOW TO USE + + Copy mlclockrc file to your home directory as ".mlclockrc" or specifyed name. + Run mlclock. + +ABOUT BUGS + + Send mail to hideki@hry.info.gifu-u.ac.jp diff --git a/README.EUC b/README.EUC new file mode 100644 index 0000000..6f25a85 --- /dev/null +++ b/README.EUC @@ -0,0 +1,42 @@ + MLCLOCK は Macintosh Like Clock です。(変な文) + +コンパイル + + 1) xmkmf + 2) make + で、おっけーです。(たぶん) + +使い方 + + まず mlclockrc-kanji を自分のディレクトリにコピーします。 + (通常は .mlclockrc という名前にしてコピーします。) + (または、Imakefile の中で指定したファイル名にします。) + mlclock で、実行できます。 + +ナイスな使い方 + + お手持ちの .mlvwmrc に + Swallow "MLClock" Action Exec "mlclock" exec mlclock + の一行を加えます。 + これですべておっけー。 + + +EVENT について + + 始めのころは、mlvwm のメニューに入れても CLICK が使えたのですが、 + 最近はなんかイベントが受け取れません。 + よって EVENT には FOCUS を使って下さいね。 + 普通に、使うぶんにはどちらも使えます。 + +バグについて + + いろいろあるかとは思いますが、何か気づいたら + hideki@hry.info.gifu-u.ac.jp + まで、メールして下さい。 + + +MLCLOCK のページ(予定) + + http://www.hry.info.gifu-u.ac.jp/~hideki/index.html + にアクセスしてみて下さい。 + MLCLOCKの最新版他、X window 用のゲームなどがあります。 diff --git a/mlclock.c b/mlclock.c new file mode 100644 index 0000000..e42e6fc --- /dev/null +++ b/mlclock.c @@ -0,0 +1,449 @@ +/* + * Mlclock is "Macintsh like clock" . + * Written by Hideki Kimata. + * Send Email to hideki@hry.info.gifu-u.ac.jp. + * Access to http://www.hry.info.gifu-u.ac.jp/~hideki/index.html + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define VERSION "1.1" + +#define TRUE 1 +#define FALSE 0 +#define NONE -1 +#define MAX_FORM 1000 + +#ifndef RCFILE +#define RCFILE ".mlclockrc" +#endif + +#define FOCUS 0 +#define CLICK 1 +#define DEFAULTFONT "-*-*-medium-r-normal--14-*" +#define NEAR 10 +#define FORM1 "(%a)%p%l:%M:%S" +#define FORM2 "(%a)%Y.%b.%d" +#define DEFAULTLANG "C" + +int Mode ; /* timing of change form */ +int Near ; /* the distance of activity */ +int Head ; /* space of window head */ +char *Form1 ; /* display form of main */ +char *Form2 ; /* display form of second */ +char *LocaleName ; /* locale name */ +char *FSName ; /* font set name */ +char *RCFile ; /* path of config file */ +int Color[2][3] ; /* the color for font and background */ +int Bold = False ; /* software bold font */ + +void SetFont( char *localename , Display *dpy , char *fsname ) ; +void readrc() ; +void getRGB( char *color , int *store ) ; +void usage( char *name ) ; + +Display *dpy ; +Window win ; +XEvent eve ; +XRectangle ink, log; +GC gc ; +XFontSet fs ; +Colormap cmap ; + +struct timeval wait ; + +void main( int argc , char **argv ){ + char str[MAX_FORM] , str2[MAX_FORM] , *form = NULL ; + int screen , sw = False , lsec = 0 , uhead , width , height , i ; + struct tm *tmm ; + time_t tmt ; + + Window root , child ; + int rootx , rooty , wx , wy ; + unsigned int key ; + XColor xcol ; + XSizeHints hint ; + int iro[2] ; + + wait.tv_usec = 200000 ; + wait.tv_sec = 0 ; + + str[0] = '\0' ; + i = 1 ; + while( i < argc ){ + if ( !strcmp( "-display" , argv[i] )){ + i++ ; + if ( argc >= argc ) + usage( argv[0]) ; + strcpy( str , argv[i] ) ; + break ; + } + usage(argv[0]) ; + } + + dpy = XOpenDisplay(NULL); + + if ( dpy == NULL ){ + fprintf( stderr , "Can't open display.\n" ) ; + exit(0) ; + } + + screen = DefaultScreen( dpy ) ; + gc = DefaultGC( dpy , screen ) ; + cmap = DefaultColormap( dpy , screen ) ; + + readrc() ; + + if (XSupportsLocale() == False) + fprintf(stderr,"X does not support the locale\n"); + SetFont( LocaleName , dpy , FSName ) ; + + XSetForeground( dpy , gc , BlackPixel( dpy , screen )) ; + setlocale(LC_TIME, LocaleName ); + + time( &tmt ) ; + tmm = localtime( &tmt ) ; + tmm->tm_sec = 59; + tmm->tm_min = 59; + tmm->tm_hour = 23; + tmm->tm_mday = 30; + tmm->tm_yday = 365; + + strftime(str, MAX_FORM, Form1 , tmm); + XmbTextExtents( fs , str , strlen(str) , &ink, &log); + width=log.width ; + uhead = log.y ; + height = log.height ; + + strftime(str, MAX_FORM, Form2 , tmm); + XmbTextExtents( fs , str , strlen(str) , &ink, &log); + if ( width < log.width ) + width = log.width ; + if ( uhead < log.y ) + uhead = log.y ; + if ( height < log.height ) + height = log.height ; + + xcol.flags = DoRed|DoGreen|DoBlue ; + for ( i = 0 ; i < 2 ; i ++ ){ + xcol.red = Color[i][0] ; + xcol.green = Color[i][1] ; + xcol.blue = Color[i][2] ; + if ( XAllocColor( dpy , cmap , &xcol )) + iro[i] = xcol.pixel ; + else fprintf(stderr,"Can't allocate Color \n" ) ; + } + + win = XCreateSimpleWindow( dpy , DefaultRootWindow( dpy ) , + 0 , 0 , width + 3 , height + Head + 2 , 0 , + iro[0] ,iro[1] ) ; + + hint.max_width = hint.min_width = width + 3 ; + hint.max_height = hint.min_height = height + Head + 2 ; + hint.flags = PMinSize | PMaxSize; + XSetNormalHints(dpy , win , &hint); + + XSelectInput( dpy , win , ButtonReleaseMask ) ; + XStoreName( dpy , win , "mlclock" ) ; + XSetForeground( dpy , gc , iro[0] ) ; + XSync( dpy , 0 ); + XMapWindow( dpy ,win ) ; + XSync( dpy , 0 ); + + str2[0] = '\0' ; + form = Form1 ; + while(1){ + select( 0 , (fd_set *)0 , (fd_set *)0 , (fd_set *)0 , &wait) ; + + time( &tmt ) ; + tmm = localtime( &tmt ) ; + + if ( Mode == FOCUS ){ + XQueryPointer( dpy , win , &root , &child , &rootx,&rooty , &wx,&wy,&key); + if (( -Near < wx ) && ( wx < width + Near ) && + ( -Near < wy ) && ( wy < height + Near + Head )) + form = Form2 ; + else + form = Form1 ; } + else + if ( Mode == CLICK ){ + if( XEventsQueued( dpy, QueuedAfterFlush ) ){ + XNextEvent( dpy , &eve ) ; + if ( eve.type == ButtonRelease ){ + if ( !sw ){ + sw = True ; + lsec = tmm->tm_sec ; + form = Form2 ; + } + else { + sw = False ; + form = Form1 ; + } + } + } + + if ( sw ){ + if ( tmm->tm_sec < lsec ) + tmm->tm_sec += 60 ; + if ( tmm->tm_sec > lsec + 2 ){ + sw = False ; + form = Form1 ; + } + } + } + + strftime(str, sizeof(str),form , tmm); + if ( strcmp( str , str2 )){ + XClearWindow( dpy , win ) ; + XmbDrawString( dpy , win , fs , gc, 1 , - uhead + Head + 1 , str, strlen(str)); + if ( Bold ) + XmbDrawString( dpy , win , fs , gc, 2 , - uhead + Head + 1 , str, strlen(str)); + XSync( dpy , 0 ) ; + strcpy( str2 , str ) ; + } + } +} + +void SetFont( char *localename , Display *dpy , char *fsname ) +{ + char **miss, *def; + int nMiss; + + if (setlocale(LC_ALL, localename) == NULL) + fprintf(stderr,"Can't set the locale\n"); + + fs = XCreateFontSet( dpy , fsname , &miss, &nMiss, &def); + if (fs == NULL) + fprintf(stderr,"Can't get fontset.\n" ) ; +} + +void readrc(){ + int i , end , len , sw1 , cn = 0 ; + char string[501] , work[201] , code[100] , data[100] , *ptr ; + char *fore , *back ; + struct _name { + char name[10] ; + int sw ; + } ; + + FILE *file ; + + struct _name N[] ={ + { "FORM1" , 1 } , + { "FORM2" , 2 } , + { "NEAR" , 3 } , + { "EVENT" , 4 } , + { "LOCALE" , 5 } , + { "FONTSET" , 6 } , + { "HEAD" , 7 } , + { "FONTCOLOR" , 8 } , + { "BACKCOLOR" , 9 } , + { "BOLD" , 10 } , + { "" , 0 }} ; + + + Mode = Near = Head = NONE ; + Form1 = Form2 = LocaleName = FSName = NULL ; + + for ( i = 0 ; i < 3 ; i ++ ){ + Color[0][i] = 0 ; + Color[1][i] = 0xffff ; + } + + RCFile = malloc ( sizeof( RCFILE ) + strlen( getenv("HOME")) + 3 ) ; + sprintf( RCFile , "%s/%s",getenv("HOME"),RCFILE ) ; + + if ( ( file = fopen( RCFile , "r" )) == NULL ){ + fprintf( stderr , "Can't open \"%s\" file.\n" , RCFile ) ; + fprintf( stderr , "Now making rc file.\n" , RCFile ) ; + + if ((file = fopen( RCFile , "a" )) == NULL ) + fprintf( stderr , "You can't make rc file in your own dirctory.\n" ) ; + else{ + fprintf( file , "FORM1 = \"(%%a)%%l:%%M:%%S%%p\"\n") ; + fprintf( file , "FORM2 = \"(%%a)%%b-%%d\"\n") ; + fprintf( file , "EVENT = FOCUS ; FOCUS or CLICK\n") ; + fprintf( file , "NEAR = 10\n" ) ; + fprintf( file , "LOCALE = \"C\"\n") ; + fprintf( file , "FONTSET = \"-*-*-medium-r-normal--12-*\"\n") ; + fprintf( file , "HEAD = 5\n") ; + fprintf( file , "FONTCOLOR = \"blue\"\n" ) ; + fprintf( file , "BACKCOLOR = \"white\"\n" ) ; + fprintf( file , "BOLD = FALSE ; TRUE or FALSE\n" ) ; + fclose ( file ) ; + fprintf( stderr , "Created %s file.\n" , RCFile ) ; + } + } + else + while( fgets( string , 500 , file )){ + end = FALSE ; + i = 0 ; + sw1 = False ; + while( string[i] != ';' && string[i] != '\0' && string[i] != '\n' ){ + if ( string[i] == '=' && sw1 == False ){ + string[i] = ' ' ; + sw1 = True ; + } + work[i] = string[i++] ; + } + work[i] = '\0' ; + + if ( sw1 == False ) + continue ; + + code[0] = '\0' ; + data[0] = '\0' ; + + sscanf( work , "%s %s", code , data) ; + if ( code[0] == '\0' ) + continue ; + + i = 0 ; + while( True ){ + if ( N[i].name[0] == '\0' ){ + cn = 0 ; + break ; + } + if ( !strcmp( N[i].name , code )){ + cn = N[i].sw ; + break ; + } + i ++ ; + } + + switch( cn ){ + case 1: + len = strlen( data ) ; + Form1 = malloc( len ) ; + strcpy( Form1 , &data[1] ) ; + Form1[len-2] = '\0' ; + break ; + case 2: + len = strlen( data ) ; + Form2 = malloc( len ) ; + strcpy( Form2 , &data[1] ) ; + Form2[len-2] = '\0' ; + break ; + case 3: + Near = atoi( data ) ; + break; + case 4: + if ( !strcmp( data , "FOCUS" )){ + Mode = FOCUS ; + break ; + } + if ( !strcmp( data , "CLICK" )){ + Mode = CLICK ; + break ; + } + break ; + case 5: + len = strlen( data ) ; + LocaleName = malloc( len ) ; + strcpy( LocaleName , &data[1] ) ; + LocaleName[len-2] = '\0' ; + break ; + case 6: + len = strlen( data ) ; + FSName = malloc( len ) ; + strcpy( FSName , &data[1] ) ; + FSName[len-2] = '\0' ; + break ; + case 7: + Head = atoi( data ) ; + break; + case 8: + len = strlen( data ) ; + fore = malloc( len ) ; + strcpy( fore , &data[1] ) ; + fore[len-2] = '\0' ; + getRGB( fore , Color[0] ) ; + break ; + case 9: + len = strlen( data ) ; + back = malloc( len ) ; + strcpy( back , &data[1] ) ; + back[len-2] = '\0' ; + getRGB( back , Color[1] ) ; + break ; + case 10: + if ( !strcmp( data , "TRUE" )){ + Bold = True ; + break ; + } + if ( !strcmp( data , "FALSE" )){ + Bold = False ; + break ; + } + break ; + default: + break ; + } + } + + if ( Mode == NONE ) + Mode = FOCUS ; + if ( Near == NONE ) + Near = NEAR ; + if ( Head == NONE ) + Head = 0 ; + if ( Form1 == NULL ){ + Form1 = malloc( strlen( FORM1 ) + 1) ; + strcpy( Form1 , FORM1 ) ; + } + if ( Form2 == NULL ){ + Form2 = malloc( strlen( FORM2 ) + 1) ; + strcpy( Form2 , FORM2 ) ; + } + if ( FSName == NULL ){ + FSName = malloc( strlen( DEFAULTFONT ) + 1) ; + strcpy( FSName , DEFAULTFONT ) ; + } + if ( LocaleName == NULL ){ + ptr = getenv( "LANG" ) ; + if ( ptr == NULL ) + ptr = DEFAULTLANG ; + LocaleName = malloc( strlen( ptr ) + 1) ; + strcpy( LocaleName , ptr ) ; + } +} + +void getRGB( char *color , int *store ){ + int i ; + char tmpcolor[3] ; + XColor rgb , hard ; + + if ( color[0] == '#' ){ + color ++ ; + for ( i = 0 ; i < 3 ; i ++ ){ + strncpy( tmpcolor , color , 2 ) ; + sscanf( tmpcolor , "%x" , store ) ; + (*store) *= 256 ; + color += 2 ; + } + } + else { + XLookupColor( dpy , cmap , color , &rgb , &hard ) ; + store[0] = hard.red ; + store[1] = hard.green ; + store[2] = hard.blue ; + } +} + +void usage( char *name ){ + printf("%s: usage\n" , name ) ; + printf(" -display display name\n\n" ) ; + printf(" Version %s\n" , VERSION ); + printf(" Written by Hideki Kimata\n") ; + printf(" EMail hideki@hry.info.gifu-u.ac.jp\n" ) ; + printf(" Access to http://www.hry.info.gifu-u.ac.jp/~hideki/index.html\n" ) ; + exit(0) ; +} diff --git a/rcfile/mlclockrc b/rcfile/mlclockrc new file mode 100644 index 0000000..a166558 --- /dev/null +++ b/rcfile/mlclockrc @@ -0,0 +1,28 @@ +; mlclock setting file ( $HOME/.mlclockrc ) + +; see strftime . +; DON'T USE SPACE. + +FORM1 = "(%a)%l:%M:%S%p" ; form1 +FORM2 = "(%a)%b月%d日" ; form2 + +; samples +;FORM1 = "%H:%M:%S" ; 23:22:33 +;FORM2 = "%Y/%b/%d" ; 1998/7/12 + +EVENT = FOCUS ; FOCUS or CLICK +NEAR = 10 ; the distance of change form event + +LOCALE = "C" ; locale name( Do you use it ? ) +FONTSET = "-*-*-medium-r-normal--12-*" ; font set + +HEAD = 5 ; head space + +; specify color name or color value as "#rrggbb#. + +FONTCOLOR = "blue" ; font color +BACKCOLOR = "white" ; backgorung color +;FONTCOLOR = "#0000ff" +;BACKCOLOR = "white" + +BOLD = FALSE ; Bold font ? ( TRUE or FALSE ) diff --git a/rcfile/mlclockrc-kanji b/rcfile/mlclockrc-kanji new file mode 100644 index 0000000..2ede759 --- /dev/null +++ b/rcfile/mlclockrc-kanji @@ -0,0 +1,42 @@ +; mlclock の設定ファイル ( $HOME/.mlclockrc ) + +; 表示フォームについては strftime を man で見て下さい。 +; プログラムがダサイので、スペースを使わないで下さい。(^_^; +FORM1 = "(%a)%l:%M:%S%p" ; 常時表示されるフォーム +FORM2 = "(%a)%b月%d日" ; 切替えた時のフォーム + +;FORM1 = "(%A)%l時%M分%S秒%p" ; (日曜日)11時22時33秒午後 +;FORM1 = "%H:%M:%S%Z" ; 23:22:33 +;FORM1 = "%T%Z" ; 23:22:33 JST + +;FORM2 = "%Y年%b月%d日" ; 1998年 7月12日 + +; LOCALE が ja_JP.EUC なら +; /usr/share/locale/ja_JP.EUC/LC_TIME (FreeBSDの場合) +; をいじれば解消します。 + + +; EVENT は CLICK と FOCUS が指定できます。 +; +; CLICK はウィンドウをクリックすることでフォーム1とフォーム2を切替えられます。 +; ただしフォーム2は3秒たつとフォーム1に戻ります。(クリックでも戻る) +; +; FOCUS はポインタをウインドウに入れることでフォーム1とフォーム2を切替えられます。 + +EVENT = FOCUS ; フォームを切替えるイベント +NEAR = 10 ; ウィンドウにどれだけ近付いたらフォームを変更するか(FOCUS 用) + +LOCALE = "ja_JP.EUC" ; このファイルのロケール +FONTSET = "-*-*-medium-r-normal--12-*" ; 表示用フォントセット + +HEAD = 5 ; フォームの上のすきまの大きさ(mlvwm用) + +; 色は rgb.txt を見るか showrgb を実行するかして色の名前で指定するか、 +; #rrggbb で指定します。 + +FONTCOLOR = "blue" ; フォントの色 +BACKCOLOR = "white" ; 背景色 +;FONTCOLOR = "#0000ff" +;BACKCOLOR = "white" + +BOLD = FALSE ; フォントを太字にするかどうか ( TRUE or FALSE )