#!/usr/bin/wish -f
#
# Program: printop
# Copyright by Olaf Gellert, 1995
# Olaf Gellert   <gellert@informatik.uni-hamburg.de>
#
# Tcl version: 7.4 (Tcl/Tk/XF)
# Tk version: 4.0
#

global printop_path
global printcap_path

# change this entry to point to your printop-directory
set printop_path "/usr/local/lib/printop"

# is there a system with another location for a printcap-file?
set printcap_path "/etc/printcap"


# procedure to show window ShowWindow.message
proc ShowWindow.message { args} {
# xf ignore me 7

  # build widget .message
  if {"[info procs XFEdit]" != ""} {
    catch "XFDestroy .message"
  } {
    catch "destroy .message"
  }
  toplevel .message    

  # Window manager configurations
  global tkVersion
  wm positionfrom .message ""
  wm sizefrom .message program
  wm maxsize .message 400 123
  wm minsize .message 240 73
  wm title .message {Request}


  # build widget .message.frame1
  frame .message.frame1 -borderwidth {2}

  # build widget .message.frame1.frame3
  frame .message.frame1.frame3 -borderwidth {2} -relief {sunken}

  # build widget .message.frame1.frame3.message4
  message .message.frame1.frame3.message4  -aspect {2000}     -font {-Adobe-Helvetica-Bold-R-Normal--*-140-*}  -padx {5}  -pady {7}  -text {}  -textvariable {MessageText}

  # pack widget .message.frame1.frame3
  pack append .message.frame1.frame3  .message.frame1.frame3.message4 {top frame center}

  # pack widget .message.frame1
  pack append .message.frame1  .message.frame1.frame3 {top frame center expand fill}

  # build widget .message.frame2
  frame .message.frame2 -borderwidth {2}

  # build widget .message.frame2.frame5
  frame .message.frame2.frame5 -borderwidth {2}

  # build widget .message.frame2.frame5.button7
  button .message.frame2.frame5.button7 -command {set mess_return 1
grab release .message
DestroyWindow.message} -height {2} -relief {groove} -text {Ok - Do it!} -width {5}

  # pack widget .message.frame2.frame5
  pack append .message.frame2.frame5 .message.frame2.frame5.button7 {top frame center fillx}

  # build widget .message.frame2.frame6
  frame .message.frame2.frame6 -borderwidth {2}

  # build widget .message.frame2.frame6.button8
  button .message.frame2.frame6.button8 -command {set mess_return 0
grab release .message
DestroyWindow.message}  -height {2}  -relief {groove}  -text {Cancel}  -width {5}

  # pack widget .message.frame2.frame6
  pack append .message.frame2.frame6  .message.frame2.frame6.button8 {top frame center fillx}

  # pack widget .message.frame2
  pack append .message.frame2  .message.frame2.frame5 {left frame center expand fillx}  .message.frame2.frame6 {right frame center expand fillx}

  # pack widget .message
  pack append .message  .message.frame1 {top frame center expand fill}  .message.frame2 {top frame center fillx}

  if {"[info procs XFEdit]" != ""} {
    catch "XFMiscBindWidgetTree .message"
    after 2 "catch {XFEditSetShowWindows}"
  }
}

# procedure to show window ShowWindow.about
proc ShowWindow.about { args} {
# xf ignore me 7

  # build widget .about
  if {"[info procs XFEdit]" != ""} {
    catch "XFDestroy .about"
  } {
    catch "destroy .about"
  }
  toplevel .about    

  # Window manager configurations
  global tkVersion
  wm positionfrom .about ""
  wm sizefrom .about program
  wm maxsize .about 328 294
  wm minsize .about 328 294
  wm title .about {About}


  # build widget .about.frame1
  frame .about.frame1     -borderwidth {2}

  # build widget .about.frame1.frame3
  frame .about.frame1.frame3     -borderwidth {2}  -relief {sunken}

  # build widget .about.frame1.frame3.message4
  message .about.frame1.frame3.message4  -aspect {2000}     -font {-Adobe-Helvetica-Bold-R-Normal--*-140-*}  -padx {5}  -pady {7}  -text { PRINTOP		         Version 1.0

 Written in 1995 by Olaf Gellert

 <gellert@informatik.uni-hamburg.de>


 Write me a postcard:

	Olaf Gellert
	Verstcken 9
	22297 Hamburg
	Germany
}

  # pack widget .about.frame1.frame3
  pack append .about.frame1.frame3  .about.frame1.frame3.message4 {top frame center}

  # pack widget .about.frame1
  pack append .about.frame1  .about.frame1.frame3 {top frame center expand fill}

  # build widget .about.frame2
  frame .about.frame2 -borderwidth {2}

  # build widget .about.frame2.frame6
  frame .about.frame2.frame6 -borderwidth {2}

  # build widget .about.frame2.frame6.button8
  button .about.frame2.frame6.button8  -command {grab release .about
DestroyWindow.about}  -height {2}  -relief {groove}  -text {Enough of that!}  -width {5}

  # pack widget .about.frame2.frame6
  pack append .about.frame2.frame6  .about.frame2.frame6.button8 {top frame center fillx}

  # pack widget .about.frame2
  pack append .about.frame2  .about.frame2.frame6 {right frame center expand fillx}

  # pack widget .about
  pack append .about  .about.frame1 {top frame center expand fill}  .about.frame2 {top frame center fillx}

  if {"[info procs XFEdit]" != ""} {
    catch "XFMiscBindWidgetTree .about"
    after 2 "catch {XFEditSetShowWindows}"
  }
}

proc DestroyWindow.about {} {# xf ignore me 7
  if {"[info procs XFEdit]" != ""} {
    if {"[info commands .about]" != ""} {
      global xfShowWindow.about
      set xfShowWindow.about 0
      XFEditSetPath .
      after 2 "XFSaveAsProc .about; XFEditSetShowWindows"
    }
  } {
    catch "destroy .about"
    update
  }
}

proc DestroyWindow.message {} {# xf ignore me 7
  if {"[info procs XFEdit]" != ""} {
    if {"[info commands .message]" != ""} {
      global xfShowWindow.message
      set xfShowWindow.message 0
      XFEditSetPath .
      after 2 "XFSaveAsProc .message; XFEditSetShowWindows"
    }
  } {
    catch "destroy .message"
    update
  }
}


