mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 08:07:54 +02:00
243 lines
6.9 KiB
ObjectPascal
243 lines
6.9 KiB
ObjectPascal
{ Demo showing the use of canvas object. V0.75
|
|
}
|
|
|
|
uses xforms,x,xlib;
|
|
|
|
{*** Forms and Objects ***}
|
|
|
|
type TFD_canvasform = record
|
|
canvasform : PFL_FORM;
|
|
vdata : pointer;
|
|
ldata : longint;
|
|
canvas,
|
|
br,
|
|
keyboard,
|
|
mouse,
|
|
done,
|
|
misc,
|
|
menu : PFL_OBJECT;
|
|
end;
|
|
|
|
PFD_canvasform = ^TFD_canvasform;
|
|
|
|
|
|
Var canvasGC : TGC;
|
|
|
|
|
|
function canvas_expose(ob : PFL_OBJECT;win : TWindow; w,h : longint; ev : PXEvent;d : Pointer) : longint;cdecl;
|
|
|
|
var ui : PFD_CANVASFORM;
|
|
|
|
begin
|
|
ui := d;
|
|
XFillRectangle(PDisplay(fl_display), TDRAWABLE(win), canvasGC, 0, 0,cardinal( w), cardinal(h));
|
|
fl_addto_browser(ui^.br, 'Expose');
|
|
end;
|
|
|
|
|
|
function canvas_key(ob : PFL_OBJECT; win : TWindow; w,h : Longint; ev : PXEvent; d: pointer) : longint;cdecl;
|
|
var
|
|
ui :PFD_canvasform;
|
|
buf : string[128];
|
|
|
|
|
|
begin
|
|
ui := d;
|
|
str (XKeycodeToKeysym(PDisplay(fl_display),ev^.xkey.keycode, TkeyCode(#0)),buf);
|
|
buf:= 'KeyPress: keysym='+buf+#0;
|
|
fl_addto_browser(ui^.br, @buf[1]);
|
|
return 0;
|
|
end;
|
|
|
|
|
|
function canvas_but(ob : PFL_OBJECT; win : TWindow; w,h : longint, ev : PXEvent;d : pointer) : longint;cdecl;
|
|
|
|
var
|
|
ui : PFD_canvasform;
|
|
buf : string[128];
|
|
|
|
begin
|
|
ui := d;
|
|
|
|
str(ev^.xbutton.button,buf);
|
|
if ev^.eventtype=ButtonPress then
|
|
buf:='Press '+buf
|
|
else
|
|
buf:='Release '+buf;
|
|
buf:='Button '+buf+#0;
|
|
fl_addto_browser(ui^.br, @buf[1]);
|
|
end;
|
|
|
|
function canvas_misc(ob : PFL_OBJECT; win : TWindow; w,h : longint, ev : PXEvent;d : pointer) : longint;cdecl;
|
|
|
|
var
|
|
|
|
ui : PFD_canvasform;
|
|
begin
|
|
ui := d;
|
|
if ev^.xcrossing.eventtype=EnterNotify then
|
|
fl_addto_browser(ui^.br, 'Enter Canvas')
|
|
else
|
|
fl_addto_browser(ui^.br, 'Leave Canvas')
|
|
end;
|
|
|
|
procedure init_canvas(FD_canvasform *fdui)
|
|
|
|
begin
|
|
fl_add_canvas_handler(fdui^.canvas, Expose, PFL_HANDLE_CANVAS(@canvas_expose), fdui);
|
|
fl_add_canvas_handler(fdui^.canvas, KeyPress, PFL_HANDLE_CANVAS(@canvas_key), fdui);
|
|
fl_add_canvas_handler(fdui^.canvas, ButtonPress,PFL_HANDLE_CANVAS(@canvas_but),fdui);
|
|
fl_add_canvas_handler(fdui^.canvas, ButtonRelease,PFL_HANDLE_CANVAS(canvas_but),fdui);
|
|
fl_set_button(fdui^.mouse, 1);
|
|
fl_set_button(fdui^.keyboard, 1);
|
|
canvasGC := XCreateGC(fl_get_display(),fl_state[fl_vmode].trailblazer,0,0);
|
|
XSetForeground(fl_get_display(), canvasGC, fl_get_flcolor(FL_BLACK));
|
|
end;
|
|
|
|
var
|
|
fd_canvasform : PFD_canvasform;
|
|
|
|
procedure sensitive_setting(ob : PFL_OBJECT ; event : longint); cdecl;
|
|
|
|
var
|
|
hc : PFL_HANDLE_CANVAS;
|
|
begin
|
|
if event=Keypress then
|
|
hc := PFL_HANDLE_CANVAS(@canvas_key)
|
|
else
|
|
hc := PFL_HANDLE_CANVAS(@canvas_but);
|
|
|
|
if(fl_get_button(ob)<>0) then
|
|
fl_add_canvas_handler(fd_canvasform^.canvas, event, hc, fd_canvasform);
|
|
else
|
|
fl_remove_canvas_handler(fd_canvasform^.canvas, event, hc);
|
|
end;
|
|
|
|
procedure disable_it(ob : PFL_OBJECT; data : longint);cdecl;
|
|
|
|
begin
|
|
if fl_get_button(ob)<>0 then
|
|
fl_deactivate_object(fd_canvasform^.canvas)
|
|
else
|
|
fl_activate_object (fd_canvasform^.canvas);
|
|
end;
|
|
|
|
procedure hide_it(ob : PFL_OBJECT; all : longint);cdecl;
|
|
|
|
|
|
begin
|
|
if(all<>0) then
|
|
begin
|
|
fl_hide_form(fd_canvasform^.canvasform);
|
|
fl_show_form(fd_canvasform^.canvasform,
|
|
FL_PLACE_CENTER, FL_TRANSIENT, 'canvas');
|
|
{$ifdef nevertrue}
|
|
fl_remove_selected_xevent(fd_canvasform^.canvasform^.window,
|
|
OwnerGrabButtonMask);
|
|
{$endif }
|
|
end
|
|
else
|
|
begin
|
|
if(fd_canvasform^.canvas^.visible)<>0 then
|
|
begin
|
|
fl_hide_object(fd_canvasform^.canvas);
|
|
fl_set_object_label(ob,'ShowCanvas');
|
|
end
|
|
else
|
|
begin
|
|
fl_show_object(fd_canvasform^.canvas);
|
|
fl_set_object_label(ob,'HideCanvas');
|
|
end
|
|
end;
|
|
end;
|
|
|
|
procedure misc_cb(ob : PFL_OBJECT; data : longint); cdecl;
|
|
|
|
begin
|
|
if(fl_get_button(ob)<>0) then
|
|
begin
|
|
fl_add_canvas_handler(fd_canvasform^.canvas, EnterNotify,
|
|
PFL_HANDLE_CANVAS(@canvas_misc), fd_canvasform);
|
|
fl_add_canvas_handler(fd_canvasform^.canvas, LeaveNotify,
|
|
PFL_HANDLE_CANVAS(@canvas_misc), fd_canvasform);
|
|
end
|
|
else
|
|
begin
|
|
fl_remove_canvas_handler(fd_canvasform^.canvas,
|
|
EnterNotify, PFL_HANDLE_CANVAS(@canvas_misc));
|
|
fl_remove_canvas_handler(fd_canvasform^.canvas,
|
|
LeaveNotify, PFL_HANDLE_CANVAS(@canvas_misc));
|
|
end;
|
|
end;
|
|
|
|
{*****************}
|
|
function create_form_canvasform : PFD_canvasform;
|
|
var
|
|
obj :=PFL_OBJECT;
|
|
fdui : PFD_canvasform;
|
|
|
|
begin
|
|
new(fdui);
|
|
|
|
fdui^.canvasform := fl_bgn_form(FL_NO_BOX, 450, 280);
|
|
obj := fl_add_box(FL_UP_BOX,0,0,450,280,'');
|
|
obj:= fl_add_canvas(FL_NORMAL_CANVAS,20,40,155,187,'');
|
|
fdui^.canvas := obj ;
|
|
obj := fl_add_browser(FL_NORMAL_BROWSER,188,40,152,187,'');
|
|
fdui^.br := obj ;
|
|
obj := fl_add_button(FL_PUSH_BUTTON,30,236,90,27,'Deactivate');
|
|
fl_set_object_callback(obj,disable_it,0);
|
|
obj := fl_add_button(FL_NORMAL_BUTTON,120,236,90,27,'HideCanvas');
|
|
fl_set_object_callback(obj, hide_it, 0);
|
|
obj := fl_add_button(FL_NORMAL_BUTTON,210,236,90,27,'HideForm');
|
|
fl_set_object_callback(obj, hide_it, 1);
|
|
obj := fl_add_button(FL_NORMAL_BUTTON,300,236,90,27,'Done');
|
|
fdui^.done := obj ;
|
|
obj := fl_add_text(FL_NORMAL_TEXT,130,10,120,20,'Canvas');
|
|
fl_set_object_lsize(obj,FL_MEDIUM_SIZE);
|
|
fl_set_object_lalign(obj,FL_ALIGN_CENTER);
|
|
fl_set_object_lstyle(obj,FL_BOLD_STYLE);
|
|
obj:= fl_add_menu(FL_PULLDOWN_MENU, 20,10, 45,22,'Menu');
|
|
fdui^.menu := obj ;
|
|
fl_set_object_shortcut(obj,'#m', 1);
|
|
fl_set_object_lstyle(obj, FL_BOLD_STYLE);
|
|
obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,40,76,26,'Keyboard');
|
|
fdui^.keyboard := obj ;
|
|
fl_set_object_color(obj,FL_COL1,FL_BLUE);
|
|
fl_set_object_callback(obj,sensitive_setting,KeyPress);
|
|
obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,70,76,26,'Mouse');
|
|
fdui^.mouse := obj ;
|
|
fl_set_object_color(obj,FL_COL1,FL_BLUE);
|
|
fl_set_object_callback(obj,sensitive_setting,ButtonPress);
|
|
obj := fl_add_checkbutton(FL_PUSH_BUTTON,345,100,74,26,'Enter/Leave');
|
|
fdui^.misc := obj;
|
|
fl_set_object_color(obj,FL_COL1,FL_BLUE);
|
|
fl_set_object_callback(obj,misc_cb,ButtonPress);
|
|
fl_end_form();
|
|
|
|
create_form_canvasform :=fdui;
|
|
end;
|
|
|
|
|
|
begin
|
|
fl_set_border_width(-2);
|
|
|
|
fl_initialize(@argc, argv, 'FormDemo', nil, 0);
|
|
fd_canvasform := create_form_canvasform;
|
|
|
|
{ fill-in form initialization code }
|
|
fl_set_object_dblbuffer(fd_canvasform^.br, 1); { looks better }
|
|
init_canvas (fd_canvasform);
|
|
|
|
fl_addto_menu(fd_canvasform^.menu,'Item1|Item2|Item3|Item4');
|
|
|
|
fl_show_form(fd_canvasform^.canvasform,
|
|
FL_PLACE_FREE,FL_FULLBORDER,'canvasform');
|
|
{$ifdef nevertrue}
|
|
fl_remove_selected_xevent(fd_canvasform^.canvasform^.window,
|
|
OwnerGrabButtonMask);
|
|
{$endif}
|
|
|
|
while (fl_do_forms() <> fd_canvasform^.done) do ;
|
|
end.
|