#!/bin/ksh # # (c) Peter van Eerten 2008, GPL license # # Tested with: # -PDKSH on Zenwalk 4.8 # -Kornshell93 on Slamd64 # # Use with GTK-server 2.2.3 or newer! # # January 2008: Initial release # May 10, 2008: -fixed bug with UTF8 conversion call # -added clone menu # -code cleaning with variable assignments - code more than 70 lines smaller # -replaced iter widget from frame for opaque # May 28, 2008: -fixed issue with spaces in target filenames #------------------------------------------------------------------------------------------------- # # This program can remember and execute the commandline tools and their options. # #------------------------------------------------------------------------------------------------- # Find GTK-server configfile first if [[ -f gtk-server.cfg ]]; then CFG=gtk-server.cfg elif [[ -f /etc/gtk-server.cfg ]]; then CFG=/etc/gtk-server.cfg elif [[ -f /usr/local/etc/gtk-server.cfg ]]; then CFG=/usr/local/etc/gtk-server.cfg else echo "No GTK-server configfile found! Please install GTK-server..." exit 1 fi # Now create global functionnames from GTK API if [[ ! -f $HOME/.gtk4korn || $CFG -nt $HOME/.gtk4korn ]]; then print "# Embedded GTK functions for KornShell" > $HOME/.gtk4korn while read LINE do if [[ $LINE == +(*FUNCTION_NAME*) && $LINE = +(*gtk_*|*gdk_*|*g_*|*glade_*) ]]; then TMP=${LINE#*= } print "function ${TMP%%,*}" >> $HOME/.gtk4korn print "{\nprint -p ${TMP%%,*} \$@" >> $HOME/.gtk4korn print "read -p GTK\n}" >> $HOME/.gtk4korn fi done < $CFG fi # Declare global variables typeset GTK NULL="NULL" unset CFG PIPE LINE # Include the generated '.gtk4korn'-file in the shellscript to use embedded GTK functions . $HOME/.gtk4korn # Start GTK-server gtk-server -stdin |& #--------------------------------------------------------------------- # assignment function #--------------------------------------------------------------------- function define { $2 $3 $4 $5 $6 $7 $8 $9; eval $1="\"$GTK\""; } #------------------------------------------------------------------------------------------------- # Define one notebook page - arg=pagenr function Define_Page { define PAGELABEL[$1] gtk_label_new "tool" define BINLABEL gtk_label_new "'Binary: '" gtk_widget_set_size_request $BINLABEL 80 20 gtk_misc_set_alignment $BINLABEL 1.0 0.5 define BINENTRY[$1] gtk_entry_new define BINBUT[$1] gtk_button_new_from_stock "gtk-find" define ARGLABEL gtk_label_new "'Arguments: '" gtk_widget_set_size_request $ARGLABEL 80 20 gtk_misc_set_alignment $ARGLABEL 1.0 0.5 define ARGENTRY[$1] gtk_entry_new define ARGBUT[$1] gtk_button_new_from_stock "gtk-find" define OPTLABEL gtk_label_new "'Optional: '" gtk_widget_set_size_request $OPTLABEL 80 20 gtk_misc_set_alignment $OPTLABEL 1.0 0.5 define OPTENTRY[$1] gtk_entry_new define OPTBUT[$1] gtk_button_new_from_stock "gtk-find" define COMLABEL gtk_label_new "'Comments: '" gtk_widget_set_size_request $COMLABEL 80 20 gtk_misc_set_alignment $COMLABEL 1.0 0.0 define COMBUF[$1] gtk_text_buffer_new $NULL define COMVIEW[$1] gtk_text_view_new_with_buffer ${COMBUF[$1]} gtk_text_view_set_wrap_mode ${COMVIEW[$1]} 2 define COMSW[$1] gtk_scrolled_window_new $NULL $NULL gtk_scrolled_window_set_policy ${COMSW[$1]} 1 1 gtk_scrolled_window_set_shadow_type ${COMSW[$1]} 1 gtk_container_add ${COMSW[$1]} ${COMVIEW[$1]} # Setup console define TXTBUF[$1] gtk_text_buffer_new $NULL gtk_text_buffer_create_tag ${TXTBUF[$1]} "font" "font" "'Fixed 10'" $NULL define TXTVIEW[$1] gtk_text_view_new_with_buffer ${TXTBUF[$1]} gtk_text_view_set_wrap_mode ${TXTVIEW[$1]} 1 define SW[$1] gtk_scrolled_window_new $NULL $NULL gtk_scrolled_window_set_policy ${SW[$1]} 1 1 gtk_scrolled_window_set_shadow_type ${SW[$1]} 1 gtk_container_add ${SW[$1]} ${TXTVIEW[$1]} gtk_text_view_set_editable ${TXTVIEW[$1]} 0 gtk_text_view_set_wrap_mode ${TXTVIEW[$1]} 0 gtk_text_view_set_cursor_visible ${TXTVIEW[$1]} 0 define PAGEVBOX gtk_vbox_new 0 0 define THEVBOX[$1] gtk_vbox_new 0 0 define HBOX1 gtk_hbox_new 0 0 define HBOX2 gtk_hbox_new 0 0 define HBOX3 gtk_hbox_new 0 0 define HBOX4 gtk_hbox_new 0 0 gtk_box_pack_start $HBOX1 $BINLABEL 0 0 1 gtk_box_pack_start $HBOX1 ${BINENTRY[$1]} 1 1 1 gtk_box_pack_end $HBOX1 ${BINBUT[$1]} 0 0 1 gtk_box_pack_start $PAGEVBOX $HBOX1 0 0 1 gtk_box_pack_start $HBOX2 $ARGLABEL 0 0 1 gtk_box_pack_start $HBOX2 ${ARGENTRY[$1]} 1 1 1 gtk_box_pack_end $HBOX2 ${ARGBUT[$1]} 0 0 1 gtk_box_pack_start $PAGEVBOX $HBOX2 0 0 1 gtk_box_pack_start $HBOX3 $OPTLABEL 0 0 1 gtk_box_pack_start $HBOX3 ${OPTENTRY[$1]} 1 1 1 gtk_box_pack_end $HBOX3 ${OPTBUT[$1]} 0 0 1 gtk_box_pack_start $PAGEVBOX $HBOX3 0 0 1 gtk_box_pack_start $HBOX4 $COMLABEL 0 0 1 gtk_box_pack_end $HBOX4 ${COMSW[$1]} 1 1 1 gtk_box_pack_start $PAGEVBOX $HBOX4 0 0 1 define FRAME gtk_frame_new $NULL gtk_frame_set_label $FRAME "' Tool and options '" gtk_container_add $FRAME $PAGEVBOX gtk_box_pack_start ${THEVBOX[$1]} $FRAME 0 0 1 gtk_container_set_border_width $PAGEVBOX 5 gtk_container_set_border_width $FRAME 3 define HBOX5 gtk_hbox_new 0 0 define FRAME gtk_frame_new $NULL gtk_frame_set_label $FRAME "' Output console '" gtk_box_pack_end $HBOX5 ${SW[$1]} 1 1 1 gtk_container_add $FRAME $HBOX5 gtk_box_pack_end ${THEVBOX[$1]} $FRAME 1 1 1 gtk_container_set_border_width $HBOX5 5 gtk_container_set_border_width $FRAME 3 # Add the page to the notebook gtk_notebook_append_page $NOTEBOOK ${THEVBOX[$1]} ${PAGELABEL[$1]} gtk_notebook_set_tab_reorderable $NOTEBOOK ${THEVBOX[$1]} 1 } function Save_All { echo "# Configuration saved at `date`" > $HOME/.toolrc IDX=0 while [[ $IDX -lt ${#PAGELABEL[@]} ]] do echo "---------------" >> $HOME/.toolrc gtk_label_get_text ${PAGELABEL[$IDX]} echo "Tool:$GTK" >> $HOME/.toolrc gtk_entry_get_text ${BINENTRY[$IDX]} echo "Binary:$GTK" >> $HOME/.toolrc gtk_entry_get_text ${ARGENTRY[$IDX]} echo "Args:$GTK" >> $HOME/.toolrc gtk_entry_get_text ${OPTENTRY[$IDX]} echo "Opts:$GTK" >> $HOME/.toolrc gtk_text_buffer_get_bounds ${COMBUF[$IDX]} $STARTITER $ENDITER gtk_server_enable_c_string_escaping gtk_text_buffer_get_text ${COMBUF[$IDX]} $STARTITER $ENDITER 0 echo "Comment:$GTK" >> $HOME/.toolrc gtk_server_disable_c_string_escaping ((IDX+=1)) done echo "===============" >> $HOME/.toolrc } function Update_Events { gtk_events_pending while [[ $GTK = "1" ]] do gtk_main_iteration gtk_events_pending done gtk_server_callback "update" } function Swap_Var { typeset TMP1 TMP2 eval TMP1=\${$1} eval TMP2=\${$2} eval $1=$TMP2 eval $2=$TMP1 } #------------------------------------------------------------------------------------------------- # Define GUI gtk_init "NULL NULL" define WINDOW gtk_window_new 0 gtk_window_set_title $WINDOW "'The TooL'" gtk_window_set_position $WINDOW 1 gtk_window_set_icon_name $WINDOW "pkgtool" gtk_widget_set_size_request $WINDOW 500 450 gtk_server_connect $WINDOW "show update" # Create menubar define MENUBAR gtk_menu_bar_new # Create FILE menu popup define FILEMENU gtk_menu_new define SAVEMENU gtk_menu_item_new_with_label "'Save config'" define SEP1 gtk_separator_menu_item_new define EXITMENU gtk_menu_item_new_with_label "'Exit TooL'" gtk_menu_shell_append $FILEMENU $SAVEMENU gtk_menu_shell_append $FILEMENU $SEP1 gtk_menu_shell_append $FILEMENU $EXITMENU define FILETITLE gtk_menu_item_new_with_mnemonic "_File" gtk_menu_item_set_submenu $FILETITLE $FILEMENU gtk_menu_shell_append $MENUBAR $FILETITLE # Create EDIT menu popup define EDITMENU gtk_menu_new define NEWMENU gtk_menu_item_new_with_label "New" define SEP2 gtk_separator_menu_item_new define DELMENU gtk_menu_item_new_with_label "Delete" define SEP3 gtk_separator_menu_item_new define RENAMENU gtk_menu_item_new_with_label "Rename" define SEP6 gtk_separator_menu_item_new define DUPLMENU gtk_menu_item_new_with_label "Duplicate" gtk_menu_shell_append $EDITMENU $NEWMENU gtk_menu_shell_append $EDITMENU $SEP2 gtk_menu_shell_append $EDITMENU $DELMENU gtk_menu_shell_append $EDITMENU $SEP3 gtk_menu_shell_append $EDITMENU $RENAMENU gtk_menu_shell_append $EDITMENU $SEP6 gtk_menu_shell_append $EDITMENU $DUPLMENU define EDITTITLE gtk_menu_item_new_with_mnemonic "_Edit" gtk_menu_item_set_submenu $EDITTITLE $EDITMENU gtk_menu_shell_append $MENUBAR $EDITTITLE # Create RUN menu popup define RUNMENU gtk_menu_new define EXECMENU gtk_menu_item_new_with_label "Execute" define SEP4 gtk_separator_menu_item_new define UPDMENU gtk_check_menu_item_new_with_label "'Automatic update'" define SEP5 gtk_separator_menu_item_new define KILLMENU gtk_menu_item_new_with_label "'Kill process'" gtk_menu_shell_append $RUNMENU $EXECMENU gtk_menu_shell_append $RUNMENU $SEP4 gtk_menu_shell_append $RUNMENU $UPDMENU gtk_menu_shell_append $RUNMENU $SEP5 gtk_menu_shell_append $RUNMENU $KILLMENU define RUNTITLE gtk_menu_item_new_with_mnemonic "_Run" gtk_menu_item_set_submenu $RUNTITLE $RUNMENU gtk_menu_shell_append $MENUBAR $RUNTITLE # Create UTILS menu popup define UTILMENU gtk_menu_new define XTERMMENU gtk_menu_item_new_with_label "Xterm" define SEP7 gtk_separator_menu_item_new define VIMMENU gtk_menu_item_new_with_label "(g)Vim" define SEP8 gtk_separator_menu_item_new define CLONEMENU gtk_menu_item_new_with_label "Clone" gtk_menu_shell_append $UTILMENU $XTERMMENU gtk_menu_shell_append $UTILMENU $SEP7 gtk_menu_shell_append $UTILMENU $VIMMENU gtk_menu_shell_append $UTILMENU $SEP8 gtk_menu_shell_append $UTILMENU $CLONEMENU define UTILTITLE gtk_menu_item_new_with_mnemonic "_Utils" gtk_menu_item_set_right_justified $UTILTITLE 1 gtk_menu_item_set_submenu $UTILTITLE $UTILMENU gtk_menu_shell_append $MENUBAR $UTILTITLE # Create HELP menu popup define HELPMENU gtk_menu_new define INFOMENU gtk_menu_item_new_with_label "Information" gtk_menu_shell_append $HELPMENU $INFOMENU define ABOUTTITLE gtk_menu_item_new_with_mnemonic "_About" gtk_menu_item_set_right_justified $ABOUTTITLE 1 gtk_menu_item_set_submenu $ABOUTTITLE $HELPMENU gtk_menu_shell_append $MENUBAR $ABOUTTITLE # Define status bar define STATUSBAR gtk_statusbar_new define CID gtk_statusbar_get_context_id $STATUSBAR $WINDOW gtk_server_version gtk_statusbar_push $STATUSBAR $CID "'${KSH_VERSION#*\)} with GTK-server $GTK on `uname -sr`'" # Create notebook define NOTEBOOK gtk_notebook_new gtk_notebook_set_tab_pos $NOTEBOOK 2 gtk_notebook_set_scrollable $NOTEBOOK 1 gtk_server_connect $NOTEBOOK "page-reordered reorder" # Read configuration if [[ -f $HOME/.toolrc ]] then IDX=-1 while read LINE do if [[ $LINE = +(*----------*) ]]; then ((IDX+=1)) Define_Page $IDX fi if [[ $LINE = +(*Tool*) && -n ${LINE#*:} ]] then gtk_label_set_text ${PAGELABEL[$IDX]} "'${LINE#*:}'" fi if [[ $LINE = +(*Binary*) && -n ${LINE#*:} ]] then gtk_entry_set_text ${BINENTRY[$IDX]} "'${LINE#*:}'" fi if [[ $LINE = +(*Args*) && -n ${LINE#*:} ]] then gtk_entry_set_text ${ARGENTRY[$IDX]} "'${LINE#*:}'" fi if [[ $LINE = +(*Opts*) && -n ${LINE#*:} ]] then gtk_entry_set_text ${OPTENTRY[$IDX]} "'${LINE#*:}'" fi if [[ $LINE = +(*Comment*) && -n ${LINE#*:} ]] then gtk_text_buffer_set_text ${COMBUF[$IDX]} "${LINE#*:}" -1 fi done < $HOME/.toolrc else Define_Page 0 fi gtk_notebook_popup_enable $NOTEBOOK # Add all widgets to mainscreen define VBOX gtk_vbox_new 0 0 gtk_box_pack_start $VBOX $MENUBAR 0 0 1 gtk_box_pack_start $VBOX $NOTEBOOK 1 1 1 gtk_box_pack_start $VBOX $STATUSBAR 0 0 1 gtk_container_add $WINDOW $VBOX gtk_container_set_border_width $VBOX 3 # Create NEW dialog define NEWWIN gtk_window_new 0 gtk_window_set_title $NEWWIN "'Enter name'" gtk_window_set_transient_for $NEWWIN $WINDOW gtk_window_set_position $NEWWIN 4 gtk_window_set_icon_name $NEWWIN "pkgtool" gtk_window_set_resizable $NEWWIN 0 define NEWENTRY gtk_entry_new gtk_widget_set_size_request $NEWENTRY 300 20 define NEWOK gtk_button_new_from_stock "gtk-ok" gtk_widget_set_size_request $NEWOK 100 30 define NEWCANC gtk_button_new_from_stock "gtk-cancel" gtk_widget_set_size_request $NEWCANC 100 30 # Now arrange widgets on window using boxes define NEWVBOX gtk_vbox_new 0 0 define NEWHBOX gtk_hbox_new 0 0 gtk_box_pack_start $NEWVBOX $NEWENTRY 0 0 1 gtk_box_pack_start $NEWHBOX $NEWCANC 0 0 1 gtk_box_pack_end $NEWHBOX $NEWOK 0 0 1 gtk_box_pack_start $NEWVBOX $NEWHBOX 0 0 1 gtk_container_add $NEWWIN $NEWVBOX # Return each 100 mseconds from GTK main iteration gtk_server_timeout 500 $WINDOW "show" # Show of mainscreen gtk_widget_show_all $WINDOW # Create some iters define STARTITER gtk_server_opaque define ENDITER gtk_server_opaque # Create ABOUT box gtk_server_version TMP="\t\t*** ! The TooL ! ***\r\rProgrammed with KSH and GTK-server $GTK.\r\rVisit http://www.gtk-server.org/ for more info!" define DIALOG gtk_message_dialog_new $WINDOW 0 0 2 "'$TMP'" "''" gtk_window_set_title $DIALOG "'About The TooL'" gtk_window_set_icon_name $DIALOG "pkgtool" # Create file open dialog define FILE gtk_window_new 0 gtk_window_set_title $FILE "'Open file'" gtk_window_set_transient_for $FILE $WINDOW gtk_window_set_position $FILE 4 gtk_window_set_default_size $FILE 600 400 define SELECTOR gtk_file_chooser_widget_new 0 define OKFILE gtk_button_new_from_stock "gtk-open" gtk_widget_set_size_request $OKFILE 100 30 define CANFILE gtk_button_new_from_stock "gtk-cancel" gtk_widget_set_size_request $CANFILE 100 30 # Arrange widgets on window define VBOXFILE gtk_vbox_new 0 0 define HBOXFILE gtk_hbox_new 0 0 gtk_box_pack_end $HBOXFILE $OKFILE 0 0 1 gtk_box_pack_end $HBOXFILE $CANFILE 0 0 1 gtk_box_pack_start $VBOXFILE $SELECTOR 1 1 1 gtk_box_pack_start $VBOXFILE $HBOXFILE 0 0 1 gtk_container_add $FILE $VBOXFILE # Create INFO box define CONFIRM gtk_message_dialog_new $WINDOW 0 0 2 "'\nConfiguration saved successfully!'" "''" gtk_window_set_title $CONFIRM "'Save configuration'" gtk_window_set_icon_name $CONFIRM "pkgtool" # Create WARNING box define WARNING gtk_message_dialog_new $WINDOW 0 3 2 "'\nThe utility could not be found on your system!'" "''" gtk_window_set_title $WARNING "'Warning'" gtk_window_set_icon_name $WARNING "pkgtool" # Enable automatic updating gtk_check_menu_item_set_active $UPDMENU 1 # Flush pending events Update_Events # Define Kornshell KSH=`which ksh` # Remember current PID PID=$$ # Clear FIND variable FIND=0 # Mainloop until [[ $EVENT = $EXITMENU || $EVENT = $WINDOW ]] do define EVENT gtk_server_callback "wait" define IDX gtk_notebook_get_current_page $NOTEBOOK case $EVENT in $NEWMENU) gtk_widget_show_all $NEWWIN gtk_widget_grab_focus $NEWENTRY RENAME=0;; $NEWCANC) gtk_widget_hide $NEWWIN;; $NEWWIN) gtk_widget_hide $NEWWIN;; $RENAMENU) gtk_widget_show_all $NEWWIN gtk_widget_grab_focus $NEWENTRY RENAME=1;; $NEWOK) gtk_notebook_popup_disable $NOTEBOOK # Create a new page if [[ $RENAME -eq 0 ]] then let IDX=${#PAGELABEL[@]} Define_Page $IDX gtk_widget_show_all $NOTEBOOK gtk_notebook_set_current_page $NOTEBOOK $IDX fi # Rename existing page/new page define TXT gtk_entry_get_text $NEWENTRY gtk_notebook_get_current_page $NOTEBOOK gtk_label_set_text ${PAGELABEL[$GTK]} "'$TXT'" gtk_widget_hide $NEWWIN gtk_editable_delete_text $NEWENTRY 0 -1 gtk_notebook_popup_enable $NOTEBOOK;; $DELMENU) gtk_notebook_remove_page $NOTEBOOK $IDX while [[ $IDX -lt ${#PAGELABEL[@]}-1 ]] do THEVBOX[$IDX]=${THEVBOX[$IDX+1]} PAGELABEL[$IDX]=${PAGELABEL[$IDX+1]} BINENTRY[$IDX]=${BINENTRY[$IDX+1]} ARGENTRY[$IDX]=${ARGENTRY[$IDX+1]} OPTENTRY[$IDX]=${OPTENTRY[$IDX+1]} BINBUT[$IDX]=${BINBUT[$IDX+1]} ARGBUT[$IDX]=${ARGBUT[$IDX+1]} OPTBUT[$IDX]=${OPTBUT[$IDX+1]} SW[$IDX]=${SW[$IDX+1]} TXTBUF[$IDX]=${TXTBUF[$IDX+1]} TXTVIEW[$IDX]=${TXTVIEW[$IDX+1]} COMSW[$IDX]=${SW[$IDX+1]} COMBUF[$IDX]=${TXTBUF[$IDX+1]} COMVIEW[$IDX]=${TXTVIEW[$IDX+1]} ((IDX+=1)) done unset THEVBOX[$IDX] unset PAGELABEL[$IDX] unset BINENTRY[$IDX] unset ARGENTRY[$IDX] unset OPTENTRY[$IDX] unset BINBUT[$IDX] unset ARGBUT[$IDX] unset OPTBUT[$IDX] unset SW[$IDX] unset TXTBUF[$IDX] unset TXTVIEW[$IDX] unset COMSW[$IDX] unset COMBUF[$IDX] unset COMVIEW[$IDX];; $EXECMENU) gtk_entry_get_text ${BINENTRY[$IDX]} BIN=$GTK gtk_entry_get_text ${ARGENTRY[$IDX]} ARG=$GTK gtk_entry_get_text ${OPTENTRY[$IDX]} OPT=$GTK $KSH -c "$BIN $ARG $OPT >/tmp/$IDX.$PID 2>&1" & # A precious hack, may not work always let PROCESS[$IDX]=$!+1 unset CACHE[$IDX];; "update") if [[ -f /tmp/$IDX.$$ ]] then gtk_check_menu_item_get_active $UPDMENU if [[ -z ${CACHE[$IDX]} || (${CACHE[$IDX]} != `wc -m /tmp/$IDX.$$` && $GTK = "1") ]] then define GDKWIN gtk_widget_get_parent_window ${SW[$IDX]} gdk_window_freeze_updates $GDKWIN gtk_text_buffer_get_bounds ${TXTBUF[$IDX]} $STARTITER $ENDITER gtk_text_buffer_delete ${TXTBUF[$IDX]} $STARTITER $ENDITER while read LINE do gtk_text_buffer_get_end_iter ${TXTBUF[$IDX]} $ENDITER # Make sure we do not send more than 1024 bytes typeset -L1020 LINE=`echo $LINE|tr "\"" "\'"` g_locale_to_utf8 "\"$LINE\"" -1 $NULL $NULL $NULL gtk_text_buffer_insert ${TXTBUF[$IDX]} $ENDITER "\"$GTK\"" -1 gtk_text_buffer_insert ${TXTBUF[$IDX]} $ENDITER "'\n'" -1 done < /tmp/$IDX.$$ gtk_text_buffer_get_bounds ${TXTBUF[$IDX]} $STARTITER $ENDITER gtk_text_buffer_apply_tag_by_name ${TXTBUF[$IDX]} "font" $STARTITER $ENDITER define MARK gtk_text_buffer_create_mark ${TXTBUF[$IDX]} "mark" $ENDITER 0 gtk_text_view_scroll_to_mark ${TXTVIEW[$IDX]} $MARK 0 1 0.0 1.0 gtk_text_buffer_delete_mark ${TXTBUF[$IDX]} $MARK Update_Events gdk_window_thaw_updates $GDKWIN CACHE[$IDX]=`wc -m /tmp/$IDX.$$` fi fi;; $SAVEMENU) Save_All gtk_widget_show_all $CONFIRM;; $CONFIRM) gtk_widget_hide $CONFIRM;; $INFOMENU) gtk_widget_show_all $DIALOG;; $DIALOG) gtk_widget_hide $DIALOG;; $KILLMENU) if [[ -n ${PROCESS[$IDX]} ]] then kill -KILL ${PROCESS[$IDX]} 2>/dev/null fi;; ${BINBUT[$IDX]}) if [[ $FIND -eq 0 ]] then gtk_widget_show_all $FILE FIND=1 fi;; ${ARGBUT[$IDX]}) if [[ $FIND -eq 0 ]] then gtk_widget_show_all $FILE FIND=2 fi;; ${OPTBUT[$IDX]}) if [[ $FIND -eq 0 ]] then gtk_widget_show_all $FILE FIND=3 fi;; $CANFILE) FIND=0 gtk_widget_hide $FILE;; $FILE) FIND=0 gtk_widget_hide $FILE;; $OKFILE) define CURNAME gtk_file_chooser_get_filename $SELECTOR gtk_widget_hide $FILE let LEN=${#CURNAME}+2 case $FIND in 1) gtk_editable_get_selection_bounds ${BINENTRY[$IDX]} 0 0 if [[ ${GTK%% *} = "1" ]] then TMP=${GTK#* } gtk_editable_delete_text ${BINENTRY[$IDX]} ${TMP%% *} ${TMP##* } gtk_editable_insert_text ${BINENTRY[$IDX]} "'\"$CURNAME\"'" $LEN ${TMP%% *} else define TXT gtk_editable_get_chars ${BINENTRY[$IDX]} 0 -1 gtk_editable_delete_text ${BINENTRY[$IDX]} 0 -1 gtk_entry_set_text ${BINENTRY[$IDX]} "'$TXT $CURNAME'" fi;; 2) gtk_editable_get_selection_bounds ${ARGENTRY[$IDX]} 0 0 if [[ ${GTK%% *} = "1" ]] then TMP=${GTK#* } gtk_editable_delete_text ${ARGENTRY[$IDX]} ${TMP%% *} ${TMP##* } gtk_editable_insert_text ${ARGENTRY[$IDX]} "'\"$CURNAME\"'" $LEN ${TMP%% *} else define TXT gtk_editable_get_chars ${ARGENTRY[$IDX]} 0 -1 gtk_editable_delete_text ${ARGENTRY[$IDX]} 0 -1 gtk_entry_set_text ${ARGENTRY[$IDX]} "'$TXT $CURNAME'" fi;; 3) gtk_editable_get_selection_bounds ${OPTENTRY[$IDX]} 0 0 if [[ ${GTK%% *} = "1" ]] then TMP=${GTK#* } gtk_editable_delete_text ${OPTENTRY[$IDX]} ${TMP%% *} ${TMP##* } gtk_editable_insert_text ${OPTENTRY[$IDX]} "'\"$CURNAME\"'" $LEN ${TMP%% *} else define TXT gtk_editable_get_chars ${OPTENTRY[$IDX]} 0 -1 gtk_editable_delete_text ${OPTENTRY[$IDX]} 0 -1 gtk_entry_set_text ${OPTENTRY[$IDX]} "'$TXT $CURNAME'" fi;; esac FIND=0;; "reorder") IDX=0 while [[ $IDX -lt ${#PAGELABEL[@]} ]] do # Walk through pages gtk_notebook_get_nth_page $NOTEBOOK $IDX # Is the actual menulabel not the same as in array? if [[ ${THEVBOX[$IDX]} != $GTK ]] then # Find position in array NR=0 while [[ ${THEVBOX[$NR]} != $GTK ]] do ((NR+=1)) done # Now swap variables Swap_Var "THEVBOX[$IDX]" "THEVBOX[$NR]" Swap_Var "PAGELABEL[$IDX]" "PAGELABEL[$NR]" Swap_Var "BINENTRY[$IDX]" "BINENTRY[$NR]" Swap_Var "ARGENTRY[$IDX]" "ARGENTRY[$NR]" Swap_Var "OPTENTRY[$IDX]" "OPTENTRY[$NR]" Swap_Var "BINBUT[$IDX]" "BINBUT[$NR]" Swap_Var "ARGBUT[$IDX]" "ARGBUT[$NR]" Swap_Var "OPTBUT[$IDX]" "OPTBUT[$NR]" Swap_Var "SW[$IDX]" "SW[$NR]" Swap_Var "TXTBUF[$IDX]" "TXTBUF[$NR]" Swap_Var "TXTVIEW[$IDX]" "TXTVIEW[$NR]" Swap_Var "COMSW[$IDX]" "COMSW[$NR]" Swap_Var "COMBUF[$IDX]" "COMBUF[$NR]" Swap_Var "COMVIEW[$IDX]" "COMVIEW[$NR]" fi ((IDX+=1)) done;; $DUPLMENU) gtk_notebook_popup_disable $NOTEBOOK let NR=${#PAGELABEL[@]} Define_Page $NR gtk_widget_show_all $NOTEBOOK gtk_notebook_set_current_page $NOTEBOOK $NR gtk_label_get_text ${PAGELABEL[$IDX]} gtk_label_set_text ${PAGELABEL[$NR]} "'${GTK}'" gtk_entry_get_text ${BINENTRY[$IDX]} gtk_entry_set_text ${BINENTRY[$NR]} "'${GTK}'" gtk_entry_get_text ${ARGENTRY[$IDX]} gtk_entry_set_text ${ARGENTRY[$NR]} "'${GTK}'" gtk_entry_get_text ${OPTENTRY[$IDX]} gtk_entry_set_text ${OPTENTRY[$NR]} "'${GTK}'" gtk_text_buffer_get_bounds ${COMBUF[$IDX]} $STARTITER $ENDITER gtk_text_buffer_get_text ${COMBUF[$IDX]} $STARTITER $ENDITER 0 gtk_text_buffer_set_text ${COMBUF[$NR]} "'${GTK}'" -1 gtk_notebook_popup_enable $NOTEBOOK gtk_widget_show_all $NOTEBOOK;; $XTERMMENU) XTERM=`which xterm 2>/dev/null` if [[ -n $XTERM ]] then $KSH -c "xterm" & else gtk_widget_show_all $WARNING fi;; $VIMMENU) VIM=`which gvim 2>/dev/null` if [[ -n $VIM ]] then $KSH -c "gvim" & else VIM=`which vim 2>/dev/null` if [[ -n $VIM ]] then $KSH -c "xterm -e vim" & else VIM=`which vi 2>/dev/null` if [[ -n $VIM ]] then $KSH -c "xterm -e vi" & else gtk_widget_show_all $WARNING fi fi fi;; $CLONEMENU) $0 & ;; $WARNING) gtk_widget_hide $WARNING;; esac done # Exit GTK gtk_server_exit # Remove tmpfiles rm -f /tmp/*.$PID exit 0