# procedure to show window .
proc ShowWindow. {args} {# xf ignore me 7

  # Window manager configurations
  global tkVersion
  wm positionfrom . ""
  wm sizefrom . program
  wm geometry . 610x350
  wm maxsize . 808 607
  wm minsize . 610 350
  wm title . {List Queue}

  # bindings
  bind Menubutton <Button-1> {+.frame12.frame25.frame8.frame13.menubutton34 configure -relief sunken}
  # build widget .frame0
  frame .frame0 \
    -borderwidth {2}

  # build widget .frame0.label3
  label .frame0.label3 \
    -text {Queue:}

  # build widget .frame0.label0
  label .frame0.label0 \
    -text {d105_lw} \
    -textvariable {listprinter}

  # pack widget .frame0
  pack append .frame0 \
    .frame0.label3 {left frame center} \
    .frame0.label0 {left frame center}

  # build widget .frame1
  frame .frame1 \
    -borderwidth {2} \
    -height {37} \
    -width {231}

  # build widget .frame1.frame0
  frame .frame1.frame0 \
    -borderwidth {2}

  # build widget .frame1.frame0.frame1
  frame .frame1.frame0.frame1 
     

  # build widget .frame1.frame0.frame1.frame3
  frame .frame1.frame0.frame1.frame3 \
    -borderwidth {2}

  # build widget .frame1.frame0.frame1.frame3.listbox8
  listbox .frame1.frame0.frame1.frame3.listbox8 \
    -font {-misc-fixed-Bold-R-Normal--*-120-*} \
    -width 10  -height 2 \
    -relief {sunken} \
    -xscrollcommand {.frame1.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.frame1.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .frame1.frame0.frame1.frame3
  pack append .frame1.frame0.frame1.frame3 \
    .frame1.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .frame1.frame0.frame1.frame4
  frame .frame1.frame0.frame1.frame4 \
    -borderwidth {2}

  # build widget .frame1.frame0.frame1.frame4.scrollbar9
  scrollbar .frame1.frame0.frame1.frame4.scrollbar9 \
    -command {.frame1.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken} \
    -width {13}

  # pack widget .frame1.frame0.frame1.frame4
  pack append .frame1.frame0.frame1.frame4 \
    .frame1.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .frame1.frame0.frame1
  pack append .frame1.frame0.frame1 \
    .frame1.frame0.frame1.frame3 {left frame center expand fill} \
    .frame1.frame0.frame1.frame4 {right frame center filly}

  # build widget .frame1.frame0.frame2
  frame .frame1.frame0.frame2 \
    -borderwidth {1}

  # build widget .frame1.frame0.frame2.frame5
  frame .frame1.frame0.frame2.frame5 \
    -borderwidth {2}

  # build widget .frame1.frame0.frame2.frame5.scrollbar10
  scrollbar .frame1.frame0.frame2.frame5.scrollbar10 \
    -command {.frame1.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken} \
    -width {13}
#    -activeforeground {#a04057} 
#    -foreground {#b05067} 

  # pack widget .frame1.frame0.frame2.frame5
  pack append .frame1.frame0.frame2.frame5 \
    .frame1.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # build widget .frame1.frame0.frame2.frame6
  frame .frame1.frame0.frame2.frame6 \
    -borderwidth {2}

  # build widget .frame1.frame0.frame2.frame6.frame11
  frame .frame1.frame0.frame2.frame6.frame11 \
    -borderwidth {2} \
    -height {13} \
    -width {16}

  # pack widget .frame1.frame0.frame2.frame6
  pack append .frame1.frame0.frame2.frame6 \
    .frame1.frame0.frame2.frame6.frame11 {top frame center expand fill}

  # pack widget .frame1.frame0.frame2
  pack append .frame1.frame0.frame2 \
    .frame1.frame0.frame2.frame5 {left frame center expand fill} \
    .frame1.frame0.frame2.frame6 {right frame center filly}

  # pack widget .frame1.frame0
  pack append .frame1.frame0 \
    .frame1.frame0.frame1 {top frame center expand fill} \
    .frame1.frame0.frame2 {bottom frame center fillx}

  # build widget .frame1.label0
  label .frame1.label0 \
    -text {Status of Queue}

  # pack widget .frame1
  pack append .frame1 \
    .frame1.label0 {top frame center fill} \
    .frame1.frame0 {top frame center expand fill}

  # build widget .frame3
  frame .frame3 \
    -borderwidth {2}

  # build widget .frame3.label5
  label .frame3.label5 \
    -text {Entries Of Queue}

  # build widget .frame3.frame0
  frame .frame3.frame0 \
    -borderwidth {2}

  # build widget .frame3.frame0.frame1
  frame .frame3.frame0.frame1 
     

  # build widget .frame3.frame0.frame1.frame3
  frame .frame3.frame0.frame1.frame3 \
    -borderwidth {2}

  # build widget .frame3.frame0.frame1.frame3.listbox8
  listbox .frame3.frame0.frame1.frame3.listbox8 \
    -font {-misc-fixed-Bold-R-Normal--*-120-*} \
    -width 10   -height 2 \
    -relief {sunken} \
    -xscrollcommand {.frame3.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.frame3.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .frame3.frame0.frame1.frame3
  pack append .frame3.frame0.frame1.frame3 \
    .frame3.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .frame3.frame0.frame1.frame4
  frame .frame3.frame0.frame1.frame4 \
    -borderwidth {2}

  # build widget .frame3.frame0.frame1.frame4.scrollbar9
  scrollbar .frame3.frame0.frame1.frame4.scrollbar9 \
    -command {.frame3.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken} \
    -width {13}
#    -activeforeground {#a04057} \
#    -foreground {#b05067} 

  # pack widget .frame3.frame0.frame1.frame4
  pack append .frame3.frame0.frame1.frame4 \
    .frame3.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .frame3.frame0.frame1
  pack append .frame3.frame0.frame1 \
    .frame3.frame0.frame1.frame3 {left frame center expand fill} \
    .frame3.frame0.frame1.frame4 {right frame center filly}

  # build widget .frame3.frame0.frame2
  frame .frame3.frame0.frame2 \
    -borderwidth {1}

  # build widget .frame3.frame0.frame2.frame5
  frame .frame3.frame0.frame2.frame5 \
    -borderwidth {2}

  # build widget .frame3.frame0.frame2.frame5.scrollbar10
  scrollbar .frame3.frame0.frame2.frame5.scrollbar10 \
    -command {.frame3.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken} \
    -width {13}
#    -activeforeground {#a04057} \
#    -foreground {#b05067} 

  # pack widget .frame3.frame0.frame2.frame5
  pack append .frame3.frame0.frame2.frame5 \
    .frame3.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # build widget .frame3.frame0.frame2.frame6
  frame .frame3.frame0.frame2.frame6 \
    -borderwidth {2}

  # build widget .frame3.frame0.frame2.frame6.frame11
  frame .frame3.frame0.frame2.frame6.frame11 \
    -borderwidth {2} \
    -height {13} \
    -width {16}

  # pack widget .frame3.frame0.frame2.frame6
  pack append .frame3.frame0.frame2.frame6 \
    .frame3.frame0.frame2.frame6.frame11 {top frame center expand fill}

  # pack widget .frame3.frame0.frame2
  pack append .frame3.frame0.frame2 \
    .frame3.frame0.frame2.frame5 {left frame center expand fill} \
    .frame3.frame0.frame2.frame6 {right frame center filly}

  # pack widget .frame3.frame0
  pack append .frame3.frame0 \
    .frame3.frame0.frame1 {top frame center expand fill} \
    .frame3.frame0.frame2 {bottom frame center fillx}

  # pack widget .frame3
  pack append .frame3 \
    .frame3.label5 {top frame center} \
    .frame3.frame0 {top frame center expand fill}

  # build widget .frame2
  frame .frame2 \
    -borderwidth {2}

  # build widget .frame2.label4
  label .frame2.label4 \
    -text {LPC Status}

  # build widget .frame2.frame0
  frame .frame2.frame0 \
    -borderwidth {2}

  # build widget .frame2.frame0.frame1
  frame .frame2.frame0.frame1 
     

  # build widget .frame2.frame0.frame1.frame3
  frame .frame2.frame0.frame1.frame3 \
    -borderwidth {2}

  # build widget .frame2.frame0.frame1.frame3.listbox8
  listbox .frame2.frame0.frame1.frame3.listbox8 \
    -width 18  -height 4 \
    -relief {sunken} \
    -xscrollcommand {.frame2.frame0.frame2.frame5.scrollbar10 set} \
    -yscrollcommand {.frame2.frame0.frame1.frame4.scrollbar9 set}

  # pack widget .frame2.frame0.frame1.frame3
  pack append .frame2.frame0.frame1.frame3 \
    .frame2.frame0.frame1.frame3.listbox8 {left frame center expand fill}

  # build widget .frame2.frame0.frame1.frame4
  frame .frame2.frame0.frame1.frame4 \
    -borderwidth {2}

  # build widget .frame2.frame0.frame1.frame4.scrollbar9
  scrollbar .frame2.frame0.frame1.frame4.scrollbar9 \
    -command {.frame2.frame0.frame1.frame3.listbox8 yview} \
    -relief {sunken} \
    -width {13}
#    -activeforeground {#a04057} \
#    -foreground {#b05067} 

  # pack widget .frame2.frame0.frame1.frame4
  pack append .frame2.frame0.frame1.frame4 \
    .frame2.frame0.frame1.frame4.scrollbar9 {top frame center expand filly}

  # pack widget .frame2.frame0.frame1
  pack append .frame2.frame0.frame1 \
    .frame2.frame0.frame1.frame3 {left frame center expand fill} \
    .frame2.frame0.frame1.frame4 {right frame center filly}

  # build widget .frame2.frame0.frame2
  frame .frame2.frame0.frame2 \
    -borderwidth {1}

  # build widget .frame2.frame0.frame2.frame5
  frame .frame2.frame0.frame2.frame5 \
    -borderwidth {2}

  # build widget .frame2.frame0.frame2.frame5.scrollbar10
  scrollbar .frame2.frame0.frame2.frame5.scrollbar10 \
    -command {.frame2.frame0.frame1.frame3.listbox8 xview} \
    -orient {horizontal} \
    -relief {sunken} \
    -width {13}
#    -activeforeground {#a04057} \
#    -foreground {#b05067} 

  # pack widget .frame2.frame0.frame2.frame5
  pack append .frame2.frame0.frame2.frame5 \
    .frame2.frame0.frame2.frame5.scrollbar10 {left frame center expand fillx}

  # build widget .frame2.frame0.frame2.frame6
  frame .frame2.frame0.frame2.frame6 \
    -borderwidth {2}

  # build widget .frame2.frame0.frame2.frame6.frame11
  frame .frame2.frame0.frame2.frame6.frame11 \
    -borderwidth {2} \
    -height {13} \
    -width {16}

  # pack widget .frame2.frame0.frame2.frame6
  pack append .frame2.frame0.frame2.frame6 \
    .frame2.frame0.frame2.frame6.frame11 {top frame center expand fill}

  # pack widget .frame2.frame0.frame2
  pack append .frame2.frame0.frame2 \
    .frame2.frame0.frame2.frame5 {left frame center expand fill} \
    .frame2.frame0.frame2.frame6 {right frame center filly}

  # pack widget .frame2.frame0
  pack append .frame2.frame0 \
    .frame2.frame0.frame1 {top frame center expand fill} \
    .frame2.frame0.frame2 {bottom frame center fillx}

  # pack widget .frame2
  pack append .frame2 \
    .frame2.label4 {top frame center} \
    .frame2.frame0 {top frame center}

  # build widget .frame12
  frame .frame12 \
    -borderwidth {2}

  # build widget .frame12.frame25
  frame .frame12.frame25 \
    -borderwidth {2}

  # build widget .frame12.frame25.frame8
  frame .frame12.frame25.frame8 \
    -borderwidth {2}

  # build widget .frame12.frame25.frame8.frame13
  frame .frame12.frame25.frame8.frame13 \
    -borderwidth {2}

  # build widget .frame12.frame25.frame8.frame13.menubutton34
  menubutton .frame12.frame25.frame8.frame13.menubutton34 \
    -height {2} \
    -pady {4} \
    -padx {8} \
    -menu {.frame12.frame25.frame8.frame13.menubutton34.m} \
    -relief {groove} \
    -text {Choose Queue} \
    -width {14}

  # build widget .frame12.frame25.frame8.frame13.menubutton34.m
  menu .frame12.frame25.frame8.frame13.menubutton34.m \
    -activebackground {#b05067} \
    -tearoff {0}     

  # pack widget .frame12.frame25.frame8.frame13
  pack append .frame12.frame25.frame8.frame13 \
    .frame12.frame25.frame8.frame13.menubutton34 {top frame center}

  # build widget .frame12.frame25.frame8.frame14
  frame .frame12.frame25.frame8.frame14 \
    -borderwidth {0}

  # build widget .frame12.frame25.frame8.frame14.button28
  button .frame12.frame25.frame8.frame14.button28 \
    -command {ListQueueRefresh} \
    -height {2} \
    -relief {groove} \
    -text {Rescan Queue} \
    -width {13}

  # pack widget .frame12.frame25.frame8.frame14
  pack append .frame12.frame25.frame8.frame14 \
    .frame12.frame25.frame8.frame14.button28 {top frame center}

  # build widget .frame12.frame25.frame8.label14
  label .frame12.frame25.frame8.label14 \
    -height {2} \
    -text {Queue} \
    -width {13}

  # build widget .frame12.frame25.frame8.frame7
  frame .frame12.frame25.frame8.frame7 \
    -borderwidth {0}

  # build widget .frame12.frame25.frame8.frame7.button28
  button .frame12.frame25.frame8.frame7.button28 \
    -command {EnableQueue} \
    -height {2} \
    -relief {groove} \
    -text {Enable Queue} \
    -width {13}

  # pack widget .frame12.frame25.frame8.frame7
  pack append .frame12.frame25.frame8.frame7 \
    .frame12.frame25.frame8.frame7.button28 {top frame center}

  # build widget .frame12.frame25.frame8.frame18
  frame .frame12.frame25.frame8.frame18 \
    -borderwidth {0}

  # build widget .frame12.frame25.frame8.frame18.button32
  button .frame12.frame25.frame8.frame18.button32 \
    -command {DisableQueue} \
    -height {2} \
    -relief {groove} \
    -text {Disable Queue} \
    -width {13}

  # pack widget .frame12.frame25.frame8.frame18
  pack append .frame12.frame25.frame8.frame18 \
    .frame12.frame25.frame8.frame18.button32 {top frame center}

  # pack widget .frame12.frame25.frame8
  pack append .frame12.frame25.frame8 \
    .frame12.frame25.frame8.label14 {top frame center} \
    .frame12.frame25.frame8.frame13 {top frame center} \
    .frame12.frame25.frame8.frame14 {top frame center} \
    .frame12.frame25.frame8.frame7 {top frame center} \
    .frame12.frame25.frame8.frame18 {top frame center}

  # build widget .frame12.frame25.frame11
  frame .frame12.frame25.frame11 \
    -borderwidth {2}

  # build widget .frame12.frame25.frame11.frame26
  frame .frame12.frame25.frame11.frame26 \
    -borderwidth {0}

  # build widget .frame12.frame25.frame11.frame26.button33
  button .frame12.frame25.frame11.frame26.button33 \
    -command {destroy .} \
    -height {2} \
    -relief {groove} \
    -text {Quit} \
    -width {13}

  # pack widget .frame12.frame25.frame11.frame26
  pack append .frame12.frame25.frame11.frame26 \
    .frame12.frame25.frame11.frame26.button33 {top frame center}

  # build widget .frame12.frame25.frame11.label20
  label .frame12.frame25.frame11.label20 \
    -height {2} \
    -text {Program} \
    -width {13}

  # build widget .frame12.frame25.frame11.frame23
  frame .frame12.frame25.frame11.frame23 \
    -borderwidth {0}

  # build widget .frame12.frame25.frame11.frame23.button33
  button .frame12.frame25.frame11.frame23.button33 \
    -command {show_about} \
    -height {2} \
    -relief {groove} \
    -text {About} \
    -width {13}

  # pack widget .frame12.frame25.frame11.frame23
  pack append .frame12.frame25.frame11.frame23 \
    .frame12.frame25.frame11.frame23.button33 {top frame center}

  # pack widget .frame12.frame25.frame11
  pack append .frame12.frame25.frame11 \
    .frame12.frame25.frame11.label20 {top frame center} \
    .frame12.frame25.frame11.frame23 {top frame center} \
    .frame12.frame25.frame11.frame26 {top frame center}

  # pack widget .frame12.frame25
  pack append .frame12.frame25 \
    .frame12.frame25.frame8 {top frame center} \
    .frame12.frame25.frame11 {top frame n}

  # build widget .frame12.frame26
  frame .frame12.frame26 \
    -borderwidth {2}

  # build widget .frame12.frame26.frame12
  frame .frame12.frame26.frame12 \
    -borderwidth {2}

  # build widget .frame12.frame26.frame12.frame17
  frame .frame12.frame26.frame12.frame17 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame12.frame17.button31
  button .frame12.frame26.frame12.frame17.button31 \
    -command {AbortQueue} \
    -height {2} \
    -relief {groove} \
    -text {Stop now!} \
    -width {13}

  # pack widget .frame12.frame26.frame12.frame17
  pack append .frame12.frame26.frame12.frame17 \
    .frame12.frame26.frame12.frame17.button31 {top frame center}

  # build widget .frame12.frame26.frame12.frame16
  frame .frame12.frame26.frame12.frame16 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame12.frame16.button30
  button .frame12.frame26.frame12.frame16.button30 \
    -command {StartQueue} \
    -height {2} \
    -relief {groove} \
    -text {Enable Printing} \
    -width {13}

  # pack widget .frame12.frame26.frame12.frame16
  pack append .frame12.frame26.frame12.frame16 \
    .frame12.frame26.frame12.frame16.button30 {top frame center}

  # build widget .frame12.frame26.frame12.label17
  label .frame12.frame26.frame12.label17 \
    -height {2} \
    -text {Printing} \
    -width {13}

  # build widget .frame12.frame26.frame12.frame3
  frame .frame12.frame26.frame12.frame3 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame12.frame3.button7
  button .frame12.frame26.frame12.frame3.button7 \
    -command {StopQueue} \
    -height {2} \
    -relief {groove} \
    -text {Disable Printing} \
    -width {13}

  # pack widget .frame12.frame26.frame12.frame3
  pack append .frame12.frame26.frame12.frame3 \
    .frame12.frame26.frame12.frame3.button7 {top frame center}

  # build widget .frame12.frame26.frame12.frame4
  frame .frame12.frame26.frame12.frame4 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame12.frame4.button8
  button .frame12.frame26.frame12.frame4.button8 \
    -command {RestartQueue} \
    -height {2} \
    -relief {groove} \
    -text {New Daemon} \
    -width {13}

  # pack widget .frame12.frame26.frame12.frame4
  pack append .frame12.frame26.frame12.frame4 \
    .frame12.frame26.frame12.frame4.button8 {top frame center}

  # pack widget .frame12.frame26.frame12
  pack append .frame12.frame26.frame12 \
    .frame12.frame26.frame12.label17 {top frame center} \
    .frame12.frame26.frame12.frame16 {top frame center} \
    .frame12.frame26.frame12.frame3 {top frame center} \
    .frame12.frame26.frame12.frame17 {top frame center} \
    .frame12.frame26.frame12.frame4 {top frame center}

  # build widget .frame12.frame26.frame21
  frame .frame12.frame26.frame21 \
    -borderwidth {2}

  # build widget .frame12.frame26.frame21.frame0
  frame .frame12.frame26.frame21.frame0 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame21.frame0.button1
  button .frame12.frame26.frame21.frame0.button1 \
    -command {TopQueueEntries} \
    -height {2} \
    -relief {groove} \
    -text {Entry -> Top} \
    -width {13}

  # pack widget .frame12.frame26.frame21.frame0
  pack append .frame12.frame26.frame21.frame0 \
    .frame12.frame26.frame21.frame0.button1 {top frame center filly}

  # build widget .frame12.frame26.frame21.frame15
  frame .frame12.frame26.frame21.frame15 \
    -borderwidth {0}

  # build widget .frame12.frame26.frame21.frame15.button29
  button .frame12.frame26.frame21.frame15.button29 \
    -command {RemoveEntries} \
    -height {2} \
    -relief {groove} \
    -text {Remove Entry} \
    -width {13}

  # pack widget .frame12.frame26.frame21.frame15
  pack append .frame12.frame26.frame21.frame15 \
    .frame12.frame26.frame21.frame15.button29 {top frame center}

  # build widget .frame12.frame26.frame21.label22
  label .frame12.frame26.frame21.label22 \
    -height {2} \
    -text {Entries} \
    -width {13}

  # pack widget .frame12.frame26.frame21
  pack append .frame12.frame26.frame21 \
    .frame12.frame26.frame21.label22 {top frame center} \
    .frame12.frame26.frame21.frame0 {top frame center} \
    .frame12.frame26.frame21.frame15 {top frame center}

  # pack widget .frame12.frame26
  pack append .frame12.frame26 \
    .frame12.frame26.frame12 {top frame center} \
    .frame12.frame26.frame21 {top frame center}

  # pack widget .frame12
  pack append .frame12 \
    .frame12.frame26 {left frame n filly} \
    .frame12.frame25 {left frame n filly}

  # pack widget .
  pack append . \
    .frame12 {right frame n filly} \
    .frame0 {top frame center fillx} \
    .frame3 {top frame center expand fill} \
    .frame2 {right frame center filly} \
    .frame1 {left frame center expand fill}

  if {"[info procs XFEdit]" != ""} {
    catch "XFMiscBindWidgetTree ."
    after 2 "catch {XFEditSetShowWindows}"
  }
}


# User defined procedures

# procedure scan_printcap
proc scan_printcap {printcap_name} {

  ;# procedure lastchar (gibt letztes echtes (kein RETURN) Zeichen eines Strings
  ;# zurueck

  proc lastchar {line} {
   set c [string index $line [expr [string length $line] -1]]
   return $c
  }

 ;# diese procedure schaut sich die "/etc/printcap"
 ;# an und traegt die dort konfigurierten Drucker
 ;# in das Menue von Printop ein.


 ;# erstmal die datei oeffnen
 if [catch {open $printcap_name r} fileID] {
	puts stderr "Error while trying to open $printcap_name."
	puts stderr "printop cannot read the printer-entries"
	puts stderr "from $printcap_name. Sorry..."
	exit 1
 }

 ;# jetzt variablen initialisieren. previousbackslash = "true" bedeutet, da"s
 ;# die vorhergehende Zeile mit einem Backslash geendet hat, also der Printer-
 ;# eintrag in der aktuellen Zeile fortgesetzt wird.
 ;# compline enthaelt einen kompletten Printer-Eintrag der printcap, also auch
 ;# ueber mehrere Zeilen.
 set previousbackslash "false"
 set compline ""

 ;# noch kein EOF? Dann Zeile einlesen.
 while {![eof $fileID]} {
   set line [gets $fileID]

   if {!([string index $line 0]=="#")} {   ;# Kommentar-Zeile--> nichts tun.
     if {($previousbackslash == "true")} { ;# vorher Backslash? Dann anhaengen.
       if {([lastchar $line] == "\\")} {   ;# Eintrag in naechster Zeile
					   ;# fortgesetzt? Dann letztes "\"
	 set previousbackslash "true"      ;# auslassen und Flagge setzen.
	 append compline [string range $line 0 [expr [string length $line] - 2]]
       } else {				   ;# sonst ganze Zeile bis auf newline
	 set previousbackslash "false"	   ;# anhaengen.
	 append compline [string range $line 0 [expr [string length $line] - 1]]
       }
     } else {				   ;# Ende eines Printer-Eintrags
       if {$compline != ""} {		   ;# schon einen gelesen?
	 lappend preprinterlist $compline} ;# dann in Liste einhaengen.
       if {([lastchar $line] == "\\")} {   ;# und neue Zeile bearbeiten
         set previousbackslash "true"	   ;# wie oben schon.
	 set compline [string range $line 0 [expr [string length $line] - 2]]
       } else {
	 set previousbackslash "false"
	 set compline [string range $line 0 [expr [string length $line] - 1]]}
     }
   }
 }
 ;# und Datei schlie"sen.
 close $fileID

 ;# Die Druckerliste wird Global deklariert.
 global printcap_list

 ;# hostname mu"s aufgerufen werden, um zu pruefen, ob ein Drucker remote
 ;# oder local ist.
 set hostname_path "hostname"
 set host_name [exec $hostname_path]

 ;# jetzt wird jeder Druckereintrag der vorlaeufigend Liste geprueft, ob der
 ;# zugeh"orige Drucker remote oder local ist. Die Druckerliste hat das
 ;# Format: firstname, secondname, remote (true/false), remote-host-name.
 foreach i $preprinterlist {
   set entry ""
   set remote 0
   set remote_host ""
   set presult [split $i :]
   set printer_names [split [lindex $presult 0] |]
   set short_name_of_printer [lindex $printer_names 0]
   set long_name_of_printer [lindex $printer_names 1]
   foreach j $presult {
     if {(([regexp ^rm=* $j]) && ([string range $j 3 [string length $j]]!=$host_name))} {
       set remote 1
       set remote_host [string range $j 3 [string length $j]]
     }
   }
   lappend entry $short_name_of_printer $long_name_of_printer $remote $remote_host
   lappend printcap_list $entry
 }

}
# Ende von Procedure scan_printcap


# procedure name2widget: Erhaelt einen beliebigen String (mit Spaces,
# Punkten, was auch immer) und macht daraus einen gueltigen Widget-Namen.
# Dazu wird jedes Zeichen des Strings in eine (natuerlich zweistellige)
# Hex-Zahl konvertiert und diese dann als Strings aneindandergehaengt.
proc name2widget {instring} {

  set marked 0
  set tmpname "cbx"
  for {set i 0} {$i < [string length $instring]} {incr i} {
    scan [string index $instring $i] "%c" num_of_char
    if $marked {
      set marked 0
      if {($num_of_char==46)} {
        append tmpname [format "%02x" $num_of_char]
      } else {
        append tmpname "." [format "%02x" $num_of_char]
      }  
    } else {
      if {($num_of_char==46)} {
	set marked 1
      } else {
	append tmpname [format "%02x" $num_of_char]
      }
    }
  }
  return $tmpname
}

# procedure space2underscore: Erhaelt einen String, gibt einen String
# zurueck der statt spaces underscores enthaelt. Da dadurch aus unter-
# schiedlichen Strings identische werden koennten, werden underscores
# dupliziert (characterstuffing), um eindeutige Namen zu erhalten.
# Und das ganze deswegen, weil Spaces in Widgetnamen nicht erlaubt sind.
proc space2underscore {instring} {

  set tmpname ""
  for {set i 0} {$i < [string length $instring]} {incr i} {
# aus ' ' wird '_'; aus '_' wird '__'!
# aus '.' wird '-'; aus '-' wird '--'!
# aus '[' wird ':'; aus ':' wird '::'!
# aus ']' wird ';'; aus ';' wird ';;'!
    switch -exact -- [string index $instring $i] {
    " " {append tmpname "_"}
    "_" {append tmpname "__"}
    "-" {append tmpname "--"}
    "[" {append tmpname ":"}

    ":" {append tmpname "::"}
    "]" {append tmpname ";"}
    ";" {append tmpname ";;"}
    default {append tmpname [string index $instring $i]}
    }
  }
  return $tmpname
}


# procedure make_normal_button
proc make_normal_button {name_of_menu label command} {

# richtet einen neuen Button im Menu "name_of_menu" ein
# mit Label "label" und Kommando "command"

  if [catch {$name_of_menu add command -command $command -label $label} ] {
    puts stderr "Couldn't create button [lindex $label 0]"
    puts stderr "in menu $name_of_menu."
  }
}

# procedure make_cascade_button
proc make_cascade_button {submenu name_of_menu label} {

# richtet einen Cascade-Button ein im Menu "name_of_menu"
# mit Label "label", der das Submenu "submenu" anzeigt.

  if [catch {$name_of_menu add cascade -label $label -menu $submenu} ] {
    puts stderr "Couldn't create cascade-button $label"
    puts stderr "in menu $name_of_menu."}
}

# procedure make_menu
proc make_menu {name_of_menu} {
# richtet des Menue "name_of_menu" ein.

  if [catch {menu $name_of_menu -tearoff {0} -activebackground {#b05067} } ] {
    puts stderr "Couldn't create menu $name_of_menu."
    puts stderr "Either this menu is more than once in the config-file,"
    puts stderr "the upper menu in wich this menu should be created"
    puts stderr "doesn't exist or it's name is invalid."
    exit 1
  }
}

# procedure host_of_printer. Liefert zu einem Drucker den Namen des
# Rechners, auf dem er gespoolt wird.
proc host_of_printer {printer} {

  global printcap_list

  set index [lsearch -regexp $printcap_list ^$printer]
  set entry [lindex $printcap_list $index]
  return [lindex $entry 3]
}

# Procedure: AbortQueue
proc AbortQueue {} {
# ruft lpc abort auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# erst requester ausgeben (nr. 3 = wirklich abort?)
  set doit [printop.req 3 0]
  if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC abort $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC abort $listprinter"
    }
  }
  ListQueueRefresh
}


# Procedure: DisableQueue
proc DisableQueue {} {
# ruft lpc disable auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# erst requester ausgeben (nr. 5 = wirklich disable?)
set doit [printop.req 5 0]
if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC disable $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC disable $listprinter"
    }
  }
ListQueueRefresh
}


# Procedure: EnableQueue
proc EnableQueue {} {
# ruft lpc enable auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# erst requester ausgeben (nr. 6 = wirklich enable?)
set doit [printop.req 6 0]
if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC enable $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC enable $listprinter"
    }
  }
ListQueueRefresh
}


# Procedure: GetEntrySelection
proc GetEntrySelection { listbox} {
# welche entries sind in der listbox selektiert?
set my_selection_index [[SymbolicName $listbox] curselection]

# entries holen
set my_list {}
foreach i $my_selection_index {
	lappend my_list [[SymbolicName $listbox] get $i]
	}
return $my_list
}


# Procedure: ListQueueRefresh
proc ListQueueRefresh {} {
# liest ausgabe von lpq, teilt ausgabe in
# statuszeilen und entries und zeigt
# diese in den listboxen an

global listprinter
global confLPQ
global confLPC
global confRSH

# loesche listboxen (sofortiges User-Feedback... man kann
# sehen, dasz etwas passiert...)
[SymbolicName StatQueueList] delete 0 end
[SymbolicName EntryList] delete 0 end
[SymbolicName EntryList] insert end "I try to get the printer status."
[SymbolicName EntryList] insert end ""
[SymbolicName EntryList] insert end "Remote hosts take a while!"
[SymbolicName EntryList] insert end ""
[SymbolicName EntryList] insert end "Please wait...    Please wait..."
[SymbolicName LPCListbox] delete 0 end
update

# lese ausgabe von lpq (nach zeilen getrennt)
set inlist [split [eval "exec $confLPQ -P$listprinter"] "\n"]


# setze zeiger auf headerzeile der entries
# (Rank    Owner   ...), um liste dort zu
# trennen
set 1st_entry [lsearch -regexp $inlist {Rank * }]

# wenn headerzeile nicht gefunden, dann ganze liste
# statuszeilen, also zeiger auf ende
if {$1st_entry < 0} {set 1st_entry [llength $inlist]}

# statlist = liste der statuszeilen
set statlist [lrange $inlist 0 [expr $1st_entry - 1]]

# entrylist = liste der entries der queue
set entrylist [lrange $inlist [expr $1st_entry + 1]  [expr [llength $inlist]-1]]

# und nun lpc status einlesen
    if {[local_printer? $listprinter]} {
	set inlist [split [eval "exec $confLPC status $listprinter"] "\n"]
    } else {
	set host [host_of_printer $listprinter]
	set inlist [split [eval "exec $confLPC status $listprinter"] "\n"]
    }
 
# erstes element loeschen (gibt nur den drucker an)
set lpclist [lrange $inlist 1 [llength $inlist]]

# nochmals die listbox-eintraege loeschen, um bei
# zeitlicher ueberlagerung mehrerer aufrufe dieser
# routine die folgen zu eleminieren.

# eintraege aus statlist in listbox "Status of Queue" eintragen
[SymbolicName StatQueueList] delete 0 end
foreach i $statlist {
	[SymbolicName StatQueueList] insert end $i }
# eintraege aus entrylist in listbox "Entries of Queue" eintragen
[SymbolicName EntryList] delete 0 end
foreach i $entrylist {
	[SymbolicName EntryList] insert end $i }
# eintraege aus lpclist in listbox "LPC Status" eintragen
[SymbolicName LPCListbox] delete 0 end
foreach i $lpclist {
	[SymbolicName LPCListbox] insert end $i }
# und natuerlich das ganze anzeigen...
update
}


