# Copyright (c) 2003, Mikhael Goikhman # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License 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. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package FVWM::Tracker::Colorsets; use strict; use FVWM::Tracker qw(base); use General::Parse; use constant CS_FIELDS => qw( fg bg hilite shadow fgsh tint icon_tint pixmap shape_mask fg_alpha_percent width height pixmap_type shape_width shape_height shape_type tint_percent do_dither_icon icon_tint_percent icon_alpha_percent ); use constant PIXMAP_TYPES => qw( PIXMAP_TILED PIXMAP_STRETCH_X PIXMAP_STRETCH_Y PIXMAP_STRETCH PIXMAP_STRETCH_ASPECT PIXMAP_ROOT_PIXMAP_PURE PIXMAP_ROOT_PIXMAP_TRAN ); sub observables ($) { return [ "colorset changed", ]; } sub start ($) { my $self = shift; # just an extra debug service for developers $self->{module}->emulateEvent(M_CONFIG_INFO, [ 0, 0, 0, "Colorset 0 0 00c0c0 00e0e0 00a0a0 007070 0 0 0 0 64 0 0 0 0 0 0 0 0 0 64" ]) if $self->{module}->isDummy; $self->{data} = {}; $self->addHandler(M_CONFIG_INFO, sub { my $event = $_[1]; $self->calculateInternals($event->args); }); $self->requestConfigInfoEvents; my $result = $self->SUPER::start; $self->deleteHandlers; $self->addHandler(M_CONFIG_INFO, sub { my $event = $_[1]; my ($num, $oldHash) = $self->calculateInternals($event->args); return unless defined $num; $self->notify("colorset changed", $num, $oldHash); }); return $result; } sub calculateInternals ($$) { my $self = shift; my $args = shift; my $data = $self->{data}; my $text = $args->{text}; $self->internalDie("No 'text' arg in M_CONFIG_INFO") unless defined $text; return undef if $text !~ /^colorset ([\da-f]+) ([\da-f ]+)$/i; my $num = hex($1); my @numbers = getTokens($2); return undef if @numbers != CS_FIELDS; # memory used for keys may be optimized later my $newHash = {}; my $i = 0; foreach (CS_FIELDS) { $newHash->{$_} = hex($numbers[$i++]); } my $oldHash = $data->{$num}; $data->{$num} = $newHash; return wantarray? ($num, $oldHash): $num; } sub data ($;$) { my $self = shift; my $num = shift; my $data = $self->{data}; return $data unless defined $num; return $data->{$num}; } sub dump ($;$) { my $self = shift; my $num = shift; my $data = $self->{data}; return "Colorset $num is unknown\n" if defined $num && !$data->{$num}; my @nums = defined $num? ($num): sort { "$a$b" =~ /^\d+$/? $a <=> $b: $a cmp $b } keys %$data; my $string = ""; foreach (@nums) { my $csHash = $data->{$_}; $string .= "Colorset $_"; my $i = 0; foreach (CS_FIELDS) { my $value = $csHash->{$_}; $i++; next if $i > 5 && ($value == 0 || /alpha_percent$/ && $value == 100); $value = sprintf("#%06lx", $value) if $i <= 7; $value = sprintf("0x%07lx", $value) if /pixmap$/; $string .= " $_=$value"; } $string .= "\n"; } return $string; } 1; __END__ =head1 DESCRIPTION This is a subclass of B that enables to read the colorset definitions. This tracker defines the following observable: "colorset changed" that is notified using 2 additional parameters: colorset number and old colorset data hash ref. =head1 SYNOPSYS Using B $module object: my $csTracker = $module->track("Colorsets"); my $csHash = $csTracker->data; my $cs2_fg = $csHash->{2}->{fg} || 'black'; my $cs5_bg = $csTracker->data(5)->{bg} || 'gray'; $csTracker->observe(sub { my ($module, $tracker, $data, $num, $oldHash) = @_; my $newHash = $data->{$num}; if ($oldHash->{pixmap} == 0 && $newHash->{pixmap}) { my $pixmapType = $newHash->{pixmap_type}; my $pixmapName = ($tracker->PIXMAP_TYPES)[$pixmapType]; $module->debug("Colorset: $num, Pixmap type: $pixmapName"); } }; =head1 OVERRIDDEN METHODS =over 4 =item B [I] Returns either array ref of colorset hash refs, or one hash ref if I is given. The hash keys are listed in CS_FIELDS, the constant of this class. =item B [I] Works similarly to B, but returns debug line(s) for one or all colorsets. =back =head1 AUTHOR Mikhael Goikhman . =head1 SEE ALSO For more information, see L and L. =cut