📄 clock.ksh
字号:
#!/bin/ksh## Tested with:# -PDKSH 5.2.14 on Zenwalk 4.6## Demo with Public Domain Kornshell (PDKSH)## Created with GTK-server 2.1.4 by Peter van Eerten / august 17, 2007 (GPL)#-------------------------------------------------------------------------------------------------# Find GTK-server configfile firstif [[ -f gtk-server.cfg ]]; then CFG=gtk-server.cfgelif [[ -f /etc/gtk-server.cfg ]]; then CFG=/etc/gtk-server.cfgelif [[ -f /usr/local/etc/gtk-server.cfg ]]; then CFG=/usr/local/etc/gtk-server.cfgelse echo "No GTK-server configfile found! Please install GTK-server..." exit 1fi# Now create global functionnames from GTK APIif [[ ! -f $HOME/.gtk4korn || $CFG -nt $HOME/.gtk4korn ]]; then print "# Embedded GTK functions for KornShell" > $HOME/.gtk4korn while read LINE do if [[ $LINE = +(FUNCTION_NAME*) ]]; then TMP=${LINE#*= } print "function ${TMP%%,*}" >> $HOME/.gtk4korn print "{\nprint -p ${TMP%%,*} \$@" >> $HOME/.gtk4korn print "read -p GTK\n}" >> $HOME/.gtk4korn fi done < $CFGfi# Declare global variablestypeset GTK NULL="NULL"unset CFG PIPE LINE# Include embedded GTK for KornShell. $HOME/.gtk4korn# Assignment functionfunction define { $2 $3 $4 $5 $6 $7 $8 $9; eval $1="$GTK"; }# Start GTK-server in STDIN modegtk-server stdin |&# Windowgtk_init $NULL $NULLdefine WIN gtk_window_new 0gtk_window_set_title $WIN "'KornShell Analog Clock'"gtk_widget_set_size_request $WIN 300 350gtk_window_set_position $WIN 1gtk_window_set_resizable $WIN 0gtk_window_set_icon_name $WIN "clock"# Use async functionality, signal every secondgtk_server_connect $WIN "show" "time-update"gtk_server_timeout 1000 $WIN "show"# Create widget to display imagedefine IMAGE gtk_image_new# Separatordefine SEP gtk_hseparator_new# About buttondefine ABOUT_BUTTON gtk_button_new_from_stock "gtk-about"gtk_widget_set_size_request $ABOUT_BUTTON 90 30# Exit buttondefine EXIT_BUTTON gtk_button_new_from_stock "gtk-quit"gtk_widget_set_size_request $EXIT_BUTTON 90 30# Now arrange widgets on window using boxesdefine HBOX gtk_hbox_new 0 0gtk_box_pack_start $HBOX $ABOUT_BUTTON 0 0 1gtk_box_pack_end $HBOX $EXIT_BUTTON 0 0 1define VBOX gtk_vbox_new 0 0gtk_box_pack_start $VBOX $IMAGE 0 0 1gtk_box_pack_start $VBOX $SEP 0 0 1gtk_box_pack_end $VBOX $HBOX 0 0 1gtk_container_add $WIN $VBOX# Show all widgetsgtk_widget_show_all $WIN# Create the pixmapdefine GDKWIN gtk_widget_get_parent_window $IMAGEdefine PIX gdk_pixmap_new $GDKWIN 300 315 -1define GC gdk_gc_new $PIXgtk_image_set_from_pixmap $IMAGE $PIX $NULL# Allocate memory for GdkColordefine COLOR gtk_server_opaque# Now set foreground and backgroundcolors to WHITEgdk_color_parse "#ffffff" $COLORgdk_gc_set_rgb_bg_color $GC $COLORgdk_gc_set_rgb_fg_color $GC $COLOR# Clear the complete pixmap with WHITEgdk_draw_rectangle $PIX $GC 1 0 0 300 315# Set foreground color to BLACKgdk_color_parse "#000000" $COLORgdk_gc_set_rgb_fg_color $GC $COLORgdk_draw_arc $PIX $GC 0 5 0 290 290 0 23000# Put some text on the canvasgdk_color_parse "#0000ff" $COLORgdk_gc_set_rgb_fg_color $GC $COLORdefine LAYOUT gtk_widget_create_pango_layout $IMAGE "'Show analog time'"gdk_draw_layout $PIX $GC 100 295 $LAYOUT# Create ABOUT boxgtk_server_versiondefine DIALOG gtk_message_dialog_new $WIN 0 0 2 "'\t\t*** PD KornShell Analog Clock ***\r\rKornShell ${KSH_VERSION#* } with GTK-server $GTK.\r\r\tVisit http://www.gtk-server.org/ for more info!'" "''"gtk_window_set_title $DIALOG "'About this program'"# Coordinates for minute and seconds pointerset -A CO 0 14 27 40 53 65 76 87 97 105 113 119 124 127 129 130# Coordinates for hour pointerset -A HO 0 8 17 25 33 40 47 54 59 65 69 73 76 78 79 80# Mainloopwhile [[ $GTK != $WIN && $GTK != $EXIT_BUTTON ]]do # Get event define EVENT gtk_server_callback "wait" # Check events case $EVENT in # If about button is pressed $ABOUT_BUTTON) gtk_widget_show $DIALOG;; $DIALOG) gtk_widget_hide $DIALOG;; # If async signal occurs draw minute "time-update") # Cleanup screen gdk_color_parse "#ffffff" $COLOR gdk_gc_set_rgb_fg_color $GC $COLOR gdk_draw_rectangle $PIX $GC 1 0 0 300 290 gdk_color_parse "#000000" $COLOR gdk_gc_set_rgb_fg_color $GC $COLOR # Redraw clock gdk_draw_arc $PIX $GC 0 5 0 290 290 0 23000 # Draw seconds pointer SECOND=`date +%S` if [[ $SECOND -lt 15 ]] then let X=150+${CO[$SECOND]} let Y=145-${CO[15-$SECOND]} gdk_draw_line $PIX $GC 150 145 $X $Y elif [[ $SECOND -lt 30 ]] then ((SECOND-=15)) let X=150+${CO[15-$SECOND]} let Y=145+${CO[$SECOND]} gdk_draw_line $PIX $GC 150 145 $X $Y elif [[ $SECOND -lt 45 ]] then ((SECOND-=30)) let X=150-${CO[$SECOND]} let Y=145+${CO[15-$SECOND]} gdk_draw_line $PIX $GC 150 145 $X $Y elif [[ $SECOND -lt 60 ]] then ((SECOND-=45)) let X=150-${CO[15-$SECOND]} let Y=145-${CO[$SECOND]} gdk_draw_line $PIX $GC 150 145 $X $Y fi # Draw minute pointer MINUTE=`date +%M` if [[ $MINUTE -lt 15 ]] then let X=150+${CO[$MINUTE]} let Y=145-${CO[15-$MINUTE]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 146 $X $Y gdk_draw_line $PIX $GC 149 144 $X $Y elif [[ $MINUTE -lt 30 ]] then ((MINUTE-=15)) let X=150+${CO[15-$MINUTE]} let Y=145+${CO[$MINUTE]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 144 $X $Y gdk_draw_line $PIX $GC 149 146 $X $Y elif [[ $MINUTE -lt 45 ]] then ((MINUTE-=30)) let X=150-${CO[$MINUTE]} let Y=145+${CO[15-$MINUTE]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 149 144 $X $Y gdk_draw_line $PIX $GC 151 146 $X $Y elif [[ $MINUTE -lt 60 ]] then ((MINUTE-=45)) let X=150-${CO[15-$MINUTE]} let Y=145-${CO[$MINUTE]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 144 $X $Y gdk_draw_line $PIX $GC 149 146 $X $Y fi # Draw hour pointer HOUR=`date +%l` MINUTE=`date +%M` ((HOUR-=1)) let HOUR=HOUR*5+${MINUTE}/12+5 if [[ $HOUR -ge 60 ]] then ((HOUR-=60)) fi if [[ $HOUR -lt 15 ]] then let X=150+${HO[$HOUR]} let Y=145-${HO[15-$HOUR]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 146 $X $Y gdk_draw_line $PIX $GC 149 144 $X $Y elif [[ $HOUR -lt 30 ]] then ((HOUR-=15)) let X=150+${HO[15-$HOUR]} let Y=145+${HO[$HOUR]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 144 $X $Y gdk_draw_line $PIX $GC 149 146 $X $Y elif [[ $HOUR -lt 45 ]] then ((HOUR-=30)) let X=150-${HO[$HOUR]} let Y=145+${HO[15-$HOUR]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 149 144 $X $Y gdk_draw_line $PIX $GC 151 146 $X $Y elif [[ $HOUR -lt 60 ]] then ((HOUR-=45)) let X=150-${HO[15-$HOUR]} let Y=145-${HO[$HOUR]} gdk_draw_line $PIX $GC 150 145 $X $Y gdk_draw_line $PIX $GC 151 144 $X $Y gdk_draw_line $PIX $GC 149 146 $X $Y fi # Draw centre gdk_draw_arc $PIX $GC 1 142 137 16 16 0 24000 # Refresh screen gtk_widget_queue_draw $IMAGE;; esacdone# Exit GTKgtk_server_exit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -