7483 lines
289 KiB
Plaintext
7483 lines
289 KiB
Plaintext
unit ugtkinterface;
|
|
interface
|
|
{
|
|
20220128-0900 稳定接口
|
|
20210902-0308 稍微整理
|
|
}
|
|
uses utslvclconstant,cstructurelib,utslvclauxiliary,utslvclmemstruct;
|
|
function _gtkeventcall_();//gtk消息分发
|
|
function _gtkidledo_(); //gtk idle消息分发
|
|
function _gtk_add_time_msg_(h,m,w,l);
|
|
function GetGtkEventNameOrId(n); //gtk 事件名称
|
|
type tgtkeventobject =class(tgtk_ctl_object) //gtk对象消息类(测试用)
|
|
function create(h);
|
|
begin
|
|
inherited;
|
|
end
|
|
end
|
|
|
|
type tsgtkapi = class(tgtkapis)
|
|
class function AnsiToWidChar(c);
|
|
begin
|
|
if not ifstring(c) then return "";
|
|
return c;
|
|
end
|
|
function GetModuleFileNameExA();
|
|
begin
|
|
end
|
|
function Comctl32DllGetVersion();
|
|
begin
|
|
end
|
|
function shell32DllGetVersion();
|
|
begin
|
|
end
|
|
function GetSystemMetrics(idx);
|
|
begin
|
|
global g_w_c_width;
|
|
case idx of
|
|
0x4 : return g_w_c_width;
|
|
end ;
|
|
return 24;
|
|
end
|
|
function GetCursorInfo_();
|
|
begin
|
|
end
|
|
function GetMonitorInfoA();
|
|
begin
|
|
end
|
|
function CreateToolhelp32Snapshot()begin return -1; end;
|
|
function EnumProcesses_();begin end
|
|
function ShowWindow(hwd :pointer;f:integer);
|
|
begin
|
|
{SW_HIDE := 0x0;SW_SHOWNORMAL := 0x1;SW_NORMAL := 0x1;
|
|
SW_SHOWMINIMIZED := 0x2;SW_SHOWMAXIMIZED := 0x3;SW_MAXIMIZE := 0x3;
|
|
SW_SHOWNOACTIVATE := 0x4;SW_SHOW := 0x5;SW_MINIMIZE := 0x6;
|
|
SW_SHOWMINNOACTIVE := 0x7;SW_SHOWNA := 0x8;SW_RESTORE := 0x9;
|
|
SW_SHOWDEFAULT := 0xA;SW_FORCEMINIMIZE := 0xB;SW_MAX := 0xB;}
|
|
global G_GTK_WINDOW_ACTIVATE;
|
|
if not hwd then return ;
|
|
if not GTK_WIDGET(hwd) then return ;
|
|
if f =0 then //隐藏
|
|
begin
|
|
if gtk_widget_is_toplevel(hwd) then
|
|
begin
|
|
p := GetParent(hwd);
|
|
if p then gtk_window_set_transient_for(hwd,0);
|
|
end
|
|
gtk_widget_hide(hwd);
|
|
end else
|
|
if f=0x3 then //最大化
|
|
begin
|
|
if gtk_widget_is_toplevel(hwd) then
|
|
begin
|
|
gtk_window_maximize(hwd);
|
|
end
|
|
end else
|
|
if f=0xc then //show
|
|
begin
|
|
if gtk_widget_is_toplevel(hwd) then
|
|
begin
|
|
p := GetParent(hwd);
|
|
if p and GTK_WIDGET(p) then
|
|
begin
|
|
if gtk_widget_is_toplevel(p) then pp := p;
|
|
else
|
|
pp := gtk_widget_get_toplevel(p);
|
|
if pp then gtk_window_set_transient_for(hwd,pp);
|
|
end
|
|
end
|
|
//gtk_widget_show_all(hwd);
|
|
gtk_widget_show(hwd);
|
|
end else //其他
|
|
begin
|
|
if gtk_widget_is_toplevel(hwd) then
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
cf := g_current_get_focus_widget;
|
|
p := GetParent(hwd);
|
|
if p and GTK_WIDGET(p) then
|
|
begin
|
|
if gtk_widget_is_toplevel(p) then pp := p;
|
|
else
|
|
pp := gtk_widget_get_toplevel(p);
|
|
if pp then gtk_window_set_transient_for(hwd,pp);
|
|
end
|
|
if 2 =g_object_get_data(hwd,"gtk_popwp") then
|
|
begin
|
|
x := g_object_get_data(hwd,"gtk_layout_x");
|
|
y := g_object_get_data(hwd,"gtk_layout_y");
|
|
w := g_object_get_data(hwd,"gtk_layout_width");
|
|
h := g_object_get_data(hwd,"gtk_layout_height");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(hwd,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
gtk_window_move(hwd,x,max(0,y-pcd));
|
|
if w>=0 and h>=0 then
|
|
gtk_widget_set_size_request(hwd,w,max(0,h-pcd));
|
|
end
|
|
if f=0x4 then
|
|
begin
|
|
if not gtk_window_get_decorated(hwd) then
|
|
gtk_window_set_type_hint(hwd,3);
|
|
if cf and cf<>g_current_get_focus_widget then //设置一下focus
|
|
begin
|
|
tplev := gtk_widget_get_toplevel(cf);
|
|
if tplev then gtk_window_set_focus(tplev,cf);
|
|
end
|
|
end
|
|
end
|
|
gtk_widget_show(hwd);
|
|
{if f<>0x4 and G_GTK_WINDOW_ACTIVATE<>hwd then
|
|
begin
|
|
if G_GTK_WINDOW_ACTIVATE then
|
|
gtk_addMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0);
|
|
G_GTK_WINDOW_ACTIVATE := hwd;
|
|
gtk_addMessageQueue(hwd,0x6,1,0,0);
|
|
end }
|
|
end
|
|
return true;
|
|
end
|
|
function MessageBoxA(hwnd :pointer;txt:string;cap:string;flag:integer);
|
|
begin
|
|
return gtk_MessageBoxA(hwnd,txt,cap,flag);
|
|
end
|
|
function IsWindow(h);
|
|
begin
|
|
if h>0 or h<0 then
|
|
begin
|
|
wt := static gtk_widget_get_type();
|
|
r := g_type_check_instance_is_a(h,wt);
|
|
return r;
|
|
end
|
|
end
|
|
function GetWindowTextA(h,s,l);
|
|
begin
|
|
if not(h>0 or h<0) then return ;
|
|
if not ifstring(s) then return ;
|
|
wt := static gtk_window_get_type();
|
|
if g_type_check_instance_is_a(h,wt) then
|
|
begin
|
|
rs := GtkStringToTsl(gtk_window_get_title(h));
|
|
end else
|
|
begin
|
|
lbl := g_object_get_data(h,"gtk_layout_label");
|
|
if lbl then
|
|
begin
|
|
rs := GtkStringToTsl(gtk_label_get_text(lbl));
|
|
end else
|
|
begin
|
|
et := g_object_get_Data(h,"gtk_layout_editer");
|
|
if et then
|
|
begin
|
|
rs := GtkStringToTsl( gtk_entry_get_text(h));
|
|
end else
|
|
begin
|
|
et := g_object_get_Data(h,"gtk_layout_memo");
|
|
if et then
|
|
begin
|
|
rs := gtk_executeMessageA(h,0xd,0,0);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if rs then
|
|
begin
|
|
for i:= 1 to min(length(s),min(length(rs),l)) do
|
|
begin
|
|
s[i] := rs[i];
|
|
end
|
|
return i;
|
|
end
|
|
end
|
|
function SetWindowTextA(h,s);
|
|
begin
|
|
if not(h>0 or h<0) then return ;
|
|
if not ifstring(s) then return ;
|
|
wt := static gtk_window_get_type();
|
|
us := TslStringToGtk(s);
|
|
if g_type_check_instance_is_a(h,wt) then
|
|
begin
|
|
gtk_window_set_title(h,us);
|
|
end else
|
|
begin
|
|
return ;
|
|
lbl := g_object_get_data(h,"gtk_layout_label");
|
|
if lbl then
|
|
begin
|
|
return gtk_label_set_text(lbl,us);
|
|
end
|
|
et := g_object_get_Data(h,"gtk_layout_editer");
|
|
if et then
|
|
begin
|
|
return gtk_entry_set_text(h,us);
|
|
end
|
|
et := g_object_get_Data(h,"gtk_layout_memo");
|
|
if et then
|
|
begin
|
|
gtk_executeMessageA(h,0xc,0,us);
|
|
end
|
|
|
|
//et := g_object_get_Data(h,"gtk_layout_memo");
|
|
//if et then return gtk_entry_set_text(et,us);
|
|
end
|
|
end
|
|
function GetScrollInfo(hWnd:pointer;x:integer;info:pointer)
|
|
begin
|
|
return gtk_GetScrollInfo(hwnd,x,info);
|
|
end
|
|
function SetScrollInfo(hwnd:pointer; nBar:integer; lpsi:pointer;redraw:integer)
|
|
begin
|
|
return gtk_SetScrollInfo(hwnd,nBar,lpsi,redraw);
|
|
end
|
|
function SystemParametersInfoA(uiAction:integer;uiParam:integer; pvParam:pointer; fWinIni:integer);
|
|
begin
|
|
if (uiAction = 0x30) and (pvParam>0 or pvParam<0) then
|
|
begin
|
|
w := static gdk_screen_width();
|
|
h := static gdk_screen_height()-70;
|
|
rc := new tcrect(pvParam);
|
|
rc._setvalue_(0,0);
|
|
rc._setvalue_(1,0);
|
|
rc._setvalue_(2,w);
|
|
rc._setvalue_(3,h);
|
|
end
|
|
end
|
|
function GetClientRect(h :pointer;var rec:array of integer);
|
|
begin
|
|
if h then
|
|
begin
|
|
x0 := g_object_get_data(h,"gtk_layout_width");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
y0 := g_object_get_data(h,"gtk_layout_height")-pcd;
|
|
end
|
|
rec := array(0,0,x0, max(0,y0));
|
|
return true;
|
|
end
|
|
function GetWindowRect(hwnd :pointer;var rec:array of integer):integer;
|
|
begin
|
|
xy := array(0,0);
|
|
ClientToScreen(hwnd,xy);
|
|
h := g_object_get_data(hwnd,"gtk_layout_height");
|
|
w := g_object_get_data(hwnd,"gtk_layout_width");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
rec := array(xy[0],xy[1],xy[0]+w,max(0,xy[1]+h-pcd));
|
|
end
|
|
function GetWindowInfo(hwnd :pointer;f:pointer):integer;
|
|
begin
|
|
if not(f>0 or f<0 ) then return 0;
|
|
//info := new TWINDOWINFO(f);
|
|
end
|
|
function SetWindowPos(h:pointer;hWndInsertAfter:pointer; X:integer; Y:integer; cx:integer;cy:integer; uFlags:integer);
|
|
begin
|
|
//echo "\r\nset window pos:" ,x,"===",y,"=<>=",cx,"===",cy;
|
|
global g_w_c_width;
|
|
if 0x400 .& uFlags then
|
|
begin
|
|
//echo "border set \r\n";
|
|
InvalidateRect(h,nil,false);
|
|
return ;
|
|
end
|
|
if not(h>0 or h<0) then return ;
|
|
flg := 0;
|
|
wt := static gtk_window_get_type();
|
|
pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
if g_type_check_instance_is_a(h,wt) then //主窗口
|
|
begin
|
|
x0 := g_object_get_data(h,"gtk_layout_x");
|
|
y0 := g_object_get_data(h,"gtk_layout_y");
|
|
if (x>=0 and y>=0) and (x<>x0 or y<>y0) then //窗口位置
|
|
begin
|
|
gtk_window_move(h,x,max(0,y-pcd));
|
|
g_object_set_data(h,"gtk_layout_x",x);
|
|
g_object_set_data(h,"gtk_layout_y",y);
|
|
flg .|=2;
|
|
end
|
|
w0 := g_object_get_data(h,"gtk_layout_width");
|
|
h0 := g_object_get_data(h,"gtk_layout_height");
|
|
if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then
|
|
begin
|
|
if gtk_window_get_resizable(h) then
|
|
begin
|
|
gtk_widget_get_size_request(h,cx0,cy0); //改小一点
|
|
if cx0>cx or cy0>cy then
|
|
begin
|
|
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
|
|
end
|
|
gtk_window_resize(h,cx,max(0,cy-pcd));
|
|
end
|
|
else
|
|
begin
|
|
//gtk_widget_get_size_request(h,cx0,cy0);
|
|
//echo "\r\noldsize:",cx0,"====",cy0;
|
|
//gtk_window_resize(wh,cx,cy);
|
|
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
|
|
//gtk_window_set_decorated(h,true);
|
|
//gtk_window_set_resizable(h,true);
|
|
|
|
//gtk_window_resize(h,cx,cy);
|
|
//gtk_window_set_decorated(h,false);
|
|
//gtk_window_resize_to_geometry(h,cx,cy);
|
|
end
|
|
g_object_set_data(h,"gtk_layout_width",cx);
|
|
g_object_set_data(h,"gtk_layout_height",cy);
|
|
flg .|=1;
|
|
end
|
|
if flg then //多发送一次消息
|
|
begin
|
|
Gtk_TrigMoveSizeEvent(h,x,y,cx,cy,flg);
|
|
end
|
|
end else
|
|
if isGtkWidget(h) then
|
|
begin
|
|
lot := gtk_widget_get_parent(h);
|
|
//flg := 0;
|
|
if lot then
|
|
begin
|
|
x0 := g_object_get_data(h,"gtk_layout_x");
|
|
y0 := g_object_get_data(h,"gtk_layout_y");
|
|
if x<>x0 or y<>y0 then
|
|
begin
|
|
gtk_layout_move(lot,h,x,y);
|
|
g_object_set_data(h,"gtk_layout_x",x);
|
|
g_object_set_data(h,"gtk_layout_y",y);
|
|
flg .|=2;
|
|
end
|
|
end
|
|
w0 := g_object_get_data(h,"gtk_layout_width");
|
|
h0 := g_object_get_data(h,"gtk_layout_height");
|
|
if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then
|
|
begin
|
|
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
|
|
g_object_set_data(h,"gtk_layout_width",cx);
|
|
g_object_set_data(h,"gtk_layout_height",cy);
|
|
//lbl := g_object_get_data(h,"gtk_layout_lable");
|
|
//if lbl then gtk_widget_set_size_request(lbl,cx-5,cy-5);
|
|
flg .|=1;
|
|
end
|
|
if flg then
|
|
begin
|
|
Gtk_TrigMoveSizeEvent(h,x,y,cx,cy,flg);
|
|
end
|
|
|
|
end
|
|
end
|
|
function IsGtkWidget(h);
|
|
begin
|
|
wt := static gtk_widget_get_type();
|
|
return g_type_check_instance_is_a(h,wt);
|
|
end
|
|
function gtk_window_showmodal(w); //shomodal
|
|
begin
|
|
dialog := w.handle;
|
|
pt := GetParent(dialog);
|
|
if (pt) and GTK_WIDGET(pt) then
|
|
begin
|
|
if (not gtk_widget_is_toplevel(pt)) then
|
|
begin
|
|
pt := gtk_widget_get_toplevel(pt);
|
|
end
|
|
w.Visible := true;
|
|
gtk_window_set_type_hint((dialog),0);
|
|
//gtk_window_set_modal(GTK_WINDOW( dialog),TRUE); //屏蔽掉showmodal
|
|
gtk_window_set_transient_for( GTK_WINDOW(dialog),GTK_WINDOW(pt));
|
|
|
|
return true;
|
|
end
|
|
end
|
|
function gtk_window_endmodal(w); //shomodal
|
|
begin
|
|
dialog := w.handle;
|
|
pt := GetParent(dialog);
|
|
if (pt) then
|
|
begin
|
|
if (not gtk_widget_is_toplevel(pt)) then
|
|
begin
|
|
pt := gtk_widget_get_toplevel(pt);
|
|
end
|
|
//gtk_window_set_modal(GTK_WINDOW( dialog),false); //屏蔽掉showmodal
|
|
gtk_window_set_transient_for( GTK_WINDOW(dialog),0);
|
|
w.Visible := false;
|
|
end
|
|
end
|
|
function GetParent(h); //获得父窗口
|
|
begin
|
|
if not IsGtkWidget(h) then return 0;
|
|
if gtk_widget_is_toplevel(h) then return g_object_get_data(h,"gtk_layout_parent");
|
|
p := gtk_widget_get_parent(h);
|
|
if p then
|
|
return g_object_get_data(p,"gtk_layout_owner");
|
|
return 0;
|
|
end
|
|
function SetParent(h :pointer;phwnd:pointer); //设置gtk父窗口
|
|
begin
|
|
if h=phwnd then return 0;
|
|
if not IsGtkWidget(h) then return 0;
|
|
if gtk_widget_is_toplevel(h) then
|
|
begin
|
|
r := g_object_get_data(h,"gtk_layout_parent");
|
|
if r=phwnd then return ;
|
|
g_object_set_data(h,"gtk_layout_parent",IsGtkWidget(phwnd)?phwnd:0);
|
|
|
|
if gtk_widget_is_visible(h) then //显示的子窗口处理
|
|
begin
|
|
if GTK_WIDGET(phwnd) then
|
|
begin
|
|
if gtk_widget_is_toplevel(phwnd) then pp := phwnd;
|
|
else
|
|
pp := gtk_widget_get_toplevel(phwnd);
|
|
gtk_window_set_transient_for(h,pp);
|
|
end
|
|
end else
|
|
begin
|
|
gtk_window_set_transient_for(h,0); //处理20211020
|
|
end
|
|
return r;
|
|
end
|
|
lot :=gtk_widget_get_parent(h); ;//g_object_get_data(h,"gtk_layout_parent");// //原有layout
|
|
if lot then
|
|
begin
|
|
r := g_object_get_data(lot,"gtk_layout_owner");
|
|
if r=phwnd then return 0;
|
|
gtk_container_remove(lot,h);
|
|
end
|
|
if not phwnd then return r;
|
|
lot := g_object_get_data(phwnd,"gtk_layout");
|
|
if lot then
|
|
begin
|
|
x := g_object_get_data(h,"gtk_layout_x");
|
|
y := g_object_get_data(h,"gtk_layout_y");
|
|
gtk_layout_put(lot,h,x,y);
|
|
|
|
end
|
|
return r;
|
|
end
|
|
function hittestwidget(h,x,y);
|
|
begin
|
|
wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h);
|
|
if wd then return wd.gethitstyle(x,y);
|
|
return 0;
|
|
end
|
|
function GetTopWidgetList(h,x,y,r);
|
|
begin
|
|
wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h);
|
|
if wd and wd.Visible and wd.Enabled then
|
|
begin
|
|
xy := wd.ScreenToClient(x,y);
|
|
if xy[0]>0 and xy[1]>0 and wd.width>xy[0] and wd.height>xy[1] then
|
|
begin
|
|
r[length(r)] := array(h,xy);
|
|
ctls := wd.Controls;
|
|
for i:= 0 to ctls.count-1 do
|
|
begin
|
|
ci := ctls[i];
|
|
if (ci is class(TWinControl)) and ci.HandleAllocated() and (not ci.WsPopUp) then
|
|
begin
|
|
GetTopWidgetList(ci.Handle,x,y,r);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
// class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(hwnd);
|
|
function Gtk_TrigMoveSizeEvent(h,aleft,atop,AWidth,AHeight,flg);
|
|
begin
|
|
gfw := class(tUIglobalData).uigetdata("G_F_TWIN_PROC_");
|
|
SWP_NOMOVE := 2;
|
|
SWP_NOSIZE := 1;
|
|
WM_WINDOWPOSCHANGED := 0x47;
|
|
d := new tvclwindowpos_class(0);
|
|
SizeChanged := flg .& 1;
|
|
PosChanged := flg .& 2;
|
|
if SizeChanged then
|
|
begin
|
|
vb := g_object_get_data(h,"gtk_window_vscroll_bar");
|
|
hb := g_object_get_data(h,"gtk_window_hscroll_bar");
|
|
{if vb and gtk_widget_is_visible(vb) then
|
|
begin
|
|
d.cx := max(AWidth-10,0);
|
|
end
|
|
else d.cx := AWidth;
|
|
if hb and gtk_widget_is_visible(hb) then
|
|
begin
|
|
d.cy := max(AHeight-10,0);
|
|
end
|
|
else
|
|
d.cy := AHeight;
|
|
}
|
|
d.cx := AWidth;
|
|
d.cy := AHeight;
|
|
D.flags := SWP_NOMOVE;
|
|
if gfw then call(gfw,h,WM_WINDOWPOSCHANGED,0,d._getptr_);
|
|
end
|
|
if PosChanged then
|
|
begin
|
|
d.x := ALeft;
|
|
d.y := ATop;
|
|
d.flags := SWP_NOSIZE;
|
|
if gfw then call(gfw,h,WM_WINDOWPOSCHANGED,0,d._getptr_);
|
|
end
|
|
if SizeChanged then //这个是不是应该放前面
|
|
begin
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
gtk_widgetsizechanged(h,max(0,AHeight-pcd),AWidth);
|
|
end
|
|
{if SizeChanged then
|
|
begin
|
|
_twinproc_(h,0x5,0,makeposition(AWidth,AHeight));
|
|
end}
|
|
if PosChanged then
|
|
begin
|
|
if gfw then
|
|
begin
|
|
call(gfw,h,0x3,0,makeposition(ALeft,ATop));
|
|
end
|
|
end
|
|
|
|
end
|
|
function GetCursorPos(var p:array of integer);
|
|
begin
|
|
gdk_display_get_pointer(gdk_display_get_default(), nil, x, y, nil) ;
|
|
p := array(x,y);
|
|
return true;
|
|
end
|
|
function PostQuitMessage(c);
|
|
begin
|
|
gtk_main_quit();
|
|
return c;
|
|
end
|
|
/////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////
|
|
|
|
Function LoadCursorA2(hd:pointer;n:pointer)
|
|
begin
|
|
rn := array(0x7F01:152,0x7F8A:126,0x7F89:24,0x7F88:0,0x7F87:0,
|
|
0x7F86:58,0x7F85:138,0x7F84:70,0x7F83:12,0x7F82:14,0x7F80:58,0x7F04:6,
|
|
0x7F03:30,0x7F02:150)[n];
|
|
if ifnil(rn) then rn := 2;
|
|
return gdk_cursor_new(rn);
|
|
end
|
|
function RegisterClassExA(wc:pointer);
|
|
begin
|
|
return gtk_RegisterClassExA(wc);
|
|
end
|
|
function GetClassInfoExA(HH:pointer;lpszClass:string;lpwcx:pointer);
|
|
begin
|
|
return gtk_GetClassInfoExtA(hh,lpszClass,lpwcx);
|
|
end
|
|
function CreateWindowExA(dwExStyle:integer; lpClassName:string; lpWindowName:string;
|
|
dwStyle:integer;x:integer;y:integer;nWidth:integer;nHeight:integer;
|
|
hWndParent:pointer;hMenu:pointer; hInstance:pointer;lpParam:pointer);
|
|
begin
|
|
return gtk_createwindowexa(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);
|
|
end
|
|
///////////////////////空接口
|
|
|
|
class function GetModuleHandleA(name:pointer)begin return 1; end;
|
|
|
|
function SetClassLongPtrA(HH:pointer;idx:integer;dwNewLong:pointer)begin end;
|
|
function GetClassLongPtrA(HH:pointer;idx:integer)begin end;
|
|
////////////////////////////////////////
|
|
function CallWindowProcA(lpPrevWndFunc:pointer;hWnd:pointer;Msg:integer;wParam:pointer;lParam:pointer)
|
|
begin
|
|
//默认处理程序
|
|
//echo "call defalt handler\r\n";
|
|
end
|
|
function GetKeyState(key);
|
|
begin
|
|
return gtk_GetKeyState(key);
|
|
end
|
|
function GetAsyncKeyState(key);
|
|
begin
|
|
return gtk_GetAsyncKeyState(key);
|
|
end
|
|
function GetSysColor(idx:integer):integer;
|
|
begin
|
|
if idx = 0x5 then
|
|
begin
|
|
return 0xffffff;
|
|
end
|
|
return 0xf0f0f0;
|
|
end
|
|
function SendMessageA(h,msg,w,l);
|
|
begin
|
|
return gtk_sendmessagea(h,msg,w,l);
|
|
end
|
|
function PostMessageA(h,msg,w,l,d);
|
|
begin
|
|
return gtk_postmessagea(h,msg,w,l,d);
|
|
end
|
|
function SetWindowLongPtrA(h,n,v);
|
|
begin
|
|
if not(h>0 or h<0) then return 0;
|
|
return gtk_SetWindowLongPtrA(h,n,v);
|
|
end
|
|
function GetWindowLongPtrA(h,idx);
|
|
begin
|
|
if not(h>0 or h<0) then return 0;
|
|
return gtk_GetWindowLongPtrA(h,idx);
|
|
end
|
|
function DestroyWindow(h:pointer);
|
|
begin
|
|
if h>0 or h<0 then
|
|
begin
|
|
SetParent(h,0);
|
|
if IsGtkWidget(h) then
|
|
begin
|
|
gtk_widget_destroy(h);
|
|
end
|
|
end
|
|
end
|
|
class function MultiByteToWideChar_a(CodePage:integer;dwFlags:integer;lpMultiByteStr:string;cbMultiByte:integer;var lpWideCharStr:string;cchWideChar:integer):integer;
|
|
begin
|
|
|
|
end
|
|
class function GetEncoderClsid(n:String;ed:pointer):integer;
|
|
begin
|
|
WriteStringToPtr(ed,n); //保存
|
|
return -1;
|
|
end
|
|
function EnableWindow(w,c);
|
|
begin
|
|
//可能还有其他处理
|
|
if not(w>0 or w<0) then return false;
|
|
r := gtk_widget_get_sensitive(w);
|
|
nc := c?true:false;
|
|
issetfc := false;
|
|
if r<>nc then
|
|
begin
|
|
if not nc then //似乎还是有点问题
|
|
begin
|
|
cf := GetFocus();
|
|
pcf := cf;
|
|
while pcf do //查找上层窗口
|
|
begin
|
|
if pcf = w then
|
|
begin
|
|
g_object_set_data(w,"gtk_focus_widget_handle",cf);
|
|
issetfc := true;
|
|
break;
|
|
end
|
|
pcf := gtk_widget_get_parent(pcf);
|
|
end
|
|
if not issetfc then //保存当前消失的窗口
|
|
begin
|
|
g_object_set_data(w,"gtk_focus_widget_handle",0);
|
|
end
|
|
end
|
|
gtk_widget_set_sensitive(w,nc);
|
|
global g_current_get_focus_widget;
|
|
if nc and 0=g_current_get_focus_widget then
|
|
begin
|
|
fh := g_object_get_data(w,"gtk_focus_widget_handle") ;
|
|
if fh and GTK_WIDGET(fh) then
|
|
begin
|
|
SetFocus(fh);
|
|
end
|
|
end
|
|
end
|
|
return r;
|
|
end
|
|
function CreateStreamOnHGlobal(hGlobal:pointer;fDeleteOnRelease:integer; var ppstm:pointer):pointer;
|
|
begin
|
|
ppstm := "";
|
|
return true;
|
|
end
|
|
function GetHGlobalFromStream(pstm:string; var phglobal:string):pointer;
|
|
begin
|
|
//
|
|
phglobal := pstm;
|
|
end
|
|
function memcpy2(var dst:string;src:string;size_t:integer):pointer;
|
|
begin
|
|
//字符串
|
|
dst := src;
|
|
return ;//
|
|
end
|
|
function GlobalUnlock(mem :string):integer;
|
|
begin
|
|
return mem;
|
|
end
|
|
function GlobalSize(menm:pointer):integer;
|
|
begin
|
|
return 0;//
|
|
end
|
|
function InvalidateRect(hwnd :pointer;rec:array of integer;f:integer):integer;
|
|
begin
|
|
h := g_object_get_data(hwnd,"gtk_clientwideget");
|
|
if h then
|
|
begin
|
|
//return gtk_widget_queue_draw(h);
|
|
if ifarray(rec) and ifnumber(rec[0]) and ifnumber(rec[1]) and ifnumber(rec[2]) and ifnumber(rec[3]) then
|
|
begin
|
|
gtk_widget_queue_draw_area(h,rec[0],rec[1],rec[2]-rec[0],rec[3]-rec[1]);
|
|
{echo "\r\nvalidate rect:",hwnd,"====",h,tostn(array(rec[0],rec[1],rec[2]-rec[0],rec[3]-rec[1]));
|
|
|
|
r := zeros(4);
|
|
hd := gtk_widget_get_window(h);
|
|
if hd then
|
|
begin
|
|
cr := gdk_cairo_create(hd);
|
|
echo "rueturna:",gdk_cairo_get_clip_rectangle(cr,r);
|
|
echo "\r\ngetset:",tostn(r);
|
|
end }
|
|
end
|
|
else
|
|
begin
|
|
gtk_widget_queue_draw(h);
|
|
//echo "\r\nvalidate nil:",hwnd,"====",h;
|
|
end
|
|
end
|
|
end
|
|
function InvalidateRect2(hwnd :pointer;rec:pointer;f:integer):integer;
|
|
begin
|
|
InvalidateRect(hwnd,0,f);
|
|
end
|
|
|
|
//////////////////////////////gdi///////////////////////////////////////////
|
|
function SelectObject(hdc :pointer;gdiobj:pointer);
|
|
begin
|
|
//
|
|
if not hdc then return 0;
|
|
if not(gdiobj>0 or gdiobj<0) then return 0;
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then return 0;
|
|
obj := gtk_gdi_object_globals[inttostr(gdiobj)];
|
|
if not obj then return 0;
|
|
t := obj[1];
|
|
o := obj[0];
|
|
case obj[1] of
|
|
"pen":
|
|
begin
|
|
r := gtk_object_get_data(hdc,"pen");
|
|
gtk_object_set_data(hdc,"pen",gdiobj);
|
|
gtk_object_set_data(hdc,"pen.color",o.color);
|
|
gtk_object_set_data(hdc,"pen.width",o.width);
|
|
gtk_object_set_data(hdc,"pen.style",o.style);
|
|
end
|
|
"brush":
|
|
begin
|
|
r := gtk_object_get_data(hdc,"brush");
|
|
gtk_object_set_data(hdc,"brush",gdiobj);
|
|
gtk_object_set_data(hdc,"brush.color",o.color);
|
|
end
|
|
"font":
|
|
begin
|
|
r := gtk_object_get_data(hdc,"font");
|
|
gtk_object_set_data(hdc,"font",gdiobj);
|
|
end
|
|
"rgn":
|
|
begin
|
|
r := gtk_object_get_data(hdc,"rgn");
|
|
gtk_object_set_data(hdc,"rgn",gdiobj);
|
|
end
|
|
end ;
|
|
return r;
|
|
end
|
|
Function TextOutA(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer;
|
|
begin
|
|
cl := gtk_object_get_data(hdc,"text.color");
|
|
// gtk_rgb_color_rgb(cl,r,g,b);
|
|
// cairo_set_source_rgb(hdc, r, g, b);
|
|
xb := gtk_object_get_data(hdc,"viewport.x");
|
|
yb := gtk_object_get_data(hdc,"viewport.y");
|
|
ft := gtk_object_get_data(hdc,"font");
|
|
global gtk_gdi_object_globals;
|
|
if ft and ifarray(gtk_gdi_object_globals) then
|
|
begin
|
|
fto := gtk_gdi_object_globals[inttostr(ft)];
|
|
if fto then fto := fto[0];
|
|
if fto then //文字处理
|
|
begin
|
|
fc := fto._getvalue_("facename");
|
|
ht := fto._getvalue_("height");
|
|
wd := fto._getvalue_("width");
|
|
it := fto._getvalue_("italic");
|
|
wt := fto._getvalue_("weight")=700;
|
|
udl := fto._getvalue_("underline");
|
|
fnotset := false;
|
|
{fns := static pango_font_family_get_names();
|
|
for i,v in fns do
|
|
begin
|
|
if v=fc then
|
|
begin
|
|
fnotset := true;
|
|
break;
|
|
end
|
|
end }
|
|
cft := (fnotset?fc:"AR PL UKai CN");
|
|
global g_gtk_font_get_size ;
|
|
if not ifarray(g_gtk_font_get_size) then g_gtk_font_get_size := array();
|
|
cfinfo := g_gtk_font_get_size[cft,ht,wd,it,wt];
|
|
if cfinfo then
|
|
begin
|
|
wd := cfinfo["width"];
|
|
dkzt := cfinfo["zczw"];
|
|
iwd2 := cfinfo["iwd2"];
|
|
cairo_select_font_face(hdc,cft,it,wt);
|
|
cairo_set_font_size(hdc,cfinfo["iwd2"]);
|
|
end else
|
|
begin
|
|
cairo_select_font_face(hdc,cft,it,wt);
|
|
ext := new _cairo_text_extents_t(nil);
|
|
brk := 0;
|
|
wd2 := wd*2-2-wt; //稍微缩小一点
|
|
iwd2 := wd2;
|
|
brk_Ct := 0;
|
|
dkzt := false;
|
|
while not brk do
|
|
begin
|
|
brk_Ct++;
|
|
cairo_set_font_size(hdc,iwd2);
|
|
cairo_text_extents(hdc, U"国", ext._getptr_());
|
|
nwd := ext.width;
|
|
if brk_Ct = 1 then
|
|
begin
|
|
cairo_text_extents(hdc, U"i", ext._getptr_());
|
|
nwd2 := ext.width;
|
|
dkzt := (nwd2/nwd)>0.6;
|
|
//echo "\r\n*********************",(nwd2/nwd);
|
|
if dkzt then //不支持中文,稍微放大一点
|
|
begin
|
|
wd2 := wd+1+it-wt;
|
|
iwd2 := wd+1+it-wt;
|
|
end
|
|
end
|
|
if nwd>(wd2+0.4) then
|
|
begin
|
|
iwd2-=0.25;
|
|
end else
|
|
if nwd<(wd2) then
|
|
begin
|
|
iwd2+=0.25;
|
|
end else
|
|
begin
|
|
brk := true;
|
|
end
|
|
if brk_Ct>50 then break;
|
|
end
|
|
g_gtk_font_get_size[cft,ht,wd,it,wt] := array("width":wd,"zczw":dkzt,"iwd2":iwd2);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
wid := wd;
|
|
idx := 1 ;
|
|
tlen := (len<0)?length(txt):(min(len,length(txt)));
|
|
xp := x+xb;
|
|
yp := y+yb+ht;
|
|
///////////////////背景/////////////////////////////////////////
|
|
if gtk_object_get_data(hdc,"font.bkmode") = 2 then
|
|
begin
|
|
gtk_rgb_color_rgb(gtk_object_get_data(hdc,"font.bkcolor"),r,g,b);
|
|
//cairo_fill
|
|
cairo_move_to(hdc,xp,yp);
|
|
cairo_line_to(hdc,xp+wid*tlen,yp);
|
|
cairo_line_to(hdc,xp+wid*tlen,yp-ht);
|
|
cairo_line_to(hdc,xp,yp-ht);
|
|
cairo_line_to(hdc,xp,yp);
|
|
cairo_set_source_rgb(hdc, r, g, b);
|
|
cairo_fill(hdc);
|
|
end
|
|
gtk_rgb_color_rgb(cl,r,g,b);
|
|
cairo_set_source_rgb(hdc, r, g, b);
|
|
////////////////////////////////////////////////////////
|
|
if udl then
|
|
begin
|
|
cairo_set_line_width(hdc,0.5);
|
|
end
|
|
while idx<=tlen do
|
|
begin
|
|
if udl then bxp := xp;
|
|
ci := GetChar(txt,idx);
|
|
{if ci=13 then // \n
|
|
begin
|
|
idx++;
|
|
yp+=ht;
|
|
continue;
|
|
end else // \r
|
|
if ci = 10 then
|
|
begin
|
|
idx++;
|
|
xp := x+xb;
|
|
continue;
|
|
end }
|
|
cairo_move_to(hdc,xp,yp);
|
|
if (ci .& 0x80) then
|
|
begin
|
|
if idx<tlen then
|
|
cairo_show_text(hdc,TslStringToGtk2( txt[idx:idx+1]));
|
|
idx++;
|
|
if not dkzt then xp+=wid;
|
|
end
|
|
else
|
|
begin
|
|
if ci>14 then
|
|
cairo_show_text(hdc,TslStringToGtk2( txt[idx]));
|
|
end
|
|
xp+=wid;
|
|
idx++;
|
|
if udl then
|
|
begin
|
|
cairo_move_to(hdc,bxp,yp);
|
|
cairo_line_to(hdc,xp,yp);
|
|
end
|
|
//cairo_move_to(hdc,xp,yp);
|
|
end
|
|
cairo_stroke(hdc);
|
|
return 1;
|
|
end
|
|
Function DrawTextA(hdc :pointer;txt:string;len:integer;rec:array of integer;fmt:integer):integer;
|
|
begin
|
|
//输出字符数
|
|
//方位
|
|
return DrawTextExA(hdc,txt,len,rec,fmt,0);
|
|
end
|
|
Function DrawTextExA(hdc :pointer;txt:string;len:integer;rec:array of integer;fmt:integer;lpdtp:pointer):integer;
|
|
begin
|
|
slen := length( txt);
|
|
if slen<1 then return ;
|
|
ft := gtk_object_get_data(hdc,"font");
|
|
global gtk_gdi_object_globals;
|
|
if ft and ifarray(gtk_gdi_object_globals) then
|
|
begin
|
|
fto := gtk_gdi_object_globals[inttostr(ft)];
|
|
if fto then fto := fto[0];
|
|
wd := fto._getvalue_("width");
|
|
ht := fto._getvalue_("height");
|
|
end
|
|
//DT_LEFT := 0;
|
|
DT_RIGHT := 0x2;
|
|
//DT_TOP := 0;
|
|
DT_BOTTOM:= 0x8;
|
|
DT_CENTER := 0x1;
|
|
DT_VCENTER:= 0x4;
|
|
//DT_SINGLELINE:= 0x20;
|
|
//DT_TABSTOP:= 0x80;
|
|
rw := rec[2]-rec[0];
|
|
nlen := min(len, min(integer(rw/wd),slen));
|
|
sx := rec[0];
|
|
rh := rec[3]-rec[1];
|
|
sy := rec[1];
|
|
if fmt=0 or not(fmt>0 or fmt<0 ) then
|
|
begin
|
|
|
|
end
|
|
if (fmt .& DT_CENTER)=DT_CENTER then //处理
|
|
begin
|
|
if nlen = slen then
|
|
begin
|
|
sx +=(rw-(nlen*wd))/2;
|
|
end
|
|
|
|
end
|
|
if (fmt .& DT_VCENTER)=DT_VCENTER then //处理
|
|
begin
|
|
if rh>ht then
|
|
begin
|
|
sy+=(rh-ht)/2;
|
|
end
|
|
end
|
|
if (fmt .& DT_RIGHT)=DT_RIGHT then //不处理
|
|
begin
|
|
if rw>(nlen*wd) then
|
|
begin
|
|
sx := rec[2]-((nlen*wd));
|
|
end
|
|
end
|
|
if (fmt .& DT_BOTTOM)=DT_BOTTOM then //不处理
|
|
begin
|
|
sy := rec[3]-3-ht;
|
|
end
|
|
r := TextOutA(hdc,sx,sy,txt,nlen);
|
|
return r;
|
|
rr := gtk_object_get_data(hdc,"rgn");
|
|
if rr then
|
|
begin
|
|
p := new TCRect(gdiobj);
|
|
rc := p._getdata_();
|
|
cairo_reset_clip(hdc);
|
|
cairo_rectangle(hdc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]);
|
|
cairo_clip(hdc);
|
|
end else
|
|
begin
|
|
cairo_reset_clip(hdc);
|
|
end
|
|
return r;
|
|
end
|
|
Function SetTextColor(hdc :pointer;col:integer):integer;
|
|
begin
|
|
gtk_object_set_data(hdc,"text.color",col);
|
|
return true;
|
|
end
|
|
Function SetPixel(dc,x,y,colr);
|
|
begin
|
|
if not dc then return ;
|
|
if ifnumber(x) and ifnumber(y) then
|
|
begin
|
|
pc := colr;
|
|
MoveToEx(dc,x,y);
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
gtk_object_set_data(dc,"pen.color",colr);
|
|
gtk_object_set_data(dc,"pen.width",2);
|
|
LineTo(dc,x+1,y+1);
|
|
gtk_object_set_data(dc,"pen.color",pc);
|
|
gtk_object_set_data(dc,"pen.width",pw);
|
|
return 1;
|
|
end
|
|
end
|
|
|
|
Function FillRect(dc:pointer;rec:array of integer;br:pointer):integer;
|
|
begin
|
|
if not dc then return ;
|
|
if ifarray(rec) then
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
brs := gtk_gdi_object_globals[inttostr(br)];
|
|
if not brs then return 0;
|
|
cl := brs[0].Color;
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]);
|
|
gtk_rgb_color_rgb(cl,r,g,b);
|
|
cairo_set_source_rgb(dc,r,g,b);
|
|
cairo_fill(dc);
|
|
end
|
|
end
|
|
Function InvertRect(dc:pointer;rec:array of integer;br:pointer):integer;
|
|
begin
|
|
if not dc then return ;
|
|
if ifarray(rec) then
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
brs := gtk_gdi_object_globals[inttostr(br)];
|
|
if not brs then return 0;
|
|
cl := brs[0].Color;
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]);
|
|
gtk_rgb_color_rgb(cl,r,g,b);
|
|
cairo_set_source_rgb(dc,1-r,1-g,1-b);
|
|
cairo_fill(dc);
|
|
end
|
|
end
|
|
function ReleaseDC(hwd :pointer;hdc:pointer):integer;
|
|
begin
|
|
DeleteDC(hdc);
|
|
end
|
|
function SelectClipRgn(hdc :pointer;gdiobj:pointer);
|
|
begin
|
|
|
|
r := SelectObject(hdc,gdiobj);
|
|
if not(gdiobj) then
|
|
begin
|
|
gtk_object_set_data(hdc,"rgn",nil);
|
|
cairo_reset_clip(hdc);
|
|
end
|
|
else
|
|
begin
|
|
rr := gtk_object_get_data(hdc,"rgn");
|
|
if rr <> gdiobj then return ;
|
|
p := new TCRect(gdiobj);
|
|
rc := p._getdata_();
|
|
cairo_reset_clip(hdc);
|
|
x := gtk_object_get_data(dc,"viewport.x"); //控制基准位置
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
cairo_rectangle(hdc,rc[0]+x,rc[1]+y,rc[2]-rc[0],rc[3]-rc[1]);
|
|
cairo_clip(hdc);
|
|
//gtk_object_set_data(hdc,"rgn",gdiobj);
|
|
end
|
|
return r;
|
|
end
|
|
function CreateRectRgn(nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer):pointer;
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
p := new TCRect();
|
|
p.left := nLeftRect;
|
|
p.top := nTopRect;
|
|
p.right := nRightRect;
|
|
p.bottom := nBottomRect;
|
|
ptr := p._getptr_();
|
|
gtk_gdi_object_globals[inttostr(ptr)] := array(p,"rgn");
|
|
return ptr;
|
|
end
|
|
function CombineRgn(hrgnDest:pointer;hrgnSrc1:pointer;hrgnSrc2:pointer; fnCombineMode:integer):integer;
|
|
begin
|
|
//RGN_ERROR := 0x0;RGN_AND := 0x1;RGN_OR := 0x2;RGN_XOR := 0x3;RGN_DIFF := 0x4;RGN_COPY := 0x5;
|
|
rd := new TCRect(hrgnDest);
|
|
rs1 := new TCRect(hrgnSrc1);
|
|
if fnCombineMode=0x1 then
|
|
begin
|
|
rs2 := new TCRect(hrgnSrc2);
|
|
rd.left := max(rs1.left,rs2.left);
|
|
rd.top := max(rs1.top,rs2.top);
|
|
rd.right := min(rs1.right,rs2.right);
|
|
rd.bottom := min(rs1.bottom,rs2.bottom);
|
|
end else
|
|
if fnCombineMode=0x5 then
|
|
begin
|
|
rd.left := rs1.left ;
|
|
rd.top := rs1.top ;
|
|
rd.right := rs1.right ;
|
|
rd.bottom := rs1.bottom ;
|
|
end
|
|
return ret;
|
|
end
|
|
|
|
function SetViewportOrgEx(dc:pointer;x:integer;y:integer;var pt:array of integer):integer;
|
|
begin
|
|
if not dc then return 0;
|
|
gtk_object_set_data(dc,"viewport.x",x);
|
|
gtk_object_set_data(dc,"viewport.y",y);
|
|
return 1;
|
|
end
|
|
|
|
function DeleteObject(gdiobj :pointer);//删除gdi对象
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then return 0;
|
|
r := gtk_gdi_object_globals[inttostr( gdiobj)];
|
|
if r then
|
|
begin
|
|
reindex(gtk_gdi_object_globals,array(inttostr(gdiobj):nil));
|
|
return true;
|
|
end
|
|
class(TGdiplusflat).GdipDisposeImage(gdiobj);
|
|
return 0;
|
|
end
|
|
function DestroyIcon(icon:pointer):integer;
|
|
begin
|
|
return DeleteObject(icon);
|
|
end
|
|
function DestroyCursor(cursor:pointer):integer;
|
|
begin
|
|
return DeleteObject(cursor);
|
|
end
|
|
function SetActiveWindow(h);
|
|
begin
|
|
hh := gtk_widget_get_toplevel(h);
|
|
if hh then gtk_window_present(hh);
|
|
end
|
|
function CreatePen(FS,w,FC); //gtk 模拟 pen
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
p := new ttgtk_pen();
|
|
p.width := w;
|
|
p.color := FC;
|
|
p.style := fs;
|
|
ptr := p._getptr_();
|
|
gtk_gdi_object_globals[inttostr(ptr)] := array(p,"pen");
|
|
return ptr;
|
|
//构造画笔
|
|
end
|
|
function CreateSolidBrush(crColor:integer);
|
|
begin
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
p := new ttgtk_brush();
|
|
p.color := crColor;
|
|
ptr := p._getptr_();
|
|
gtk_gdi_object_globals[inttostr(ptr)] := array(p,"brush");
|
|
return ptr;
|
|
end
|
|
function CreateFontIndirectA(lplf:pointer);
|
|
begin
|
|
|
|
global gtk_gdi_object_globals;
|
|
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
|
|
p := new ttgtk_font();
|
|
p2 := new ttgtk_font(lplf);
|
|
for i,v in array("height","width","escapement","orientation","weight","italic","underline","strikeout","charset","outprecision","clipprecision","quality","pitchandfamily","facename") do
|
|
p._setvalue_(v,p2._getvalue_(v));
|
|
ptr := p._getptr_();
|
|
gtk_gdi_object_globals[inttostr(ptr)] := array(p,"font");
|
|
return ptr;
|
|
end
|
|
Function GetTextMetricsA(hdc :pointer;TM:pointer):integer;
|
|
begin
|
|
|
|
end
|
|
Function MoveToEx(hdc :pointer;x:integer;y:integer;var point:array of integer):integer;
|
|
begin
|
|
xb := gtk_object_get_data(hdc,"viewport.x");
|
|
yb := gtk_object_get_data(hdc,"viewport.y");
|
|
//cairo_move_to(hdc,x+xb,y+yb);
|
|
xy := gtk_object_get_data(hdc,"movepointto");
|
|
if xy then
|
|
begin
|
|
point := xy;
|
|
end else point := array(0,0);
|
|
gtk_object_set_data(hdc,"movepointto",array(x,y));
|
|
end
|
|
Function LineTo(dc :pointer;x:integer;y:integer):integer;
|
|
begin
|
|
xb := gtk_object_get_data(dc,"viewport.x");
|
|
yb := gtk_object_get_data(dc,"viewport.y");
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
pt := gtk_object_get_data(dc,"pen.style");
|
|
if pw>0 then cairo_set_line_width(dc,pw);
|
|
else cairo_set_line_width(dc,1);
|
|
if pc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(pc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_applay_pen_style(dc);
|
|
xy := gtk_object_get_data(dc,"movepointto");
|
|
if xy then
|
|
begin
|
|
cairo_move_to(dc,xy[0]+xb,xy[1]+yb);
|
|
end
|
|
gtk_object_set_data(dc,"movepointto",array(x,y));
|
|
cairo_line_to(dc,x+xb,y+yb);
|
|
cairo_stroke(dc);
|
|
|
|
end
|
|
|
|
//////////////////////////gtk 菜单//////////////////
|
|
Function CreateMenu():pointer;
|
|
begin
|
|
r := gtk_menu_bar_new();
|
|
gtk_widget_show(r);
|
|
return r;
|
|
end
|
|
Function CreatePopupMenu():pointer;
|
|
begin
|
|
//弹出菜单
|
|
r := gtk_menu_new();
|
|
gtk_widget_show(r);
|
|
g_object_set_data(r,"popmenubar",true);
|
|
return r;
|
|
end
|
|
Function DestroyMenu(hMenu:pointer):integer;
|
|
begin
|
|
if hMenu and GTK_WIDGET(hMenu) then
|
|
return gtk_widget_destroy(hMenu);
|
|
end
|
|
Function DrawMenuBar(hwd:pointer):integer; //处理菜单栏
|
|
begin
|
|
h :=g_object_get_data(hwd,"gtk_layout_height");
|
|
w :=g_object_get_data(hwd,"gtk_layout_width");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
gtk_widgetsizechanged(hwd,max(0,h-pcd),w);
|
|
end
|
|
Function SetMenu(hwd:pointer;hmenu:pointer):integer; //设置菜单栏
|
|
begin
|
|
vb := g_object_get_data(hwd,"gtk_vbox");
|
|
if not vb then return ;
|
|
mb := g_object_get_data(hwd,"menubar");
|
|
if mb = hmenu then return ;
|
|
{if mb and GTK_WIDGET(mb) then
|
|
begin
|
|
gist := gtk_container_get_children(mb);
|
|
ridx := 0;
|
|
while gist do
|
|
begin
|
|
og := new _gslist(gist);
|
|
dt := og.data;
|
|
if dt then
|
|
gtk_container_remove(mb,dt);
|
|
ridx++;
|
|
gist := og.next;
|
|
end
|
|
gtk_widget_destroy(mb);
|
|
end}
|
|
if hmenu then
|
|
begin
|
|
g_object_set_data(hwd,"menubar",hmenu);
|
|
g_object_set_data(hmenu,"menubarwindow",hwd);
|
|
gtk_box_pack_start(vb,hmenu,0,0,0);
|
|
gtk_widget_realize(hmenu);
|
|
//gtk_widget_show_all(hmenu);
|
|
end
|
|
else
|
|
begin
|
|
g_object_set_data(hwd,"menubar",0);
|
|
end
|
|
h :=g_object_get_data(hwd,"gtk_layout_height");
|
|
w :=g_object_get_data(hwd,"gtk_layout_width");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
gtk_widgetsizechanged(hwd,max(0,h-pcd),w);
|
|
//移除原有窗口
|
|
//menubar 添加到窗口
|
|
end
|
|
Function RemoveMenu( hMenu:pointer; uPosition:integer;uFlags:integer):integer;
|
|
begin
|
|
mi := gtk_menu_shell_get_by_positon(hmenu,uPosition);
|
|
if mi then
|
|
begin
|
|
g_object_ref(mi);
|
|
gtk_container_remove(hMenu,mi);
|
|
return true;
|
|
end
|
|
|
|
//移除菜单项目
|
|
end
|
|
Function SetMenuItemInfoA( hMenu:pointer; uItem:integer;fByPosition:integer;lpmii:pointer):integer;
|
|
begin
|
|
return gtk_SetMenuItemInfoA(hMenu,uitem,fbyposition,lpmii);
|
|
//添加菜单
|
|
end
|
|
Function InsertMenuItemA( hMenu:pointer;uItem:integer;fByPosition:integer;lpmii:pointer):integer;
|
|
begin
|
|
return gtk_insertmenuitema(hMenu,uitem,fbyposition,lpmii);
|
|
//添加菜单
|
|
end
|
|
Function TrackPopupMenu( hMenu:pointer;uFlags:integer; x:integer; y:integer; nReserved:integer;hWnd:pointer; prcRect: array of integer):integer;
|
|
begin
|
|
//echo "\r\n===trackmenu:",hmenu,"===",x,"===",y,"===",nReserved,"===hwnd:",hwnd,"===rect:",tostn(prcRect);
|
|
if g_object_get_data(hMenu,"popmenubar") then
|
|
begin
|
|
g_object_set_data(hMenu,"popmenubarwindow",hWnd);
|
|
gtk_menu_popup(hmenu,0,0,0,0,3,0);//弹出
|
|
//popup_at_rect(hmenu,0,array(x,y,-1,-1),0,0,0);
|
|
return 1;
|
|
end else
|
|
begin
|
|
|
|
end
|
|
//弹出菜单
|
|
end
|
|
|
|
function ClientToScreen(hwnd :pointer;var p:array of integer):integer; // 继续努力
|
|
begin
|
|
if not hwnd then return ;
|
|
if not GTK_WIDGET(hwnd) then return ;
|
|
x := g_object_get_data(hwnd,"gtk_layout_x");
|
|
y := g_object_get_data(hwnd,"gtk_layout_y");
|
|
p[0]+=x;
|
|
p[1]+=y;
|
|
if not gtk_widget_is_toplevel(hwnd) then
|
|
begin
|
|
phwnd := GetParent(hwnd);
|
|
return ClientToScreen(phwnd,p);
|
|
end else
|
|
begin
|
|
mb := g_object_get_data(hwnd,"menubar");
|
|
if mb and gtk_widget_is_visible(mb) then
|
|
begin
|
|
rec := zeros(4);
|
|
gtk_widget_get_allocation(mb,rec);
|
|
if rec[3]>1 then
|
|
begin
|
|
p[1]+= rec[3] ;//max(rec[3],25);
|
|
end
|
|
end
|
|
end
|
|
return true;
|
|
end
|
|
function ScreenToClient(hwnd :pointer;var p:array of integer):integer;// 继续努力
|
|
begin
|
|
p1 := array(0,0);
|
|
ClientToScreen(hwnd,p1);
|
|
p[0]-=p1[0];
|
|
p[1]-=p1[1];
|
|
return true;
|
|
end
|
|
function BeginPaint(hwd :pointer;strc:pointer):pointer;
|
|
begin
|
|
psc := new TPAINTSTRUCT(strc);
|
|
dc := g_object_get_data(hwd,"paint_dc");
|
|
//h := g_object_get_data(hwd,"paint_height");
|
|
//w := g_object_get_data(hwd,"paint_width");
|
|
rec := g_object_get_data(hwd,"paint_rect");
|
|
psc._setvalue_("hdc",dc);
|
|
psc._setvalue_("rcpaint",array(rec[0],rec[1],rec[0]+rec[2],rec[1]+rec[3])); //{array(0,0,w,h)}
|
|
return dc;
|
|
end
|
|
function EndPaint(hwd :pointer;strc:pointer):integer;
|
|
begin
|
|
return 0;
|
|
end
|
|
function GetDC(hwd);
|
|
begin
|
|
if hwd<0 or hwd>0 then
|
|
begin
|
|
hwcr := g_object_get_data(h,"gtk_clientwideget");
|
|
if hwcr>0 or hwcr<0 then return gdk_cairo_create(gtk_widget_get_window(hwcr));
|
|
end else
|
|
if hwd=0 then
|
|
begin
|
|
return 1;
|
|
end
|
|
end
|
|
function SaveDC(hdc :pointer):integer;
|
|
begin
|
|
if not(hdc>0 or hdc<0) then return ;
|
|
cairo_save(hdc); //需要处理
|
|
end
|
|
function RestoreDC(hdc :pointer;nSavedDC:integer):integer;
|
|
begin
|
|
if not(hdc>0 or hdc<0) then return ;
|
|
cairo_restore(hdc); //需要处理
|
|
end
|
|
function DeleteDC(hdc :pointer):integer;
|
|
begin
|
|
if not(hdc>0 or hdc<0) then return ;
|
|
gtk_object_set_data(hdc); //清空
|
|
cairo_destroy(hdc); //需要处理
|
|
end
|
|
function GetTextExtentPoint32A(hdc:pointer;lpString:string;c:integer; psizl:pointer):integer;
|
|
begin
|
|
end
|
|
function GetTextExtentPoint32A2(hdc:pointer;lpString:string;c:integer; var psizl:array of integer):integer;
|
|
begin
|
|
psizl := array(0,0);
|
|
if not(hdc>0 or hdc<0) then return 0;
|
|
if not( ifstring(lpString) and c>0 and c>=length(lpString)) then return 0;
|
|
ft := gtk_object_get_data(hdc,"font");
|
|
global gtk_gdi_object_globals;
|
|
wd := 8;
|
|
ht := 16;
|
|
if ft and ifarray(gtk_gdi_object_globals) then
|
|
begin
|
|
fto := gtk_gdi_object_globals[inttostr(ft)];
|
|
if fto then fto := fto[0];
|
|
if fto then //文字处理
|
|
begin
|
|
fc := fto._getvalue_("facename");
|
|
ht := fto._getvalue_("height");
|
|
wd := fto._getvalue_("width");
|
|
end
|
|
end
|
|
psizl[0] := wd*length(lpString);
|
|
psizl[1] := ht;
|
|
return 1;
|
|
|
|
end
|
|
function GetCharWidthA(hdc:pointer;iFirst:integer;iLast:integer;var lpBuffer:array of integer):integer;
|
|
begin
|
|
|
|
|
|
end
|
|
Function Rectangle(dc :pointer;l:integer;t:integer;r:integer;b:integer):integer;
|
|
begin
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
if pw>0 then cairo_set_line_width(dc,pw);
|
|
else cairo_set_line_width(dc,1);
|
|
if pc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(pc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_applay_pen_style(dc);
|
|
cairo_move_to(dc,l+x,t+y);
|
|
cairo_line_to(dc,r+x,t+y);
|
|
cairo_line_to(dc,r+x,b+y);
|
|
cairo_line_to(dc,l+x,b+y);
|
|
cairo_line_to(dc,l+x,t+y);
|
|
cairo_stroke(dc);
|
|
//return
|
|
cairo_stroke_preserve(dc);
|
|
bsh := gtk_object_get_data(dc,"brush.color");
|
|
gtk_rgb_color_rgb(bsh,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
cairo_fill(dc);
|
|
end
|
|
Function Ellipse(dc :pointer;l:integer;t:integer;r:integer;b:integer):integer;
|
|
begin
|
|
//圆心
|
|
//长度
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
brc := gtk_object_get_data(dc,"brush.color");
|
|
if pw>0 then cairo_set_line_width(dc,pw);
|
|
else cairo_set_line_width(dc,1);
|
|
mx := (l+r)/2+x;
|
|
my := (b+t)/2+y;
|
|
cairo_translate(dc,mx,my);
|
|
rx := (r-l)/2;
|
|
ry := (b-t)/2;
|
|
cairo_scale(dc,1,ry/rx);
|
|
cairo_applay_pen_style(dc);
|
|
cairo_arc(dc, 0, 0, rx, 0, 2 * 3.14);
|
|
if brc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(brc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_fill_preserve(dc);
|
|
if pc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(pc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_stroke(dc);
|
|
cairo_scale(dc,1,rx/ry);
|
|
cairo_translate(dc,0-mx,0-my);
|
|
end
|
|
Function RoundRect(dc :pointer;l:integer;t:integer;r:integer;b:integer;wid:integer;ht:integer):integer;
|
|
begin
|
|
xb := gtk_object_get_data(dc,"viewport.x");
|
|
yb := gtk_object_get_data(dc,"viewport.y");
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
|
|
if pw>0 then cairo_set_line_width(dc,pw);
|
|
else cairo_set_line_width(dc,1);
|
|
cairo_applay_pen_style(dc);
|
|
cairo_draw_round_rectangle(dc,l,t,r-l,b-t,wid);
|
|
|
|
bsh := gtk_object_get_data(dc,"brush.color");
|
|
gtk_rgb_color_rgb(bsh,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
cairo_fill_preserve(dc); //绘制底色
|
|
if pc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(pc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_stroke(dc);//绘制边框
|
|
return ;
|
|
end
|
|
Function Chord(hdc :pointer;l:integer;t:integer;r:integer;b:integer;wid:integer;ht:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function Pie(hdc :pointer;nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer;nXRadial1:integer;nYRadial1:integer;nXRadial2:integer;nYRadial2:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function SetArcDirection(hdc :pointer;direct:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function Arc(hdc :pointer;nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer;nXRadial1:integer;nYRadial1:integer;nXRadial2:integer;nYRadial2:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function Polygon(hdc :pointer;points:array of integer;n:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function PolyBezier(hdc :pointer;points:array of integer;n:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function SetPolyFillMode(hdc :pointer;md:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function Polyline(dc :pointer;points:array of integer;n:integer):integer;
|
|
begin
|
|
if n<2 then return ;
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
pc := gtk_object_get_data(dc,"pen.color");
|
|
pw := gtk_object_get_data(dc,"pen.width");
|
|
if pw>0 then cairo_set_line_width(dc,pw);
|
|
else cairo_set_line_width(dc,1);
|
|
if pc=0 then
|
|
begin
|
|
cairo_set_source_rgb(dc,0,0,0);
|
|
end else
|
|
begin
|
|
gtk_rgb_color_rgb(pc,rc,gc,bc);
|
|
cairo_set_source_rgb(dc,rc,gc,bc);
|
|
end
|
|
cairo_move_to(dc,points[0]+x,Points[1]+y);
|
|
cairo_applay_pen_style(dc);
|
|
for i := 1 to n-1 do
|
|
begin
|
|
cairo_line_to(dc,Points[i*2]+x,Points[i*2+1]+y);
|
|
end
|
|
cairo_stroke(dc);
|
|
end
|
|
Function PolyPolyline(hdc :pointer;points:array of integer;pc:array of integer;n:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function DrawFrameControl(DC:pointer; var LPRECT: array of integer ; dr1 :integer;dr2:integer):integer;
|
|
begin
|
|
{
|
|
DFC_SCROLL := 0x3;DFC_BUTTON := 0x4;DFC_POPUPMENU := 0x5;
|
|
DFCS_CAPTIONCLOSE := 0x0;DFCS_CAPTIONMIN := 0x1;DFCS_CAPTIONMAX := 0x2;
|
|
DFCS_CAPTIONRESTORE := 0x3;DFCS_CAPTIONHELP := 0x4;DFCS_MENUARROW := 0x0;
|
|
DFCS_MENUCHECK := 0x1;DFCS_MENUBULLET := 0x2;DFCS_MENUARROWRIGHT := 0x4;
|
|
DFCS_SCROLLUP := 0x0;DFCS_SCROLLDOWN := 0x1;DFCS_SCROLLLEFT := 0x2;
|
|
DFCS_SCROLLRIGHT := 0x3;DFCS_SCROLLCOMBOBOX := 0x5;DFCS_SCROLLSIZEGRIP := 0x8;
|
|
DFCS_SCROLLSIZEGRIPRIGHT := 0x10;DFCS_BUTTONCHECK := 0x0;DFCS_BUTTONRADIOIMAGE := 0x1;
|
|
DFCS_BUTTONRADIOMASK := 0x2;DFCS_BUTTONRADIO := 0x4;DFCS_BUTTON3STATE := 0x8;
|
|
DFCS_BUTTONPUSH := 0x10;DFCS_INACTIVE := 0x100;DFCS_PUSHED := 0x200;
|
|
DFCS_CHECKED := 0x400;DFCS_TRANSPARENT := 0x800;DFCS_HOT := 0x1000;
|
|
DFCS_ADJUSTRECT := 0x2000;DFCS_FLAT := 0x4000;DFCS_MONO := 0x8000;
|
|
|
|
}
|
|
x := gtk_object_get_data(dc,"viewport.x");
|
|
y := gtk_object_get_data(dc,"viewport.y");
|
|
case dr1 of
|
|
0x4 : //DFC_BUTTON
|
|
begin
|
|
//if dr2 = 0x10 then // DFCS_BUTTONPUSH
|
|
//begin
|
|
|
|
//end else
|
|
cairo_applay_pen_style(dc);
|
|
if dr2 = 0 then // DFCS_BUTTONCHECK
|
|
begin
|
|
cairo_set_source_rgb(dc,135/255,135/255,135/255);
|
|
cairo_set_line_width(dc,5);
|
|
|
|
cairo_rectangle(dc, LPRECT[0]+x, LPRECT[1]+y, LPRECT[2]-LPRECT[0], LPRECT[3]-LPRECT[1]);
|
|
cairo_stroke_preserve(dc);
|
|
cairo_set_source_rgb(dc,1,1,1);
|
|
cairo_fill(dc);
|
|
end else
|
|
if dr2 = 0x400 then // DFCS_CHECKED
|
|
begin
|
|
cairo_set_source_rgb(dc,135/255,135/255,135/255);
|
|
cairo_set_line_width(dc,5);
|
|
|
|
cairo_rectangle(dc, LPRECT[0]+x, LPRECT[1]+y, LPRECT[2]-LPRECT[0], LPRECT[3]-LPRECT[1]);
|
|
cairo_stroke_preserve(dc);
|
|
cairo_set_source_rgb(dc,1,1,1);
|
|
cairo_fill(dc);
|
|
|
|
cairo_move_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/3);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/3,LPRECT[3]-2);
|
|
cairo_line_to(dc,LPRECT[2]-2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/4);
|
|
cairo_set_source_rgb(dc,100/255,100/255,100/255);
|
|
cairo_set_line_width(dc,4);
|
|
cairo_stroke(dc);
|
|
end else
|
|
if dr2 = 0x1 then // DFCS_BUTTONRADIOIMAGE
|
|
begin
|
|
cairo_set_source_rgb(dc,135/255,135/255,135/255);
|
|
cairo_set_line_width(dc,5);
|
|
l := LPRECT[0];
|
|
r := LPRECT[2];
|
|
t := LPRECT[1];
|
|
b := LPRECT[3];
|
|
mx := (l+r)/2+x;
|
|
my := (b+t)/2+y;
|
|
cairo_translate(dc,mx,my);
|
|
rx := (r-l)/2;
|
|
ry := (b-t)/2;
|
|
cairo_scale(dc,1,ry/rx);
|
|
|
|
cairo_arc(dc, 0, 0, rx, 0, 2 * 3.14);
|
|
cairo_stroke_preserve(dc);
|
|
cairo_set_source_rgb(dc,1,1,1);
|
|
cairo_fill(dc);
|
|
cairo_set_line_width(dc,1);
|
|
cairo_arc(dc, 0, 0, max(rx-5,3), 0, 2 * 3.14);
|
|
cairo_set_source_rgb(dc,100/255,100/255,100/255);
|
|
cairo_fill(dc);
|
|
cairo_scale(dc,1,rx/ry);
|
|
cairo_translate(dc,0-mx,0-my);
|
|
end else
|
|
if dr2 = 0x4 then // DFCS_BUTTONRADIO
|
|
begin
|
|
cairo_set_source_rgb(dc,135/255,135/255,135/255);
|
|
cairo_set_line_width(dc,5);
|
|
l := LPRECT[0];
|
|
r := LPRECT[2];
|
|
t := LPRECT[1];
|
|
b := LPRECT[3];
|
|
mx := (l+r)/2+x;
|
|
my := (b+t)/2+y;
|
|
cairo_translate(dc,mx,my);
|
|
rx := (r-l)/2;
|
|
ry := (b-t)/2;
|
|
cairo_scale(dc,1,ry/rx);
|
|
|
|
cairo_arc(dc, 0, 0, rx, 0, 2 * 3.14);
|
|
cairo_stroke_preserve(dc);
|
|
cairo_set_source_rgb(dc,1,1,1);
|
|
cairo_fill(dc);
|
|
cairo_scale(dc,1,rx/ry);
|
|
cairo_translate(dc,0-mx,0-my);
|
|
end else
|
|
begin
|
|
cairo_set_line_width(dc,4);
|
|
|
|
cairo_rectangle(dc, LPRECT[0]+x, LPRECT[1]+y, LPRECT[2]-LPRECT[0], LPRECT[3]-LPRECT[1]);
|
|
{cairo_move_to(dc,LPRECT[0]+x,LPRECT[1]+y);
|
|
cairo_line_to(dc,LPRECT[2]+x,LPRECT[1]+y);
|
|
cairo_line_to(dc,LPRECT[2]+x,LPRECT[3]+y);
|
|
cairo_line_to(dc,LPRECT[0]+x,LPRECT[3]+y);
|
|
cairo_line_to(dc,LPRECT[0]+x,LPRECT[1]+y);
|
|
cairo_set_source_rgb(dc,200/255,200/255,200/255);
|
|
cairo_stroke_preserve(dc);
|
|
cairo_set_source_rgb(dc,221/255,221/255,221/255);
|
|
cairo_fill(dc);}
|
|
|
|
cairo_set_source_rgb(dc,221/255,221/255,221/255);
|
|
cairo_fill_preserve(dc);
|
|
cairo_set_source_rgb(dc,210/255,207/255,205/255);
|
|
cairo_stroke(dc);
|
|
end
|
|
end
|
|
0x3 : // DFC_SCROLL
|
|
begin
|
|
cairo_set_source_rgb(dc,221/255,221/255,221/255);
|
|
cairo_set_line_width(dc,0.1);
|
|
cairo_applay_pen_style(dc);
|
|
cairo_rectangle(dc, LPRECT[0]+x, LPRECT[1]+y, LPRECT[2]-LPRECT[0], LPRECT[3]-LPRECT[1]);
|
|
cairo_fill(dc);
|
|
|
|
if dr2 = 0 then // DFCS_SCROLLUP
|
|
begin
|
|
cairo_move_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/1.5);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/2,LPRECT[1]+3);
|
|
cairo_line_to(dc,LPRECT[2]-2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/1.5);
|
|
cairo_line_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/1.5);
|
|
cairo_set_source_rgb(dc,10/255,10/255,10/255);
|
|
cairo_fill(dc);
|
|
end else
|
|
if dr2 = 1 then // DFCS_SCROLLDOWN
|
|
begin
|
|
cairo_move_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/3);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/2,LPRECT[3]-3);
|
|
cairo_line_to(dc,LPRECT[2]-2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/3);
|
|
cairo_line_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/3);
|
|
cairo_set_source_rgb(dc,10/255,10/255,10/255);
|
|
cairo_fill(dc);
|
|
end
|
|
if dr2 = 2 then //DFCS_SCROLLLEFT;
|
|
begin
|
|
cairo_move_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])*2/3,LPRECT[1]+y+2);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])*2/3,LPRECT[3]+y-2);
|
|
cairo_line_to(dc,LPRECT[0]+x+2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/2);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])*2/3,LPRECT[1]+y+2);
|
|
|
|
cairo_set_source_rgb(dc,10/255,10/255,10/255);
|
|
cairo_fill(dc);
|
|
end else
|
|
if dr2 = 3 then //DFCS_SCROLLRIGHT;
|
|
begin
|
|
cairo_move_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/3,LPRECT[1]+y+2);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/3,LPRECT[3]+y-2);
|
|
cairo_line_to(dc,LPRECT[2]+x-2,LPRECT[1]+y+(LPRECT[3]-LPRECT[1])/2);
|
|
cairo_line_to(dc,LPRECT[0]+x+(LPRECT[2]-LPRECT[0])/3,LPRECT[1]+y+2);
|
|
|
|
cairo_set_source_rgb(dc,10/255,10/255,10/255);
|
|
cairo_fill(dc);
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
Function SetBkColor(dc:pointer;clrref:integer):integer;
|
|
begin
|
|
//font背景色
|
|
gtk_object_set_data(dc,"font.bkcolor",clrref);
|
|
end
|
|
Function GetBkColor(dc:pointer):integer;
|
|
begin
|
|
return gtk_object_get_data(dc,"font.bkcolor");
|
|
end
|
|
Function SetBkMode(dc:pointer;clrref:integer):integer;
|
|
begin
|
|
gtk_object_set_data(dc,"font.bkmode",clrref);
|
|
end
|
|
Function GetBkMode(dc:pointer):integer;
|
|
begin
|
|
return gtk_object_get_data(dc,"font.bkmode");
|
|
end
|
|
Function FillRgn(dc:pointer;rgn:pointer;br:pointer):integer;
|
|
begin
|
|
|
|
end
|
|
Function SetTextAlign(dc:pointer;fMode:integer):integer;
|
|
begin
|
|
|
|
end
|
|
Function SetWorldTransform(dc:pointer;lpXform:pointer):integer;
|
|
begin
|
|
|
|
end
|
|
|
|
function UpdateWindow(hwnd :pointer):integer;
|
|
begin
|
|
w :=g_object_get_data(hwnd,"gtk_layout_width");
|
|
h := g_object_get_data(hwnd,"gtk_layout_height");
|
|
global g_w_c_width;
|
|
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
gtk_widgetsizechanged(hwnd,max(0,h-pcd),w);
|
|
return true;
|
|
end
|
|
function ClipCursor(rec:array of integer):integer;
|
|
begin
|
|
|
|
end
|
|
function SetFocus(hwnd :pointer):pointer;
|
|
begin
|
|
cfcs := GetFocus();
|
|
if cfcs = hwnd then return 0;
|
|
if not(hwnd>0 or hwnd<0) then return 0;
|
|
ph := hwnd;
|
|
if not GTK_WIDGET(hwnd) then return 0;
|
|
if not gtk_widget_is_toplevel(hwnd) then
|
|
begin
|
|
ph := gtk_widget_get_toplevel(hwnd);
|
|
end
|
|
//if not lot then
|
|
//lot := hwnd;
|
|
//gtk_widget_grab_focus(lot);
|
|
//echo "\r\n+++setfocus>>>",ph,">>>",hwnd;
|
|
gtk_window_set_focus(ph,hwnd);
|
|
return 0;
|
|
|
|
end
|
|
function GetFocus():pointer;
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
if g_current_get_focus_widget then return g_current_get_focus_widget;
|
|
return 0;
|
|
end
|
|
Function LoadImageA(hinst:pointer;lpszName:string; uType:integer; cxDesired:integer;cyDesired:integer;fuLoad:integer):pointer;
|
|
begin
|
|
|
|
end
|
|
function LoadIconA2(t,id);
|
|
begin
|
|
|
|
end
|
|
function LoadBitmapA(hin:pointer;lpsz:string):pointer;
|
|
begin
|
|
|
|
end
|
|
function LoadBitmapA2(hin:pointer;lpsz:pointer):pointer;
|
|
begin
|
|
|
|
end
|
|
Function GetObjectA(hgdiobj:pointer;cbBuffer:integer;lpvObject:pointer):integer;
|
|
begin
|
|
bmpobj := new TSHBMP(lpvObject);
|
|
bmpobj.bmwidth := gdk_pixbuf_get_width(hgdiobj);
|
|
bmpobj.bmheight := gdk_pixbuf_get_height(hgdiobj);
|
|
return ;
|
|
end
|
|
function GetIconInfo(hIcon:pointer; piconinfo:pointer):integer;
|
|
begin
|
|
//icoobj := new TSHICON(lpvObject);
|
|
//icoobj.bmwidth := gdk_pixbuf_get_width(hgdiobj);
|
|
//icoobj.bmheight := gdk_pixbuf_get_height(hgdiobj);
|
|
return ;
|
|
end
|
|
function CreateCompatibleDC(hdc :pointer):pointer;
|
|
begin
|
|
sf := cairo_image_surface_create(0,100,100);
|
|
r := cairo_create(sf);
|
|
return r;
|
|
return 0;
|
|
end
|
|
Function SetCursor(hd:pointer):pointer;
|
|
begin
|
|
global g_show_cursor_window;
|
|
if g_show_cursor_window and hd<>0 then
|
|
gdk_window_set_cursor(g_show_cursor_window,hd);
|
|
end
|
|
function drawbitmaptodc(bm,hdc,x,y,rc,flag,thdc);
|
|
begin
|
|
if not hdc then return ;
|
|
xb := gtk_object_get_data(hdc,"viewport.x");
|
|
yb := gtk_object_get_data(hdc,"viewport.y");
|
|
img := class(TGdiplusflat).GdipGetbmpSurface(bm);
|
|
//cairo_set_source(hdc, img);
|
|
//cairo_pattern_set_extend(cairo_get_source(hdc),1);
|
|
cairo_set_source_surface(hdc, img, x-rc[0], y-rc[1]);
|
|
cairo_rectangle(hdc,xb+x,yb+y,rc[2]-rc[0],rc[3]-rc[1]);
|
|
if flag = 0x8800c6 or flag = 0x4 then
|
|
begin
|
|
//echo "\r\nset alopha***********";
|
|
//cairo_paint_with_alpha(hdc,0.2);
|
|
//cairo_set_source_rgba(hdc, 0.6, 0.6, 0.6, 0.5);
|
|
//cairo_set_operator(hdc, 12);
|
|
end else
|
|
begin
|
|
//cairo_paint_with_alpha(hdc,0);
|
|
//cairo_paint_with_alpha(hdc,1);
|
|
//cairo_set_source_rgba(hdc, 1.0, 1.0, 1.0, 0);
|
|
//cairo_fill(hdc);
|
|
end
|
|
cairo_fill(hdc);
|
|
//cairo_set_operator(hdc, 1);
|
|
//cairo_set_source_surface(hdc, img, x-rc[0], y-rc[1]);
|
|
end
|
|
function drawbitmapstretchtodc(bm,hdc,drect,rc,flag,thdc);
|
|
begin
|
|
if not hdc then return ;
|
|
xb := gtk_object_get_data(hdc,"viewport.x");
|
|
yb := gtk_object_get_data(hdc,"viewport.y");
|
|
img := class(TGdiplusflat).GdipGetbmpSurface(bm);
|
|
if not img then return ;
|
|
x := drect[0];
|
|
y := drect[1];
|
|
p1 := (drect[2]-drect[0])/(rc[2]-rc[0]);
|
|
p2 := (drect[3]-drect[1])/(rc[3]-rc[1]);
|
|
if p1<0 or p2<0 then return 0;
|
|
cairo_translate(hdc,xb+x,yb+y);
|
|
cairo_scale(hdc,p1,p2);
|
|
cairo_set_source_surface(hdc, img, 0, 0);
|
|
cairo_rectangle(hdc,0,0,rc[2]-rc[0],rc[3]-rc[1]);
|
|
if flag = 0x8800c6 or flag = 0x4 then
|
|
begin
|
|
//echo "\r\nset alopha*******+++****************";
|
|
//cairo_paint_with_alpha(hdc,0.5);
|
|
//cairo_set_source_rgba(hdc, 0.6, 0.6, 0.6, 0.5);
|
|
end else
|
|
begin
|
|
//cairo_paint_with_alpha(hdc,0);
|
|
//cairo_paint_with_alpha(hdc,1);
|
|
//cairo_set_source_rgba(hdc, 1.0, 1.0, 1.0, 0);
|
|
end
|
|
cairo_fill(hdc);
|
|
cairo_scale(hdc,1/p1,1/p2);
|
|
cairo_translate(hdc,0-xb-x,0-yb-y);
|
|
end
|
|
function DrawIcon(hDC:pointer;X:integer;Y:integer;hIcon:pointer):integer;
|
|
begin
|
|
if not hdc then return ;
|
|
xb := gtk_object_get_data(hdc,"viewport.x");
|
|
yb := gtk_object_get_data(hdc,"viewport.y");
|
|
img := class(TGdiplusflat).GdipGetbmpSurface(hIcon);
|
|
if not img then return 0;
|
|
cairo_set_source_surface(hdc, img, x+xb, y+yb);
|
|
cairo_paint(hdc);
|
|
return true;
|
|
end
|
|
//////////////////////imagelist/////////////////////////////////////////////////////////////////////////
|
|
function ImageList_Add(himl:pointer;hbmImage:pointer; hbmMask:pointer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
if not(hbmImage>0 or hbmImage<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then g_image_list_caches := array();
|
|
sptr := inttostr(himl);
|
|
obj := g_image_list_caches[sptr,"imglist"] ;
|
|
if not obj then return ;
|
|
class(TGdiplusflat).GdipCreateBitmapFromHBITMAP(hbmImage,r1,0);
|
|
cbmp := class(tUIglobalData).uigetdata("G_T_BITMAP_");
|
|
if cbmp then
|
|
begin
|
|
bmp := createobject(cbmp);
|
|
bmp.Handle := r1;
|
|
obj.Push(bmp);
|
|
end
|
|
end
|
|
function ImageList_AddMasked(himl:pointer;hbmImage:pointer; crMask:integer):integer;
|
|
begin
|
|
return ImageList_Add(himl,hbmImage,crMask);
|
|
end
|
|
function ImageList_BeginDrag(himlTrack:pointer; iTrack:integer;x:integer;y:integer):integer;
|
|
begin
|
|
global g_gtk_drag_window,g_image_list_caches,g_gtk_dragxy ;
|
|
if not ifarray(g_image_list_caches) then return ;
|
|
if not(himlTrack>0 or himlTrack<0) then return ;
|
|
sptr := inttostr(himlTrack);
|
|
if not g_gtk_drag_window then
|
|
begin
|
|
g_gtk_drag_window := new tcustomcontrol(class(tUIglobalData).uigetdata("tuiapplication"));//createobject(G_T_TCUSTOMCONTROL_,class(tUIglobalData).uigetdata("tuiapplication"));
|
|
g_gtk_drag_window.color := rgb(180,180,180);
|
|
g_gtk_drag_window.Border := false;
|
|
g_gtk_drag_window.WsPopUp := true;
|
|
g_gtk_drag_window.Enabled := false;
|
|
g_gtk_drag_window.Visible := false;
|
|
end
|
|
cx := g_image_list_caches[sptr,"width"] ;
|
|
cy := g_image_list_caches[sptr,"height"] ;
|
|
obj := g_image_list_caches[sptr,"imglist"] ;
|
|
if not(cx>0 and cy>0) then return ;
|
|
if obj then
|
|
begin
|
|
g_gtk_drag_window.BKBitmap := obj[iTrack];
|
|
cx+=2;
|
|
cy+=2;
|
|
end
|
|
g_gtk_drag_window.SetBounds(0,0,cx,cy);
|
|
g_gtk_dragxy := array(x,y);
|
|
end
|
|
function ImageList_DragMove(x:integer;y:integer):integer;
|
|
begin
|
|
global g_gtk_drag_window,g_gtk_drag_lock_window,g_gtk_dragxy;
|
|
if not g_gtk_drag_window then return ;
|
|
xy := g_gtk_drag_lock_window.ClientToScreen(x,y);
|
|
SetWindowPos(g_gtk_drag_window.Handle,0,xy[0]-g_gtk_dragxy[0],xy[1]-g_gtk_dragxy[1],-1,-1,0);
|
|
end
|
|
function ImageList_DragEnter(hwndLock:pointer;x:integer;y:integer):integer;
|
|
begin
|
|
global g_gtk_drag_window,g_gtk_drag_lock_window;
|
|
if not g_gtk_drag_window then return ;
|
|
g_gtk_drag_lock_window := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(hwndLock);
|
|
if not g_gtk_drag_lock_window then return ;
|
|
//g_gtk_drag_window.Parent := g_gtk_drag_lock_window;
|
|
g_gtk_drag_window.Enabled := false;
|
|
ImageList_DragMove(x,y);
|
|
g_gtk_drag_window.show( 0x4);
|
|
end
|
|
function ImageList_DragLeave(hwndLock:pointer):integer;
|
|
begin
|
|
global g_gtk_drag_window,g_gtk_drag_lock_window;
|
|
g_gtk_drag_lock_window := nil;
|
|
if not g_gtk_drag_window then return ;
|
|
g_gtk_drag_window.show(0);
|
|
end
|
|
procedure ImageList_EndDrag();
|
|
begin
|
|
//global g_gtk_drag_window;
|
|
//g_gtk_drag_window.show(0);
|
|
end
|
|
function ImageList_Create(cx:integer; cy:integer; flags:integer; cInitial:integer;cGrow:integer):pointer;
|
|
begin
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then g_image_list_caches := array();
|
|
ptr := new tcstring(8)._getptr_();
|
|
sptr := inttostr(ptr);
|
|
g_image_list_caches[sptr,"width"] := cx;
|
|
g_image_list_caches[sptr,"height"] := cy;
|
|
g_image_list_caches[sptr,"flags"] := flags;
|
|
g_image_list_caches[sptr,"initial"] := cInitial;
|
|
g_image_list_caches[sptr,"grow"] := cGrow;
|
|
g_image_list_caches[sptr,"imglist"] := new tnumindexarray();
|
|
return ptr;
|
|
end
|
|
function ImageList_Draw(himl:pointer;i:integer;hdcDst:pointer;x:integer;y:integer;fStyle:integer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
sptr := inttostr(himl);
|
|
obj := g_image_list_caches[sptr,"imglist"];
|
|
if not obj then return ;
|
|
bmp := obj[i];
|
|
if not bmp then return ;
|
|
cx := g_image_list_caches[sptr,"width"];
|
|
cy := g_image_list_caches[sptr,"height"];
|
|
drawbitmapstretchtodc(bmp.Handle,hdcDst,array(x,y,x+cx,y+cy),array(0,0,bmp.bmwidth,bmp.bmheight),fStyle,0);
|
|
end
|
|
function ImageList_Destroy(himl:pointer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
reindex(g_image_list_caches,array(inttostr(himl):nil));
|
|
end
|
|
function ImageList_Replace(himl:pointer;id:integer;hbmImage:pointer; hbmMask:pointer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
if not(hbmImage>0 or hbmImage<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
obj := g_image_list_caches[inttostr(himl),"imglist"];
|
|
if not obj then return ;
|
|
cbmp := class(tUIglobalData).uigetdata("G_T_BITMAP_");
|
|
if not cbmp then return 0;
|
|
class(TGdiplusflat).GdipCreateBitmapFromHBITMAP(hbmImage,0,r1);
|
|
bmp := createobject(cbmp);
|
|
bmp.Handle := r1;
|
|
if id=-1 then obj.Push(bmp);
|
|
else
|
|
obj.splice(id,1,bmp);
|
|
end
|
|
function ImageList_Remove(himl:pointer;id:integer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
obj := g_image_list_caches[inttostr(himl),"imglist"];
|
|
if not obj then return ;
|
|
if id=-1 then obj.pop();
|
|
else
|
|
obj.splice(id,1);
|
|
end
|
|
function ImageList_SetBkColor(himl:pointer;clrBk:integer):integer;
|
|
begin
|
|
|
|
end
|
|
function ImageList_LoadImageA2(hi:pointer;lpbmp:pointer;cx:integer;cGrow:integer; crMask:integer;uType:integer;uFlags:integer):pointer;
|
|
begin
|
|
end
|
|
function ImageList_GetBkColor(himl:pointer):integer;
|
|
begin
|
|
end
|
|
function ImageList_GetDragImage(ppt:pointer;pptHotspot:pointer):pointer;
|
|
function ImageList_GetImageCount(himl:pointer):integer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
obj := g_image_list_caches[inttostr(himl),"imglist"];
|
|
if not obj then return 0;
|
|
return obj.length();
|
|
end
|
|
function ImageList_SetImageCount(himl:pointer;clrBk:integer):integer;
|
|
function ImageList_Copy(himlDst:pointer;iDst:integer; himlSrc:pointer;iSrc:integer;uFlags:integer):integer;
|
|
function ImageList_Duplicate(himl:pointer):pointer;
|
|
function ImageList_Merge(himl1:pointer;i1:integer;himl2:pointer;i2:integer;dx:integer;dy:integer):pointer;
|
|
function ImageList_SetDragCursorImage(himlDrag:pointer;iDrag:integer;dxHotspot:integer;dyHotspot:integer):integer;
|
|
function ImageList_GetImageInfo(himl:pointer; i:integer;pImageInfo:pointer):integer;
|
|
begin
|
|
|
|
end
|
|
function ImageList_ReplaceIcon(himl:pointer;i:integer;hicon:pointer):integer;
|
|
begin
|
|
return ImageList_Replace(himl,i,hicon,0);
|
|
end
|
|
function ImageList_SetIconSize(himl:pointer;cx:integer;cy:integer):integer;
|
|
function ImageList_GetIconSize(himl:pointer;var cx:integer;var cy:integer):integer;
|
|
begin
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
sptr := inttostr(himl);
|
|
cx := g_image_list_caches[sptr,"width"];
|
|
cy := g_image_list_caches[sptr,"height"];
|
|
return 1;
|
|
end
|
|
function ImageList_GetIcon(himl:pointer;i:integer;flags:integer):pointer;
|
|
begin
|
|
if not(himl>0 or himl<0) then return 0;
|
|
global g_image_list_caches ;
|
|
if not ifarray(g_image_list_caches) then return 0;
|
|
obj := g_image_list_caches[inttostr(himl),"imglist"];
|
|
if not obj then return ;
|
|
r := obj[i];
|
|
if r then return r.Handle;
|
|
return 1;
|
|
end
|
|
function ImageList_DrawIndirect(pimldp:pointer):pointer;
|
|
function ImageList_DragShowNolock(fShow:integer):integer;
|
|
//////////////////////////////////////////////////////
|
|
////////////////////////clipboard////////////////////////////////////////
|
|
function OpenClipboard(h);
|
|
begin
|
|
return true;
|
|
end
|
|
function EmptyClipboard();
|
|
begin
|
|
|
|
end
|
|
function CloseClipboard();
|
|
begin
|
|
return true;
|
|
end
|
|
function IsClipboardFormatAvailable(fmt);
|
|
begin
|
|
return true;
|
|
end
|
|
function getclipboardtext(clpd);
|
|
begin
|
|
c := gtk_clipboard_get(69);
|
|
r := gtk_clipboard_wait_for_text(c);
|
|
if r then r := GtkStringToTsl(r);
|
|
//echo "\r\ncop wire:",writefile(rwraw(),"","/tmp/test12.txt",0,length(r),r);
|
|
return r;
|
|
end
|
|
function setclipboardtext(clbd,s);
|
|
begin
|
|
c := gtk_clipboard_get(69);
|
|
if ifstring(s) and s then
|
|
begin
|
|
gs := TslStringToGtk(s);
|
|
return gtk_clipboard_set_text(c,gs,length(gs));
|
|
end else
|
|
if ifnil(s) then gtk_clipboard_set_text(c,"",0);
|
|
return 1;
|
|
end
|
|
function getclipboardbmp();
|
|
begin
|
|
return 0;
|
|
end
|
|
function setclipboardbmp();
|
|
begin
|
|
return false;
|
|
end
|
|
//////////////////////////////////////end clip board //////////////////////////////////
|
|
|
|
//////////////////////////////timmer//////////////////
|
|
class function SetTimer(hWnd:pointer; nIDEvent:pointer; uElapse:integer;lpTimerFunc:pointer):integer;
|
|
begin
|
|
global g_gtk_ttimer_cache;
|
|
if not ifarray(g_gtk_ttimer_cache) then g_gtk_ttimer_cache := array();
|
|
obj := new ttmstruct(nil);//tslcstructure(sc); sc := array((0,"int",0),(1,"int",0));
|
|
rt := g_timeout_add(uElapse,lpTimerFunc,obj._getptr_() );
|
|
g_gtk_ttimer_cache[rt] := obj;
|
|
obj._setvalue_(0,rt);
|
|
return rt;
|
|
end
|
|
class function KillTimer(hWnd:pointer; nIDEvent:pointer):integer;
|
|
begin
|
|
global g_gtk_ttimer_cache;
|
|
if not ifarray(g_gtk_ttimer_cache) then return 0;
|
|
obj := g_gtk_ttimer_cache[nIDEvent] ;
|
|
g_source_remove(obj._getvalue_(0));
|
|
reindex(g_gtk_ttimer_cache,array(nIDEvent:nil));
|
|
return true;
|
|
end
|
|
////////////////////////////////////////////////////////////////////
|
|
function GetOpenFileNameA(LPOPENFILENAMEA:pointer):integer;
|
|
begin
|
|
global g_open_file_flag;
|
|
g_open_file_flag := 1;
|
|
r := GetSaveFileNameA(LPOPENFILENAMEA);
|
|
g_open_file_flag := 0;
|
|
return r;
|
|
end
|
|
function GetSaveFileNameA(LPOPENFILENAMEA:pointer):integer;
|
|
begin
|
|
global g_open_file_flag;
|
|
///////////////////////////////////////////////
|
|
GTK_RESPONSE_CANCEL := -6;
|
|
GTK_RESPONSE_ACCEPT := -3;
|
|
/////////////////////////////////////////
|
|
r := false;
|
|
obj := new TtagOFNA_(LPOPENFILENAMEA);
|
|
wd := obj._getvalue_("hwndowner");
|
|
wd := wd?:nil;
|
|
if wd then wd := gtk_widget_get_toplevel(wd);
|
|
mulsel := false;
|
|
if obj._getvalue_("flags") .& 0x200 then mulsel := true;
|
|
//echo "\r\n>>>", obj._getvalue_("nmaxfiletitle");
|
|
opaction := g_open_file_flag?false:true; //打开或者save
|
|
cdlg := gtk_file_chooser_dialog_new("file selector",wd,opaction,"open",GTK_RESPONSE_ACCEPT,"cancel",GTK_RESPONSE_CANCEL,nil);
|
|
if mulsel then
|
|
begin
|
|
gtk_file_chooser_set_select_multiple(cdlg,true);
|
|
end
|
|
dfdir := obj._getvalue_("lpstrinitialdir");
|
|
if dfdir then //默认位置
|
|
begin
|
|
df := ReadStringFromPtr(dfdir);
|
|
if df then
|
|
begin
|
|
gtk_file_chooser_set_filename(cdlg,TslStringToGtk( df));
|
|
end
|
|
end
|
|
if GTK_RESPONSE_ACCEPT=gtk_dialog_run(cdlg)then
|
|
begin
|
|
mf := obj._getvalue_("nmaxfile");
|
|
if mulsel then
|
|
begin
|
|
gfs := gtk_file_chooser_get_filenames(cdlg);
|
|
gf := "";
|
|
ff1 := true;
|
|
fodpos := 0;
|
|
ffd := "/";
|
|
while gfs do
|
|
begin
|
|
if mf<length(gf) then break;
|
|
gfo := new TGtkList(gfs);
|
|
dt := gfo.data;
|
|
dts := ReadStringFromPtr(dt);
|
|
lendts := length(dts);
|
|
if ff1 then
|
|
begin
|
|
ff1 := false;
|
|
if dts[lendts]="/" then
|
|
begin
|
|
for ji := lendts-1 downto 1 do
|
|
begin
|
|
if dts[ji]="/" then
|
|
begin
|
|
fodpos := ji;
|
|
break;
|
|
end
|
|
end
|
|
end else
|
|
begin
|
|
for ji := lendts downto 1 do
|
|
begin
|
|
if dts[ji]="/" then
|
|
begin
|
|
fodpos := ji;
|
|
break;
|
|
|
|
end
|
|
end
|
|
end
|
|
if fodpos>1 then
|
|
ffd := dts[1:fodpos-1];
|
|
else ffd := "/";
|
|
gf :=ffd;
|
|
gf+="\0";
|
|
end
|
|
if fodpos <lendts and dts[fodpos]="/" then
|
|
begin
|
|
gf+=dts[(fodpos+1):(lendts-(dts[lendts]="/"))];
|
|
gf+="\0";
|
|
end
|
|
gfs := gfo.next;
|
|
|
|
end
|
|
gf+="\0";
|
|
//
|
|
end else
|
|
begin
|
|
gf := (gtk_file_chooser_get_filename(cdlg));
|
|
//fidx := obj._getvalue_("nfilterindex");
|
|
if 0>1 then
|
|
begin
|
|
bts := ReadBytesFromPtr(obj._getvalue_("lpstrfilter"),obj._getvalue_("nmaxfiletitle"));
|
|
fndx := "";
|
|
for i ,v in bts do
|
|
begin
|
|
if bts[i]=0 and bts[i+1]=0 then break;
|
|
fndx+=chr(bts[i]);
|
|
end
|
|
stp := str2array(fndx,"\0")[fidx*2-1];
|
|
for i := length(stp) downto 1 do
|
|
begin
|
|
if stp[i] = "." then
|
|
begin
|
|
stype := stp[i:];
|
|
end
|
|
end
|
|
for i := length(gf) downto 1 do
|
|
begin
|
|
gfi := gf[i];
|
|
if gfi="/" then
|
|
begin
|
|
gf+=stype;
|
|
break;
|
|
end else
|
|
if gfi = "." then
|
|
begin
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if gf then
|
|
begin
|
|
gf := GtkStringToTsl( gf);
|
|
fptr := obj._getvalue_("lpstrfile");
|
|
bts := zeros(length(gf)+1);
|
|
for i := 1 to length(gf) do
|
|
begin
|
|
bts[i-1] := ord(gf[i]);
|
|
end
|
|
WriteBytesToPtr(fptr,bts);
|
|
r := true;
|
|
end
|
|
end
|
|
gtk_widget_destroy(cdlg);
|
|
return r;
|
|
end
|
|
function ChooseFontA(LOGFONTA:pointer):integer;
|
|
begin
|
|
obj := new ttagCHOOSEFONTA(LOGFONTA);
|
|
lgobj := obj._getvalue_("lplogfont");
|
|
ht := lgobj._getvalue_("height");
|
|
hts := "";
|
|
if ht>5 then hts := inttostr(ht);
|
|
ss := lgobj._getvalue_("facename")+" "+(lgobj._getvalue_("italic")?"Italic":"")+" "+((lgobj._getvalue_("weight")=700)?"Bold":"") + " "+ hts;;
|
|
cdlg := gtk_font_selection_dialog_new("font select");
|
|
gtk_font_selection_dialog_set_preview_text(cdlg,"test fonttext");
|
|
gtk_font_selection_dialog_set_font_name(cdlg,TslStringToGtk(ss));
|
|
if gtk_dialog_run(cdlg)=-5 then //确定
|
|
begin
|
|
s := GtkStringToTsl( gtk_font_selection_dialog_get_font_name(cdlg));
|
|
fns := static pango_font_family_get_names();
|
|
for i,v in fns do
|
|
begin
|
|
if pos(v,s)=1 then
|
|
begin
|
|
lgobj._setvalue_("facename",GtkStringToTsl(v));
|
|
if pos("Italic",s) then
|
|
begin
|
|
lgobj._setvalue_("italic",1);
|
|
end else
|
|
begin
|
|
lgobj._setvalue_("italic",0);
|
|
end
|
|
if pos("Bold",s) then
|
|
begin
|
|
lgobj._setvalue_("weight",700);
|
|
end else
|
|
begin
|
|
lgobj._setvalue_("weight",400);
|
|
end
|
|
nms := inttostr(0->9);
|
|
for j := 1 to length(s) do
|
|
begin
|
|
if s[j] in nms then
|
|
begin
|
|
nm := s[j];
|
|
for jj:= j+1 to length(s) do
|
|
begin
|
|
if s[jj] in nms then
|
|
begin
|
|
nm+=s[jj];
|
|
end else break;
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
if nm then
|
|
begin
|
|
ht := strtoint(nm);
|
|
lgobj._setvalue_("height",ht);
|
|
lgobj._setvalue_("width",integer(ht/2));
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
r := true;
|
|
end
|
|
gtk_widget_destroy(cdlg);
|
|
return r;
|
|
end
|
|
function ChooseColorA(LOGFONTA:pointer):integer;//颜色选择
|
|
begin
|
|
obj := new ttagCHOOSECOLORA(LOGFONTA);
|
|
cdlg := gtk_color_selection_dialog_new("color select dialog");
|
|
btnptr := tsl_gtk_color_selection_property(cdlg); //获得位置
|
|
//cpbtns := tslcstructure(array((0,"intptr",0)),nil,nil,btnptr);
|
|
cpbtns := new Tintptr(btnptr);
|
|
cbtnobj := cpbtns._getvalue_(0);
|
|
color := new _GdkColor();
|
|
rc := obj.rgbresult ;
|
|
rcs := array(getrvalue(rc),getgvalue(rc),getbvalue(rc));
|
|
color.setrgb((_shl( rcs[0],8)),(_shl(rcs[1],8)),(_shl( rcs[2],8)));
|
|
gtk_color_selection_set_current_color(cbtnobj,color._getptr_());
|
|
r := gtk_dialog_run(cdlg);
|
|
//rt := Gtk_dlg_get_response_name_by_id(r);
|
|
gtk_color_selection_get_current_color(cbtnobj,color._getptr_());
|
|
obj.rgbresult := rgb( _shr(color.r,8),_shr(color.g,8),_shr(color.b,8));
|
|
gtk_widget_destroy(cdlg);
|
|
return r=-5;
|
|
end
|
|
|
|
function SHBrowseForFolderA(LPITEMIDLIST:pointer):pointer;
|
|
begin
|
|
|
|
///////////////////////////////////////////////
|
|
GTK_RESPONSE_CANCEL := -6;
|
|
GTK_RESPONSE_ACCEPT := -3;
|
|
/////////////////////////////////////////
|
|
obj := new TBrowseinfoA_(LPITEMIDLIST);
|
|
wd := obj._getvalue_("hwndowner");
|
|
wd := wd?:nil;
|
|
if wd and not(gtk_widget_is_toplevel(wd)) then wd := gtk_widget_get_toplevel(wd); //top level
|
|
r := 0;
|
|
cdlg := gtk_file_chooser_dialog_new("folder selector",wd,2,"open",GTK_RESPONSE_ACCEPT,"cancel",GTK_RESPONSE_CANCEL,0);
|
|
dir := obj._getvalue_("pidlroot");
|
|
if dir then //默认位置
|
|
begin
|
|
df := ReadStringFromPtr(dir);
|
|
if df then
|
|
begin
|
|
gtk_file_chooser_set_filename(cdlg,TslStringToGtk( df));
|
|
end
|
|
end
|
|
if GTK_RESPONSE_ACCEPT=gtk_dialog_run(cdlg) then
|
|
begin
|
|
r := GtkStringToTsl( gtk_file_chooser_get_filename(cdlg));
|
|
end
|
|
gtk_widget_destroy(cdlg);
|
|
return r;
|
|
end
|
|
function SHGetPathFromIDListA(LPBROWSEINFOA:pointer;var buf:string ):integer;
|
|
begin
|
|
for i := 1 to length(LPBROWSEINFOA) do
|
|
begin
|
|
buf[i] := LPBROWSEINFOA[i];
|
|
end
|
|
buf[i+1] := 0;
|
|
return true;
|
|
end
|
|
function ILCreateFromPathA(pszPath:string):pointer;
|
|
begin
|
|
mt := static new aefclassobj_();
|
|
len := length(pszPath)+1;
|
|
bts := zeros(n);
|
|
for i:= 1 to len-1 do bts[i-1] :=ord(pszPath[i]);
|
|
r := mt.tmalloc(len);
|
|
WriteBytesToPtr(r,bts);
|
|
return r;
|
|
end
|
|
procedure ILFree(pidl:pointer);
|
|
begin
|
|
mt := static new aefclassobj_();
|
|
mt.tfree(pidl);
|
|
end
|
|
//caret 插入符号 处理
|
|
function drawcaret(h,xy,f);
|
|
begin
|
|
ct := g_object_get_data(h,"gtk_window_caret");
|
|
if f=1 then //清除
|
|
begin
|
|
if g_object_get_data(ct,"isshow") then return ;
|
|
end
|
|
/////会到以前的处理/////////////////////////////
|
|
if f=-1 then
|
|
begin
|
|
if g_object_get_data(ct,"isshow") then
|
|
begin
|
|
g_object_set_data(ct,"isshow",0);
|
|
gtk_widget_hide(ct);
|
|
end else
|
|
begin
|
|
g_object_set_data(ct,"isshow",true);
|
|
gtk_widget_show(ct);
|
|
end
|
|
end else
|
|
if f = 1 then
|
|
begin
|
|
g_object_set_data(ct,"isshow",true);
|
|
gtk_widget_show(ct);
|
|
end
|
|
|
|
return ;
|
|
////////////////////////////
|
|
|
|
//获得窗口
|
|
hwcr := g_object_get_data(h,"gtk_clientwideget");
|
|
hcr := gdk_cairo_create(gtk_widget_get_window(hwcr));
|
|
//echo "\r\n>>get:",cairo_get_operator(hcr);
|
|
//cairo_set_operator(hcr,11);
|
|
//echo ">>2get:",cairo_get_operator(hcr);
|
|
//cairo_set_source_rgb(hcr,0,0,0);
|
|
if f=-1 then
|
|
begin
|
|
if g_object_get_data(ct,"isshow") then
|
|
begin
|
|
g_object_set_data(ct,"isshow",0);
|
|
cairo_set_source_rgb(hcr,0,0,0);
|
|
end else
|
|
begin
|
|
g_object_set_data(ct,"isshow",true);
|
|
cairo_set_source_rgb(hcr,1,1,1);
|
|
end
|
|
end else
|
|
if f = 1 then
|
|
begin
|
|
g_object_set_data(ct,"isshow",true);
|
|
cairo_set_source_rgb(hcr,1,1,1);
|
|
end
|
|
cairo_set_line_width(hcr,max(2, g_object_get_data(ct,"width_c")));
|
|
cairo_move_to(hcr, xy[0], xy[1]);
|
|
cairo_line_to(hcr, xy[0], xy[1]+g_object_get_data(ct,"heigt_c"));
|
|
cairo_stroke(hcr);
|
|
//cairo_rectangle(hcr,xy[0],xy[1],5,20);
|
|
//cairo_fill(hcr);
|
|
cairo_destroy(hcr); //?
|
|
end
|
|
function CreateCaret(hWnd :pointer;hBitmap:pointer;nWidth:integer;nHeight:integer):integer;
|
|
begin
|
|
if not(hwnd>0 or hwnd<0) then return 0;
|
|
global g_gtk_caret_cache_timer; //缓存
|
|
if not g_gtk_caret_cache_timer then
|
|
begin
|
|
ctm := class(tUIglobalData).uigetdata("G_T_TTIMER_");
|
|
if not ctm then return 0;
|
|
g_gtk_caret_cache_timer := createobject(ctm,nil);
|
|
g_gtk_caret_cache_timer.Interval := 500;//680;
|
|
g_gtk_caret_cache_timer.Ontimer := function(o,e)
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
h := g_current_get_focus_widget;
|
|
if not h then return ;
|
|
if not g_object_get_data(h,"caretshow") then return ;
|
|
GetCaretPos(xy);
|
|
drawcaret(h,xy,-1);
|
|
end
|
|
g_gtk_caret_cache_timer.start();
|
|
end
|
|
h := g_object_get_data(hwnd,"gtk_window_caret"); //获得caret
|
|
if not h then
|
|
begin
|
|
h := gtk_event_box_new();
|
|
c := new _GdkColor(nil);
|
|
c.SetRgb(0,0,0);
|
|
gtk_widget_modify_bg(h,0,c._getptr_());
|
|
gtk_widget_hide(h);
|
|
lot := g_object_get_data(hWnd,"gtk_layout");
|
|
//gtk_layout_move(lot,h,x,y);
|
|
gtk_layout_put(lot,h,0,0);
|
|
g_object_set_data(hwnd,"gtk_window_caret",h);
|
|
end
|
|
if nWidth>=0 and nHeight>=0 then
|
|
begin
|
|
g_object_set_data(h,"width_c",nWidth);
|
|
g_object_set_data(h,"heigt_c",nHeight);
|
|
gtk_widget_set_size_request(h,nWidth,nHeight);
|
|
end
|
|
return h;
|
|
end
|
|
function DestroyCaret():integer;
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
hwnd := g_current_get_focus_widget;
|
|
if not(hwnd>0 or hwnd<0) then return ;
|
|
if not IsGtkWidget(hwnd) then return ;
|
|
g_object_set_data(hwnd,"caretshow",0);
|
|
ct := g_object_get_data(hwnd,"gtk_window_caret");
|
|
gtk_widget_hide(ct);
|
|
return ;
|
|
// 获得focus
|
|
end
|
|
function SetCaretPos(x:integer;y:integer):integer;
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
hwnd := g_current_get_focus_widget;
|
|
if IsGtkWidget(hwnd) then
|
|
begin
|
|
crt := g_object_get_data( hwnd,"gtk_window_caret");
|
|
GetCaretPos(xy);
|
|
if crt then //处理此处
|
|
begin
|
|
gtk_object_set_data(hwnd,"caret_x_pos",x);
|
|
gtk_object_set_data(hwnd,"caret_y_pos",y);
|
|
lot := g_object_get_data(hwnd,"gtk_layout");
|
|
gtk_layout_move(lot,crt,x,y);
|
|
end
|
|
if xy[0]<>x then
|
|
drawcaret(hwnd,xy,1);
|
|
end
|
|
return ;
|
|
end
|
|
function GetCaretPos(lp:array of integer):integer;
|
|
begin
|
|
global g_current_get_focus_widget;
|
|
hwnd := g_current_get_focus_widget;
|
|
if IsGtkWidget(hwnd) then
|
|
begin
|
|
x := gtk_object_get_data(hwnd,"caret_x_pos");
|
|
y := gtk_object_get_data(hwnd,"caret_y_pos");
|
|
lp := array(x,y);
|
|
return ;
|
|
end
|
|
lp := array(0,0);
|
|
return ;
|
|
end
|
|
function HideCaret(hwnd :pointer):integer;
|
|
begin
|
|
// 获得focus widget
|
|
if not(hwnd>0 or hwnd<0) then return ;
|
|
if not IsGtkWidget(hwnd) then return ;
|
|
ct := g_object_get_data(hwnd,"gtk_window_caret");
|
|
g_object_set_data(hwnd,"caretshow",0);
|
|
if ct then gtk_widget_hide(ct);
|
|
return ;
|
|
end
|
|
function ShowCaret(hwnd :pointer):integer;
|
|
begin
|
|
if not(hwnd>0 or hwnd<0) then return ;
|
|
if not IsGtkWidget(hwnd) then return ;
|
|
g_object_set_data(hwnd,"caretshow",1);
|
|
return 1;
|
|
end
|
|
function GetCaretBlinkTime():integer;
|
|
begin
|
|
end
|
|
function SetCaretBlinkTime(uMSeconds :integer):integer;
|
|
begin
|
|
end
|
|
Function WinExec(lpCmdLine:string;nCmdShow:integer):integer;
|
|
begin
|
|
|
|
end;
|
|
function Shell_NotifyIconA(dwMessage:integer; lpData:pointer):integer;
|
|
begin
|
|
end
|
|
function SetForegroundWindow(hwd :pointer):integer;
|
|
begin
|
|
end
|
|
function BringWindowToTop(hwd :pointer);
|
|
begin
|
|
end
|
|
function GetWindowHandleByPID();
|
|
begin
|
|
|
|
end
|
|
function AllowSetForegroundWindow(hwd :pointer);
|
|
begin
|
|
end
|
|
function ForegroundWindow(hwnd);
|
|
begin
|
|
end
|
|
//socket
|
|
function socket(af:integer;tp:integer;protocol:integer):pointer;begin end
|
|
function WSAStartup(af:SHORT;DA:pointer):integer;begin end
|
|
function WSACleanup():integer;begin end
|
|
function htonl(hostlong:integer):integer;begin end
|
|
function htons(hostshort:short):short;begin end
|
|
function ntohs(hostshort:short):short;begin end
|
|
function bind(s:pointer;name:pointer;len:integer):integer;begin end
|
|
function accept(s:pointer;name:pointer;var len:integer):pointer;begin end
|
|
function send(s:pointer;bufer:string;len:integer;flag:integer):integer;begin end
|
|
function recv(s:pointer;var bufer:string;len:integer;flag:integer):integer;begin end
|
|
function listen(s:pointer;port:integer):integer;begin end
|
|
function closesocket(s:pointer):integer;begin end
|
|
function connect(s:pointer;name:pointer;len:integer):integer;begin end
|
|
function inet_addr(s:string):integer;begin end
|
|
function WSAGetLastError():integer;begin end
|
|
function inet_ntoa(ad:integer):string;begin end
|
|
function shutdown(s:pointer;how:integer):integer;begin end
|
|
function WSAAsyncSelect(s:pointer;hWnd:pointer;wMsg:integer;lEvent:integer):integer;begin end
|
|
function ioctlsocket(s:pointer;cmd:integer;var argp:integer):integer;begin end
|
|
function setsockopt(s:pointer;level:integer;optname:integer;optval:string;optlen:integer):integer;begin end
|
|
function getsockopt(s:pointer;level:integer;optname:integer;var optval:string;var optlen:integer):integer;begin end
|
|
end
|
|
|
|
|
|
implementation
|
|
function gettswin32api();
|
|
begin
|
|
global G_O_TSWIN32API_;
|
|
return G_O_TSWIN32API_;
|
|
end
|
|
///////////////////////////////////////////////////////////////////////////
|
|
type TGtkList = class( _gslist) //gtk链表类
|
|
function create(ptr);
|
|
begin
|
|
inherited;
|
|
end
|
|
end
|
|
type ttmstruct=class(tslcstructureobj)
|
|
{**
|
|
@explan(说明)矩形区域内存分配 %%
|
|
**}
|
|
private
|
|
static SSTRUCT;
|
|
function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
(0,"int",0),
|
|
(1,"int",0)));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
end
|
|
type Tintptr=class(tslcstructureobj)
|
|
{**
|
|
@explan(说明)矩形区域内存分配 %%
|
|
**}
|
|
private
|
|
static SSTRUCT;
|
|
function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
(0,"intptr",0)));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
end
|
|
type tmenuitemobject = class(tgtk_ctl_object) //gtk菜单对象类
|
|
function create(h);
|
|
begin
|
|
inherited;
|
|
Connect("activate",thisfunction(mactivate));
|
|
Connect("destroy",thisfunction(mdestroy));
|
|
end
|
|
lpmii;
|
|
function mactivate();
|
|
begin
|
|
h := handle;
|
|
mid := _wapi.g_object_get_data(h,"menuid");
|
|
if mid then
|
|
begin
|
|
while h do
|
|
begin
|
|
hwd := _Wapi.g_object_get_data(h,"popmenubarwindow");
|
|
if hwd then
|
|
begin
|
|
|
|
r := _wapi.gtk_postmessagea(hwd,_const.WM_COMMAND,makelong(mid,0),0,0);
|
|
_wapi.g_object_set_data(h,"popmenubarwindow",0);
|
|
return r;
|
|
end
|
|
hwd := _wapi.g_object_get_data(h,"menubarwindow");
|
|
if hwd then //主菜单
|
|
begin
|
|
//echo "\r\n============hwd is find\r\n";
|
|
r := _wapi.gtk_postmessagea(hwd,_const.WM_COMMAND,makelong(mid,0),0,0);
|
|
//echo "send main menu command:";
|
|
return r;
|
|
end
|
|
h := _wapi.g_object_get_data(h,"pmenu");
|
|
end
|
|
end
|
|
end
|
|
function mdestroy();
|
|
begin
|
|
//echo "\r\nmenu destroyed";
|
|
end
|
|
end
|
|
type tgtkapis = class() //gtk对象api接口
|
|
function gtk_rgb_color_rgb(c,r,g,b);
|
|
begin
|
|
if not ifnumber(c) then return 0;
|
|
r := getrvalue(c)/0xff;
|
|
g := getgvalue(c)/0xff;
|
|
b := getbvalue(c)/0xff ;
|
|
return true;
|
|
end
|
|
class function gtk_object_set_data(h,n,v); //保存数据
|
|
begin
|
|
if not(h>0 or h<0) then return 0;
|
|
global gtk_object_data_values_global;
|
|
if not ifarray(gtk_object_data_values_global) then gtk_object_data_values_global := array();
|
|
if ifnil(n) then reindex(gtk_object_data_values_global,array(inttostr(h):nil));
|
|
else
|
|
if ifarray(n) then
|
|
begin
|
|
gtk_object_data_values_global[inttostr(h)] := n;
|
|
end else
|
|
gtk_object_data_values_global[inttostr(h),n] := v;
|
|
//echo tostn(gtk_object_data_values_global);
|
|
end
|
|
class function gtk_object_get_data(h,n); //获得数据
|
|
begin
|
|
if not(h>0 or h<0) then return 0;
|
|
global gtk_object_data_values_global;
|
|
if not ifarray(gtk_object_data_values_global) then return 0;
|
|
if ifnil(n) then
|
|
begin
|
|
r := gtk_object_data_values_global[inttostr(h)];
|
|
if not ifarray(r) then r := array();
|
|
return r;
|
|
end
|
|
r := gtk_object_data_values_global[inttostr(h),n];
|
|
if ifnil(r) then return 0;
|
|
return r;
|
|
end
|
|
function gtk_SetMenuItemInfoA(hMenu,uitem,fbyposition,lpmii); //菜单操作
|
|
begin
|
|
//return ;
|
|
_const := GetWin32Const();
|
|
it := gtk_menu_shell_get_by_positon(hMenu,uitem);
|
|
if not it then return 0;
|
|
lpm := new tmenuStruct(lpmii);
|
|
msk := lpm.fmask;
|
|
st := lpm.fstate;
|
|
ss := " ";
|
|
needset := false;
|
|
if (msk .& _const.MIIM_STRING)=_const.MIIM_STRING then
|
|
begin
|
|
c := lpm.getdwtypedata();
|
|
gtk_object_set_data(it,"caption",c);
|
|
needset := true;
|
|
end
|
|
if _const.MIIM_STATE =(msk .& _const.MIIM_STATE) then
|
|
begin
|
|
if (_const.MF_DISABLED = (st .& _const.MF_DISABLED)) then
|
|
begin
|
|
gtk_widget_set_sensitive(it,false);
|
|
end else
|
|
|
|
if (_const.MF_ENABLED = (st .& _const.MF_ENABLED)) then //是否有效
|
|
begin
|
|
gtk_widget_set_sensitive(it,true);
|
|
end
|
|
if ((st .& _const.MF_CHECKED)= _const.MF_CHECKED) then //是否check
|
|
begin
|
|
gtk_object_set_data(it,"checked",1);
|
|
needset := true;
|
|
end else
|
|
if ((st .& _const.MF_UNCHECKED)= _const.MF_UNCHECKED) then //是否check
|
|
begin
|
|
gtk_object_set_data(it,"checked",0);
|
|
needset := true;
|
|
end
|
|
end
|
|
if needset then
|
|
begin
|
|
c := gtk_object_get_data(it,"caption");
|
|
if gtk_object_get_data(it,"checked") then
|
|
begin
|
|
gtk_menu_item_set_label(it,TslStringToGtk("[√]"+c));
|
|
end else
|
|
gtk_menu_item_set_label(it,TslStringToGtk(ss+c));
|
|
end
|
|
if (msk .& _const.MIIM_SUBMENU)=_const.MIIM_SUBMENU then //下一级菜单
|
|
begin
|
|
gtk_menu_item_set_submenu(it,lpm.hsubmenu);
|
|
g_object_set_data(it,"menuid",0);
|
|
end {else
|
|
begin
|
|
echo "\r\n seet sub menuid: ",lpm.wid;
|
|
echo " odid:",g_object_get_data(it,"menuid"),"***";
|
|
//g_object_set_data(it,"menuid",lpm.wid);
|
|
end}
|
|
|
|
return 1;
|
|
end
|
|
function gtk_insertmenuitema(hMenu,uitem,fbyposition,lpmii);//菜单操作
|
|
begin
|
|
_const := GetWin32Const();
|
|
lpm := new tmenuStruct(lpmii);
|
|
msk := lpm.fmask;
|
|
ft := lpm.ftype;
|
|
st := lpm.fstate;
|
|
ss := " ";
|
|
c := lpm.getdwtypedata()?:"";
|
|
if ft = _const.MFT_SEPARATOR then //分割
|
|
begin
|
|
it := gtk_separator_menu_item_new();
|
|
end else
|
|
begin //文本
|
|
//it := gtk_check_menu_item_new_with_label(c);//2
|
|
if ((st .& _const.MFS_CHECKED)= _const.MFS_CHECKED) then
|
|
begin
|
|
it := gtk_menu_item_new_with_label(TslStringToGtk("[√]"+c));
|
|
gtk_object_set_data(it,"checked",1);
|
|
end
|
|
else
|
|
begin
|
|
gtk_object_set_data(it,"checked",0);
|
|
it := gtk_menu_item_new_with_label(TslStringToGtk(ss+c));
|
|
end
|
|
end
|
|
gtk_object_set_data(it,"caption",c);
|
|
gtk_widget_show(it);
|
|
new tmenuitemobject(it);
|
|
g_object_set_data(it,"pmenu",hMenu);
|
|
gtk_menu_shell_insert(hMenu,it,uitem);
|
|
|
|
if st .& _const.MFS_DISABLED then //是否有效
|
|
begin
|
|
gtk_widget_set_sensitive(it,false);
|
|
end else gtk_widget_set_sensitive(it,true);
|
|
cid := lpm.wid;
|
|
if msk .& _const.MIIM_SUBMENU then //下一级菜单
|
|
begin
|
|
gtk_menu_item_set_submenu(it,lpm.hsubmenu);
|
|
g_object_set_data(lpm.hsubmenu,"pmenu",hMenu);
|
|
g_object_set_data(it,"menuid",0);
|
|
end else
|
|
begin
|
|
g_object_set_data(it,"menuid",cid);
|
|
end
|
|
end
|
|
function gtk_widgetsizechanged(hwnd,h,w); //大小改变
|
|
begin
|
|
return class(tgtk_ctl_object).widgetsizechangeda(hwnd,h,w) ;
|
|
end
|
|
function getDefWindowProcA();
|
|
begin
|
|
return 0;
|
|
end
|
|
function getvclwindowprocA();
|
|
begin
|
|
return 0;
|
|
end
|
|
function gtk_GetScrollInfo(hwnd,nBar,lpsi); //滚动条信息
|
|
begin
|
|
//获得scroll
|
|
return class(tgtk_ctl_object).getscrollinfoa(hwnd,nBar,lpsi) ;
|
|
end
|
|
function gtk_SetScrollInfo(hwnd, nBar, lpsi,redraw);//设置滚动条
|
|
begin
|
|
//设置scroll
|
|
return class(tgtk_ctl_object).SetScrollInfoa(hwnd, nBar, lpsi,redraw) ;
|
|
end
|
|
function gtk_postmessagea(h,msg,w,l,d); //post模拟
|
|
begin
|
|
AddMessageToGtkMessageQueue(h,msg,w,l,d);
|
|
end
|
|
function gtk_sendmessagea(h,msg,w,l); //send 模拟
|
|
begin
|
|
return class(tgtk_ctl_object).CallGtkWinProc(h,msg,w,l);
|
|
end
|
|
function gtk_SetWindowLongPtrA(h,n,v); //setlong
|
|
begin
|
|
return class(tgtk_ctl_object).SetWindowLongPtrA(h,n,v);
|
|
end
|
|
function gtk_GetWindowLongPtrA(h,idx); //getlong
|
|
begin
|
|
return class(tgtk_ctl_object).GetWindowLongPtrA(h,idx);
|
|
end
|
|
function gtk_executeMessageA(h,msg,w,l); //执行消息
|
|
begin
|
|
return class(tgtk_ctl_object).executeMessageA(h,msg,w,l);
|
|
end
|
|
function gtk_addMessageQueue(FHandle,msg,wparam,lparam,d);
|
|
begin
|
|
return AddMessageToGtkMessageQueue(FHandle,msg,wparam,lparam,d);
|
|
end
|
|
function gtk_GetKeyState(key); //按键状态
|
|
begin
|
|
global g_gtk_keytable;
|
|
if g_gtk_keytable then
|
|
begin
|
|
if key in array(0x10,0x11,0x12) then
|
|
begin
|
|
r := g_gtk_keytable[key];
|
|
if r>=0 then return r;
|
|
end
|
|
end ;
|
|
end
|
|
function gtk_GetAsyncKeyState(key);//鼠标按键状态
|
|
begin
|
|
global g_gtk_buttontable;
|
|
if g_gtk_buttontable then
|
|
begin
|
|
//
|
|
case key of
|
|
1:
|
|
begin
|
|
if g_gtk_buttontable[0] then return _shl(1,15);
|
|
end
|
|
2:
|
|
begin
|
|
if g_gtk_buttontable[1] then return _shl(1,15);
|
|
end
|
|
|
|
end ;
|
|
|
|
end
|
|
|
|
end
|
|
function TslStringToGtk(s); //ascii转utf8
|
|
begin
|
|
return ansitoutf8(s);
|
|
end
|
|
function TslStringToGtk2(s); //ascii转utf8
|
|
begin
|
|
global g_ansi_unit_cache ;
|
|
if not ifarray(g_ansi_unit_cache) then g_ansi_unit_cache := array();
|
|
r := g_ansi_unit_cache[s];
|
|
if ifnil(r) then
|
|
begin
|
|
r := ansitoutf8(s);
|
|
g_ansi_unit_cache[s] := r;;
|
|
end
|
|
return r;
|
|
end
|
|
function GtkStringToTsl(s); //ascii转utf8
|
|
begin
|
|
return utf8toansi(s);
|
|
end
|
|
function gtk_MessageBoxA(hd,txt,title,flag); //messagebox模拟
|
|
begin
|
|
flag := flag .& 7;
|
|
if flag = 0 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"确定",1,"b",0,"c",0);
|
|
if r=1 then return 1;
|
|
return 0;
|
|
end else
|
|
if flag = 1 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"确定",1,U"取消",1,"c",0);
|
|
if r=1 then return 1;
|
|
else return 2;
|
|
end else
|
|
if flag = 2 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"终止",1,U"重试",1,U"忽略",1);
|
|
case r of
|
|
1: return 3;
|
|
2: return 4;
|
|
0,3:return 5;
|
|
end
|
|
end else
|
|
if flag = 3 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"是",1,U"否",1,U"取消",1);
|
|
case r of
|
|
1: return 6;
|
|
2: return 7;
|
|
0,3:return 2;
|
|
end
|
|
end else
|
|
if flag =4 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"是",1,U"否",1,"c",0);
|
|
case r of
|
|
1: return 6;
|
|
2: return 7;
|
|
else
|
|
return 0;
|
|
end
|
|
end else
|
|
if flag = 5 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"重试",1,U"取消",1,U"取消",0);
|
|
case r of
|
|
1: return 4;
|
|
else return 2;
|
|
end
|
|
end else
|
|
if flag = 6 then
|
|
begin
|
|
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"取消",1,U"重试",1,U"继续",1);
|
|
case r of
|
|
1: return 2;
|
|
2: return 4;
|
|
3: return 11;
|
|
else return 2;
|
|
end
|
|
end
|
|
end
|
|
function gtk_createwindowexa(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam); //窗口构造类
|
|
begin
|
|
//array("tsui_application","tsui_window","tsluidesigner_a_a_1","tsui_form","tui_button","tui_edit","tui_tablecontrol32","tui_PageSheet","tui_monthcalendar","tui_datetimepicker")
|
|
d := new tslcstructureobj(MemoryAlignmentCalculate( array(
|
|
("lpcreateparams","intptr",lpParam))),nil);
|
|
_const := GetWin32Const();
|
|
if (dwStyle .& _const.WS_POPUP)=_const.WS_POPUP then
|
|
begin
|
|
cls := new tgtk_ctl_window_PoPup();
|
|
end
|
|
else
|
|
begin
|
|
cls := new tgtk_ctl_window();
|
|
end
|
|
if cls then
|
|
begin
|
|
global g_w_i_datas ;
|
|
dptr := d._getptr_();
|
|
//g_w_i_datas[inttostr(dptr)] := new tgtk_wnd_info();
|
|
r := cls.CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,dptr);
|
|
//reindex(g_w_i_datas,array(inttostr(dptr):nil));
|
|
end
|
|
return r;
|
|
end
|
|
function gtk_GetClassInfoExtA(h,cl,lpwcx); //获得信息
|
|
begin
|
|
lcl := lowercase(cl);
|
|
cs := GetGtkwindowclass(lcl);
|
|
d := new tagWNDCLASSA(lpwcx);
|
|
if cs then
|
|
begin
|
|
for i,v in cs do
|
|
begin
|
|
d._setvalue_(i,v);
|
|
end
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
function gtk_RegisterClassExA(lpwcx);//注册信息
|
|
begin
|
|
d := new tagWNDCLASSA(lpwcx);
|
|
reggtkwindowclass(d._getdata_());
|
|
return true;
|
|
end
|
|
|
|
function gtk_color_selection_dialog_new(t:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function Gtk_event_get_name_by_id(id); //gdk消息名称--id对应
|
|
begin
|
|
d := array(0:"GDK_DELETE",1:"GDK_DESTROY",2:"GDK_EXPOSE",3:"GDK_MOTION_NOTIFY",4:"GDK_BUTTON_PRESS",
|
|
5:"GDK_2BUTTON_PRESS",6:"GDK_3BUTTON_PRESS",7:"GDK_BUTTON_RELEASE",8:"GDK_KEY_PRESS",9:"GDK_KEY_RELEASE",
|
|
10:"GDK_ENTER_NOTIFY",11:"GDK_LEAVE_NOTIFY",12:"GDK_FOCUS_CHANGE",13:"GDK_CONFIGURE",14:"GDK_MAP",15:"GDK_UNMAP",
|
|
16:"GDK_PROPERTY_NOTIFY",17:"GDK_SELECTION_CLEAR",18:"GDK_SELECTION_REQUEST",19:"GDK_SELECTION_NOTIFY",20:"GDK_PROXIMITY_IN",
|
|
21:"GDK_PROXIMITY_OUT",22:"GDK_DRAG_ENTER",23:"GDK_DRAG_LEAVE",24:"GDK_DRAG_MOTION",25:"GDK_DRAG_STATUS",
|
|
26:"GDK_DROP_START",27:"GDK_DROP_FINISHED",28:"GDK_CLIENT_EVENT",29:"GDK_VISIBILITY_NOTIFY",30:"GDK_NO_EXPOSE",
|
|
31:"GDK_SCROLL",32:"GDK_WINDOW_STATE",33:"GDK_SETTING",34:"GDK_OWNER_CHANGE",35:"GDK_GRAB_BROKEN",36:"GDK_DAMAGE",-1:"GDK_NOTHING")
|
|
;
|
|
return d[id];
|
|
end
|
|
function Gtk_dlg_get_response_name_by_id(id); //对话框id--名称对应
|
|
begin
|
|
d := array(-11:"GTK_RESPONSE_HELP",-10:"GTK_RESPONSE_APPLY",-9:"GTK_RESPONSE_NO",-8:"GTK_RESPONSE_YES",
|
|
-7:"GTK_RESPONSE_CLOSE",-6:"GTK_RESPONSE_CANCEL",-5:"GTK_RESPONSE_OK",-4:"GTK_RESPONSE_DELETE_EVENT",
|
|
-3:"GTK_RESPONSE_ACCEPT",-2:"GTK_RESPONSE_REJECT",-1:"GTK_RESPONSE_NONE");
|
|
return d[id];
|
|
|
|
|
|
end
|
|
function openresourcemanager(p); //打开资源管理器
|
|
begin
|
|
if ifstring(p) then
|
|
begin
|
|
if fileexists("","/usr/bin/caja") then
|
|
begin
|
|
for i := length(p) downto 1 do
|
|
begin
|
|
if p[i]="/" then
|
|
begin
|
|
tsl_gtk_execsystem(format('caja "%s" &',p[1:i]));
|
|
break;
|
|
end
|
|
end
|
|
return ;//
|
|
end
|
|
tsl_gtk_execsystem(format('nautilus "%s" &',p));
|
|
return 1;
|
|
end
|
|
end
|
|
/////////////////////////////pipe process///////////执行程序相关/////////////////////////////
|
|
//function tsl_gtk_closehandle(p:pointer):integer;cdecl;external "plugin/libTSLUIL.so";
|
|
function tsl_gtk_pipread(p:pointer;var msg:string;ct:integer):integer;cdecl;external "plugin/libTSLUIL.so";
|
|
//function tsl_gtk_kill(p:pointer;sig:integer):integer;cdecl;external "plugin/libTSLUIL.so";
|
|
function tsl_gtk_createprocessa(exe:string; cmd : array of string; ev : array of string;var pw:pointer):pointer;cdecl;external "plugin/libTSLUIL.so";
|
|
|
|
/////////////////////////////////timer///////////////////////////////
|
|
class function g_timeout_add(interval:integer; _function:pointer; d:pointer):integer; cdecl; external 'libgtk-3.so'; //添加 //libglib-2.0.so gtk_timeout_remove libgtk-x11-2.0.so
|
|
class procedure g_source_remove(timeout_handler_id:integer); cdecl; external 'libgtk-3.so';//"libgtk-x11-2.0.so"; //移除
|
|
|
|
//////////////////////////clipboard/////////////////////
|
|
procedure gtk_clipboard_set_text(c:pointer;s:string;len:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_clipboard_get(atm:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_clipboard_wait_for_text(clipboard:pointer):string;cdecl;external 'libgtk-3.so';
|
|
|
|
////////////////////////
|
|
function gtk_events_pending():integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_main_iteration_do(f:integer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_main_iteration():integer ;cdecl;external 'libgtk-3.so';
|
|
///////////////////////////////////////////////////////
|
|
function g_idle_remove_by_data(p:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
|
|
////////////////
|
|
function g_slist_alloc():pointer;cdecl;external 'libgtk-3.so';
|
|
function g_slist_append(list:pointer;d:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure g_slist_free(list:pointer);cdecl;external 'libgtk-3.so';
|
|
function g_slist_find(gl:pointer;d:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function g_slist_length(gl:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function g_slist_delete_link(gl:pointer;gl2:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function g_slist_remove(gl:pointer;gl2:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
////////////////not classfiy//////////////////////////////////
|
|
function gtk_widget_is_visible(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_has_focus(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_can_focus(w:pointer;cf:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_window_get_focus(w:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_grab_focus(w:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_activate(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_focus(window:pointer; focus:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_type_hint(window:pointer; tp:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_has_window(widget:pointer;has_window:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_parent(w:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_allocated_width(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_allocated_height(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_sensitive(w:pointer;s:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_sensitive(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_widget_is_toplevel(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_window_get_title(w:pointer):string;cdecl;external 'libgtk-3.so';
|
|
////////////////////////////////im/////////////////////////
|
|
function gtk_im_multicontext_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_im_multicontext_get_context_id(im:pointer):string;cdecl;external 'libgtk-3.so';
|
|
function gtk_im_multicontext_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_set_client_window(im:pointer;w:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_set_use_preedit (im:pointer;s:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_focus_in(im:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_focus_out (im:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_reset(im:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_get_preedit_string(im:pointer;var str:string;var attrs:pointer;cp:array of integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_im_context_filter_keypress(im:pointer;e:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_im_context_delete_surrounding(im:pointer;offset:integer;nchars:integer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_im_context_get_surrounding(im:pointer;var txt:string;var cursor_index:integer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_im_context_set_cursor_location(im:pointer;var area:array of integer);cdecl;external 'libgtk-3.so';
|
|
|
|
//////////////////////////////////gobject//////
|
|
function g_type_check_instance_is_a(instance:pointer;iface_type:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
{procedure g_object_set_data(object:pointer;key:string;data:pointer);cdecl;external 'libgtk-3.so';
|
|
function g_object_get_data(object:pointer;key:string):pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
procedure g_object_set_data_base(object:pointer;key:string;data:pointer);cdecl;external 'libgtk-3.so' name "g_object_set_data";
|
|
function g_object_get_data_base(object:pointer;key:string):pointer;cdecl;external 'libgtk-3.so' name 'g_object_get_data';
|
|
}
|
|
function g_object_get_data(object:pointer;key:string);
|
|
begin
|
|
return gtk_object_get_data(object,key);
|
|
//r := g_object_get_data_base(object,key);
|
|
return r;
|
|
end
|
|
function g_object_set_data(object:pointer;key:string;data:pointer);
|
|
begin
|
|
return gtk_object_set_data(object,key,data);
|
|
end
|
|
function g_object_ref(g:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure g_object_unref(g:pointer);cdecl;external 'libgtk-3.so';
|
|
////////////////////////scroll//////////////////////////
|
|
function gtk_scrolled_window_new(hadjustment:pointer; vadjustment:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrolled_window_add_with_viewport(s:pointer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_scrolled_window_get_hscrollbar(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_scrolled_window_get_vscrollbar(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_scrolled_window_get_hadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_scrolled_window_get_vadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrolled_window_set_max_content_height(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrolled_window_set_min_content_height(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrolled_window_set_max_content_width(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrolled_window_set_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
/////////////////////scrollable////////////////////////////
|
|
procedure gtk_scrollable_set_vscroll_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_scrollable_set_hscroll_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_scrollable_get_hadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_scrollable_get_vadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
//////////////gdk window ///////
|
|
procedure gdk_window_show_unraised(w:pointer);cdecl;external 'libgtk-3.so';
|
|
///////////////////////////device//////////////////////////
|
|
//gdk_display_get_pointer(gdk_display_get_default(), nil, x, y, nil); //鼠标位置
|
|
procedure gdk_display_get_pointer(d:pointer; screen:string;var x :integer;var Y:integer;msk:string); cdecl;external 'libgtk-3.so';
|
|
function gdk_display_get_default():pointer;cdecl;external 'libgtk-3.so';
|
|
function gdk_screen_get_default():pointer;cdecl;external 'libgtk-3.so';
|
|
function gdk_display_get_default_seat(d:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gdk_seat_get_pointer(dm:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gdk_device_get_position(d:pointer;t:pointer;var x :integer;var y:integer);cdecl;external 'libgtk-3.so';
|
|
function gdk_event_get_scroll_deltas(d:pointer;var x :double;var y:double):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gdk_window_get_position(w:pointer;var x:integer;var y:integer);cdecl;external 'libgtk-3.so';
|
|
function gdk_screen_height():integer;cdecl;external 'libgtk-3.so';
|
|
function gdk_screen_width():integer;cdecl;external 'libgtk-3.so';
|
|
function gdk_event_get_event_type(e:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gdk_cairo_get_clip_rectangle(cr:pointer;var rec:array of integer):integer;cdecl;external 'libgtk-3.so';
|
|
////////////////////////// start ////////////////////////////////////////
|
|
procedure gtk_init(argc:string;argcv:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_main ();cdecl;external 'libgtk-3.so';
|
|
function gtk_mainidle(idledata);
|
|
begin
|
|
//idledata :=(new tcbytearray(4))._getptr_();
|
|
id := g_idle_add(gettslvcleventhandler_("tsl_gtk_idle"),idledata);
|
|
gtk_main();
|
|
g_idle_remove_by_data(idledata); //删除idle
|
|
return 1;
|
|
end
|
|
function g_idle_add(f:pointer;d:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_main_quit();cdecl;external 'libgtk-3.so';
|
|
|
|
|
|
//////////////////////context///////////////////////////////
|
|
function gtk_widget_get_style_context(w:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////widget////////////////////////////////////
|
|
function gtk_widget_get_realized(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_events(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_get_allocation(w:pointer;var rec:array of integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_allocation(w:pointer; rec: array of integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_size_allocate(w:pointer; rec: array of integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_modify_text(w:pointer;t:integer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_tooltip_text(w:pointer;tip:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_size_request(wd:pointer;h:integer;w:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_set_app_paintable(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_realize(w:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_queue_draw(w:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_queue_draw_area(w:pointer;x:integer;y:integer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_widget_get_margin_top(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
/////////////////////edit entry//////////////////////////////////////////////////////
|
|
function gtk_entry_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_entry_get_text(w:pointer):string;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_text(e:pointer;c:string);cdecl;external 'libgtk-3.so';
|
|
function gtk_entry_get_text_length(e:pointer):short;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_visibility(e:pointer;v:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_width_chars(e:pointer;v:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_invisible_char(e:pointer;c:integer);cdecl;external 'libgtk-3.so';
|
|
//procedure gtk_entry_set_editable(e:pointer;ed:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_editable_set_editable(e:pointer;ed:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_has_frame(e:pointer;s:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_entry_set_max_length(e:pointer;len:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
/////////////////////text view memo //////////////////////////////////////////////////////
|
|
function gtk_text_view_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_view_set_wrap_mode(t:pointer;md:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_view_set_buffer(t:pointer;bf:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_text_buffer_new(tagtable:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_buffer_get_iter_at_offset(bf:pointer;iter:pointer;offset:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_buffer_insert(bf:pointer;iter:pointer;txt:string;len:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_view_set_editable(t:pointer;e:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_set_word_wrap(t:pointer;e:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_buffer_get_end_iter(b:pointer;iter:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_buffer_get_start_iter(b:pointer;iter:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_text_buffer_get_char_count(b:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_text_buffer_get_line_count(b:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_text_buffer_delete(b:pointer;start:pointer;ed:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_text_buffer_get_text(b:pointer;start:pointer;ed:pointer;ic:integer):string;cdecl;external 'libgtk-3.so';
|
|
function gtk_text_buffer_get_selection_bounds(b:pointer;st:pointer;ed:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
|
|
|
|
|
|
//////////////////////////////pango////////////////////////////////////////////
|
|
function pango_font_description_from_string(ns:string):pointer; cdecl;external 'libgtk-3.so';
|
|
procedure pango_font_description_free(pg:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure pango_font_description_set_size(pg:pointer;sz:integer);cdecl;external 'libgtk-3.so';
|
|
function pango_cairo_create_layout(c:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function pango_cairo_create_context(c:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure pango_layout_set_width(p:pointer;w:integer);cdecl;external 'libgtk-3.so';
|
|
function pango_layout_get_width(p:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure pango_layout_set_wrap(p:pointer;wp:integer);cdecl;external 'libgtk-3.so';
|
|
procedure pango_layout_set_font_description(p:pointer;f:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure pango_layout_set_text(pl:pointer;s:string;len:integer);cdecl;external 'libgtk-3.so';
|
|
procedure pango_cairo_show_layout(cr:pointer;pl:pointer);cdecl;external 'libgtk-3.so';
|
|
function pango_cairo_font_map_get_default():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure pango_font_map_list_families(fm:pointer;var fls:pointer;var n:integer);cdecl;external 'libgtk-3.so';
|
|
function pango_font_family_get_name(n:pointer):string;cdecl;external 'libgtk-3.so';
|
|
function pango_font_family_get_names(); //获得文字
|
|
begin
|
|
fm := pango_cairo_font_map_get_default();
|
|
pango_font_map_list_families(fm,ls,lsn);
|
|
mt := new aefclassobj_();
|
|
r := array();
|
|
psize := static getctypesize()["intptr"];
|
|
for i:= 0 to lsn -1 do
|
|
begin
|
|
pi := mt.readptr(ls+psize*i);
|
|
r[i] := GtkStringToTsl( pango_font_family_get_name(pi));
|
|
end
|
|
return r;
|
|
end
|
|
|
|
///////////////////////////cairo////////////////////////////////
|
|
function cairo_create(s:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_save(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_restore(c:pointer);cdecl;external 'libgtk-3.so';
|
|
function gdk_cairo_create(w:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function cairo_move_to(cr:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
|
|
function cairo_line_to(cr:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_source(cr:pointer;s:pointer);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_source(cr:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_curve_to(cr:pointer;x1:double;y1:double;x2:double;y2:double;x3:double;y3:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_rectangle(c:pointer;x:double;y:double;w:double;h:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_source_rgba(c:pointer;red:double;green:double;blue:double;alpha:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_source_rgb(c:pointer;r:double;g:double;b:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_line_width(c:pointer;w:double);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_line_width(c:pointer):double;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_line_cap(c:pointer;cp:integer);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_line_cap(c:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_line_join(c:pointer;t:integer);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_line_join(c:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
//procedure draw_round_rectangle(c:pointer;x:double;y:double;w:double;h:double;r:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_arc (cr:pointer; xc:double;yc:double;radius:double;angle1:double;angle2:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_translate(cr:pointer;tx:double;ty:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_rotate(cr:pointer;angle:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_scale(cr:pointer;sx:double;sy:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_operator(c:pointer;op:integer);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_operator(c:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_tolerance(c:pointer;tol:double);cdecl;external 'libgtk-3.so';
|
|
function cairo_get_tolerance(c:pointer):double;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_destroy(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_close_path(c:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
procedure cairo_set_fill_rule(c:pointer;rul:integer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_clip(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_clip_preserve(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_clip_extents(c:pointer;var x1:double;var y1:double;var x2:double;var y2:double);cdecl;external 'libgtk-3.so';
|
|
function cairo_in_clip(c:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_reset_clip(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_stroke(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_stroke_preserve(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_dash(c:pointer;dash:array of double;num_dash:integer;offset:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_fill(c:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
procedure cairo_fill_preserve(c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_fill_extents(c:pointer;x1:double;y1:double;x2:double;y2:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_paint_with_alpha(c:pointer;alpah:double);cdecl;external 'libgtk-3.so';
|
|
|
|
procedure cairo_paint(c:pointer);cdecl;external 'libgtk-3.so';
|
|
function cairo_applay_pen_style(dc);
|
|
begin
|
|
pt := gtk_object_get_data(dc,"pen.style");
|
|
if pt=0x2 then
|
|
begin
|
|
cairo_set_dash(dc,array(4.0,1.0),2,0);
|
|
end
|
|
else cairo_set_dash(dc,array(4.0,0.0),2,0);
|
|
end
|
|
function cairo_draw_round_rectangle(cr,x,y,w,h,r);
|
|
begin
|
|
cairo_move_to (cr, x + r, y);
|
|
cairo_line_to (cr, x + w - r, y);
|
|
cairo_move_to (cr, x + w, y + r);
|
|
cairo_line_to (cr, x + w, y + h - r);
|
|
cairo_move_to (cr, x + w - r, y + h);
|
|
cairo_line_to (cr, x + r, y + h);
|
|
cairo_move_to (cr, x, y + h - r);
|
|
cairo_line_to (cr, x, y + r);
|
|
cairo_arc (cr, x + r, y + r, r, 3.14, 3 * 3.14 / 2.0);
|
|
cairo_arc (cr, x + w - r, y + r, r, 3 * 3.14 / 2, 2 * 3.14);
|
|
cairo_arc (cr, x + w - r, y + h - r, r, 0, 3.14 / 2);
|
|
cairo_arc (cr, x + r, y + h - r, r, 3.14 / 2, 3.14);
|
|
end
|
|
//////////////////////text//////// https://developer.gnome.org/cairo/stable/cairo-cairo-font-options-t.html#cairo-font-options-get-hint-metrics
|
|
procedure cairo_show_text(c:pointer;t:string);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_select_font_face(cr:pointer;n:string;slat:integer;weight:integer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_font_size(cr:pointer;sz:double);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_text_extents(cr:pointer;s:string;ext:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_font_extents(cr:pointer;ext:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_get_font_options(cr:pointer;ft:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_font_options(cr:pointer;ft:pointer);cdecl;external 'libgtk-3.so';
|
|
function cairo_font_options_create():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_font_options_destroy(op:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
////////cairo surface//////2
|
|
{
|
|
CAIRO_FORMAT_INVALID = -1,
|
|
CAIRO_FORMAT_ARGB32 = 0,
|
|
CAIRO_FORMAT_RGB24 = 1,
|
|
CAIRO_FORMAT_A8 = 2,
|
|
CAIRO_FORMAT_A1 = 3,
|
|
CAIRO_FORMAT_RGB16_565 = 4,
|
|
CAIRO_FORMAT_RGB30 = 5
|
|
}
|
|
function cairo_image_surface_create(t:integer;w:integer;h:integer):pointer;cdecl;external 'libgtk-3.so';
|
|
function cairo_image_surface_create_from_png(f:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function cairo_image_surface_get_width(sf:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function cairo_image_surface_get_height(sf:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_surface_destroy(sf:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure cairo_set_source_surface(cr:pointer;sf:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
|
|
|
|
procedure cairo_pattern_set_extend(c:pointer;pe:integer);cdecl;external 'libgtk-3.so';
|
|
function cairo_pattern_create_linear(x0:double;y0:double;x1:double;y1:double):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure cairo_pattern_add_color_stop_rgb(c:pointer;offset:double;r:double;g:double;b:double;a:double);cdecl;external 'libgetk-3.so';
|
|
|
|
|
|
/////////////////////////window//////////
|
|
procedure gdk_window_move_resize(w:pointer;x:integer;y:integer;wd:integer;h:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gdk_window_resize(w:pointer;wd:integer;h:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_begin_move_drag(w:pointer;btn:integer;x:integer;y:integer;t:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_begin_resize_drag(w:pointer;e:integer;btn:integer;x:integer;y:integer;t:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_toplevel(w:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
/////////// modal ////////////////////////////////
|
|
function gtk_window_is_active(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_present(w:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_window_activate_default(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_window_activate_focus(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_window_has_toplevel_focus(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_modal(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_transient_for(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_get_size(wd:pointer;var h:integer;var w:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_icon(w:pointer;ico:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_resizable(p:pointer;f:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_window_get_resizable(p:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_decorated(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_window_get_decorated(w:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_title(w:pointer;t:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_set_geometry_hints (window:pointer;
|
|
eometry_widget:pointer;
|
|
geometry:pointer;
|
|
geom_mask:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
procedure gtk_window_resize(w:pointer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_resize_to_geometry(w:pointer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_move(w:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
////////////////////// container layout fixed //////////////////////
|
|
procedure gtk_container_add(c1:pointer;c2:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_container_remove(c:pointer;w:pointer); cdecl;external 'libgtk-3.so';
|
|
procedure gtk_container_set_border_width (container:pointer;border_width:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_fixed_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_layout_new(h:pointer;v:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_layout_get_size(layout:pointer;var width:integer;var height:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_layout_set_size(layout:pointer; width:integer; height:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_fixed_put(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_layout_put(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_layout_get_bin_window(l:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
//////////////////////////// box /////////////////////////
|
|
function gtk_vbox_new(homogeneous:integer;spacing:integer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_hbox_new(homogeneous:integer;spacing:integer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_box_pack_end(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_box_pack_start(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
//////////////////////////menu//////////////////////////////////////////////////
|
|
function gtk_menu_shell_get_by_positon(h:pointer;pi:integer);
|
|
begin
|
|
gist := gtk_container_get_children(h);
|
|
ridx := 0;
|
|
while gist do
|
|
begin
|
|
og := new _gslist(gist);
|
|
if ridx=pi then
|
|
begin
|
|
return og.data;
|
|
end
|
|
ridx++;
|
|
gist := og.next;
|
|
//echo "\r\n+++",gist,"+++\r\n";
|
|
end
|
|
return 0;
|
|
end
|
|
function gtk_container_get_children(m:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_menu_bar_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_shell_append(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_shell_prepend(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_shell_insert(mb:pointer;mi:pointer;idx:integer);cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_menu_item_new_with_label(s:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_item_set_submenu(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_item_set_use_underline(mi:pointer;l:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_separator_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_menu_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_item_select(mi:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_check_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_check_menu_item_new_with_label(s:string):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_check_menu_item_set_active(cmi:pointer;ck:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_check_menu_item_get_active(cmi:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_check_menu_item_toggled(cmi:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_menu_item_get_label(mi:pointer):string;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_item_set_label(mi:pointer;l:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_set_title(mi:pointer;l:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_reorder_child(mb:pointer;mi:pointer;id:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_popup (menu:pointer;
|
|
parent_menu_shell:pointer;
|
|
parent_menu_item:pointer;
|
|
func:pointer;
|
|
data:pointer;
|
|
button:integer;
|
|
activate_time:integer);cdecl;external 'libgtk-3.so';
|
|
procedure popup_at_rect(
|
|
menu:pointer;
|
|
rect_window:pointer;
|
|
var rect : array of integer;
|
|
rect_anchor:pointer;
|
|
menu_anchor:pointer;
|
|
trigger_event:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_menu_item_activate(mi:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
|
|
/////////////////////////// adjust scroll /////////////////////////////////
|
|
function gtk_adjustment_get_type():pointer; cdecl;external 'libgtk-3.so';
|
|
function GTK_ADJUSTMENT(w);
|
|
begin
|
|
return g_type_check_instance_cast(w,gtk_adjustment_get_type());
|
|
end
|
|
function gtk_adjustment_new(v:double;
|
|
lower:double;
|
|
upper:double;
|
|
step_increment:double;
|
|
page_increment:double;
|
|
page_size:double):pointer; cdecl;external 'libgtk-3.so';
|
|
function gtk_adjustment_get_value(adj:pointer):double; cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_set_value(adj:pointer;v:double); cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_set_page_size(adj:pointer;v:double); cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_changed(adj:pointer); cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_value_changed(adj:pointer); cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_set_lower(adj:pointer;v:double);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_set_upper(adj:pointer;v:double);cdecl;external 'libgtk-3.so';
|
|
function gtk_adjustment_get_upper(adj:pointer):double;cdecl;external 'libgtk-3.so';
|
|
function gtk_adjustment_get_lower(adj:pointer):double;cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_hscrollbar_new(adj:pointer):pointer; cdecl;external 'libgtk-3.so';
|
|
function gtk_vscrollbar_new(adj:pointer):pointer; cdecl;external 'libgtk-3.so';
|
|
procedure gtk_adjustment_configure(adj:pointer;
|
|
v:double;
|
|
lower:double;
|
|
upper:double;
|
|
step_increment:double;
|
|
page_increment:double;
|
|
page_size:double);cdecl;external 'libgtk-3.so';
|
|
|
|
////////////////////////////////////////////////////
|
|
function gtk_frame_new(lbl:string):pointer;cdecl;external 'libgtk-3.so';
|
|
/////////////////////////////////////
|
|
function gtk_calendar_new():pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
/////////////////////////////////
|
|
function gtk_spinner_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_spinner_start(spn:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_spinner_stop(spn:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
///////////////////////////////
|
|
function gtk_progress_bar_new():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_progress_bar_set_text(pb:pointer;t:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_progress_bar_set_show_text(pb:pointer;s:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_progress_bar_set_fraction(pb:pointer;p:double);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_progress_bar_set_pulse_step(pb:pointer;p:double);cdecl;external 'libgtk-3.so';
|
|
function gtk_progress_bar_get_fraction(pb:pointer):double;cdecl;external 'libgtk-3.so';
|
|
function gtk_progress_bar_set_inverted(pb:pointer;v:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_progress_bar_pulse(pb:pointer);cdecl;external 'libgtk-3.so';
|
|
//procedure gtk_progress_configure(pb:pointer;v:double;min:double;max:double);cdecl;external 'libgtk-3.so';
|
|
|
|
//////////////////////////////label/////////////////////////////////////
|
|
function gtk_label_new(t:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_label_get_text(w:pointer):string;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_label_set_text(l:pointer;t:string);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_label_set_selectable(l:pointer;s:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_label_set_markup(l:pointer;t:string);cdecl;external 'libgtk-3.so';
|
|
//////////////// button btn /////////////////
|
|
function gtk_button_get_label(b:pointer):string;cdecl;external 'libgtk-3.so';
|
|
function gtk_button_get_event_window(b:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_button_new_with_label(c:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_button_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_check_button_new():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_check_button_new_with_label(l:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_radio_button_new(g:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_radio_button_new_from_widget(g:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_toggle_button_set_active(tg:pointer;ac:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_toggle_button_get_active(tg:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_button_clicked(b:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_radio_button_set_group(rbtn:pointer;lst:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
|
|
|
|
////////////////////////// dialog ///////////////////////////////////////////////////////////
|
|
function gtk_dialog_run(d:pointer):integer; cdecl;external 'libgtk-3.so';
|
|
procedure gtk_dialog_response(w:pointer;id:integer); cdecl;external 'libgtk-3.so';
|
|
function gtk_file_chooser_dialog_new(t:string;p:pointer;act:integer;bstring1:string;bvalue1:integer;bstring2:string;bvalue2:integer;pend:pointer):pointer ; cdecl;external 'libgtk-3.so';
|
|
function gtk_file_chooser_get_filename(p:pointer):string;cdecl;external 'libgtk-3.so';
|
|
function gtk_file_chooser_set_filename(p:pointer;n:string):integer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_file_chooser_set_select_multiple(p:pointer;m:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_file_chooser_get_filenames(p:pointer):pointer ;cdecl;external 'libgtk-3.so';
|
|
function gtk_font_chooser_dialog_new(t:string;p:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_font_selection_dialog_new(t:string):pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_font_selection_dialog_get_font_name(d:pointer):string;cdecl;external 'libgtk-3.so';
|
|
function gtk_font_selection_dialog_get_preview_text(p:pointer):string;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_font_selection_dialog_set_preview_text(p:pointer;t:string); cdecl;external 'libgtk-3.so';
|
|
function gtk_font_selection_dialog_set_font_name(p:pointer;f:string):integer; cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_modify_font(w:pointer;p:pointer); cdecl;external 'libgtk-3.so';
|
|
function gtk_color_selection_dialog_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_color_selection_set_current_color(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_color_selection_get_current_color(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
function gdk_color_parse(cs:string;c:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
|
|
////////////////// evntbox ////////////////////////////
|
|
function gtk_event_box_new():pointer;cdecl;external 'libgtk-3.so';
|
|
//获得image
|
|
function GTK_WIDGET(w); //gtkwidget
|
|
begin
|
|
wt := static gtk_widget_get_type();
|
|
return g_type_check_instance_cast(w,wt);
|
|
return w;
|
|
end
|
|
function GTK_CONTAINER(w);//gtk容器
|
|
begin
|
|
wt := static gtk_container_get_type();
|
|
return g_type_check_instance_cast(w,wt);
|
|
end
|
|
function GTK_WINDOW(w);//gtkwindow
|
|
begin
|
|
wt := static gtk_window_get_type();
|
|
return g_type_check_instance_cast(w,wt);
|
|
|
|
return w;
|
|
end
|
|
function GDK_WINDOW(w); //gdkwindow
|
|
begin
|
|
wt := static gdk_window_get_type();
|
|
return g_type_check_instance_cast(w,wt);
|
|
return w;
|
|
end
|
|
|
|
function GTK_COLOR_SELECTION_DIALOG(W);
|
|
begin
|
|
return g_type_check_instance_cast(w,gtk_color_selection_dialog_get_type());
|
|
end
|
|
procedure gtk_widget_set_parent_window(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_get_parent_window(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
procedure gtk_widget_modify_bg(w:pointer;tyle:integer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_layout_move(l:pointer;w:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_grab_add(w:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_destroy(w:pointer);cdecl;external 'libgtk-3.so';
|
|
function g_thread_self():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_get_major_version ():integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_get_micro_version ():integer;cdecl;external 'libgtk-3.so';
|
|
function gtk_get_binary_age ():integer;cdecl;external 'libgtk-3.so';
|
|
function g_main_context_default():pointer;cdecl;external 'libgtk-3.so';
|
|
function g_main_context_pending(gc:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function g_main_context_iteration(gc:pointer;bk:integer):integer;cdecl;external 'libgtk-3.so';
|
|
function g_main_context_get_poll_func(d:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_main_level():integer;external 'libgtk-3.so';
|
|
function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):integer;cdecl;external 'libgtk-3.so';
|
|
function g_signal_new(signal_name:string;
|
|
itype:pointer;
|
|
signal_flags:integer;
|
|
class_offset:integer;
|
|
accumulator:pointer;
|
|
accu_data:pointer;
|
|
c_marshaller:pointer;
|
|
return_type:pointer;
|
|
n_params:integer;
|
|
p1:pointer;
|
|
p2:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
procedure g_signal_emit_by_name(w:pointer;n:string;p1:pointer;p2:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_container_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
function gtk_window_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
function gdk_window_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
function g_type_check_instance_cast(instance:pointer;ty:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
|
|
function gtk_window_new(lev:integer):pointer; cdecl;external 'libgtk-3.so';
|
|
procedure gdk_window_set_back_pixmap(window:pointer;pixmap:pointer;parent_relative:integer);cdecl;external 'libgtk-x11-2.0.so';
|
|
procedure gdk_pixbuf_ref(pixbuf:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gdk_pixbuf_unref(pixbuf:pointer);cdecl;external 'libgtk-3.so';
|
|
|
|
function gdk_cursor_new(c:integer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gdk_window_set_cursor(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
|
|
function gtk_widget_get_window(g:pointer):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_window_get_position(g:pointer;var x:integer;var y:integer);cdecl;external 'libgtk-3.so';
|
|
function gtk_image_new_from_file(f:string):pointer;cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_show_all(window:pointer);cdecl;external 'libgtk-3.so';//'libgtk-x11-2.0.so';
|
|
procedure gtk_window_maximize(window:pointer);cdecl;external 'libgtk-3.so';//'libgtk-x11-2.0.so';
|
|
procedure gtk_widget_show(window:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_show_now(window:pointer);cdecl;external 'libgtk-3.so';
|
|
procedure gtk_widget_hide(window:pointer);cdecl;external 'libgtk-3.so';
|
|
//-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0
|
|
//-lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
|
|
procedure gdk_pixbuf_render_pixmap_and_mask(pixbuf:pointer;
|
|
var pixmap_return:int64;
|
|
var mask_return:int64;
|
|
alpha_threshold:integer); cdecl;
|
|
external 'libgtk-x11-2.0.so';
|
|
//function gtk_image_get_pixbuf (image:pointer):pointer; cdecl;external 'libgtk-x11-2.0.so';
|
|
//function gdk_pixbuf_copy(image:pointer):pointer; cdecl;external 'libgtk-x11-2.0.so';
|
|
|
|
procedure gtk_image_set_from_file (img:pointer;filename:string);cdecl;external 'libgtk-3.so';
|
|
function gtk_image_new_from_pixbuf(image:pointer):pointer; cdecl;external 'libgtk-3.so';
|
|
function gtk_image_new():pointer; cdecl;external 'libgtk-3.so';
|
|
function gdk_pixbuf_get_width(src_pixbuf:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
function gdk_pixbuf_get_height(src_pixbuf:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
|
|
end
|
|
|
|
type _cairo_matrix_t = class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
|
|
array(
|
|
("xx","double",0),
|
|
("yx","double",0),
|
|
("xy","double",0),
|
|
("yy","double",0),
|
|
("x0","double",0),
|
|
("y0","double",0)
|
|
),nil,nil,4);
|
|
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property xx index "xx" read _getvalue_ write _setvalue_;
|
|
property yx index "yx" read _getvalue_ write _setvalue_;
|
|
property xy index "xy" read _getvalue_ write _setvalue_;
|
|
property yy index "yy" read _getvalue_ write _setvalue_;
|
|
property x0 index "x0" read _getvalue_ write _setvalue_;
|
|
property y0 index "y0" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _cairo_text_extents_t = class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
|
|
array(
|
|
("x_bearing","double",0),
|
|
("y_bearing","double",0),
|
|
("width","double",0),
|
|
("height","double",0),
|
|
("x_advance","double",0),
|
|
("y_advance","double",0)
|
|
),nil,nil,4);
|
|
|
|
return SSTRUCT;
|
|
end
|
|
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property x_bearing index "x_bearing" read _getvalue_ write _setvalue_;
|
|
property y_bearing index "y_bearing" read _getvalue_ write _setvalue_;
|
|
property width index "width" read _getvalue_ write _setvalue_;
|
|
property height index "height" read _getvalue_ write _setvalue_;
|
|
property x_advance index "x_advance" read _getvalue_ write _setvalue_;
|
|
property y_advance index "y_advance" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _cairo_font_extents_t = class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
|
|
array(
|
|
("ascent","double",0),
|
|
("descent","double",0),
|
|
("height","double",0),
|
|
("max_x_advance","double",0),
|
|
("max_y_advance","double",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ascent index "ascent" read _getvalue_ write _setvalue_;
|
|
property descent index "descent" read _getvalue_ write _setvalue_;
|
|
property height index "height" read _getvalue_ write _setvalue_;
|
|
property max_x_advance index "max_x_advance" read _getvalue_ write _setvalue_;
|
|
property max_y_advance index "max_y_advance" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _dlgwidgets = class(tslcstructureobj)
|
|
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
|
|
array(
|
|
(0,"intptr",0),
|
|
(1,"intptr",0),
|
|
(2,"intptr",0),
|
|
(3,"intptr",0)
|
|
),nil,nil,4);
|
|
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
end
|
|
|
|
type _GdkEventButton=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("time","int",0),
|
|
("x","double",0),
|
|
("y","double",0),
|
|
("axes","intptr",0),
|
|
("state","int",0),
|
|
("button","int",0),
|
|
("device","intptr",0),
|
|
("x_root","double",0),
|
|
("y_root","double",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property time index "time" read _getvalue_ write _setvalue_;
|
|
property x index "x" read _getvalue_ write _setvalue_;
|
|
property y index "y" read _getvalue_ write _setvalue_;
|
|
property axes index "axes" read _getvalue_ write _setvalue_;
|
|
property state index "state" read _getvalue_ write _setvalue_;
|
|
property button index "button" read _getvalue_ write _setvalue_;
|
|
property device index "device" read _getvalue_ write _setvalue_;
|
|
property x_root index "x_root" read _getvalue_ write _setvalue_;
|
|
property y_root index "y_root" read _getvalue_ write _setvalue_;
|
|
end
|
|
|
|
type _GdkEventKey=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("time","int",0),
|
|
("state","int",0),
|
|
("keyval","int",0),
|
|
("length","int",0),
|
|
("str","intptr",0),
|
|
("hardware_keycode","short",0),
|
|
("group","byte",0),
|
|
("is_modifier","int",1)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property time index "time" read _getvalue_ write _setvalue_;
|
|
property state index "state" read _getvalue_ write _setvalue_;
|
|
property keyval index "keyval" read _getvalue_ write _setvalue_;
|
|
property length index "length" read _getvalue_ write _setvalue_;
|
|
property hardware_keycode index "hardware_keycode" read _getvalue_ write _setvalue_;
|
|
property group index "group" read _getvalue_ write _setvalue_;
|
|
property is_modifier index "is_modifier" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventConfigure=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("x","int",0),
|
|
("y","int",0),
|
|
("width","int",0),
|
|
("height","int",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property x index "x" read _getvalue_ write _setvalue_;
|
|
property y index "y" read _getvalue_ write _setvalue_;
|
|
property width index "width" read _getvalue_ write _setvalue_;
|
|
property height index "height" read _getvalue_ write _setvalue_;
|
|
end
|
|
|
|
type _GdkEventMotion=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("time","int",0),
|
|
("x","double",0),
|
|
("y","double",0),
|
|
("axes","intptr",0),
|
|
("state","int",0),
|
|
("is_hint","short",0),
|
|
("device","intptr",0),
|
|
("x_root","double",0),
|
|
("y_root","double",0)),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property time index "time" read _getvalue_ write _setvalue_;
|
|
property x index "x" read _getvalue_ write _setvalue_;
|
|
property y index "y" read _getvalue_ write _setvalue_;
|
|
property axes index "axes" read _getvalue_ write _setvalue_;
|
|
property state index "state" read _getvalue_ write _setvalue_;
|
|
property is_hint index "is_hint" read _getvalue_ write _setvalue_;
|
|
property device index "device" read _getvalue_ write _setvalue_;
|
|
property x_root index "x_root" read _getvalue_ write _setvalue_;
|
|
property y_root index "y_root" read _getvalue_ write _setvalue_;
|
|
end
|
|
|
|
type _GdkEventScroll=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("time","int",0),
|
|
("x","double",0),
|
|
("y","double",0),
|
|
("state","int",0),
|
|
("direction","int",0),
|
|
("device","intptr",0),
|
|
("x_root","double",0),
|
|
("y_root","double",0)),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property time index "time" read _getvalue_ write _setvalue_;
|
|
property x index "x" read _getvalue_ write _setvalue_;
|
|
property y index "y" read _getvalue_ write _setvalue_;
|
|
property axes index "axes" read _getvalue_ write _setvalue_;
|
|
property state index "state" read _getvalue_ write _setvalue_;
|
|
property is_hint index "is_hint" read _getvalue_ write _setvalue_;
|
|
property device index "device" read _getvalue_ write _setvalue_;
|
|
property x_root index "x_root" read _getvalue_ write _setvalue_;
|
|
property y_root index "y_root" read _getvalue_ write _setvalue_;
|
|
property direction index "direction" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventAny=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventFocus=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("iin","short",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property iin index "iin" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventExpose=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("area","int[4]",0),
|
|
("region","intptr",0),
|
|
("count","int",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property area index "area" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventNoExpose=class(_GdkEventAny)
|
|
function Create(ptr);
|
|
begin
|
|
inherited;
|
|
end
|
|
end
|
|
type _GdkEventVisibility=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("state","int",0)
|
|
),nil,nil,4);
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property state index "state" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventCrossing=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("subwindow","intptr",0),
|
|
("time","int",0),
|
|
("x","double",0),
|
|
("y","double",0),
|
|
("x_root","double",0),
|
|
("y_root","double",0),
|
|
("mode","intptr",0),
|
|
("detail","intptr",0),
|
|
("focus","int",0),
|
|
("state","int",0)
|
|
),nil,nil,4);
|
|
{GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
|
|
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
|
|
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
|
|
GDK_WINDOW_STATE_STICKY = 1 << 3,
|
|
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
|
|
GDK_WINDOW_STATE_ABOVE = 1 << 5,
|
|
GDK_WINDOW_STATE_BELOW = 1 << 6}
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GdkEventWindowState=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("ttype","intptr",0),
|
|
("window","intptr",0),
|
|
("send_event","byte",0),
|
|
("changed_mask","int",0),
|
|
("new_window_state","int",0)
|
|
),nil,nil,4);
|
|
{GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
|
|
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
|
|
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
|
|
GDK_WINDOW_STATE_STICKY = 1 << 3,
|
|
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
|
|
GDK_WINDOW_STATE_ABOVE = 1 << 5,
|
|
GDK_WINDOW_STATE_BELOW = 1 << 6}
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property ttype index "ttype" read _getvalue_ write _setvalue_;
|
|
property window index "window" read _getvalue_ write _setvalue_;
|
|
property send_event index "send_event" read _getvalue_ write _setvalue_;
|
|
property changed_mask index "changed_mask" read _getvalue_ write _setvalue_;
|
|
property new_window_state index "new_window_state" read _getvalue_ write _setvalue_;
|
|
end
|
|
type _GtkTextIter=class(tslcstructureobj)
|
|
static classstruct;
|
|
class function getstruct();
|
|
begin
|
|
if not classstruct then
|
|
begin
|
|
classstruct := MemoryAlignmentCalculate(array(
|
|
("dummy1","intptr",0),
|
|
("dummy2","intptr",0),
|
|
("dummy3","int",0),
|
|
("dummy4","int",0),
|
|
("dummy5","int",0),
|
|
("dummy6","int",0),
|
|
("dummy7","int",0),
|
|
("dummy8","int",0),
|
|
("dummy9","intptr",0),
|
|
("dummy10","intptr",0),
|
|
("dummy11","int",0),
|
|
("dummy12","int",0),
|
|
("dummy13","int",0),
|
|
("dummy14","intptr",0),
|
|
("dummy15","intptr",0)
|
|
),nil,nil,4);
|
|
end
|
|
return classstruct;
|
|
end
|
|
function create(ptr);
|
|
begin
|
|
class(tslcstructureobj).create(getstruct(),ptr);
|
|
end
|
|
end
|
|
|
|
type _GdkColor=class(tslcstructureobj)
|
|
static classstruct;
|
|
class function getstruct();
|
|
begin
|
|
if not classstruct then
|
|
begin
|
|
classstruct := MemoryAlignmentCalculate(array(
|
|
("p","int",0),
|
|
("r","short",0),
|
|
("g","short",0),
|
|
("b","short",0)));
|
|
end
|
|
return classstruct;
|
|
end
|
|
function create(ptr);
|
|
begin
|
|
class(tslcstructureobj).create(getstruct(),ptr);
|
|
end
|
|
function SetRgb(red,green,blue);
|
|
begin
|
|
r := red;
|
|
g := green;
|
|
b := blue;
|
|
end
|
|
property p index "p" read _getvalue_ write _setvalue_;
|
|
property r index "r" read _getvalue_ write _setvalue_;
|
|
property g index "g" read _getvalue_ write _setvalue_;
|
|
property b index "b" read _getvalue_ write _setvalue_;
|
|
end
|
|
type ttgtk_pen=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(("lopenstyle","int",0),
|
|
("lopnwidth","int",1),
|
|
("lopnwidth2","int",0),
|
|
("lopncolor","int",0)));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
_wapi := gettswin32api();
|
|
end
|
|
function destroy();override;
|
|
begin
|
|
ht := _getptr_();
|
|
inherited;
|
|
_wapi.gtk_object_set_data(ht);
|
|
end
|
|
property style index "lopenstyle" read _getvalue_ write _setvalue_;
|
|
property width index "lopnwidth" read _getvalue_ write _setvalue_;
|
|
property color index "lopncolor" read _getvalue_ write _setvalue_;
|
|
private
|
|
_wapi;
|
|
end
|
|
/////////////////gdi///////////////////////////////////////////
|
|
type ttgtk_brush=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(("lbstyle","int",0),
|
|
("lbcolor","int",crColor),
|
|
("lbhatch","intptr",0)));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
_wapi := gettswin32api();
|
|
end
|
|
function destroy();override;
|
|
begin
|
|
ht := _getptr_();
|
|
inherited;
|
|
_wapi.gtk_object_set_data(ht);
|
|
end
|
|
property style index "lbstyle" read _getvalue_ write _setvalue_;
|
|
property hatch index "lbhatch" read _getvalue_ write _setvalue_;
|
|
property color index "lbcolor" read _getvalue_ write _setvalue_;
|
|
private
|
|
_wapi;
|
|
end
|
|
type ttgtk_font=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("height","int",15),
|
|
("width","int",0),
|
|
("escapement","int",0),
|
|
("orientation","int",0),
|
|
("weight","int",400),
|
|
("italic","byte",0),
|
|
("underline","byte",0),
|
|
("strikeout","byte",0),
|
|
("charset","byte",134),
|
|
("outprecision","byte",3),
|
|
("clipprecision","byte",2),
|
|
("quality","byte",1),
|
|
("pitchandfamily","byte",0),
|
|
("facename","char[32]","新宋体")));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
_wapi := gettswin32api();
|
|
end
|
|
function destroy();override;
|
|
begin
|
|
ht := _getptr_();
|
|
inherited;
|
|
_wapi.gtk_object_set_data(ht);
|
|
end
|
|
property height index "height" read _getvalue_ write _setvalue_;
|
|
property width index "width" read _getvalue_ write _setvalue_;
|
|
property escapement index "escapement" read _getvalue_ write _setvalue_;
|
|
property orientation index "orientation" read _getvalue_ write _setvalue_;
|
|
property weight index "weight" read _getvalue_ write _setvalue_;
|
|
property italic index "italic" read _getvalue_ write _setvalue_;
|
|
property underline index "underline" read _getvalue_ write _setvalue_;
|
|
property strikeout index "strikeout" read _getvalue_ write _setvalue_;
|
|
property charset index "charset" read _getvalue_ write _setvalue_;
|
|
property outprecision index "outprecision" read _getvalue_ write _setvalue_;
|
|
property clipprecision index "clipprecision" read _getvalue_ write _setvalue_;
|
|
property quality index "quality" read _getvalue_ write _setvalue_;
|
|
property pitchandfamily index "pitchandfamily" read _getvalue_ write _setvalue_;
|
|
property facename index "facename" read _getvalue_ write _setvalue_;
|
|
private
|
|
_wapi;
|
|
end
|
|
|
|
|
|
//////////////////////////////////////////额外定义的结构体 为了适应windows api///////////////////////////////////////////
|
|
|
|
|
|
type TSystemTime = class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
|
|
array(
|
|
("wYear","short",0),
|
|
("wMonth","short",0),
|
|
("wDayOfWeek","short",0),
|
|
("wDay","short",0),
|
|
("wHour","short",0),
|
|
("wMinute","short",0),
|
|
("wSecond","short",0),
|
|
("wMilliseconds","short",0)
|
|
));
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
property wYear index "wYear" read _getvalue_ write _setvalue_ ;
|
|
property wMonth index "wMonth" read _getvalue_ write _setvalue_ ;
|
|
property wDay index "wDay" read _getvalue_ write _setvalue_ ;
|
|
end
|
|
type tagNMSELCHANGE=class(tslcstructureobj)
|
|
private
|
|
static SSTRUCT;
|
|
structdata;
|
|
pstruct;
|
|
function getstruct();
|
|
begin
|
|
if not SSTRUCT then
|
|
begin
|
|
ar1:=array(
|
|
("wYear","short",0),
|
|
("wMonth","short",0),
|
|
("wDayOfWeek","short",0),
|
|
("wDay","short",0),
|
|
("wHour","short",0),
|
|
("wMinute","short",0),
|
|
("wSecond","short",0),
|
|
("wMilliseconds","short",0)
|
|
);
|
|
ar3:=array(
|
|
("nmhdr","user",(("hwndfrom","intptr",0),("idfrom","intptr",0),("code","int",0))),
|
|
("stselstart","user",ar1),
|
|
("stselend","user",ar1));
|
|
SSTRUCT:=MemoryAlignmentCalculate(ar3);
|
|
end
|
|
return SSTRUCT;
|
|
end
|
|
public
|
|
function create(p);
|
|
begin
|
|
inherited create(getstruct(),p);
|
|
end
|
|
function SetDataa(y,m,d);
|
|
begin
|
|
v := _getvalue_("stselstart");
|
|
if ifobj(v) then
|
|
begin
|
|
v._setvalue_("wYear",y);
|
|
v._setvalue_("wMonth",m+1);
|
|
v._setvalue_("wDay",d);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////额外定义的结构体 为了适应windows api///////////////////////////////////////////
|
|
type _gslist =class(tslcstructureobj)
|
|
static classstruct;
|
|
class function getstruct();
|
|
begin
|
|
if not classstruct then
|
|
begin
|
|
classstruct := MemoryAlignmentCalculate( array(
|
|
("data","intptr",0),
|
|
("next","intptr",0)),nil,nil,4);
|
|
end
|
|
return classstruct;
|
|
end
|
|
function create(ptr);
|
|
begin
|
|
class(tslcstructureobj).create(getstruct(),ptr);
|
|
end
|
|
property data index "data" read _getvalue_ write _setvalue_ ;
|
|
property next index "next" read _getvalue_ write _setvalue_ ;
|
|
end
|
|
type tenterouterlist = class
|
|
function push(d);
|
|
begin
|
|
FIndex++;
|
|
FList[FIndex] := d;
|
|
end
|
|
function lock();
|
|
begin
|
|
FLock := true;
|
|
end
|
|
function unlock();
|
|
begin
|
|
FLock := false;
|
|
end
|
|
function MouseIsMoved();
|
|
begin
|
|
if FLock then return ;
|
|
|
|
id := FList[FIndex];
|
|
if not id then return ;
|
|
ps := array(0,0);
|
|
_wapi.GetCursorPos(ps);
|
|
if FCpos = ps then return ;
|
|
FCpos := ps;
|
|
if Mousehittest then call(Mousehittest,self,id);
|
|
if Mousemovecall then call(Mousemovecall,self,id);
|
|
end
|
|
function feach();
|
|
begin
|
|
return FList[FIndex];
|
|
end
|
|
function inner(h);
|
|
begin
|
|
for i,v in FList do
|
|
begin
|
|
if v=h then return true;
|
|
end
|
|
return false;
|
|
end
|
|
function pop(d);
|
|
begin
|
|
for i := 0 to length(FList)-1 do
|
|
begin
|
|
if d=FList[i] then
|
|
begin
|
|
deleteindex(FList,i,true);
|
|
FIndex--;
|
|
end
|
|
end
|
|
end
|
|
function create(api);
|
|
begin
|
|
ctm := class(tUIglobalData).uigetdata("G_T_TTIMER_");
|
|
if not ctm then return ;
|
|
_wapi := api;
|
|
FCpos := array(0,0);
|
|
_wapi.GetCursorPos(FCpos);
|
|
FList := array();
|
|
FIndex := -1;
|
|
FTimer := createobject(ctm,nil);
|
|
FTimer.interval := 30; //30毫秒
|
|
FTimer.Ontimer := thisfunction(MouseIsMoved);
|
|
FTimer.start();
|
|
end
|
|
function destroy();
|
|
begin
|
|
FIndex := -1;
|
|
FList := array();
|
|
if FTimer then
|
|
begin
|
|
FTimer.stop();
|
|
FTimer := nil;
|
|
end
|
|
end
|
|
Mousemovecall;
|
|
Mousehittest;
|
|
_wapi;
|
|
FCpos;
|
|
private
|
|
FLock;
|
|
FIndex ;
|
|
FList;
|
|
FTimer; //20230314 修正此处问题
|
|
end
|
|
type tgtk_ctl_object = class(_gtkeventtype)
|
|
private
|
|
|
|
FHitwidgetposition;
|
|
static FsysCursors;
|
|
Fsyscommand0x12;
|
|
Fsyscommand0x12info;
|
|
protected
|
|
//////////////////////样式////////
|
|
Fdwstyle;
|
|
FExdwstyle;
|
|
///////////////////////////////////
|
|
function CanignoreBtnpress();virtual;
|
|
begin
|
|
return true;
|
|
end
|
|
public
|
|
function Create(h); //构造
|
|
begin
|
|
sinit();
|
|
if not _wapi then
|
|
begin
|
|
_const := getwin32const();
|
|
_wapi := gettswin32api();
|
|
FMousemoveernotify := new tenterouterlist(_wapi);
|
|
FMousemoveernotify.Mousemovecall := thisfunction(widgetmousemovecall);
|
|
FMousemoveernotify.Mousehittest := thisfunction(widgetmousehit);
|
|
FsysCursors := array();
|
|
FsysCursors[0] := _wapi.gdk_cursor_new(2);
|
|
FsysCursors[1] := _wapi.gdk_cursor_new(70);
|
|
FsysCursors[2] := _wapi.gdk_cursor_new(16);
|
|
end
|
|
SetHandle(h);
|
|
FHitwidgetposition := 0;
|
|
end
|
|
static FLastPosition;
|
|
class function widgetmousehit(nfer,id);
|
|
begin
|
|
_wapi.GetCursorPos(p);
|
|
return executeMessageA(id,_const.WM_NCHITTEST,0,makelong(p[0],p[1]));
|
|
end
|
|
class function widgetmousemovecall(nfer,id);
|
|
begin
|
|
if hasMessageFromGtkMessageQueue(id,_const.WM_MOUSEMOVE) then return ;
|
|
_wapi.GetCursorPos(p);
|
|
if FLastPosition=p then return ;
|
|
FLastPosition := p;
|
|
//点击测试
|
|
//r := CallGtkWinProc(id,_const.WM_NCHITTEST,0,makelong(p[0],p[1]));
|
|
_wapi.ScreenToClient(id,p);
|
|
mp := makelong(p[0],p[1]);
|
|
//CallTslVclProc(id,_const.WM_NCHITTEST,0,makelong(p[0],p[1]));
|
|
//echo "\r\n",nfer;
|
|
global g_gtk_keytable,g_gtk_buttontable;
|
|
wp := 0;
|
|
if g_gtk_keytable[0x10] then wp .|= 0x0004;
|
|
if g_gtk_keytable[0x11] then wp .|= 0x0008;
|
|
wp .|= g_gtk_buttontable[0];
|
|
wp .|= g_gtk_buttontable[1];
|
|
AddMessageToGtkMessageQueue(id,_const.WM_MOUSEMOVE,wp,mp,0);
|
|
end
|
|
function DefaultMessageDo(msg,w,l);virtual;
|
|
begin
|
|
//if (FHitwidgetposition <> 0) or (FHitwidgetposition <> 1) then return 0;
|
|
if (msg = _const.WM_SYSCOMMAND and w = 0xF012) or (msg = _const.WM_NCLBUTTONDOWN and w= _const.HTCAPTION) then //WM_NCLBUTTONDOWN
|
|
begin
|
|
Fsyscommand0x12 := true;
|
|
FMousemoveernotify.lock();
|
|
h := handle;
|
|
x := _wapi.g_object_get_data(h,"gtk_layout_x");
|
|
y := _wapi.g_object_get_data(h,"gtk_layout_y");
|
|
cx := _wapi.g_object_get_data(h,"gtk_layout_width");
|
|
cy := _wapi.g_object_get_data(h,"gtk_layout_height");
|
|
xy := array(0,0);
|
|
_wapi.GetCursorPos(xy);
|
|
Fsyscommand0x12info:= array(
|
|
xy,(x,y,cx,cy)
|
|
);
|
|
end
|
|
return 0;
|
|
end
|
|
function CallTslVclProc(msg,w,l,P);virtual; //调用到win消息处理
|
|
begin
|
|
CM_CURSORCHANGED := _const.CM_CURSORCHANGED;
|
|
if p then
|
|
begin
|
|
return AddMessageToGtkMessageQueue(FHandle,msg,w,l,p);
|
|
end else
|
|
begin
|
|
gfw := class(tUIglobalData).uigetdata("G_F_TWIN_PROC_");
|
|
if gfw then
|
|
begin
|
|
r := call(gfw,FHandle,msg,w,l);
|
|
end
|
|
if msg = CM_CURSORCHANGED then
|
|
begin
|
|
if l<>0 and w<>0 then
|
|
begin
|
|
return _wapi.gdk_window_set_cursor(w,l);
|
|
end
|
|
end else
|
|
if (msg = _const.WM_NCHITTEST) then
|
|
begin
|
|
global g_show_cursor_window;
|
|
wd := _Wapi.gtk_widget_get_window(FHandle);
|
|
g_show_cursor_window := wd;
|
|
FHitwidgetposition := r;
|
|
clearMessageFromGtkMessageQueue(FHandle,CM_CURSORCHANGED);
|
|
case r of
|
|
10,11:begin
|
|
//_wapi.gdk_window_set_cursor(wd,FsysCursors[1]) ;
|
|
g_show_cursor_window := 0;
|
|
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[1]);
|
|
end
|
|
12,15:begin
|
|
//_wapi.gdk_window_set_cursor(wd,FsysCursors[2]) ;
|
|
g_show_cursor_window := 0;
|
|
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[2]);
|
|
|
|
end
|
|
1:begin
|
|
//_wapi.gdk_window_set_cursor(wd,FsysCursors[0]) ;
|
|
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,0,0);
|
|
end
|
|
else
|
|
begin
|
|
if _wapi.gtk_object_get_data(FHandle,"gtk_wnd_hs_caption") then return ;
|
|
rsz := _wapi.gtk_object_get_data(FHandle,"gtk_widget_resizeable");
|
|
if rsz then
|
|
begin
|
|
lowuperdword(l,lo,hi);
|
|
ht := _wapi.hittestwidget(FHandle,lo,hi);
|
|
FHitwidgetposition := ht;
|
|
if ht=10 or ht=11 then
|
|
begin
|
|
//return _wapi.gdk_window_set_cursor(wd,FsysCursors[1]) ;
|
|
g_show_cursor_window := 0;
|
|
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[1]);
|
|
|
|
end else
|
|
if ht=12 or ht=15 then
|
|
begin
|
|
g_show_cursor_window := 0;
|
|
//return _wapi.gdk_window_set_cursor(wd,FsysCursors[2]) ;
|
|
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[2]);
|
|
end
|
|
end
|
|
//_wapi.gdk_window_set_cursor(wd,FsysCursors[0]) ;
|
|
return AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,0,0);
|
|
end
|
|
end ;
|
|
end else
|
|
if not r then
|
|
begin
|
|
DefaultMessageDo(msg,w,l);
|
|
end
|
|
return r;
|
|
end
|
|
end
|
|
function executeMessage(msg,w,l);virtual; //执行消息
|
|
begin
|
|
return CallTslVclProc(msg,w,l);
|
|
return 0;
|
|
end
|
|
function GetScrollInfo(nBar,si);virtual;
|
|
begin
|
|
|
|
end
|
|
function setScrollInfo(nBar,si,redraw);virtual;
|
|
begin
|
|
|
|
end
|
|
function GetWidnowLong(idx);virtual; //样式
|
|
begin
|
|
case idx of
|
|
_const.GWL_EXSTYLE :
|
|
begin
|
|
return FExdwstyle;
|
|
end
|
|
_const.GWL_STYLE :
|
|
begin
|
|
return Fdwstyle;
|
|
end
|
|
end ;
|
|
end
|
|
function SetWidnowLong(idx,v);virtual; //样式
|
|
begin
|
|
stl := new TSTYLESTRUCT(nil);
|
|
stl.styleold := 0;
|
|
case idx of
|
|
_const.GWL_EXSTYLE :
|
|
begin
|
|
if FExdwstyle<>v then
|
|
begin
|
|
FExdwstyle := V;
|
|
stl.stylenew := dwExStyle;
|
|
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_EXSTYLE,stl._getptr_());
|
|
end
|
|
end
|
|
_const.GWL_STYLE :
|
|
begin
|
|
if Fdwstyle <> V then
|
|
begin
|
|
Fdwstyle := V;
|
|
stl.stylenew := v;
|
|
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_STYLE,stl._getptr_());
|
|
end
|
|
end
|
|
end ;
|
|
end
|
|
function widgetsizechanged(h,w);virtual; //大小改变
|
|
begin
|
|
CallTslVclProc(_const.WM_SIZE,0,makelong(w,h));
|
|
end
|
|
fimhandle;
|
|
function gdk_window_get_state(w:pointer):integegr;cdecl;external 'libgtk-3.so';
|
|
function GtkEventDispatchA(a,b,c,d);//gtk消息分发
|
|
begin
|
|
global g_gtk_scroll_lock;
|
|
if g_gtk_scroll_lock then
|
|
begin
|
|
return true;
|
|
end
|
|
if FHitwidgetposition in array(110,111,112,115) then
|
|
begin
|
|
mn := GetGtkEventNameOrId(b);
|
|
if mn="event" then
|
|
begin
|
|
e := new _GdkEventAny(c);
|
|
if 3=e.ttype then
|
|
begin
|
|
ogps := Fsyscommand0x12info[0];
|
|
xy := Fsyscommand0x12info[1];
|
|
cxy := array(0,0);
|
|
_wapi.GetCursorPos(cxy);
|
|
dx := cxy[0]-ogps[0];
|
|
dy := cxy[1]-ogps[1];
|
|
case FHitwidgetposition of //0 修改为 -1
|
|
110:
|
|
begin
|
|
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0]+dx,xy[1],xy[2]-dx,xy[3],0);
|
|
end
|
|
111:
|
|
begin
|
|
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2]+dx,xy[3],0);
|
|
end
|
|
112:
|
|
begin
|
|
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1]+dy,xy[2],xy[3]-dy,0);
|
|
end
|
|
115:
|
|
begin
|
|
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2],xy[3]+dy,0);
|
|
end
|
|
|
|
|
|
end;
|
|
return 1;
|
|
end else
|
|
if 7 = e.ttype then
|
|
begin
|
|
FHitwidgetposition := 0;
|
|
Fsyscommand0x12info := nil;
|
|
FMousemoveernotify.unlock();
|
|
//return ;
|
|
end
|
|
end
|
|
end else
|
|
if Fsyscommand0x12 and ifarray(Fsyscommand0x12info) then
|
|
begin
|
|
mn := GetGtkEventNameOrId(b);
|
|
if mn="event" then
|
|
begin
|
|
e := new _GdkEventAny(c);
|
|
if 3=e.ttype then
|
|
begin
|
|
ogps := Fsyscommand0x12info[0];
|
|
xy := Fsyscommand0x12info[1];
|
|
cxy := array(0,0);
|
|
_wapi.GetCursorPos(cxy);
|
|
dx := cxy[0]-ogps[0];
|
|
dy := cxy[1]-ogps[1];
|
|
if dx>3 or dx<-3 or dy<-3 or dy>3 then
|
|
begin
|
|
_wapi.SetWindowPos(a.handle,0,xy[0]+dx,xy[1]+dy,-1,-1,0);
|
|
end
|
|
return 1;
|
|
end else
|
|
if 7 = e.ttype then
|
|
begin
|
|
Fsyscommand0x12 := false;
|
|
Fsyscommand0x12info := nil;
|
|
FMousemoveernotify.unlock();
|
|
//return ;
|
|
end
|
|
end
|
|
end
|
|
return GtkEventDispatchb(a,b,c,d);
|
|
end
|
|
function GtkEventDispatchb(a,b,c,d); //gtk消息分发
|
|
begin
|
|
mn := GetGtkEventNameOrId(b); // _send_
|
|
global g_current_get_focus_widget,g_current_loss_focus_widget,g_gtk_buttontable,G_GTK_WINDOW_ACTIVATE, g_gtk_keytable;
|
|
if mn = "event" then
|
|
begin
|
|
e := new _GdkEventAny(c);
|
|
case e.ttype of
|
|
GDK_WINDOW_STATE:
|
|
begin
|
|
obj := new _GdkEventWindowState(c);
|
|
st := obj.new_window_state;
|
|
if st .& 4 then
|
|
begin
|
|
return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MAXIMIZE,0);
|
|
end
|
|
if st .& 2 then
|
|
begin
|
|
return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MINIMIZE,0);
|
|
end
|
|
if st .& (2^4) then
|
|
begin
|
|
//echo "\r\n full screen";
|
|
end
|
|
if st .& (2^5) then
|
|
begin
|
|
//echo "\r\n above";
|
|
end
|
|
if st .& (2^6) then
|
|
begin
|
|
//echo "\r\n below";
|
|
end
|
|
if st .& (2^7) then
|
|
begin
|
|
//CallTslVclProc(_const.WM_SETFOCUS ,0,0);
|
|
hwd := handle;
|
|
hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd);
|
|
if G_GTK_WINDOW_ACTIVATE<>hwd then
|
|
begin
|
|
if G_GTK_WINDOW_ACTIVATE then
|
|
begin
|
|
AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0);
|
|
end
|
|
end
|
|
AddMessageToGtkMessageQueue(hwd,0x6,1,0,0);
|
|
G_GTK_WINDOW_ACTIVATE := hwd;
|
|
//CallTslVclProc(_const.WM_ACTIVATE ,2,0,0);
|
|
end
|
|
{GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
|
|
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
|
|
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
|
|
GDK_WINDOW_STATE_STICKY = 1 << 3,
|
|
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
|
|
GDK_WINDOW_STATE_ABOVE = 1 << 5,
|
|
GDK_WINDOW_STATE_BELOW = 1 << 6}
|
|
end
|
|
GDK_BUTTON_PRESS:
|
|
begin
|
|
e := new _GdkEventButton(c);
|
|
psi := makelong(integer(e.x),integer(e.y));
|
|
//r := array();
|
|
//_wapi.GetTopWidgetList(a.handle,e.x_root,e.y_root,r);
|
|
//rl := length(r)-1;
|
|
//if r[rl,0]<>a.handle then return false;;
|
|
wp := 0;
|
|
if ifarray(g_gtk_keytable) then
|
|
begin
|
|
if g_gtk_keytable[0x10] then wp .|= 0x0004;
|
|
if g_gtk_keytable[0x11] then wp .|= 0x0008;
|
|
end
|
|
case e.button of
|
|
1:
|
|
begin
|
|
wp .|=0x1;
|
|
g_gtk_buttontable[0] := _const.MK_LButton;
|
|
if FHitwidgetposition in array(10,11,12,15) then
|
|
begin
|
|
FHitwidgetposition += 100;
|
|
FMousemoveernotify.lock();
|
|
h := handle;
|
|
xy := array(0,0);
|
|
_wapi.GetCursorPos(xy);
|
|
Fsyscommand0x12info:= array(
|
|
xy,
|
|
(_wapi.g_object_get_data(h,"gtk_layout_x"),
|
|
_wapi.g_object_get_data(h,"gtk_layout_y"),
|
|
_wapi.g_object_get_data(h,"gtk_layout_width"),
|
|
_wapi.g_object_get_data(h,"gtk_layout_height"))
|
|
);
|
|
|
|
CallTslVclProc(_const.WM_NCLBUTTONDOWN ,wp,psi);
|
|
|
|
end else
|
|
begin
|
|
CallTslVclProc(_const.WM_LBUTTONDOWN ,wp,psi);
|
|
end
|
|
end
|
|
3:
|
|
begin
|
|
wp .|=0x2;
|
|
g_gtk_buttontable[1] := _const.MK_RButton;
|
|
CallTslVclProc(_const.WM_RBUTTONDOWN ,wp,psi);
|
|
end
|
|
end ;
|
|
|
|
{hwd := handle;
|
|
hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd);
|
|
if G_GTK_WINDOW_ACTIVATE<>hwd then
|
|
begin
|
|
if G_GTK_WINDOW_ACTIVATE then
|
|
AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0);
|
|
G_GTK_WINDOW_ACTIVATE := hwd;
|
|
AddMessageToGtkMessageQueue(hwd,0x6,1,0,0);
|
|
end }
|
|
return CanignoreBtnpress();
|
|
end
|
|
GDK_BUTTON_RELEASE:
|
|
begin
|
|
//t := 1+"1234";
|
|
e := new _GdkEventButton(c);
|
|
psi := makelong(integer(e.x),integer(e.y));
|
|
wp := 0;
|
|
if ifarray(g_gtk_keytable) then
|
|
begin
|
|
if g_gtk_keytable[0x10] then wp .|= 0x0004;
|
|
if g_gtk_keytable[0x11] then wp .|= 0x0008;
|
|
end
|
|
case e.button of
|
|
1:
|
|
begin
|
|
wp .|=0x1;
|
|
g_gtk_buttontable[0] := 0;
|
|
CallTslVclProc(_const.WM_LBUTTONUP ,wp,psi);
|
|
end
|
|
3:begin
|
|
wp .|=0x2;
|
|
g_gtk_buttontable[1] := 0;
|
|
CallTslVclProc(_const.WM_RBUTTONUP ,wp,psi);
|
|
//if not hasMessageFromGtkMessageQueue(a.handle,_const.LM_CONTEXTMENU ) then
|
|
CallTslVclProc(_const.LM_CONTEXTMENU ,a.handle,makelong(integer(e.x_root),integer(e.y_root)),true);
|
|
end
|
|
end ;
|
|
return CanignoreBtnpress();
|
|
end
|
|
GDK_2BUTTON_PRESS:
|
|
begin
|
|
ne := new _GdkEventButton(c);
|
|
psi := makelong(integer(ne.x),integer(ne.y));
|
|
wp := 0;
|
|
if ifarray(g_gtk_keytable) then
|
|
begin
|
|
if g_gtk_keytable[0x10] then wp .|= 0x0004;
|
|
if g_gtk_keytable[0x11] then wp .|= 0x0008;
|
|
end
|
|
case ne.button of
|
|
1:
|
|
begin
|
|
CallTslVclProc(_const.WM_LBUTTONDBLCLK ,wp,psi);
|
|
|
|
end
|
|
3:begin
|
|
CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi);
|
|
end
|
|
end ;
|
|
return CanignoreBtnpress();
|
|
end
|
|
8,9: //key
|
|
begin
|
|
kud := e.ttype;
|
|
///////////////////////////////////控制键
|
|
|
|
|
|
e := new _GdkEventKey(c);
|
|
kv := e.keyval;
|
|
acskey := array(
|
|
65505: 0x10, //shift
|
|
65506: 0x10,
|
|
65507: 0x11, //control
|
|
65508: 0x11,
|
|
65513: 0x12, //alt
|
|
65514: 0x12
|
|
);
|
|
if acskey[kv] then
|
|
begin
|
|
if 8=kud then
|
|
begin
|
|
g_gtk_keytable[acskey[kv]] := _shl( 1,15);
|
|
end else
|
|
begin
|
|
g_gtk_keytable[acskey[kv]] := 0;
|
|
end
|
|
end
|
|
///////////////菜单按键
|
|
if kv = 65513 or kv = 65514 then
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
CallTslVclProc(_const.WM_SYSKEYDOWN ,0x12,0);
|
|
end
|
|
else
|
|
begin
|
|
CallTslVclProc(_const.WM_SYSKEYUP ,0x12,0);
|
|
end
|
|
return true;
|
|
end
|
|
notctrlpress := not(kud=8 and (g_gtk_keytable[0x11] or g_gtk_keytable[0x12]) );
|
|
// kn := array(
|
|
// 65288 : _const.VK_BACK,
|
|
// 65289 : _const.VK_TAB,
|
|
// 65293 : 13 , //enter
|
|
// 65307 : _const.VK_ESCAPE,
|
|
// 65505 : _const.VK_SHIFT,
|
|
// 65506 : _const.VK_SHIFT,
|
|
// 65507 : _const.VK_CONTROL,
|
|
// 65508 : _const.VK_CONTROL,
|
|
// 65509 : _const.VK_CAPITAL,
|
|
// 65513 : _const.VK_MENU,
|
|
// 65514 : _const.VK_MENU,
|
|
// 65535 : _const.VK_DELETE,
|
|
// 65379 : _const.VK_INSERT,
|
|
// 65360 : _const.VK_HOME,
|
|
// 65361 : _const.VK_LEFT,
|
|
// 65362 : _const.VK_UP,
|
|
// 65363 : _const.VK_RIGHT,
|
|
// 65364 : _const.VK_DOWN,
|
|
// 65365 : 33, //pageup
|
|
// 65366 : 34, //pagedown
|
|
// 65367 : _const.VK_END
|
|
// //VK_SPACE
|
|
// );
|
|
//r := CallTslVclProc(_const.WM_KEYDOWN ,kv,0);
|
|
//r := CallTslVclProc(_const.WM_CHAR ,kv,0);
|
|
|
|
//echo "\r\n===handle:",a.handle;
|
|
ah := a.handle;
|
|
if not _wapi.gtk_widget_is_toplevel(ah) then return true ;
|
|
fcsctl := _wapi.gtk_window_get_focus(ah);
|
|
if not fcsctl then
|
|
begin
|
|
obj := class(tUIglobalData).uigetdata("tuiapplication");
|
|
if obj then fcsctl := obj.handle;
|
|
else fcsctl := 0;
|
|
if not fcsctl then return true;
|
|
end
|
|
fcsctl := TGtkObjects[inttostr(fcsctl)] ;
|
|
if not fcsctl then return true;
|
|
if (kud = 8) and (kv<>65505 or kv<>65506) then
|
|
begin
|
|
|
|
if getfimobj().presskey(c) then
|
|
begin
|
|
//echo "\r\n inputx:" , getfimobj().FCommit;
|
|
//return true;
|
|
end else
|
|
begin
|
|
//echo "\r\n not char input";
|
|
notachar := true;
|
|
//echo "\r\nkkkkvvv:",kv;
|
|
end
|
|
end
|
|
//echo "\r\nkey fillter ed:",kud,"====",kv;
|
|
//return 1;
|
|
case kv of
|
|
//65513,65514,65506
|
|
65288:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_BACK,0);
|
|
if notctrlpress then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_BACK,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_BACK,0);
|
|
end
|
|
end
|
|
65289,{---} 65056: //VK_TAB char
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_TAB,0);
|
|
if not(g_gtk_keytable[0x11]) then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_TAB,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_TAB,0);
|
|
|
|
end
|
|
end
|
|
65293:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,13,0);
|
|
if notctrlpress then
|
|
r := fcsctl.CallTslVclProc(_const.WM_CHAR ,13,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,13,0);
|
|
end
|
|
end
|
|
65307: // _const.VK_ESCAPE,
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_ESCAPE,0);
|
|
if notctrlpress then
|
|
r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_ESCAPE,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_ESCAPE,0);
|
|
end
|
|
|
|
end
|
|
65360: //65360 : _const.VK_HOME,
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_HOME,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_HOME,0);
|
|
end
|
|
end
|
|
65361:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_LEFT,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_LEFT,0);
|
|
end
|
|
end
|
|
65362:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_UP,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_UP,0);
|
|
end
|
|
end
|
|
65363:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_RIGHT,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_RIGHT,0);
|
|
end
|
|
end
|
|
65364:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DOWN,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DOWN,0);
|
|
end
|
|
end
|
|
|
|
65365:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,33,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,33,0);
|
|
end
|
|
end
|
|
65366:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,34,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,34,0);
|
|
end
|
|
end
|
|
65367:
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_END,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_END,0);
|
|
end
|
|
end
|
|
65379: // _const.VK_INSERT,
|
|
begin
|
|
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_INSERT,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_INSERT,0);
|
|
end
|
|
end
|
|
65505,65506: //_const.VK_SHIFT,
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_SHIFT,0);
|
|
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_SHIFT,0);
|
|
end
|
|
end
|
|
65507,65508: //, //_const.VK_CONTROL
|
|
begin
|
|
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CONTROL,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CONTROL,0);
|
|
end
|
|
end
|
|
65509: // _const.VK_CAPITAL,
|
|
begin
|
|
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CAPITAL,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CAPITAL,0);
|
|
end
|
|
end
|
|
65513,65514: //WM_SYSKEYUP ,WM_SYSKEYDOWN
|
|
begin
|
|
|
|
//_const.VK_MENU,
|
|
|
|
end
|
|
65535: //_const.VK_DELETE,
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DELETE,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DELETE,0);
|
|
end
|
|
end
|
|
|
|
65470 to ( 65470+24):
|
|
begin
|
|
if kud=8 then
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,kv-65470+0x70,0);
|
|
end else
|
|
begin
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,kv-65470+0x70,0);
|
|
end
|
|
end
|
|
else
|
|
begin
|
|
keymapb := array(
|
|
96:192,
|
|
45:189,
|
|
61:187,
|
|
91:219,
|
|
93:221,
|
|
92:220,
|
|
59:186,
|
|
39:222,
|
|
44:188,
|
|
46:190,
|
|
47:191,
|
|
40:57,
|
|
33:49,
|
|
64:50,
|
|
35:51,
|
|
36:52,
|
|
37:53,
|
|
94:54,
|
|
38:55,
|
|
42:56,
|
|
41:48,
|
|
126:192
|
|
);
|
|
if {notachar and} kud=8 then //去掉notkey
|
|
begin
|
|
if kv>=97 and kv<=122 then kv := kv-32;
|
|
else
|
|
begin
|
|
kv2 := keymapb[kv];
|
|
if kv2 then kv := kv2;
|
|
end
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,{_xor(32,kv)}kv,0);
|
|
//if notctrlpress then r := CallTslVclProc(_const.WM_CHAR , kv,0);
|
|
end else
|
|
if kud=9 then
|
|
begin
|
|
if kv>=97 and kv<=122 then kv := kv-32;
|
|
else
|
|
begin
|
|
kv2 := keymapb[kv];
|
|
if kv2 then kv := kv2;
|
|
end
|
|
r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,{_xor(32,kv)}kv,0);
|
|
end
|
|
end
|
|
end ;
|
|
return true;
|
|
|
|
end
|
|
10: //mouse in
|
|
begin
|
|
//e := new _GdkEventCrossing(c);
|
|
//echo tostn(e._getdata_());
|
|
//echo "===enter\r\n";
|
|
FMousemoveernotify.push(a.handle);
|
|
//_wapi.GetCursorPos(ps);
|
|
//e := new _GdkEventMotion(c);
|
|
//echo "\r\n enter:",a.handle,tostn(ps),tostn(e._getdata_());
|
|
end
|
|
|
|
11: //mouse out
|
|
begin
|
|
FMousemoveernotify.pop(a.handle);
|
|
//echo "\r\nleave:",a.handle;
|
|
end
|
|
3:
|
|
begin
|
|
// echo "\r\n move",datetimetostr(now()),"====",a.handle,"****",FMousemoveernotify.feach();
|
|
// if not(FMousemoveernotify.inner(a.handle)) then
|
|
// begin
|
|
// echo "====move=====";
|
|
// e := new _GdkEventMotion(c);
|
|
// CallTslVclProc(_const.WM_MOUSEMOVE ,0,makelong(integer(e.x),integer(e.y)));
|
|
// end
|
|
|
|
end
|
|
12: //focus
|
|
begin
|
|
h := a.handle;
|
|
//getfimobj().setclientwindow(e.window);
|
|
getfimobj().setclientwindow(e.window);
|
|
getfimobj().setfocusctl(self);
|
|
if (new _GdkEventFocus(c).iin)=1 then
|
|
begin
|
|
g_current_get_focus_widget := h;
|
|
//echo "\r\nsetfocus==>",h;
|
|
ch := _wapi.g_object_get_data(h,"gtk_client_parent");
|
|
if ch then
|
|
begin
|
|
//AddMessageToGtkMessageQueue(ch,_const.WM_SETFOCUS,0,0,0);
|
|
CallGtkWinProc(ch,_const.WM_SETFOCUS,0,0);
|
|
end else
|
|
begin
|
|
CallTslVclProc(_const.WM_SETFOCUS,0,0,0);
|
|
end
|
|
//WM_SETFOCUS
|
|
getfimobj().focusin();
|
|
|
|
end else
|
|
begin
|
|
g_current_loss_focus_widget := h;
|
|
g_current_get_focus_widget := 0;
|
|
ch := _wapi.g_object_get_data(a.handle,"gtk_client_parent");
|
|
//将killfocus 修改为立即执行
|
|
if ch then
|
|
begin
|
|
//AddMessageToGtkMessageQueue(ch,_const.WM_KILLFOCUS,0,0,0);
|
|
CallGtkWinProc(ch,_const.WM_KILLFOCUS,0,0);
|
|
end else
|
|
begin
|
|
//echo "\r\nkill focus:",h;
|
|
CallTslVclProc(_const.WM_KILLFOCUS,0,0,0);
|
|
end
|
|
getfimobj().focusout();
|
|
end
|
|
end
|
|
end ;
|
|
end
|
|
|
|
if mn="activate" then
|
|
begin
|
|
//echo "\r\nacive","==",b,"==",c,"d";
|
|
end
|
|
//
|
|
r := GtkEventDispatch(a,mn,c,d);
|
|
return r;
|
|
end
|
|
function GtkEventDispatch(a,mn,c,d);virtual; //根据名称处理gtk消息
|
|
begin
|
|
//消息分发
|
|
global g_current_get_focus_widget;
|
|
case mn of
|
|
"destroy" :
|
|
begin
|
|
FMousemoveernotify.unlock();
|
|
Fsyscommand0x12 := 0;
|
|
Fsyscommand0x12info := nil;
|
|
FHitwidgetposition := 0;
|
|
r := CallTslVclProc(_const.WM_NCDESTROY ,0,0);
|
|
//echo "\r\ncall destroy===",r,">>>",a.handle;
|
|
end
|
|
{
|
|
"map":
|
|
begin
|
|
end
|
|
"wm-user":
|
|
begin
|
|
r := CallTslVclProc(_const.WM_USER ,c,d);
|
|
end
|
|
"button-press-event":
|
|
begin
|
|
//return true;
|
|
end
|
|
"button-release-event":
|
|
begin
|
|
|
|
end
|
|
"motion-notify-event":
|
|
begin
|
|
//e := new _GdkEventMotion(c);
|
|
//CallTslVclProc(_const.WM_MOUSEMOVE ,0,makelong(integer(e.x),integer(e.y)));
|
|
//return true;
|
|
end
|
|
"set-focus-child":
|
|
begin
|
|
//echo "\r\nsignal name id:",GetGtkEventNameOrId("set-focus-child");
|
|
//echo "\r\nset focus child:",a.handle,"*****",c,"============",d;
|
|
end
|
|
"key-press-event":
|
|
begin
|
|
//echo "\r\n==key :=",1,"***" , a.handle,"====",_wapi.gtk_widget_is_toplevel(a.handle),"==========",datetimetostr(now());
|
|
end
|
|
}
|
|
end ;
|
|
return r;
|
|
end
|
|
function GtkBaseEventName();virtual; //绑定的消息
|
|
begin
|
|
return array("destroy","map","button-press-event","motion-notify-event","button-release-event","key-press-event","key-release-event","event"); //,"set-focus-child"
|
|
end
|
|
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);virtual; //构造窗口
|
|
begin
|
|
CallTslVclProc(_const.WM_NCCREATE,0,lpParam);
|
|
/////////////////////
|
|
stl := new TSTYLESTRUCT(nil);
|
|
stl.styleold := 0;
|
|
stl.stylenew := dwStyle;
|
|
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_STYLE,stl._getptr_());
|
|
stl.styleold := 0;
|
|
stl.stylenew := dwExStyle;
|
|
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_EXSTYLE,stl._getptr_());
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
f := thisfunction(GtkEventDispatchA);
|
|
for i,v in GtkBaseEventName() do
|
|
begin
|
|
Connect(v,f);
|
|
end
|
|
//////////////////////////////////////////////////////////////
|
|
Fdwstyle := dwStyle;
|
|
FExdwstyle := dwExStyle;
|
|
if (_const.WS_DISABLED .& dwStyle)=_const.WS_DISABLED then //enabled处理
|
|
begin
|
|
_wapi.EnableWindow(FHandle,false);
|
|
end
|
|
widgetsizechanged(nheight,nwidth);
|
|
_wapi.g_object_set_data(FHandle,"gtk_widget_resizeable",(_const.WS_SIZEBOX .& dwStyle)=_const.WS_SIZEBOX);
|
|
return FHandle;
|
|
end
|
|
function InitWidgetSize(h,x,y,nwidth,nheight); //设置窗口位置信息
|
|
begin
|
|
_wapi.g_object_set_data(h,"gtk_layout_x",x);
|
|
_wapi.g_object_set_data(h,"gtk_layout_y",y);
|
|
_wapi.g_object_set_data(h,"gtk_layout_width",nwidth);
|
|
_wapi.g_object_set_data(h,"gtk_layout_height",nheight);
|
|
|
|
end
|
|
function InitContainerList(h); //处理radiobtn 容器问题
|
|
begin
|
|
return ;
|
|
rlist := _wapi.g_slist_alloc();
|
|
gl := new _gslist(rlist);
|
|
rbtn := _wapi.gtk_radio_button_new(0);
|
|
gl.data := rbtn;
|
|
//_wapi.g_object_set_data(h,"gtk_layout_radiolist",rlist);
|
|
end
|
|
function DisconnectAll(); //断开所有消息
|
|
begin
|
|
if FHandle=0 then return 0;
|
|
for i,lnid in FConnectNameIds do
|
|
begin
|
|
g_signal_handler_disconnect(FHandle,lnid);
|
|
end
|
|
FConnectNameIds := array();
|
|
FConnectHandlers := array();
|
|
end
|
|
function getsignalmap();virtual;
|
|
begin
|
|
return array(
|
|
"wm-user":'tsl_gtk_wmuser_event', //用户
|
|
"destroy":"tsl_gtk_destroy_event", //销毁
|
|
"activate":"tsl_gtk_activate_event", //活动
|
|
"clicked":"tsl_gtk_clicked_event", //点击
|
|
"value-changed":"tsl_gtk_adj_value_changed_event", //值改变
|
|
"delete-event":"tsl_gtk_delete_event", //删除
|
|
//"day-selected":"tsl_gtk_day_select_event", //日历选择
|
|
"changed" :"tsl_gtk_changed_event", //改变
|
|
"preedit-changed":"tsl_gtk_preedit_changed_event" ,
|
|
);
|
|
end
|
|
function Connect(n,f); //连接消息
|
|
begin
|
|
//删除connect
|
|
//添加connect
|
|
//connect id
|
|
if FHandle=0 then return 0;
|
|
if not ifstring(n) then return 0;
|
|
ln := FormularSingalName(lowercase(n));
|
|
lnid := FConnectNameIds[ln];
|
|
if lnid then
|
|
begin
|
|
//echo "\r\n========================remove connect:",n;
|
|
reindex(FConnectNameIds,array(ln:nil));
|
|
g_signal_handler_disconnect(FHandle,lnid);
|
|
end
|
|
//echo "\r\nconnect ===========================",FHandle,"=====",n;
|
|
eid := GetGtkEventNameOrId(ln);
|
|
fn := (getsignalmap())[ln];
|
|
if not(fn and ifstring(fn)) then fn := "tsl_gtk_normal_event_cb";
|
|
lnid := g_signal_connect_data(FHandle, ln, gettslvcleventhandler_(fn), eid,nil,0);
|
|
FConnectNameIds[ln] := lnid;
|
|
FConnectHandlers[inttostr(eid)] := f;
|
|
return lnid;
|
|
end
|
|
function DefaultDestroyHandler();
|
|
begin
|
|
destroy();
|
|
return true;
|
|
end
|
|
class function SetWindowLongPtrA(h,idx,v);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.SetWidnowLong(idx,v) ;
|
|
end
|
|
end
|
|
class function widgetsizechangeda(h,aheight,awidth) ;
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.widgetsizechanged(aheight,awidth) ;
|
|
end
|
|
end
|
|
class function SetScrollInfoa(h, nBar,lpsi,redraw);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.SetScrollInfo(nBar,lpsi,redraw) ;
|
|
end
|
|
|
|
end
|
|
class function GetScrollInfoa(h, nBar,lpsi);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.GetScrollInfo(nBar,lpsi) ;
|
|
end
|
|
|
|
end
|
|
class function executeMessageA(h,msg,w,l);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.executeMessage(msg,w,l) ;
|
|
end
|
|
end
|
|
class function GetWindowLongPtrA(H,idx);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.GetWidnowLong(idx,v) ;
|
|
end
|
|
end
|
|
class function CallGtkWinProc(h,msg,w,l);
|
|
begin
|
|
if TGtkObjects then
|
|
begin
|
|
o := TGtkObjects[inttostr(h)];
|
|
if o then return o.CallTslVclProc(msg,w,l) ;
|
|
end
|
|
end
|
|
|
|
class function DispatchGtkEventCall(pms); //回调入口
|
|
begin
|
|
if not pms then return 0;
|
|
o := TGtkObjects[inttostr(pms[0])];
|
|
if o then
|
|
return o.CallGtkEvent(pms);
|
|
return 0;
|
|
end
|
|
function CallGtkEvent(pms); //处理对象函数
|
|
begin
|
|
xxid := pms[1];
|
|
c := FConnectHandlers[inttostr(xxid)];
|
|
if iffuncptr(c) then
|
|
begin
|
|
pms2 := pms;
|
|
pms2[0] := self;
|
|
r := callinarray(c,pms2);
|
|
if needdestroy() then
|
|
begin
|
|
if r = 0 and FDestroysignalId=xxid then
|
|
begin
|
|
DefaultDestroyHandler(pms);
|
|
//callinarray(thisfunction(DefaultDestroyHandler),pms);
|
|
end
|
|
end
|
|
return r;
|
|
end else
|
|
begin
|
|
if FDestroysignalId=xxid and needdestroy() then
|
|
begin
|
|
DefaultDestroyHandler(pms);
|
|
//callinarray(thisfunction(DefaultDestroyHandler),pms);
|
|
end
|
|
end
|
|
return true;
|
|
end
|
|
function destroy();virtual; //销毁
|
|
begin
|
|
if FHandle<>0 then
|
|
begin
|
|
reindex(TGtkObjects,array(inttostr(FHandle):nil));
|
|
//_wapi.g_object_unref(FHandle);
|
|
end
|
|
FRegisterWMUSER := 0;
|
|
//tsl_gtk_remove_widget_thread(FHandle);
|
|
FHandle := 0;
|
|
FConnectHandlers := array();
|
|
FConnectNameIds := array();
|
|
FValues := array();
|
|
end
|
|
function SetValue(n,v);
|
|
begin
|
|
FValues[n] := v;
|
|
end
|
|
function GetValue(n);
|
|
begin
|
|
return FValues[n];
|
|
end
|
|
property handle read FHandle write SetHandle;
|
|
static _wapi;
|
|
static _const;
|
|
private
|
|
FHandle;
|
|
class function gtk_widget_get_type():pointer;cdecl;external 'libgtk-3.so';
|
|
class procedure g_signal_handler_disconnect(instance:pointer;id:integer);cdecl;external 'libgtk-3.so';
|
|
class function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer;cdecl;external 'libgtk-3.so';
|
|
class function g_signal_new(signal_name:string;
|
|
itype:pointer;
|
|
signal_flags:integer;
|
|
class_offset:integer;
|
|
accumulator:pointer;
|
|
accu_data:pointer;
|
|
c_marshaller:pointer;
|
|
return_type:pointer;
|
|
n_params:integer;
|
|
p1:pointer;
|
|
p2:pointer):integer;cdecl;external 'libgtk-3.so';
|
|
FConnectNameIds;
|
|
FConnectHandlers;
|
|
FValues;
|
|
FDestroysignalId;
|
|
static TGtkObjects;
|
|
Static FinitNewSignaled;
|
|
function SetHandle(h);
|
|
begin
|
|
if FHandle then return 0;
|
|
initNewSingal();
|
|
FConnectNameIds := array();
|
|
FConnectHandlers := array();
|
|
FValues := array();
|
|
FHandle := 0;
|
|
if h then
|
|
begin
|
|
FHandle := h;
|
|
_wapi.g_object_ref(h);
|
|
if not ifarray(TGtkObjects) then TGtkObjects := array();
|
|
TGtkObjects[inttostr(h)] := self(true);
|
|
FDestroysignalId := GetGtkEventNameOrId("destroy");
|
|
if needdestroy() then
|
|
Connect("destroy",thisfunction(DefaultDestroyHandler));
|
|
return true;
|
|
end
|
|
end
|
|
class function initNewSingal();
|
|
begin
|
|
return ;
|
|
//wm-user
|
|
if FinitNewSignaled then return ;
|
|
FinitNewSignaled := true;
|
|
for i,v in array(gtk_widget_get_type()) do
|
|
begin
|
|
g_signal_new("wm-user",
|
|
v,
|
|
2,
|
|
0,
|
|
nil,
|
|
nil,
|
|
0,
|
|
4,
|
|
2,
|
|
17*4,68);
|
|
end
|
|
|
|
end
|
|
function FormularSingalName(n);
|
|
begin
|
|
r := "";
|
|
for i := 1 to length(n) do
|
|
begin
|
|
vi := n[i];
|
|
if vi="_" then r+="-";
|
|
else r+=vi;
|
|
end
|
|
return r;
|
|
end
|
|
function needdestroy();virtual;
|
|
begin
|
|
return true;
|
|
end
|
|
static FMousemoveernotify;
|
|
class function getfimobj();
|
|
begin
|
|
if not FImobj then FImobj := new tgtk_im_object(nil);
|
|
return FImobj;
|
|
end
|
|
static FImobj;
|
|
end
|
|
|
|
type tscrollobject = class
|
|
fbar;
|
|
fadj;
|
|
fpgcount;
|
|
fsi;
|
|
function create(bar,adj,si);
|
|
begin
|
|
fbar :=bar;
|
|
fadj := adj;
|
|
fsi := si;
|
|
end
|
|
end
|
|
type tgtk_im_object = class(tgtk_ctl_object)
|
|
function Create(h);override;
|
|
begin
|
|
h := _wapi.gtk_im_multicontext_new();
|
|
inherited;
|
|
f := thisfunction(GtkEventDispatchA);
|
|
//_Wapi.gtk_widget_set_events(h,16777214);
|
|
for i,v in GtkBaseEventName() do
|
|
begin
|
|
//echo "\r\n connect",v,"***",
|
|
Connect(v,f);
|
|
end
|
|
end
|
|
function getsignalmap();override;
|
|
begin
|
|
return array(
|
|
"preedit-start":"dodeleteevents" ,
|
|
"preedit-changed":"dodeleteevents" ,
|
|
"preedit-surrounding":"dodeleteevents" ,
|
|
"preedit-end":"dodeleteevents" ,
|
|
"commit":"tsl_gtk_normal_event_cb"
|
|
);
|
|
end
|
|
function GtkEventDispatch(a,mn,c,d);override; //根据名称处理gtk消息
|
|
begin
|
|
case mn of
|
|
"commit":
|
|
begin
|
|
FCommit := ReadStringFromPtr(c);
|
|
if FCtl then
|
|
begin
|
|
s := utf8toansi(FCommit);
|
|
for i:= 1 to length(s) do
|
|
begin
|
|
FCtl.CallTslVclProc(_const.WM_CHAR,ord(s[i]),0);
|
|
end
|
|
end
|
|
end
|
|
end;
|
|
end
|
|
function GtkBaseEventName();override; //绑定的消息
|
|
begin
|
|
return array("commit");//,"preedit-changed","preedit-end","preedit-start","retrieve-surrounding");//"commit","delete-surrounding",
|
|
end
|
|
function focusin();//focus in
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_im_context_focus_in(h);
|
|
end
|
|
function set_location();
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_im_context_set_cursor_location(h,array(50,100,300,300));
|
|
end
|
|
function presskey(c); //focus out
|
|
begin
|
|
h := handle;
|
|
//ps := array(0,0,100,100);
|
|
//_Wapi.GetCursorPos(ps);
|
|
//_wapi.gtk_im_context_set_cursor_location(h,ps);
|
|
return _wapi.gtk_im_context_filter_keypress(h,c);
|
|
end
|
|
function focusout();
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_im_context_focus_out(h);
|
|
end
|
|
function get_preedit_string();
|
|
begin
|
|
return;
|
|
h := handle;
|
|
pc := array(0,0,0,0,0);
|
|
str := "";
|
|
setlength(str,100);
|
|
attr := 0;
|
|
_wapi.gtk_im_context_get_preedit_string(h,str,attr,pc);
|
|
end
|
|
function setfocusctl(ctl);
|
|
begin
|
|
if ctl <>FCtl then
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_im_context_reset(h);
|
|
FCtl := ctl;
|
|
end
|
|
end
|
|
function setclientwindow(w);
|
|
begin
|
|
if w and (w<>FWindow) then
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_im_context_set_client_window(h,w);
|
|
end
|
|
end
|
|
FCtlHandle;
|
|
FCommit;
|
|
function needdestroy();override;
|
|
begin
|
|
return false;
|
|
end
|
|
private
|
|
FWindow;
|
|
FCtl;
|
|
end
|
|
type tgtk_ctl_object_scroll = class(tgtk_ctl_object)
|
|
function Create(h);override;
|
|
begin
|
|
inherited;
|
|
end
|
|
function GtkBaseEventName();override;
|
|
begin
|
|
return array("value-changed");
|
|
end
|
|
function needdestroy();override;
|
|
begin
|
|
return false;
|
|
end
|
|
end
|
|
type tgtk_ctl_object_scroll_Bar = class(tgtk_ctl_object)
|
|
function Create(h);override;
|
|
begin
|
|
inherited;
|
|
Connect("event",thisfunction(scrollevent));
|
|
end
|
|
function scrollevent(a,b,c,d);
|
|
begin
|
|
global g_gtk_scroll_lock;
|
|
if "event"=GetGtkEventNameOrId(b) then
|
|
begin
|
|
e := new _GdkEventAny(c);
|
|
case e.ttype of
|
|
GDK_ENTER_NOTIFY:
|
|
begin
|
|
// g_gtk_scroll_lock := true;
|
|
end
|
|
GDK_LEAVE_NOTIFY:
|
|
begin
|
|
//g_gtk_scroll_lock := false;
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
|
|
function Create(h);override;
|
|
begin
|
|
inherited;
|
|
fbarshow := 0;
|
|
end
|
|
function scrollwindowdraw(a,b,c,d);
|
|
begin
|
|
hd := a.handle;
|
|
r := zeros(4);
|
|
_wapi.gtk_widget_get_allocation(hd,r);
|
|
cr := _wapi.gdk_cairo_create(_wapi.gtk_widget_get_window(hd));
|
|
rec := zeros(4);
|
|
_wapi.gdk_cairo_get_clip_rectangle(cr,rec);
|
|
//echo ">>>1111",tostn(rec);
|
|
//echo ">>>extents:";
|
|
//_wapi.cairo_clip_extents(cr,x,y,w,h);
|
|
hwd := handle;
|
|
//echo "paintrect:",hd,tostn(rec);
|
|
_wapi.g_object_set_data(hwd,"paint_dc",cr);
|
|
_wapi.g_object_set_data(hwd,"paint_rect",rec);
|
|
//_wapi.g_object_set_data(hwd,"paint_height",r[3]);
|
|
//_wapi.g_object_set_data(hwd,"paint_width",r[2]);
|
|
//mtic;
|
|
CallTslVclProc(_const.WM_PAINT,0,0); //绘制
|
|
|
|
if not(self(true) is class(tgtk_ctl_window_PoPup)) then
|
|
begin
|
|
if (r[2]<=(rec[0]+rec[2])) or (r[3]<=(rec[1]+rec[3])) then
|
|
begin
|
|
_wapi.cairo_set_dash(cr,array(4.0,0.0),2,0);
|
|
if (FExdwstyle .& _const.WS_EX_DLGMODALFRAME)= _const.WS_EX_DLGMODALFRAME then
|
|
begin
|
|
_wapi.cairo_set_source_rgb(cr, 225/255, 225/255, 225/255);
|
|
_wapi.cairo_set_line_width (cr, 2);
|
|
_wapi.cairo_rectangle(cr,0,0,r[2]-1,r[3]-1);
|
|
_wapi.cairo_stroke(cr);
|
|
end
|
|
if (Fdwstyle .& _const.WS_BORDER)= _const.WS_BORDER then
|
|
begin
|
|
_wapi.cairo_set_source_rgb(cr, 100/255, 100/255, 100/255);
|
|
_wapi.cairo_set_line_width(cr, 0.5);
|
|
_wapi.cairo_rectangle(cr,1,1,r[2]-1,r[3]-1);
|
|
_wapi.cairo_stroke(cr);
|
|
end
|
|
CallTslVclProc(_const.WM_NCPAINT,0,cr); //绘制
|
|
end
|
|
end
|
|
_wapi.cairo_destroy(cr);
|
|
_wapi.gtk_object_set_data(cr);
|
|
//echo "\r\ntime:",datetimetostr(now()),"===timeuses:",mtoc,"===",hd;
|
|
end;
|
|
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
|
|
begin
|
|
fispaint := class(tUIglobalData).uigetdata("G_F_CONTROL_IS_CUSTOMPAINT");
|
|
//echo "\r\nctl:",tostn(params),tostn(__stack_frame),datetimetostr(now());
|
|
d := new tslcstructureobj(MemoryAlignmentCalculate( array(("lpcreateparams","intptr",0))),lpParam);
|
|
if fispaint then
|
|
begin
|
|
isp := call(fispaint,d._getvalue_("lpcreateparams"));
|
|
end
|
|
h := self.handle;
|
|
{if (_const.WS_BORDER .& dwStyle)=_const.WS_BORDER then
|
|
begin
|
|
_wapi.gtk_container_set_border_width(h,1);
|
|
end }
|
|
_wapi.gtk_widget_set_can_focus(h,true);
|
|
if isp and FClientWideget then //自绘制
|
|
begin
|
|
FClientObject := new tgtk_ctl_object(FClientWideget);
|
|
_wapi.g_object_set_data(h,"gtk_clientwideget",FClientWideget);
|
|
FClientObject.Connect("draw",thisfunction(scrollwindowdraw));
|
|
_wapi.gtk_widget_set_app_paintable(FClientWideget, TRUE); //绘制
|
|
end
|
|
//隐藏滚动条
|
|
_wapi.gtk_widget_hide(FHscrollbar);
|
|
_wapi.gtk_widget_hide(Fvscrollbar);
|
|
_wapi.g_object_set_data(h,"gtk_window_vscroll_bar",Fvscrollbar);
|
|
_wapi.g_object_set_data(h,"gtk_window_hscroll_bar",Fhscrollbar);
|
|
FScroller := array();
|
|
fvsi := new TScrollinfo();
|
|
fhsi := new TScrollinfo();
|
|
v1 := new tscrollobject(Fvscrollbar,Fvadjustment,fvsi);
|
|
v2 := new tscrollobject(FHscrollbar,Fhadjustment,fhsi);
|
|
FScroller[_const.SB_HORZ] := v2;
|
|
FScroller[_const.SB_VERT] := v1;
|
|
|
|
return inherited;
|
|
end
|
|
function widgetsizechanged(h_,w_);override; //大小改变
|
|
begin
|
|
h := h_;
|
|
w := w_;
|
|
hwd := self.handle;
|
|
mb := _wapi.g_object_get_data(hwd,"menubar");
|
|
if mb and _wapi.gtk_widget_is_visible(mb) then
|
|
begin
|
|
rec := zeros(4);
|
|
_wapi.gtk_widget_get_allocation(mb,rec);
|
|
if rec[3]>1 then
|
|
begin
|
|
h-= rec[3];//max(rec[3],25);
|
|
end else
|
|
begin
|
|
gist := _wapi.gtk_container_get_children(mb); //处理
|
|
if gist then
|
|
begin
|
|
h-=25;
|
|
end
|
|
end
|
|
end
|
|
scrlsize := 12;
|
|
if (fbarshow .& 1)=1 then //v
|
|
begin
|
|
_wapi.gtk_widget_set_size_request(FHscrollbar,max(0,w-scrlsize),scrlsize);
|
|
end else _wapi.gtk_widget_set_size_request(FHscrollbar,max(0,w),scrlsize);
|
|
if (fbarshow .& 2)=2 then //h
|
|
begin
|
|
_wapi.gtk_widget_set_size_request(Fvscrollbar,scrlsize,max(0,h-scrlsize));
|
|
end else _wapi.gtk_widget_set_size_request(Fvscrollbar,scrlsize,max(0,h));
|
|
_wapi.gtk_layout_move( FLayouter,FHscrollbar,0,h-scrlsize);
|
|
_wapi.gtk_layout_move( FLayouter,Fvscrollbar,w-scrlsize,0);
|
|
if FClientWideget then
|
|
begin
|
|
if (fbarshow .& 2)=2 {_wapi.gtk_widget_is_visible(FHscrollbar)} then
|
|
begin
|
|
h-=11;
|
|
end
|
|
if (fbarshow .& 1)=1 {_wapi.gtk_widget_is_visible(Fvscrollbar)} then
|
|
begin
|
|
w-=11;
|
|
end
|
|
_wapi.gtk_widget_set_size_request(FClientWideget,max(0,w),max(0,h));
|
|
//inherited widgetsizechanged(h,w);
|
|
end //else inherited widgetsizechanged(h,w);
|
|
inherited widgetsizechanged(h,w); //clientrect
|
|
end
|
|
function GetScrollInfo(nBar,si);override;//获得滚动条信息
|
|
begin
|
|
osi := fvsi;
|
|
gsi := new TScrollinfo(si);
|
|
adj := Fvadjustment;
|
|
if nbar = _const.SB_HORZ then
|
|
begin
|
|
osi := fhsi;
|
|
adj := Fhadjustment;
|
|
end
|
|
msk := gsi.fmask;
|
|
if msk .& _const.SIF_RANGE then
|
|
begin
|
|
gsi.nmin := osi.nmin;
|
|
gsi.nmax := osi.nmax;
|
|
end
|
|
if msk .& _const.SIF_POS then
|
|
begin
|
|
gsi.npos := osi.npos;
|
|
end
|
|
if msk .& _const.SIF_PAGE then
|
|
begin
|
|
gsi.npage := osi.npage;
|
|
end
|
|
if msk .& _const.SIF_TRACKPOS then
|
|
begin
|
|
gsi.ntrackpos := osi.ntrackpos;
|
|
end
|
|
end
|
|
function SetScrollInfo(nBar,si,redraw);override; //设置滚动条信息
|
|
begin
|
|
//echo "\r\n",datetimetostr(now()),"====showbar===",fbarshow;
|
|
bkshowbar := fbarshow;
|
|
osi := fvsi;
|
|
gsi := new TScrollinfo(si);
|
|
adj := Fvadjustment;
|
|
bar := Fvscrollbar;
|
|
cbs := 1;
|
|
if nbar = _const.SB_HORZ then
|
|
begin
|
|
osi := fhsi;
|
|
adj := Fhadjustment;
|
|
bar := FHscrollbar;
|
|
cbs := 2;
|
|
end else
|
|
begin
|
|
//echo "\r\n",datetimetostr(now()),tostn(gsi._getdata_());
|
|
end
|
|
msk := gsi.fmask;
|
|
if msk .& _const.SIF_RANGE then
|
|
begin
|
|
if gsi.nmin <> osi.nmin then
|
|
begin
|
|
//osi.nmin := gsi.nmin;
|
|
_wapi.gtk_adjustment_set_lower(adj,gsi.nmin);
|
|
osi.nmin := _wapi.gtk_adjustment_get_lower(adj); //添加
|
|
end
|
|
if gsi.nmax <> osi.nmax then
|
|
begin
|
|
//osi.nmax := gsi.nmax;
|
|
_wapi.gtk_adjustment_set_upper(adj,gsi.nmax);
|
|
osi.nmax := _wapi.gtk_adjustment_get_upper(adj); //添加
|
|
rgchanged := true;
|
|
end
|
|
end
|
|
if msk .& _const.SIF_POS then
|
|
begin
|
|
gp := gsi.npos;
|
|
if gp <> osi.npos then
|
|
begin
|
|
|
|
//if gp>gsi.nmax then return ;
|
|
//if gp>(gsi.nmax-gsi.npage+1) then return ; //此处做处理
|
|
gmx := osi.nmax;
|
|
gnx := osi.nmin;
|
|
if (gmx-osi.npage)<0 or gp<(gmx-osi.npage+3) then
|
|
begin
|
|
gp := min(gmx,max(gp,gnx));
|
|
//osi.npos := gp;
|
|
_wapi.gtk_adjustment_set_value(adj,gp);
|
|
osi.npos := _wapi.gtk_adjustment_get_value(adj);
|
|
end else
|
|
if gp>=(gmx-osi.npage+3) then //超过最大值的处理
|
|
begin
|
|
gp := min(gmx,max(gp,gnx));
|
|
_wapi.gtk_adjustment_set_value(adj,gp);
|
|
osi.npos := _wapi.gtk_adjustment_get_value(adj);
|
|
end
|
|
end
|
|
end
|
|
if msk .& _const.SIF_PAGE then
|
|
begin
|
|
if gsi.npage <> osi.npage then
|
|
begin
|
|
osi.npage := gsi.npage;
|
|
_wapi.gtk_adjustment_set_page_size(adj, gsi.npage-1); //abs(gsi.npage-gsi.nmax)
|
|
pgchanged := true;
|
|
end
|
|
|
|
end
|
|
dosetchange := false;
|
|
////移动到公用 之前在 page change
|
|
//////////////暂时屏蔽///////////////////
|
|
(* if (rgchanged or pgchanged) and ((gsi.nmax-gsi.npage)<=0) {and osi.npos>0} then //还原
|
|
begin
|
|
w := makelong(_const.SB_TOP,0);
|
|
//osi.ntrackpos := 0;
|
|
if nbar = _const.SB_HORZ then
|
|
begin
|
|
//clearMessageFromGtkMessageQueue(self.handle,_const.WM_HSCROLL);
|
|
CallTslVclProc(_const.WM_HSCROLL,w,0,1);
|
|
end else
|
|
begin
|
|
//clearMessageFromGtkMessageQueue(self.handle,_const.WM_vSCROLL);
|
|
CallTslVclProc(_const.WM_VSCROLL,w,0,1);
|
|
end
|
|
//dosetchange := true;
|
|
end *)
|
|
//////////////////////////////////////
|
|
|
|
if msk .& _const.SIF_TRACKPOS then
|
|
begin
|
|
if gsi.ntrackpos <> osi.ntrackpos then
|
|
begin
|
|
osi.ntrackpos := gsi.ntrackpos;
|
|
end
|
|
end
|
|
if gsi.npage>=(gsi.nmax-gsi.nmin) then
|
|
begin
|
|
_wapi.gtk_widget_hide(bar);
|
|
fbarshow .&=(3 .& _not(cbs));
|
|
end else
|
|
begin
|
|
_wapi.gtk_widget_show(bar);
|
|
fbarshow .|=cbs;
|
|
end
|
|
//echo "\r\n",datetimetostr(now()),"====showbar end===",fbarshow;
|
|
if bkshowbar<>fbarshow then
|
|
begin
|
|
|
|
h := handle;
|
|
w0 := _wapi.g_object_get_data(h,"gtk_layout_width");
|
|
h0 := _wapi.g_object_get_data(h,"gtk_layout_height");
|
|
//eturn ;
|
|
//echo "\r\n===in put client size:",h0,"===",w0;
|
|
widgetsizechanged(h0,w0);
|
|
end
|
|
end
|
|
function hadjustmentmousedown(a,b,c,d);virtual;
|
|
begin
|
|
FHBardown := true;
|
|
end
|
|
function vadjustmentmousedown(a,b,c,d);virtual;
|
|
begin
|
|
FVBardown := true;
|
|
end
|
|
function hadjustmentmouseup(a,b,c,d);virtual;
|
|
begin
|
|
FHBardown := false;
|
|
end
|
|
function vadjustmentmouseup(a,b,c,d);virtual;
|
|
begin
|
|
FVBardown := false;
|
|
end
|
|
function hadjustmentchanged(a,b,c,d);virtual; //滚动条改变
|
|
begin
|
|
if not FHBardown then
|
|
begin
|
|
return ;
|
|
end
|
|
v := _wapi.gtk_adjustment_get_value(a.handle);
|
|
fhsi.ntrackpos := v;
|
|
w := makelong(_const.SB_THUMBTRACK,0);
|
|
CallTslVclProc(_const.WM_HSCROLL,w,0,1);
|
|
end
|
|
function vadjustmentchanged(a,b,c,d);virtual;//垂直滚动条改变
|
|
begin
|
|
if not FVBardown then
|
|
begin
|
|
return 0;
|
|
end
|
|
v := _wapi.gtk_adjustment_get_value(a.handle);
|
|
fvsi.ntrackpos := v;
|
|
w := makelong(_const.SB_THUMBTRACK,0);
|
|
CallTslVclProc(_const.WM_VSCROLL,w,0,1);
|
|
end
|
|
{function GtkEventDispatch_(a,mn,c,d);override; //原有的消息处理
|
|
begin
|
|
//消息分发
|
|
if mn="scroll-event" then
|
|
begin
|
|
h := a.handle;
|
|
|
|
nt := now();
|
|
if (nt-(1/24/3600/100))<FScrollT then
|
|
begin
|
|
//return true;
|
|
end
|
|
ed := new _GdkEventScroll(c);
|
|
dr := ed.direction;
|
|
if dr<>0 and dr<>1 then return ;
|
|
x := ed.x_root;
|
|
y := ed.y_root;
|
|
r := array();
|
|
|
|
_wapi.GetTopWidgetList(h,x,y,r);
|
|
lenr := length(r)-1;
|
|
for i := lenr downto 0 do
|
|
begin
|
|
ri := r[i][0];
|
|
rxy := r[i][1];
|
|
fv := _wapi.g_object_get_data(ri,"gtk_window_vscroll_bar");
|
|
if fv and _wapi.gtk_widget_is_visible(fv) then
|
|
begin
|
|
ifdowheel := true;
|
|
break;
|
|
end
|
|
end
|
|
if not ifdowheel then
|
|
begin
|
|
ri := r[lenr][0];
|
|
rxy := r[lenr][1];
|
|
end
|
|
if ri and rxy then
|
|
begin
|
|
//if hasMessageFromGtkMessageQueue(-1,_const.LM_MOUSEWHEEL) then return true; //20230417暂时屏蔽
|
|
if hasMessageFromGtkMessageQueue(-1,_const.WM_SIZE) then return true;
|
|
//if hasMessageFromGtkMessageQueue(-1,_const.WM_MOUSEMOVE) then return true;
|
|
WHEEL_DELTA := 120;
|
|
FScrollT := now();
|
|
dr := (dr=1)?(-WHEEL_DELTA):(WHEEL_DELTA);
|
|
whist := feacheasylostMessageFromGtkMessageQueue(ri,_const.LM_MOUSEWHEEL);
|
|
for ii,iiv in whist do
|
|
begin
|
|
iivw := iiv[2];
|
|
lowuperdword(iivw,iivc,iivdir);
|
|
dr+=iivdir;
|
|
end
|
|
if dr=0 then return true;
|
|
|
|
xy := makelong(rxy[0],rxy[1]);
|
|
ctl := 0;
|
|
global g_gtk_buttontable,g_gtk_keytable;
|
|
if ifarray(g_gtk_buttontable) then
|
|
begin
|
|
ctl .|= g_gtk_buttontable[0];
|
|
ctl .|= g_gtk_buttontable[1];
|
|
end
|
|
if ifarray(g_gtk_keytable) then
|
|
begin
|
|
if g_gtk_keytable[0x10] then ctl .|= _const.MK_Shift;
|
|
if g_gtk_keytable[0x11] then ctl .|= _const.MK_Control;
|
|
end
|
|
dr := makelong(ctl,dr);
|
|
//clearMessageFromGtkMessageQueue(ri,_const.LM_MOUSEWHEEL);
|
|
AddMessageToGtkMessageQueue(ri,_const.LM_MOUSEWHEEL,dr,xy,1);
|
|
return true;
|
|
end
|
|
|
|
end
|
|
return inherited;
|
|
end }
|
|
private
|
|
fscrollinfos;
|
|
ftimerobj;
|
|
Fscrolltimedo;
|
|
FStatscrollTime;
|
|
public
|
|
function scrolltimedo(ptr:pointer):integer;
|
|
begin
|
|
if ifnil(FStatscrollTime) then return 1; //没有滚动消息
|
|
//obj := new ttmstruct(ptr);
|
|
//obj._setvalue_(0,0);
|
|
t := now();
|
|
if (t-FStatscrollTime)<(1/24/3600/100) then return 1; //时间间隔不够10毫秒
|
|
FStatscrollTime := nil; //执行了
|
|
if fscrollinfos then
|
|
begin
|
|
WHEEL_DELTA := 120;
|
|
ctl := 0;
|
|
global g_gtk_buttontable,g_gtk_keytable;
|
|
if ifarray(g_gtk_buttontable) then
|
|
begin
|
|
ctl .|= g_gtk_buttontable[0];
|
|
ctl .|= g_gtk_buttontable[1];
|
|
end
|
|
if ifarray(g_gtk_keytable) then
|
|
begin
|
|
if g_gtk_keytable[0x10] then ctl .|= _const.MK_Shift;
|
|
if g_gtk_keytable[0x11] then ctl .|= _const.MK_Control;
|
|
end
|
|
|
|
len := length(fscrollinfos)-1;
|
|
xy := fscrollinfos[len,2];
|
|
h := fscrollinfos[len,0];
|
|
dr := sum(fscrollinfos[:,1]);
|
|
if dr=0 then return 1;
|
|
fscrollinfos := array();
|
|
dr := makelong(ctl,dr);
|
|
AddMessageToGtkMessageQueue(h,_const.LM_MOUSEWHEEL,dr,xy,1);
|
|
end
|
|
return 1;
|
|
end
|
|
function GtkEventDispatch(a,mn,c,d);override;
|
|
begin
|
|
//消息分发
|
|
if mn="scroll-event" then
|
|
begin
|
|
h := a.handle;
|
|
ed := new _GdkEventScroll(c);
|
|
dr := ed.direction;
|
|
if dr<>0 and dr<>1 then return ;
|
|
x := ed.x_root;
|
|
y := ed.y_root;
|
|
r := array();
|
|
_wapi.GetTopWidgetList(h,x,y,r);
|
|
lenr := length(r)-1;
|
|
for i := lenr downto 0 do
|
|
begin
|
|
ri := r[i][0];
|
|
rxy := r[i][1];
|
|
fv := _wapi.g_object_get_data(ri,"gtk_window_vscroll_bar");
|
|
if fv and _wapi.gtk_widget_is_visible(fv) then
|
|
begin
|
|
ifdowheel := true;
|
|
break;
|
|
end
|
|
end
|
|
if not ifdowheel then
|
|
begin
|
|
ri := r[lenr][0];
|
|
rxy := r[lenr][1];
|
|
end
|
|
if ri and rxy then
|
|
begin
|
|
if not ftimerobj then
|
|
begin
|
|
fscrollinfos := array();
|
|
Fscrolltimedo := makeinstance(thisfunction(scrolltimedo));
|
|
ftimerobj := new ttmstruct(nil);
|
|
rt := _wapi.g_timeout_add(8,Fscrolltimedo,ftimerobj._getptr_() );
|
|
ftimerobj._setvalue_(0,rt);
|
|
end
|
|
FStatscrollTime := now(); //当前时间
|
|
xy := makelong(rxy[0],rxy[1]);
|
|
WHEEL_DELTA := 120;
|
|
dr := (dr=1)?(-WHEEL_DELTA):(WHEEL_DELTA);
|
|
fscrollinfos[length(fscrollinfos)] := array(ri,dr,xy);
|
|
return true;
|
|
end
|
|
end
|
|
return inherited;
|
|
end
|
|
function Destroy();override;
|
|
begin
|
|
inherited;
|
|
FHadjustment := nil;
|
|
Fvadjustment := nil;
|
|
FHscrollbar := nil;
|
|
Fvscrollbar := nil;
|
|
FLayouter := nil;
|
|
Fvscrollbarobj := nil;
|
|
Fhscrollbarobj := nil;
|
|
FClientWideget := nil;
|
|
end
|
|
protected
|
|
function initadjustSingal();
|
|
begin
|
|
FHadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
|
|
FHscrollbar := _wapi.gtk_hscrollbar_new(FHadjustment);
|
|
//////////////////////////垂直滚动条////////////////////////////////////
|
|
FVadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
|
|
Fvscrollbar := _wapi.gtk_vscrollbar_new(FVadjustment);
|
|
|
|
_wapi.gtk_layout_put(FLayouter,Fvscrollbar,0,0);
|
|
_wapi.gtk_layout_put(FLayouter,FHscrollbar,0,0);
|
|
fhadjustobject := new tgtk_ctl_object_scroll(FHadjustment);
|
|
fvadjustobject := new tgtk_ctl_object_scroll(Fvadjustment);
|
|
fhadjustobject.Connect("value-changed",thisfunction(hadjustmentchanged));
|
|
fvadjustobject.Connect("value-changed",thisfunction(vadjustmentchanged));
|
|
Fvscrollbarobj := new tgtk_ctl_object_scroll_Bar(Fvscrollbar);
|
|
Fvscrollbarobj.Connect("button-press-event",thisfunction(vadjustmentmousedown));
|
|
Fvscrollbarobj.Connect("button-release-event",thisfunction(vadjustmentmouseup));
|
|
Fhscrollbarobj := new tgtk_ctl_object_scroll_Bar(Fhscrollbar);
|
|
Fhscrollbarobj.Connect("button-press-event",thisfunction(hadjustmentmousedown));
|
|
Fhscrollbarobj.Connect("button-release-event",thisfunction(hadjustmentmouseup));
|
|
|
|
end
|
|
FLayouter; //layout
|
|
FHscrollbar; //滚动条控件
|
|
Fvscrollbar;
|
|
Fvscrollbarobj; //滚动条对象
|
|
Fhscrollbarobj;
|
|
FHadjustment; //滚动条adjustment
|
|
Fvadjustment;
|
|
fhadjustobject;
|
|
fvadjustobject;
|
|
FClientWideget; //客户区
|
|
FClientObject;
|
|
private
|
|
FScrollT;
|
|
fvsi; //滚动条信息
|
|
fhsi;
|
|
fbarshow;
|
|
FVBardown; //滚动条按下
|
|
FHBardown;
|
|
FScroller;
|
|
|
|
end
|
|
type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
|
|
function Create(h);override;
|
|
begin
|
|
inherited;
|
|
end
|
|
function DefaultMessageDo(msg,w,l);override;
|
|
begin
|
|
if msg = _const.WM_SETICON then
|
|
begin
|
|
if l then
|
|
begin
|
|
h := handle;
|
|
_wapi.gtk_window_set_icon(h,l);
|
|
end
|
|
end
|
|
inherited;
|
|
end
|
|
function GtkEventDispatch(a,mn,c,d);override;
|
|
begin
|
|
//消息分发
|
|
//echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n";
|
|
case mn of
|
|
"configure-event" :
|
|
begin
|
|
//return false;
|
|
h := a.handle;
|
|
x := _wapi.g_object_get_data(h,"gtk_layout_x");
|
|
y := _wapi.g_object_get_data(h,"gtk_layout_y");
|
|
cx := _wapi.g_object_get_data(h,"gtk_layout_width");
|
|
cy := _wapi.g_object_get_data(h,"gtk_layout_height");
|
|
cf := new _GdkEventConfigure(c);
|
|
ALeft := integer(cf.x);
|
|
ATop := integer(cf.y);
|
|
//echo "\r\n>>>",ALeft,"===",ATop;
|
|
AWidth := integer(cf.width);
|
|
AHeight := integer(cf.height);
|
|
SizeChanged :=(cx <> AWidth)or(cy <> AHeight);
|
|
PosChanged :=(x <> ALeft)or(y <> ATop);
|
|
if(not SizeChanged)and(not PosChanged)then
|
|
begin
|
|
Exit;
|
|
end
|
|
if (cx <> AWidth) then _wapi.g_object_set_data(h,"gtk_layout_width",AWidth);
|
|
global g_w_c_width;
|
|
pcd := _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
if cy <> AHeight then
|
|
begin
|
|
|
|
_wapi.g_object_set_data(h,"gtk_layout_height",AHeight+pcd);
|
|
end
|
|
if x <> ALeft then
|
|
begin
|
|
_wapi.g_object_set_data(h,"gtk_layout_x",aleft);
|
|
end
|
|
if y <> ATop then
|
|
begin
|
|
_wapi.g_object_set_data(h,"gtk_layout_y",atop);
|
|
end
|
|
r := _wapi.Gtk_TrigMoveSizeEvent(h,const aleft,const atop,const AWidth,const AHeight+pcd,(SizeChanged?1:0).|(PosChanged?2:0));
|
|
return r;
|
|
end
|
|
"delete-event":
|
|
begin
|
|
r := CallTslVclProc(_const.WM_CLOSE,0,0);
|
|
return r;
|
|
end
|
|
"activate-default":
|
|
begin
|
|
echo "activate-defalut\r\n";
|
|
end
|
|
end;
|
|
return inherited;
|
|
|
|
end
|
|
function GtkBaseEventName();override;
|
|
begin
|
|
return inherited union2 array("configure-event","delete-event","scroll-event","activate-default");
|
|
end
|
|
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
|
|
begin
|
|
//echo "\r\nctl===popup:",tostn(params),tostn(__stack_frame),datetimetostr(now()),">>>>";
|
|
h := _wapi.gtk_window_new(0); //控件层
|
|
srszie := (_const.WS_SIZEBOX .& dwStyle)=_const.WS_SIZEBOX;
|
|
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1);
|
|
if not((_const.WS_CAPTION .& dwStyle)= _const.WS_CAPTION or (_const.WS_SYSMENU .& dwStyle)=_const.WS_SYSMENU) then
|
|
begin
|
|
|
|
_wapi.gtk_window_set_decorated(h,false);
|
|
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",0);
|
|
//无菜单顶层窗口
|
|
end else
|
|
begin
|
|
//nheight := max(10,nheight_-30);
|
|
_wapi.gtk_window_set_title(h,_wapi.TslStringToGtk(lpWindowName));
|
|
//有标题 有菜单的顶层窗口
|
|
end
|
|
if (_const.WS_BORDER .& dwStyle)=_const.WS_BORDER then //Border
|
|
begin
|
|
_wapi.gtk_container_set_border_width(h,1);
|
|
end
|
|
vbox := _wapi.gtk_vbox_new(0,0); //菜单布局层
|
|
_wapi.gtk_container_add(h,vbox);
|
|
_wapi.g_object_set_data(h,"gtk_vbox",vbox); //vbox
|
|
_wapi.gtk_window_set_resizable(h,srszie);
|
|
_wapi.g_object_set_data(h,"gtk_popwp",2+srszie);
|
|
{
|
|
vbox
|
|
//menubar
|
|
layout
|
|
hscroll
|
|
vscroll
|
|
clientwidget
|
|
}
|
|
ctllayout := _Wapi.gtk_layout_new(0,0);
|
|
_wapi.gtk_box_pack_end(vbox,ctllayout,1,1,0);
|
|
|
|
FLayouter := ctllayout;
|
|
/////////////////////////水平滚动条////////////////////////////////////
|
|
initadjustSingal();
|
|
evtdrawbox := _wapi.gtk_event_box_new(); //lot 放一个event box 便于绘制
|
|
|
|
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
|
|
clientLayout := _Wapi.gtk_layout_new(0,0);
|
|
_wapi.gtk_container_add(evtdrawbox,clientLayout);
|
|
global g_w_c_width;
|
|
pcd := _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
|
|
_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,max(0,nheight-pcd));
|
|
//_wapi.gtk_widget_set_size_request(evtdrawbox,2000,2000);
|
|
//_wapi.gtk_widget_set_events(eb,16777214);
|
|
_wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h);
|
|
FClientWideget := evtdrawbox;
|
|
//_wapi.gtk_widget_set_can_focus(eb,true);
|
|
_wapi.g_object_set_data(h,"gtk_layout",clientLayout);
|
|
_wapi.g_object_set_data(clientLayout,"gtk_layout_owner",h);
|
|
|
|
InitWidgetSize(h,x,y,nwidth,nheight);
|
|
|
|
_wapi.gtk_window_move(h,x,max(0,y-pcd));
|
|
if nwidth>0 and nheight>0 then
|
|
begin
|
|
_wapi.gtk_window_resize(h,nwidth,max(0,nheight-pcd));
|
|
end
|
|
_wapi.gtk_widget_show_all(vbox);
|
|
InitContainerList(h); //容器list
|
|
if (_const.WS_VISIBLE .& dwStyle)=_const.WS_VISIBLE then
|
|
begin
|
|
_wapi.ShowWindow(h);
|
|
end else
|
|
begin
|
|
_wapi.gtk_widget_hide(h);
|
|
end
|
|
_wapi.SetParent(h,hwndparent);
|
|
handle := h;
|
|
return inherited;
|
|
end
|
|
|
|
end
|
|
type tgtk_wnd_info = class()
|
|
function create(h);
|
|
begin
|
|
x := 0;
|
|
y := 0;
|
|
h := 0;
|
|
w := 0;
|
|
c := 0;
|
|
m := 0;
|
|
lt := 0;
|
|
end
|
|
function destroy();
|
|
begin
|
|
end
|
|
x;
|
|
y;
|
|
h;
|
|
w;
|
|
c;
|
|
m;
|
|
lt;
|
|
fh;
|
|
end
|
|
type tgtk_ctl_window = class(tgtk_ctl_scroll_window)
|
|
function Create(h);override;
|
|
begin
|
|
inherited;
|
|
end
|
|
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
|
|
begin
|
|
h := _wapi.gtk_event_box_new();//控件层
|
|
ctllayout := _Wapi.gtk_layout_new(0,0);//控件布局层
|
|
_wapi.gtk_container_add(h,ctllayout);
|
|
evtdrawbox := _wapi.gtk_event_box_new(); //布局绘制层
|
|
clientlayout := _wapi.gtk_layout_new(0,0); //客户区布局层
|
|
_wapi.gtk_container_add(evtdrawbox,clientlayout);
|
|
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
|
|
_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,nheight);
|
|
//_wapi.gtk_widget_set_size_request(evtdrawbox,10000,10000);
|
|
_wapi.g_object_set_data(h,"gtk_layout",clientlayout);
|
|
_wapi.g_object_set_data(clientlayout,"gtk_layout_owner",h);
|
|
_wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h);
|
|
_wapi.gtk_widget_show_all(evtdrawbox);
|
|
FClientWideget := evtdrawbox;
|
|
InitWidgetSize(h,x,y,nwidth,nheight);
|
|
FLayouter := ctllayout;
|
|
_wapi.gtk_widget_set_size_request(h,nwidth,nheight);
|
|
_wapi.gtk_widget_show(ctllayout);
|
|
if (dwStyle .& _const.WS_VISIBLE)=_const.WS_VISIBLE then
|
|
begin
|
|
_wapi.gtk_widget_show(h);
|
|
end
|
|
/////////////////////////滚动条////////////////////////////////////
|
|
initadjustSingal();
|
|
///////////////////////////颜色处理/////////////////////////////////////////
|
|
{c := new _GdkColor(nil);
|
|
c.SetRgb(0,0xffff,0);
|
|
_wapi.gtk_widget_modify_bg(h,0,c._getptr_());}
|
|
/////////////////////////////////////////////////////////////////////
|
|
InitContainerList(h);
|
|
_wapi.SetParent(h,hwndparent);
|
|
handle := h;
|
|
return inherited;
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function g_main_context_new():pointer;cdecl;external "libgtk-3.so";
|
|
function g_main_context_ref(m:pointer):pointer;cdecl;external "libgtk-3.so";
|
|
function g_main_context_acquire(m:pointer):integer;cdecl;external "libgtk-3.so";
|
|
procedure g_main_context_release(m:pointer);cdecl;external "libgtk-3.so";
|
|
type tGtkMessageQueue=class //消息队列
|
|
{**
|
|
@ignore(忽略)
|
|
gtk消息队列
|
|
**}
|
|
public
|
|
function Create();
|
|
begin
|
|
Clean();
|
|
FMainContext := g_main_context_new();
|
|
g_main_context_ref(FMainContext);
|
|
fLock := 0;
|
|
end
|
|
function Add(h,m,l,w,obj);
|
|
begin
|
|
lock();
|
|
FData[FLen]:= array(h,m,l,w,obj);
|
|
FLen++;
|
|
//createidle();
|
|
unlock();
|
|
end
|
|
function Feach();
|
|
begin
|
|
lock();
|
|
if FCurrent<FLen then
|
|
begin
|
|
r := FData[FCurrent];
|
|
FCurrent++;
|
|
if(FCurrent<FLen)and FCurrent>100 then
|
|
begin
|
|
FData := FData[FCurrent:]; //min(FLen-1,FCurrent+100)];
|
|
FCurrent :=0;
|
|
FLen := length(FData);
|
|
end
|
|
end else
|
|
begin
|
|
Clean();
|
|
end
|
|
unlock();
|
|
return r;
|
|
end
|
|
function feacheasylostmessage(h,m);
|
|
begin
|
|
r := array();
|
|
ri := 0;
|
|
idx := FCurrent;
|
|
lock();
|
|
while idx<FLen do
|
|
begin
|
|
if FData[idx][0]=h and FData[idx][1]=m then
|
|
begin
|
|
r[ri++] := FData[idx];
|
|
FData[idx][0]:= 0;
|
|
end
|
|
idx++;
|
|
end
|
|
unlock();
|
|
return r;
|
|
end
|
|
function cleaneasyLostMessage(h,m);
|
|
begin
|
|
idx := FCurrent;
|
|
lock();
|
|
while idx<FLen do
|
|
begin
|
|
if FData[idx][0]=h and FData[idx][1]=m then
|
|
begin
|
|
FData[idx][0]:= 0;
|
|
end
|
|
idx++;
|
|
end
|
|
unlock();
|
|
end
|
|
function haseasyLostMessage(h,m);
|
|
begin
|
|
idx := FCurrent;
|
|
if idx<FLen then
|
|
begin
|
|
if((h=-1)or(FData[idx][0]=h))and FData[idx][1]=m then
|
|
begin
|
|
return 1;
|
|
end
|
|
idx++;
|
|
end
|
|
end
|
|
property idleworked write fidleworked;
|
|
private
|
|
fidleworked;
|
|
FData;
|
|
FCurrent;
|
|
FLen;
|
|
FLock;
|
|
FMainContext;
|
|
function createidle();
|
|
begin
|
|
if fidleworked then return ;
|
|
idledata :=(new tcbytearray(4))._getptr_();
|
|
id := tsl_gtk_idle_interface(idledata);
|
|
fidleworked := true;
|
|
end
|
|
function Clean();
|
|
begin
|
|
FData := array();
|
|
FLen := 0;
|
|
FCurrent :=0;
|
|
end
|
|
function lock()
|
|
begin
|
|
return;
|
|
fLock++;
|
|
if(fLock=1)then
|
|
begin
|
|
g_main_context_acquire(FMainContext);
|
|
end
|
|
end
|
|
function unlock()
|
|
begin
|
|
return;
|
|
if(fLock>0)then
|
|
begin
|
|
fLock--;
|
|
if(fLock=0)then
|
|
begin
|
|
g_main_context_release(FMainContext);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function _gtkeventcall_();//消息回调
|
|
begin
|
|
r := class(tgtk_ctl_object).DispatchGtkEventCall(params);
|
|
return r;
|
|
end
|
|
function _gtk_add_time_msg_(h,m,w,l);
|
|
begin
|
|
//定时处理
|
|
AddMessageToGtkMessageQueue(h,m,w,l,0x113);
|
|
end
|
|
function hasMessageFromGtkMessageQueue(h,m); //是否存在消息
|
|
begin
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if G_GTK_MESSAGE_QUEUE_A then G_GTK_MESSAGE_QUEUE_A.haseasyLostMessage(h,m);
|
|
end
|
|
function feacheasylostMessageFromGtkMessageQueue(h,m); //获取容丢失的消息
|
|
begin
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if G_GTK_MESSAGE_QUEUE_A then return G_GTK_MESSAGE_QUEUE_A.feacheasylostmessage(h,m);
|
|
end
|
|
|
|
function clearMessageFromGtkMessageQueue(h,m); //清除消息
|
|
begin
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if G_GTK_MESSAGE_QUEUE_A then G_GTK_MESSAGE_QUEUE_A.cleaneasyLostMessage(h,m);
|
|
end
|
|
function AddMessageToGtkMessageQueue(FHandle,msg,wparam,lparam,d); //推送消息
|
|
begin
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if not G_GTK_MESSAGE_QUEUE_A then
|
|
begin
|
|
G_GTK_MESSAGE_QUEUE_A := new tGtkMessageQueue();
|
|
end
|
|
G_GTK_MESSAGE_QUEUE_A.add(FHandle,msg,wparam,lparam,d);
|
|
end
|
|
function FeachMessageFromGtkMessageQueue(); //获取最后的事件
|
|
begin
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if G_GTK_MESSAGE_QUEUE_A then
|
|
begin
|
|
d := G_GTK_MESSAGE_QUEUE_A.Feach();
|
|
return d;
|
|
end
|
|
//return class(tgtk_ctl_object).Feach(params);
|
|
end
|
|
function GetGtkEventNameOrId(n); //获得event
|
|
begin
|
|
global G_E_ID_Name_1;
|
|
global G_E_ID_Name_2;
|
|
if not ifarray(G_E_ID_Name_1) then
|
|
begin
|
|
G_E_ID_Name_2 := array();
|
|
G_E_ID_Name_1 := array(
|
|
"wm-user":10,
|
|
"destroy":11,
|
|
"activate":12,
|
|
"clicked":13,
|
|
"value-changed":14,
|
|
"delete-event":15,
|
|
"event":16 ,
|
|
"window-sate-event":17);
|
|
for i,v in G_E_ID_Name_1 do
|
|
begin
|
|
G_E_ID_Name_2[v] := i;
|
|
end
|
|
end
|
|
if ifstring(n) then
|
|
begin
|
|
ln := lowercase(n);
|
|
r := G_E_ID_Name_1[ln];
|
|
if not r then
|
|
begin
|
|
r := new tcstring(64);
|
|
r.setv(n);
|
|
r := r._getptr_();
|
|
G_E_ID_Name_1[ln] := r;
|
|
G_E_ID_Name_2[r] := ln;
|
|
end
|
|
return r;
|
|
end else
|
|
if n>0 or n<0 then return G_E_ID_Name_2[n];
|
|
end
|
|
function callpaintmessage(d);
|
|
begin
|
|
_wapi := gettswin32api();
|
|
_const := GetWin32Const();
|
|
r := zeros(4);
|
|
hd := d[0];
|
|
_wapi.gtk_widget_get_allocation(hd,r);
|
|
cr := _wapi.gdk_cairo_create(_wapi.gtk_widget_get_window(hd));
|
|
hwd := hd;
|
|
_wapi.g_object_set_data(hwd,"paint_dc",cr);
|
|
_wapi.g_object_set_data(hwd,"paint_height",r[3]);
|
|
_wapi.g_object_set_data(hwd,"paint_width",r[2]);
|
|
|
|
r := class(tgtk_ctl_object).CallGtkWinProc(d[0],d[1],d[2],d[3]);
|
|
|
|
_wapi.cairo_set_dash(cr,array(4.0,0.0),2,0);
|
|
if (FExdwstyle .& _const.WS_EX_DLGMODALFRAME)= _const.WS_EX_DLGMODALFRAME then
|
|
begin
|
|
_wapi.cairo_set_source_rgb(cr, 225/255, 225/255, 225/255);
|
|
_wapi.cairo_set_line_width (cr, 3);
|
|
_wapi.cairo_rectangle(cr,0,0,r[2],r[3]);
|
|
_wapi.cairo_stroke(cr);
|
|
end
|
|
if (Fdwstyle .& _const.WS_BORDER)= _const.WS_BORDER then
|
|
begin
|
|
_wapi.cairo_set_source_rgb(cr, 0, 0, 0);
|
|
_wapi.cairo_set_line_width (cr, 1);
|
|
_wapi.cairo_rectangle(cr,0,0,r[2],r[3]);
|
|
_wapi.cairo_stroke(cr);
|
|
end
|
|
_wapi.cairo_destroy(cr);
|
|
_wapi.gtk_object_set_data(cr);
|
|
end
|
|
|
|
function _gtkidledo_(); //回调
|
|
begin
|
|
d := FeachMessageFromGtkMessageQueue();
|
|
if ifarray(d) then
|
|
begin
|
|
//echo "\r\n>>",d[0],"==",d[1],"===",d[4],">>>",datetimetostr(now());
|
|
{if d[1] = 0x007B then
|
|
begin
|
|
r := class(tgtk_ctl_object).CallGtkWinProc(d[0],d[1],d[2],d[3]);
|
|
if not r then //右键菜单上传
|
|
begin
|
|
|
|
end
|
|
return r;
|
|
end }
|
|
if d[4]=0x113 and d[0]=0 then //定时
|
|
begin
|
|
fgt := class(tUIglobalData).uigetdata("G_F_TIME_PROC_");
|
|
if fgt then call(fgt,d[0],d[1],d[2],d[3]);
|
|
end else
|
|
if d[0] then
|
|
begin
|
|
r := class(tgtk_ctl_object).CallGtkWinProc(d[0],d[1],d[2],d[3]);
|
|
if r=0 and d[1]= 0x007B then //处理 contextmenu消息
|
|
begin
|
|
_wapi := gettswin32api();
|
|
h := _wapi.GetParent(d[0]);
|
|
if h then
|
|
begin
|
|
AddMessageToGtkMessageQueue(h,d[1],h,d[3],true);
|
|
end
|
|
return 1;
|
|
end
|
|
return 1; //r
|
|
end
|
|
else
|
|
begin
|
|
tslprocessmessages(false);
|
|
//sleep(10);
|
|
end
|
|
r := 1;
|
|
end else
|
|
begin
|
|
r := 0;
|
|
tslprocessmessages(false);
|
|
//sleep(10);//休息一下
|
|
end
|
|
unit(uvclthreadworker).RunThreadWorkerHost();
|
|
GLobal G_GTK_MESSAGE_QUEUE_A;
|
|
if r=0 then sleep(1);
|
|
//G_GTK_MESSAGE_QUEUE_A.idleworked := r;
|
|
return true;
|
|
end
|
|
procedure tslprocessmessages()begin end;
|
|
function InitGtkWindowClass(); //初始化窗口类
|
|
begin
|
|
global G_GTK_WINDOW_CLASSINFO;
|
|
if not ifarray(G_GTK_WINDOW_CLASSINFO) then
|
|
begin
|
|
G_GTK_WINDOW_CLASSINFO := array();
|
|
fp := 0;//getwinprocptr();
|
|
cls := array(array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tsui_application","hiconsm":0L)
|
|
,array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tsui_window","hiconsm":0L)
|
|
,array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tui_panel","hiconsm":0L)
|
|
,array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tsluidesigner_a_a_1","hiconsm":0L)
|
|
,array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tsui_form","hiconsm":0L)
|
|
,array("cbsize":80,"style":139,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65541L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tui_button","hiconsm":0L)
|
|
,array("cbsize":80,"style":136,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65543L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tui_edit","hiconsm":0L)
|
|
,array("cbsize":80,"style":16395,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65541L,"hbrbackground":16L,"lpszmenuname":0L,"lpszclassname":"tui_tablecontrol32","hiconsm":0L)
|
|
,array("cbsize":80,"style":43,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":0,"hinstance":0,"hicon":0L,"hcursor":0L,"hbrbackground":0L,"lpszmenuname":0L,"lpszclassname":"tui_PageSheet","hiconsm":0L)
|
|
,array("cbsize":80,"style":16384,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65541L,"hbrbackground":6L,"lpszmenuname":0L,"lpszclassname":"tui_monthcalendar","hiconsm":0L)
|
|
,array("cbsize":80,"style":16384,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65541L,"hbrbackground":6L,"lpszmenuname":0L,"lpszclassname":"tui_prograssbar","hiconsm":0L)
|
|
,array("cbsize":80,"style":16384,"lpfnwndproc":fp,"cbclsextra":0,"cbwndextra":8,"hinstance":0,"hicon":0L,"hcursor":65541L,"hbrbackground":6L,"lpszmenuname":0L,"lpszclassname":"tui_datetimepicker","hiconsm":0L)
|
|
);
|
|
for i ,v in cls do
|
|
begin
|
|
G_GTK_WINDOW_CLASSINFO[v["lpszclassname"]] := v;
|
|
end
|
|
end
|
|
|
|
end
|
|
type tmenuStruct = class(tslcstructureobj)// 菜单类对象 %%
|
|
static classstruct;
|
|
class function getstruct();
|
|
begin
|
|
if not classstruct then
|
|
begin
|
|
classstruct := MemoryAlignmentCalculate( array(
|
|
("cbsize","int",0),
|
|
("fmask","int",0),
|
|
("ftype","int",0),
|
|
("fstate","int",0),
|
|
("wid","int",0),
|
|
("hsubmenu","intptr",0),
|
|
("hbmpchecked","intptr",0),
|
|
("hbmpunchecked","intptr",0),
|
|
("dwitemdata","intptr",0),
|
|
("dwtypedata","intptr",0),
|
|
("cch","int",90),
|
|
("hbmpitem","intptr",0)));
|
|
end
|
|
return classstruct;
|
|
end
|
|
function create(ptr);
|
|
begin
|
|
class(tslcstructureobj).create(getstruct(),ptr);
|
|
_setvalue_("cbsize",_size_());
|
|
end
|
|
function getdwtypedata(); //获得数据
|
|
begin
|
|
len := _getvalue_("cch");
|
|
p := _getvalue_("dwtypedata");
|
|
d := ReadBytesFromPtr(p,len);
|
|
r := "";
|
|
setlength(r,len);
|
|
for i := 1 to len do
|
|
begin
|
|
r[i] := d[i-1];
|
|
end
|
|
return r;
|
|
//ReadStringFromPtr(p);
|
|
end
|
|
property wid:integer index "wid" read _getvalue_ write _setvalue_;
|
|
property hsubmenu:integer index "hsubmenu" read _getvalue_ write _setvalue_;
|
|
property hbmpitem:integer index "hbmpitem" read _getvalue_ write _setvalue_;
|
|
property dwtypedata:integer index "dwtypedata" read _getvalue_ write _setvalue_;
|
|
property fmask:integer index "fmask" read _getvalue_ write _setvalue_;
|
|
property ftype:integer index "ftype" read _getvalue_ write _setvalue_;
|
|
property fstate:integer index "fstate" read _getvalue_ write _setvalue_;
|
|
end
|
|
function GetGtkwindowclass(n);//获得窗口类
|
|
begin
|
|
global G_GTK_WINDOW_CLASSINFO;
|
|
InitGtkWindowClass();
|
|
return G_GTK_WINDOW_CLASSINFO[n];
|
|
|
|
end
|
|
function reggtkwindowclass(cs);//注册窗口类
|
|
begin
|
|
global G_GTK_WINDOW_CLASSINFO;
|
|
InitGtkWindowClass();
|
|
G_GTK_WINDOW_CLASSINFO[cs["lpszclassname"]] := cs;
|
|
end
|
|
function GetWin32Const(); //获得win32常量
|
|
begin
|
|
return static new TSLUICONST();
|
|
end
|
|
|
|
function tsl_gtk_get_thread();
|
|
begin
|
|
return static systhreadid();
|
|
end
|
|
type _gtkeventtype=class
|
|
static GTK_EVENT_ISNIT;
|
|
static GDK_DELETE;
|
|
static GDK_DESTROY;
|
|
static GDK_EXPOSE;
|
|
static GDK_MOTION_NOTIFY;
|
|
static GDK_BUTTON_PRESS;
|
|
static GDK_2BUTTON_PRESS;
|
|
static GDK_3BUTTON_PRESS;
|
|
static GDK_BUTTON_RELEASE;
|
|
static GDK_KEY_PRESS;
|
|
static GDK_KEY_RELEASE;
|
|
static GDK_ENTER_NOTIFY;
|
|
static GDK_LEAVE_NOTIFY;
|
|
static GDK_FOCUS_CHANGE;
|
|
static GDK_CONFIGURE;
|
|
static GDK_MAP;
|
|
static GDK_UNMAP;
|
|
static GDK_PROPERTY_NOTIFY;
|
|
static GDK_SELECTION_CLEAR;
|
|
static GDK_SELECTION_REQUEST;
|
|
static GDK_SELECTION_NOTIFY;
|
|
static GDK_PROXIMITY_IN;
|
|
static GDK_PROXIMITY_OUT;
|
|
static GDK_DRAG_ENTER;
|
|
static GDK_DRAG_LEAVE;
|
|
static GDK_DRAG_MOTION;
|
|
static GDK_DRAG_STATUS;
|
|
static GDK_DROP_START;
|
|
static GDK_DROP_FINISHED;
|
|
static GDK_CLIENT_EVENT;
|
|
static GDK_VISIBILITY_NOTIFY;
|
|
static GDK_NO_EXPOSE;
|
|
static GDK_SCROLL;
|
|
static GDK_WINDOW_STATE;
|
|
static GDK_SETTING;
|
|
static GDK_OWNER_CHANGE;
|
|
static GDK_GRAB_BROKEN;
|
|
static GDK_DAMAGE;
|
|
static GDK_NOTHING;
|
|
|
|
static GTK_RESPONSE_HELP;
|
|
static GTK_RESPONSE_APPLY;
|
|
static GTK_RESPONSE_NO;
|
|
static GTK_RESPONSE_YES;
|
|
static GTK_RESPONSE_CLOSE;
|
|
static GTK_RESPONSE_CANCEL;
|
|
static GTK_RESPONSE_OK;
|
|
static GTK_RESPONSE_DELETE_EVENT;
|
|
static GTK_RESPONSE_ACCEPT;
|
|
static GTK_RESPONSE_REJECT;
|
|
static GTK_RESPONSE_NONE;
|
|
class function sinit();
|
|
begin
|
|
if GTK_EVENT_ISNIT then return ;
|
|
GTK_EVENT_ISNIT := true;
|
|
GDK_DELETE := 0;
|
|
GDK_DESTROY := 1;
|
|
GDK_EXPOSE := 2;
|
|
GDK_MOTION_NOTIFY := 3;
|
|
GDK_BUTTON_PRESS := 4;
|
|
GDK_2BUTTON_PRESS := 5;
|
|
GDK_3BUTTON_PRESS := 6;
|
|
GDK_BUTTON_RELEASE := 7;
|
|
GDK_KEY_PRESS := 8;
|
|
GDK_KEY_RELEASE := 9;
|
|
GDK_ENTER_NOTIFY := 10;
|
|
GDK_LEAVE_NOTIFY := 11;
|
|
GDK_FOCUS_CHANGE := 12;
|
|
GDK_CONFIGURE := 13;
|
|
GDK_MAP := 14;
|
|
GDK_UNMAP := 15;
|
|
GDK_PROPERTY_NOTIFY := 16;
|
|
GDK_SELECTION_CLEAR := 17;
|
|
GDK_SELECTION_REQUEST := 18;
|
|
GDK_SELECTION_NOTIFY := 19;
|
|
GDK_PROXIMITY_IN := 20;
|
|
GDK_PROXIMITY_OUT := 21;
|
|
GDK_DRAG_ENTER := 22;
|
|
GDK_DRAG_LEAVE := 23;
|
|
GDK_DRAG_MOTION := 24;
|
|
GDK_DRAG_STATUS := 25;
|
|
GDK_DROP_START := 26;
|
|
GDK_DROP_FINISHED := 27;
|
|
GDK_CLIENT_EVENT := 28;
|
|
GDK_VISIBILITY_NOTIFY := 29;
|
|
GDK_NO_EXPOSE := 30;
|
|
GDK_SCROLL := 31;
|
|
GDK_WINDOW_STATE := 32;
|
|
GDK_SETTING := 33;
|
|
GDK_OWNER_CHANGE := 34;
|
|
GDK_GRAB_BROKEN := 35;
|
|
GDK_DAMAGE := 36;
|
|
GDK_NOTHING := -1;
|
|
|
|
GTK_RESPONSE_HELP := -11;
|
|
GTK_RESPONSE_APPLY := -10;
|
|
GTK_RESPONSE_NO := -9;
|
|
GTK_RESPONSE_YES := -8;
|
|
GTK_RESPONSE_CLOSE := -7;
|
|
GTK_RESPONSE_CANCEL := -6;
|
|
GTK_RESPONSE_OK := -5;
|
|
GTK_RESPONSE_DELETE_EVENT := -4;
|
|
GTK_RESPONSE_ACCEPT := -3;
|
|
GTK_RESPONSE_REJECT := -2;
|
|
GTK_RESPONSE_NONE := -1;
|
|
end
|
|
end
|
|
{ //cairo 常量
|
|
CAIRO_OPERATOR_CLEAR:=0;
|
|
CAIRO_OPERATOR_SOURCE:=1;
|
|
CAIRO_OPERATOR_OVER:=2;
|
|
CAIRO_OPERATOR_IN:=3;
|
|
CAIRO_OPERATOR_OUT:=4;
|
|
CAIRO_OPERATOR_ATOP:=5;
|
|
CAIRO_OPERATOR_DEST:=6;
|
|
CAIRO_OPERATOR_DEST_OVER:=7;
|
|
CAIRO_OPERATOR_DEST_IN:=8;
|
|
CAIRO_OPERATOR_DEST_OUT:=9;
|
|
CAIRO_OPERATOR_DEST_ATOP:=10;
|
|
CAIRO_OPERATOR_XOR:=11;
|
|
CAIRO_OPERATOR_ADD:=12;
|
|
CAIRO_OPERATOR_SATURATE:=13;
|
|
CAIRO_OPERATOR_MULTIPLY:=14;
|
|
CAIRO_OPERATOR_SCREEN:=15;
|
|
CAIRO_OPERATOR_OVERLAY:=16;
|
|
CAIRO_OPERATOR_DARKEN:=17;
|
|
CAIRO_OPERATOR_LIGHTEN:=18;
|
|
CAIRO_OPERATOR_COLOR_DODGE:=19;
|
|
CAIRO_OPERATOR_COLOR_BURN:=20;
|
|
CAIRO_OPERATOR_HARD_LIGHT:=21;
|
|
CAIRO_OPERATOR_SOFT_LIGHT:=22;
|
|
CAIRO_OPERATOR_DIFFERENCE:=23;
|
|
CAIRO_OPERATOR_EXCLUSION:=24;
|
|
CAIRO_OPERATOR_HSL_HUE:=25;
|
|
CAIRO_OPERATOR_HSL_SATURATION:=26;
|
|
CAIRO_OPERATOR_HSL_COLOR:=27;
|
|
CAIRO_OPERATOR_HSL_LUMINOSITY:=28;
|
|
}
|
|
function gtk_init_check(argc:string;argcv:string):integer;cdecl;external 'libgtk-3.so';
|
|
function igtk();
|
|
begin
|
|
global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable,g_gtk_call_handler_manager;
|
|
gtk_init_check(nil,nil);
|
|
g_w_i_datas := array();
|
|
g_w_c_width := 35;
|
|
g_gtk_buttontable := array(0,0);
|
|
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
|
|
g_gtk_call_handler_manager := new tinstancemanager();
|
|
end
|
|
function ugtk();
|
|
begin
|
|
global g_gtk_call_handler_manager;
|
|
g_gtk_call_handler_manager := nil;
|
|
end
|
|
function gettslvcleventhandler_(fname:string):pointer;
|
|
begin
|
|
global g_gtk_call_handler_manager;
|
|
if not g_gtk_call_handler_manager then return 0;
|
|
mgnr := g_gtk_call_handler_manager;
|
|
case fname of
|
|
"tsl_gtk_wmuser_event": return mgnr.get(thisfunction(tsl_gtk_wmuser_event));
|
|
"tsl_gtk_destroy_event": return mgnr.get(thisfunction(tsl_gtk_destroy_event));
|
|
"tsl_gtk_activate_event": return mgnr.get(thisfunction(tsl_gtk_activate_event));
|
|
"tsl_gtk_clicked_event": return mgnr.get(thisfunction(tsl_gtk_clicked_event));
|
|
"tsl_gtk_adj_value_changed_event": return mgnr.get(thisfunction(tsl_gtk_adj_value_changed_event));
|
|
"tsl_gtk_delete_event": return mgnr.get(thisfunction(tsl_gtk_delete_event));
|
|
"tsl_gtk_day_select_event": return mgnr.get(thisfunction(tsl_gtk_day_select_event));
|
|
"tsl_gtk_changed_event": return mgnr.get(thisfunction(tsl_gtk_changed_event));
|
|
"tsl_gtk_preedit_changed_event": return mgnr.get(thisfunction(tsl_gtk_preedit_changed_event));
|
|
"dodeleteevents": return mgnr.get(thisfunction(dodeleteevents));
|
|
"tsl_gtk_normal_event_cb": return mgnr.get(thisfunction(tsl_gtk_normal_event_cb));
|
|
"tsl_gtk_normal_event_bc": return mgnr.get(thisfunction(tsl_gtk_normal_event_bc));
|
|
"tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle));
|
|
end ;
|
|
end
|
|
function tsl_gtk_idle(dlg:pointer):integer;
|
|
begin
|
|
return _gtkidledo_(dlg);
|
|
end
|
|
function tsl_gtk_normal_event_bc(a:pointer;b:pointer;c:pointer):integer;
|
|
begin
|
|
return _gtkeventcall_(a,b,c);
|
|
end
|
|
function tsl_gtk_normal_event_cb(a:pointer;b:pointer;c:pointer):integer;
|
|
begin
|
|
return _gtkeventcall_(a,c,b);
|
|
//获得消息处理函数的指针
|
|
end
|
|
function tsl_gtk_preedit_changed_event(a:pointer;b:pointer;c:pointer):integer;
|
|
begin
|
|
return dotparamseevents(a, "preedit-changed", b, c);
|
|
end
|
|
function tsl_gtk_changed_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "changed");
|
|
end
|
|
function tsl_gtk_day_select_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "day-selected");
|
|
end
|
|
function tsl_gtk_delete_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "delete-event");
|
|
end
|
|
function tsl_gtk_adj_value_changed_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "value-changed");
|
|
end
|
|
function tsl_gtk_clicked_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "clicked");
|
|
end
|
|
function tsl_gtk_activate_event(a:pointer;b:pointer):integer;
|
|
begin
|
|
return dodeleteevents(a, "activate");
|
|
end
|
|
|
|
function tsl_gtk_destroy_event(a:pointer; b:pointer;c:pointer):integer;
|
|
begin
|
|
return _gtkeventcall_(a,b,c);
|
|
end
|
|
function tsl_gtk_wmuser_event(a:pointer; p1:pointer;p2:pointer):integer;
|
|
begin
|
|
return dotparamseevents(a, "wm-user", p1, p2);
|
|
end
|
|
function dodeleteevents( a:pointer;b:string):integer;
|
|
begin
|
|
return _gtkeventcall_(a,GetGtkEventNameOrId(b),0);
|
|
end
|
|
function dotparamseevents(a:pointer; b:string;p1:pointer;p2:pointer):pointer;
|
|
begin
|
|
return _gtkeventcall_(a,GetGtkEventNameOrId(b),p1,p2);
|
|
end
|
|
initialization
|
|
igtk();
|
|
finalization
|
|
ugtk();
|
|
end. |