summaryrefslogtreecommitdiff
path: root/gdb/gdbtk/library/regwin.itb
blob: 26291177630d9bc448e303180eab275f3334b01a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
# Register display window for GDBtk.
# Copyright 1998, 1999 Cygnus Solutions
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License (GPL) as published by
# the Free Software Foundation; either version 2 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# ------------------------------------------------------------------
#  CONSTRUCTOR - create new register window
# ------------------------------------------------------------------
body RegWin::constructor {args} {
  global tixOption
  debug "RegWin::constructor"
  wm withdraw [winfo toplevel $itk_interior]
  gdbtk_busy
  
  set NormalForeground $tixOption(fg)
  set HighlightForeground [pref get gdb/reg/highlight_fg]
  
  if {[pref getd gdb/reg/menu] != ""} {
    set mbar 0
  }
  
  init_reg_display_vars 1
  build_win
  eval itk_initialize $args    
  
  gdbtk_idle
  add_hook gdb_update_hook "$this update"
  add_hook gdb_busy_hook [list $this busy]
  add_hook gdb_idle_hook [list $this idle]
  if {[get_disassembly_flavor] != ""} {
    add_hook gdb_set_hook [code $this handle_set_hook]
  }
}

# ------------------------------------------------------------------
#  DESTRUCTOR - destroy window containing widget
# ------------------------------------------------------------------
body RegWin::destructor {} {
  debug "RegWin::destructor"
  save_reg_display_vars
  remove_hook gdb_update_hook "$this update"
  remove_hook gdb_busy_hook [list $this busy]
  remove_hook gdb_idle_hook [list $this idle]
  if {[get_disassembly_flavor] != ""} {
    remove_hook gdb_set_hook [code $this handle_set_hook]
  }
}
  

