123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- {
- Converted from C to Pascal by Frank Loemker
- <[email protected]>
- }
- program scribble;
- uses
- glib,Gdk,Gtk;
- { Backing pixmap for drawing area }
- const
- pixmap : PGdkPixmap = NIL;
- { Create a new backing pixmap of the appropriate size }
- function configure_event (widget : PGtkWidget; event: PGdkEventConfigure):boolean; cdecl;
- begin
- if pixmap<>NIL then
- gdk_pixmap_unref(pixmap);
- pixmap := gdk_pixmap_new(widget^.window,
- widget^.allocation.width,
- widget^.allocation.height,
- -1);
- gdk_draw_rectangle (pixmap,
- PGtkStyle(widget^.thestyle)^.white_gc,
- gint(true),
- 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 ) : boolean; cdecl;
- begin
- gdk_draw_pixmap(widget^.window,
- PGtkStyle(widget^.thestyle)^.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: gint16);
- var update_rect : TGdkRectangle;
- begin
- update_rect.x := x - 5;
- update_rect.y := y - 5;
- update_rect.width := 10;
- update_rect.height := 10;
- gdk_draw_rectangle (pixmap,
- PGtkStyle(widget^.thestyle)^.black_gc,
- gint(true),
- update_rect.x, update_rect.y,
- update_rect.width, update_rect.height);
- gtk_widget_draw (widget, @update_rect);
- end;
- function button_press_event (widget : PGtkWidget ; event: PGdkEventButton ) : boolean; cdecl;
- begin
- if (event^.button = 1) and (pixmap <> NIL) then begin
- draw_brush (widget, trunc(event^.x), trunc(event^.y));
- end;
- button_press_event := TRUE;
- end;
- function motion_notify_event (widget : PGtkWidget ; event: PGdkEventMotion ) : boolean; cdecl;
- var x, y : longint ;
- state : longint;
- begin
- if (event^.is_hint<>0) then begin
- gdk_window_get_pointer (event^.window, @x, @y, @state);
- end else begin
- x := trunc(event^.x);
- y := trunc(event^.y);
- state := event^.state;
- end;
- if ((state and gdk_BUTTON1_MASK)<>0) and (pixmap <> NIL) then
- draw_brush (widget, x, y);
- motion_notify_event := TRUE;
- end;
- procedure quit;
- begin
- gtk_exit (0);
- end;
- var window, drawing_area, vbox, button : PGtkWidget;
- begin
- gtk_init (@argc, @argv);
- gtk_rc_init;
- window := gtk_window_new (gtk_WINDOW_TOPLEVEL);
- gtk_widget_set_name (window, 'Test Input');
- vbox := gtk_vbox_new (false, 0);
- gtk_container_add (PGtkCONTAINER (window), vbox);
- gtk_widget_show (vbox);
- gtk_signal_connect (PGtkOBJECT (window), 'destroy',
- gtk_SIGNAL_FUNC (@quit), NIL);
- { Create the drawing area }
- drawing_area := gtk_drawing_area_new ();
- gtk_drawing_area_size (PGtkDRAWINGAREA (drawing_area), 200, 200);
- gtk_box_pack_start (PGtkBOX (vbox), drawing_area, true, true, 0);
- gtk_widget_show (drawing_area);
- { Signals used to handle backing pixmap }
- gtk_signal_connect (PGtkOBJECT (drawing_area), 'expose_event',
- gtk_SIGNAL_FUNC (@expose_event), NIL);
- gtk_signal_connect (PGtkOBJECT(drawing_area),'configure_event',
- gtk_SIGNAL_FUNC (@configure_event), NIL);
- { Event signals }
- gtk_signal_connect (PGtkOBJECT (drawing_area), 'motion_notify_event',
- gtk_SIGNAL_FUNC (@motion_notify_event), NIL);
- gtk_signal_connect (PGtkOBJECT (drawing_area), 'button_press_event',
- gtk_SIGNAL_FUNC (@button_press_event), NIL);
- 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 (PGtkBOX (vbox), button, false, false, 0);
- gtk_signal_connect_object (PGtkOBJECT (button), 'clicked',
- gtk_SIGNAL_FUNC (@gtk_widget_destroy),
- PGtkOBJECT (window));
- gtk_widget_show (button);
- gtk_widget_show (window);
- gtk_main ();
- end.
|