unit ugtkinterface; interface { 20230810-1616 修改常量 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 事件名称 function getfuncptrbyname(lib,n); type tgtkeventobject =class(tgtk_ctl_object) //gtk对象消息类(测试用) function create(h); begin inherited; end end type tsgtkapi = class(tgtkapis) 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 IsZoomed(hd:pointer) begin return 0; 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 ///////////////////////空接口 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 function MultiByteToWideChar_a(CodePage:integer;dwFlags:integer;lpMultiByteStr:string;cbMultiByte:integer;var lpWideCharStr:string;cchWideChar:integer):integer; begin end 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 ftod := fto._getdata_(); fc := ftod["facename"]; ht := ftod["height"]; wd := ftod["width"]; it := 0;//ftod["italic"]; wt := ftod["weight"]=700; udl := ftod["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 ; 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); brk := 0; wd2 := wd*2{-2-wt}; //稍微缩小一点 iwd2 := wd2; brk_Ct := 0; dkzt := false; {ext := new _cairo_text_extents_t(nil); 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.04) then begin iwd2-=0.001; end else if nwd<(wd2+0.04) then begin iwd2+=0.001; end else begin brk := true; end echo "\r\n",iwd2,"++++",wd; if brk_Ct>50 then break; end echo "\r\ncalc count:",brk_Ct;} g_gtk_font_get_size[cft,{ht,}wd,it,wt] := array("width":wd,"zczw":dkzt,"iwd2":iwd2); cairo_set_font_size(hdc,iwd2); end end end ht := wd*2; 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 fillbk := true; gtk_rgb_color_rgb(gtk_object_get_data(hdc,"font.bkcolor"),bkr,bkg,bkb); //cairo_fill end //////////////////////////////////////////////////////// if udl then begin cairo_set_line_width(hdc,0.4); end txts := array(); txtidx := 0; txti := ""; while idx<=tlen do begin ci := GetChar(txt,idx); idx++; if ci=10 then begin txts[txtidx++] := array(txti,yp,xp); txti := ""; yp+=ht; continue; end if ci=13 then continue; if ci=9 then txti+=" "; else txti+=txt[idx-1]; end if txti then txts[txtidx++] := array(txti,yp,xp); gtk_rgb_color_rgb(cl,pr,pg,pb); for i ,v in txts do begin v0 := v[0]; if not v0 then continue; vl := length(v0); xx := v[2]; yy := v[1]; if fillbk then begin cairo_move_to(hdc,xx,yy); cairo_line_to(hdc,xx+wid*vl,yy); cairo_line_to(hdc,xx+wid*vl,yy-ht); cairo_line_to(hdc,xx,yy-ht); cairo_line_to(hdc,xx,yy); cairo_set_source_rgb(hdc, bkr, bkg, bkb); cairo_fill(hdc); end cairo_set_source_rgb(hdc, pr, pg, pb); if udl then begin cairo_move_to(hdc,xx,yy-1); cairo_line_to(hdc,(xx+wid*vl),yy-1); end cairo_move_to(hdc,xx,yy); cairo_show_text(hdc,TslStringToGtk(v0)); cairo_stroke(hdc); end return 1; 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 idx14 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"); 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); 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); 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); return 1; 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 * pi()); 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); return 1; 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 1; end Function Chord(hdc :pointer;l:integer;t:integer;r:integer;b:integer;wid:integer;ht: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"); direct := gtk_object_get_data(dc,"arcdirection"); 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); xx1 := nXRadial1-mx; yy1 := (nYRadial1-my); xx2 := nXRadial2-mx; yy2 := (nYRadial2-my); arg1 := getargbyxy(xx1,yy1); arg2 := getargbyxy(xx2,yy2); if direct=2 then begin cairo_arc(dc, 0, 0, rx, arg1, arg2); end else begin cairo_arc(dc, 0, 0, rx, arg2, arg1); end 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_move_to(dc,cos(arg1)*rx,sin(arg1)*rx); cairo_line_to(dc,cos(arg2)*rx,sin(arg2)*rx); 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 Pie(dc :pointer;l:integer;t:integer;r:integer;b:integer;nXRadial1:integer;nYRadial1:integer;nXRadial2:integer;nYRadial2: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"); direct := gtk_object_get_data(dc,"arcdirection"); 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); xx1 := nXRadial1-mx; yy1 := (nYRadial1-my); xx2 := nXRadial2-mx; yy2 := (nYRadial2-my); arg1 := getargbyxy(xx1,yy1); arg2 := getargbyxy(xx2,yy2); if direct=2 then begin cairo_arc(dc, 0, 0, rx, arg1, arg2); end else begin cairo_arc(dc, 0, 0, rx, arg2, arg1); end 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_move_to(dc,cos(arg1)*rx,sin(arg1)*rx); cairo_line_to(dc,0,0); cairo_line_to(dc,cos(arg2)*rx,sin(arg2)*rx); 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 SetArcDirection(dc :pointer;direct:integer):integer; begin if direct = 1 or direct = 2 then begin gtk_object_set_data(dc,"arcdirection",direct); end //AD_CLOCKWISE:=2; //AD_COUNTERCLOCKWISE := 1; end private function getargbyxy(x,y_); begin y := y_; pi := pi(); if x=0 and y>=0 then begin return pi/2; end if x=0 and y<=0 then begin return pi*3/2; end if x>=0 and y>=0 then begin ph := 1; end else if x<=0 and y>=0 then begin ph := 2; end else if x<=0 and y<=0 then begin ph := 3; end else if x>=0 and y<=0 then begin ph := 4; end arg := arctan(y/x); if ph=2 or ph = 3 then arg +=pi; return arg; end public //Function Arc(hdc :pointer;nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer;nXRadial1:integer;nYRadial1:integer;nXRadial2:integer;nYRadial2:integer):integer; Function Arc(dc :pointer;l:integer;t:integer;r:integer;b:integer;nXRadial1:integer;nYRadial1:integer;nXRadial2:integer;nYRadial2: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"); direct := gtk_object_get_data(dc,"arcdirection"); 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); xx1 := nXRadial1-mx; yy1 := (nYRadial1-my); xx2 := nXRadial2-mx; yy2 := (nYRadial2-my); arg1 := getargbyxy(xx1,yy1); arg2 := getargbyxy(xx2,yy2); if direct=2 then begin cairo_arc(dc, 0, 0, rx, arg1, arg2); end else begin cairo_arc(dc, 0, 0, rx, arg2, arg1); end {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 Polygon(hdc :pointer;points:array of integer;n:integer):integer; begin end Function PolyBezier(dc :pointer;points:array of integer;n:integer):integer; begin if length(points)<4 then return 0; 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,points[0,0]+x,Points[0,1]+y); for i := 1 to length(points)-2 step 3 do begin cairo_curve_to(dc,points[i,0]+x,points[i,1]+y,points[i+1,0]+x,points[i+1,1]+y,points[i+2,0]+x,points[i+2,1]+y); end cairo_stroke(dc); return 1; 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 //添加alpha处理 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////////////////// 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 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 := my_trim( 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 mf1 then ffd := dts[1:fodpos-1]; else ffd := "/"; gf :=ffd; gf+="\0"; end if fodpos 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 := my_trim(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 private g_gtk_caret_cache_timer; function docarettime(p:pointer):integer;cdecl; begin global g_current_get_focus_widget; h := g_current_get_focus_widget; if not h then return 1; if not g_object_get_data(h,"caretshow") then return 1; GetCaretPos(xy); drawcaret(h,xy,-1); return 1; end public function CreateCaret(hWnd :pointer;hBitmap:pointer;nWidth:integer;nHeight:integer):integer; begin if not(hwnd>0 or hwnd<0) then return 0; if not g_gtk_caret_cache_timer then begin Fscrolltimedo := makeinstance(thisfunction(docarettime)); g_gtk_caret_cache_timer:= new ttmstruct(nil); rt := g_timeout_add(800,Fscrolltimedo,g_gtk_caret_cache_timer._getptr_() ); g_gtk_caret_cache_timer._setvalue_(0,rt); 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 function my_trim(s); begin if not ifstring(s) then return ""; for i:= 1 to length(s) do begin if s[i]="\0" then begin if i=1 then return ""; return s[1:(i-1)]; end end return s; 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 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 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 := my_trim(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 := my_trim(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_b(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_b(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_b(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_b(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_b(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_b(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_b(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 tsl_gtk_messagebox_b(); begin global g_gtk_call_handler_manager; mgnr := g_gtk_call_handler_manager; pms := params; dialog := gtk_window_new(0); //gtk_dialog_new(); gtk_window_set_resizable(GTK_WINDOW(dialog),FALSE); gtk_window_set_position(GTK_WINDOW(dialog),3); //GTK_WIN_POS_CENTER_ALWAYS btns := new tslcstructureobj(MemoryAlignmentCalculate(array((0,"intptr",0),(1,"intptr",0),(2,"intptr",0),(3,"intptr",0)))); btns._setvalue_(0,dialog); g_signal_connect_data(GTK_WIDGET(dialog),"destroy",mgnr.get(thisfunction( MessageBoxQuit)),btns._getptr_,0); id := pms[0]; idt := pms[1]; pt := pms[2]; if(GTK_WIDGET(pt))then //GTK_IS_WINDOW begin if(not gtk_widget_is_toplevel(pt))then begin pt := gtk_widget_get_toplevel(pt); end gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(pt)); end gtk_window_set_title(GTK_WINDOW(dialog),(idt)); gtk_container_set_border_width(GTK_CONTAINER(dialog),5); gtk_widget_realize(dialog); lbl := gtk_label_new((id)); gtk_misc_set_padding((lbl),10,10); //GTK_MISC vbox := gtk_vbox_new(FALSE,5); hbox := gtk_hbox_new(FALSE,10); gtk_box_pack_start((vbox),lbl,TRUE,TRUE,0); //GTK_BOX gtk_widget_show(lbl); gtk_container_add(GTK_CONTAINER(dialog),GTK_WIDGET(vbox)); gtk_widget_show(vbox); gtk_widget_show(hbox); gtk_widget_show(dialog); temp := 0; for idx := 0 to 2 do begin temp := pms[3+idx * 2]; btn := gtk_button_new_with_label(temp); btns._setvalue_(idx+1,btn); temp := pms[3+idx * 2+1]; g_signal_connect_data(GTK_WIDGET(btn),"clicked",mgnr.get(thisfunction( MessageBoxQuit)),btns._getptr_,nil); if temp then gtk_widget_show(btn); gtk_box_pack_start((hbox),btn,TRUE,TRUE,0); end gtk_box_pack_start((vbox),hbox,TRUE,TRUE,0); class(tUIglobalData).uigetdata("tuiapplication").run(); for idx := 3 downto 1 do begin if(0=(btns._getvalue_(idx)))then begin return idx; end end return 0; end function MessageBoxQuit(w:pointer;dd: pointer); begin da := new tslcstructureobj(MemoryAlignmentCalculate(array((0,"intptr",0),(1,"intptr",0),(2,"intptr",0),(3,"intptr",0))),dd); d := da._getdata_(); gtk_window_set_modal(GTK_WINDOW(d[0]),false); gtk_window_set_transient_for( GTK_WINDOW(d[0]),0); for i := 0 to 3 do begin if(w=d[i])then begin if i=0 then begin gtk_main_quit(); end else begin da._setvalue_(i,0); g_signal_emit_by_name(d[0], "destroy"); end break; end end return 0; 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; begin _f_ := static function(t:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t); end 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/zenity") then begin for i := length(p) downto 1 do begin if p[i]="/" then begin tsl_gtk_execsystem(format('zenity --file-selection --filename="%s" &',p[1:i])); break; end end return ;// end 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/////////////////////////////// function g_timeout_add(interval:integer; _function:pointer; d:pointer):integer; begin _f_ := static function(interval:integer; _function:pointer; d:pointer):integer; cdecl; external getfuncptrbyname(0,functionname()); ////libglib-2.0.so return ##_f_(interval,_function,d); end procedure g_source_remove(timeout_handler_id:integer); begin _f_ := static procedure(timeout_handler_id:integer); cdecl; external getfuncptrbyname(0,functionname()); ////libglib-2.0.so return ##_f_(timeout_handler_id); end //////////////////////////clipboard///////////////////// procedure gtk_clipboard_set_text(c:pointer;s:string;len:integer); begin _f_ := static procedure(c:pointer;s:string;len:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,s,len); end function gtk_clipboard_get(atm:pointer):pointer; begin _f_ := static function(atm:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(atm); end function gtk_clipboard_wait_for_text(clipboard:pointer):string; begin _f_ := static function(clipboard:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(clipboard); end //////////////////////// function gtk_events_pending():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_main_iteration_do(f:integer):integer; begin _f_ := static function(f:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(f); end function gtk_main_iteration():integer ; begin _f_ := static function():integer ;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_idle_remove_by_data(p:pointer):integer; begin _f_ := static function(p:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end /////////////////////////////////////////////////////// //////////////// function g_slist_alloc():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_slist_append(list:pointer;d:pointer):pointer; begin _f_ := static function(list:pointer;d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(list,d); end procedure g_slist_free(list:pointer); begin _f_ := static procedure(list:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(list); end function g_slist_find(gl:pointer;d:pointer):pointer; begin _f_ := static function(gl:pointer;d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gl,d); end function g_slist_length(gl:pointer):integer; begin _f_ := static function(gl:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gl); end function g_slist_delete_link(gl:pointer;gl2:pointer):pointer; begin _f_ := static function(gl:pointer;gl2:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gl,gl2); end function g_slist_remove(gl:pointer;gl2:pointer):pointer; begin _f_ := static function(gl:pointer;gl2:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gl,gl2); end ////////////////not classfiy////////////////////////////////// function gtk_widget_is_visible(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_widget_has_focus(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_set_can_focus(w:pointer;cf:integer); begin _f_ := static procedure(w:pointer;cf:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,cf); end function gtk_window_get_focus(w:pointer):pointer; begin _f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_grab_focus(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_widget_activate(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_window_set_focus(window:pointer; focus:pointer); begin _f_ := static procedure(window:pointer; focus:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window,focus); end procedure gtk_window_set_type_hint(window:pointer; tp:integer); begin _f_ := static procedure(window:pointer; tp:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window,tp); end procedure gtk_widget_set_has_window(widget:pointer;has_window:integer); begin _f_ := static procedure(widget:pointer;has_window:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(widget,has_window); end function gtk_widget_get_parent(w:pointer):pointer; begin _f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_widget_get_allocated_width(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_widget_get_allocated_height(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_set_sensitive(w:pointer;s:integer); begin _f_ := static procedure(w:pointer;s:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,s); end function gtk_widget_get_sensitive(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_widget_is_toplevel(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_window_get_title(w:pointer):string; begin _f_ := static function(w:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end ////////////////////////////////im///////////////////////// function gtk_im_multicontext_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_im_multicontext_get_context_id(im:pointer):string; begin _f_ := static function(im:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im); end function gtk_im_multicontext_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_im_context_set_client_window(im:pointer;w:pointer); begin _f_ := static procedure(im:pointer;w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,w); end procedure gtk_im_context_set_use_preedit (im:pointer;s:integer); begin _f_ := static procedure(im:pointer;s:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,s); end procedure gtk_im_context_focus_in(im:pointer); begin _f_ := static procedure(im:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im); end procedure gtk_im_context_focus_out (im:pointer); begin _f_ := static procedure(im:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im); end procedure gtk_im_context_reset(im:pointer); begin _f_ := static procedure(im:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im); end procedure gtk_im_context_get_preedit_string(im:pointer;var str:string;var attrs:pointer;cp:array of integer); begin _f_ := static procedure(im:pointer;var str:string;var attrs:pointer;cp:array of integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,str,attrs,cp); end function gtk_im_context_filter_keypress(im:pointer;e:pointer):integer; begin _f_ := static function(im:pointer;e:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,e); end function gtk_im_context_delete_surrounding(im:pointer;offset:integer;nchars:integer):integer; begin _f_ := static function(im:pointer;offset:integer;nchars:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,offset,nchars); end function gtk_im_context_get_surrounding(im:pointer;var txt:string;var cursor_index:integer):integer; begin _f_ := static function(im:pointer;var txt:string;var cursor_index:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,txt,cursor_index); end procedure gtk_im_context_set_cursor_location(im:pointer;var area:array of integer); begin _f_ := static procedure(im:pointer;var area:array of integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(im,area); end //////////////////////////////////gobject////// function g_type_check_instance_is_a(instance:pointer;iface_type:pointer):integer; begin _f_ := static function(instance:pointer;iface_type:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,iface_type); end {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; begin _f_ := static function(g:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(g); end procedure g_object_unref(g:pointer); begin _f_ := static procedure(g:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(g); end ////////////////////////scroll////////////////////////// function gtk_scrolled_window_new(hadjustment:pointer; vadjustment:pointer):pointer; begin _f_ := static function(hadjustment:pointer; vadjustment:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(hadjustment,vadjustment); end procedure gtk_scrolled_window_add_with_viewport(s:pointer;c:pointer); begin _f_ := static procedure(s:pointer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,c); end function gtk_scrolled_window_get_hscrollbar(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end function gtk_scrolled_window_get_vscrollbar(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end function gtk_scrolled_window_get_hadjustment(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end function gtk_scrolled_window_get_vadjustment(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end procedure gtk_scrolled_window_set_max_content_height(s:pointer;h:integer); begin _f_ := static procedure(s:pointer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,h); end procedure gtk_scrolled_window_set_min_content_height(s:pointer;h:integer); begin _f_ := static procedure(s:pointer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,h); end procedure gtk_scrolled_window_set_max_content_width(s:pointer;h:integer); begin _f_ := static procedure(s:pointer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,h); end procedure gtk_scrolled_window_set_policy(s:pointer;p:integer); begin _f_ := static procedure(s:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,p); end /////////////////////scrollable//////////////////////////// procedure gtk_scrollable_set_vscroll_policy(s:pointer;p:integer); begin _f_ := static procedure(s:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,p); end procedure gtk_scrollable_set_hscroll_policy(s:pointer;p:integer); begin _f_ := static procedure(s:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s,p); end function gtk_scrollable_get_hadjustment(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end function gtk_scrollable_get_vadjustment(s:pointer):pointer; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end //////////////gdk window /////// procedure gdk_window_show_unraised(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end ///////////////////////////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); begin _f_ := static procedure(d:pointer; screen:string;var x :integer;var Y:integer;msk:string); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d,screen,x,Y,msk); end function gdk_display_get_default():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_screen_get_default():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_display_get_default_seat(d:pointer):pointer; begin _f_ := static function(d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gdk_seat_get_pointer(dm:pointer):pointer; begin _f_ := static function(dm:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(dm); end procedure gdk_device_get_position(d:pointer;t:pointer;var x :integer;var y:integer); begin _f_ := static procedure(d:pointer;t:pointer;var x :integer;var y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d,t,x,y); end function gdk_event_get_scroll_deltas(d:pointer;var x :double;var y:double):integer; begin _f_ := static function(d:pointer;var x :double;var y:double):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d,x,y); end procedure gdk_window_get_position(w:pointer;var x:integer;var y:integer); begin _f_ := static procedure(w:pointer;var x:integer;var y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,x,y); end function gdk_screen_height():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_screen_width():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_event_get_event_type(e:pointer):integer; begin _f_ := static function(e:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e); end function gdk_cairo_get_clip_rectangle(cr:pointer;var rec:array of integer):integer; begin _f_ := static function(cr:pointer;var rec:array of integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,rec); end ////////////////////////// start //////////////////////////////////////// procedure gtk_init(argc:string;argcv:string); begin _f_ := static procedure(argc:string;argcv:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(argc,argcv); end procedure gtk_main (); begin _f_ := static procedure();cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end 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; begin _f_ := static function(f:pointer;d:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(f,d); end procedure gtk_main_quit(); begin _f_ := static procedure();cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end //////////////////////context/////////////////////////////// function gtk_widget_get_style_context(w:pointer):pointer; begin _f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end ////////////////////拖拽文件相关/////////////////////////////////////////// function gtk_drag_get_data(w:pointer;c:pointer;ls:pointer;tm:integer); begin _f_ := static procedure(w:pointer;c:pointer;ls:pointer;tm:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,c,ls,tm); end function gdk_drag_status(c:pointer;ac:integer;tm:integer); begin _f_ := static procedure(c:pointer;ac:integer;tm:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,ac,tm); end function gtk_drag_dest_set(w:pointer;flgs:integer;targets:pointer;ntg:integer;actions:integer):integer; begin _f_ := static procedure(w:pointer;flgs:integer;targets:pointer;ntg:integer;actions:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,flgs,targets,ntg,actions); end function gdk_drag_context_list_targets(c:pointerr); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end function gtk_selection_data_get_text(d:pointer); begin _f_ := static function(d:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gtk_selection_data_get_data_type(d:pointer); begin _f_ := static function(d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gdk_atom_name(a:pointer); begin _f_ := static function(d:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gtk_drag_dest_find_target(w:pointer;ctx:pointer;tglist:pointer); begin _f_ := static function(w:pointer;ctx:pointer;tglist:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,ctx,tglist); end function gtk_target_list_new(ntg):pointer; begin _f_ := static function(tg:pointer;ntg:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(0,0); end function gdk_window_get_pointer(w:pointer;var x:integer;var y:integer;var mask:pointer); begin _f_ := static function(d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gtk_selection_data_get_length(ntg):integer; begin _f_ := static function(ntg:pointer;):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(ntg); end function get_drage_file_names(w); begin global g_drage_file_file_names; r := g_drage_file_file_names; g_drage_file_file_names := array(); if not ifarray(r) then r := array(); return r; end function gtk_selection_data_get_uris(d); begin _f_ := static function(d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); r := ##_f_(d); rr := r; ret := array(); _tool := static new aefclassobj_(); while true do begin p1 := _tool.readptr(r); if not p1 then break; fi := _tool.readstr(p1); if not fi then continue; if pos("file://",fi) then begin ret[idx++] := fi[8:]; end r+=8; end g_strfreev(rr); return ret; end function gtk_target_entry_new(target,flags,info); begin _f_ := static function(target:string;flags:integer;info:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(target,flags,info); end function gtk_target_entry_free(tg:pointer); begin _f_ := static procedure(tg:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(tg); end function gtk_drag_finish(ctx,suc,del,tm); begin //return ; _f_ := static procedure(ctx:pointer;suc:integer;del:integer;tm:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(ctx,suc,del,tm); end function g_strfreev(uris); begin _f_ := static procedure(uris:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(uris); end /////////////////////////////////widget//////////////////////////////////// function gtk_widget_get_realized(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_set_events(w:pointer;f:integer); begin _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,f); end procedure gtk_widget_get_allocation(w:pointer;var rec:array of integer); begin _f_ := static procedure(w:pointer;var rec:array of integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,rec); end procedure gtk_widget_set_allocation(w:pointer; rec: array of integer); begin _f_ := static procedure(w:pointer; rec: array of integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,rec); end procedure gtk_widget_size_allocate(w:pointer; rec: array of integer); begin _f_ := static procedure(w:pointer; rec: array of integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,rec); end procedure gtk_widget_modify_text(w:pointer;t:integer;c:pointer); begin _f_ := static procedure(w:pointer;t:integer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,t,c); end procedure gtk_widget_set_tooltip_text(w:pointer;tip:string); begin _f_ := static procedure(w:pointer;tip:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,tip); end procedure gtk_widget_set_size_request(wd:pointer;h:integer;w:integer); begin _f_ := static procedure(wd:pointer;h:integer;w:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(wd,h,w); end procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer); begin _f_ := static procedure(wd:pointer;var h:integer;var w:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(wd,h,w); end procedure gtk_widget_set_app_paintable(w:pointer;f:integer); begin _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,f); end procedure gtk_widget_realize(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_queue_draw(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_queue_draw_area(w:pointer;x:integer;y:integer;wd:integer;ht:integer); begin _f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;ht:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,x,y,wd,ht); end function gtk_widget_get_margin_top(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end /////////////////////edit entry////////////////////////////////////////////////////// function gtk_entry_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_entry_get_text(w:pointer):string; begin _f_ := static function(w:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_entry_set_text(e:pointer;c:string); begin _f_ := static procedure(e:pointer;c:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,c); end function gtk_entry_get_text_length(e:pointer):short; begin _f_ := static function(e:pointer):short;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e); end procedure gtk_entry_set_visibility(e:pointer;v:integer); begin _f_ := static procedure(e:pointer;v:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,v); end procedure gtk_entry_set_width_chars(e:pointer;v:integer); begin _f_ := static procedure(e:pointer;v:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,v); end procedure gtk_entry_set_invisible_char(e:pointer;c:integer); begin _f_ := static procedure(e:pointer;c:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,c); end //procedure gtk_entry_set_editable(e:pointer;ed:integer);cdecl;external 'libgtk-3.so'; procedure gtk_editable_set_editable(e:pointer;ed:integer); begin _f_ := static procedure(e:pointer;ed:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,ed); end procedure gtk_entry_set_has_frame(e:pointer;s:integer); begin _f_ := static procedure(e:pointer;s:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,s); end procedure gtk_entry_set_max_length(e:pointer;len:integer); begin _f_ := static procedure(e:pointer;len:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(e,len); end /////////////////////text view memo ////////////////////////////////////////////////////// function gtk_text_view_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_text_view_set_wrap_mode(t:pointer;md:integer); begin _f_ := static procedure(t:pointer;md:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,md); end procedure gtk_text_view_set_buffer(t:pointer;bf:pointer); begin _f_ := static procedure(t:pointer;bf:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,bf); end function gtk_text_buffer_new(tagtable:pointer):pointer; begin _f_ := static function(tagtable:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(tagtable); end procedure gtk_text_buffer_get_iter_at_offset(bf:pointer;iter:pointer;offset:integer); begin _f_ := static procedure(bf:pointer;iter:pointer;offset:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(bf,iter,offset); end procedure gtk_text_buffer_insert(bf:pointer;iter:pointer;txt:string;len:integer); begin _f_ := static procedure(bf:pointer;iter:pointer;txt:string;len:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(bf,iter,txt,len); end procedure gtk_text_view_set_editable(t:pointer;e:integer); begin _f_ := static procedure(t:pointer;e:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,e); end procedure gtk_text_set_word_wrap(t:pointer;e:integer); begin _f_ := static procedure(t:pointer;e:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,e); end procedure gtk_text_buffer_get_end_iter(b:pointer;iter:pointer); begin _f_ := static procedure(b:pointer;iter:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b,iter); end procedure gtk_text_buffer_get_start_iter(b:pointer;iter:pointer); begin _f_ := static procedure(b:pointer;iter:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b,iter); end function gtk_text_buffer_get_char_count(b:pointer):integer; begin _f_ := static function(b:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b); end function gtk_text_buffer_get_line_count(b:pointer):integer; begin _f_ := static function(b:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b); end procedure gtk_text_buffer_delete(b:pointer;start:pointer;ed:pointer); begin _f_ := static procedure(b:pointer;start:pointer;ed:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b,start,ed); end function gtk_text_buffer_get_text(b:pointer;start:pointer;ed:pointer;ic:integer):string; begin _f_ := static function(b:pointer;start:pointer;ed:pointer;ic:integer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b,start,ed,ic); end function gtk_text_buffer_get_selection_bounds(b:pointer;st:pointer;ed:pointer):integer; begin _f_ := static function(b:pointer;st:pointer;ed:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(b,st,ed); end //////////////////////////////pango//////////////////////////////////////////// function pango_font_description_from_string(ns:string):pointer; begin _f_ := static function(ns:string):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(ns); end procedure pango_font_description_free(pg:pointer); begin _f_ := static procedure(pg:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(pg); end procedure pango_font_description_set_size(pg:pointer;sz:integer); begin _f_ := static procedure(pg:pointer;sz:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(pg,sz); end function pango_cairo_create_layout(c:pointer):pointer; begin _f_ := static function(c:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end function pango_cairo_create_context(c:pointer):pointer; begin _f_ := static function(c:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure pango_layout_set_width(p:pointer;w:integer); begin _f_ := static procedure(p:pointer;w:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,w); end function pango_layout_get_width(p:pointer):integer; begin _f_ := static function(p:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end procedure pango_layout_set_wrap(p:pointer;wp:integer); begin _f_ := static procedure(p:pointer;wp:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,wp); end procedure pango_layout_set_font_description(p:pointer;f:pointer); begin _f_ := static procedure(p:pointer;f:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,f); end procedure pango_layout_set_text(pl:pointer;s:string;len:integer); begin _f_ := static procedure(pl:pointer;s:string;len:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(pl,s,len); end procedure pango_cairo_show_layout(cr:pointer;pl:pointer); begin _f_ := static procedure(cr:pointer;pl:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,pl); end function pango_cairo_font_map_get_default():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure pango_font_map_list_families(fm:pointer;var fls:pointer;var n:integer); begin _f_ := static procedure(fm:pointer;var fls:pointer;var n:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(fm,fls,n); end function pango_font_family_get_name(n:pointer):string; begin _f_ := static function(n:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(n); end 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; begin _f_ := static function(s:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end procedure cairo_save(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_restore(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end function gdk_cairo_create(w:pointer):pointer; begin _f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function cairo_move_to(cr:pointer;x:double;y:double); begin _f_ := static function(cr:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,x,y); end function cairo_line_to(cr:pointer;x:double;y:double); begin _f_ := static function(cr:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,x,y); end procedure cairo_set_source(cr:pointer;s:pointer); begin _f_ := static procedure(cr:pointer;s:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,s); end function cairo_get_source(cr:pointer):pointer; begin _f_ := static function(cr:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr); end procedure cairo_curve_to(cr:pointer;x1:double;y1:double;x2:double;y2:double;x3:double;y3:double); begin _f_ := static procedure(cr:pointer;x1:double;y1:double;x2:double;y2:double;x3:double;y3:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,x1,y1,x2,y2,x3,y3); end procedure cairo_rectangle(c:pointer;x:double;y:double;w:double;h:double); begin _f_ := static procedure(c:pointer;x:double;y:double;w:double;h:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x,y,w,h); end procedure cairo_set_source_rgba(c:pointer;red:double;green:double;blue:double;alpha:double); begin _f_ := static procedure(c:pointer;red:double;green:double;blue:double;alpha:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,red,green,blue,alpha); end procedure cairo_set_source_rgb(c:pointer;r:double;g:double;b:double); begin _f_ := static procedure(c:pointer;r:double;g:double;b:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,r,g,b); end procedure cairo_set_line_width(c:pointer;w:double); begin _f_ := static procedure(c:pointer;w:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,w); end function cairo_get_line_width(c:pointer):double; begin _f_ := static function(c:pointer):double;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_set_line_cap(c:pointer;cp:integer); begin _f_ := static procedure(c:pointer;cp:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,cp); end function cairo_get_line_cap(c:pointer):integer; begin _f_ := static function(c:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_set_line_join(c:pointer;t:integer); begin _f_ := static procedure(c:pointer;t:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,t); end function cairo_get_line_join(c:pointer):integer; begin _f_ := static function(c:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end //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); begin _f_ := static procedure(cr:pointer; xc:double;yc:double;radius:double;angle1:double;angle2:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,xc,yc,radius,angle1,angle2); end procedure cairo_translate(cr:pointer;tx:double;ty:double); begin _f_ := static procedure(cr:pointer;tx:double;ty:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,tx,ty); end procedure cairo_rotate(cr:pointer;angle:double); begin _f_ := static procedure(cr:pointer;angle:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,angle); end procedure cairo_scale(cr:pointer;sx:double;sy:double); begin _f_ := static procedure(cr:pointer;sx:double;sy:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,sx,sy); end procedure cairo_set_operator(c:pointer;op:integer); begin _f_ := static procedure(c:pointer;op:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,op); end function cairo_get_operator(c:pointer):integer; begin _f_ := static function(c:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_set_tolerance(c:pointer;tol:double); begin _f_ := static procedure(c:pointer;tol:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,tol); end function cairo_get_tolerance(c:pointer):double; begin _f_ := static function(c:pointer):double;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_destroy(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_close_path(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_set_fill_rule(c:pointer;rul:integer); begin _f_ := static procedure(c:pointer;rul:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,rul); end procedure cairo_clip(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_clip_preserve(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_clip_extents(c:pointer;var x1:double;var y1:double;var x2:double;var y2:double); begin _f_ := static procedure(c:pointer;var x1:double;var y1:double;var x2:double;var y2:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x1,y1,x2,y2); end function cairo_in_clip(c:pointer;x:double;y:double); begin _f_ := static function(c:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x,y); end procedure cairo_reset_clip(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_stroke(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_stroke_preserve(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_set_dash(c:pointer;dash:array of double;num_dash:integer;offset:double); begin _f_ := static procedure(c:pointer;dash:array of double;num_dash:integer;offset:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,dash,num_dash,offset); end procedure cairo_fill(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_fill_preserve(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure cairo_fill_extents(c:pointer;x1:double;y1:double;x2:double;y2:double); begin _f_ := static procedure(c:pointer;x1:double;y1:double;x2:double;y2:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,x1,y1,x2,y2); end procedure cairo_paint_with_alpha(c:pointer;alpah:double); begin _f_ := static procedure(c:pointer;alpah:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,alpah); end procedure cairo_paint(c:pointer); begin _f_ := static procedure(c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end 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); begin _f_ := static procedure(c:pointer;t:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,t); end procedure cairo_select_font_face(cr:pointer;n:string;slat:integer;weight:integer); begin _f_ := static procedure(cr:pointer;n:string;slat:integer;weight:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,n,slat,weight); end procedure cairo_set_font_size(cr:pointer;sz:double); begin _f_ := static procedure(cr:pointer;sz:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,sz); end procedure cairo_text_extents(cr:pointer;s:string;ext:pointer); begin _f_ := static procedure(cr:pointer;s:string;ext:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,s,ext); end procedure cairo_font_extents(cr:pointer;ext:pointer); begin _f_ := static procedure(cr:pointer;ext:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,ext); end procedure cairo_get_font_options(cr:pointer;ft:pointer); begin _f_ := static procedure(cr:pointer;ft:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,ft); end procedure cairo_set_font_options(cr:pointer;ft:pointer); begin _f_ := static procedure(cr:pointer;ft:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,ft); end function cairo_font_options_create():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure cairo_font_options_destroy(op:pointer); begin _f_ := static procedure(op:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(op); end ////////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; begin _f_ := static function(t:integer;w:integer;h:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,w,h); end function cairo_image_surface_create_from_png(f:string):pointer; begin _f_ := static function(f:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(f); end function cairo_image_surface_get_width(sf:pointer):integer; begin _f_ := static function(sf:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(sf); end function cairo_image_surface_get_height(sf:pointer):integer; begin _f_ := static function(sf:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(sf); end procedure cairo_surface_destroy(sf:pointer); begin _f_ := static procedure(sf:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(sf); end procedure cairo_set_source_surface(cr:pointer;sf:pointer;x:double;y:double); begin _f_ := static procedure(cr:pointer;sf:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cr,sf,x,y); end procedure cairo_pattern_set_extend(c:pointer;pe:integer); begin _f_ := static procedure(c:pointer;pe:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,pe); end function cairo_pattern_create_linear(x0:double;y0:double;x1:double;y1:double):pointer; begin _f_ := static function(x0:double;y0:double;x1:double;y1:double):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(x0,y0,x1,y1); end procedure cairo_pattern_add_color_stop_rgb(c:pointer;offset:double;r:double;g:double;b:double;a:double); begin _f_ := static procedure(c:pointer;offset:double;r:double;g:double;b:double;a:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,offset,r,g,b,a); end /////////////////////////window////////// function gtk_window_list_toplevels():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gdk_window_move_resize(w:pointer;x:integer;y:integer;wd:integer;h:integer); begin _f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,x,y,wd,h); end procedure gdk_window_resize(w:pointer;wd:integer;h:integer); begin _f_ := static procedure(w:pointer;wd:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,wd,h); end procedure gtk_window_begin_move_drag(w:pointer;btn:integer;x:integer;y:integer;t:integer); begin _f_ := static procedure(w:pointer;btn:integer;x:integer;y:integer;t:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,btn,x,y,t); end procedure gtk_window_begin_resize_drag(w:pointer;e:integer;btn:integer;x:integer;y:integer;t:integer); begin _f_ := static procedure(w:pointer;e:integer;btn:integer;x:integer;y:integer;t:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,e,btn,x,y,t); end function gtk_widget_get_toplevel(w:pointer):pointer; begin _f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end /////////// modal //////////////////////////////// function gtk_window_is_active(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_window_present(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_window_activate_default(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_window_activate_focus(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function gtk_window_has_toplevel_focus(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_window_set_modal(w:pointer;f:integer); begin _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,f); end procedure gtk_window_set_transient_for(w:pointer;p:pointer); begin _f_ := static procedure(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); end function gtk_window_get_transient_for(w:pointer); begin _f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); end procedure gtk_window_get_size(wd:pointer;var h:integer;var w:integer); begin _f_ := static procedure(wd:pointer;var h:integer;var w:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(wd,h,w); end procedure gtk_window_set_icon(w:pointer;ico:pointer); begin _f_ := static procedure(w:pointer;ico:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,ico); end procedure gtk_window_set_position(wd:pointer;ps:integer); begin _f_ := static procedure(w:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(wd,ps); end procedure gtk_window_set_resizable(p:pointer;f:integer); begin _f_ := static procedure(p:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,f); end function gtk_window_get_resizable(p:pointer):integer; begin _f_ := static function(p:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end procedure gtk_window_set_decorated(w:pointer;f:integer); begin _f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,f); end function gtk_window_get_decorated(w:pointer):integer; begin _f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_window_set_title(w:pointer;t:string); begin _f_ := static procedure(w:pointer;t:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,t); end procedure gtk_window_set_geometry_hints (window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer); begin _f_ := static procedure(window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window,eometry_widget,geometry,geom_mask); end procedure gtk_window_resize(w:pointer;wd:integer;ht:integer); begin _f_ := static procedure(w:pointer;wd:integer;ht:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,wd,ht); end procedure gtk_window_resize_to_geometry(w:pointer;wd:integer;ht:integer); begin _f_ := static procedure(w:pointer;wd:integer;ht:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,wd,ht); end procedure gtk_window_move(w:pointer;x:integer;y:integer); begin _f_ := static procedure(w:pointer;x:integer;y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,x,y); end ////////////////////// container layout fixed ////////////////////// procedure gtk_container_add(c1:pointer;c2:pointer); begin _f_ := static procedure(c1:pointer;c2:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c1,c2); end procedure gtk_container_remove(c:pointer;w:pointer); begin _f_ := static procedure(c:pointer;w:pointer); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c,w); end procedure gtk_container_set_border_width (container:pointer;border_width:integer); begin _f_ := static procedure(container:pointer;border_width:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(container,border_width); end function gtk_fixed_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_layout_new(h:pointer;v:pointer):pointer; begin _f_ := static function(h:pointer;v:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(h,v); end procedure gtk_layout_get_size(layout:pointer;var width:integer;var height:integer); begin _f_ := static procedure(layout:pointer;var width:integer;var height:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(layout,width,height); end procedure gtk_layout_set_size(layout:pointer; width:integer; height:integer); begin _f_ := static procedure(layout:pointer; width:integer; height:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(layout,width,height); end procedure gtk_fixed_put(fixed:pointer;widget:pointer;x:integer;y:integer); begin _f_ := static procedure(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(fixed,widget,x,y); end procedure gtk_layout_put(fixed:pointer;widget:pointer;x:integer;y:integer); begin _f_ := static procedure(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(fixed,widget,x,y); end function gtk_layout_get_bin_window(l:pointer):pointer; begin _f_ := static function(l:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(l); end //////////////////////////// box ///////////////////////// function gtk_vbox_new(homogeneous:integer;spacing:integer):pointer; begin _f_ := static function(homogeneous:integer;spacing:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(homogeneous,spacing); end function gtk_hbox_new(homogeneous:integer;spacing:integer):pointer; begin _f_ := static function(homogeneous:integer;spacing:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(homogeneous,spacing); end procedure gtk_box_pack_end(box:pointer;w:pointer;expand:integer;f:integer;pad:integer); begin _f_ := static procedure(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(box,w,expand,f,pad); end procedure gtk_box_pack_start(box:pointer;w:pointer;expand:integer;f:integer;pad:integer); begin _f_ := static procedure(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(box,w,expand,f,pad); end //////////////////////////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; begin _f_ := static function(m:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(m); end function gtk_menu_bar_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_menu_shell_append(mb:pointer;mi:pointer); begin _f_ := static procedure(mb:pointer;mi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mb,mi); end procedure gtk_menu_shell_prepend(mb:pointer;mi:pointer); begin _f_ := static procedure(mb:pointer;mi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mb,mi); end procedure gtk_menu_shell_insert(mb:pointer;mi:pointer;idx:integer); begin _f_ := static procedure(mb:pointer;mi:pointer;idx:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mb,mi,idx); end function gtk_menu_item_new_with_label(s:string):pointer; begin _f_ := static function(s:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end function gtk_menu_item_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_menu_item_set_submenu(mb:pointer;mi:pointer); begin _f_ := static procedure(mb:pointer;mi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mb,mi); end procedure gtk_menu_item_set_use_underline(mi:pointer;l:integer); begin _f_ := static procedure(mi:pointer;l:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi,l); end function gtk_separator_menu_item_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_menu_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_menu_item_select(mi:pointer); begin _f_ := static procedure(mi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi); end function gtk_check_menu_item_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_check_menu_item_new_with_label(s:string):pointer; begin _f_ := static function(s:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(s); end procedure gtk_check_menu_item_set_active(cmi:pointer;ck:integer); begin _f_ := static procedure(cmi:pointer;ck:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cmi,ck); end function gtk_check_menu_item_get_active(cmi:pointer):integer; begin _f_ := static function(cmi:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cmi); end procedure gtk_check_menu_item_toggled(cmi:pointer); begin _f_ := static procedure(cmi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cmi); end function gtk_menu_item_get_label(mi:pointer):string; begin _f_ := static function(mi:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi); end procedure gtk_menu_item_set_label(mi:pointer;l:string); begin _f_ := static procedure(mi:pointer;l:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi,l); end procedure gtk_menu_set_title(mi:pointer;l:string); begin _f_ := static procedure(mi:pointer;l:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi,l); end procedure gtk_menu_reorder_child(mb:pointer;mi:pointer;id:integer); begin _f_ := static procedure(mb:pointer;mi:pointer;id:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mb,mi,id); end procedure gtk_menu_popup (menu:pointer;parent_menu_shell:pointer;parent_menu_item:pointer;func:pointer;data:pointer;button:integer;activate_time:integer); begin _f_ := static procedure(menu:pointer;parent_menu_shell:pointer;parent_menu_item:pointer;func:pointer;data:pointer;button:integer;activate_time:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(menu,parent_menu_shell,parent_menu_item,func,data,button,activate_time); end procedure popup_at_rect(menu:pointer;rect_window:pointer;var rect : array of integer;rect_anchor:pointer;menu_anchor:pointer;trigger_event:pointer); begin _f_ := static procedure(menu:pointer;rect_window:pointer;var rect : array of integer;rect_anchor:pointer;menu_anchor:pointer;trigger_event:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(menu,rect_window,rect,rect_anchor,menu_anchor,trigger_event); end procedure gtk_menu_item_activate(mi:pointer); begin _f_ := static procedure(mi:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(mi); end /////////////////////////// adjust scroll ///////////////////////////////// function gtk_adjustment_get_type():pointer; begin _f_ := static function():pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end 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; begin _f_ := static function(v:double;lower:double;upper:double;step_increment:double;page_increment:double;page_size:double):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(v,lower,upper,step_increment,page_increment,page_size); end function gtk_adjustment_get_value(adj:pointer):double; begin _f_ := static function(adj:pointer):double; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end procedure gtk_adjustment_set_value(adj:pointer;v:double); begin _f_ := static procedure(adj:pointer;v:double); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj,v); end procedure gtk_adjustment_set_page_size(adj:pointer;v:double); begin _f_ := static procedure(adj:pointer;v:double); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj,v); end procedure gtk_adjustment_changed(adj:pointer); begin _f_ := static procedure(adj:pointer); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end procedure gtk_adjustment_value_changed(adj:pointer); begin _f_ := static procedure(adj:pointer); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end procedure gtk_adjustment_set_lower(adj:pointer;v:double); begin _f_ := static procedure(adj:pointer;v:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj,v); end procedure gtk_adjustment_set_upper(adj:pointer;v:double); begin _f_ := static procedure(adj:pointer;v:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj,v); end function gtk_adjustment_get_upper(adj:pointer):double; begin _f_ := static function(adj:pointer):double;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end function gtk_adjustment_get_lower(adj:pointer):double; begin _f_ := static function(adj:pointer):double;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end function gtk_hscrollbar_new(adj:pointer):pointer; begin _f_ := static function(adj:pointer):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end function gtk_vscrollbar_new(adj:pointer):pointer; begin _f_ := static function(adj:pointer):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj); end procedure gtk_adjustment_configure(adj:pointer;v:double;lower:double;upper:double;step_increment:double;page_increment:double;page_size:double); begin _f_ := static procedure(adj:pointer;v:double;lower:double;upper:double;step_increment:double;page_increment:double;page_size:double);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(adj,v,lower,upper,step_increment,page_increment,page_size); end //////////////////////////////////////////////////// function gtk_frame_new(lbl:string):pointer; begin _f_ := static function(lbl:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(lbl); end function gtk_calendar_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end ///////////////////////////////// function gtk_spinner_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_spinner_start(spn:pointer); begin _f_ := static procedure(spn:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(spn); end procedure gtk_spinner_stop(spn:pointer); begin _f_ := static procedure(spn:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(spn); end /////////////////////////////// // 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; begin _f_ := static function(t:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t); end procedure gtk_misc_set_padding (misc:pointer;x:integer;y:integer); begin _f_ := static procedure (misc:pointer;x:integer;y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(misc,x,y); end // 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); begin _f_ := static function(c:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end // 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; begin _f_ := static function(d:pointer):integer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end procedure gtk_dialog_response(w:pointer;id:integer); begin _f_ := static procedure(w:pointer;id:integer); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,id); end function gtk_file_chooser_dialog_new(t:string;p:pointer;act:integer;bstring1:string;bvalue1:integer;bstring2:string;bvalue2:integer;pend:pointer):pointer ; begin _f_ := static function(t:string;p:pointer;act:integer;bstring1:string;bvalue1:integer;bstring2:string;bvalue2:integer;pend:pointer):pointer ; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,p,act,bstring1,bvalue1,bstring2,bvalue2,pend); end function gtk_file_chooser_get_filename(p:pointer):string; begin _f_ := static function(p:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end function gtk_file_chooser_set_filename(p:pointer;n:string):integer; begin _f_ := static function(p:pointer;n:string):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,n); end procedure gtk_file_chooser_set_select_multiple(p:pointer;m:integer); begin _f_ := static procedure(p:pointer;m:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,m); end function gtk_file_chooser_get_filenames(p:pointer):pointer ; begin _f_ := static function(p:pointer):pointer ;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end function gtk_font_chooser_dialog_new(t:string;p:pointer):pointer; begin _f_ := static function(t:string;p:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t,p); end function gtk_font_selection_dialog_new(t:string):pointer; begin _f_ := static function(t:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(t); end function gtk_font_selection_dialog_get_font_name(d:pointer):string; begin _f_ := static function(d:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gtk_font_selection_dialog_get_preview_text(p:pointer):string; begin _f_ := static function(p:pointer):string;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p); end procedure gtk_font_selection_dialog_set_preview_text(p:pointer;t:string); begin _f_ := static procedure(p:pointer;t:string); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,t); end function gtk_font_selection_dialog_set_font_name(p:pointer;f:string):integer; begin _f_ := static function(p:pointer;f:string):integer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(p,f); end procedure gtk_widget_modify_font(w:pointer;p:pointer); begin _f_ := static procedure(w:pointer;p:pointer); cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); end function gtk_color_selection_dialog_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_color_selection_set_current_color(w:pointer;c:pointer); begin _f_ := static procedure(w:pointer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,c); end procedure gtk_color_selection_get_current_color(w:pointer;c:pointer); begin _f_ := static procedure(w:pointer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,c); end function gdk_color_parse(cs:string;c:pointer):integer; begin _f_ := static function(cs:string;c:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(cs,c); end ////////////////// evntbox //////////////////////////// function gtk_event_box_new():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end //获得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); begin _f_ := static procedure(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); end procedure gtk_widget_get_parent_window(w:pointer;p:pointer); begin _f_ := static procedure(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); end function gtk_widget_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure gtk_widget_modify_bg(w:pointer;tyle:integer;c:pointer); begin _f_ := static procedure(w:pointer;tyle:integer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,tyle,c); end procedure gtk_layout_move(l:pointer;w:pointer;x:integer;y:integer); begin _f_ := static procedure(l:pointer;w:pointer;x:integer;y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(l,w,x,y); end procedure gtk_grab_add(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end procedure gtk_widget_destroy(w:pointer); begin _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end function g_thread_self():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_get_major_version ():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_get_micro_version ():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_get_binary_age ():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_main_context_default():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_main_context_pending(gc:pointer):integer; begin _f_ := static function(gc:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gc); end function g_main_context_iteration(gc:pointer;bk:integer):integer; begin _f_ := static function(gc:pointer;bk:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(gc,bk); end function g_main_context_get_poll_func(d:pointer):pointer; begin _f_ := static function(d:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(d); end function gtk_main_level():integer; begin _f_ := static function():integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):integer; begin _f_ := static function(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,detailed_signal,c_handler,data,dd,f); end 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; begin _f_ := static function(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 getfuncptrbyname(0,functionname()); return ##_f_(signal_name,itype,signal_flags,class_offset,accumulator,accu_data,c_marshaller,return_type,n_params,p1,p2); end procedure g_signal_emit_by_name(w:pointer;n:string;p1:pointer;p2:pointer); begin _f_ := static procedure(w:pointer;n:string;p1:pointer;p2:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,n,p1,p2); end function gtk_container_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gtk_window_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_window_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_type_check_instance_cast(instance:pointer;ty:pointer):pointer; begin _f_ := static function(instance:pointer;ty:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,ty); end function gtk_window_new(lev:integer):pointer; begin _f_ := static function(lev:integer):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(lev); end procedure gdk_window_set_back_pixmap(window:pointer;pixmap:pointer;parent_relative:integer); begin _f_ := static procedure(window:pointer;pixmap:pointer;parent_relative:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window,pixmap,parent_relative); end procedure gdk_pixbuf_ref(pixbuf:pointer); begin _f_ := static procedure(pixbuf:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(pixbuf); end procedure gdk_pixbuf_unref(pixbuf:pointer); begin _f_ := static procedure(pixbuf:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(pixbuf); end function gdk_cursor_new(c:integer):pointer; begin _f_ := static function(c:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(c); end procedure gdk_window_set_cursor(w:pointer;c:pointer); begin _f_ := static procedure(w:pointer;c:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,c); end function gtk_widget_get_window(g:pointer):pointer; begin _f_ := static function(g:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(g); end procedure gtk_window_get_position(g:pointer;var x:integer;var y:integer); begin _f_ := static procedure(g:pointer;var x:integer;var y:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(g,x,y); end function gtk_image_new_from_file(f:string):pointer; begin _f_ := static function(f:string):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(f); end procedure gtk_widget_show_all(window:pointer); begin _f_ := static procedure(window:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window); end procedure gtk_window_maximize(window:pointer); begin _f_ := static procedure(window:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window); end procedure gtk_widget_show(window:pointer); begin _f_ := static procedure(window:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window); end procedure gtk_widget_show_now(window:pointer); begin _f_ := static procedure(window:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window); end procedure gtk_widget_hide(window:pointer); begin _f_ := static procedure(window:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window); end //-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); begin _f_ := static procedure(img:pointer;filename:string);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(img,filename); end function gtk_image_new_from_pixbuf(image:pointer):pointer; begin _f_ := static function(image:pointer):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(image); end function gtk_image_new():pointer; begin _f_ := static function():pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function gdk_pixbuf_get_width(src_pixbuf:pointer):integer; begin _f_ := static function(src_pixbuf:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(src_pixbuf); end function gdk_pixbuf_get_height(src_pixbuf:pointer):integer; begin _f_ := static function(src_pixbuf:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(src_pixbuf); end ////////////////////libc//////////////////////////////// function popen(e:string;f:string):pointer; begin _f_ := static function(e:string;f:string):pointer;cdecl;external getfuncptrbyname("libc",functionname()); return ##_f_(e,f); end function pclose(p:pointer):integer; begin _f_ := static function(p:pointer):integer;cdecl;external getfuncptrbyname("libc",functionname()); return ##_f_(p); end function fgets(var e:string;f:integer;ptr:pointer):pointer; begin _f_ := static function(var e:string;f:integer;ptr:pointer):pointer;cdecl;external getfuncptrbyname("libc",functionname()); return ##_f_(e,f,ptr); end function exec_command_line(cmd) //执行linux命令 begin len := 1024; buf_ps := ""; setlength(buf_ps,len); result := ""; ptr:=popen(cmd, "r"); if((ptr)<>0) then begin while(fgets(buf_ps, len-1, ptr)<>0) do begin for i:= 1 to len-1 do begin vi := buf_ps[i]; if vi="\0" then begin break; end end if i>1 then result += buf_ps[1:(i-1)]; end pclose(ptr); end return result; end function get_proc_comand(); //获得进程命令行 begin tempdir := sysgetenv("HOME")+"/.tslvcl/proc/"+inttostr(datetoint(date()))+"-"+inttostr(integer(time()*24*60*60)); f := tempdir+"/1.txt"; CreateDirWithFileName(f); dir := %% /proc/%%; d := filelist("",dir+"*"); f2b := tempdir+"/"; r := array(); for i,v in d do begin n := v["FileName"]; if n="." or n=".." then continue; f := dir+n+"/cmdline"; if not fileexists("",f) then continue; //sz := filesize("",f); f2 := f2b+n; filecopy("",f,"",f2); ri := readfile(rwraw(),"",f2,0,filesize("",f2),fd); if ri=1 and fd then begin r[n] := replacetext(fd,"\0"," "); end end return r; end 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 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 MouseIsMoved(ptr:pointer):integer;cdecl; begin if FTimer._getvalue_(0)=0 then return 0; if FLock then return 1; id := FList[FIndex]; if not id then return 1; ps := array(0,0); _wapi.GetCursorPos(ps); if FCpos = ps then return 1; FCpos := ps; if Mousehittest then call(Mousehittest,self,id); if Mousemovecall then call(Mousemovecall,self,id); return 1; end function create(api); begin _wapi := api; FCpos := array(0,0); _wapi.GetCursorPos(FCpos); FList := array(); FIndex := -1; Fscrolltimedo := makeinstance(thisfunction(MouseIsMoved)); FTimer:= new ttmstruct(nil); rt := _wapi.g_timeout_add(30,Fscrolltimedo,FTimer._getptr_() ); //30毫秒 FTimer._setvalue_(0,rt); end function destroy(); begin FIndex := -1; FList := array(); if FTimer then begin FTimer._setvalue_(0,0); //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 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; begin _f_ := static function(w:pointer):integegr;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end 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; function gtk_widget_get_type():pointer; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end procedure g_signal_handler_disconnect(instance:pointer;id:integer); begin _f_ := static procedure(instance:pointer;id:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,id); end function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer; begin _f_ := static function(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,detailed_signal,c_handler,data,dd,f); end 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; begin _f_ := static function(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 getfuncptrbyname(0,functionname()); return ##_f_(signal_name,itype,signal_flags,class_offset,accumulator,accu_data,c_marshaller,return_type,n_params,p1,p2); end 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 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; if (dwExStyle .& _const.WS_EX_ACCEPTFILES)>0 then begin ftarget := _wapi.gtk_target_entry_new("text/uri-list",4,1); wg := _wapi.GTK_WIDGET(h); _wapi.gtk_drag_dest_set(wg,GTK_DEST_DEFAULT_DROP,ftarget,1,GDK_ACTION_COPY); _wapi.g_signal_connect_data(wg,"drag-motion",get_instance_i(thisfunction(do_motion)),0,0); _wapi.g_signal_connect_data(wg,"drag-data-received",get_instance_i(thisfunction(do_received)),0,0); _wapi.g_signal_connect_data(wg,"drag-drop",get_instance_i(thisfunction(do_drop)),0,0); end return inherited; end procedure do_drop(w:pointer;ctx:pointer;x:integer;y:integer;tm:integer);cdecl; begin return true; end procedure do_received(w:pointer;ctx:pointer;x:integer;y:integer;d:pointer;info:integer;tm:integer);cdecl; begin global g_drage_file_file_names; g_drage_file_file_names := _wapi.gtk_selection_data_get_uris(d); _wapi.gtk_drag_finish(ctx,true,true,tm); AddMessageToGtkMessageQueue(w,_const.WM_DROPFILES,d,tm); end function do_motion(w:pointer;c:pointer;x:integer;y:integer;tm:integer;d:pointer):bool;cdecl; begin _wapi.gdk_drag_status(c,GDK_ACTION_COPY,tm); return true; 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))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 ftarget ; 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; get_instance_u(thisfunction(do_motion)); get_instance_u(thisfunction(do_received)); get_instance_u(thisfunction(do_drop)); FHadjustment := nil; Fvadjustment := nil; FHscrollbar := nil; Fvscrollbar := nil; FLayouter := nil; Fvscrollbarobj := nil; Fhscrollbarobj := nil; FClientWideget := nil; if ftarget then begin _wapi.gtk_target_entry_free(ftarget); ftarget := nil; end 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; begin _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(); end function g_main_context_ref(m:pointer):pointer; begin _f_ := static function(m:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(m); end function g_main_context_acquire(m:pointer):integer; begin _f_ := static function(m:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(m); end procedure g_main_context_release(m:pointer); begin _f_ := static procedure(m:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(m); end 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 FCurrent100 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 idx0)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(30); //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 const GDK_DELETE=0; static const GDK_DESTROY=1; static const GDK_EXPOSE=2; static const GDK_MOTION_NOTIFY=3; static const GDK_BUTTON_PRESS=4; static const GDK_2BUTTON_PRESS=5; static const GDK_3BUTTON_PRESS=6; static const GDK_BUTTON_RELEASE=7; static const GDK_KEY_PRESS=8; static const GDK_KEY_RELEASE=9; static const GDK_ENTER_NOTIFY=10; static const GDK_LEAVE_NOTIFY=11; static const GDK_FOCUS_CHANGE=12; static const GDK_CONFIGURE=13; static const GDK_MAP=14; static const GDK_UNMAP=15; static const GDK_PROPERTY_NOTIFY=16; static const GDK_SELECTION_CLEAR=17; static const GDK_SELECTION_REQUEST=18; static const GDK_SELECTION_NOTIFY=19; static const GDK_PROXIMITY_IN=20; static const GDK_PROXIMITY_OUT=21; static const GDK_DRAG_ENTER=22; static const GDK_DRAG_LEAVE=23; static const GDK_DRAG_MOTION=24; static const GDK_DRAG_STATUS=25; static const GDK_DROP_START=26; static const GDK_DROP_FINISHED=27; static const GDK_CLIENT_EVENT=28; static const GDK_VISIBILITY_NOTIFY=29; static const GDK_NO_EXPOSE=30; static const GDK_SCROLL=31; static const GDK_WINDOW_STATE=32; static const GDK_SETTING=33; static const GDK_OWNER_CHANGE=34; static const GDK_GRAB_BROKEN=35; static const GDK_DAMAGE=36; static const GDK_NOTHING=-1; static const GTK_RESPONSE_HELP=-11; static const GTK_RESPONSE_APPLY=-10; static const GTK_RESPONSE_NO=-9; static const GTK_RESPONSE_YES=-8; static const GTK_RESPONSE_CLOSE=-7; static const GTK_RESPONSE_CANCEL=-6; static const GTK_RESPONSE_OK=-5; static const GTK_RESPONSE_DELETE_EVENT=-4; static const GTK_RESPONSE_ACCEPT=-3; static const GTK_RESPONSE_REJECT=-2; static const GTK_RESPONSE_NONE=-1; static const GTK_TARGET_SAME_APP =1; static const GTK_TARGET_SAME_WIDGET =2; static const GTK_TARGET_OTHER_APP =4; static const GTK_TARGET_OTHER_WIDGET =8; static const GDK_ACTION_DEFAULT =1; static const GDK_ACTION_COPY =2; static const GDK_ACTION_MOVE =4; static const GDK_ACTION_LINK =8; static const GDK_ACTION_PRIVATE =16; static const GDK_ACTION_ASK =32; static const GTK_DEST_DEFAULT_MOTION =1; static const GTK_DEST_DEFAULT_HIGHLIGHT =2; static const GTK_DEST_DEFAULT_DROP =4; static const GTK_DEST_DEFAULT_ALL =7; 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; begin _f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(argc,argcv); end function igtk(); begin global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable,g_gtk_call_handler_manager,g_gtk_font_get_size; g_gtk_font_get_size := array(); 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 get_instance_i(fn); begin global g_gtk_call_handler_manager; if not g_gtk_call_handler_manager then return 0; mgnr := g_gtk_call_handler_manager; return mgnr.get(fn); end function get_instance_u(fn); begin global g_gtk_call_handler_manager; if not g_gtk_call_handler_manager then return 0; mgnr := g_gtk_call_handler_manager; return mgnr.del(fn); 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 function getfuncptrbyname(lib,n); begin case lib of "libc": begin return getdlsymaddress("libc.so.6",n); end "gtk": begin end else return getdlsymaddress("libgtk-3.so.0",n); end end initialization igtk(); finalization ugtk(); end.