Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | package Tk::X11Font; |
2 | use vars qw($VERSION); | |
3 | $VERSION = '3.013'; # $Id: //depot/Tk8/Tk/X11Font.pm#13 $ | |
4 | ||
5 | require Tk::Widget; | |
6 | require Tk::Xlib; | |
7 | use strict; | |
8 | ||
9 | Construct Tk::Widget 'X11Font'; | |
10 | ||
11 | my @field = qw(foundry family weight slant swidth adstyle pixel | |
12 | point xres yres space avgwidth registry encoding); | |
13 | ||
14 | map { eval "sub \u$_ { shift->elem('$_', \@_) }" } @field; | |
15 | ||
16 | use overload '""' => 'as_string'; | |
17 | ||
18 | sub new | |
19 | { | |
20 | my $pkg = shift; | |
21 | my $w = shift; | |
22 | ||
23 | my %me = (); | |
24 | my $d = $w->Display; | |
25 | ||
26 | local $_; | |
27 | ||
28 | if(scalar(@_) == 1) | |
29 | { | |
30 | my $pattern = shift; | |
31 | ||
32 | if($pattern =~ /\A(-[^-]*){14}\Z/) | |
33 | { | |
34 | @me{@field} = split(/-/, substr($pattern,1)); | |
35 | } | |
36 | else | |
37 | { | |
38 | $me{Name} = $pattern; | |
39 | ||
40 | if($pattern =~ /^[^-]?-([^-]*-){2,}/) | |
41 | { | |
42 | my $f = $d->XListFonts($pattern,1); | |
43 | ||
44 | if($f && $f =~ /\A(-[^-]*){14}/) | |
45 | { | |
46 | my @f = split(/-/, substr($f,1)); | |
47 | my @n = split(/-/, $pattern); | |
48 | my %f = (); | |
49 | my $i = 0; | |
50 | ||
51 | shift @n if($pattern =~ /\A-/); | |
52 | ||
53 | while(@n && @f) | |
54 | { | |
55 | if($n[0] eq '*') | |
56 | { | |
57 | shift @n; | |
58 | } | |
59 | elsif($n[0] eq $f[0]) | |
60 | { | |
61 | $f{$field[$i]} = shift @n; | |
62 | } | |
63 | $i++; | |
64 | shift @f; | |
65 | } | |
66 | ||
67 | %me = %f | |
68 | unless(@n); | |
69 | } | |
70 | } | |
71 | } | |
72 | } | |
73 | else | |
74 | { | |
75 | %me = @_; | |
76 | } | |
77 | ||
78 | map { $me{$_} ||= '*' } @field; | |
79 | ||
80 | $me{Display} = $d; | |
81 | $me{MainWin} = $w->MainWindow; | |
82 | ||
83 | bless \%me, $pkg; | |
84 | } | |
85 | ||
86 | sub Pattern | |
87 | { | |
88 | my $me = shift; | |
89 | return join('-', '',@{$me}{@field}); | |
90 | } | |
91 | ||
92 | sub Name | |
93 | { | |
94 | my $me = shift; | |
95 | my $max = wantarray ? shift || 128 : 1; | |
96 | ||
97 | if ($^O eq 'MSWin32' or ($^O eq 'cygwin' and $Tk::platform eq 'MSWin32')) | |
98 | { | |
99 | my $name = $me->{Name}; | |
100 | if (!defined $name) | |
101 | { | |
102 | my $fm = $me->{'family'} || 'system'; | |
103 | my $sz = -int($me->{'point'}/10) || -($me->{'pixel'}) || 12; | |
104 | my @opt = (-family => $fm, -size => $sz ); | |
105 | my $wt = $me->{'weight'}; | |
106 | if (defined $wt) | |
107 | { | |
108 | $wt = 'normal' unless $wt =~ /bold/i; | |
109 | push(@opt,-weight => lc($wt)); | |
110 | } | |
111 | my $sl = $me->{'slant'}; | |
112 | if (defined $sl) | |
113 | { | |
114 | $sl = ($sl =~ /^[io]/) ? 'italic' : 'roman'; | |
115 | push(@opt,-slant => $sl); | |
116 | } | |
117 | $name = join(' ',@opt); | |
118 | } | |
119 | return $name; | |
120 | } | |
121 | else | |
122 | { | |
123 | my $name = $me->{Name} || | |
124 | join('-', '',@{$me}{@field}); | |
125 | return $me->{Display}->XListFonts($name,$max); | |
126 | } | |
127 | } | |
128 | ||
129 | sub as_string | |
130 | { | |
131 | return shift->Name; | |
132 | } | |
133 | ||
134 | sub elem | |
135 | { | |
136 | my $me = shift; | |
137 | my $elem = shift; | |
138 | ||
139 | return undef | |
140 | if(exists $me->{'Name'}); | |
141 | ||
142 | my $old = $me->{$elem}; | |
143 | ||
144 | $me->{$elem} = shift | |
145 | if(@_); | |
146 | ||
147 | $old; | |
148 | } | |
149 | ||
150 | sub Clone | |
151 | { | |
152 | my $me = shift; | |
153 | ||
154 | $me = bless { %$me }, ref($me); | |
155 | ||
156 | unless(exists $me->{'Name'}) | |
157 | { | |
158 | while(@_) | |
159 | { | |
160 | my $k = shift; | |
161 | my $v = shift || $me->{MainWin}->BackTrace('Tk::Font->Clone( key => value, ... )'); | |
162 | $me->{$k} = $v; | |
163 | } | |
164 | } | |
165 | ||
166 | $me; | |
167 | } | |
168 | ||
169 | sub ascent | |
170 | { | |
171 | my $me = shift; | |
172 | my $name = $me->Name; | |
173 | $me->{MainWin}->fontMetrics($name, '-ascent'); | |
174 | } | |
175 | ||
176 | sub descent | |
177 | { | |
178 | my $me = shift; | |
179 | my $name = $me->Name; | |
180 | $me->{MainWin}->fontMetrics($name, '-descent'); | |
181 | } | |
182 | ||
183 | 1; | |
184 |