⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.ksh

📁 gtk_server的源代码
💻 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 + -