1 /* example-start scribble-xinput scribble-xinput.c */
3 /* GTK - The GIMP Toolkit
4 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
24 /* Backing pixmap for drawing area */
25 static GdkPixmap *pixmap = NULL;
27 /* Create a new backing pixmap of the appropriate size */
29 configure_event (GtkWidget *widget, GdkEventConfigure *event)
32 gdk_pixmap_unref(pixmap);
34 pixmap = gdk_pixmap_new(widget->window,
35 widget->allocation.width,
36 widget->allocation.height,
38 gdk_draw_rectangle (pixmap,
39 widget->style->white_gc,
42 widget->allocation.width,
43 widget->allocation.height);
48 /* Redraw the screen from the backing pixmap */
50 expose_event (GtkWidget *widget, GdkEventExpose *event)
52 gdk_draw_pixmap(widget->window,
53 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
55 event->area.x, event->area.y,
56 event->area.x, event->area.y,
57 event->area.width, event->area.height);
62 /* Draw a rectangle on the screen, size depending on pressure,
63 and color on the type of device */
65 draw_brush (GtkWidget *widget, GdkInputSource source,
66 gdouble x, gdouble y, gdouble pressure)
69 GdkRectangle update_rect;
73 case GDK_SOURCE_MOUSE:
74 gc = widget->style->dark_gc[GTK_WIDGET_STATE (widget)];
77 gc = widget->style->black_gc;
79 case GDK_SOURCE_ERASER:
80 gc = widget->style->white_gc;
83 gc = widget->style->light_gc[GTK_WIDGET_STATE (widget)];
86 update_rect.x = x - 10 * pressure;
87 update_rect.y = y - 10 * pressure;
88 update_rect.width = 20 * pressure;
89 update_rect.height = 20 * pressure;
90 gdk_draw_rectangle (pixmap, gc, TRUE,
91 update_rect.x, update_rect.y,
92 update_rect.width, update_rect.height);
93 gtk_widget_draw (widget, &update_rect);
97 print_button_press (guint32 deviceid)
101 /* gdk_input_list_devices returns an internal list, so we shouldn't
102 free it afterwards */
103 tmp_list = gdk_input_list_devices();
107 GdkDeviceInfo *info = (GdkDeviceInfo *)tmp_list->data;
109 if (info->deviceid == deviceid)
111 g_print("Button press on device '%s'\n", info->name);
115 tmp_list = tmp_list->next;
120 button_press_event (GtkWidget *widget, GdkEventButton *event)
122 print_button_press (event->deviceid);
124 if (event->button == 1 && pixmap != NULL)
125 draw_brush (widget, event->source, event->x, event->y, event->pressure);
131 motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
135 GdkModifierType state;
138 gdk_input_window_get_pointer (event->window, event->deviceid,
145 pressure = event->pressure;
146 state = event->state;
149 if (state & GDK_BUTTON1_MASK && pixmap != NULL)
150 draw_brush (widget, event->source, x, y, pressure);
156 input_dialog_destroy (GtkWidget *w, gpointer data)
158 *((GtkWidget **)data) = NULL;
162 create_input_dialog ()
164 static GtkWidget *inputd = NULL;
168 inputd = gtk_input_dialog_new();
170 gtk_signal_connect (GTK_OBJECT(inputd), "destroy",
171 (GtkSignalFunc)input_dialog_destroy, &inputd);
172 gtk_signal_connect_object (GTK_OBJECT(GTK_INPUT_DIALOG(inputd)->close_button),
174 (GtkSignalFunc)gtk_widget_hide,
176 gtk_widget_hide ( GTK_INPUT_DIALOG(inputd)->save_button);
178 gtk_widget_show (inputd);
182 if (!GTK_WIDGET_MAPPED(inputd))
183 gtk_widget_show(inputd);
185 gdk_window_raise(inputd->window);
196 main (int argc, char *argv[])
199 GtkWidget *drawing_area;
204 gtk_init (&argc, &argv);
206 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
207 gtk_widget_set_name (window, "Test Input");
209 vbox = gtk_vbox_new (FALSE, 0);
210 gtk_container_add (GTK_CONTAINER (window), vbox);
211 gtk_widget_show (vbox);
213 gtk_signal_connect (GTK_OBJECT (window), "destroy",
214 GTK_SIGNAL_FUNC (quit), NULL);
216 /* Create the drawing area */
218 drawing_area = gtk_drawing_area_new ();
219 gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area), 200, 200);
220 gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
222 gtk_widget_show (drawing_area);
224 /* Signals used to handle backing pixmap */
226 gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
227 (GtkSignalFunc) expose_event, NULL);
228 gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
229 (GtkSignalFunc) configure_event, NULL);
233 gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event",
234 (GtkSignalFunc) motion_notify_event, NULL);
235 gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event",
236 (GtkSignalFunc) button_press_event, NULL);
238 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK
239 | GDK_LEAVE_NOTIFY_MASK
240 | GDK_BUTTON_PRESS_MASK
241 | GDK_POINTER_MOTION_MASK
242 | GDK_POINTER_MOTION_HINT_MASK);
244 /* The following call enables tracking and processing of extension
245 events for the drawing area */
246 gtk_widget_set_extension_events (drawing_area, GDK_EXTENSION_EVENTS_CURSOR);
248 /* .. And some buttons */
249 button = gtk_button_new_with_label ("Input Dialog");
250 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
252 gtk_signal_connect (GTK_OBJECT (button), "clicked",
253 GTK_SIGNAL_FUNC (create_input_dialog), NULL);
254 gtk_widget_show (button);
256 button = gtk_button_new_with_label ("Quit");
257 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
259 gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
260 GTK_SIGNAL_FUNC (gtk_widget_destroy),
261 GTK_OBJECT (window));
262 gtk_widget_show (button);
264 gtk_widget_show (window);