为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); function AnsiToWidChar(c);
begin begin
if not ifstring(c) then return ""; if not ifstring(c) then return "";
return c; return widestring(c);
end end
function GetModuleFileNameExA(); function GetModuleFileNameExA();
begin begin
@ -114,11 +114,15 @@ type tsgtkapi = class(tgtkapis)
pcd := gtk_object_get_data(hwd,"gtk_wnd_hs_caption")?g_w_c_width:0; pcd := gtk_object_get_data(hwd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_window_move(hwd,x,max(0,y-pcd)); gtk_window_move(hwd,x,max(0,y-pcd));
if w>=0 and h>=0 then if w>=0 and h>=0 then
gtk_widget_set_size_request(hwd,w,max(0,h-pcd)); 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 end
if f=0x4 then if f=0x4 then
begin begin
if not gtk_window_get_decorated(hwd) then //if not gtk_window_get_decorated(hwd) then
gtk_window_set_type_hint(hwd,3); gtk_window_set_type_hint(hwd,3);
if cf and cf<>g_current_get_focus_widget then //设置一下focus if cf and cf<>g_current_get_focus_widget then //设置一下focus
begin begin
@ -303,28 +307,41 @@ type tsgtkapi = class(tgtkapis)
h0 := g_object_get_data(h,"gtk_layout_height"); h0 := g_object_get_data(h,"gtk_layout_height");
if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then
begin begin
if gtk_window_get_resizable(h) then {if gtk_window_get_resizable(h) then
begin begin
gtk_widget_get_size_request(h,cx0,cy0); //改小一点 gtk_widget_get_size_request(h,cx0,cy0); //改小一点
if cx0>cx or cy0>cy then if cx0>cx or cy0>cy then
begin begin
gtk_widget_set_size_request(h,cx,max(0,cy-pcd)); gtk_widget_set_size_request(h,cx,max(0,cy-pcd));
end 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 end
else else
begin begin
//gtk_widget_get_size_request(h,cx0,cy0); //gtk_widget_get_size_request(h,cx0,cy0);
//echo "\r\noldsize:",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_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_decorated(h,true);
//gtk_window_set_resizable(h,true); //gtk_window_set_resizable(h,true);
//gtk_window_resize(h,cx,cy); //gtk_window_resize(h,cx,cy);
//gtk_window_set_decorated(h,false); //gtk_window_set_decorated(h,false);
//gtk_window_resize_to_geometry(h,cx,cy); //gtk_window_resize_to_geometry(h,cx,cy);
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 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_width",cx);
g_object_set_data(h,"gtk_layout_height",cy); g_object_set_data(h,"gtk_layout_height",cy);
flg .|=1; flg .|=1;
@ -3995,6 +4012,18 @@ type tgtkapis = class() //gtk
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(); return ##_f_();
end 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; function gdk_screen_get_default():pointer;
begin begin
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); _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()); _f_ := static procedure(w:pointer;tip:string);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,tip); return ##_f_(w,tip);
end 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 begin
_f_ := static procedure(wd:pointer;h:integer;w:integer);cdecl;external getfuncptrbyname(0,functionname()); _f_ := static procedure(wd:pointer;w:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,h,w); return ##_f_(wd,w,h);
end end
procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer); procedure gtk_widget_get_size_request(wd:pointer;var h:integer;var w:integer);
begin begin
@ -4831,6 +4860,11 @@ type tgtkapis = class() //gtk
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(); return ##_f_();
end 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); procedure gdk_window_move_resize(w:pointer;x:integer;y:integer;wd:integer;h:integer);
begin begin
_f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;h:integer);cdecl;external getfuncptrbyname(0,functionname()); _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()); _f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,p); return ##_f_(w,p);
end 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 begin
_f_ := static procedure(wd:pointer;var h:integer;var w:integer);cdecl;external getfuncptrbyname(0,functionname()); _f_ := static procedure(wg:pointer;var w:integer;var h:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,h,w); return ##_f_(wg,w,h);
end end
procedure gtk_window_set_icon(w:pointer;ico:pointer); procedure gtk_window_set_icon(w:pointer;ico:pointer);
begin begin
@ -4912,6 +4946,11 @@ type tgtkapis = class() //gtk
_f_ := static procedure(w:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname()); _f_ := static procedure(w:pointer;p:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(wd,ps); return ##_f_(wd,ps);
end 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); procedure gtk_window_set_resizable(p:pointer;f:integer);
begin begin
_f_ := static procedure(p:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname()); _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()); _f_ := static procedure(w:pointer;t:string);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,t); return ##_f_(w,t);
end 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); procedure gtk_window_set_geometry_hints (window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer);
begin begin
_f_ := static procedure(window:pointer;eometry_widget:pointer;geometry:pointer;geom_mask:integer);cdecl;external getfuncptrbyname(0,functionname()); _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; Fdwstyle;
FExdwstyle; FExdwstyle;
/////////////////////////////////// ///////////////////////////////////
function CanignoreBtnpress();virtual; function CanignoreBtnpress();virtual; //忽略
begin begin
// return false;
return true; return true;
end end
public public
@ -6583,6 +6633,22 @@ type tgtk_ctl_object = class(_gtkeventtype)
FHitwidgetposition := 0; FHitwidgetposition := 0;
end end
static FLastPosition; 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); class function widgetmousehit(nfer,id);
begin begin
_wapi.GetCursorPos(p); _wapi.GetCursorPos(p);
@ -6767,84 +6833,95 @@ type tgtk_ctl_object = class(_gtkeventtype)
_f_ := static function(w:pointer):integegr;cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function(w:pointer):integegr;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w); return ##_f_(w);
end 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消息分发 function GtkEventDispatchA(a,b,c,d);//gtk消息分发
begin begin
global g_gtk_scroll_lock; if imitate_event_size() then
if g_gtk_scroll_lock then
begin begin
return true; global g_gtk_scroll_lock;
end if g_gtk_scroll_lock then
if FHitwidgetposition in array(110,111,112,115) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
begin begin
e := new _GdkEventAny(c); return true;
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
end else if FHitwidgetposition in array(110,111,112,115) then
if Fsyscommand0x12 and ifarray(Fsyscommand0x12info) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
begin begin
e := new _GdkEventAny(c); mn := GetGtkEventNameOrId(b);
if 3=e.ttype then if mn="event" then
begin begin
ogps := Fsyscommand0x12info[0]; e := new _GdkEventAny(c);
xy := Fsyscommand0x12info[1]; if 3=e.ttype then
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 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 end
return 1; end
end else end else
if 7 = e.ttype then if Fsyscommand0x12 and ifarray(Fsyscommand0x12info) then
begin
mn := GetGtkEventNameOrId(b);
if mn="event" then
begin begin
Fsyscommand0x12 := false; e := new _GdkEventAny(c);
Fsyscommand0x12info := nil; if 3=e.ttype then
FMousemoveernotify.unlock(); begin
//return ; 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 end
end end
@ -6857,6 +6934,8 @@ type tgtk_ctl_object = class(_gtkeventtype)
if mn = "event" then if mn = "event" then
begin 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 case e.ttype of
GDK_WINDOW_STATE: GDK_WINDOW_STATE:
begin begin
@ -6908,6 +6987,8 @@ type tgtk_ctl_object = class(_gtkeventtype)
end end
GDK_BUTTON_PRESS: GDK_BUTTON_PRESS:
begin 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); e := new _GdkEventButton(c);
psi := makelong(integer(e.x),integer(e.y)); psi := makelong(integer(e.x),integer(e.y));
//r := array(); //r := array();
@ -7014,7 +7095,8 @@ type tgtk_ctl_object = class(_gtkeventtype)
CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi); CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi);
end end
end ; end ;
return CanignoreBtnpress(); //return true; //此处处理
return CanignoreBtnpress();
end end
8,9: //key 8,9: //key
begin begin
@ -7024,7 +7106,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
e := new _GdkEventKey(c); e := new _GdkEventKey(c);
kv := e.keyval; kv := e.keyval;
acskey := array( {acskey := array(
65505: 0x10, //shift 65505: 0x10, //shift
65506: 0x10, 65506: 0x10,
65507: 0x11, //control 65507: 0x11, //control
@ -7041,7 +7123,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin begin
g_gtk_keytable[acskey[kv]] := 0; g_gtk_keytable[acskey[kv]] := 0;
end end
end end }
///////////////菜单按键 ///////////////菜单按键
if kv = 65513 or kv = 65514 then if kv = 65513 or kv = 65514 then
begin begin
@ -7371,7 +7453,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
//e := new _GdkEventCrossing(c); //e := new _GdkEventCrossing(c);
//echo tostn(e._getdata_()); //echo tostn(e._getdata_());
//echo "===enter\r\n"; //echo "===enter\r\n";
FMousemoveernotify.push(a.handle); //FMousemoveernotify.push(a.handle);
//_wapi.GetCursorPos(ps); //_wapi.GetCursorPos(ps);
//e := new _GdkEventMotion(c); //e := new _GdkEventMotion(c);
//echo "\r\n enter:",a.handle,tostn(ps),tostn(e._getdata_()); //echo "\r\n enter:",a.handle,tostn(ps),tostn(e._getdata_());
@ -7379,18 +7461,16 @@ type tgtk_ctl_object = class(_gtkeventtype)
11: //mouse out 11: //mouse out
begin begin
FMousemoveernotify.pop(a.handle); //FMousemoveernotify.pop(a.handle);
//echo "\r\nleave:",a.handle; //echo "\r\nleave:",a.handle;
end end
3: 3:
begin begin
// echo "\r\n move",datetimetostr(now()),"====",a.handle,"****",FMousemoveernotify.feach(); e := new _GdkEventMotion(c);
// if not(FMousemoveernotify.inner(a.handle)) then //CallTslVclProc(_const.WM_MOUSEMOVE ,0,makelong(integer(e.x),integer(e.y)),true);
// begin id := a.handle;
// echo "====move====="; mywidgetmousehit(id,array(integer(e.x_root),integer(e.y_root)));
// e := new _GdkEventMotion(c); mywidgetmousemovecall(id,array(integer(e.x),integer(e.y)));
// CallTslVclProc(_const.WM_MOUSEMOVE ,0,makelong(integer(e.x),integer(e.y)));
// end
end end
12: //focus 12: //focus
@ -7436,10 +7516,10 @@ type tgtk_ctl_object = class(_gtkeventtype)
end ; end ;
end end
if mn="activate" then //if mn="activate" then
begin //begin
//echo "\r\nacive","==",b,"==",c,"d"; //echo "\r\nacive","==",b,"==",c,"d";
end //end
// //
r := GtkEventDispatch(a,mn,c,d); r := GtkEventDispatch(a,mn,c,d);
return r; return r;
@ -7567,6 +7647,14 @@ type tgtk_ctl_object = class(_gtkeventtype)
"activate-default":"tsl_gtk_activate_default_event_cb" "activate-default":"tsl_gtk_activate_default_event_cb"
); );
end 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); //连接消息 function Connect(n,f); //连接消息
begin begin
//删除connect //删除connect
@ -7574,7 +7662,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
//connect id //connect id
if FHandle=0 then return 0; if FHandle=0 then return 0;
if not ifstring(n) then return 0; if not ifstring(n) then return 0;
ln := FormularSingalName(lowercase(n)); ln := FormularSignalName(lowercase(n));
lnid := FConnectNameIds[ln]; lnid := FConnectNameIds[ln];
if lnid then if lnid then
begin begin
@ -7747,7 +7835,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
function SetHandle(h); function SetHandle(h);
begin begin
if FHandle then return 0; if FHandle then return 0;
initNewSingal(); initNewSignal();
FConnectNameIds := array(); FConnectNameIds := array();
FConnectHandlers := array(); FConnectHandlers := array();
FValues := array(); FValues := array();
@ -7764,7 +7852,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
return true; return true;
end end
end end
function initNewSingal(); function initNewSignal();
begin begin
return ; return ;
//wm-user //wm-user
@ -7785,7 +7873,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
end end
end end
function FormularSingalName(n); function FormularSignalName(n);
begin begin
r := ""; r := "";
for i := 1 to length(n) do for i := 1 to length(n) do
@ -7837,10 +7925,10 @@ type tgtk_im_object = class(tgtk_ctl_object)
function getsignalmap();override; function getsignalmap();override;
begin begin
return array( return array(
"preedit-start":"dodeleteevents" , "preedit-start":"do_two_param_event" ,
"preedit-changed":"dodeleteevents" , "preedit-changed":"do_two_param_event" ,
"preedit-surrounding":"dodeleteevents" , "preedit-surrounding":"do_two_param_event" ,
"preedit-end":"dodeleteevents" , "preedit-end":"do_two_param_event" ,
"commit":"tsl_gtk_normal_event_cb" "commit":"tsl_gtk_normal_event_cb"
); );
end end
@ -8502,7 +8590,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
end end
end end
protected protected
function initadjustSingal(); function initadjustSignal();
begin begin
FHadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0); FHadjustment := _wapi.gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
FHscrollbar := _wapi.gtk_hscrollbar_new(FHadjustment); FHscrollbar := _wapi.gtk_hscrollbar_new(FHadjustment);
@ -8562,6 +8650,21 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
end end
inherited; inherited;
end 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; function GtkEventDispatch(a,mn,c,d);override;
begin begin
//消息分发 //消息分发
@ -8578,9 +8681,11 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
cf := new _GdkEventConfigure(c); cf := new _GdkEventConfigure(c);
ALeft := integer(cf.x); ALeft := integer(cf.x);
ATop := integer(cf.y); ATop := integer(cf.y);
//echo "\r\n>>>",ALeft,"===",ATop; //AWidth := integer(cf.width);
AWidth := integer(cf.width); //AHeight := integer(cf.height);
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); SizeChanged :=(cx <> AWidth)or(cy <> AHeight);
PosChanged :=(x <> ALeft)or(y <> ATop); PosChanged :=(x <> ALeft)or(y <> ATop);
if(not SizeChanged)and(not PosChanged)then if(not SizeChanged)and(not PosChanged)then
@ -8626,18 +8731,31 @@ 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; function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
begin begin
//echo "\r\nctl===popup:",tostn(params),tostn(__stack_frame),datetimetostr(now()),">>>>"; //echo "\r\nctl===popup:",tostn(params),tostn(__stack_frame),datetimetostr(now()),">>>>";
h := _wapi.gtk_window_new(0); //¿Ø¼þ²ã
srszie := (_const.WS_SIZEBOX .& dwStyle)=_const.WS_SIZEBOX;
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1);
if not((_const.WS_CAPTION .& dwStyle)= _const.WS_CAPTION or (_const.WS_SYSMENU .& dwStyle)=_const.WS_SYSMENU) then
begin
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(hascap or srszie) then
begin
_wapi.gtk_window_set_decorated(h,false); _wapi.gtk_window_set_decorated(h,false);
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",0); _wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",0);
//无菜单顶层窗口 //无菜单顶层窗口
end else end else
begin begin
//nheight := max(10,nheight_-30); _wapi.gtk_window_set_decorated(h,true);
_wapi.gtk_window_set_title(h,_wapi.TslStringToGtk(lpWindowName)); _wapi.gtk_window_set_title(h,_wapi.TslStringToGtk(lpWindowName));
//有标题 有菜单的顶层窗口 //有标题 有菜单的顶层窗口
end end
@ -8663,17 +8781,15 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
FLayouter := ctllayout; FLayouter := ctllayout;
/////////////////////////水平滚动条//////////////////////////////////// /////////////////////////水平滚动条////////////////////////////////////
initadjustSingal(); initadjustSignal();
evtdrawbox := _wapi.gtk_event_box_new(); //lot 放一个event box 便于绘制 evtdrawbox := _wapi.gtk_event_box_new(); //lot 放一个event box 便于绘制
_wapi.gtk_widget_set_events(evtdrawbox, 0x3FFFFFE);
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0); _wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0);
clientLayout := _Wapi.gtk_layout_new(0,0); clientLayout := _Wapi.gtk_layout_new(0,0);
_wapi.gtk_container_add(evtdrawbox,clientLayout); _wapi.gtk_container_add(evtdrawbox,clientLayout);
global g_w_c_width; global g_w_c_width;
pcd := _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; 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,nwidth,max(0,nheight-pcd));
//_wapi.gtk_widget_set_size_request(evtdrawbox,2000,2000);
//_wapi.gtk_widget_set_events(eb,16777214);
_wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h); _wapi.g_object_set_data(evtdrawbox,"gtk_client_parent",h);
FClientWideget := evtdrawbox; FClientWideget := evtdrawbox;
//_wapi.gtk_widget_set_can_focus(eb,true); //_wapi.gtk_widget_set_can_focus(eb,true);
@ -8681,23 +8797,24 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
_wapi.g_object_set_data(clientLayout,"gtk_layout_owner",h); _wapi.g_object_set_data(clientLayout,"gtk_layout_owner",h);
InitWidgetSize(h,x,y,nwidth,nheight); InitWidgetSize(h,x,y,nwidth,nheight);
_wapi.gtk_window_move(h,x,max(0,y-pcd));
if nwidth>0 and nheight>0 then if nwidth>0 and nheight>0 then
begin begin
_wapi.gtk_window_resize(h,nwidth,max(0,nheight-pcd)); _wapi.gtk_window_resize(h,nwidth,max(1,nheight-pcd));
end end
_wapi.gtk_window_move(h,x,max(0,y-pcd));
_wapi.gtk_widget_show_all(vbox); _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 if (_const.WS_VISIBLE .& dwStyle)=_const.WS_VISIBLE then
begin begin
_wapi.ShowWindow(h); //_wapi.ShowWindow(h);
_wapi.gtk_widget_show(h);
end else end else
begin begin
_wapi.gtk_widget_hide(h); _wapi.gtk_widget_hide(h);
end end
_wapi.SetParent(h,hwndparent);
handle := h;
return inherited; return inherited;
end end
@ -8736,6 +8853,7 @@ type tgtk_ctl_window = class(tgtk_ctl_scroll_window)
ctllayout := _Wapi.gtk_layout_new(0,0);//控件布局层 ctllayout := _Wapi.gtk_layout_new(0,0);//控件布局层
_wapi.gtk_container_add(h,ctllayout); _wapi.gtk_container_add(h,ctllayout);
evtdrawbox := _wapi.gtk_event_box_new(); //布局绘制层 evtdrawbox := _wapi.gtk_event_box_new(); //布局绘制层
_wapi.gtk_widget_set_events(evtdrawbox, 0x3FFFFFE);
clientlayout := _wapi.gtk_layout_new(0,0); //客户区布局层 clientlayout := _wapi.gtk_layout_new(0,0); //客户区布局层
_wapi.gtk_container_add(evtdrawbox,clientlayout); _wapi.gtk_container_add(evtdrawbox,clientlayout);
_wapi.gtk_layout_put(ctllayout,evtdrawbox,0,0); _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); _wapi.gtk_widget_show(h);
end end
/////////////////////////滚动条//////////////////////////////////// /////////////////////////滚动条////////////////////////////////////
initadjustSingal(); initadjustSignal();
///////////////////////////颜色处理///////////////////////////////////////// ///////////////////////////颜色处理/////////////////////////////////////////
{c := new _GdkColor(nil); {c := new _GdkColor(nil);
c.SetRgb(0,0xffff,0); c.SetRgb(0,0xffff,0);
@ -9293,6 +9411,21 @@ begin
_f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(argc,argcv); return ##_f_(argc,argcv);
end 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(); function igtk();
begin 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;
@ -9303,6 +9436,8 @@ begin
g_gtk_buttontable := array(0,0); g_gtk_buttontable := array(0,0);
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0); g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
g_gtk_call_handler_manager := new tinstancemanager(); 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 end
function ugtk(); function ugtk();
begin begin
@ -9325,7 +9460,7 @@ begin
"tsl_gtk_day_select_event": return mgnr.get(thisfunction(tsl_gtk_day_select_event)); "tsl_gtk_day_select_event": return mgnr.get(thisfunction(tsl_gtk_day_select_event));
"tsl_gtk_changed_event": return mgnr.get(thisfunction(tsl_gtk_changed_event)); "tsl_gtk_changed_event": return mgnr.get(thisfunction(tsl_gtk_changed_event));
"tsl_gtk_preedit_changed_event": return mgnr.get(thisfunction(tsl_gtk_preedit_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_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_normal_event_bc": return mgnr.get(thisfunction(tsl_gtk_normal_event_bc));
"tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle)); "tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle));
@ -9345,6 +9480,27 @@ begin
mgnr := g_gtk_call_handler_manager; mgnr := g_gtk_call_handler_manager;
return mgnr.del(fn); return mgnr.del(fn);
end 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; function tsl_gtk_idle(dlg:pointer):integer;
begin begin
return _gtkidledo_(dlg); return _gtkidledo_(dlg);
@ -9361,7 +9517,7 @@ end
function tsl_gtk_activate_default_event_cb(a:pointer;b:pointer):integer; function tsl_gtk_activate_default_event_cb(a:pointer;b:pointer):integer;
begin begin
//return _gtkeventcall_(a,c,b); //return _gtkeventcall_(a,c,b);
return dodeleteevents(a, "activate-default"); return do_two_param_event(a, "activate-default");
//activate-default; //activate-default;
end end
function tsl_gtk_preedit_changed_event(a:pointer;b:pointer;c:pointer):integer; function tsl_gtk_preedit_changed_event(a:pointer;b:pointer;c:pointer):integer;
@ -9370,27 +9526,27 @@ begin
end end
function tsl_gtk_changed_event(a:pointer;b:pointer):integer; function tsl_gtk_changed_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "changed"); return do_two_param_event(a, "changed");
end end
function tsl_gtk_day_select_event(a:pointer;b:pointer):integer; function tsl_gtk_day_select_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "day-selected"); return do_two_param_event(a, "day-selected");
end end
function tsl_gtk_delete_event(a:pointer;b:pointer):integer; function tsl_gtk_delete_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "delete-event"); return do_two_param_event(a, "delete-event");
end end
function tsl_gtk_adj_value_changed_event(a:pointer;b:pointer):integer; function tsl_gtk_adj_value_changed_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "value-changed"); return do_two_param_event(a, "value-changed");
end end
function tsl_gtk_clicked_event(a:pointer;b:pointer):integer; function tsl_gtk_clicked_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "clicked"); return do_two_param_event(a, "clicked");
end end
function tsl_gtk_activate_event(a:pointer;b:pointer):integer; function tsl_gtk_activate_event(a:pointer;b:pointer):integer;
begin begin
return dodeleteevents(a, "activate"); return do_two_param_event(a, "activate");
end end
function tsl_gtk_destroy_event(a:pointer; b:pointer;c:pointer):integer; 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 begin
return dotparamseevents(a, "wm-user", p1, p2); return dotparamseevents(a, "wm-user", p1, p2);
end end
function dodeleteevents( a:pointer;b:string):integer; function do_two_param_event( a:pointer;b:string):integer;
begin begin
return _gtkeventcall_(a,GetGtkEventNameOrId(b),0); return _gtkeventcall_(a,GetGtkEventNameOrId(b),0);
end end