# Procedure: RemoveEntries
proc RemoveEntries {} {
global listprinter
global confLPRM
global confRSH

# selektierte entries holen
set sel_list [GetEntrySelection {EntryList}]

# job-nummern aus liste herausholen
set job_list {}
foreach i $sel_list {
	lappend job_list [lindex $i 2]
	}

# und jobs entfernen
foreach i $job_list {
# erst natuerlich reuqester (nr. 1 = wirklich entfernen?)
	set doit [printop.req 1 $i]
	if {$doit} {
	    if {[local_printer? $listprinter]} {
		eval "exec $confLPRM -P$listprinter $i"
	    } else {
		set host [host_of_printer $listprinter]
		eval "exec $confLPRM -P$listprinter $i"
	    }
	}
	ListQueueRefresh
}
}


# Procedure: RestartQueue
proc RestartQueue {} {
# ruft lpc restart auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# requester ausgeben (nr. 8 = wirklich restart?)
set doit [printop.req 8 0]
if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC restart $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC restart $listprinter"
    }
  }
ListQueueRefresh
}


# Procedure: StartQueue
proc StartQueue {} {
# ruft lpc start auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# erst requester ausgeben (nr. 4 = wirklich start?)
set doit [printop.req 4 0]
if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC start $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC start $listprinter"
    }
  }
