fpc/packages/xforms/examples/canvas.pp
marco 857da2934c * xforms moved
git-svn-id: trunk@10015 -
2008-01-27 09:51:30 +00:00

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.