# ------------------------------------------------------------------
#  METHOD:  build_win - build the main register window
# ------------------------------------------------------------------
body RegWin::build_win {} {
  global reg_display tixOption tcl_platform
  
  set dim [dimensions]
  set nRows [lindex $dim 0]
  set nCols [lindex $dim 1]
  if {$tcl_platform(platform) == "windows"} {
    tixScrolledWindow $itk_interior.scrolled -scrollbar both -sizebox 1
  } else {
    tixScrolledWindow $itk_interior.scrolled -scrollbar auto
  }
  set ScrolledWin [$itk_interior.scrolled subwidget window]
  
  # Calculate the maximum length of a register name
  set regMaxLen 0
  foreach r [gdb_regnames] {
    set l [string length $r]
    if {$l > $regMaxLen} {
      set regMaxLen $l
    }
  }
  
  # Calculate the minimum size for each column so that the register values fit.
  set row 0
  set col 0
  foreach r $reg_display_list {
    if {$row == 0} {
      # A minimum of 10 so the appearence is nice
      set vmax($col) 10
    }

    # Typed registers natural values start with a brace (escaped by a slash)
    if {[catch {gdb_fetch_registers {} $r} valtest]} {
      set values($r) ""
    } else {
      if {[string index $valtest 1] == "\{"} {
        # If it is a typed register, we print it raw
        set format r
        set reg_display($r,format) r
        set reg_display($r,typed) 1
        set reg_display($r,editable) 0
      } else {
        set format $reg_display($r,format)
        set reg_display($r,editable) 1
      }
      if {[catch {gdb_fetch_registers $format $r} values($r)]} {
        set values($r) ""
      } else {
        set values($r) [string trim $values($r) \ ]
      }
    }

    set l [string length $values($r)]
    if {$l > $vmax($col)} {
      set vmax($col) $l
    }
    incr row
    if {$row == $nRows} {
      set row 0
      incr col
    }
  }
  
  # Create labels
  set row 0
  set col 0
  foreach r $reg_display_list {
    if {$row == $nRows} {
      grid columnconfigure $ScrolledWin $col -weight 1
      set row 0
      incr col
    }
    
    frame $ScrolledWin.$r -takefocus 1
    bind $ScrolledWin.$r <Up> "$this reg_select_up"
    bind $ScrolledWin.$r <Down> "$this reg_select_down"
    bind $ScrolledWin.$r <Tab> "$this reg_select_down"
    bind $ScrolledWin.$r <Left> "$this reg_select_left"
    bind $ScrolledWin.$r <Right> "$this reg_select_right"
    if {![pref get gdb/mode]} {
      bind $ScrolledWin.$r <Return> "$this edit $r"
    }
    
    label $ScrolledWin.$r.lbl -text [fixLength $reg_display($r,name) $regMaxLen left] \
      -relief solid -bd 1 -font src-font 
    label $ScrolledWin.$r.val -anchor e -text [fixLength $values($r) $vmax($col) right] \
      -relief ridge -bd 1 -font src-font -bg $tixOption(input1_bg)
    
    grid $ScrolledWin.$r.lbl $ScrolledWin.$r.val -sticky nsew
    grid columnconfigure $ScrolledWin.$r 1 -weight 1
    grid $ScrolledWin.$r -colum $col -row $row -sticky nsew
    #      grid rowconfigure $ScrolledWin $row -weight 1
    bind $ScrolledWin.$r.val <1> "$this reg_select $r"
    bind $ScrolledWin.$r.lbl <1> "$this reg_select $r"
    bind $ScrolledWin.$r.val <3> "$this but3 $r %X %Y"
    bind $ScrolledWin.$r.lbl <3> "$this but3 $r %X %Y"
    if {![pref get gdb/mode]} {
      bind $ScrolledWin.$r.lbl <Double-1> "$this edit $r"
      bind $ScrolledWin.$r.val <Double-1> "$this edit $r"
    }
    incr row
  }
  grid columnconfigure $ScrolledWin $col -weight 1
  
  
  if { $mbar } {
    menu $itk_interior.m -tearoff 0
    [winfo toplevel $itk_interior] configure -menu $itk_interior.m
    $itk_interior.m add cascade -menu $itk_interior.m.reg -label "Register" -underline 0
    set m [menu $itk_interior.m.reg]
    if {![pref get gdb/mode]} {
      $m add command -label "Edit" -underline 0 -state disabled
    }
    $m add cascade -menu $itk_interior.m.reg.format -label "Format" -underline 0
    set f [menu $itk_interior.m.reg.format]
    $f add radio -label "Hex" -value x -underline 0 -state disabled \
      -command "$this update"
    $f add radio -label "Decimal" -value d -underline 0 -state disabled \
      -command "$this update"
    $f add radio -label "Natural" -value {} -underline 0 -state disabled \
      -command "$this update"
    $f add radio -label "Binary" -value t -underline 0 -state disabled \
      -command "$this update"
    $f add radio -label "Octal" -value o -underline 0 -state disabled \
      -command "$this update"
    $f add radio -label "Raw" -value r -underline 0 -state disabled \
      -command "$this update"
    $m add command -label "Remove from Display" -underline 0 -state disabled
    $m add separator
    $m add command -label "Add to Watch" -underline 7 -state disabled
    $m add separator
    $m add command -label "Display All Registers" -underline 0 -state disabled \
			      -command "$this display_all"
    set disp_all_menu_item [$m index last]

    if {!$all_regs_shown} {
      $m entryconfigure $disp_all_menu_item -state normal
    }
  }
  
  set Menu [menu $ScrolledWin.pop -tearoff 0]
  set disabled_fg [$Menu cget -fg]
  $Menu configure -disabledforeground $disabled_fg
  
  # Clear gdb's changed list
  catch {gdb_changed_register_list}
  
  pack $itk_interior.scrolled -anchor nw -fill both -expand yes
  
  window_name "Registers" "Regs"
}

# ------------------------------------------------------------------------------
# NAME: init_reg_display_vars
# DESC: Initialize the list of registers displayed.
#	args - not used
# RETURNS:
# NOTES:
# ------------------------------------------------------------------------------
body RegWin::init_reg_display_vars {args} {
  global reg_display max_regs
  set reg_display_list {}
  set regnames [gdb_regnames -numbers]

  set i 1
  set x 0
  foreach r $regnames {
    incr x
    set name [lindex $r 0]
    set rn   [lindex $r 1]
    set reg_display($rn,name) $name

    # All registers shall be considered editable
    # and non-typed until proved otherwise
    set reg_display($rn,typed) 0
    set reg_display($rn,editable) 0

    # If user has no preference, show register in hex (if we can)
    set format [pref getd gdb/reg/$name-format]
    if {$format == ""} { set format x }
    set reg_display($rn,format) $format

    # Check if the user prefers not to show this register
    if {$args != "" && [pref getd gdb/reg/$name] == "no"} {
      set all_regs_shown 0
      set reg_display($rn,line) 0
    } else {
      set reg_display($rn,line) $i
      lappend reg_display_list $rn
      incr i
    }
  }

  set num_regs [expr {$i - 1}]
  set max_regs $x
  set reg_names_dirty 0
}