ListQueueRefresh
}


# Procedure: StopQueue
proc StopQueue {} {
# ruft lpc stop auf fuer die aktuelle Queue
global listprinter
global confLPC
global confRSH

# erst requester ausgeben (nr. 7 = wirklich stop?)
set doit [printop.req 7 0]
if {$doit} {
    if {[local_printer? $listprinter]} {
	eval "exec $confLPC stop $listprinter"
    } else {
	set host [host_of_printer $listprinter]
	eval "exec $confRSH $host $confLPC stop $listprinter"
    }
  }
ListQueueRefresh
}


# Procedure: TopQueueEntries
proc TopQueueEntries {} {
# ruft lpc topq auf fuer selektierte Druck-Jobs
global listprinter
global confLPC
global confRSH

# selektierte entries holen
set sel_list [GetEntrySelection {EntryList}]

# job-nummern aus liste herausholen
set job_list {}
foreach i $sel_list {
	lappend job_list [lindex $i 2]
	}

# und jobs nach oben
foreach i $job_list {
	set doit [printop.req 2 $i]
	if {$doit} {
	    if {[local_printer? $listprinter]} {
		eval "exec $confLPC topq $listprinter $i"
	    } else {
		set host [host_of_printer $listprinter]
		eval "exec $confRSH $host $confLPC topq $listprinter $i"
	    }
	  }
	ListQueueRefresh
}
}

