为Wayland做准备
This commit is contained in:
tslediter 2023-12-14 11:01:02 +08:00
parent 6dd3e015b9
commit afdfe2e2f7
1 changed files with 302 additions and 146 deletions

View File

@ -22,7 +22,7 @@ type tsgtkapi = class(tgtkapis)
function AnsiToWidChar(c);
begin
if not ifstring(c) then return "";
return c;
return widestring(c);
end
function GetModuleFileNameExA();
begin
@ -113,12 +113,16 @@ type tsgtkapi = class(tgtkapis)
global g_w_c_width;
pcd := gtk_object_get_data(hwd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_window_move(hwd,x,max(0,y-pcd));
if w>=0 and h>=0 then
gtk_widget_set_size_request(hwd,w,max(0,h-pcd));
if w>=0 and h>=0 then
begin
//gtk_window_set_default_size(hwd,w,max(0,h-pcd));
//gtk_widget_set_size_request(hwd,w,max(0,h-pcd));
gtk_window_resize(hwd,w,max(0,h-pcd));
end
end
if f=0x4 then
begin
if not gtk_window_get_decorated(hwd) then
//if not gtk_window_get_decorated(hwd) then
gtk_window_set_type_hint(hwd,3);
if cf and cf<>g_current_get_focus_widget then //设置一下focus
begin
@ -303,28 +307,41 @@ type tsgtkapi = class(tgtkapis)
h0 := g_object_get_data(h,"gtk_layout_height");
if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then
begin
if gtk_window_get_resizable(h) then
{if gtk_window_get_resizable(h) then
begin
gtk_widget_get_size_request(h,cx0,cy0); //改小一点
if cx0>cx or cy0>cy then
begin
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
end
gtk_window_resize(h,cx,max(0,cy-pcd));
//gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
//gtk_window_set_default_size(h,cx,max(0,cy-pcd));
//echo "\r\nresize:",cx,"===",cy;
//gtk_window_resize(h,cx,max(0,cy-pcd));
end
else
begin
//gtk_widget_get_size_request(h,cx0,cy0);
//echo "\r\noldsize:",cx0,"====",cy0;
//gtk_window_resize(wh,cx,cy);
//
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
//gtk_window_resize(wh,cx,max(0,cy-pcd));
//gtk_window_set_default_size(h,cx,max(0,cy-pcd));
//gtk_window_set_decorated(h,true);
//gtk_window_set_resizable(h,true);
//gtk_window_resize(h,cx,cy);
//gtk_window_set_decorated(h,false);
//gtk_window_resize_to_geometry(h,cx,cy);
end
end }
if gtk_window_get_resizable(h) then
begin
gtk_widget_set_size_request(h,1,1);
end else
begin
gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
end
gtk_window_resize(h,cx,max(0,cy-pcd));
g_object_set_data(h,"gtk_layout_width",cx);
g_object_set_data(h,"gtk_layout_height",cy);
flg .|=1;
@ -3995,6 +4012,18 @@ type tgtkapis = class() //gtk
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_();
end
function gdk_keymap_get_for_display(disp:pointer):pointer;
begin
_f_ := static function(disp:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(disp);
end
function gdk_keymap_get_modifier_state(kmp:pointer):integer;
begin
_f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(kmp);
end
function gdk_screen_get_default():pointer;
begin
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
@ -4231,10 +4260,10 @@ type tgtkapis = class() //gtk
_f_ := static procedure(w:pointer;tip:string);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,tip);
end
procedure gtk_widget_set_size_request(wd:pointer;h:integer;w:integer);
procedure gtk_widget_set_size_request(wd:pointer;w:integer;h:integer);
begin
_f_ := static procedure(wd:pointer;h:integer;w:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,h,w);
_f_ := static procedure(wd:pointer;w:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,w,h);
end
procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer);
begin
@ -4831,6 +4860,11 @@ type tgtkapis = class() //gtk
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_();
end
function gdk_window_get_window_type(w:pointer);
begin
_f_ := static function(w:pointer):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w);
end
procedure gdk_window_move_resize(w:pointer;x:integer;y:integer;wd:integer;h:integer);
begin
_f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname());
@ -4897,10 +4931,10 @@ type tgtkapis = class() //gtk
_f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,p);
end
procedure gtk_window_get_size(wd:pointer;var h:integer;var w:integer);
procedure gtk_window_get_size(wg:pointer;var w:integer;var h:integer);
begin
_f_ := static procedure(wd:pointer;var h:integer;var w:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,h,w);
_f_ := static procedure(wg:pointer;var w:integer;var h:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wg,w,h);
end
procedure gtk_window_set_icon(w:pointer;ico:pointer);
begin
@ -4912,6 +4946,11 @@ type tgtkapis = class() //gtk
_f_ := static procedure(w:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,ps);
end
procedure gtk_window_set_default_size(p:pointer;w:integer;h:integer);
begin
_f_ := static procedure(p:pointer;w:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(p,w,h);
end
procedure gtk_window_set_resizable(p:pointer;f:integer);
begin
_f_ := static procedure(p:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname());
@ -4937,6 +4976,16 @@ type tgtkapis = class() //gtk
_f_ := static procedure(w:pointer;t:string);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,t);
end
procedure gtk_window_set_titlebar(w:pointer;t:pointer);
begin
_f_ := static procedure(w:pointer;t:pointer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,t);
end
function gtk_window_get_titlebar(w:pointer);
begin
_f_ := static function(w:pointer):pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w);
end
procedure gtk_window_set_geometry_hints (window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer);
begin
_f_ := static procedure(window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer);cdecl;external getfuncptrbyname(0,functionname());
@ -6560,8 +6609,9 @@ type tgtk_ctl_object = class(_gtkeventtype)
Fdwstyle;
FExdwstyle;
///////////////////////////////////
function CanignoreBtnpress();virtual;
function CanignoreBtnpress();virtual; //忽略
begin
// return false;
return true;
end
public
@ -6583,6 +6633,22 @@ type tgtk_ctl_object = class(_gtkeventtype)
FHitwidgetposition := 0;
end
static FLastPosition;
class function mywidgetmousehit(id,p);
begin
return executeMessageA(id,_const.WM_NCHITTEST,0,makelong(p[0],p[1]));
end
class function mywidgetmousemovecall(id,p);
begin
if hasMessageFromGtkMessageQueue(id,_const.WM_MOUSEMOVE) then return ;
mp := makelong(p[0],p[1]);
global g_gtk_keytable,g_gtk_buttontable;
wp := 0;
if g_gtk_keytable[0x10] then wp .|= 0x0004;
if g_gtk_keytable[0x11] then wp .|= 0x0008;
wp .|= g_gtk_buttontable[0];
wp .|= g_gtk_buttontable[1];
AddMessageToGtkMessageQueue(id,_const.WM_MOUSEMOVE,wp,mp,0);
end
class function widgetmousehit(nfer,id);
begin
_wapi.GetCursorPos(p);
@ -6767,86 +6833,97 @@ type tgtk_ctl_object = class(_gtkeventtype)
_f_ := static function(w:pointer):integegr;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w);
end
function imitate_event_size();virtual; //模拟移动
begin
return true;
end
function get_ignore_event_type(tp);virtual;
begin
return false;
end
function GtkEventDispatchA(a,b,c,d);//gtk消息分发
begin
global g_gtk_scroll_lock;
if g_gtk_scroll_lock then
begin
return true;
end
if FHitwidgetposition in array(110,111,112,115) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
if imitate_event_size() then
begin
global g_gtk_scroll_lock;
if g_gtk_scroll_lock then
begin
e := new _GdkEventAny(c);
if 3=e.ttype then
begin
ogps := Fsyscommand0x12info[0];
xy := Fsyscommand0x12info[1];
cxy := array(0,0);
_wapi.GetCursorPos(cxy);
dx := cxy[0]-ogps[0];
dy := cxy[1]-ogps[1];
case FHitwidgetposition of //0 ÐÞ¸ÄΪ -1
110:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0]+dx,xy[1],xy[2]-dx,xy[3],0);
end
111:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2]+dx,xy[3],0);
end
112:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1]+dy,xy[2],xy[3]-dy,0);
end
115:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2],xy[3]+dy,0);
end
end;
return 1;
end else
if 7 = e.ttype then
begin
FHitwidgetposition := 0;
Fsyscommand0x12info := nil;
FMousemoveernotify.unlock();
//return ;
end
end
end else
if Fsyscommand0x12 and ifarray(Fsyscommand0x12info) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
return true;
end
if FHitwidgetposition in array(110,111,112,115) then
begin
e := new _GdkEventAny(c);
if 3=e.ttype then
mn := GetGtkEventNameOrId(b);
if mn="event" 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
e := new _GdkEventAny(c);
if 3=e.ttype then
begin
_wapi.SetWindowPos(a.handle,0,xy[0]+dx,xy[1]+dy,-1,-1,0);
ogps := Fsyscommand0x12info[0];
xy := Fsyscommand0x12info[1];
cxy := array(0,0);
_wapi.GetCursorPos(cxy);
dx := cxy[0]-ogps[0];
dy := cxy[1]-ogps[1];
case FHitwidgetposition of //0 修改为 -1
110:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0]+dx,xy[1],xy[2]-dx,xy[3],0);
end
111:
begin
if dx<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2]+dx,xy[3],0);
end
112:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1]+dy,xy[2],xy[3]-dy,0);
end
115:
begin
if dy<>0 then _wapi.SetWindowPos(a.handle,-1,xy[0],xy[1],xy[2],xy[3]+dy,0);
end
end;
return 1;
end else
if 7 = e.ttype then
begin
FHitwidgetposition := 0;
Fsyscommand0x12info := nil;
FMousemoveernotify.unlock();
//return ;
end
return 1;
end else
if 7 = e.ttype then
end
end else
if Fsyscommand0x12 and ifarray(Fsyscommand0x12info) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
begin
Fsyscommand0x12 := false;
Fsyscommand0x12info := nil;
FMousemoveernotify.unlock();
//return ;
end
end
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
end
return GtkEventDispatchb(a,b,c,d);
end
@ -6856,7 +6933,9 @@ type tgtk_ctl_object = class(_gtkeventtype)
global g_current_get_focus_widget,g_current_loss_focus_widget,g_gtk_buttontable,G_GTK_WINDOW_ACTIVATE, g_gtk_keytable;
if mn = "event" then
begin
e := new _GdkEventAny(c);
e := new _GdkEventAny(c);
//echo "\r\nwindow:",_wapi.gtk_widget_get_window(a.handle)," ",e.window;
if get_ignore_event_type(e) then return false;
case e.ttype of
GDK_WINDOW_STATE:
begin
@ -6908,6 +6987,8 @@ type tgtk_ctl_object = class(_gtkeventtype)
end
GDK_BUTTON_PRESS:
begin
//echo "\r\n bt press",datetimetostr(now())," ",handle," ",e.window," >>",_Wapi.gtk_widget_get_window(handle),"+++",_wapi.gdk_window_get_window_type(e.window),"***",
// _wapi.gtk_widget_get_toplevel(handle);
e := new _GdkEventButton(c);
psi := makelong(integer(e.x),integer(e.y));
//r := array();
@ -7014,7 +7095,8 @@ type tgtk_ctl_object = class(_gtkeventtype)
CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi);
end
end ;
return CanignoreBtnpress();
//return true; //此处处理
return CanignoreBtnpress();
end
8,9: //key
begin
@ -7024,7 +7106,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
e := new _GdkEventKey(c);
kv := e.keyval;
acskey := array(
{acskey := array(
65505: 0x10, //shift
65506: 0x10,
65507: 0x11, //control
@ -7041,7 +7123,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin
g_gtk_keytable[acskey[kv]] := 0;
end
end
end }
///////////////菜单按键
if kv = 65513 or kv = 65514 then
begin
@ -7371,7 +7453,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
//e := new _GdkEventCrossing(c);
//echo tostn(e._getdata_());
//echo "===enter\r\n";
FMousemoveernotify.push(a.handle);
//FMousemoveernotify.push(a.handle);
//_wapi.GetCursorPos(ps);
//e := new _GdkEventMotion(c);
//echo "\r\n enter:",a.handle,tostn(ps),tostn(e._getdata_());
@ -7379,18 +7461,16 @@ type tgtk_ctl_object = class(_gtkeventtype)
11: //mouse out
begin
FMousemoveernotify.pop(a.handle);
//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
e := new _GdkEventMotion(c);
//CallTslVclProc(_const.WM_MOUSEMOVE ,0,makelong(integer(e.x),integer(e.y)),true);
id := a.handle;
mywidgetmousehit(id,array(integer(e.x_root),integer(e.y_root)));
mywidgetmousemovecall(id,array(integer(e.x),integer(e.y)));
end
12: //focus
@ -7436,10 +7516,10 @@ type tgtk_ctl_object = class(_gtkeventtype)
end ;
end
if mn="activate" then
begin
//if mn="activate" then
//begin
//echo "\r\nacive","==",b,"==",c,"d";
end
//end
//
r := GtkEventDispatch(a,mn,c,d);
return r;
@ -7567,6 +7647,14 @@ type tgtk_ctl_object = class(_gtkeventtype)
"activate-default":"tsl_gtk_activate_default_event_cb"
);
end
function connect_test(n,f); //测试使用
begin
if FHandle=0 then return 0;
if not ifstring(n) then return 0;
ln := FormularSignalName(lowercase(n));
eid := GetGtkEventNameOrId(ln);
lnid := g_signal_connect_data(FHandle, ln, makeinstance(fn), eid,nil,0);
end
function Connect(n,f); //连接消息
begin
//删除connect
@ -7574,7 +7662,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
//connect id
if FHandle=0 then return 0;
if not ifstring(n) then return 0;
ln := FormularSingalName(lowercase(n));
ln := FormularSignalName(lowercase(n));
lnid := FConnectNameIds[ln];
if lnid then
begin
@ -7747,7 +7835,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
function SetHandle(h);
begin
if FHandle then return 0;
initNewSingal();
initNewSignal();
FConnectNameIds := array();
FConnectHandlers := array();
FValues := array();
@ -7764,7 +7852,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
return true;
end
end
function initNewSingal();
function initNewSignal();
begin
return ;
//wm-user
@ -7785,7 +7873,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
end
end
function FormularSingalName(n);
function FormularSignalName(n);
begin
r := "";
for i := 1 to length(n) do
@ -7837,10 +7925,10 @@ type tgtk_im_object = class(tgtk_ctl_object)
function getsignalmap();override;
begin
return array(
"preedit-start":"dodeleteevents" ,
"preedit-changed":"dodeleteevents" ,
"preedit-surrounding":"dodeleteevents" ,
"preedit-end":"dodeleteevents" ,
"preedit-start":"do_two_param_event" ,
"preedit-changed":"do_two_param_event" ,
"preedit-surrounding":"do_two_param_event" ,
"preedit-end":"do_two_param_event" ,
"commit":"tsl_gtk_normal_event_cb"
);
end
@ -8502,7 +8590,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
end
end
protected
function initadjustSingal();
function initadjustSignal();
begin
FHadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
FHscrollbar := _wapi.gtk_hscrollbar_new(FHadjustment);
@ -8562,6 +8650,21 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
end
inherited;
end
function imitate_event_size();override;
begin
if _wapi.gtk_object_get_data(Handle,"gtk_wnd_hs_caption") then return false;
return true;
end
function get_ignore_event_type(e);override;
begin
tp := e.ttype;
h := handle;
if (tp in array(GDK_MOTION_NOTIFY,GDK_BUTTON_PRESS,GDK_BUTTON_RELEASE)) and _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption") and (e.window = _Wapi.gtk_widget_get_window(h)) then
begin
return true;
end
return false;
end
function GtkEventDispatch(a,mn,c,d);override;
begin
//消息分发
@ -8578,9 +8681,11 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
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);
//AWidth := integer(cf.width);
//AHeight := integer(cf.height);
//_wapi.gtk_window_get_position(h,aleft,atop);
_wapi.gtk_window_get_size(h,AWidth,AHeight);
//echo "\r\nconfigure:",AWidth," ",AHeight;
SizeChanged :=(cx <> AWidth)or(cy <> AHeight);
PosChanged :=(x <> ALeft)or(y <> ATop);
if(not SizeChanged)and(not PosChanged)then
@ -8626,19 +8731,32 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
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;
hascap := (_const.WS_CAPTION .& dwStyle)= _const.WS_CAPTION or (_const.WS_SYSMENU .& dwStyle)=_const.WS_SYSMENU;
srszie :=((_const.WS_MAXIMIZEBOX .& dwStyle)=_const.WS_MAXIMIZEBOX) or ((_const.WS_SIZEBOX .& dwStyle)=_const.WS_SIZEBOX);
//h := _wapi.gtk_window_new(0); //控件层
if hascap or srszie then
begin
h := _wapi.gtk_window_new(0); //控件层
end
else
begin
h := _wapi.gtk_window_new(0); //popup
end
//_wapi.gtk_widget_set_events(h,0x3FFFFFE);
_wapi.gtk_window_set_default_size(h,10,10);
//_wapi.gtk_widget_set_size_request(h,300,300);
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1);
if not((_const.WS_CAPTION .& dwStyle)= _const.WS_CAPTION or (_const.WS_SYSMENU .& dwStyle)=_const.WS_SYSMENU) then
begin
if not(hascap or srszie) then
begin
_wapi.gtk_window_set_decorated(h,false);
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",0);
//无菜单顶层窗口
end else
begin
//nheight := max(10,nheight_-30);
_wapi.gtk_window_set_title(h,_wapi.TslStringToGtk(lpWindowName));
_wapi.gtk_window_set_decorated(h,true);
_wapi.gtk_window_set_title(h,_wapi.TslStringToGtk(lpWindowName));
//有标题 有菜单的顶层窗口
end
if (_const.WS_BORDER .& dwStyle)=_const.WS_BORDER then //Border
@ -8663,41 +8781,40 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
FLayouter := ctllayout;
/////////////////////////水平滚动条////////////////////////////////////
initadjustSingal();
initadjustSignal();
evtdrawbox := _wapi.gtk_event_box_new(); //lot 放一个event box 便于绘制
_wapi.gtk_widget_set_events(evtdrawbox, 0x3FFFFFE);
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
clientLayout := _Wapi.gtk_layout_new(0,0);
_wapi.gtk_container_add(evtdrawbox,clientLayout);
global g_w_c_width;
pcd := _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,max(0,nheight-pcd));
//_wapi.gtk_widget_set_size_request(evtdrawbox,2000,2000);
//_wapi.gtk_widget_set_events(eb,16777214);
//_wapi.gtk_widget_set_size_request(evtdrawbox,nwidth,max(0,nheight-pcd));
_wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h);
FClientWideget := evtdrawbox;
//_wapi.gtk_widget_set_can_focus(eb,true);
_wapi.g_object_set_data(h,"gtk_layout",clientLayout);
_wapi.g_object_set_data(clientLayout,"gtk_layout_owner",h);
InitWidgetSize(h,x,y,nwidth,nheight);
_wapi.gtk_window_move(h,x,max(0,y-pcd));
InitWidgetSize(h,x,y,nwidth,nheight);
if nwidth>0 and nheight>0 then
begin
_wapi.gtk_window_resize(h,nwidth,max(0,nheight-pcd));
_wapi.gtk_window_resize(h,nwidth,max(1,nheight-pcd));
end
_wapi.gtk_window_move(h,x,max(0,y-pcd));
_wapi.gtk_widget_show_all(vbox);
InitContainerList(h); //ÈÝÆ÷list
InitContainerList(h); //容器list
handle := h;
_wapi.SetParent(h,hwndparent);
if (_const.WS_VISIBLE .& dwStyle)=_const.WS_VISIBLE then
begin
_wapi.ShowWindow(h);
//_wapi.ShowWindow(h);
_wapi.gtk_widget_show(h);
end else
begin
_wapi.gtk_widget_hide(h);
end
_wapi.SetParent(h,hwndparent);
handle := h;
return inherited;
end
@ -8736,6 +8853,7 @@ type tgtk_ctl_window = class(tgtk_ctl_scroll_window)
ctllayout := _Wapi.gtk_layout_new(0,0);//控件布局层
_wapi.gtk_container_add(h,ctllayout);
evtdrawbox := _wapi.gtk_event_box_new(); //布局绘制层
_wapi.gtk_widget_set_events(evtdrawbox, 0x3FFFFFE);
clientlayout := _wapi.gtk_layout_new(0,0); //客户区布局层
_wapi.gtk_container_add(evtdrawbox,clientlayout);
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
@ -8755,7 +8873,7 @@ type tgtk_ctl_window = class(tgtk_ctl_scroll_window)
_wapi.gtk_widget_show(h);
end
/////////////////////////滚动条////////////////////////////////////
initadjustSingal();
initadjustSignal();
///////////////////////////颜色处理/////////////////////////////////////////
{c := new _GdkColor(nil);
c.SetRgb(0,0xffff,0);
@ -9293,9 +9411,24 @@ begin
_f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(argc,argcv);
end
function signal_connect_data(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer;
begin
_f_ := static function(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):pointer;cdecl;external getfuncptrbyname(0,"g_signal_connect_data");
return ##_f_(instance,detailed_signal,c_handler,data,dd,f);
end
function keymap_get_modifier_state(kmp:pointer):integer;
begin
_f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,"gdk_keymap_get_modifier_state");
return ##_f_(kmp);
end
function keymap_get_default():pointer;
begin
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,"gdk_keymap_get_default");
return ##_f_();
end
function igtk();
begin
global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable,g_gtk_call_handler_manager,g_gtk_font_get_size;
global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable,g_gtk_call_handler_manager,g_gtk_font_get_size;
g_gtk_font_get_size := array();
gtk_init_check(nil,nil);
g_w_i_datas := array();
@ -9303,6 +9436,8 @@ begin
g_gtk_buttontable := array(0,0);
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
g_gtk_call_handler_manager := new tinstancemanager();
kmp := keymap_get_default();
signal_connect_data(kmp,"state-changed",g_gtk_call_handler_manager.get(thisfunction(tsl_gtk_keymp_state)),0,0);
end
function ugtk();
begin
@ -9325,7 +9460,7 @@ begin
"tsl_gtk_day_select_event": return mgnr.get(thisfunction(tsl_gtk_day_select_event));
"tsl_gtk_changed_event": return mgnr.get(thisfunction(tsl_gtk_changed_event));
"tsl_gtk_preedit_changed_event": return mgnr.get(thisfunction(tsl_gtk_preedit_changed_event));
"dodeleteevents": return mgnr.get(thisfunction(dodeleteevents));
"do_two_param_event": return mgnr.get(thisfunction(do_two_param_event));
"tsl_gtk_normal_event_cb": return mgnr.get(thisfunction(tsl_gtk_normal_event_cb));
"tsl_gtk_normal_event_bc": return mgnr.get(thisfunction(tsl_gtk_normal_event_bc));
"tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle));
@ -9345,6 +9480,27 @@ begin
mgnr := g_gtk_call_handler_manager;
return mgnr.del(fn);
end
procedure tsl_gtk_keymp_state(kmp:pointer;d:pointer);
begin
global g_gtk_keytable;
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
state := keymap_get_modifier_state(kmp);
if state>0 then
begin
if (state .& 1) = 1 then
begin
g_gtk_keytable[0x10] := _shl( 1,15);
end else
if (state .& 4) = 4 then
begin
g_gtk_keytable[0x11] := _shl( 1,15);
end else
if (state .& 8) = 8 then
begin
g_gtk_keytable[0x12] := _shl( 1,15);
end
end
end
function tsl_gtk_idle(dlg:pointer):integer;
begin
return _gtkidledo_(dlg);
@ -9361,7 +9517,7 @@ end
function tsl_gtk_activate_default_event_cb(a:pointer;b:pointer):integer;
begin
//return _gtkeventcall_(a,c,b);
return dodeleteevents(a, "activate-default");
return do_two_param_event(a, "activate-default");
//activate-default;
end
function tsl_gtk_preedit_changed_event(a:pointer;b:pointer;c:pointer):integer;
@ -9370,27 +9526,27 @@ begin
end
function tsl_gtk_changed_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "changed");
return do_two_param_event(a, "changed");
end
function tsl_gtk_day_select_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "day-selected");
return do_two_param_event(a, "day-selected");
end
function tsl_gtk_delete_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "delete-event");
return do_two_param_event(a, "delete-event");
end
function tsl_gtk_adj_value_changed_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "value-changed");
return do_two_param_event(a, "value-changed");
end
function tsl_gtk_clicked_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "clicked");
return do_two_param_event(a, "clicked");
end
function tsl_gtk_activate_event(a:pointer;b:pointer):integer;
begin
return dodeleteevents(a, "activate");
return do_two_param_event(a, "activate");
end
function tsl_gtk_destroy_event(a:pointer; b:pointer;c:pointer):integer;
@ -9401,7 +9557,7 @@ function tsl_gtk_wmuser_event(a:pointer; p1:pointer;p2:pointer):integer;
begin
return dotparamseevents(a, "wm-user", p1, p2);
end
function dodeleteevents( a:pointer;b:string):integer;
function do_two_param_event( a:pointer;b:string):integer;
begin
return _gtkeventcall_(a,GetGtkEventNameOrId(b),0);
end