From afdfe2e2f7ba6829c923f304d3d05be67d835fa3 Mon Sep 17 00:00:00 2001 From: tslediter Date: Thu, 14 Dec 2023 11:01:02 +0800 Subject: [PATCH] gtk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为Wayland做准备 --- funcext/tvclib/ugtkinterface.tsf | 448 +++++++++++++++++++++---------- 1 file changed, 302 insertions(+), 146 deletions(-) diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 75df723..4ff096c 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -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