#Procedure: show_about
proc show_about {} {
# Zeigt About-Fenster an.
ShowWindow.about
tkwait visibility .about
[SymbolicName AboutAway] configure -state normal
}

# Procedure: printop.req
proc printop.req { kind_of_request proc_id} {
# gibt requester aus, wartet auf Antwort (mittels GRAB) und
# gibt true oder false zurueck, je nachdem ob die Aktion
# bestaetigt oder zurueckgenommen wird.
global MessageText
global listprinter

switch $kind_of_request {
	1 {set MessageText "Do you really want to remove the entry\n $proc_id from queue $listprinter ?"}
	2 {set MessageText "Do you really want to move the entry\n $proc_id to the top of queue $listprinter ?"}
	3 {set MessageText "Do you really want to abort the queue $listprinter ?"}
	4 {set MessageText "Do you really want to start the queue $listprinter ?"}
	5 {set MessageText "Do you really want to disable the queue $listprinter ?"}
	6 {set MessageText "Do you really want to enable the queue $listprinter ?"}
	7 {set MessageText "Do you really want to stop the queue $listprinter ?"}
	8 {set MessageText "Do you really want to restart the queue $listprinter ?"}
}

global mess_return
set mess_return {}
ShowWindow.message
tkwait visibility .message
[SymbolicName MessageOk] configure -state normal
[SymbolicName MessageCancel] configure -state normal
grab set .message

# leider gibt es keine Moeglichkeit, das Ergebnis (welcher
# Knopf gedrueckt wurde) an die Procedure zurueckzuliefern,
# die den Requester geoeffnet hat (die widerum ja das Ergebnis
# an die Procedure zurueckgeben sollte, die den Requester
# anzeigen wollte und das Ergebnis davon auswerten...).
# Also muessen wir leider eine globale Variable nehmen, die
# von den Knoepfen auf den Rueckgabewert gesetzt wird. Waehrend
# der Requester also noch nicht bedient wurde, warten wir
# auf ein Aendern der Ergebnis-Variable.
tkwait window .message
return $mess_return
}

