Kodama's home / tips.

透明 oclock に秒針とjewel を拡充

透明であまり邪魔にならないので, oclock -transparent を常用しています. これに, 秒針と文字盤の5分毎の刻目(jewel) が欲しいと思って作ったパッチ. 例によって, かなり場当り的.

僕のマシンでは,

.fvwmrc で Style "oclock" StaysOnTop, Sticky, WindowListSkip
.xinitrc で oclock -transparent -geometry 80x80+300+0 &
として, いつもいつも見えるようになってます.

X のソ−スの programs 以下は X のプログラミングのサンプル的な意味もあるので, 改造して遊びましょう.

手順

  1. 後にある oclock.patch ファイルを作っておく.
  2. X11R6 のソ−スを展開して xc/programs/oclock に cd する
  3. patch < oclock.patch
  4. xmkmf; make
  5. ./oclock -transparent で出来具合を見よう
oclock.patch
oclock from xc/programs/oclock in X11R6 sample source
K.Kodama 1999.12.11

*** ClockP.h.orig	Sat Dec 11 19:45:01 1999
--- ClockP.h	Sat Dec 11 19:47:14 1999
***************
*** 63,68 ****
--- 63,69 ----
  	int		shape_height;	/* window height when shape last made */
  	double		hour_angle;	/* hour hand position */
  	double		minute_angle;	/* minute hand position */
+     double          second_angle;   /* second hand position */
  	int		polys_valid;	/* polygons contain good data */
  	TPoint		minute_poly[POLY_SIZE];	/* polygon for minute hand */
  	TPoint		hour_poly[POLY_SIZE];	/* polygon for hour hand */
*** Clock.c.orig	Sat Dec 11 19:45:11 1999
--- Clock.c	Sat Dec 11 19:59:15 1999
***************
*** 446,452 ****
  	w->clock.hour_angle = clock_to_angle ((((double) tm->tm_hour) +
  				((double) tm->tm_min) / 60.0) / 12.0);
  	w->clock.minute_angle =
! 		clock_to_angle (((double) tm->tm_min) / 60.0);
  	/*
  	 * add the timeout before painting the hands, that may
  	 * take a while and we'd like the clock to keep up
--- 446,457 ----
  	w->clock.hour_angle = clock_to_angle ((((double) tm->tm_hour) +
  				((double) tm->tm_min) / 60.0) / 12.0);
  	w->clock.minute_angle =
! 	  /* clock_to_angle (((double) tm->tm_min) / 60.0); */
!  	  clock_to_angle (( 
!  					   ((double) tm->tm_min) + ((double)tm->tm_sec)/60.0
!  						 )/ 60.0);
!  	w->clock.second_angle =
!  		clock_to_angle (((double) tm->tm_sec) / 60.0);
  	/*
  	 * add the timeout before painting the hands, that may
  	 * take a while and we'd like the clock to keep up
***************
*** 454,460 ****
  	 */
  	w->clock.interval_id = 
  	    XtAppAddTimeOut (XtWidgetToApplicationContext((Widget) w),
! 			     (60 - tm->tm_sec) * 1000, new_time, client_data);
  	compute_hands (w);
  	if (w->clock.transparent)
  	    Resize (w);
--- 459,465 ----
  	 */
  	w->clock.interval_id = 
  	    XtAppAddTimeOut (XtWidgetToApplicationContext((Widget) w),
!  			     /*(60 - tm->tm_sec)*/ 1 * 1000, new_time, client_data);
  	compute_hands (w);
  	if (w->clock.transparent)
  	    Resize (w);
***************
*** 467,478 ****
--- 472,534 ----
  Drawable    d;
  GC	    gc;
  {
+     double s,c;
      if (JEWEL_SIZE(w) > 0.0)
      {
  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
  			JEWEL_X(w) - JEWEL_SIZE(w) / 2.0,
   			JEWEL_Y(w) - JEWEL_SIZE(w) / 2.0,
   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+ 	/*  */
+  	c=JEWEL_Y(w)*0.8660254;
+  	s=JEWEL_Y(w)*0.5;
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			JEWEL_X(w) - JEWEL_SIZE(w) / 2.0,
+   			-JEWEL_Y(w) - JEWEL_SIZE(w) / 2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+   			JEWEL_Y(w) - JEWEL_SIZE(w) / 2.0,
+  			JEWEL_X(w) - JEWEL_SIZE(w) / 2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+   			-JEWEL_Y(w) - JEWEL_SIZE(w) / 2.0,
+  			JEWEL_X(w) - JEWEL_SIZE(w) / 2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			c- JEWEL_SIZE(w)/2.0,
+  			s- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			s- JEWEL_SIZE(w)/2.0,
+  			c- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			-c- JEWEL_SIZE(w)/2.0,
+  			s- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			-s- JEWEL_SIZE(w)/2.0,
+  			c- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			-c- JEWEL_SIZE(w)/2.0,
+  			-s- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			-s- JEWEL_SIZE(w)/2.0,
+  			-c- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			c- JEWEL_SIZE(w)/2.0,
+  			-s- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+  	TFillArc (XtDisplay (w), d, gc, &w->clock.t,
+  			s- JEWEL_SIZE(w)/2.0,
+  			-c- JEWEL_SIZE(w)/2.0,
+   			JEWEL_SIZE(w), JEWEL_SIZE(w), 0, 360 * 64);
+ 
+ 
      }
  }
  
***************
*** 584,591 ****
--- 640,657 ----
  Drawable	d;
  GC		minute_gc, hour_gc;
  {
+     double s,c;
      if (w->clock.polys_valid) {
  	paint_hand (w, d, hour_gc, w->clock.hour_poly);
  	paint_hand (w, d, minute_gc, w->clock.minute_poly);
+ 
+  	s=sin(w->clock.second_angle)*(JEWEL_Y(w)-JEWEL_SIZE(w)*2.0);
+  	c=cos(w->clock.second_angle)*(JEWEL_Y(w)-JEWEL_SIZE(w)*2.0);
+  	TFillArc (XtDisplay (w), d, minute_gc, &w->clock.t,
+  			c- JEWEL_SIZE(w),
+  			s- JEWEL_SIZE(w),
+   			JEWEL_SIZE(w)*2.0, JEWEL_SIZE(w)*2.0, 0, 360 * 64);
+  
+ 
      }
  }

Kodama's home / tips.