#!/bin/sh # Only run the following line once \ exec wish -f $0 $@ ########################################## #Copyright 1998 Kenneth W. Persinger Jr. # # Written for WindowMaker # ########################################## # You can add the full path for Xprop here. set xprop xprop ############################### # DO NOT EDIT BELOW THIS LINE # ############################### global xprop; global instance;set instance "" global class;set class "" global command; set command "" global Version;set Version "V1.3" global Version global instance global class global command wm withdraw . wm group . . toplevel .dockit -class Dockit wm group .dockit .dockit wm command .dockit "$argv0 $argv" wm iconname .dockit "Dockit ${Version}" wm protocol .dockit WM_DELETE_WINDOW {exit} wm focusmodel .dockit passive wm title .dockit "Dockit ${Version}" wm geometry .dockit 309x157+440+412 wm maxsize .dockit 1265 994 wm minsize .dockit 1 1 wm overrideredirect .dockit 0 wm resizable .dockit 0 0 wm deiconify .dockit label .dockit.msgbar \ -anchor nw -borderwidth 1 -justify left -relief raised \ -text "" label .dockit.instlbl \ -borderwidth 1 -relief raised -text Instance label .dockit.cllbl \ -borderwidth 1 -relief raised -text Class label .dockit.comlbl \ -borderwidth 1 -relief raised -text Command entry .dockit.instent -textvariable instance entry .dockit.clent -textvariable class entry .dockit.coment -textvariable command button .dockit.create \ -padx 9 -pady 3 -text {Create Icon} -command {docreate} button .dockit.exit \ -padx 9 -pady 3 -text Quit -command exit button .dockit.grab \ -padx 9 -pady 3 -text Grab -command {dograb} button .dockit.help \ -padx 9 -pady 3 -text Help -command {dohelp} ################### # SETTING GEOMETRY ################### place .dockit.msgbar \ -x 5 -y 120 -width 296 -height 33 -anchor nw -bordermode ignore place .dockit.instlbl \ -x 5 -y 5 -width 76 -height 23 -anchor nw -bordermode ignore place .dockit.cllbl \ -x 5 -y 30 -width 76 -height 23 -anchor nw -bordermode ignore place .dockit.comlbl \ -x 5 -y 55 -width 76 -height 23 -anchor nw -bordermode ignore place .dockit.instent \ -x 85 -y 5 -width 216 -height 22 -anchor nw -bordermode ignore place .dockit.clent \ -x 85 -y 30 -width 216 -height 22 -anchor nw -bordermode ignore place .dockit.coment \ -x 85 -y 55 -width 216 -height 22 -anchor nw -bordermode ignore place .dockit.create \ -x 5 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore place .dockit.exit \ -x 230 -y 80 -width 72 -height 36 -anchor nw -bordermode ignore place .dockit.grab \ -x 80 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore place .dockit.help \ -x 155 -y 80 -width 77 -height 36 -anchor nw -bordermode ignore ############ # Bindings # ############ bind all {message ""} bind .dockit.instlbl {message "Instance name goes here. (the 1st string of WM_CLASS)"} bind .dockit.instent {message "Instance name goes here. (the 1st string of WM_CLASS)"} bind .dockit.cllbl {message "Class name goes here. (the 2nd string of WM_CLASS)"} bind .dockit.clent {message "Class name goes here. (the 2nd string of WM_CLASS)"} bind .dockit.comlbl {message "The command to execute goes here. (all of WM_COMMAND)"} bind .dockit.coment {message "The command to execute goes here. (all of WM_COMMAND)"} bind .dockit.create {message "Create you custom AppIcon."} bind .dockit.exit {message "Exit Dockit!"} bind .dockit.help {message "Help with creating AppIcons, and for these commands."} bind .dockit.grab {message "Grab AppInfo from a running App."} ################### # Actual Code # ################### proc message {message} { .dockit.msgbar configure -text $message } proc docreate {} { global Version global instance global class global command if {$command == ""} { tk_dialog .error "DockIt ${Version}: ERROR" \ "You must supply a command line. Otherwise your icon would do nothing!" \ "" "" "Doh!" } else { set insttmp $instance set classtmp $class set commandtmp $command if {$insttmp == ""} { set insttmp "dockit" } if {$classtmp == ""} { set classtmp "DockedApp" } toplevel .$insttmp -class $classtmp wm command .$insttmp "$commandtmp" wm group .$insttmp .$insttmp label .$insttmp.l1 -text " Great! Your new App-Icon should be finished now. once you have dragged it to the Dock, Click Finish. If your Icon doesn't Dock, or does not appear, Try again. If problems persist, see Dockit's Help." button .$insttmp.b1 -text "Finish" -command "destroy .$insttmp" pack .$insttmp.l1 pack .$insttmp.b1 wm title .$insttmp "Dockit ${Version}: Confirmation" } } proc dohelp {} { global Version set HLPTXT { Dockit V1.2 General Info: Dockit is a tool designed to provide the ability to Dock poorly coded programs within WindowMaker. This is not a 100% accurate solution. It was not designed to be. It will however, generate a dockable icon 99% of the time. for that other 1%, you will need to edit by hand. Troubleshooting: Error: 'window name starts with an upper-case letter': This is a limitation of Tcl/Tk. window/pathnames cannot start with an uppercase letter. This behavior is most noticable in Netscape's Navigator. It's instance is 'Navigator' A work-around to this limitation, is to double-define your App settings. (ex:'navigator', and 'Navigator') Error: couldn't execute "xprop": no such file or directory This means that /usr/X11R6/bin (or its equivilent) is not defined in your path. You must add this to your path. AppIcon does not appear as it should: This could happen for a number of reasons. A: You have NoAppIcon defined for that particular App. B: One word: El Ni~no App Closes, but Dots do not appear/ Cannot remove Icon from the Dock: This is the result of a VERY poorly coded App. As far as WIndowMaker can tell, the program is still running. The only real fix for this, is CTRL + ALT + BACKSPACE } toplevel .userhelp -class Dockit wm group .userhelp .dockit wm iconname .userhelp "Dockit HELP" wm focusmodel .userhelp passive wm geometry .userhelp 456x635 wm maxsize .userhelp 1265 1265 wm minsize .userhelp 1 1 wm overrideredirect .userhelp 0 wm resizable .userhelp 1 1 wm deiconify .userhelp wm title .userhelp "Dockit ${Version}: HELP" label .userhelp.text \ -anchor nw -justify left -borderwidth 1 \ -text $HLPTXT place .userhelp.text \ -x 0 -y 0 -anchor nw -bordermode ignore } proc dograb {} { global xprop global class global instance global command catch "open ~/GNUstep/.AppInfo/xprop1 w+" m1 exec ${xprop} >@ $m1 seek $m1 0 set tmpmsg [read $m1] set tmpmsg [split $tmpmsg \n] close $m1 #Make sure we are the leader foreach junk $tmpmsg { if {[string match "WM_TRANSIENT_FOR(WINDOW): window id \# *" $junk]} { dograb+ [lindex $junk 4] NNNN return 1 } elseif {[string match "*window id # of group leader: *" $junk]} { dograb+ [lindex $junk 6] NNNN return 1 } } set tclass [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_CLASS*]] set tclass [split $tclass ,] set class [string trim [lindex $tclass 1] \ \"] set instance [string tolower \ [string trim [lindex [lindex $tclass 0] 2] \ \"]] set tcom [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_COMMAND*]] set tcom [split [lindex $tcom 2] \,] set tcom [split [join $tcom] \"] set command [join [join $tcom]] } proc dograb+ {winid sourcewin} { global xprop global class global instance global command catch "open ~/GNUstep/.AppInfo/xprop1 w+" m1 exec ${xprop} -id $winid >@ $m1 seek $m1 0 set tmpmsg [read $m1] set tmpmsg [split $tmpmsg \n] # Make sure we arent hitting a Loop, where we show ourself as # The group leader. if { ![string match $sourcewin $winid]} { # recurse to the toplevel leader. foreach junk $tmpmsg { if {[string match "WM_TRANSIENT_FOR(WINDOW): window id # *" $junk]} { dograb+ [lindex $junk 4] $winid return 1 } elseif {[string match "*window id # of group leader: *" $junk]} { dograb+ [lindex $junk 6] $winid return 1 } } } set tclass [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_CLASS*]] set tclass [split $tclass ,] set class [string trim [lindex $tclass 1] \ \"] set instance [string tolower \ [string trim [lindex [lindex $tclass 0] 2] \ \"]] set tcom [lindex $tmpmsg [lsearch -glob $tmpmsg *WM_COMMAND*]] set tcom [split [lindex $tcom 2] \,] set tcom [split [join $tcom] \"] set command [join [join $tcom]] close $m1 }