body RegWin::handle_set_hook {var value} {
  switch $var {
    disassembly-flavor {
        disassembly_changed
    } 
  }
}

body RegWin::disassembly_changed {} {
  set reg_names_dirty 1
}
# ------------------------------------------------------------------------------
# NAME: save_reg_display_vars
# DESC: save the list of displayed registers to the preferences file.
# ------------------------------------------------------------------------------
body RegWin::save_reg_display_vars {} {
  global reg_display max_regs
  set regnames [gdb_regnames -numbers]
  foreach r $regnames {
    set rn   [lindex $r 1]
    set name $reg_display($rn,name)
    if {$reg_display($rn,line) == 0} {
      pref setd gdb/reg/$name no
      } else {
	pref setd gdb/reg/$name {}
      }
    if {$reg_display($rn,format) != "x"} {
      pref setd gdb/reg/$name-format $reg_display($rn,format)
    } else {
      pref setd gdb/reg/$name-format {}
    }
  }
  pref_save ""
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  reg_select_up
# ------------------------------------------------------------------
body RegWin::reg_select_up { } {
  if { $selected == -1 || $Running} {
    return
  }
  set current_index [lsearch -exact $reg_display_list $selected]
  set new_reg [lindex $reg_display_list [expr {$current_index - 1}]]
  if { $new_reg != {} } {
    $this reg_select $new_reg
  }
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  reg_select_down
# ------------------------------------------------------------------
body RegWin::reg_select_down { } {
  if { $selected == -1 || $Running} {
    return
  }
  set current_index [lsearch -exact $reg_display_list $selected]
  set new_reg [lindex $reg_display_list [expr {$current_index + 1}]]
  if { $new_reg != {} } {
      $this reg_select $new_reg
  }
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  reg_select_right
# ------------------------------------------------------------------
body RegWin::reg_select_right { } {
  if { $selected == -1 || $Running} {
    return
  }
  set current_index [lsearch -exact $reg_display_list $selected]
  set new_reg [lindex $reg_display_list [expr {$current_index + $nRows}]]
  if { $new_reg != {} } {
    $this reg_select $new_reg
  }
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  reg_select_left
# ------------------------------------------------------------------
body RegWin::reg_select_left { } {
  if { $selected == -1 || $Running} {
    return
  }
  set current_index [lsearch -exact $reg_display_list $selected]
  set new_reg [lindex $reg_display_list [expr {$current_index - $nRows}]]
  if { $new_reg != {} } {
    $this reg_select $new_reg
  }
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  reg_select - select a register
# ------------------------------------------------------------------
body RegWin::reg_select { r } {
  global reg_display tixOption 
  
  if {$Running} { return }
  if {$selected != -1} {
    catch {$ScrolledWin.$selected.lbl configure -fg $tixOption(fg) -bg $tixOption(bg)}
    catch {$ScrolledWin.$selected.val configure -fg $tixOption(fg) \
	     -bg $tixOption(input1_bg)}
  }
  
  # if we click on the same line, unselect it and return
  if {$selected == $r} {
    set selected -1
    $itk_interior.m.reg entryconfigure 0 -state disabled
    $itk_interior.m.reg entryconfigure 2 -state disabled
    for {set i 0} {$i < 6} {incr i} {
      $itk_interior.m.reg.format entryconfigure $i -state disabled
    }
    return
  }
  
  if {$Editing != -1} {
    unedit
  }
  
  $ScrolledWin.$r.lbl configure -fg $tixOption(select_fg) -bg $tixOption(select_bg)
  $ScrolledWin.$r.val configure -fg $tixOption(fg) -bg $tixOption(bg)
  
  if {![pref get gdb/mode] && $reg_display($r,editable)} {
    $itk_interior.m.reg entryconfigure 0 -state normal -command "$this edit $r"
  }
  $itk_interior.m.reg entryconfigure 2 -state normal \
    -command "$this delete_from_display_list $r"
  if {$reg_display($r,typed)} {
    set state disabled
  } else {
    set state normal
  }
  for {set i 0} {$i < 6} {incr i} {
    debug "RegWin format $i $state"
    $itk_interior.m.reg.format entryconfigure $i -state $state \
      -variable reg_display($r,format)
  }
  $itk_interior.m.reg entryconfigure 4 -state normal \
    -command "$this addToWatch $r"
  focus -force $ScrolledWin.$r
  set selected $r
}

# ------------------------------------------------------------------
# PRIVATE METHOD:  dimensions - determine square-like dimensions for
#          register window
# ------------------------------------------------------------------
body RegWin::dimensions {} {
  set rows [pref get gdb/reg/rows]
  #    set rows [expr int(floor(sqrt($num_regs)))]
  set cols [expr {int(ceil(sqrt($num_regs)))}]
  
  return [list $rows $cols]
}

# ------------------------------------------------------------------------------
# NAME: 
#	private method RegWin::fixLength
#
# SYNOPSIS:
#	fixLength {s size where}
#	
# DESC: 
#	Makes a string into a fixed-length string, inserting spaces as
#	necessary. If 'where' is "left" spaces will be added to the left,
#	if 'where' is "right" spaces will be added to the right.
# ARGS:
#	s - input string
#	size - size of string to output
#	where - "left" or "right"
#
# RETURNS: 
#	Padded string of length 'size'
#
# NOTES: 
#	This should really be a proc, not a method.
# ------------------------------------------------------------------------------
body RegWin::fixLength {s size where} {
  set blank "                                                                   "
  set len [string length $s]
  set bl  [expr {$size - $len}]
  set b [string range $blank 0 $bl]
  
  switch $where {
    left  { set fl "$s$b"}
    right { set fl "$b$s"}
  }
  return $fl
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  but3 - generate and display a popup window on button 3 
#  over the register value
# ------------------------------------------------------------------
body RegWin::but3 {rn X Y} {
  global reg_display max_regs
  
  if {!$Running} {
    $Menu delete 0 end
    $Menu add command -label $reg_display($rn,name) -state disabled
    $Menu add separator
    if {!$reg_display($rn,typed)} {
      $Menu add radio -label "Hex" -command "$this update" \
        -value x -variable reg_display($rn,format)
      $Menu add radio -label "Decimal" -command "$this update" \
        -value d -variable reg_display($rn,format)
      $Menu add radio -label "Natural" -command "$this update" \
        -value {} -variable reg_display($rn,format)
      $Menu add radio -label "Binary" -command "$this update" \
        -value t -variable reg_display($rn,format) -underline 0
      $Menu add radio -label "Octal" -command "$this update" \
        -value o -variable reg_display($rn,format)
      $Menu add radio -label "Raw" -command "$this update" \
        -value r -variable reg_display($rn,format)
      $Menu add separator
    }
    $Menu add command  -command "$this addToWatch $rn" \
      -label "Add $reg_display($rn,name) to Watch"
    $Menu add separator
    $Menu add command  -command "$this delete_from_display_list $rn" \
      -label "Remove $reg_display($rn,name) from Display"
    if {$max_regs != $num_regs} {
      $Menu add separator
      $Menu add command -command "$this display_all" \
	-label "Display all registers"
    }
    tk_popup $Menu $X $Y
  }
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  display_all - add all registers to the display list
# ------------------------------------------------------------------
body RegWin::display_all {} {
  init_reg_display_vars
  $itk_interior.m.reg entryconfigure $disp_all_menu_item -state disabled
  set all_regs_shown 1
  reconfig
}

# ------------------------------------------------------------------
#  PUBLIC METHOD:  delete_from_display_list - remove a register from the
#  display list
# ------------------------------------------------------------------
body RegWin::delete_from_display_list {rn} {
  global reg_display max_regs
  set reg_display($rn,line) 0
  set reg_display_list {}
  set regnames [gdb_regnames -numbers]
  set i 0
  foreach r $regnames {
    set rnx [lindex $r 1]
    if {$reg_display($rnx,line) > 0} {
      lappend reg_display_list $rnx
      incr i
      set reg_display($rnx,line) $i
    }
  }
  set num_regs $i
  reconfig
  $itk_interior.m.reg entryconfigure 6 -state normal
}



# ------------------------------------------------------------------
#  PUBLIC METHOD:  edit - edit a cell
# ------------------------------------------------------------------
body RegWin::edit {r} {
  global reg_display
  if {$Running} { return }
  if {!$reg_display($r,editable)} {return}
  unedit
  
  set Editing $r
  set txt [$ScrolledWin.$r.val cget -text]
  set len [string length $txt]
  set entry [entry $ScrolledWin.$r.ent -width $len -bd 0 -font src-font]
  $entry insert 0 $txt
  
  grid remove $ScrolledWin.$r.val
  grid $entry -row 0 -col 1
  bind $entry <Return> "$this acceptEdit $r"
  bind $entry <Escape> "$this unedit"
  $entry selection to end
  focus $entry    
}

# ------------------------------------------------------------------
# PUBLIC METHOD:  acceptEdit - callback invoked when enter key pressed
#          in an editing entry
# ------------------------------------------------------------------
body RegWin::acceptEdit {r} {
  global reg_display
  
  set value [string trimleft [$ScrolledWin.$r.ent get]]
  debug "value=${value}="
  if {$value == ""} {
    set value 0
  }
  if {[catch {gdb_cmd "set \$$reg_display($r,name)=$value"} result]} {
    tk_messageBox -icon error -type ok -message $result \
      -title "Error in Expression" -parent [winfo toplevel $itk_interior]
    focus $ScrolledWin.$r.ent
    $ScrolledWin.$r.ent selection to end
  } else {
    unedit
    gdbtk_update
  }
}

# ------------------------------------------------------------------
# PUBLIC METHOD:  addToWatch - add a register to the watch window
# ------------------------------------------------------------------
body RegWin::addToWatch {reg} {
  global reg_display
  [ManagedWin::open WatchWin] add "\$$reg_display($reg,name)"
}

# ------------------------------------------------------------------
# PUBLIC METHOD:  unedit - clear any editing entry on the screen
# ------------------------------------------------------------------
body RegWin::unedit {} {
  if {$Editing != -1} {
    destroy $ScrolledWin.$Editing.ent
    
    # Fill the entry with the old label, updating value
    grid $ScrolledWin.$Editing.val -column 1 -row 0
    focus -force $ScrolledWin.$Editing
    set Editing -1
    update
  }
}

# ------------------------------------------------------------------
#  PRIVATE METHOD:  update - update widget when PC changes
# ------------------------------------------------------------------
body RegWin::update {} {
  global reg_display
  debug "START REGISTER UPDATE CALLBACK"
  if {$reg_display_list == ""
      || [catch {eval gdb_changed_register_list $reg_display_list} changed_reg_list]} {
    set changed_reg_list {}
  }
  
  set row 0
  set col 0
  foreach r $reg_display_list {
    if {$row == 0} {
      # A minimum of 10 so the appearence is nice
      set vmax($col) 10
    }

    # Typed registers natural values start with a brace (escaped by a slash)
    if {[catch {gdb_fetch_registers {} $r} valtest]} {
      set values($r) ""
    } else {
      if {[string index $valtest 1] == "\{"} {
        # If it is a typed register, we print it raw
        set format r
        set reg_display($r,format) r
        set reg_display($r,typed) 1
        set reg_display($r,editable) 0
      } else {
        set format $reg_display($r,format)
        set reg_display($r,editable) 1
      }
      if {[catch {gdb_fetch_registers $format $r} values($r)]} {
        set values($r) ""
      } else {
        set values($r) [string trim $values($r) \ ]
      }
    }

    set l [string length $values($r)]
    if {$l > $vmax($col)} {
      set vmax($col) $l
    }
    incr row
    if {$row == $nRows} {
      set row 0
      incr col
    }
  }
  
  set row 0
  set col 0
  foreach r $reg_display_list {
    if {[lsearch -exact $changed_reg_list $r] != -1} {
      set fg $HighlightForeground
    } else {
      set fg $NormalForeground
    }
    $ScrolledWin.$r.val configure -text [fixLength $values($r) $vmax($col) right] \
      -fg $fg
    incr row
    if {$row == $nRows} {
      set row 0
      incr col
    }
  }
  debug "END REGISTER UPDATE CALLBACK" 
}

body RegWin::idle {} {
  [winfo toplevel $itk_interior] configure -cursor {}
  set Running 0
}

# ------------------------------------------------------------------
#  PRIVATE METHOD:  reconfig - used when preferences change
# ------------------------------------------------------------------
body RegWin::reconfig {} {
  if {$reg_names_dirty} {
    init_reg_display_vars
  }
  destroy $Menu $itk_interior.g $itk_interior.scrolled $itk_interior.m
  gdbtk_busy
  build_win
  gdbtk_idle
}
  
# ------------------------------------------------------------------
#  PRIVATE METHOD:  busy - gdb_busy_hook
# ------------------------------------------------------------------
body RegWin::busy {} {
  # Cancel edits
  unedit
  
  # Fencepost
  set Running 1
  
  # cursor
  [winfo toplevel $itk_interior] configure -cursor watch
}