diff options
author | Owen Taylor <otaylor@redhat.com> | 1999-06-17 18:01:14 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1999-06-17 18:01:14 +0000 |
commit | b90f0c9ee7220c89b2ed61acbc5ace0608e84ff6 (patch) | |
tree | 71cd57847fe6cb2d243132945d88890362d38a5b | |
parent | e0bc92268b67c75aefc686b4f5789f8e74da8bd5 (diff) | |
download | gdk-pixbuf-b90f0c9ee7220c89b2ed61acbc5ace0608e84ff6.tar.gz |
Removed references to code examples in my directory on gtk.org as they
Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com>
* docs/gtk_tut.sgml: Removed references to
code examples in my directory on gtk.org as
they should all be in the tutorial now.
* docs/gtk_tut.sgml: Added sources for dial-test
and scribble-xinput programs that were previously
missing.
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 18 | ||||
-rw-r--r-- | docs/gtk_tut.sgml | 376 | ||||
-rw-r--r-- | docs/tutorial/gtk_tut.sgml | 376 |
9 files changed, 836 insertions, 42 deletions
@@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index e0225093f..3a5f47786 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,21 @@ +Thu Jun 17 13:57:31 1999 Owen Taylor <otaylor@redhat.com> + + * docs/gtk_tut.sgml: Removed references to + code examples in my directory on gtk.org as + they should all be in the tutorial now. + + * docs/gtk_tut.sgml: Added sources for dial-test + and scribble-xinput programs that were previously + missing. + +Tue Jun 15 12:45:12 1999 Owen Taylor <otaylor@redhat.com> + + Fixes from Peter Wainwright <prw@wainpr.demon.co.uk> + + * gtk/gtkrc.c (gtk_rc_parse_engine): If rc_style->engine is + already set, call old engine's destroy function and + unref the old engine. + Thu Jun 10 17:59:38 1999 Tim Janik <timj@gtk.org> * gtk/gtkdrawingarea.c (gtk_drawing_area_size): queue a resize. diff --git a/docs/gtk_tut.sgml b/docs/gtk_tut.sgml index 32ca4ab2a..aa1c0d167 100644 --- a/docs/gtk_tut.sgml +++ b/docs/gtk_tut.sgml @@ -12062,12 +12062,6 @@ to this, once you finish your widget, announce it to the world so other people can benefit. The best place to do this is probably the <tt>gtk-list</tt>. -Complete sources for the example widgets are available at the place you -got this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - <!-- ----------------------------------------------------------------- --> <sect1> The Anatomy Of A Widget @@ -13910,13 +13904,7 @@ needs to be updated. X will eventually generate an expose event to copy the relevant portions to the screen. We have now covered the entire drawing program except for a few -mundane details like creating the main window. The complete -source code is available from the location from which you got -this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - +mundane details like creating the main window. <!-- ----------------------------------------------------------------- --> <sect1> Adding XInput support @@ -14234,13 +14222,7 @@ print_button_press (guint32 deviceid) } </verb></tscreen> -That completes the changes to `XInputize' our program. As with -the first version, the complete source is available at the location -from which you got this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - +That completes the changes to `XInputize' our program. <sect2> Further sophistications <label id="sec_Further_Sophistications"> <p> @@ -16547,7 +16529,83 @@ gtk_dial_adjustment_value_changed (GtkAdjustment *adjustment, </verb></tscreen> <!-- ----------------------------------------------------------------- --> -<sect1> Scribble +<sect2> dial-test.c +<p> +<tscreen><verb> +/* example-start gtkdial dial-test.c */ + +#include <stdio.h> +#include <gtk/gtk.h> +#include "gtkdial.h" + +void +value_changed (GtkAdjustment *adjustment, GtkWidget *label) +{ + char buffer[16]; + + sprintf(buffer,"%4.2f",adjustment->value); + gtk_label_set (GTK_LABEL (label), buffer); +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkAdjustment *adjustment; + GtkWidget *dial; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *label; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_title (GTK_WINDOW (window), "Dial"); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (gtk_exit), NULL); + + gtk_container_border_width (GTK_CONTAINER (window), 10); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX(vbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + adjustment = GTK_ADJUSTMENT(gtk_adjustment_new (0, -1.0, 1.0, 0.01, 0.1, 0)); + + dial = gtk_dial_new(adjustment); + gtk_dial_set_update_policy (GTK_DIAL(dial), GTK_UPDATE_DELAYED); + /* gtk_widget_set_usize (dial, 100, 100); */ + + gtk_container_add (GTK_CONTAINER (frame), dial); + gtk_widget_show (dial); + + label = gtk_label_new("0.00"); + gtk_box_pack_start (GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + gtk_signal_connect (GTK_OBJECT(adjustment), "value_changed", + GTK_SIGNAL_FUNC (value_changed), label); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +} +/* example-end */ +</verb></tscreen> + +<!-- ----------------------------------------------------------------- --> +<sect1>Scribble +<!-- ----------------------------------------------------------------- --> +<sect2> scribble-simple.c <p> <tscreen><verb> /* example-start scribble-simple scribble-simple.c */ @@ -16732,6 +16790,282 @@ main (int argc, char *argv[]) /* example-end */ </verb></tscreen> +<!-- ----------------------------------------------------------------- --> +<sect2> scribble-xinput.c +<p> +<tscreen><verb> +/* example-start scribble-xinput scribble-xinput.c */ + +/* GTK - The GIMP Toolkit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <gtk/gtk.h> + +/* Backing pixmap for drawing area */ +static GdkPixmap *pixmap = NULL; + +/* Create a new backing pixmap of the appropriate size */ +static gint +configure_event (GtkWidget *widget, GdkEventConfigure *event) +{ + if (pixmap) + gdk_pixmap_unref(pixmap); + + pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + gdk_draw_rectangle (pixmap, + widget->style->white_gc, + TRUE, + 0, 0, + widget->allocation.width, + widget->allocation.height); + + return TRUE; +} + +/* Redraw the screen from the backing pixmap */ +static gint +expose_event (GtkWidget *widget, GdkEventExpose *event) +{ + gdk_draw_pixmap(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + pixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); + + return FALSE; +} + +/* Draw a rectangle on the screen, size depending on pressure, + and color on the type of device */ +static void +draw_brush (GtkWidget *widget, GdkInputSource source, + gdouble x, gdouble y, gdouble pressure) +{ + GdkGC *gc; + GdkRectangle update_rect; + + switch (source) + { + case GDK_SOURCE_MOUSE: + gc = widget->style->dark_gc[GTK_WIDGET_STATE (widget)]; + break; + case GDK_SOURCE_PEN: + gc = widget->style->black_gc; + break; + case GDK_SOURCE_ERASER: + gc = widget->style->white_gc; + break; + default: + gc = widget->style->light_gc[GTK_WIDGET_STATE (widget)]; + } + + update_rect.x = x - 10 * pressure; + update_rect.y = y - 10 * pressure; + update_rect.width = 20 * pressure; + update_rect.height = 20 * pressure; + gdk_draw_rectangle (pixmap, gc, TRUE, + update_rect.x, update_rect.y, + update_rect.width, update_rect.height); + gtk_widget_draw (widget, &update_rect); +} + +static void +print_button_press (guint32 deviceid) +{ + GList *tmp_list; + + /* gdk_input_list_devices returns an internal list, so we shouldn't + free it afterwards */ + tmp_list = gdk_input_list_devices(); + + while (tmp_list) + { + GdkDeviceInfo *info = (GdkDeviceInfo *)tmp_list->data; + + if (info->deviceid == deviceid) + { + g_print("Button press on device '%s'\n", info->name); + return; + } + + tmp_list = tmp_list->next; + } +} + +static gint +button_press_event (GtkWidget *widget, GdkEventButton *event) +{ + print_button_press (event->deviceid); + + if (event->button == 1 && pixmap != NULL) + draw_brush (widget, event->source, event->x, event->y, event->pressure); + + return TRUE; +} + +static gint +motion_notify_event (GtkWidget *widget, GdkEventMotion *event) +{ + gdouble x, y; + gdouble pressure; + GdkModifierType state; + + if (event->is_hint) + gdk_input_window_get_pointer (event->window, event->deviceid, + &x, &y, &pressure, NULL, NULL, &state); + else + { + x = event->x; + y = event->y; + pressure = event->pressure; + state = event->state; + } + + if (state & GDK_BUTTON1_MASK && pixmap != NULL) + draw_brush (widget, event->source, x, y, pressure); + + return TRUE; +} + +void +input_dialog_destroy (GtkWidget *w, gpointer data) +{ + *((GtkWidget **)data) = NULL; +} + +void +create_input_dialog () +{ + static GtkWidget *inputd = NULL; + + if (!inputd) + { + inputd = gtk_input_dialog_new(); + + gtk_signal_connect (GTK_OBJECT(inputd), "destroy", + (GtkSignalFunc)input_dialog_destroy, &inputd); + gtk_signal_connect_object (GTK_OBJECT(GTK_INPUT_DIALOG(inputd)->close_button), + "clicked", + (GtkSignalFunc)gtk_widget_hide, + GTK_OBJECT(inputd)); + gtk_widget_hide ( GTK_INPUT_DIALOG(inputd)->save_button); + + gtk_widget_show (inputd); + } + else + { + if (!GTK_WIDGET_MAPPED(inputd)) + gtk_widget_show(inputd); + else + gdk_window_raise(inputd->window); + } +} + +void +quit () +{ + gtk_exit (0); +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *drawing_area; + GtkWidget *vbox; + + GtkWidget *button; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (window, "Test Input"); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_widget_show (vbox); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (quit), NULL); + + /* Create the drawing area */ + + drawing_area = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area), 200, 200); + gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); + + gtk_widget_show (drawing_area); + + /* Signals used to handle backing pixmap */ + + gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event", + (GtkSignalFunc) expose_event, NULL); + gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event", + (GtkSignalFunc) configure_event, NULL); + + /* Event signals */ + + gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event", + (GtkSignalFunc) motion_notify_event, NULL); + gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event", + (GtkSignalFunc) button_press_event, NULL); + + gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK + | GDK_LEAVE_NOTIFY_MASK + | GDK_BUTTON_PRESS_MASK + | GDK_POINTER_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK); + + /* The following call enables tracking and processing of extension + events for the drawing area */ + gtk_widget_set_extension_events (drawing_area, GDK_EXTENSION_EVENTS_CURSOR); + + /* .. And some buttons */ + button = gtk_button_new_with_label ("Input Dialog"); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (create_input_dialog), NULL); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("Quit"); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (window)); + gtk_widget_show (button); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +} + +/* example-end */ +</verb></tscreen> + <!-- ***************************************************************** --> <sect> List Widget <!-- ***************************************************************** --> diff --git a/docs/tutorial/gtk_tut.sgml b/docs/tutorial/gtk_tut.sgml index 32ca4ab2a..aa1c0d167 100644 --- a/docs/tutorial/gtk_tut.sgml +++ b/docs/tutorial/gtk_tut.sgml @@ -12062,12 +12062,6 @@ to this, once you finish your widget, announce it to the world so other people can benefit. The best place to do this is probably the <tt>gtk-list</tt>. -Complete sources for the example widgets are available at the place you -got this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - <!-- ----------------------------------------------------------------- --> <sect1> The Anatomy Of A Widget @@ -13910,13 +13904,7 @@ needs to be updated. X will eventually generate an expose event to copy the relevant portions to the screen. We have now covered the entire drawing program except for a few -mundane details like creating the main window. The complete -source code is available from the location from which you got -this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - +mundane details like creating the main window. <!-- ----------------------------------------------------------------- --> <sect1> Adding XInput support @@ -14234,13 +14222,7 @@ print_button_press (guint32 deviceid) } </verb></tscreen> -That completes the changes to `XInputize' our program. As with -the first version, the complete source is available at the location -from which you got this tutorial, or from: - -<htmlurl url="http://www.gtk.org/~otaylor/gtk/tutorial/" -name="http://www.gtk.org/~otaylor/gtk/tutorial/"> - +That completes the changes to `XInputize' our program. <sect2> Further sophistications <label id="sec_Further_Sophistications"> <p> @@ -16547,7 +16529,83 @@ gtk_dial_adjustment_value_changed (GtkAdjustment *adjustment, </verb></tscreen> <!-- ----------------------------------------------------------------- --> -<sect1> Scribble +<sect2> dial-test.c +<p> +<tscreen><verb> +/* example-start gtkdial dial-test.c */ + +#include <stdio.h> +#include <gtk/gtk.h> +#include "gtkdial.h" + +void +value_changed (GtkAdjustment *adjustment, GtkWidget *label) +{ + char buffer[16]; + + sprintf(buffer,"%4.2f",adjustment->value); + gtk_label_set (GTK_LABEL (label), buffer); +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkAdjustment *adjustment; + GtkWidget *dial; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *label; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_title (GTK_WINDOW (window), "Dial"); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (gtk_exit), NULL); + + gtk_container_border_width (GTK_CONTAINER (window), 10); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX(vbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + adjustment = GTK_ADJUSTMENT(gtk_adjustment_new (0, -1.0, 1.0, 0.01, 0.1, 0)); + + dial = gtk_dial_new(adjustment); + gtk_dial_set_update_policy (GTK_DIAL(dial), GTK_UPDATE_DELAYED); + /* gtk_widget_set_usize (dial, 100, 100); */ + + gtk_container_add (GTK_CONTAINER (frame), dial); + gtk_widget_show (dial); + + label = gtk_label_new("0.00"); + gtk_box_pack_start (GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + gtk_signal_connect (GTK_OBJECT(adjustment), "value_changed", + GTK_SIGNAL_FUNC (value_changed), label); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +} +/* example-end */ +</verb></tscreen> + +<!-- ----------------------------------------------------------------- --> +<sect1>Scribble +<!-- ----------------------------------------------------------------- --> +<sect2> scribble-simple.c <p> <tscreen><verb> /* example-start scribble-simple scribble-simple.c */ @@ -16732,6 +16790,282 @@ main (int argc, char *argv[]) /* example-end */ </verb></tscreen> +<!-- ----------------------------------------------------------------- --> +<sect2> scribble-xinput.c +<p> +<tscreen><verb> +/* example-start scribble-xinput scribble-xinput.c */ + +/* GTK - The GIMP Toolkit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <gtk/gtk.h> + +/* Backing pixmap for drawing area */ +static GdkPixmap *pixmap = NULL; + +/* Create a new backing pixmap of the appropriate size */ +static gint +configure_event (GtkWidget *widget, GdkEventConfigure *event) +{ + if (pixmap) + gdk_pixmap_unref(pixmap); + + pixmap = gdk_pixmap_new(widget->window, + widget->allocation.width, + widget->allocation.height, + -1); + gdk_draw_rectangle (pixmap, + widget->style->white_gc, + TRUE, + 0, 0, + widget->allocation.width, + widget->allocation.height); + + return TRUE; +} + +/* Redraw the screen from the backing pixmap */ +static gint +expose_event (GtkWidget *widget, GdkEventExpose *event) +{ + gdk_draw_pixmap(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + pixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); + + return FALSE; +} + +/* Draw a rectangle on the screen, size depending on pressure, + and color on the type of device */ +static void +draw_brush (GtkWidget *widget, GdkInputSource source, + gdouble x, gdouble y, gdouble pressure) +{ + GdkGC *gc; + GdkRectangle update_rect; + + switch (source) + { + case GDK_SOURCE_MOUSE: + gc = widget->style->dark_gc[GTK_WIDGET_STATE (widget)]; + break; + case GDK_SOURCE_PEN: + gc = widget->style->black_gc; + break; + case GDK_SOURCE_ERASER: + gc = widget->style->white_gc; + break; + default: + gc = widget->style->light_gc[GTK_WIDGET_STATE (widget)]; + } + + update_rect.x = x - 10 * pressure; + update_rect.y = y - 10 * pressure; + update_rect.width = 20 * pressure; + update_rect.height = 20 * pressure; + gdk_draw_rectangle (pixmap, gc, TRUE, + update_rect.x, update_rect.y, + update_rect.width, update_rect.height); + gtk_widget_draw (widget, &update_rect); +} + +static void +print_button_press (guint32 deviceid) +{ + GList *tmp_list; + + /* gdk_input_list_devices returns an internal list, so we shouldn't + free it afterwards */ + tmp_list = gdk_input_list_devices(); + + while (tmp_list) + { + GdkDeviceInfo *info = (GdkDeviceInfo *)tmp_list->data; + + if (info->deviceid == deviceid) + { + g_print("Button press on device '%s'\n", info->name); + return; + } + + tmp_list = tmp_list->next; + } +} + +static gint +button_press_event (GtkWidget *widget, GdkEventButton *event) +{ + print_button_press (event->deviceid); + + if (event->button == 1 && pixmap != NULL) + draw_brush (widget, event->source, event->x, event->y, event->pressure); + + return TRUE; +} + +static gint +motion_notify_event (GtkWidget *widget, GdkEventMotion *event) +{ + gdouble x, y; + gdouble pressure; + GdkModifierType state; + + if (event->is_hint) + gdk_input_window_get_pointer (event->window, event->deviceid, + &x, &y, &pressure, NULL, NULL, &state); + else + { + x = event->x; + y = event->y; + pressure = event->pressure; + state = event->state; + } + + if (state & GDK_BUTTON1_MASK && pixmap != NULL) + draw_brush (widget, event->source, x, y, pressure); + + return TRUE; +} + +void +input_dialog_destroy (GtkWidget *w, gpointer data) +{ + *((GtkWidget **)data) = NULL; +} + +void +create_input_dialog () +{ + static GtkWidget *inputd = NULL; + + if (!inputd) + { + inputd = gtk_input_dialog_new(); + + gtk_signal_connect (GTK_OBJECT(inputd), "destroy", + (GtkSignalFunc)input_dialog_destroy, &inputd); + gtk_signal_connect_object (GTK_OBJECT(GTK_INPUT_DIALOG(inputd)->close_button), + "clicked", + (GtkSignalFunc)gtk_widget_hide, + GTK_OBJECT(inputd)); + gtk_widget_hide ( GTK_INPUT_DIALOG(inputd)->save_button); + + gtk_widget_show (inputd); + } + else + { + if (!GTK_WIDGET_MAPPED(inputd)) + gtk_widget_show(inputd); + else + gdk_window_raise(inputd->window); + } +} + +void +quit () +{ + gtk_exit (0); +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *drawing_area; + GtkWidget *vbox; + + GtkWidget *button; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (window, "Test Input"); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_widget_show (vbox); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (quit), NULL); + + /* Create the drawing area */ + + drawing_area = gtk_drawing_area_new (); + gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area), 200, 200); + gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); + + gtk_widget_show (drawing_area); + + /* Signals used to handle backing pixmap */ + + gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event", + (GtkSignalFunc) expose_event, NULL); + gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event", + (GtkSignalFunc) configure_event, NULL); + + /* Event signals */ + + gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event", + (GtkSignalFunc) motion_notify_event, NULL); + gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event", + (GtkSignalFunc) button_press_event, NULL); + + gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK + | GDK_LEAVE_NOTIFY_MASK + | GDK_BUTTON_PRESS_MASK + | GDK_POINTER_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK); + + /* The following call enables tracking and processing of extension + events for the drawing area */ + gtk_widget_set_extension_events (drawing_area, GDK_EXTENSION_EVENTS_CURSOR); + + /* .. And some buttons */ + button = gtk_button_new_with_label ("Input Dialog"); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (create_input_dialog), NULL); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("Quit"); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (window)); + gtk_widget_show (button); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +} + +/* example-end */ +</verb></tscreen> + <!-- ***************************************************************** --> <sect> List Widget <!-- ***************************************************************** --> |