tslediter/funcext/tvclib/ugtkinterface.tsf

4397 lines
176 KiB
Plaintext

unit ugtkinterface;
interface
{
20220128-0900 稳定接口
20210902-0308 稍微整理
}
uses cstructurelib;
function _gtkeventcall_();//gtk消息分发
function _gtkidledo_(); //gtk idle消息分发
function _gtk_add_time_msg_(h,m,w,l);
function GetGtkEventNameOrId(n); //gtk 事件名称
function AddMessageToGtkMessageQueue(FHandle,msg,wparam,lparam,d);//添加事件
function FeachMessageFromGtkMessageQueue();//获取最后的事件
function clearMessageFromGtkMessageQueue(h,m);//清除消息
function hasMessageFromGtkMessageQueue(h,m);//是否存在消息
type TGtkList = class( _gslist) //gtk链表类
function create(ptr);
begin
inherited;
end
end
type tgtkeventobject =class(tgtk_ctl_object) //gtk对象消息类(测试用)
function create(h);
begin
inherited;
end
end
type tmenuitemobject = class(tgtk_ctl_object) //gtk菜单对象类
function create(h);
begin
inherited;
Connect("activate",thisfunction(mactivate));
Connect("destroy",thisfunction(mdestroy));
end
lpmii;
function mactivate();
begin
h := handle;
mid := _wapi.g_object_get_data(h,"menuid");
if mid then
begin
while h do
begin
hwd := _Wapi.g_object_get_data(h,"popmenubarwindow");
if hwd then
begin
r := _wapi.gtk_postmessagea(hwd,_const.WM_COMMAND,makelong(mid,0),0,0);
_wapi.g_object_set_data(h,"popmenubarwindow",0);
return r;
end
hwd := _wapi.g_object_get_data(h,"menubarwindow");
if hwd then //主菜单
begin
//echo "\r\n============hwd is find\r\n";
r := _wapi.gtk_postmessagea(hwd,_const.WM_COMMAND,makelong(mid,0),0,0);
//echo "send main menu command:";
return r;
end
h := _wapi.g_object_get_data(h,"pmenu");
end
end
end
function mdestroy();
begin
//echo "\r\nmenu destroyed";
end
end
type tgtkapis = class() //gtk对象api接口
function gtk_rgb_color_rgb(c,r,g,b);
begin
if not ifnumber(c) then return 0;
r := getrvalue(c)/0xff;
g := getgvalue(c)/0xff;
b := getbvalue(c)/0xff ;
return true;
end
class function gtk_object_set_data(h,n,v); //保存数据
begin
if not(h>0 or h<0) then return 0;
global gtk_object_data_values_global;
if not ifarray(gtk_object_data_values_global) then gtk_object_data_values_global := array();
if ifnil(n) then reindex(gtk_object_data_values_global,array(inttostr(h):nil));
else
if ifarray(n) then
begin
gtk_object_data_values_global[inttostr(h)] := n;
end else
gtk_object_data_values_global[inttostr(h),n] := v;
//echo tostn(gtk_object_data_values_global);
end
class function gtk_object_get_data(h,n); //获得数据
begin
if not(h>0 or h<0) then return 0;
global gtk_object_data_values_global;
if not ifarray(gtk_object_data_values_global) then return 0;
if ifnil(n) then
begin
r := gtk_object_data_values_global[inttostr(h)];
if not ifarray(r) then r := array();
return r;
end
r := gtk_object_data_values_global[inttostr(h),n];
if ifnil(r) then return 0;
return r;
end
function gtk_SetMenuItemInfoA(hMenu,uitem,fbyposition,lpmii); //菜单操作
begin
//return ;
_const := GetWin32Const();
it := gtk_menu_shell_get_by_positon(hMenu,uitem);
if not it then return 0;
lpm := new tmenuStruct(lpmii);
msk := lpm.fmask;
st := lpm.fstate;
ss := " ";
needset := false;
if (msk .& _const.MIIM_STRING)=_const.MIIM_STRING then
begin
c := lpm.getdwtypedata();
gtk_object_set_data(it,"caption",c);
needset := true;
end
if _const.MIIM_STATE =(msk .& _const.MIIM_STATE) then
begin
if (_const.MF_DISABLED = (st .& _const.MF_DISABLED)) then
begin
gtk_widget_set_sensitive(it,false);
end else
if (_const.MF_ENABLED = (st .& _const.MF_ENABLED)) then //是否有效
begin
gtk_widget_set_sensitive(it,true);
end
if ((st .& _const.MF_CHECKED)= _const.MF_CHECKED) then //是否check
begin
gtk_object_set_data(it,"checked",1);
needset := true;
end else
if ((st .& _const.MF_UNCHECKED)= _const.MF_UNCHECKED) then //是否check
begin
gtk_object_set_data(it,"checked",0);
needset := true;
end
end
if needset then
begin
c := gtk_object_get_data(it,"caption");
if gtk_object_get_data(it,"checked") then
begin
gtk_menu_item_set_label(it,TslStringToGtk("[√]"+c));
end else
gtk_menu_item_set_label(it,TslStringToGtk(ss+c));
end
if (msk .& _const.MIIM_SUBMENU)=_const.MIIM_SUBMENU then //下一级菜单
begin
gtk_menu_item_set_submenu(it,lpm.hsubmenu);
g_object_set_data(it,"menuid",0);
end {else
begin
echo "\r\n seet sub menuid: ",lpm.wid;
echo " odid:",g_object_get_data(it,"menuid"),"***";
//g_object_set_data(it,"menuid",lpm.wid);
end}
return 1;
end
function gtk_insertmenuitema(hMenu,uitem,fbyposition,lpmii);//菜单操作
begin
_const := GetWin32Const();
lpm := new tmenuStruct(lpmii);
msk := lpm.fmask;
ft := lpm.ftype;
st := lpm.fstate;
ss := " ";
c := lpm.getdwtypedata()?:"";
if ft = _const.MFT_SEPARATOR then //分割
begin
it := gtk_separator_menu_item_new();
end else
begin //文本
//it := gtk_check_menu_item_new_with_label(c);//2
if ((st .& _const.MFS_CHECKED)= _const.MFS_CHECKED) then
begin
it := gtk_menu_item_new_with_label(TslStringToGtk("[√]"+c));
gtk_object_set_data(it,"checked",1);
end
else
begin
gtk_object_set_data(it,"checked",0);
it := gtk_menu_item_new_with_label(TslStringToGtk(ss+c));
end
end
gtk_object_set_data(it,"caption",c);
gtk_widget_show(it);
new tmenuitemobject(it);
g_object_set_data(it,"pmenu",hMenu);
gtk_menu_shell_insert(hMenu,it,uitem);
if st .& _const.MFS_DISABLED then //是否有效
begin
gtk_widget_set_sensitive(it,false);
end else gtk_widget_set_sensitive(it,true);
cid := lpm.wid;
if msk .& _const.MIIM_SUBMENU then //下一级菜单
begin
gtk_menu_item_set_submenu(it,lpm.hsubmenu);
g_object_set_data(lpm.hsubmenu,"pmenu",hMenu);
g_object_set_data(it,"menuid",0);
end else
begin
g_object_set_data(it,"menuid",cid);
end
end
function gtk_widgetsizechanged(hwnd,h,w); //大小改变
begin
return class(tgtk_ctl_object).widgetsizechangeda(hwnd,h,w) ;
end
function 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_GetKeyState(key); //按键状态
begin
global g_gtk_keytable;
if g_gtk_keytable then
begin
if key in array(0x10,0x11,0x12) then
begin
r := g_gtk_keytable[key];
if r>=0 then return r;
end
end ;
end
function gtk_GetAsyncKeyState(key);//鼠标按键状态
begin
global g_gtk_buttontable;
if g_gtk_buttontable then
begin
//
case key of
1:
begin
if g_gtk_buttontable[0] then return _shl(1,15);
end
2:
begin
if g_gtk_buttontable[1] then return _shl(1,15);
end
end ;
end
end
function TslStringToGtk(s); //ascii转utf8
begin
return ansitoutf8(s);
end
function TslStringToGtk2(s); //ascii转utf8
begin
global g_ansi_unit_cache ;
if not ifarray(g_ansi_unit_cache) then g_ansi_unit_cache := array();
r := g_ansi_unit_cache[s];
if ifnil(r) then
begin
r := ansitoutf8(s);
g_ansi_unit_cache[s] := r;;
end
return r;
end
function GtkStringToTsl(s); //ascii转utf8
begin
return utf8toansi(s);
end
function gtk_MessageBoxA(hd,txt,title,flag); //messagebox模拟
begin
flag := flag .& 7;
if flag = 0 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"确定",1,"b",0,"c",0);
if r=1 then return 1;
return 0;
end else
if flag = 1 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"确定",1,U"取消",1,"c",0);
if r=1 then return 1;
else return 2;
end else
if flag = 2 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"终止",1,U"重试",1,U"忽略",1);
case r of
1: return 3;
2: return 4;
0,3:return 5;
end
end else
if flag = 3 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"是",1,U"否",1,U"取消",1);
case r of
1: return 6;
2: return 7;
0,3:return 2;
end
end else
if flag =4 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"是",1,U"否",1,"c",0);
case r of
1: return 6;
2: return 7;
else
return 0;
end
end else
if flag = 5 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"重试",1,U"取消",1,U"取消",0);
case r of
1: return 4;
else return 2;
end
end else
if flag = 6 then
begin
r := tsl_gtk_messagebox_(TslStringToGtk(txt),TslStringToGtk(title),hd,U"取消",1,U"重试",1,U"继续",1);
case r of
1: return 2;
2: return 4;
3: return 11;
else return 2;
end
end
end
function gtk_createwindowexa(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam); //窗口构造类
begin
//array("tsui_application","tsui_window","tsluidesigner_a_a_1","tsui_form","tui_button","tui_edit","tui_tablecontrol32","tui_PageSheet","tui_monthcalendar","tui_datetimepicker")
d := new tslcstructureobj(MemoryAlignmentCalculate( array(
("lpcreateparams","intptr",lpParam))),nil);
_const := GetWin32Const();
if (dwStyle .& _const.WS_POPUP)=_const.WS_POPUP then
begin
cls := new tgtk_ctl_window_PoPup();
end
else
begin
cls := new tgtk_ctl_window();
end
if cls then
begin
r := cls.CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,d._getptr_());
end
return r;
end
function gtk_GetClassInfoExtA(h,cl,lpwcx); //获得信息
begin
lcl := lowercase(cl);
cs := GetGtkwindowclass(lcl);
d := new taggtkWNDCLASSA(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 taggtkWNDCLASSA(lpwcx);
reggtkwindowclass(d._getdata_());
return true;
end
function gtk_color_selection_dialog_new(t:string):pointer;cdecl;external 'libgtk-3.so';
function Gtk_event_get_name_by_id(id); //gdk消息名称--id对应
begin
d := array(0:"GDK_DELETE",1:"GDK_DESTROY",2:"GDK_EXPOSE",3:"GDK_MOTION_NOTIFY",4:"GDK_BUTTON_PRESS",
5:"GDK_2BUTTON_PRESS",6:"GDK_3BUTTON_PRESS",7:"GDK_BUTTON_RELEASE",8:"GDK_KEY_PRESS",9:"GDK_KEY_RELEASE",
10:"GDK_ENTER_NOTIFY",11:"GDK_LEAVE_NOTIFY",12:"GDK_FOCUS_CHANGE",13:"GDK_CONFIGURE",14:"GDK_MAP",15:"GDK_UNMAP",
16:"GDK_PROPERTY_NOTIFY",17:"GDK_SELECTION_CLEAR",18:"GDK_SELECTION_REQUEST",19:"GDK_SELECTION_NOTIFY",20:"GDK_PROXIMITY_IN",
21:"GDK_PROXIMITY_OUT",22:"GDK_DRAG_ENTER",23:"GDK_DRAG_LEAVE",24:"GDK_DRAG_MOTION",25:"GDK_DRAG_STATUS",
26:"GDK_DROP_START",27:"GDK_DROP_FINISHED",28:"GDK_CLIENT_EVENT",29:"GDK_VISIBILITY_NOTIFY",30:"GDK_NO_EXPOSE",
31:"GDK_SCROLL",32:"GDK_WINDOW_STATE",33:"GDK_SETTING",34:"GDK_OWNER_CHANGE",35:"GDK_GRAB_BROKEN",36:"GDK_DAMAGE",-1:"GDK_NOTHING")
;
return d[id];
end
function Gtk_dlg_get_response_name_by_id(id); //对话框id--名称对应
begin
d := array(-11:"GTK_RESPONSE_HELP",-10:"GTK_RESPONSE_APPLY",-9:"GTK_RESPONSE_NO",-8:"GTK_RESPONSE_YES",
-7:"GTK_RESPONSE_CLOSE",-6:"GTK_RESPONSE_CANCEL",-5:"GTK_RESPONSE_OK",-4:"GTK_RESPONSE_DELETE_EVENT",
-3:"GTK_RESPONSE_ACCEPT",-2:"GTK_RESPONSE_REJECT",-1:"GTK_RESPONSE_NONE");
return d[id];
end
function execsystem(s:string):integer;cdecl;external './plugin/libTSLUIL.so';
function openresourcemanager(p); //打开资源管理器
begin
if ifstring(p) then
return execsystem(format('nautilus "%s" &',p));
end
/////////////////////////////pipe process///////////执行程序相关/////////////////////////////
function tsl_gtk_closehandle(p:pointer):integer;cdecl;external "plugin/libTSLUIL.so";
function tsl_gtk_pipread(p:pointer;var msg:string;ct:integer):integer;cdecl;external "plugin/libTSLUIL.so";
function tsl_gtk_kill(p:pointer;sig:integer):integer;cdecl;external "plugin/libTSLUIL.so";
function tsl_gtk_createprocessa(exe:string; cmd : array of string; ev : array of string;var pw:pointer):pointer;cdecl;external "plugin/libTSLUIL.so";
/////////////////////////////////timer///////////////////////////////
class function g_timeout_add(interval:integer; _function:pointer; d:pointer):integer; cdecl; external 'libgtk-3.so'; //添加 //libglib-2.0.so gtk_timeout_remove libgtk-x11-2.0.so
class procedure g_source_remove(timeout_handler_id:integer); cdecl; external 'libgtk-3.so';//"libgtk-x11-2.0.so"; //移除
//////////////////////////clipboard/////////////////////
procedure gtk_clipboard_set_text(c:pointer;s:string;len:integer);cdecl;external 'libgtk-3.so';
function gtk_clipboard_get(atm:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_clipboard_wait_for_text(clipboard:pointer):string;cdecl;external 'libgtk-3.so';
////////////////////////
function gtk_events_pending():integer;cdecl;external 'libgtk-3.so';
function gtk_main_iteration_do(f:integer):integer;cdecl;external 'libgtk-3.so';
function gtk_main_iteration():integer ;cdecl;external 'libgtk-3.so';
///////////////////////////////////////////////////////
function tsl_gtk_idle_interface(p:pointer):integer;cdecl;external "./plugin/libTSLUIL.so";
function g_idle_remove_by_data(p:pointer):integer;cdecl;external 'libgtk-3.so';
////////////////
function g_slist_alloc():pointer;cdecl;external 'libgtk-3.so';
function g_slist_append(list:pointer;d:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure g_slist_free(list:pointer);cdecl;external 'libgtk-3.so';
function g_slist_find(gl:pointer;d:pointer):pointer;cdecl;external 'libgtk-3.so';
function g_slist_length(gl:pointer):integer;cdecl;external 'libgtk-3.so';
function g_slist_delete_link(gl:pointer;gl2:pointer):pointer;cdecl;external 'libgtk-3.so';
function g_slist_remove(gl:pointer;gl2:pointer):pointer;cdecl;external 'libgtk-3.so';
////////////////not classfiy//////////////////////////////////
function gtk_widget_is_visible(w:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_widget_has_focus(w:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_can_focus(w:pointer;cf:integer);cdecl;external 'libgtk-3.so';
function gtk_window_get_focus(w:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_grab_focus(w:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_focus(window:pointer; focus:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_type_hint(window:pointer; tp:integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_has_window(widget:pointer;has_window:integer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_parent(w:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_widget_get_allocated_width(w:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_widget_get_allocated_height(w:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_sensitive(w:pointer;s:integer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_sensitive(w:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_widget_is_toplevel(w:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_window_get_title(w:pointer):string;cdecl;external 'libgtk-3.so';
////////////////////////////////im/////////////////////////
function gtk_im_multicontext_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_im_multicontext_get_context_id(im:pointer):string;cdecl;external 'libgtk-3.so';
function gtk_im_multicontext_get_type():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_im_context_set_client_window(im:pointer;w:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_im_context_set_use_preedit (im:pointer;s:integer);cdecl;external 'libgtk-3.so';
procedure gtk_im_context_focus_in(im:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_im_context_focus_out (im:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_im_context_reset(im:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_im_context_get_preedit_string(im:pointer;var str:string;var attrs:pointer;cp:array of integer);cdecl;external 'libgtk-3.so';
function gtk_im_context_filter_keypress(im:pointer;e:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_im_context_delete_surrounding(im:pointer;offset:integer;nchars:integer):integer;cdecl;external 'libgtk-3.so';
function gtk_im_context_get_surrounding(im:pointer;var txt:string;var cursor_index:integer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_im_context_set_cursor_location(im:pointer;var area:array of integer);cdecl;external 'libgtk-3.so';
//////////////////////////////////gobject//////
function g_type_check_instance_is_a(instance:pointer;iface_type:pointer):integer;cdecl;external 'libgtk-3.so';
{procedure g_object_set_data(object:pointer;key:string;data:pointer);cdecl;external 'libgtk-3.so';
function g_object_get_data(object:pointer;key:string):pointer;cdecl;external 'libgtk-3.so';
procedure g_object_set_data_base(object:pointer;key:string;data:pointer);cdecl;external 'libgtk-3.so' name "g_object_set_data";
function g_object_get_data_base(object:pointer;key:string):pointer;cdecl;external 'libgtk-3.so' name 'g_object_get_data';
}
function g_object_get_data(object:pointer;key:string);
begin
return gtk_object_get_data(object,key);
//r := g_object_get_data_base(object,key);
return r;
end
function g_object_set_data(object:pointer;key:string;data:pointer);
begin
return gtk_object_set_data(object,key,data);
end
function g_object_ref(g:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure g_object_unref(g:pointer);cdecl;external 'libgtk-3.so';
////////////////////////scroll//////////////////////////
function gtk_scrolled_window_new(hadjustment:pointer; vadjustment:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_scrolled_window_add_with_viewport(s:pointer;c:pointer);cdecl;external 'libgtk-3.so';
function gtk_scrolled_window_get_hscrollbar(s:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_scrolled_window_get_vscrollbar(s:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_scrolled_window_get_hadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_scrolled_window_get_vadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_scrolled_window_set_max_content_height(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
procedure gtk_scrolled_window_set_min_content_height(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
procedure gtk_scrolled_window_set_max_content_width(s:pointer;h:integer);cdecl;external 'libgtk-3.so';
procedure gtk_scrolled_window_set_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
/////////////////////scrollable////////////////////////////
procedure gtk_scrollable_set_vscroll_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
procedure gtk_scrollable_set_hscroll_policy(s:pointer;p:integer);cdecl;external 'libgtk-3.so';
function gtk_scrollable_get_hadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_scrollable_get_vadjustment(s:pointer):pointer;cdecl;external 'libgtk-3.so';
//////////////gdk window ///////
procedure gdk_window_show_unraised(w:pointer);cdecl;external 'libgtk-3.so';
///////////////////////////device//////////////////////////
//gdk_display_get_pointer(gdk_display_get_default(), nil, x, y, nil); //鼠标位置
procedure gdk_display_get_pointer(d:pointer; screen:string;var x :integer;var Y:integer;msk:string); cdecl;external 'libgtk-3.so';
function gdk_display_get_default():pointer;cdecl;external 'libgtk-3.so';
function gdk_screen_get_default():pointer;cdecl;external 'libgtk-3.so';
function gdk_display_get_default_seat(d:pointer):pointer;cdecl;external 'libgtk-3.so';
function gdk_seat_get_pointer(dm:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gdk_device_get_position(d:pointer;t:pointer;var x :integer;var y:integer);cdecl;external 'libgtk-3.so';
function gdk_event_get_scroll_deltas(d:pointer;var x :double;var y:double):integer;cdecl;external 'libgtk-3.so';
procedure gdk_window_get_position(w:pointer;var x:integer;var y:integer);cdecl;external 'libgtk-3.so';
function gdk_screen_height():integer;cdecl;external 'libgtk-3.so';
function gdk_screen_width():integer;cdecl;external 'libgtk-3.so';
function gdk_event_get_event_type(e:pointer):integer;cdecl;external 'libgtk-3.so';
////////////////////////// start ////////////////////////////////////////
procedure gtk_init(argc:string;argcv:string);cdecl;external 'libgtk-3.so';
procedure gtk_main ();cdecl;external 'libgtk-3.so';
procedure gtk_main_quit();cdecl;external 'libgtk-3.so';
//////////////////////context///////////////////////////////
function gtk_widget_get_style_context(w:pointer):pointer;cdecl;external 'libgtk-3.so';
///////////////////////////////////////////////////////////////
/////////////////////////////////widget////////////////////////////////////
function gtk_widget_get_realized(w:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_events(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_get_allocation(w:pointer;var rec:array of integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_allocation(w:pointer; rec: array of integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_size_allocate(w:pointer; rec: array of integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_modify_text(w:pointer;t:integer;c:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_tooltip_text(w:pointer;tip:string);cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_size_request(wd:pointer;h:integer;w:integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_set_app_paintable(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_realize(w:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_queue_draw(w:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_queue_draw_area(w:pointer;x:integer;y:integer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_margin_top(w:pointer):integer;cdecl;external 'libgtk-3.so';
/////////////////////edit entry//////////////////////////////////////////////////////
function gtk_entry_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_entry_get_text(w:pointer):string;cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_text(e:pointer;c:string);cdecl;external 'libgtk-3.so';
function gtk_entry_get_text_length(e:pointer):short;cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_visibility(e:pointer;v:integer);cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_width_chars(e:pointer;v:integer);cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_invisible_char(e:pointer;c:integer);cdecl;external 'libgtk-3.so';
//procedure gtk_entry_set_editable(e:pointer;ed:integer);cdecl;external 'libgtk-3.so';
procedure gtk_editable_set_editable(e:pointer;ed:integer);cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_has_frame(e:pointer;s:integer);cdecl;external 'libgtk-3.so';
procedure gtk_entry_set_max_length(e:pointer;len:integer);cdecl;external 'libgtk-3.so';
/////////////////////text view memo //////////////////////////////////////////////////////
function gtk_text_view_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_text_view_set_wrap_mode(t:pointer;md:integer);cdecl;external 'libgtk-3.so';
procedure gtk_text_view_set_buffer(t:pointer;bf:pointer);cdecl;external 'libgtk-3.so';
function gtk_text_buffer_new(tagtable:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_text_buffer_get_iter_at_offset(bf:pointer;iter:pointer;offset:integer);cdecl;external 'libgtk-3.so';
procedure gtk_text_buffer_insert(bf:pointer;iter:pointer;txt:string;len:integer);cdecl;external 'libgtk-3.so';
procedure gtk_text_view_set_editable(t:pointer;e:integer);cdecl;external 'libgtk-3.so';
procedure gtk_text_set_word_wrap(t:pointer;e:integer);cdecl;external 'libgtk-3.so';
procedure gtk_text_buffer_get_end_iter(b:pointer;iter:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_text_buffer_get_start_iter(b:pointer;iter:pointer);cdecl;external 'libgtk-3.so';
function gtk_text_buffer_get_char_count(b:pointer):integer;cdecl;external 'libgtk-3.so';
function gtk_text_buffer_get_line_count(b:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_text_buffer_delete(b:pointer;start:pointer;ed:pointer);cdecl;external 'libgtk-3.so';
function gtk_text_buffer_get_text(b:pointer;start:pointer;ed:pointer;ic:integer):string;cdecl;external 'libgtk-3.so';
function gtk_text_buffer_get_selection_bounds(b:pointer;st:pointer;ed:pointer):integer;cdecl;external 'libgtk-3.so';
//////////////////////////////pango////////////////////////////////////////////
function pango_font_description_from_string(ns:string):pointer; cdecl;external 'libgtk-3.so';
procedure pango_font_description_free(pg:pointer);cdecl;external 'libgtk-3.so';
procedure pango_font_description_set_size(pg:pointer;sz:integer);cdecl;external 'libgtk-3.so';
function pango_cairo_create_layout(c:pointer):pointer;cdecl;external 'libgtk-3.so';
function pango_cairo_create_context(c:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure pango_layout_set_width(p:pointer;w:integer);cdecl;external 'libgtk-3.so';
function pango_layout_get_width(p:pointer):integer;cdecl;external 'libgtk-3.so';
procedure pango_layout_set_wrap(p:pointer;wp:integer);cdecl;external 'libgtk-3.so';
procedure pango_layout_set_font_description(p:pointer;f:pointer);cdecl;external 'libgtk-3.so';
procedure pango_layout_set_text(pl:pointer;s:string;len:integer);cdecl;external 'libgtk-3.so';
procedure pango_cairo_show_layout(cr:pointer;pl:pointer);cdecl;external 'libgtk-3.so';
function pango_cairo_font_map_get_default():pointer;cdecl;external 'libgtk-3.so';
procedure pango_font_map_list_families(fm:pointer;var fls:pointer;var n:integer);cdecl;external 'libgtk-3.so';
function pango_font_family_get_name(n:pointer):string;cdecl;external 'libgtk-3.so';
function pango_font_family_get_names(); //获得文字
begin
fm := pango_cairo_font_map_get_default();
pango_font_map_list_families(fm,ls,lsn);
mt := new aefclassobj_();
r := array();
psize := static getctypesize()["intptr"];
for i:= 0 to lsn -1 do
begin
pi := mt.readptr(ls+psize*i);
r[i] := GtkStringToTsl( pango_font_family_get_name(pi));
end
return r;
end
///////////////////////////cairo////////////////////////////////
function cairo_create(s:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure cairo_save(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_restore(c:pointer);cdecl;external 'libgtk-3.so';
function gdk_cairo_create(w:pointer):pointer;cdecl;external 'libgtk-3.so';
function cairo_move_to(cr:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
function cairo_line_to(cr:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
procedure cairo_set_source(cr:pointer;s:pointer);cdecl;external 'libgtk-3.so';
function cairo_get_source(cr:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure cairo_curve_to(cr:pointer;x1:double;y1:double;x2:double;y2:double;x3:double;y3:double);cdecl;external 'libgtk-3.so';
procedure cairo_rectangle(c:pointer;x:double;y:double;w:double;h:double);cdecl;external 'libgtk-3.so';
procedure cairo_set_source_rgba(c:pointer;red:double;green:double;blue:double;alpha:double);cdecl;external 'libgtk-3.so';
procedure cairo_set_source_rgb(c:pointer;r:double;g:double;b:double);cdecl;external 'libgtk-3.so';
procedure cairo_set_line_width(c:pointer;w:double);cdecl;external 'libgtk-3.so';
function cairo_get_line_width(c:pointer):double;cdecl;external 'libgtk-3.so';
procedure cairo_set_line_cap(c:pointer;cp:integer);cdecl;external 'libgtk-3.so';
function cairo_get_line_cap(c:pointer):integer;cdecl;external 'libgtk-3.so';
procedure cairo_set_line_join(c:pointer;t:integer);cdecl;external 'libgtk-3.so';
function cairo_get_line_join(c:pointer):integer;cdecl;external 'libgtk-3.so';
//procedure draw_round_rectangle(c:pointer;x:double;y:double;w:double;h:double;r:double);cdecl;external 'libgtk-3.so';
procedure cairo_arc (cr:pointer; xc:double;yc:double;radius:double;angle1:double;angle2:double);cdecl;external 'libgtk-3.so';
procedure cairo_translate(cr:pointer;tx:double;ty:double);cdecl;external 'libgtk-3.so';
procedure cairo_rotate(cr:pointer;angle:double);cdecl;external 'libgtk-3.so';
procedure cairo_scale(cr:pointer;sx:double;sy:double);cdecl;external 'libgtk-3.so';
procedure cairo_set_operator(c:pointer;op:integer);cdecl;external 'libgtk-3.so';
function cairo_get_operator(c:pointer):integer;cdecl;external 'libgtk-3.so';
procedure cairo_set_tolerance(c:pointer;tol:double);cdecl;external 'libgtk-3.so';
function cairo_get_tolerance(c:pointer):double;cdecl;external 'libgtk-3.so';
procedure cairo_destroy(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_close_path(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_set_fill_rule(c:pointer;rul:integer);cdecl;external 'libgtk-3.so';
procedure cairo_clip(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_clip_preserve(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_clip_extents(c:pointer;x1:double;y1:double;x2:double;y2:double);cdecl;external 'libgtk-3.so';
function cairo_in_clip(c:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
procedure cairo_reset_clip(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_stroke(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_stroke_preserve(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_set_dash(c:pointer;dash:array of double;num_dash:integer;offset:double);cdecl;external 'libgtk-3.so';
procedure cairo_fill(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_fill_preserve(c:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_fill_extents(c:pointer;x1:double;y1:double;x2:double;y2:double);cdecl;external 'libgtk-3.so';
procedure cairo_paint_with_alpha(c:pointer;alpah:double);cdecl;external 'libgtk-3.so';
procedure cairo_paint(c:pointer);cdecl;external 'libgtk-3.so';
function cairo_applay_pen_style(dc);
begin
pt := gtk_object_get_data(dc,"pen.style");
if pt=0x2 then
begin
cairo_set_dash(dc,array(4.0,1.0),2,0);
end
else cairo_set_dash(dc,array(4.0,0.0),2,0);
end
function cairo_draw_round_rectangle(cr,x,y,w,h,r);
begin
cairo_move_to (cr, x + r, y);
cairo_line_to (cr, x + w - r, y);
cairo_move_to (cr, x + w, y + r);
cairo_line_to (cr, x + w, y + h - r);
cairo_move_to (cr, x + w - r, y + h);
cairo_line_to (cr, x + r, y + h);
cairo_move_to (cr, x, y + h - r);
cairo_line_to (cr, x, y + r);
cairo_arc (cr, x + r, y + r, r, 3.14, 3 * 3.14 / 2.0);
cairo_arc (cr, x + w - r, y + r, r, 3 * 3.14 / 2, 2 * 3.14);
cairo_arc (cr, x + w - r, y + h - r, r, 0, 3.14 / 2);
cairo_arc (cr, x + r, y + h - r, r, 3.14 / 2, 3.14);
end
//////////////////////text//////// https://developer.gnome.org/cairo/stable/cairo-cairo-font-options-t.html#cairo-font-options-get-hint-metrics
procedure cairo_show_text(c:pointer;t:string);cdecl;external 'libgtk-3.so';
procedure cairo_select_font_face(cr:pointer;n:string;slat:integer;weight:integer);cdecl;external 'libgtk-3.so';
procedure cairo_set_font_size(cr:pointer;sz:double);cdecl;external 'libgtk-3.so';
procedure cairo_text_extents(cr:pointer;s:string;ext:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_font_extents(cr:pointer;ext:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_get_font_options(cr:pointer;ft:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_set_font_options(cr:pointer;ft:pointer);cdecl;external 'libgtk-3.so';
function cairo_font_options_create():pointer;cdecl;external 'libgtk-3.so';
procedure cairo_font_options_destroy(op:pointer);cdecl;external 'libgtk-3.so';
////////cairo surface//////2
{
CAIRO_FORMAT_INVALID = -1,
CAIRO_FORMAT_ARGB32 = 0,
CAIRO_FORMAT_RGB24 = 1,
CAIRO_FORMAT_A8 = 2,
CAIRO_FORMAT_A1 = 3,
CAIRO_FORMAT_RGB16_565 = 4,
CAIRO_FORMAT_RGB30 = 5
}
function cairo_image_surface_create(t:integer;w:integer;h:integer):pointer;cdecl;external 'libgtk-3.so';
function cairo_image_surface_create_from_png(f:string):pointer;cdecl;external 'libgtk-3.so';
function cairo_image_surface_get_width(sf:pointer):integer;cdecl;external 'libgtk-3.so';
function cairo_image_surface_get_height(sf:pointer):integer;cdecl;external 'libgtk-3.so';
procedure cairo_surface_destroy(sf:pointer);cdecl;external 'libgtk-3.so';
procedure cairo_set_source_surface(cr:pointer;sf:pointer;x:double;y:double);cdecl;external 'libgtk-3.so';
procedure cairo_pattern_set_extend(c:pointer;pe:integer);cdecl;external 'libgtk-3.so';
function cairo_pattern_create_linear(x0:double;y0:double;x1:double;y1:double):pointer;cdecl;external 'libgtk-3.so';
procedure cairo_pattern_add_color_stop_rgb(c:pointer;offset:double;r:double;g:double;b:double;a:double);cdecl;external 'libgetk-3.so';
/////////////////////////window//////////
procedure gdk_window_move_resize(w:pointer;x:integer;y:integer;wd:integer;h:integer);cdecl;external 'libgtk-3.so';
procedure gdk_window_resize(w:pointer;wd:integer;h:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_begin_move_drag(w:pointer;btn:integer;x:integer;y:integer;t:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_begin_resize_drag(w:pointer;e:integer;btn:integer;x:integer;y:integer;t:integer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_toplevel(w:pointer):pointer;cdecl;external 'libgtk-3.so';
/////////// modal ////////////////////////////////
procedure gtk_window_set_modal(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_transient_for(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_window_get_size(wd:pointer;var h:integer;var w:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_icon(w:pointer;ico:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_resizable(p:pointer;f:integer);cdecl;external 'libgtk-3.so';
function gtk_window_get_resizable(p:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_window_set_decorated(w:pointer;f:integer);cdecl;external 'libgtk-3.so';
function gtk_window_get_decorated(w:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_window_set_title(w:pointer;t:string);cdecl;external 'libgtk-3.so';
procedure gtk_window_set_geometry_hints (window:pointer;
eometry_widget:pointer;
geometry:pointer;
geom_mask:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_resize(w:pointer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_resize_to_geometry(w:pointer;wd:integer;ht:integer);cdecl;external 'libgtk-3.so';
procedure gtk_window_move(w:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
////////////////////// container layout fixed //////////////////////
procedure gtk_container_add(c1:pointer;c2:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_container_remove(c:pointer;w:pointer); cdecl;external 'libgtk-3.so';
procedure gtk_container_set_border_width (container:pointer;border_width:integer);cdecl;external 'libgtk-3.so';
function gtk_fixed_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_layout_new(h:pointer;v:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_layout_get_size(layout:pointer;var width:integer;var height:integer);cdecl;external 'libgtk-3.so';
procedure gtk_layout_set_size(layout:pointer; width:integer; height:integer);cdecl;external 'libgtk-3.so';
procedure gtk_fixed_put(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
procedure gtk_layout_put(fixed:pointer;widget:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
function gtk_layout_get_bin_window(l:pointer):pointer;cdecl;external 'libgtk-3.so';
//////////////////////////// box /////////////////////////
function gtk_vbox_new(homogeneous:integer;spacing:integer):pointer;cdecl;external 'libgtk-3.so';
function gtk_hbox_new(homogeneous:integer;spacing:integer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_box_pack_end(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external 'libgtk-3.so';
procedure gtk_box_pack_start(box:pointer;w:pointer;expand:integer;f:integer;pad:integer);cdecl;external 'libgtk-3.so';
//////////////////////////menu//////////////////////////////////////////////////
function gtk_menu_shell_get_by_positon(h:pointer;pi:integer);
begin
gist := gtk_container_get_children(h);
ridx := 0;
while gist do
begin
og := new _gslist(gist);
if ridx=pi then
begin
return og.data;
end
ridx++;
gist := og.next;
//echo "\r\n+++",gist,"+++\r\n";
end
return 0;
end
function gtk_container_get_children(m:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_menu_bar_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_menu_shell_append(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_menu_shell_prepend(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_menu_shell_insert(mb:pointer;mi:pointer;idx:integer);cdecl;external 'libgtk-3.so';
function gtk_menu_item_new_with_label(s:string):pointer;cdecl;external 'libgtk-3.so';
function gtk_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_menu_item_set_submenu(mb:pointer;mi:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_menu_item_set_use_underline(mi:pointer;l:integer);cdecl;external 'libgtk-3.so';
function gtk_separator_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_menu_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_menu_item_select(mi:pointer);cdecl;external 'libgtk-3.so';
function gtk_check_menu_item_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_check_menu_item_new_with_label(s:string):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_check_menu_item_set_active(cmi:pointer;ck:integer);cdecl;external 'libgtk-3.so';
function gtk_check_menu_item_get_active(cmi:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_check_menu_item_toggled(cmi:pointer);cdecl;external 'libgtk-3.so';
function gtk_menu_item_get_label(mi:pointer):string;cdecl;external 'libgtk-3.so';
procedure gtk_menu_item_set_label(mi:pointer;l:string);cdecl;external 'libgtk-3.so';
procedure gtk_menu_set_title(mi:pointer;l:string);cdecl;external 'libgtk-3.so';
procedure gtk_menu_reorder_child(mb:pointer;mi:pointer;id:integer);cdecl;external 'libgtk-3.so';
procedure gtk_menu_popup (menu:pointer;
parent_menu_shell:pointer;
parent_menu_item:pointer;
func:pointer;
data:pointer;
button:integer;
activate_time:integer);cdecl;external 'libgtk-3.so';
procedure gtk_menu_item_activate(mi:pointer);cdecl;external 'libgtk-3.so';
/////////////////////////// adjust scroll /////////////////////////////////
function gtk_adjustment_get_type():pointer; cdecl;external 'libgtk-3.so';
function GTK_ADJUSTMENT(w);
begin
return g_type_check_instance_cast(w,gtk_adjustment_get_type());
end
function gtk_adjustment_new(v:double;
lower:double;
upper:double;
step_increment:double;
page_increment:double;
page_size:double):pointer; cdecl;external 'libgtk-3.so';
function gtk_adjustment_get_value(adj:pointer):double; cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_set_value(adj:pointer;v:double); cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_set_page_size(adj:pointer;v:double); cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_changed(adj:pointer); cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_value_changed(adj:pointer); cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_set_lower(adj:pointer;v:double);cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_set_upper(adj:pointer;v:double);cdecl;external 'libgtk-3.so';
function gtk_adjustment_get_upper(adj:pointer):double;cdecl;external 'libgtk-3.so';
function gtk_adjustment_get_lower(adj:pointer):double;cdecl;external 'libgtk-3.so';
function gtk_hscrollbar_new(adj:pointer):pointer; cdecl;external 'libgtk-3.so';
function gtk_vscrollbar_new(adj:pointer):pointer; cdecl;external 'libgtk-3.so';
procedure gtk_adjustment_configure(adj:pointer;
v:double;
lower:double;
upper:double;
step_increment:double;
page_increment:double;
page_size:double);cdecl;external 'libgtk-3.so';
////////////////////////////////////////////////////
function gtk_frame_new(lbl:string):pointer;cdecl;external 'libgtk-3.so';
/////////////////////////////////////
function gtk_calendar_new():pointer;cdecl;external 'libgtk-3.so';
/////////////////////////////////
function gtk_spinner_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_spinner_start(spn:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_spinner_stop(spn:pointer);cdecl;external 'libgtk-3.so';
///////////////////////////////
function gtk_progress_bar_new():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_progress_bar_set_text(pb:pointer;t:string);cdecl;external 'libgtk-3.so';
procedure gtk_progress_bar_set_show_text(pb:pointer;s:integer);cdecl;external 'libgtk-3.so';
procedure gtk_progress_bar_set_fraction(pb:pointer;p:double);cdecl;external 'libgtk-3.so';
procedure gtk_progress_bar_set_pulse_step(pb:pointer;p:double);cdecl;external 'libgtk-3.so';
function gtk_progress_bar_get_fraction(pb:pointer):double;cdecl;external 'libgtk-3.so';
function gtk_progress_bar_set_inverted(pb:pointer;v:integer);cdecl;external 'libgtk-3.so';
procedure gtk_progress_bar_pulse(pb:pointer);cdecl;external 'libgtk-3.so';
//procedure gtk_progress_configure(pb:pointer;v:double;min:double;max:double);cdecl;external 'libgtk-3.so';
//////////////////////////////label/////////////////////////////////////
function gtk_label_new(t:string):pointer;cdecl;external 'libgtk-3.so';
function gtk_label_get_text(w:pointer):string;cdecl;external 'libgtk-3.so';
procedure gtk_label_set_text(l:pointer;t:string);cdecl;external 'libgtk-3.so';
procedure gtk_label_set_selectable(l:pointer;s:integer);cdecl;external 'libgtk-3.so';
procedure gtk_label_set_markup(l:pointer;t:string);cdecl;external 'libgtk-3.so';
//////////////// button btn /////////////////
function gtk_button_get_label(b:pointer):string;cdecl;external 'libgtk-3.so';
function gtk_button_get_event_window(b:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_button_new_with_label(c:string):pointer;cdecl;external 'libgtk-3.so';
function gtk_button_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_check_button_new():pointer;cdecl;external 'libgtk-3.so';
function gtk_check_button_new_with_label(l:string):pointer;cdecl;external 'libgtk-3.so';
function gtk_radio_button_new(g:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_radio_button_new_from_widget(g:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_toggle_button_set_active(tg:pointer;ac:integer);cdecl;external 'libgtk-3.so';
function gtk_toggle_button_get_active(tg:pointer):integer;cdecl;external 'libgtk-3.so';
procedure gtk_button_clicked(b:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_radio_button_set_group(rbtn:pointer;lst:pointer);cdecl;external 'libgtk-3.so';
////////////////////////// dialog ///////////////////////////////////////////////////////////
function gtk_dialog_run(d:pointer):integer; cdecl;external 'libgtk-3.so';
procedure gtk_dialog_response(w:pointer;id:integer); cdecl;external 'libgtk-3.so';
function gtk_file_chooser_dialog_new(t:string;p:pointer;act:integer;bstring1:string;bvalue1:integer;bstring2:string;bvalue2:integer;pend:pointer):pointer ; cdecl;external 'libgtk-3.so';
function gtk_file_chooser_get_filename(p:pointer):string;cdecl;external 'libgtk-3.so';
function gtk_file_chooser_set_filename(p:pointer;n:string):integer;cdecl;external 'libgtk-3.so';
procedure gtk_file_chooser_set_select_multiple(p:pointer;m:integer);cdecl;external 'libgtk-3.so';
function gtk_file_chooser_get_filenames(p:pointer):pointer ;cdecl;external 'libgtk-3.so';
function gtk_font_chooser_dialog_new(t:string;p:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_font_selection_dialog_new(t:string):pointer;cdecl;external 'libgtk-3.so';
function gtk_font_selection_dialog_get_font_name(d:pointer):string;cdecl;external 'libgtk-3.so';
function gtk_font_selection_dialog_get_preview_text(p:pointer):string;cdecl;external 'libgtk-3.so';
procedure gtk_font_selection_dialog_set_preview_text(p:pointer;t:string); cdecl;external 'libgtk-3.so';
function gtk_font_selection_dialog_set_font_name(p:pointer;f:string):integer; cdecl;external 'libgtk-3.so';
procedure gtk_widget_modify_font(w:pointer;p:pointer); cdecl;external 'libgtk-3.so';
function gtk_color_selection_dialog_get_type():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_color_selection_set_current_color(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_color_selection_get_current_color(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
function gdk_color_parse(cs:string;c:pointer):integer;cdecl;external 'libgtk-3.so';
////////////////// evntbox ////////////////////////////
function gtk_event_box_new():pointer;cdecl;external 'libgtk-3.so';
//获得image
function GTK_WIDGET(w); //gtkwidget
begin
wt := static gtk_widget_get_type();
return g_type_check_instance_cast(w,wt);
return w;
end
function GTK_CONTAINER(w);//gtk容器
begin
wt := static gtk_container_get_type();
return g_type_check_instance_cast(w,wt);
end
function GTK_WINDOW(w);//gtkwindow
begin
wt := static gtk_window_get_type();
return g_type_check_instance_cast(w,wt);
return w;
end
function GDK_WINDOW(w); //gdkwindow
begin
wt := static gdk_window_get_type();
return g_type_check_instance_cast(w,wt);
return w;
end
function GTK_COLOR_SELECTION_DIALOG(W);
begin
return g_type_check_instance_cast(w,gtk_color_selection_dialog_get_type());
end
procedure gtk_widget_set_parent_window(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_get_parent_window(w:pointer;p:pointer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_type():pointer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_modify_bg(w:pointer;tyle:integer;c:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_layout_move(l:pointer;w:pointer;x:integer;y:integer);cdecl;external 'libgtk-3.so';
procedure gtk_grab_add(w:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_destroy(w:pointer);cdecl;external 'libgtk-3.so';
function g_thread_self():pointer;cdecl;external 'libgtk-3.so';
function gtk_get_major_version ():integer;cdecl;external 'libgtk-3.so';
function gtk_get_micro_version ():integer;cdecl;external 'libgtk-3.so';
function gtk_get_binary_age ():integer;cdecl;external 'libgtk-3.so';
function g_main_context_default():pointer;cdecl;external 'libgtk-3.so';
function g_main_context_get_poll_func(d:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_main_level():integer;external 'libgtk-3.so';
function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):integer;cdecl;external 'libgtk-3.so';
function g_signal_new(signal_name:string;
itype:pointer;
signal_flags:integer;
class_offset:integer;
accumulator:pointer;
accu_data:pointer;
c_marshaller:pointer;
return_type:pointer;
n_params:integer;
p1:pointer;
p2:pointer):integer;cdecl;external 'libgtk-3.so';
procedure g_signal_emit_by_name(w:pointer;n:string;p1:pointer;p2:pointer);cdecl;external 'libgtk-3.so';
function gtk_container_get_type():pointer;cdecl;external 'libgtk-3.so';
function gtk_window_get_type():pointer;cdecl;external 'libgtk-3.so';
function gdk_window_get_type():pointer;cdecl;external 'libgtk-3.so';
function g_type_check_instance_cast(instance:pointer;ty:pointer):pointer;cdecl;external 'libgtk-3.so';
function gtk_window_new(lev:integer):pointer; cdecl;external 'libgtk-3.so';
procedure gdk_window_set_back_pixmap(window:pointer;pixmap:pointer;parent_relative:integer);cdecl;external 'libgtk-x11-2.0.so';
procedure gdk_pixbuf_ref(pixbuf:pointer);cdecl;external 'libgtk-3.so';
procedure gdk_pixbuf_unref(pixbuf:pointer);cdecl;external 'libgtk-3.so';
function gdk_cursor_new(c:integer):pointer;cdecl;external 'libgtk-3.so';
procedure gdk_window_set_cursor(w:pointer;c:pointer);cdecl;external 'libgtk-3.so';
function gtk_widget_get_window(g:pointer):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_window_get_position(g:pointer;var x:integer;var y:integer);cdecl;external 'libgtk-3.so';
function gtk_image_new_from_file(f:string):pointer;cdecl;external 'libgtk-3.so';
procedure gtk_widget_show_all (window:pointer);cdecl;external 'libgtk-3.so';//'libgtk-x11-2.0.so';
procedure gtk_widget_show(window:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_show_now(window:pointer);cdecl;external 'libgtk-3.so';
procedure gtk_widget_hide(window:pointer);cdecl;external 'libgtk-3.so';
//-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0
//-lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
procedure gdk_pixbuf_render_pixmap_and_mask(pixbuf:pointer;
var pixmap_return:int64;
var mask_return:int64;
alpha_threshold:integer); cdecl;
external 'libgtk-x11-2.0.so';
//function gtk_image_get_pixbuf (image:pointer):pointer; cdecl;external 'libgtk-x11-2.0.so';
//function gdk_pixbuf_copy(image:pointer):pointer; cdecl;external 'libgtk-x11-2.0.so';
procedure gtk_image_set_from_file (img:pointer;filename:string);cdecl;external 'libgtk-3.so';
function gtk_image_new_from_pixbuf(image:pointer):pointer; cdecl;external 'libgtk-3.so';
function gtk_image_new():pointer; cdecl;external 'libgtk-3.so';
function gdk_pixbuf_get_width(src_pixbuf:pointer):integer;cdecl;external 'libgtk-3.so';
function gdk_pixbuf_get_height(src_pixbuf:pointer):integer;cdecl;external 'libgtk-3.so';
end
type _cairo_matrix_t = class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
("xx","double",0),
("yx","double",0),
("xy","double",0),
("yy","double",0),
("x0","double",0),
("y0","double",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property xx index "xx" read _getvalue_ write _setvalue_;
property yx index "yx" read _getvalue_ write _setvalue_;
property xy index "xy" read _getvalue_ write _setvalue_;
property yy index "yy" read _getvalue_ write _setvalue_;
property x0 index "x0" read _getvalue_ write _setvalue_;
property y0 index "y0" read _getvalue_ write _setvalue_;
end
type _cairo_text_extents_t = class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
("x_bearing","double",0),
("y_bearing","double",0),
("width","double",0),
("height","double",0),
("x_advance","double",0),
("y_advance","double",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property x_bearing index "x_bearing" read _getvalue_ write _setvalue_;
property y_bearing index "y_bearing" read _getvalue_ write _setvalue_;
property width index "width" read _getvalue_ write _setvalue_;
property height index "height" read _getvalue_ write _setvalue_;
property x_advance index "x_advance" read _getvalue_ write _setvalue_;
property y_advance index "y_advance" read _getvalue_ write _setvalue_;
end
type _cairo_font_extents_t = class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
("ascent","double",0),
("descent","double",0),
("height","double",0),
("max_x_advance","double",0),
("max_y_advance","double",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ascent index "ascent" read _getvalue_ write _setvalue_;
property descent index "descent" read _getvalue_ write _setvalue_;
property height index "height" read _getvalue_ write _setvalue_;
property max_x_advance index "max_x_advance" read _getvalue_ write _setvalue_;
property max_y_advance index "max_y_advance" read _getvalue_ write _setvalue_;
end
type _dlgwidgets = class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
(0,"intptr",0),
(1,"intptr",0),
(2,"intptr",0),
(3,"intptr",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
end
type _GdkEventButton=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("time","int",0),
("x","double",0),
("y","double",0),
("axes","intptr",0),
("state","int",0),
("button","int",0),
("device","intptr",0),
("x_root","double",0),
("y_root","double",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property time index "time" read _getvalue_ write _setvalue_;
property x index "x" read _getvalue_ write _setvalue_;
property y index "y" read _getvalue_ write _setvalue_;
property axes index "axes" read _getvalue_ write _setvalue_;
property state index "state" read _getvalue_ write _setvalue_;
property button index "button" read _getvalue_ write _setvalue_;
property device index "device" read _getvalue_ write _setvalue_;
property x_root index "x_root" read _getvalue_ write _setvalue_;
property y_root index "y_root" read _getvalue_ write _setvalue_;
end
type _GdkEventKey=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("time","int",0),
("state","int",0),
("keyval","int",0),
("length","int",0),
("str","intptr",0),
("hardware_keycode","short",0),
("group","byte",0),
("is_modifier","int",1)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property time index "time" read _getvalue_ write _setvalue_;
property state index "state" read _getvalue_ write _setvalue_;
property keyval index "keyval" read _getvalue_ write _setvalue_;
property length index "length" read _getvalue_ write _setvalue_;
property hardware_keycode index "hardware_keycode" read _getvalue_ write _setvalue_;
property group index "group" read _getvalue_ write _setvalue_;
property is_modifier index "is_modifier" read _getvalue_ write _setvalue_;
end
type _GdkEventConfigure=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("x","int",0),
("y","int",0),
("width","int",0),
("height","int",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property x index "x" read _getvalue_ write _setvalue_;
property y index "y" read _getvalue_ write _setvalue_;
property width index "width" read _getvalue_ write _setvalue_;
property height index "height" read _getvalue_ write _setvalue_;
end
type _GdkEventMotion=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("time","int",0),
("x","double",0),
("y","double",0),
("axes","intptr",0),
("state","int",0),
("is_hint","short",0),
("device","intptr",0),
("x_root","double",0),
("y_root","double",0)),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property time index "time" read _getvalue_ write _setvalue_;
property x index "x" read _getvalue_ write _setvalue_;
property y index "y" read _getvalue_ write _setvalue_;
property axes index "axes" read _getvalue_ write _setvalue_;
property state index "state" read _getvalue_ write _setvalue_;
property is_hint index "is_hint" read _getvalue_ write _setvalue_;
property device index "device" read _getvalue_ write _setvalue_;
property x_root index "x_root" read _getvalue_ write _setvalue_;
property y_root index "y_root" read _getvalue_ write _setvalue_;
end
type _GdkEventScroll=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("time","int",0),
("x","double",0),
("y","double",0),
("state","int",0),
("direction","int",0),
("device","intptr",0),
("x_root","double",0),
("y_root","double",0)),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property time index "time" read _getvalue_ write _setvalue_;
property x index "x" read _getvalue_ write _setvalue_;
property y index "y" read _getvalue_ write _setvalue_;
property axes index "axes" read _getvalue_ write _setvalue_;
property state index "state" read _getvalue_ write _setvalue_;
property is_hint index "is_hint" read _getvalue_ write _setvalue_;
property device index "device" read _getvalue_ write _setvalue_;
property x_root index "x_root" read _getvalue_ write _setvalue_;
property y_root index "y_root" read _getvalue_ write _setvalue_;
property direction index "direction" read _getvalue_ write _setvalue_;
end
type _GdkEventAny=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
end
type _GdkEventFocus=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("iin","short",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property iin index "iin" read _getvalue_ write _setvalue_;
end
type _GdkEventExpose=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("area","int[4]",0),
("region","intptr",0),
("count","int",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property area index "area" read _getvalue_ write _setvalue_;
end
type _GdkEventNoExpose=class(_GdkEventAny)
function Create(ptr);
begin
inherited;
end
end
type _GdkEventVisibility=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("state","int",0)
),nil,nil,4);
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property state index "state" read _getvalue_ write _setvalue_;
end
type _GdkEventCrossing=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("subwindow","intptr",0),
("time","int",0),
("x","double",0),
("y","double",0),
("x_root","double",0),
("y_root","double",0),
("mode","intptr",0),
("detail","intptr",0),
("focus","int",0),
("state","int",0)
),nil,nil,4);
{GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
GDK_WINDOW_STATE_STICKY = 1 << 3,
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
GDK_WINDOW_STATE_ABOVE = 1 << 5,
GDK_WINDOW_STATE_BELOW = 1 << 6}
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
end
type _GdkEventWindowState=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
("ttype","intptr",0),
("window","intptr",0),
("send_event","byte",0),
("changed_mask","int",0),
("new_window_state","int",0)
),nil,nil,4);
{GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
GDK_WINDOW_STATE_STICKY = 1 << 3,
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
GDK_WINDOW_STATE_ABOVE = 1 << 5,
GDK_WINDOW_STATE_BELOW = 1 << 6}
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property ttype index "ttype" read _getvalue_ write _setvalue_;
property window index "window" read _getvalue_ write _setvalue_;
property send_event index "send_event" read _getvalue_ write _setvalue_;
property changed_mask index "changed_mask" read _getvalue_ write _setvalue_;
property new_window_state index "new_window_state" read _getvalue_ write _setvalue_;
end
type _GtkTextIter=class(tslcstructureobj)
static classstruct;
class function getstruct();
begin
if not classstruct then
begin
classstruct := MemoryAlignmentCalculate(array(
("dummy1","intptr",0),
("dummy2","intptr",0),
("dummy3","int",0),
("dummy4","int",0),
("dummy5","int",0),
("dummy6","int",0),
("dummy7","int",0),
("dummy8","int",0),
("dummy9","intptr",0),
("dummy10","intptr",0),
("dummy11","int",0),
("dummy12","int",0),
("dummy13","int",0),
("dummy14","intptr",0),
("dummy15","intptr",0)
),nil,nil,4);
end
return classstruct;
end
function create(ptr);
begin
class(tslcstructureobj).create(getstruct(),ptr);
end
end
type _GdkColor=class(tslcstructureobj)
static classstruct;
class function getstruct();
begin
if not classstruct then
begin
classstruct := MemoryAlignmentCalculate(array(
("p","int",0),
("r","short",0),
("g","short",0),
("b","short",0)));
end
return classstruct;
end
function create(ptr);
begin
class(tslcstructureobj).create(getstruct(),ptr);
end
function SetRgb(red,green,blue);
begin
r := red;
g := green;
b := blue;
end
property p index "p" read _getvalue_ write _setvalue_;
property r index "r" read _getvalue_ write _setvalue_;
property g index "g" read _getvalue_ write _setvalue_;
property b index "b" read _getvalue_ write _setvalue_;
end
type ttgtk_pen=class(tslcstructureobj)
private
static SSTRUCT;
class function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(("lopenstyle","int",0),
("lopnwidth","int",1),
("lopnwidth2","int",0),
("lopncolor","int",0)));
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
_wapi := unit(tslvcl).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 := unit(tslvcl).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 := unit(tslvcl).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
implementation
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////额外定义的结构体 为了适应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
type TSTYLESTRUCT = class(tslcstructureobj)
private
static SSTRUCT;
function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
("styleold","int",0),
("stylenew","int",0)));
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property styleold index "styleold" read _getvalue_ write _setvalue_ ;
property stylenew index "stylenew" read _getvalue_ write _setvalue_ ;
end
type TCREATESTRUCT = class(tslcstructureobj)
private
static SSTRUCT;
function getstruct()
begin
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(
array(
("lpcreateparams","intptr",0),
("hinstance","intptr",0),
("hmenu","intptr",0),
("hwndparent","intptr",0),
("cy","int",0),
("cx","int",0),
("y","int",0),
("x","int",0),
("style","int",0),
("lpszname","intptr",0),
("lpszclass","intptr",0),
("dwexstyle","int",0)));
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
end
property style index "style" read _getvalue_ write _setvalue_;
property dwexstyle index "dwexstyle" read _getvalue_ write _setvalue_;
end
type TScrollinfo = class(tslcstructureobj)
private
static SSTRUCT;
function getstruct()
begin
if not SSTRUCT then SSTRUCT :=
MemoryAlignmentCalculate(
array(
("cbsize","int",0),
("fmask","int",0),
("nmin","int",0),
("nmax","int",0),
("npage","int",0),
("npos","int",0),
("ntrackpos","int",0)));
return SSTRUCT;
end
public
function create(ptr)
begin
inherited create(getstruct(),ptr);
cbsize := _size_();
end
property cbsize:integer index "cbsize" read _getvalue_ write _setvalue_;
property fmask:integer index "fmask" read _getvalue_ write _setvalue_;
property nmin:integer index "nmin" read _getvalue_ write _setvalue_;
property nmax:integer index "nmax" read _getvalue_ write _setvalue_;
property npage:integer index "npage" read _getvalue_ write _setvalue_;
property npos:integer index "npos" read _getvalue_ write _setvalue_;
property ntrackpos:integer index "ntrackpos" read _getvalue_ write _setvalue_;
end
/////////////////////////////////额外定义的结构体 为了适应windows api///////////////////////////////////////////
type _gslist =class(tslcstructureobj)
static classstruct;
class function getstruct();
begin
if not classstruct then
begin
classstruct := MemoryAlignmentCalculate( array(
("data","intptr",0),
("next","intptr",0)),nil,nil,4);
end
return classstruct;
end
function create(ptr);
begin
class(tslcstructureobj).create(getstruct(),ptr);
end
property data index "data" read _getvalue_ write _setvalue_ ;
property next index "next" read _getvalue_ write _setvalue_ ;
end
type tenterouterlist = class
function push(d);
begin
FIndex++;
FList[FIndex] := d;
end
function lock();
begin
FLock := true;
end
function unlock();
begin
FLock := false;
end
function MouseIsMoved();
begin
if FLock then return ;
id := FList[FIndex];
if not id then return ;
ps := array(0,0);
_wapi.GetCursorPos(ps);
if FCpos = ps then return ;
FCpos := ps;
if Mousehittest then call(Mousehittest,self,id);
if Mousemovecall then call(Mousemovecall,self,id);
end
function feach();
begin
return FList[FIndex];
end
function inner(h);
begin
for i,v in FList do
begin
if v=h then return true;
end
return false;
end
function pop(d);
begin
for i := 0 to length(FList)-1 do
begin
if d=FList[i] then
begin
deleteindex(FList,i,true);
FIndex--;
end
end
end
function create(api);
begin
_wapi := api;
FCpos := array(0,0);
_wapi.GetCursorPos(FCpos);
FList := array();
FIndex := -1;
FTimer := new unit(tslvcl).TTimer();
FTimer.interval := 30; //30毫秒
FTimer.Ontimer := thisfunction(MouseIsMoved);
FTimer.start();
end
function destroy();
begin
FIndex := -1;
FList := array();
FTimer.stop();
FTimer := nil;
end
Mousemovecall;
Mousehittest;
_wapi;
FCpos;
private
FLock;
FIndex ;
FList;
end
type tgtk_ctl_object = class(_gtkeventtype)
private
FHitwidgetposition;
static FsysCursors;
Fsyscommand0x12;
Fsyscommand0x12info;
protected
//////////////////////样式////////
Fdwstyle;
FExdwstyle;
///////////////////////////////////
function CanignoreBtnpress();virtual;
begin
return true;
end
public
function Create(h); //构造
begin
sinit();
if not _wapi then
begin
_const := getwin32const();
_wapi := unit(tslvcl).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]));
AddMessageToGtkMessageQueue(id,_const.WM_MOUSEMOVE,0,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
r := unit(tslvcl)._twinproc_(FHandle,msg,w,l);
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_decorated") then return ;
rsz := _wapi.gtk_object_get_data(FHandle,"gtk_widget_resizeable");
if rsz then
begin
unit(tslvcl).lowuperdword(l,lo,hi);
ht := _wapi.hittestwidget(FHandle,lo,hi);
FHitwidgetposition := ht;
if ht=10 or ht=11 then
begin
//return _wapi.gdk_window_set_cursor(wd,FsysCursors[1]) ;
g_show_cursor_window := 0;
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[1]);
end else
if ht=12 or ht=15 then
begin
g_show_cursor_window := 0;
//return _wapi.gdk_window_set_cursor(wd,FsysCursors[2]) ;
AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,wd,FsysCursors[2]);
end
end
//_wapi.gdk_window_set_cursor(wd,FsysCursors[0]) ;
return AddMessageToGtkMessageQueue(FHandle,CM_CURSORCHANGED,0,0);
end
end ;
end else
if not r then
begin
DefaultMessageDo(msg,w,l);
end
return r;
end
end
function executeMessage(msg,w,l);virtual; //执行消息
begin
return CallTslVclProc(msg,w,l);
return 0;
end
function GetScrollInfo(nBar,si);virtual;
begin
end
function setScrollInfo(nBar,si,redraw);virtual;
begin
end
function GetWidnowLong(idx);virtual; //样式
begin
case idx of
_const.GWL_EXSTYLE :
begin
return FExdwstyle;
end
_const.GWL_STYLE :
begin
return Fdwstyle;
end
end ;
end
function SetWidnowLong(idx,v);virtual; //样式
begin
stl := new TSTYLESTRUCT(nil);
stl.styleold := 0;
case idx of
_const.GWL_EXSTYLE :
begin
if FExdwstyle<>v then
begin
FExdwstyle := V;
stl.stylenew := dwExStyle;
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_EXSTYLE,stl._getptr_());
end
end
_const.GWL_STYLE :
begin
if Fdwstyle <> V then
begin
Fdwstyle := V;
stl.stylenew := v;
CallTslVclProc(_const.WM_STYLECHANGED,_const.GWL_STYLE,stl._getptr_());
end
end
end ;
end
function widgetsizechanged(h,w);virtual; //大小改变
begin
CallTslVclProc(_const.WM_SIZE,0,makelong(w,h));
end
fimhandle;
function gdk_window_get_state(w:pointer):integegr;cdecl;external 'libgtk-3.so';
function GtkEventDispatchA(a,b,c,d);//gtk消息分发
begin
global g_gtk_scroll_lock;
if g_gtk_scroll_lock then
begin
return true;
end
if FHitwidgetposition in array(110,111,112,115) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
begin
e := new _GdkEventAny(c);
if 3=e.ttype then
begin
ogps := Fsyscommand0x12info[0];
xy := Fsyscommand0x12info[1];
cxy := array(0,0);
_wapi.GetCursorPos(cxy);
dx := cxy[0]-ogps[0];
dy := cxy[1]-ogps[1];
case FHitwidgetposition of
110:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,0,xy[0]+dx,xy[1],xy[2]-dx,xy[3],0);
end
111:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,0,xy[0],xy[1],xy[2]+dx,xy[3],0);
end
112:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,0,xy[0],xy[1]+dy,xy[2],xy[3]-dy,0);
end
115:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,0,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 not ifarray(g_gtk_buttontable) then g_gtk_buttontable := array(0,0);
if not ifarray(g_gtk_keytable) then g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
if mn = "event" then
begin
e := new _GdkEventAny(c);
case e.ttype of
GDK_WINDOW_STATE:
begin
{st := gdk_window_get_state(e.window);//.& 0xffff;
if (st .& 32) = 32 then
begin
echo "\r\n above";
end else
if (st .& 64) = 64 then
begin
echo "\r\n blowe";
end }
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
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
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
g_gtk_buttontable[0] := 0;
CallTslVclProc(_const.WM_LBUTTONUP ,wp,psi);
end
3:begin
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
32:
begin
//echo tostn(new _GdkEventWindowState(c)._getdata_());
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 return true;
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 getsingalmap();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 := (getsingalmap())[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 datatype(c)=7 then
begin
pms2 := pms;
pms2[0] := self;
r := callinarray(c,pms2);
if needdestroy() then
begin
if r = 0 and FDestroysignalId=xxid then
begin
DefaultDestroyHandler(pms);
//callinarray(thisfunction(DefaultDestroyHandler),pms);
end
end
return r;
end else
begin
if FDestroysignalId=xxid and needdestroy() then
begin
DefaultDestroyHandler(pms);
//callinarray(thisfunction(DefaultDestroyHandler),pms);
end
end
return true;
end
function destroy();virtual; //销毁
begin
if FHandle<>0 then
begin
reindex(TGtkObjects,array(inttostr(FHandle):nil));
//_wapi.g_object_unref(FHandle);
end
FRegisterWMUSER := 0;
//tsl_gtk_remove_widget_thread(FHandle);
FHandle := 0;
FConnectHandlers := array();
FConnectNameIds := array();
FValues := array();
end
function SetValue(n,v);
begin
FValues[n] := v;
end
function GetValue(n);
begin
return FValues[n];
end
property handle read FHandle write SetHandle;
static _wapi;
static _const;
private
FHandle;
class function gtk_widget_get_type():pointer;cdecl;external 'libgtk-3.so';
class function gettslvcleventhandler(n:string):pointer;cdecl;external "./plugin/libTSLUIL.so" name "gettslvcleventhandler";
class procedure g_signal_handler_disconnect(instance:pointer;id:integer);cdecl;external 'libgtk-3.so';
class function g_signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer;cdecl;external 'libgtk-3.so';
class function g_signal_new(signal_name:string;
itype:pointer;
signal_flags:integer;
class_offset:integer;
accumulator:pointer;
accu_data:pointer;
c_marshaller:pointer;
return_type:pointer;
n_params:integer;
p1:pointer;
p2:pointer):integer;cdecl;external 'libgtk-3.so';
FConnectNameIds;
FConnectHandlers;
FValues;
FDestroysignalId;
static TGtkObjects;
Static FinitNewSignaled;
function SetHandle(h);
begin
if FHandle then return 0;
initNewSingal();
FConnectNameIds := array();
FConnectHandlers := array();
FValues := array();
FHandle := 0;
if h then
begin
FHandle := h;
_wapi.g_object_ref(h);
if not ifarray(TGtkObjects) then TGtkObjects := array();
TGtkObjects[inttostr(h)] := self(true);
FDestroysignalId := GetGtkEventNameOrId("destroy");
if needdestroy() then
Connect("destroy",thisfunction(DefaultDestroyHandler));
return true;
end
end
class function initNewSingal();
begin
return ;
//wm-user
if FinitNewSignaled then return ;
FinitNewSignaled := true;
for i,v in array(gtk_widget_get_type()) do
begin
g_signal_new("wm-user",
v,
2,
0,
nil,
nil,
0,
4,
2,
17*4,68);
end
end
function FormularSingalName(n);
begin
r := "";
for i := 1 to length(n) do
begin
vi := n[i];
if vi="_" then r+="-";
else r+=vi;
end
return r;
end
function needdestroy();virtual;
begin
return true;
end
static FMousemoveernotify;
class function getfimobj();
begin
if not FImobj then FImobj := new tgtk_im_object(nil);
return FImobj;
end
static FImobj;
end
type tscrollobject = class
fbar;
fadj;
fpgcount;
fsi;
function create(bar,adj,si);
begin
fbar :=bar;
fadj := adj;
fsi := si;
end
end
type tgtk_im_object = class(tgtk_ctl_object)
function Create(h);override;
begin
h := _wapi.gtk_im_multicontext_new();
inherited;
f := thisfunction(GtkEventDispatchA);
//_Wapi.gtk_widget_set_events(h,16777214);
for i,v in GtkBaseEventName() do
begin
//echo "\r\n connect",v,"***",
Connect(v,f);
end
end
function getsingalmap();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);
//echo FCommit,FCtl,"**\r\n";
if FCtl then
begin
s := utf8toansi(FCommit);
for i:= 1 to length(s) do
begin
//echo "***\r\n",ord(s[i]),">>",FCtl._const.WM_CHAR,"<<<";
FCtl.CallTslVclProc(_const.WM_CHAR,ord(s[i]),0);
end
end
//echo "cmt=====",tostn(FCommit);
end
end;
end
function GtkBaseEventName();override; //绑定的消息
begin
//"commit","delete-surrounding",
return array("commit");//,"preedit-changed","preedit-end","preedit-start","retrieve-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;
//Connect("event",thisfunction(scrollevent));
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));
hwd := handle;
_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]);
//mtic;
CallTslVclProc(_const.WM_PAINT,0,0); //绘制
_wapi.cairo_set_dash(cr,array(4.0,0.0),2,0);
if not(self(true) is class(tgtk_ctl_window_PoPup)) then
begin
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
_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
//echo "\r\nctl:",tostn(params),tostn(__stack_frame),datetimetostr(now());
d := new tslcstructureobj(MemoryAlignmentCalculate( array(("lpcreateparams","intptr",0))),lpParam);
isp := unit(tslvcl).controlisCustomPaint(d._getvalue_("lpcreateparams"));
h := self.handle;
{if (_const.WS_BORDER .& dwStyle)=_const.WS_BORDER then
begin
_wapi.gtk_container_set_border_width(h,1);
end }
_wapi.gtk_widget_set_can_focus(h,true);
if isp and FClientWideget then //自绘制
begin
FClientObject := new tgtk_ctl_object(FClientWideget);
_wapi.g_object_set_data(h,"gtk_clientwideget",FClientWideget);
FClientObject.Connect("draw",thisfunction(scrollwindowdraw));
_wapi.gtk_widget_set_app_paintable(FClientWideget, TRUE); //绘制
end
//隐藏滚动条
_wapi.gtk_widget_hide(FHscrollbar);
_wapi.gtk_widget_hide(Fvscrollbar);
_wapi.g_object_set_data(h,"gtk_window_vscroll_bar",Fvscrollbar);
_wapi.g_object_set_data(h,"gtk_window_hscroll_bar",Fhscrollbar);
FScroller := array();
fvsi := new TScrollinfo();
fhsi := new TScrollinfo();
v1 := new tscrollobject(Fvscrollbar,Fvadjustment,fvsi);
v2 := new tscrollobject(FHscrollbar,Fhadjustment,fhsi);
FScroller[_const.SB_HORZ] := v2;
FScroller[_const.SB_VERT] := v1;
return inherited;
end
function widgetsizechanged(h_,w_);override; //大小改变
begin
h := h_;
w := w_;
hwd := self.handle;
mb := _wapi.g_object_get_data(hwd,"menubar");
if mb and _wapi.gtk_widget_is_visible(mb) then
begin
rec := zeros(4);
_wapi.gtk_widget_get_allocation(mb,rec);
if rec[3]>1 then
begin
h-= rec[3];//max(rec[3],25);
end else
begin
gist := _wapi.gtk_container_get_children(mb); //处理
if gist then
begin
h-=25;
end
end
end
scrlsize := 12;
if (fbarshow .& 1)=1 then //v
begin
_wapi.gtk_widget_set_size_request(FHscrollbar,w-scrlsize,scrlsize);
end else _wapi.gtk_widget_set_size_request(FHscrollbar,w,scrlsize);
if (fbarshow .& 2)=2 then //h
begin
_wapi.gtk_widget_set_size_request(Fvscrollbar,scrlsize,h-scrlsize);
end else _wapi.gtk_widget_set_size_request(Fvscrollbar,scrlsize,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,w,h);
//inherited widgetsizechanged(h,w);
end //else inherited widgetsizechanged(h,w);
inherited widgetsizechanged(h,w);
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
static fstaticchanged;
function GtkEventDispatch(a,mn,c,d);override;
begin
//消息分发
if mn="scroll-event" then
begin
h := a.handle;
nt := now();
if (nt-(1/24/3600/20))<FScrollT then
begin
return true;
end
ed := new _GdkEventScroll(c);
dr := ed.direction;
if dr<>0 and dr<>1 then return ;
x := ed.x_root;
y := ed.y_root;
r := array();
_wapi.GetTopWidgetList(h,x,y,r);
lenr := length(r)-1;
for i := lenr downto 0 do
begin
ri := r[i][0];
rxy := r[i][1];
fv := _wapi.g_object_get_data(ri,"gtk_window_vscroll_bar");
if fv and _wapi.gtk_widget_is_visible(fv) then
begin
ifdowheel := true;
break;
end
end
if not ifdowheel then
begin
ri := r[lenr][0];
rxy := r[lenr][1];
end
if ri and rxy then
begin
if hasMessageFromGtkMessageQueue(-1,_const.LM_MOUSEWHEEL) then return true;
if hasMessageFromGtkMessageQueue(-1,_const.WM_SIZE) then return true;
if hasMessageFromGtkMessageQueue(-1,_const.WM_MOUSEMOVE) then return true;
FScrollT := now();
dr := (dr=1)?-1:1;
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
function Destroy();override;
begin
inherited;
FHadjustment := nil;
Fvadjustment := nil;
FHscrollbar := nil;
Fvscrollbar := nil;
FLayouter := nil;
Fvscrollbarobj := nil;
Fhscrollbarobj := nil;
FClientWideget := nil;
end
protected
function initadjustSingal();
begin
FHadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
FHscrollbar := _wapi.gtk_hscrollbar_new(FHadjustment);
//////////////////////////垂直滚动条////////////////////////////////////
FVadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
Fvscrollbar := _wapi.gtk_vscrollbar_new(FVadjustment);
_wapi.gtk_layout_put(FLayouter,Fvscrollbar,0,0);
_wapi.gtk_layout_put(FLayouter,FHscrollbar,0,0);
fhadjustobject := new tgtk_ctl_object_scroll(FHadjustment);
fvadjustobject := new tgtk_ctl_object_scroll(Fvadjustment);
fhadjustobject.Connect("value-changed",thisfunction(hadjustmentchanged));
fvadjustobject.Connect("value-changed",thisfunction(vadjustmentchanged));
Fvscrollbarobj := new tgtk_ctl_object_scroll_Bar(Fvscrollbar);
Fvscrollbarobj.Connect("button-press-event",thisfunction(vadjustmentmousedown));
Fvscrollbarobj.Connect("button-release-event",thisfunction(vadjustmentmouseup));
Fhscrollbarobj := new tgtk_ctl_object_scroll_Bar(Fhscrollbar);
Fhscrollbarobj.Connect("button-press-event",thisfunction(hadjustmentmousedown));
Fhscrollbarobj.Connect("button-release-event",thisfunction(hadjustmentmouseup));
end
FLayouter; //layout
FHscrollbar; //滚动条控件
Fvscrollbar;
Fvscrollbarobj; //滚动条对象
Fhscrollbarobj;
FHadjustment; //滚动条adjustment
Fvadjustment;
fhadjustobject;
fvadjustobject;
FClientWideget; //客户区
FClientObject;
private
FScrollT;
fvsi; //滚动条信息
fhsi;
fbarshow;
FVBardown; //滚动条按下
FHBardown;
FScroller;
end
type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
function Create(h);override;
begin
inherited;
end
function DefaultMessageDo(msg,w,l);override;
begin
if msg = _const.WM_SETICON then
begin
if l then
begin
h := handle;
_wapi.gtk_window_set_icon(h,l);
end
end
inherited;
end
function GtkEventDispatch(a,mn,c,d);override;
begin
//消息分发
//echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n";
case mn of
"configure-event" :
begin
//return false;
h := a.handle;
x := _wapi.g_object_get_data(h,"gtk_layout_x");
y := _wapi.g_object_get_data(h,"gtk_layout_y");
cx := _wapi.g_object_get_data(h,"gtk_layout_width");
cy := _wapi.g_object_get_data(h,"gtk_layout_height");
cf := new _GdkEventConfigure(c);
ALeft := integer(cf.x);
ATop := integer(cf.y);
//echo "\r\n>>>",ALeft,"===",ATop;
AWidth := integer(cf.width);
AHeight := integer(cf.height);
SizeChanged :=(cx <> AWidth)or(cy <> AHeight);
PosChanged :=(x <> ALeft)or(y <> ATop);
if(not SizeChanged)and(not PosChanged)then
begin
Exit;
end
if (cx <> AWidth) then _wapi.g_object_set_data(h,"gtk_layout_width",AWidth);
if cy <> AHeight then _wapi.g_object_set_data(h,"gtk_layout_height",AHeight);
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,(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_decorated",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_decorated",0);
//无菜单顶层窗口
end else
begin
_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);
_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,nheight);
//_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,y);
if nwidth>0 and nheight>0 then
begin
_wapi.gtk_window_resize(h,nwidth,nheight);
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_ctl_window = class(tgtk_ctl_scroll_window)
function Create(h);override;
begin
inherited;
end
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
begin
h := _wapi.gtk_event_box_new();//控件层
ctllayout := _Wapi.gtk_layout_new(0,0);//控件布局层
_wapi.gtk_container_add(h,ctllayout);
evtdrawbox := _wapi.gtk_event_box_new(); //布局绘制层
clientlayout := _wapi.gtk_layout_new(0,0); //客户区布局层
_wapi.gtk_container_add(evtdrawbox,clientlayout);
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,nheight);
//_wapi.gtk_widget_set_size_request(evtdrawbox,10000,10000);
_wapi.g_object_set_data(h,"gtk_layout",clientlayout);
_wapi.g_object_set_data(clientlayout,"gtk_layout_owner",h);
_wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h);
_wapi.gtk_widget_show_all(evtdrawbox);
FClientWideget := evtdrawbox;
InitWidgetSize(h,x,y,nwidth,nheight);
FLayouter := ctllayout;
_wapi.gtk_widget_set_size_request(h,nwidth,nheight);
_wapi.gtk_widget_show(ctllayout);
if (dwStyle .& _const.WS_VISIBLE)=_const.WS_VISIBLE then
begin
_wapi.gtk_widget_show(h);
end
/////////////////////////滚动条////////////////////////////////////
initadjustSingal();
///////////////////////////颜色处理/////////////////////////////////////////
{c := new _GdkColor(nil);
c.SetRgb(0,0xffff,0);
_wapi.gtk_widget_modify_bg(h,0,c._getptr_());}
/////////////////////////////////////////////////////////////////////
InitContainerList(h);
_wapi.SetParent(h,hwndparent);
handle := h;
return inherited;
end
end
function g_main_context_new():pointer;cdecl;external "libgtk-3.so";
function g_main_context_ref(m:pointer):pointer;cdecl;external "libgtk-3.so";
function g_main_context_acquire(m:pointer):integer;cdecl;external "libgtk-3.so";
procedure g_main_context_release(m:pointer);cdecl;external "libgtk-3.so";
type tGtkMessageQueue = class //消息队列
{**
@ignore(忽略)
gtk消息队列
**}
private
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();
FLen++;
FData[FLen] := array(h,m,l,w,obj);
unlock();
end
function Feach();
begin
lock();
if FCurrent<FLen then
begin
FCurrent++;
r := FData[FCurrent];
if (FCurrent+1<FLen) and FCurrent>100 then
begin
FData := FData[FCurrent+1:];//min(FLen-1,FCurrent+100)];
FCurrent := -1;
FLen := length(FData);
end
end
else
begin
Clean();
end
unlock();
return r;
end
function cleaneasyLostMessage(h,m);
begin
idx := FCurrent;
lock();
while idx<FLen do
begin
idx++;
if FData[idx][0]=h and FData[idx][0]=m then
begin
FData[idx][0] := 0;
end
end
unlock();
end
function haseasyLostMessage(h,m);
begin
idx := FCurrent;
if idx<FLen then
begin
idx++;
if ((h=-1) or (FData[idx][0]=h)) and FData[idx][0]=m then
begin
return 1;
end
end
end
private
function Clean();
begin
FData := array();
FLen := 0;
FCurrent := -1;
end
FData;
FCurrent;
FLen;
FLock ;
FMainContext;
function lock()
begin
return ;
fLock++;
if (fLock=1 )then
begin
g_main_context_acquire(FMainContext);
end
end
function unlock()
begin
return ;
if (fLock>0) then
begin
fLock--;
if (fLock=0) then
begin
g_main_context_release(FMainContext);
end
end
end
end
function _gtkeventcall_();//消息回调
begin
r := class(tgtk_ctl_object).DispatchGtkEventCall(params);
return r;
end
function _gtk_add_time_msg_(h,m,w,l);
begin
//定时处理
AddMessageToGtkMessageQueue(h,m,w,l,0x113);
end
function hasMessageFromGtkMessageQueue(h,m);
begin
GLobal G_GTK_MESSAGE_QUEUE_A;
if G_GTK_MESSAGE_QUEUE_A then G_GTK_MESSAGE_QUEUE_A.haseasyLostMessage(h,m);
end
function 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 );
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 := unit(tslvcl).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[4]=0x113 and d[0]=0 then //定时
begin
unit(tslvcl)._timeproc_(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]);
return r;
end
else
begin
tslprocessmessages(false);
sleep(10);
end
end else
begin
tslprocessmessages(false);
sleep(10);//休息一下
end
unit(uvclthreadworker).RunThreadWorkerHost();
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 := 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
type taggtkWNDCLASSA = class(tslcstructureobj)// 窗口类对象 %%
static classstruct;
class function getstruct();
begin
if not classstruct then
begin
classstruct := MemoryAlignmentCalculate( array(
("cbsize","int",0),
("style","int",0),
("lpfnwndproc","intptr",0),
("cbclsextra","int",0),
("cbwndextra","int",0),
("hinstance","intptr",0),
("hicon","intptr",0),
("hcursor","intptr",0),
("hbrbackground","intptr",0),
("lpszmenuname","intptr",0),//("lpszmenuname","char*",100),
("lpszclassname","char*",100),
("hiconsm","intptr",0)));
end
return classstruct;
end
function create(ptr);
begin
class(tslcstructureobj).create(getstruct(),ptr);
_setvalue_("cbsize",_size_());
end
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 unit(tslvcl).TSLUIBASE();
end
function makelong(l,h,p);
begin
return unit(tslvcl).makelong(l,h,p);
end
function tsl_gtk_get_thread();
begin
return static systhreadid();
end
type _gtkeventtype=class
static GTK_EVENT_ISNIT;
static GDK_DELETE;
static GDK_DESTROY;
static GDK_EXPOSE;
static GDK_MOTION_NOTIFY;
static GDK_BUTTON_PRESS;
static GDK_2BUTTON_PRESS;
static GDK_3BUTTON_PRESS;
static GDK_BUTTON_RELEASE;
static GDK_KEY_PRESS;
static GDK_KEY_RELEASE;
static GDK_ENTER_NOTIFY;
static GDK_LEAVE_NOTIFY;
static GDK_FOCUS_CHANGE;
static GDK_CONFIGURE;
static GDK_MAP;
static GDK_UNMAP;
static GDK_PROPERTY_NOTIFY;
static GDK_SELECTION_CLEAR;
static GDK_SELECTION_REQUEST;
static GDK_SELECTION_NOTIFY;
static GDK_PROXIMITY_IN;
static GDK_PROXIMITY_OUT;
static GDK_DRAG_ENTER;
static GDK_DRAG_LEAVE;
static GDK_DRAG_MOTION;
static GDK_DRAG_STATUS;
static GDK_DROP_START;
static GDK_DROP_FINISHED;
static GDK_CLIENT_EVENT;
static GDK_VISIBILITY_NOTIFY;
static GDK_NO_EXPOSE;
static GDK_SCROLL;
static GDK_WINDOW_STATE;
static GDK_SETTING;
static GDK_OWNER_CHANGE;
static GDK_GRAB_BROKEN;
static GDK_DAMAGE;
static GDK_NOTHING;
static GTK_RESPONSE_HELP;
static GTK_RESPONSE_APPLY;
static GTK_RESPONSE_NO;
static GTK_RESPONSE_YES;
static GTK_RESPONSE_CLOSE;
static GTK_RESPONSE_CANCEL;
static GTK_RESPONSE_OK;
static GTK_RESPONSE_DELETE_EVENT;
static GTK_RESPONSE_ACCEPT;
static GTK_RESPONSE_REJECT;
static GTK_RESPONSE_NONE;
class function sinit();
begin
if GTK_EVENT_ISNIT then return ;
GTK_EVENT_ISNIT := true;
GDK_DELETE := 0;
GDK_DESTROY := 1;
GDK_EXPOSE := 2;
GDK_MOTION_NOTIFY := 3;
GDK_BUTTON_PRESS := 4;
GDK_2BUTTON_PRESS := 5;
GDK_3BUTTON_PRESS := 6;
GDK_BUTTON_RELEASE := 7;
GDK_KEY_PRESS := 8;
GDK_KEY_RELEASE := 9;
GDK_ENTER_NOTIFY := 10;
GDK_LEAVE_NOTIFY := 11;
GDK_FOCUS_CHANGE := 12;
GDK_CONFIGURE := 13;
GDK_MAP := 14;
GDK_UNMAP := 15;
GDK_PROPERTY_NOTIFY := 16;
GDK_SELECTION_CLEAR := 17;
GDK_SELECTION_REQUEST := 18;
GDK_SELECTION_NOTIFY := 19;
GDK_PROXIMITY_IN := 20;
GDK_PROXIMITY_OUT := 21;
GDK_DRAG_ENTER := 22;
GDK_DRAG_LEAVE := 23;
GDK_DRAG_MOTION := 24;
GDK_DRAG_STATUS := 25;
GDK_DROP_START := 26;
GDK_DROP_FINISHED := 27;
GDK_CLIENT_EVENT := 28;
GDK_VISIBILITY_NOTIFY := 29;
GDK_NO_EXPOSE := 30;
GDK_SCROLL := 31;
GDK_WINDOW_STATE := 32;
GDK_SETTING := 33;
GDK_OWNER_CHANGE := 34;
GDK_GRAB_BROKEN := 35;
GDK_DAMAGE := 36;
GDK_NOTHING := -1;
GTK_RESPONSE_HELP := -11;
GTK_RESPONSE_APPLY := -10;
GTK_RESPONSE_NO := -9;
GTK_RESPONSE_YES := -8;
GTK_RESPONSE_CLOSE := -7;
GTK_RESPONSE_CANCEL := -6;
GTK_RESPONSE_OK := -5;
GTK_RESPONSE_DELETE_EVENT := -4;
GTK_RESPONSE_ACCEPT := -3;
GTK_RESPONSE_REJECT := -2;
GTK_RESPONSE_NONE := -1;
end
end
initialization
end.