# Procedure exist_printer? (liefert true, wenn printer beim parsen der
# printcap-Datei gefunden wurde, sonst false).
proc exist_printer? {name} {
	global printcap_list
	if {([lsearch -regexp $printcap_list ^$name]<0)} {
		return 0
	} else {
		return 1
	}
}

# Procedure local_printer? (liefert true, wenn printer beim parsen der
# printcap-Datei als local definiert wurde, sonst false).
proc local_printer? {name} {
    if {!([exist_printer? $name])} {
	puts stderr "Printer does not exist so it can't be"
	puts stderr "local or remote. This error should never"
	puts stderr "occur..."
	exit 1
    } else {
	global printcap_list
	set index [lsearch -regexp $printcap_list ^$name]
	set entry [lindex $printcap_list $index]
	if {[lindex $entry 2]} {
		return 0
	} else {
		return 1
	}
    }
}

# Procedure newlsearch. Das Tcl-Search liefert aus einer Liste nur den
# Index des ersten Elements, das vom Pattern gematched wird. Dieses
# newsearch liefert eine Liste aller gematchten Indizes zur"uck.
proc newlsearch {liste pattern} {

  set zusaetzliche 0
  set indexliste ""
  set act_index [lsearch -regexp $liste $pattern]
  if {$act_index<0} {
    return ""
  } else {
    while {$act_index>=0} {
      lappend indexliste [expr $act_index + $zusaetzliche]
      set liste [lreplace $liste $act_index $act_index]
      set zusaetzliche [expr $zusaetzliche + 1]
      set act_index [lsearch -regexp $liste $pattern]
    }
    return $indexliste
  }
}

# Procedure insert_buttons. Erh"alt Drucker-Pattern und
# Menu-Namen. Richtet in dem angegebenen Menu einen Knopf
# f"ur jeden Drucker ein, auf den Pattern pa"st.
proc insert_buttons {in_menu pattern} {

  # Procedure insert_button. Erh"alt Drucker-Namen, einen
  # widget-Pfad zu dem Men"u, in das der Button eingef"ugt werden
  # soll. Setzt ggf. die Remote-Kennung "->" mit hinzu.
  proc insert_button {in_menu button} {

    if {[local_printer? $button]} {
      make_normal_button $in_menu $button "set listprinter $button \n ListQueueRefresh"
    } else {
      make_normal_button $in_menu "$button  ->" "set listprinter $button \n ListQueueRefresh"
    }
  }
  ;# end of insert_button


global printer_menu_name
global printcap_list

  ;# ben"otigte Variablen werden initialisiert (auf leer)
  set tmpname_list ""
  set index_list ""
  ;# f"ur die Suche wird eine Liste erstellt, in der nur die
  ;# Namen der Drucker sind (gleiche Reihenfolge wie in der
  ;# Printcap-Liste).
  foreach i $printcap_list {
    lappend tmpname_list [lindex $i 0]}
  ;# jetzt werden die indizes aller gematchten Drucker geholt
  set index_list [newlsearch $tmpname_list $pattern]
  ;# Und jetzt wird f"ur jeden gefundenen Drucker ein Eintrag
  ;# in das Untermen"u eingesetzt (ggf. mit Remote-Kennung)
  foreach i $index_list {
    set tempdruck [lindex [lindex $printcap_list $i] 0]
    insert_button $printer_menu_name$in_menu $tempdruck
  }
}


# Procedure getoptions
proc getoptions {} {
# Diese Procedure liest die Defaults aus den entsprechenden
# Files aus. Zuerst wird die Standard-Command-Datei "printop.cmd"
# ausgewertet, evtl. danach auch "~/.printop.cfg".
# Dann wird das Drucker-Menue gebastelt, entweder nach der
# Datei "~/.printop.cfg" oder, wenn's die nicht gibt, dann nach
# "printop.cfg" im printop-Verzeichnis.

  global appcfg
  global usercfg
  global usercmd
  global appcmd
  global confSUID

  if {[file exists $appcmd]} {
    if {![read_commands $appcmd]} {
      puts stderr "Configfile $appcmd is not ok!"
    }
  }

# usercmd wird nur dann gelesen, wenn confSUID in der appcfg-Datei
# auf false {0} gesetzt wird. Dies darf nur passieren, wenn printop
# nicht SUID ROOT laeuft!

  if {(!($confSUID))} {
    if {[file exists $usercmd]} {
      if {![read_commands $usercmd]} {
	puts stderr "Configfile $usercmd is not ok!"
      }
    }
  }
	

  if {[file exists $usercfg]} {
    if {![read_configs $usercfg]} {
	puts stderr "Configfile $usercfg is not ok."
	puts stderr "Wrong file permissions or so."
	exit 1
    }
  } else {
    if {[file exists $appcfg]} {
      if {![read_configs $appcfg]} {
	puts stderr "Configfile $appcfg is not ok."
	puts stderr "Tell your systemadministrator!"
	exit 1
      }
    }
  }
}

# procedure parse_error, gibt Fehlermeldung aus, keine Fehlerbehandlung.
# falsches Kommando wird einfach nicht ausgef"uhrt.
proc parse_error {line line_nr fehlermeldung datei} {
	puts stderr "Error in config-file $datei!"
	puts stderr $fehlermeldung
	puts stderr $line
	puts stderr "Error occurred in line $line_nr."
	puts stderr ""
}

# Procedure read_commands
proc read_commands {commandfile} {
# Die Datei mit uebergebenem Namen wird gelesen, die darin enthaltenen
# set-Kommandos werden (soweit sie korrekt sind) ausgef"uhrt.

# evtl. wird confSUID von Appdefault auf FALSE gesetzt, sodasz der
# Benutzer die Kommandos fuer printop selbst einstellen kann.
global confSUID

# datei oeffnen, bei fehler 0 zurueckgeben
if [catch {open $commandfile r} fileID] {
	return 0
} else {
# Zeilennummer auf 0 setzen (fuer Fehlerausgabe: wo ist der Fehler?)
set line_no 0
# solange lesen, bis eof
  while {![eof $fileID]} {
# leerzeilen uebergehen
    set line [gets $fileID]
    set line_no [expr $line_no + 1] 
    if {(($line!="") && ([string index $line 0]!="#"))} {
      switch -exact -- [lindex $line 0] {
	set {
	  set varname [lindex $line 1]
	  if {(($varname=="confRSH")||
	       ($varname=="confLPC")||($varname=="confLPRM")||
	       ($varname=="confLPQ")||($varname=="confSUID"))} {
	    global $varname
	    set $varname [lrange $line 2 end]
	  } else {parse_error $line $line_no "Unknown option:" $commandfile}
	}
	default {
	  parse_error $line $line_no "Unknown command:" $commandfile
	}
      }
    }
  }
close $fileID
return 1
}
}

