summaryrefslogtreecommitdiff
path: root/packages/gtk2/examples/scribble_simple/scribble_simple.pas
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gtk2/examples/scribble_simple/scribble_simple.pas')
-rw-r--r--packages/gtk2/examples/scribble_simple/scribble_simple.pas170
1 files changed, 170 insertions, 0 deletions
diff --git a/packages/gtk2/examples/scribble_simple/scribble_simple.pas b/packages/gtk2/examples/scribble_simple/scribble_simple.pas
new file mode 100644
index 0000000000..7f43717689
--- /dev/null
+++ b/packages/gtk2/examples/scribble_simple/scribble_simple.pas
@@ -0,0 +1,170 @@
+program scribble_simple;
+
+{$mode objfpc} {$H+}
+
+uses glib2, gtk2, gdk2;
+
+var
+ pixmap : PGdkPixmap; (* Backing pixmap for drawing area *)
+
+
+
+(* Create a new backing pixmap of the appropriate size *)
+
+function configure_event ( widget : PGtkWidget;
+ event : PGdkEventConfigure): gboolean; cdecl;
+begin
+
+ if pixmap <> nil then
+ g_object_unref (pixmap);
+
+ pixmap := gdk_pixmap_new (widget^.window,
+ widget^.allocation.width,
+ widget^.allocation.height,
+ -1);
+ gdk_draw_rectangle (pixmap,
+ widget^.style^.white_gc,
+ gTRUE,
+ 0, 0,
+ widget^.allocation.width,
+ widget^.allocation.height);
+
+ configure_event := TRUE;
+end;
+
+(* Redraw the screen from the backing pixmap *)
+function expose_event ( widget : PGtkWidget;
+ event : PGdkEventExpose) : gboolean; cdecl;
+begin
+ gdk_draw_drawable (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);
+
+ expose_event := FALSE;
+end;
+
+
+(* Draw a rectangle on the screen *)
+procedure draw_brush (widget : PGtkWidget;
+ x, y : gdouble); cdecl;
+var
+ update_rect : TGdkRectangle;
+
+begin
+ update_rect.x := round (x - 5.0);
+ update_rect.y := round (y - 5.0);
+ update_rect.width := 10;
+ update_rect.height := 10;
+
+ gdk_draw_rectangle (pixmap,
+ widget^.style^.black_gc,
+ gTRUE,
+ update_rect.x, update_rect.y,
+ update_rect.width, update_rect.height);
+
+ gtk_widget_queue_draw_area (widget,
+ update_rect.x, update_rect.y,
+ update_rect.width, update_rect.height);
+end;
+
+function button_press_event ( widget : PGtkWidget;
+ event : PGdkEventbutton): gboolean; cdecl;
+begin
+ if (event^.button = 1) and (pixmap <> NULL) then
+ draw_brush (widget, event^.x, event^.y);
+
+ button_press_event := TRUE;
+end;
+
+function motion_notify_event ( widget: PGtkWidget;
+ event : PGdkEventMotion): gboolean; cdecl;
+var
+ x, y : gint;
+ state : TGdkModifierType;
+
+begin
+ if event^.is_hint = gTRUE then
+ gdk_window_get_pointer (event^.window, @x, @y, @state)
+ else begin
+ x := round (event^.x);
+ y := round (event^.y);
+ state := event^.state;
+ end;
+
+ if ((state and GDK_BUTTON1_MASK) <> 0) and (pixmap <> NULL) then
+ draw_brush (widget, x, y);
+
+ motion_notify_event := TRUE;
+end;
+
+procedure quit;
+begin
+ halt;
+end;
+
+var
+ window,
+ drawing_area,
+ vbox : PGtkWidget;
+
+ button : PGtkWidget;
+
+begin
+ 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);
+
+ g_signal_connect (G_OBJECT (window), 'destroy',
+ G_CALLBACK (@quit), NULL);
+
+ (* Create the drawing area *)
+
+ drawing_area := gtk_drawing_area_new ();
+ gtk_widget_set_size_request (GTK_WIDGET (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 *)
+
+ g_signal_connect (G_OBJECT (drawing_area), 'expose_event',
+ G_CALLBACK (@expose_event), NULL);
+
+ g_signal_connect (G_OBJECT (drawing_area),'configure_event',
+ G_CALLBACK (@configure_event), NULL);
+
+ (* Event signals *)
+
+ g_signal_connect (G_OBJECT (drawing_area), 'motion_notify_event',
+ G_CALLBACK (@motion_notify_event), NULL);
+
+ g_signal_connect (G_OBJECT (drawing_area), 'button_press_event',
+ G_CALLBACK (@button_press_event), NULL);
+
+ gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK
+ or GDK_LEAVE_NOTIFY_MASK
+ or GDK_BUTTON_PRESS_MASK
+ or GDK_POINTER_MOTION_MASK
+ or GDK_POINTER_MOTION_HINT_MASK);
+
+ (* .. And a quit button *)
+ button := gtk_button_new_with_label ('Quit');
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+ g_signal_connect_swapped (G_OBJECT (button), 'clicked',
+ G_CALLBACK (@gtk_widget_destroy),
+ window);
+ gtk_widget_show (button);
+
+ gtk_widget_show (window);
+
+ gtk_main ();
+end.