ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2004/gtk2.mgp
Revision: 1.1
Committed: Mon Jun 28 17:12:45 2004 UTC (22 years, 3 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 %include "std.mgp"
2     %%default 1 bimage "gtk/gtk-window.jpg" 1024x768, center
3     %page
4     %charset "iso8859-1"
5    
6     Gtk+2
7    
8     Ein erweiterbares
9     GUI-Toolkit
10    
11     %page
12    
13     Glib 2
14    
15     Verbesserungen gegenüber Vorversion:
16    
17     %pause
18     Objektmodell
19    
20     %pause
21     100% Skriptbar
22     %pause
23     Metadaten zur Laufzeit verfügbar
24     %pause
25     Datentypen erweiterbar
26    
27     %pause
28     Integration von weiteren Datentypen einfach
29    
30     %page
31    
32     Datentyp: Klasse
33    
34    
35     %pause
36     Methoden
37     %pause
38     constructor, dispose, finalize
39     %pause
40     destroy (gtk+)
41    
42     %pause
43     Signale
44     %pause
45     events (z.B button-press-event)
46     %pause
47     callbacks (z.B. populate)
48    
49     %pause
50     Properties
51     %pause
52     borderwidth, label...
53     %pause
54    
55     Key-Value-Paare
56     %pause
57     zusätzliche Daten, in Perl: %$self
58    
59     %page
60    
61     Informationen zur Laufzeit abfragen
62    
63    
64     z.B. list_properties:
65    
66     %pause
67     %font "t4"
68     for (Gtk2::Widget->list_properties) {
69     printf "%-16s %-24s %-24s %s\n", $_->{name},
70     $_->{type},
71     (join ":", @{$_->{flags}}), $_->{descr};
72     }
73    
74     %pause
75     %font "t3"
76     user-data gpointer readable:writable
77     Anonymous User Data Pointer
78     name Glib::String readable:writable
79     The name of the widget
80     parent Gtk2::Container readable:writable
81     The parent widget of this widget. Must be a Container widget
82     width-request Glib::Int readable:writable
83     Override for width request of the widget,
84     or -1 if natural request should be used
85    
86     %page
87    
88     Informationen zur Laufzeit abfragen
89    
90    
91     z.B. Signale:
92    
93     %pause
94     %font "t4"
95     Dumpvalue->new (bareStringify => 0)->dumpValue ($_)
96     for Glib::Type->list_signals (Gtk2::Widget::);
97    
98     %pause
99     %font "t4"
100     'signal_id' => 23
101     'signal_name' => 'button-press-event'
102     'itype' => 'Gtk2::Widget'
103     'param_types' => ARRAY(0x83b4f28)
104     0 'Gtk2::Gdk::Event'
105     'return_type' => 'Glib::Boolean'
106     'signal_flags' => [ run-last ]
107     -> 2
108    
109     %font "s"
110     %pause
111     Enums, Flags, Superklasse etc..
112    
113     %page
114    
115     Perl vs. C-Namen
116    
117    
118    
119     %pause
120     %font "t4"
121     warn Glib::Type->package_from_cname
122     ("GtkWindowPosition");
123     Gtk2::WindowPosition at gtk.pl line xx.
124    
125    
126     %pause
127     warn Glib::Type->package_from_cname
128     ("GdkPixbuf");
129     Gtk2::Gdk::Pixbuf at gtk.pl line xx.
130     %font "s"
131    
132     %page
133    
134     Neue Datentypen
135    
136    
137     %pause
138     %font "t4"
139     Glib::Type->register_flags (Meine::Flags =>
140     %pause
141     'eins', # implizit 1<<0
142     'zwei', # implizit 1<<1
143     %pause
144     ['drei' => 15 ], # explizit 15
145     ['vier' => 35 ], # explizit 35
146     );
147    
148     %pause
149     %font "s"
150     Operationen sind in Perl überladen:
151    
152     %pause
153     %font "t3"
154     $widget->signal_connect (button_press_event => sub {
155     if ($_[1]->type eq "button-press") {
156    
157     %pause
158     if ($_[1]->state == "shift-mask") {
159    
160     %pause
161     if ($_[1]->state * "shift-mask") { # oder '&'
162    
163     %pause
164     if ($_[1]->state >= ["control-mask", "shift-mask"]) {
165    
166     %page
167    
168     Beispiel: Session-Management mit Gtk2 (1)
169    
170    
171     %pause
172     Session-Management = Property-Management?
173    
174     %pause
175     Bei Widget-Erzeugung setzen bzw. Widget vormerken
176    
177     %font "t5"
178     %pause
179     $w = new Gtk2::Window;
180     ::state $w, "main window", allow_shrink => 1,
181     position => "center";
182    
183     %pause
184     $w = new Gtk2::VPaned;
185     ::state $w, "user/event pane", position => 300;
186    
187     %page
188    
189     Beispiel: Session-Management mit Gtk2 (2)
190    
191    
192     %font "t4"
193     my $state = Storable::retrieve "session.dat";
194    
195     %pause
196     sub state {
197     my ($widget, $class, %attr) = @_;
198    
199     %pause
200     while (my ($k, $v) = each %attr) {
201     $v = $state->{$class}{$k}
202     if exists $state->{$class}{$k};
203     %pause
204     $widget->set ($k => $v);
205     }
206    
207     %pause
208     $widget{$widget} = [$widget, $class, \%attr];
209     Scalar::Util::weaken $widget{$widget}[0];
210     }
211    
212     %page
213    
214     Beispiel: Session-Management mit Gtk2 (2)
215    
216     Speichern der Sessionkonfiguration
217    
218     %pause
219     %font "t4"
220     sub save_state {
221     for (grep $_, values %widget) {
222     my ($widget, $class, $attr) = @$_;
223    
224     next unless $widget; # widget schon tot...
225     %pause
226     $widget->realize if $widget->can ("realize");
227    
228     %pause
229     while (my ($k, $v) = each %$attr) {
230     $state->{$class}{$k} =
231     $widget->get ($k);
232     }
233     }
234    
235     %pause
236     Storable::nstore $state, "session.dat";
237     }
238    
239     %page
240    
241     Glade
242    
243    
244     %pause
245     Glade => abschreckend?
246    
247     %pause
248     Glade kann für Dialogdesign benutzt werden
249     %pause
250     Erzeugen einer Hierarchie mit GladeXML
251     %pause
252     Trennung von Layout und Code
253    
254     %pause
255     Siehe Tagungsband :)
256    
257     %page
258    
259     Eigene Widgets
260    
261    
262     %pause
263     Selten genutzt, aber wichtig für "echte" Applikationen
264    
265     %pause
266     Zwei Methoden:
267    
268     %pause
269     Perl
270     %pause
271     "einfach ableiten"
272     %pause
273     keine eigenen Signale, Properties etc.
274     %pause
275     nur in Perl benutzbar
276    
277     %pause
278     Glib
279     %pause
280     "ungewohnt"
281     %pause
282     eigene Signale, Properties etc...
283     %pause
284     von jeder Sprache aus ansprechbar
285    
286     %page
287    
288     Die Perl-Methode
289    
290    
291     %pause
292     "kennt eh' jeder"
293    
294     %pause
295     => Tagungsband hat ein Beispiel
296    
297     %page
298    
299     Die Glib-Methode (1)
300    
301    
302     Glib::Object::Subclass-"Pragma"
303    
304     %pause
305     %font "t5"
306     package IntegerWidget;
307    
308     %pause
309     use Glib::Object::Subclass
310     Gtk2::Entry,
311     %pause
312     signals => {
313     insert_text => sub {
314     %pause
315     my ($self, $text, $length, $position) = @_;
316     $text =~ y/0-9//cd;
317     $self->signal_chain_from_overridden
318     ($text, $length, $position);
319     },
320     };
321    
322     %page
323    
324     Die Glib-Methode (2)
325    
326     %font "t4"
327     package IntegerWidget;
328    
329     use Glib::Object::Subclass
330     Gtk2::Entry,
331    
332     %pause
333     signals => {
334     # neues signal, range-exception
335     range_exception => {
336     class_closure => sub { ... },
337     flags => [qw(run-first)],
338     param_types => [Glib::Integer],
339     },
340     },
341     %pause
342     properties => [
343     Glib::ParamSpec->string (
344     min => "Minimum",
345     "Values smaller ...",
346     0, [qw(readable writable)]
347     ),
348     ],
349    
350     %page
351    
352     Die Glib-Methode (3)
353    
354    
355     %font "t5"
356     %pause
357     Perl Glib
358    
359    
360     %pause
361     new -
362    
363     %pause
364     - INIT_INSTANCE
365    
366     %pause
367     DESTROY FINALIZE_INSTANCE
368    
369     %pause
370     - SET_PROPERTY
371     - GET_PROPERTY
372    
373     %page
374    
375     Standardmethoden - new / INIT_INSTANCE
376    
377    
378     %pause
379     Default-"new"-Methode: Glib::Object::new
380    
381     %pause
382     %font "t5"
383     Glib::Object::new (Gtk::Window::,
384     position => "center", ...);
385    
386    
387     %pause
388     sub INIT_INSTANCE {
389     my ($self) = @_;
390    
391     %pause
392     $self->{button} = new Gtk2::Button ...;
393     }
394    
395     %page
396    
397     Standardmethoden - GET/SET_PROPERTY
398    
399    
400     Default-Implementation: $self->{propname}
401    
402     %font "t5"
403     sub SET_PROPERTY {
404     my ($self, $pspec, $newval) = @_;
405    
406     %pause
407     $pspec = $pspec->get_name;
408    
409     %pause
410     $self->cursor (0) if $pspec =~ /^cursor/;
411     $self->{$pspec} = $newval;
412     $self->cursor (1) if $pspec =~ /^cursor/;
413     }
414    
415     %page
416    
417     Perl-Widgets: Interaktion mit C
418    
419    
420    
421     %pause
422     %font "t5"
423     GtkWidget *w = g_object_new (
424     "Gtk2__GoBoard",
425     "size", 19
426     );
427    
428     %pause
429     g_object_set (w,
430     "size", 19,
431     NULL);
432    
433     %pause
434     int size;
435     g_object_get (w,
436     "size", &size,
437     NULL);
438    
439     %page
440    
441     Objekte aus anderen Sprachen nutzen (1)
442    
443    
444     %pause
445     Init-Funktion aufrufen
446    
447     %pause
448     Datentypen registrieren
449    
450     %pause
451     %font "t5"
452     BOOT:
453     gperl_register_object (
454     GIMP_TYPE_COLOR_BUTTON,
455     "Gimp::ColorButton");
456    
457     %pause
458     gperl_register_fundamental (
459     GDK_TYPE_CAP_STYLE,
460     "Gtk2::Gdk::CapStyle");
461     %font "s"
462    
463     %page
464    
465     Objekte aus anderen Sprachen nutzen (2)
466    
467    
468     Gimp::ColorButton ist sofort benutzbar:
469    
470     %pause
471     %font "t5"
472     use MeinXSModul;
473    
474     %pause
475     my $button = Gimp::ColorButton
476     ->Glib::Object::new (...);
477