# Procedure read_configs
proc read_configs {configfile} {
# hier werden aus der Datei, deren Name uebergeben wird, die
# Printer-Defaults ausgelesen. Dazu gehoert der voreingestellte
# Drucker (beim Start) und die Menu-Eintrage im Drucker-Menue.

global listprinter
global printer_menu_name

# datei oeffnen, bei fehler 0 zurueckgeben
if [catch {open $configfile r} fileID] {
	return 0
} else {
# Zeilennummer auf 0 setzen (fuer Fehlerausgabe: wo ist der Fehler?)
set line_no 0
# solange lesen, bis eof
  while {![eof $fileID]} {
# leerzeilen uebergehen
    set line [gets $fileID]
    set line_no [expr $line_no + 1] 
    if {(($line!="") && ([string index $line 0]!="#"))} {
      switch -exact -- [lindex $line 0] {
	printer {
	  switch -exact -- [lindex $line 1] {
	    button {
	      set pattern [lindex $line 2]
	      set path [lindex $line 3]
	      if {($path!="")} {
		set tmppath $path
		set path "."
		append path $tmppath }
	      insert_buttons $path $pattern
	    }
	    menu {
	      ;# kein dritter Eintrag in der Zeile (also kein Label)
	      if {([lindex $line 2] == "")} {
		parse_error $line $line_no "No menu-label specified:" $configfile
	      } else {
		;# kein vierter Eintrag in der Zeile (also kein Name)
		if {([lindex $line 3] == "")} {
		  parse_error $line $line_no "No menu-name specified:" $configfile
		} else {
		  ;# Zeile wird aufgedr"oselt in einzelne Argumente
		  set label [lindex $line 2]
		  set name [lindex $line 3]
		  set path [lindex $line 4]
		  ;# ein Button und ein damit verbundenes Men"u werden
		  ;# eingerichtet, in dem Men"u werden dann die Drucker
		  ;# (als Kn"opfe) eingerichtet.
		  if {($path!="")} {
		    set tmppath $path
		    set path "."
		    append path $tmppath }
		  make_menu $printer_menu_name$path.$name
		  make_cascade_button $printer_menu_name$path.$name $printer_menu_name$path "$label"
		}
	      }
	    }
	    startup {
	      set listprinter [lrange $line 2 end]
	    }
	    default {
	      parse_error $line $line_no "Error in 'printer'-command:" $configfile
	    }
	  }
	}
	default {
	  parse_error $line $line_no "Unknown command:" $configfile
	  if {([llength $line]==2)} {
	    puts stderr "Maybe it's an old version of the config-file?"
	  }
	}
      }
    }
  }

close $fileID
return 1
}
}

# Internal procedures

# Procedure: SymbolicName
if {"[info procs SymbolicName]" == ""} {
proc SymbolicName { {xfName ""}} {
# xf ignore me 7
##########
# Procedure: SymbolicName
# Description: map a symbolic name to the widget path
# Arguments: xfName
# Returns: the symbolic name
# Sideeffects: none
##########

  global symbolicName

  if {"$xfName" != ""} {
    set xfArrayName ""
    append xfArrayName symbolicName ( $xfName )
    if {![catch "set \"$xfArrayName\"" xfValue]} {
      return $xfValue
    } {
      if {"[info commands XFProcError]" != ""} {
        XFProcError "Unknown symbolic name:\n$xfName"
      } {
        puts stderr "XF error: unknown symbolic name:\n$xfName"
      }
    }
  }
  return ""
}
}

# startup source
proc StartupSrc {args} {

global printer_menu_name
global printcap_path

set printer_menu_name ".frame12.frame25.frame8.frame13.menubutton34.m"
scan_printcap $printcap_path

}


# end source
proc EndSrc {} {

# erst mal die Command-Line-Argumente anschauen
global argc
global argv

# mehr als ein Argument? So ein Unsinn... und exit!
if {$argc >1} {
	puts stderr "Usage of printop is: printop ?printer?"
	exit 1 }

# Und nun die Konfigurations-Dateien auslesen
getoptions

global listprinter

if {!([exist_printer? $listprinter])} {
	puts stderr "Configured default-printer doesn't exist!"
	puts stderr "Please change listprinter-entry in config-file."
	exit 1 }

# Wenn Drucker als Command-Line-Argument angegeben, dann auch benutzen
# (overrides default-files)
if {$argc != 0} {
    if {![exist_printer? [lindex $argv 0]]} {
	puts stderr "Printer specified in commandline doesn't exist!"
    } else {
	set listprinter [lindex $argv 0]
    }
}

# Und einmal die aktuelle Queue auslesen
ListQueueRefresh
}

# prepare auto loading
global auto_path
global tk_library

catch "unset auto_index"

catch "unset auto_oldpath"

catch "unset auto_execs"


# startup source
StartupSrc

# initialize global variables
proc InitGlobals {} {

  global printop_path
  global env

  global {confSUID}
  set {confSUID} {1}
  global usercfg
  set {usercfg} "$env(HOME)/.printop.cfg"
  global {usercmd}
  set {usercmd} "$env(HOME)/.printop.cmd"
  global appcfg
  set {appcfg} "$printop_path/printop.cfg"
  global {appcmd}
  set {appcmd} "$printop_path/printop.cmd"
  global {MessageText}
  set {MessageText} {}
  global {confLPC}
  set {confLPC} {/usr/local/etc/opcom lpc}
  global {confLPQ}
  set {confLPQ} {lpq}
  global {confLPRM}
  set {confLPRM} {/usr/local/etc/opcom lprm}
  global confRSH
  set {confRSH} {rsh}
  global {listprinter}
  set {listprinter} {d105_lw}
  global {mess_return}
  set {mess_return} {}

  # please don't modify the following
  # variables. They are needed by xf.
  global {autoLoadList}
  set {autoLoadList(printop)} {0}
  global {moduleList}
  set {moduleList(printop)} {}
  global {preloadList}
  set {preloadList(xfInternal)} {}
  global {symbolicName}
  set {symbolicName(EntryList)} {.frame3.frame0.frame1.frame3.listbox8}
  set {symbolicName(LPCListbox)} {.frame2.frame0.frame1.frame3.listbox8}
  set {symbolicName(MessageCancel)} {.message.frame2.frame6.button8}
  set {symbolicName(MessageOk)} {.message.frame2.frame5.button7}
  set {symbolicName(StatQueueList)} {.frame1.frame0.frame1.frame3.listbox8}
  set {symbolicName(AboutAway)} {.about.frame2.frame6.button8}
  set {symbolicName(root)} {.}
  global {xfWmSetPosition}
  set {xfWmSetPosition} {.xfEdit.tmplt}
  global {xfWmSetSize}
  set {xfWmSetSize} {.}
  global {xfAppDefToplevels}
  set {xfAppDefToplevels} {}
}

# initialize global variables
InitGlobals

# display/remove toplevel windows.
ShowWindow.

# end source
EndSrc

# while 1 {
#	set wait_signal 0
#	after 25000 ListQueueRefresh
#	after 30000 set wait_signal 1
#	tkwait variable wait_signal
# }

# eof
#

