You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
384 lines
14 KiB
384 lines
14 KiB
Index: CHANGES.RSE |
|
=================================================================== |
|
RCS file: CHANGES.RSE |
|
diff -N CHANGES.RSE |
|
--- /dev/null Thu Nov 21 21:45:01 2002 |
|
+++ CHANGES.RSE Thu Nov 21 21:45:22 2002 |
|
@@ -0,0 +1,19 @@ |
|
+ |
|
+ The following changes were made by Ralf S. Engelschall <rse@engelschall.com> |
|
+ to the excellent Curses::UI 0.71 by Maurice Makaay <maurice@gitaar.net>. |
|
+ |
|
+ o Make sure that Curses::UI::Listbox draws the selected values in bold |
|
+ also under "multi" and "radio" options to be consistent in look & |
|
+ feel with the standard list box. |
|
+ |
|
+ o Add support for root->overlapping(1) (default) and |
|
+ root->overlapping(0) to optimize the redrawing by reducing to |
|
+ the old and new focused widgets. The default is still to redraw |
|
+ everything which is necessary to support overlapping windows. |
|
+ |
|
+ o Add -reverse option to Curses::UI::TextEditor. |
|
+ |
|
+ o Add color support. |
|
+ |
|
+ o Fix reverse rendering for Label demo in demo-widgets. |
|
+ |
|
Index: lib/Curses/UI.pm |
|
=================================================================== |
|
RCS file: lib/Curses/UI.pm,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.3 |
|
diff -u -d -u -d -r1.1.1.1 -r1.3 |
|
--- lib/Curses/UI.pm 2002/11/20 15:00:33 1.1.1.1 |
|
+++ lib/Curses/UI.pm 2002/11/21 20:44:25 1.3 |
|
@@ -65,6 +65,8 @@ |
|
-cursor_mode => 0, # What is the current cursor_mode? |
|
-debug => undef, # Turn on debugging mode? |
|
-language => undef, # Which language to use? |
|
+ -overlapping => 1, # Whether overlapping widgets are supported |
|
+ -colors => 0, # Whether colors are used |
|
|
|
%userargs, |
|
|
|
@@ -118,6 +120,8 @@ |
|
sub clear_on_exit(;$) { shift()->accessor('-clear_on_exit', shift()) } |
|
sub cursor_mode(;$) { shift()->accessor('-cursor_mode', shift()) } |
|
sub lang(;$) { shift()->accessor('-language_object', shift()) } |
|
+sub overlapping(;$) { shift()->accessor('-overlapping', shift()) } |
|
+sub colors(;$) { shift()->accessor('-colors', shift()) } |
|
|
|
# TODO: document |
|
sub debug(;$) |
|
@@ -128,6 +132,61 @@ |
|
} |
|
|
|
# ---------------------------------------------------------------------- |
|
+# Color support |
|
+# ---------------------------------------------------------------------- |
|
+ |
|
+$Curses::UI::colorpairs = 0; |
|
+$Curses::UI::colorpair = {}; |
|
+ |
|
+sub colorpair ($$;$$) |
|
+{ |
|
+ my $this = shift; |
|
+ my ($name, $fg, $bg) = @_; |
|
+ my $colors_name2num = { |
|
+ 'black' => COLOR_BLACK, |
|
+ 'red' => COLOR_RED, |
|
+ 'green' => COLOR_GREEN, |
|
+ 'yellow' => COLOR_YELLOW, |
|
+ 'blue' => COLOR_BLUE, |
|
+ 'magenta' => COLOR_MAGENTA, |
|
+ 'cyan' => COLOR_CYAN, |
|
+ 'white' => COLOR_WHITE |
|
+ }; |
|
+ |
|
+ if (not $this->{-colors}) { |
|
+ return 0; |
|
+ } |
|
+ if (not defined($fg) and not defined($bg)) { |
|
+ return ($Curses::UI::colorpair->{$name} || 0); |
|
+ } |
|
+ else { |
|
+ my $n = $Curses::UI::colorpair->{$name}; |
|
+ if (not defined($n)) { |
|
+ $Curses::UI::colorpairs++; |
|
+ $n = $Curses::UI::colorpairs; |
|
+ } |
|
+ $fg = $colors_name2num->{$fg} || 'default'; |
|
+ if ($fg eq 'default') { |
|
+ my ($fg_d, $bg_d) = (0, 0); |
|
+ pair_content(0, $fg_d, $bg_d); |
|
+ $fg = $fg_d; |
|
+ } |
|
+ $bg = $colors_name2num->{$bg} || 'default'; |
|
+ if ($bg eq 'default') { |
|
+ my ($fg_d, $bg_d) = (0, 0); |
|
+ pair_content(0, $fg_d, $bg_d); |
|
+ $bg = $bg_d; |
|
+ } |
|
+ init_pair($n, $fg, $bg); |
|
+ if ($name eq 'default') { |
|
+ assume_default_colors($fg, $bg); |
|
+ } |
|
+ $Curses::UI::colorpair->{$name} = $n; |
|
+ return $n; |
|
+ } |
|
+} |
|
+ |
|
+# ---------------------------------------------------------------------- |
|
# Window resizing support |
|
# ---------------------------------------------------------------------- |
|
|
|
@@ -143,6 +202,23 @@ |
|
initscr(); |
|
noecho(); |
|
raw(); |
|
+ |
|
+ # Color support |
|
+ if ($this->{-colors}) { |
|
+ if (has_colors()) { |
|
+ start_color(); |
|
+ #my $bg = -1; |
|
+ #use_default_colors(); |
|
+ my $bg = COLOR_BLACK; |
|
+ assume_default_colors(COLOR_WHITE, $bg); |
|
+ $Curses::UI::colorpair->{"default"} = 0; |
|
+ $Curses::UI::colorpairs = 1; |
|
+ $this->colorpair('selected', 'default', 'default'); |
|
+ } |
|
+ else { |
|
+ $this->{-colors} = 0; |
|
+ } |
|
+ } |
|
|
|
# Mouse events if possible |
|
my $old = 0; |
|
Index: lib/Curses/UI/Label.pm |
|
=================================================================== |
|
RCS file: /u/rse/wrk/cui/cvs/cui/lib/Curses/UI/Label.pm,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.2 |
|
diff -u -d -u -d -r1.1.1.1 -r1.2 |
|
--- lib/Curses/UI/Label.pm 2002/11/20 15:00:33 1.1.1.1 |
|
+++ lib/Curses/UI/Label.pm 2002/11/21 18:14:03 1.2 |
|
@@ -50,6 +50,7 @@ |
|
-dim => 0, |
|
-blink => 0, |
|
-paddingspaces => 0, # Pad text with spaces? |
|
+ -colorpair => undef, # Color-pair attribute |
|
|
|
%userargs, |
|
|
|
@@ -103,6 +104,7 @@ |
|
sub underline ($;$) { shift()->set_attribute('-underline', shift()) } |
|
sub dim ($;$) { shift()->set_attribute('-dim', shift()) } |
|
sub blink ($;$) { shift()->set_attribute('-blink', shift()) } |
|
+sub colorpair ($;$) { shift()->set_attribute('-colorpair', shift()) } |
|
|
|
sub set_attribute($$;) |
|
{ |
|
@@ -182,6 +184,7 @@ |
|
$this->{-canvasscr}->attron(A_UNDERLINE) if $this->{-underline}; |
|
$this->{-canvasscr}->attron(A_BLINK) if $this->{-blink}; |
|
$this->{-canvasscr}->attron(A_DIM) if $this->{-dim}; |
|
+ $this->{-canvasscr}->attron(COLOR_PAIR($this->root->colorpair($this->{-colorpair}))) if $this->{-colorpair}; |
|
|
|
# Draw the text. Clip it if it is too long. |
|
my $ypos = 0; |
|
Index: lib/Curses/UI/Listbox.pm |
|
=================================================================== |
|
RCS file: /u/rse/wrk/cui/cvs/cui/lib/Curses/UI/Listbox.pm,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.2 |
|
diff -u -d -u -d -r1.1.1.1 -r1.2 |
|
--- lib/Curses/UI/Listbox.pm 2002/11/20 15:00:33 1.1.1.1 |
|
+++ lib/Curses/UI/Listbox.pm 2002/11/21 18:14:03 1.2 |
|
@@ -289,10 +289,12 @@ |
|
} |
|
|
|
# Show selected element bold. |
|
- if (not $this->{-multi} and |
|
- not $this->{-radio} and |
|
- defined $this->{-selected} and |
|
- $this->{-selected} == $i) { |
|
+ if ( ( not $this->{-multi} |
|
+ and defined $this->{-selected} |
|
+ and $this->{-selected} == $i) |
|
+ or ( $this->{-multi} |
|
+ and defined $this->{-selected} |
|
+ and $this->{-selected}->{$i}) ) { |
|
$this->{-canvasscr}->attron(A_BOLD); |
|
} |
|
|
|
Index: lib/Curses/UI/TextEditor.pm |
|
=================================================================== |
|
RCS file: /u/rse/wrk/cui/cvs/cui/lib/Curses/UI/TextEditor.pm,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.2 |
|
diff -u -d -u -d -r1.1.1.1 -r1.2 |
|
--- lib/Curses/UI/TextEditor.pm 2002/11/20 15:00:34 1.1.1.1 |
|
+++ lib/Curses/UI/TextEditor.pm 2002/11/21 20:13:17 1.2 |
|
@@ -150,6 +150,7 @@ |
|
-vscrollbar => 0, # show vertical scrollbar |
|
-hscrollbar => 0, # show horizontal scrollbar |
|
-readonly => 0, # only used as viewer? |
|
+ -reverse => 0, # show in reverse |
|
|
|
# Single line options |
|
-password => undef, # masquerade chars with given char |
|
@@ -450,9 +451,10 @@ |
|
|
|
# Turn on underlines and fill the screen with lines |
|
# if neccessary. |
|
- if ($this->{-showlines}) |
|
+ if ($this->{-showlines} or $this->{-reverse}) |
|
{ |
|
- $this->{-canvasscr}->attron(A_UNDERLINE); |
|
+ $this->{-canvasscr}->attron(A_UNDERLINE) if ($this->{-showlines});; |
|
+ $this->{-canvasscr}->attron(A_REVERSE) if ($this->{-reverse}); |
|
for my $y (0..$this->canvasheight-1) { |
|
$this->{-canvasscr}->addstr($y, 0, " "x($this->canvaswidth)); |
|
} |
|
@@ -463,9 +465,11 @@ |
|
{ |
|
if (defined $this->{-search_highlight} |
|
and $this->{-search_highlight} == ($id+$this->{-yscrpos})) { |
|
- $this->{-canvasscr}->attron(A_REVERSE); |
|
+ $this->{-canvasscr}->attron(A_REVERSE) if (not $this->{-reverse}); |
|
+ $this->{-canvasscr}->attroff(A_REVERSE) if ($this->{-reverse}); |
|
} else { |
|
- $this->{-canvasscr}->attroff(A_REVERSE); |
|
+ $this->{-canvasscr}->attroff(A_REVERSE) if (not $this->{-reverse}); |
|
+ $this->{-canvasscr}->attron(A_REVERSE) if ($this->{-reverse}); |
|
} |
|
|
|
my $l = $this->{-scr_lines}->[$id + $this->{-yscrpos}]; |
|
@@ -559,6 +563,7 @@ |
|
} |
|
|
|
$this->{-canvasscr}->attroff(A_UNDERLINE) if $this->{-showlines}; |
|
+ $this->{-canvasscr}->attroff(A_REVERSE) if $this->{-reverse}; |
|
$this->{-canvasscr}->noutrefresh(); |
|
doupdate() unless $no_doupdate; |
|
return $this; |
|
Index: lib/Curses/UI/Widget.pm |
|
=================================================================== |
|
RCS file: /u/rse/wrk/cui/cvs/cui/lib/Curses/UI/Widget.pm,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.2 |
|
diff -u -d -u -d -r1.1.1.1 -r1.2 |
|
--- lib/Curses/UI/Widget.pm 2002/11/20 15:00:33 1.1.1.1 |
|
+++ lib/Curses/UI/Widget.pm 2002/11/21 18:14:03 1.2 |
|
@@ -460,7 +460,7 @@ |
|
my $parent = $this->parent; |
|
$parent->focus($this) if defined $parent; |
|
|
|
- $this->draw(1); |
|
+ $this->draw(1) if ($this->root->overlapping); |
|
return $this; |
|
} |
|
|
|
@@ -511,6 +511,7 @@ |
|
if ($this->{-sbborder}) # Square bracket ([,]) border |
|
{ |
|
$this->{-borderscr}->attron(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attron(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
my $offset = 1; |
|
$offset++ if $this->{-vscrollbar}; |
|
for my $y (0 .. $this->{-sh}-1) |
|
@@ -520,10 +521,12 @@ |
|
$this->{-borderscr}->addstr($rel_y, $this->{-bw}-$offset, ']'); |
|
} |
|
$this->{-borderscr}->attroff(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attroff(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
} |
|
elsif ($this->{-border}) # Normal border |
|
{ |
|
$this->{-borderscr}->attron(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attron(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
if ($this->root->compat) { |
|
$this->{-borderscr}->border( |
|
'|','|','-','-', |
|
@@ -533,6 +536,7 @@ |
|
$this->{-borderscr}->box(ACS_VLINE, ACS_HLINE); |
|
} |
|
$this->{-borderscr}->attroff(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attroff(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
|
|
# Draw a title if needed. |
|
if (defined $this->{-title}) |
|
@@ -612,6 +616,7 @@ |
|
# Draw the base of the scrollbar, in case |
|
# there is no border. |
|
$this->{-borderscr}->attron(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attron(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
$this->{-borderscr}->move($ypos_min, $xpos); |
|
$this->{-borderscr}->vline(ACS_VLINE,$scrlen); |
|
if ($this->root->compat) { |
|
@@ -620,6 +625,7 @@ |
|
$this->{-borderscr}->vline(ACS_VLINE,$scrlen); |
|
} |
|
$this->{-borderscr}->attroff(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attroff(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
|
|
# Should an active region be drawn? |
|
my $scroll_active = ($this->{-vscrolllen} > $scrlen); |
|
@@ -677,6 +683,7 @@ |
|
# Draw the base of the scrollbar, in case |
|
# there is no border. |
|
$this->{-borderscr}->attron(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attron(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
$this->{-borderscr}->move($ypos, $xpos_min); |
|
if ($this->root->compat) { |
|
$this->{-borderscr}->hline('-',$scrlen); |
|
@@ -684,6 +691,7 @@ |
|
$this->{-borderscr}->hline(ACS_HLINE,$scrlen); |
|
} |
|
$this->{-borderscr}->attroff(A_BOLD) if $this->{-focus}; |
|
+ $this->{-borderscr}->attroff(COLOR_PAIR($this->root->colorpair('selected'))) if $this->{-focus}; |
|
|
|
# Should an active region be drawn? |
|
my $scroll_active = ($this->{-hscrolllen} > $scrlen); |
|
@@ -943,6 +951,8 @@ |
|
my $show_cursor = $this->{-nocursor} ? 0 : 1; |
|
$this->root->cursor_mode($show_cursor); |
|
|
|
+ $this->draw(1) if (not $this->root->overlapping); |
|
+ |
|
return $this; |
|
} |
|
|
|
@@ -951,6 +961,7 @@ |
|
my $this = shift; |
|
$this->{-focus} = 0; |
|
$this->run_event('-onblur'); |
|
+ $this->draw(1) if (not $this->root->overlapping); |
|
return $this; |
|
} |
|
|
|
Index: examples/demo-widgets |
|
=================================================================== |
|
RCS file: /u/rse/wrk/cui/cvs/cui/examples/demo-widgets,v |
|
retrieving revision 1.1.1.1 |
|
retrieving revision 1.4 |
|
diff -u -d -u -d -r1.1.1.1 -r1.4 |
|
--- examples/demo-widgets 2002/11/20 15:00:36 1.1.1.1 |
|
+++ examples/demo-widgets 2002/11/21 20:14:59 1.4 |
|
@@ -1,5 +1,10 @@ |
|
-#!/usr/bin/perl -w |
|
+#!/usr/lpkg/bin/perl -w |
|
use strict; |
|
+use lib "../lib"; |
|
+ |
|
+# make KEY_BTAB (shift-tab) working in XTerm |
|
+# and also at the same time enable colors |
|
+$ENV{TERM} = "xterm-vt220" if ($ENV{TERM} eq 'xterm'); |
|
|
|
my $debug = 0; |
|
if (@ARGV and $ARGV[0] eq '-d') { |
|
@@ -19,7 +24,10 @@ |
|
my $cui = new Curses::UI ( |
|
-clear_on_exit => 1, |
|
-debug => $debug, |
|
+ -colors => 1, |
|
); |
|
+$cui->colorpair('selected', 'red', 'default'); |
|
+$cui->colorpair('white-on-red', 'white', 'red'); |
|
|
|
# Demo index |
|
my $current_demo = 1; |
|
@@ -147,9 +155,10 @@ |
|
|
|
$w{1}->add(undef,'Label',-text=>"dim font",-y=>5,-dim=>1 ); |
|
$w{1}->add(undef,'Label',-text=>"bold font",-y=>7,-bold=>1 ); |
|
-$w{1}->add(undef,'Label',-text=>"reversed font",-y=>9,-reversed => 1 ); |
|
+$w{1}->add(undef,'Label',-text=>"reversed font",-y=>9,-reverse => 1 ); |
|
$w{1}->add(undef,'Label',-text=>"underlined font",-x=>15,-y=>5,-underline=>1 ); |
|
$w{1}->add(undef,'Label',-text=>"blinking font",-x=>15,-y=>7,-blink=>1 ); |
|
+$w{1}->add(undef,'Label',-text=>"colorized font",-x=>15,-y=>9,-colorpair => 'white-on-red' ); |
|
|
|
# ---------------------------------------------------------------------- |
|
# Buttons demo
|
|
|