From ff29e86b3b0f058ae921c9a094dc426cdd6d03f4 Mon Sep 17 00:00:00 2001 From: tslediter Date: Fri, 15 Dec 2023 15:33:14 +0800 Subject: [PATCH] gtk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化gtk消息处理 --- designer/teditorform.tsf | 9 +- funcext/tvclib/ugtkinterface.tsf | 1544 +++++++++++++++++------------- 2 files changed, 873 insertions(+), 680 deletions(-) diff --git a/designer/teditorform.tsf b/designer/teditorform.tsf index 108862e..13474ea 100644 --- a/designer/teditorform.tsf +++ b/designer/teditorform.tsf @@ -1271,7 +1271,13 @@ type TBlockManager=class(TVCForm) FEditer.EndModal(); end FList.OnDblClick :=function(o,e)begin - FEditer.caption := "޸Ĵ..."; + if FList.SelectedId>=0 then + begin + FEditer.caption := "޸Ĵ..."; + end else + begin + FEditer.caption := "Ӵ..." + end FEditer.SetData(FList.SelectedValue); FEditer.showmodal(); end @@ -1327,7 +1333,6 @@ type TBlockManager=class(TVCForm) if v[1] and v[2] and v[3] then r[ri++] := array("prefix":v[0],"caption":v[1],"value":v[2],"valueext":v[3]); end r union2= array(); - return r; end function SetData(d); diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 4ff096c..b2f4371 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -399,18 +399,21 @@ type tsgtkapi = class(tgtkapis) if (not gtk_widget_is_toplevel(pt)) then begin pt := gtk_widget_get_toplevel(pt); - end - w.Visible := true; + end gtk_window_set_type_hint((dialog),0); - //gtk_window_set_modal(GTK_WINDOW( dialog),TRUE); //εshowmodal + gtk_window_set_modal(GTK_WINDOW( dialog),TRUE); //εshowmodal gtk_window_set_transient_for( GTK_WINDOW(dialog),GTK_WINDOW(pt)); - + //w.Visible := true; + gtk_widget_show(dialog); + g_object_set_data(dialog,"is_show_modaling",true); return true; end end function gtk_window_endmodal(w); //shomodal begin dialog := w.handle; + if not g_object_get_data(dialog,"is_show_modaling") then return ; + g_object_set_data(dialog,"is_show_modaling",false); pt := GetParent(dialog); if (pt) then begin @@ -418,9 +421,10 @@ type tsgtkapi = class(tgtkapis) begin pt := gtk_widget_get_toplevel(pt); end - //gtk_window_set_modal(GTK_WINDOW( dialog),false); //εshowmodal + gtk_window_set_modal(GTK_WINDOW( dialog),false); //εshowmodal gtk_window_set_transient_for( GTK_WINDOW(dialog),0); - w.Visible := false; + //w.Visible := false; + gtk_widget_hide(dialog); end end function GetParent(h); //ø @@ -3782,6 +3786,11 @@ type tgtkapis = class() //gtk _f_ := static procedure(window:pointer; tp:integer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(window,tp); end + function gtk_window_get_type_hint(window:pointer):integer; + begin + _f_ := static function(window:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(window); + end procedure gtk_widget_set_has_window(widget:pointer;has_window:integer); begin _f_ := static procedure(widget:pointer;has_window:integer);cdecl;external getfuncptrbyname(0,functionname()); @@ -6597,6 +6606,7 @@ type tenterouterlist = class FList; FTimer; //20230314 ˴ end + type tgtk_ctl_object = class(_gtkeventtype) private @@ -6837,12 +6847,556 @@ type tgtk_ctl_object = class(_gtkeventtype) begin return true; end - function get_ignore_event_type(tp);virtual; + function GSWINDOWSTATEEVENT(a,b,c,d);virtual; //״̬ı begin - return false; + global G_GTK_WINDOW_ACTIVATE; + obj := new _GdkEventWindowState(c); + st := obj.new_window_state; + if st .& 4 then + begin + return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MAXIMIZE,0); + end + if st .& 2 then + begin + return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MINIMIZE,0); + end + if st .& (2^4) then + begin + //echo "\r\n full screen"; + end + if st .& (2^5) then + begin + //echo "\r\n above"; + end + if st .& (2^6) then + begin + //echo "\r\n below"; + end + if st .& (2^7) then + begin + //CallTslVclProc(_const.WM_SETFOCUS ,0,0); + hwd := handle; + hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd); + if G_GTK_WINDOW_ACTIVATE<>hwd then + begin + if G_GTK_WINDOW_ACTIVATE then + begin + AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0); + end + end + AddMessageToGtkMessageQueue(hwd,0x6,1,0,0); + G_GTK_WINDOW_ACTIVATE := hwd; + //CallTslVclProc(_const.WM_ACTIVATE ,2,0,0); + end + {GDK_WINDOW_STATE_WITHDRAWN = 1 << 0, + GDK_WINDOW_STATE_ICONIFIED = 1 << 1, + GDK_WINDOW_STATE_MAXIMIZED = 1 << 2, + GDK_WINDOW_STATE_STICKY = 1 << 3, + GDK_WINDOW_STATE_FULLSCREEN = 1 << 4, + GDK_WINDOW_STATE_ABOVE = 1 << 5, + GDK_WINDOW_STATE_BELOW = 1 << 6} + return false; + end + function GSBUTTONPRESSEVENT(a,b,c,d);virtual; + begin + global g_gtk_buttontable, g_gtk_keytable; + e := new _GdkEventButton(c); + 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 + if e.ttype=GDK_2BUTTON_PRESS then + begin + psi := makelong(integer(e.x),integer(e.y)); + case e.button of + 1: + begin + CallTslVclProc(_const.WM_LBUTTONDBLCLK ,wp,psi); + + end + 3: + begin + CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi); + end + end ; + return CanignoreBtnpress(); + end + 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; + + case e.button of + 1: + begin + wp .|=0x1; + g_gtk_buttontable[0] := _const.MK_LButton; + if FHitwidgetposition in array(10,11,12,15) then + begin + FHitwidgetposition += 100; + FMousemoveernotify.lock(); + h := handle; + xy := array(0,0); + _wapi.GetCursorPos(xy); + Fsyscommand0x12info:= array( + xy, + (_wapi.g_object_get_data(h,"gtk_layout_x"), + _wapi.g_object_get_data(h,"gtk_layout_y"), + _wapi.g_object_get_data(h,"gtk_layout_width"), + _wapi.g_object_get_data(h,"gtk_layout_height")) + ); + + CallTslVclProc(_const.WM_NCLBUTTONDOWN ,wp,psi); + + end else + begin + CallTslVclProc(_const.WM_LBUTTONDOWN ,wp,psi); + end + end + 3: + begin + wp .|=0x2; + g_gtk_buttontable[1] := _const.MK_RButton; + CallTslVclProc(_const.WM_RBUTTONDOWN ,wp,psi); + end + end ; + + {hwd := handle; + hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd); + if G_GTK_WINDOW_ACTIVATE<>hwd then + begin + if G_GTK_WINDOW_ACTIVATE then + AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0); + G_GTK_WINDOW_ACTIVATE := hwd; + AddMessageToGtkMessageQueue(hwd,0x6,1,0,0); + end } + return CanignoreBtnpress(); + end + function GSMOTIONNOTIFYEVENT(a,b,c,d);virtual; + begin + 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 + function GSBUTTONRELEASEEVENT(a,b,c,d);virtual; + begin + global g_gtk_buttontable, g_gtk_keytable; + e := new _GdkEventButton(c); + psi := makelong(integer(e.x),integer(e.y)); + wp := 0; + if ifarray(g_gtk_keytable) then + begin + if g_gtk_keytable[0x10] then wp .|= 0x0004; + if g_gtk_keytable[0x11] then wp .|= 0x0008; + end + case e.button of + 1: + begin + wp .|=0x1; + g_gtk_buttontable[0] := 0; + CallTslVclProc(_const.WM_LBUTTONUP ,wp,psi); + end + 3:begin + wp .|=0x2; + g_gtk_buttontable[1] := 0; + CallTslVclProc(_const.WM_RBUTTONUP ,wp,psi); + //if not hasMessageFromGtkMessageQueue(a.handle,_const.LM_CONTEXTMENU ) then + CallTslVclProc(_const.LM_CONTEXTMENU ,a.handle,makelong(integer(e.x_root),integer(e.y_root)),true); + end + end ; + return CanignoreBtnpress(); + end + function GSFOCUSINEVENT(a,b,c,d);virtual; + begin + global g_current_get_focus_widget,g_current_loss_focus_widget; + h := a.handle; + e := new _GdkEventAny(c); + getfimobj().setclientwindow(e.window); + getfimobj().setfocusctl(self); + 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 + function GSFOCUSOUTEVENT(a,b,c,d);virtual; + begin + global g_current_get_focus_widget,g_current_loss_focus_widget; + h := a.handle; + e := new _GdkEventAny(c); + getfimobj().setclientwindow(e.window); + getfimobj().setfocusctl(self); + 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 + function gs_key_vent(a,b,c,d); + begin + global g_gtk_keytable; + e := new _GdkEventKey(c); + kud := e.ttype; + ///////////////////////////////////Ƽ + kv := e.keyval; + {acskey := array( + 65505: 0x10, //shift + 65506: 0x10, + 65507: 0x11, //control + 65508: 0x11, + 65513: 0x12, //alt + 65514: 0x12 + );} + ///////////////˵ + if kv = 65513 or kv = 65514 then + begin + if kud=8 then + begin + CallTslVclProc(_const.WM_SYSKEYDOWN ,0x12,0); + end + else + begin + CallTslVclProc(_const.WM_SYSKEYUP ,0x12,0); + end + return true; + end + notctrlpress := not(kud=8 and (g_gtk_keytable[0x11] or g_gtk_keytable[0x12]) ); +// kn := array( +// 65288 : _const.VK_BACK, +// 65289 : _const.VK_TAB, +// 65293 : 13 , //enter +// 65307 : _const.VK_ESCAPE, +// 65505 : _const.VK_SHIFT, +// 65506 : _const.VK_SHIFT, +// 65507 : _const.VK_CONTROL, +// 65508 : _const.VK_CONTROL, +// 65509 : _const.VK_CAPITAL, +// 65513 : _const.VK_MENU, +// 65514 : _const.VK_MENU, +// 65535 : _const.VK_DELETE, +// 65379 : _const.VK_INSERT, +// 65360 : _const.VK_HOME, +// 65361 : _const.VK_LEFT, +// 65362 : _const.VK_UP, +// 65363 : _const.VK_RIGHT, +// 65364 : _const.VK_DOWN, +// 65365 : 33, //pageup +// 65366 : 34, //pagedown +// 65367 : _const.VK_END +// //VK_SPACE +// ); + //r := CallTslVclProc(_const.WM_KEYDOWN ,kv,0); + //r := CallTslVclProc(_const.WM_CHAR ,kv,0); + + //echo "\r\n===handle:",a.handle; + ah := a.handle; + if not _wapi.gtk_widget_is_toplevel(ah) then return true ; + fcsctl := _wapi.gtk_window_get_focus(ah); + if not fcsctl then + begin + obj := class(tUIglobalData).uigetdata("tuiapplication"); + if obj then fcsctl := obj.handle; + else fcsctl := 0; + if not fcsctl then return true; + end + fcsctl := TGtkObjects[inttostr(fcsctl)] ; + if not fcsctl then return true; + if (kud = 8) and (kv<>65505 or kv<>65506) then + begin + + if getfimobj().presskey(c) then + begin + //echo "\r\n inputx:" , getfimobj().FCommit; + //return true; + end else + begin + //echo "\r\n not char input"; + notachar := true; + //echo "\r\nkkkkvvv:",kv; + end + end + //echo "\r\nkey fillter ed:",kud,"====",kv; + //return 1; + case kv of + //65513,65514,65506 + 65288: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_BACK,0); + if notctrlpress then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_BACK,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_BACK,0); + end + end + 65289,{---} 65056: //VK_TAB char + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_TAB,0); + if not(g_gtk_keytable[0x11]) then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_TAB,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_TAB,0); + + end + end + 65293: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,13,0); + if notctrlpress then + r := fcsctl.CallTslVclProc(_const.WM_CHAR ,13,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,13,0); + end + end + 65307: // _const.VK_ESCAPE, + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_ESCAPE,0); + if notctrlpress then + r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_ESCAPE,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_ESCAPE,0); + end + + end + 65360: //65360 : _const.VK_HOME, + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_HOME,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_HOME,0); + end + end + 65361: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_LEFT,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_LEFT,0); + end + end + 65362: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_UP,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_UP,0); + end + end + 65363: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_RIGHT,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_RIGHT,0); + end + end + 65364: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DOWN,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DOWN,0); + end + end + + 65365: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,33,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,33,0); + end + end + 65366: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,34,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,34,0); + end + end + 65367: + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_END,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_END,0); + end + end + 65379: // _const.VK_INSERT, + begin + + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_INSERT,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_INSERT,0); + end + end + 65505,65506: //_const.VK_SHIFT, + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_SHIFT,0); + + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_SHIFT,0); + end + end + 65507,65508: //, //_const.VK_CONTROL + begin + + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CONTROL,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CONTROL,0); + end + end + 65509: // _const.VK_CAPITAL, + begin + + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CAPITAL,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CAPITAL,0); + end + end + 65513,65514: //WM_SYSKEYUP ,WM_SYSKEYDOWN + begin + + //_const.VK_MENU, + + end + 65535: //_const.VK_DELETE, + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DELETE,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DELETE,0); + end + end + + 65470 to ( 65470+24): + begin + if kud=8 then + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,kv-65470+0x70,0); + end else + begin + r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,kv-65470+0x70,0); + end + end + else + begin + keymapb := static 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 function GtkEventDispatchA(a,b,c,d);//gtkϢַ begin + mn := GetGtkEventNameOrId(b); + e := new _GdkEventAny(c); if imitate_event_size() then begin global g_gtk_scroll_lock; @@ -6852,11 +7406,9 @@ type tgtk_ctl_object = class(_gtkeventtype) 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 + if GDK_MOTION_NOTIFY=e.ttype then begin ogps := Fsyscommand0x12info[0]; xy := Fsyscommand0x12info[1]; @@ -6886,7 +7438,7 @@ type tgtk_ctl_object = class(_gtkeventtype) end; return 1; end else - if 7 = e.ttype then + if GDK_BUTTON_RELEASE = e.ttype then begin FHitwidgetposition := 0; Fsyscommand0x12info := nil; @@ -6901,7 +7453,7 @@ type tgtk_ctl_object = class(_gtkeventtype) if mn="event" then begin e := new _GdkEventAny(c); - if 3=e.ttype then + if GDK_MOTION_NOTIFY=e.ttype then begin ogps := Fsyscommand0x12info[0]; xy := Fsyscommand0x12info[1]; @@ -6915,7 +7467,7 @@ type tgtk_ctl_object = class(_gtkeventtype) end return 1; end else - if 7 = e.ttype then + if GDK_BUTTON_RELEASE = e.ttype then begin Fsyscommand0x12 := false; Fsyscommand0x12info := nil; @@ -6924,658 +7476,62 @@ type tgtk_ctl_object = class(_gtkeventtype) end end end - end - return GtkEventDispatchb(a,b,c,d); - end - function GtkEventDispatchb(a,b,c,d); //gtkϢַ - begin - mn := GetGtkEventNameOrId(b); // _send_ - global g_current_get_focus_widget,g_current_loss_focus_widget,g_gtk_buttontable,G_GTK_WINDOW_ACTIVATE, g_gtk_keytable; - if mn = "event" then - begin - e := new _GdkEventAny(c); - //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 - obj := new _GdkEventWindowState(c); - st := obj.new_window_state; - if st .& 4 then - begin - return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MAXIMIZE,0); - end - if st .& 2 then - begin - return CallTslVclProc(_const.WM_SYSCOMMAND ,_const.SC_MINIMIZE,0); - end - if st .& (2^4) then - begin - //echo "\r\n full screen"; - end - if st .& (2^5) then - begin - //echo "\r\n above"; - end - if st .& (2^6) then - begin - //echo "\r\n below"; - end - if st .& (2^7) then - begin - //CallTslVclProc(_const.WM_SETFOCUS ,0,0); - hwd := handle; - hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd); - if G_GTK_WINDOW_ACTIVATE<>hwd then - begin - if G_GTK_WINDOW_ACTIVATE then - begin - AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0); - end - end - AddMessageToGtkMessageQueue(hwd,0x6,1,0,0); - G_GTK_WINDOW_ACTIVATE := hwd; - //CallTslVclProc(_const.WM_ACTIVATE ,2,0,0); - end - {GDK_WINDOW_STATE_WITHDRAWN = 1 << 0, - GDK_WINDOW_STATE_ICONIFIED = 1 << 1, - GDK_WINDOW_STATE_MAXIMIZED = 1 << 2, - GDK_WINDOW_STATE_STICKY = 1 << 3, - GDK_WINDOW_STATE_FULLSCREEN = 1 << 4, - GDK_WINDOW_STATE_ABOVE = 1 << 5, - GDK_WINDOW_STATE_BELOW = 1 << 6} - end - GDK_BUTTON_PRESS: - begin - //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(); - //_wapi.GetTopWidgetList(a.handle,e.x_root,e.y_root,r); - //rl := length(r)-1; - //if r[rl,0]<>a.handle then return false;; - wp := 0; - if ifarray(g_gtk_keytable) then - begin - if g_gtk_keytable[0x10] then wp .|= 0x0004; - if g_gtk_keytable[0x11] then wp .|= 0x0008; - end - case e.button of - 1: - begin - wp .|=0x1; - g_gtk_buttontable[0] := _const.MK_LButton; - if FHitwidgetposition in array(10,11,12,15) then - begin - FHitwidgetposition += 100; - FMousemoveernotify.lock(); - h := handle; - xy := array(0,0); - _wapi.GetCursorPos(xy); - Fsyscommand0x12info:= array( - xy, - (_wapi.g_object_get_data(h,"gtk_layout_x"), - _wapi.g_object_get_data(h,"gtk_layout_y"), - _wapi.g_object_get_data(h,"gtk_layout_width"), - _wapi.g_object_get_data(h,"gtk_layout_height")) - ); - - CallTslVclProc(_const.WM_NCLBUTTONDOWN ,wp,psi); - - end else - begin - CallTslVclProc(_const.WM_LBUTTONDOWN ,wp,psi); - end - end - 3: - begin - wp .|=0x2; - g_gtk_buttontable[1] := _const.MK_RButton; - CallTslVclProc(_const.WM_RBUTTONDOWN ,wp,psi); - end - end ; - - {hwd := handle; - hwd := _wapi.gtk_widget_is_toplevel(hwd)?hwd:_wapi.gtk_widget_get_toplevel(hwd); - if G_GTK_WINDOW_ACTIVATE<>hwd then - begin - if G_GTK_WINDOW_ACTIVATE then - AddMessageToGtkMessageQueue(G_GTK_WINDOW_ACTIVATE,0x6,0,0,0); - G_GTK_WINDOW_ACTIVATE := hwd; - AddMessageToGtkMessageQueue(hwd,0x6,1,0,0); - end } - return CanignoreBtnpress(); - end - GDK_BUTTON_RELEASE: - begin - //t := 1+"1234"; - e := new _GdkEventButton(c); - psi := makelong(integer(e.x),integer(e.y)); - wp := 0; - if ifarray(g_gtk_keytable) then - begin - if g_gtk_keytable[0x10] then wp .|= 0x0004; - if g_gtk_keytable[0x11] then wp .|= 0x0008; - end - case e.button of - 1: - begin - wp .|=0x1; - g_gtk_buttontable[0] := 0; - CallTslVclProc(_const.WM_LBUTTONUP ,wp,psi); - end - 3:begin - wp .|=0x2; - g_gtk_buttontable[1] := 0; - CallTslVclProc(_const.WM_RBUTTONUP ,wp,psi); - //if not hasMessageFromGtkMessageQueue(a.handle,_const.LM_CONTEXTMENU ) then - CallTslVclProc(_const.LM_CONTEXTMENU ,a.handle,makelong(integer(e.x_root),integer(e.y_root)),true); - end - end ; - return CanignoreBtnpress(); - end - GDK_2BUTTON_PRESS: - begin - ne := new _GdkEventButton(c); - psi := makelong(integer(ne.x),integer(ne.y)); - wp := 0; - if ifarray(g_gtk_keytable) then - begin - if g_gtk_keytable[0x10] then wp .|= 0x0004; - if g_gtk_keytable[0x11] then wp .|= 0x0008; - end - case ne.button of - 1: - begin - CallTslVclProc(_const.WM_LBUTTONDBLCLK ,wp,psi); - - end - 3:begin - CallTslVclProc(_const.WM_RBUTTONDBLCLK ,wp,psi); - end - end ; - //return true; //˴ - return CanignoreBtnpress(); - end - 8,9: //key - begin - kud := e.ttype; - ///////////////////////////////////Ƽ - - - e := new _GdkEventKey(c); - kv := e.keyval; - {acskey := array( - 65505: 0x10, //shift - 65506: 0x10, - 65507: 0x11, //control - 65508: 0x11, - 65513: 0x12, //alt - 65514: 0x12 - ); - if acskey[kv] then - begin - if 8=kud then - begin - g_gtk_keytable[acskey[kv]] := _shl( 1,15); - end else - begin - g_gtk_keytable[acskey[kv]] := 0; - end - end } - ///////////////˵ - if kv = 65513 or kv = 65514 then - begin - if kud=8 then - begin - CallTslVclProc(_const.WM_SYSKEYDOWN ,0x12,0); - end - else - begin - CallTslVclProc(_const.WM_SYSKEYUP ,0x12,0); - end - return true; - end - notctrlpress := not(kud=8 and (g_gtk_keytable[0x11] or g_gtk_keytable[0x12]) ); -// kn := array( -// 65288 : _const.VK_BACK, -// 65289 : _const.VK_TAB, -// 65293 : 13 , //enter -// 65307 : _const.VK_ESCAPE, -// 65505 : _const.VK_SHIFT, -// 65506 : _const.VK_SHIFT, -// 65507 : _const.VK_CONTROL, -// 65508 : _const.VK_CONTROL, -// 65509 : _const.VK_CAPITAL, -// 65513 : _const.VK_MENU, -// 65514 : _const.VK_MENU, -// 65535 : _const.VK_DELETE, -// 65379 : _const.VK_INSERT, -// 65360 : _const.VK_HOME, -// 65361 : _const.VK_LEFT, -// 65362 : _const.VK_UP, -// 65363 : _const.VK_RIGHT, -// 65364 : _const.VK_DOWN, -// 65365 : 33, //pageup -// 65366 : 34, //pagedown -// 65367 : _const.VK_END -// //VK_SPACE -// ); - //r := CallTslVclProc(_const.WM_KEYDOWN ,kv,0); - //r := CallTslVclProc(_const.WM_CHAR ,kv,0); - - //echo "\r\n===handle:",a.handle; - ah := a.handle; - if not _wapi.gtk_widget_is_toplevel(ah) then return true ; - fcsctl := _wapi.gtk_window_get_focus(ah); - if not fcsctl then - begin - obj := class(tUIglobalData).uigetdata("tuiapplication"); - if obj then fcsctl := obj.handle; - else fcsctl := 0; - if not fcsctl then return true; - end - fcsctl := TGtkObjects[inttostr(fcsctl)] ; - if not fcsctl then return true; - if (kud = 8) and (kv<>65505 or kv<>65506) then - begin - - if getfimobj().presskey(c) then - begin - //echo "\r\n inputx:" , getfimobj().FCommit; - //return true; - end else - begin - //echo "\r\n not char input"; - notachar := true; - //echo "\r\nkkkkvvv:",kv; - end - end - //echo "\r\nkey fillter ed:",kud,"====",kv; - //return 1; - case kv of - //65513,65514,65506 - 65288: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_BACK,0); - if notctrlpress then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_BACK,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_BACK,0); - end - end - 65289,{---} 65056: //VK_TAB char - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_TAB,0); - if not(g_gtk_keytable[0x11]) then r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_TAB,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_TAB,0); - - end - end - 65293: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,13,0); - if notctrlpress then - r := fcsctl.CallTslVclProc(_const.WM_CHAR ,13,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,13,0); - end - end - 65307: // _const.VK_ESCAPE, - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_ESCAPE,0); - if notctrlpress then - r := fcsctl.CallTslVclProc(_const.WM_CHAR ,_const.VK_ESCAPE,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_ESCAPE,0); - end - - end - 65360: //65360 : _const.VK_HOME, - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_HOME,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_HOME,0); - end - end - 65361: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_LEFT,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_LEFT,0); - end - end - 65362: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_UP,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_UP,0); - end - end - 65363: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_RIGHT,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_RIGHT,0); - end - end - 65364: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DOWN,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DOWN,0); - end - end - - 65365: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,33,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,33,0); - end - end - 65366: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,34,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,34,0); - end - end - 65367: - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_END,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_END,0); - end - end - 65379: // _const.VK_INSERT, - begin - - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_INSERT,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_INSERT,0); - end - end - 65505,65506: //_const.VK_SHIFT, - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_SHIFT,0); - - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_SHIFT,0); - end - end - 65507,65508: //, //_const.VK_CONTROL - begin - - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CONTROL,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CONTROL,0); - end - end - 65509: // _const.VK_CAPITAL, - begin - - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_CAPITAL,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_CAPITAL,0); - end - end - 65513,65514: //WM_SYSKEYUP ,WM_SYSKEYDOWN - begin - - //_const.VK_MENU, - - end - 65535: //_const.VK_DELETE, - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,_const.VK_DELETE,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,_const.VK_DELETE,0); - end - end - - 65470 to ( 65470+24): - begin - if kud=8 then - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,kv-65470+0x70,0); - end else - begin - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,kv-65470+0x70,0); - end - end - else - begin - keymapb := array( - 96:192, - 45:189, - 61:187, - 91:219, - 93:221, - 92:220, - 59:186, - 39:222, - 44:188, - 46:190, - 47:191, - 40:57, - 33:49, - 64:50, - 35:51, - 36:52, - 37:53, - 94:54, - 38:55, - 42:56, - 41:48, - 126:192 - ); - if {notachar and} kud=8 then //ȥnotkey - begin - if kv>=97 and kv<=122 then kv := kv-32; - else - begin - kv2 := keymapb[kv]; - if kv2 then kv := kv2; - end - r := fcsctl.CallTslVclProc(_const.WM_KEYDOWN ,{_xor(32,kv)}kv,0); - //if notctrlpress then r := CallTslVclProc(_const.WM_CHAR , kv,0); - end else - if kud=9 then - begin - if kv>=97 and kv<=122 then kv := kv-32; - else - begin - kv2 := keymapb[kv]; - if kv2 then kv := kv2; - end - r := fcsctl.CallTslVclProc(_const.WM_KEYUP ,{_xor(32,kv)}kv,0); - end - end - end ; - return true; - - end - 10: //mouse in - begin - //e := new _GdkEventCrossing(c); - //echo tostn(e._getdata_()); - //echo "===enter\r\n"; - //FMousemoveernotify.push(a.handle); - //_wapi.GetCursorPos(ps); - //e := new _GdkEventMotion(c); - //echo "\r\n enter:",a.handle,tostn(ps),tostn(e._getdata_()); - end - - 11: //mouse out - begin - //FMousemoveernotify.pop(a.handle); - //echo "\r\nleave:",a.handle; - end - 3: - begin - 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 - 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; + end case mn of - "destroy" : - begin + GS_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": + GS_BUTTON_PRESS_EVENT: 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; + return GSBUTTONPRESSEVENT(a,b,c,d); end - "set-focus-child": + GS_MOTION_NOTIFY_EVENT: begin - //echo "\r\nsignal name id:",GetGtkEventNameOrId("set-focus-child"); - //echo "\r\nset focus child:",a.handle,"*****",c,"============",d; + GSMOTIONNOTIFYEVENT(a,b,c,d); end - "key-press-event": + GS_BUTTON_RELEASE_EVENT: begin - //echo "\r\n==key :=",1,"***" , a.handle,"====",_wapi.gtk_widget_is_toplevel(a.handle),"==========",datetimetostr(now()); + return GSBUTTONRELEASEEVENT(a,b,c,d); end - } - end ; - return r; + GS_KEY_PRESS_EVENT: + begin + if gs_key_vent(a,b,c,8) then return true; + end + GS_KEY_RELEASE_EVENT: + begin + if gs_key_vent(a,b,c,9) then return true; + end + GS_FOCUS_IN_EVENT: + begin + GSFOCUSINEVENT(a,b,c,d); + end + GS_FOCUS_OUT_EVENT: + begin + GSFOCUSOUTEVENT(a,b,c,d); + end + GS_WINDOW_STATE_EVENT: + begin + return GSWINDOWSTATEEVENT(a,b,c,d); + end + + end + r := GtkEventDispatch(a,mn,c,d); + return r; + end + function GtkEventDispatch(a,mn,c,d);virtual; //ƴgtkϢ + begin + //Ϣַ + return false; 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" + //return array("destroy","map","button-press-event","motion-notify-event","button-release-event","key-press-event","key-release-event","event"); //,"set-focus-child" + return array(GS_DESTROY,GS_BUTTON_PRESS_EVENT,GS_MOTION_NOTIFY_EVENT,GS_BUTTON_RELEASE_EVENT,GS_KEY_PRESS_EVENT,GS_KEY_RELEASE_EVENT,GS_FOCUS_IN_EVENT,GS_FOCUS_OUT_EVENT,GS_WINDOW_STATE_EVENT,GS_EVENT); //,"set-focus-child" end function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);virtual; //촰 begin @@ -7632,10 +7588,32 @@ type tgtk_ctl_object = class(_gtkeventtype) FConnectNameIds := array(); FConnectHandlers := array(); end + f_signal_f_map; + function unformatsignalname(n); + begin + return replacetext(n,"-","_"); + end + function get_fptr_by_sigal_name(n);virtual; + begin + global g_gtk_call_handler_manager; + if not g_gtk_call_handler_manager then return 0; + mgnr := g_gtk_call_handler_manager; + if not ifarray(f_signal_f_map) then f_signal_f_map := array(); + fn := "c_g_e_"+unformatsignalname(n); + r := f_signal_f_map[fn]; + if ifnil(r) then + begin + ffn := findfunction(fn); + if ffn then + r := mgnr.get(ffn); + else r := 0; + f_signal_f_map[fn] := r; + end + return r; + end function getsignalmap();virtual; begin return array( - "wm-user":'tsl_gtk_wmuser_event', //û "destroy":"tsl_gtk_destroy_event", // "activate":"tsl_gtk_activate_event", // "clicked":"tsl_gtk_clicked_event", // @@ -7644,7 +7622,11 @@ type tgtk_ctl_object = class(_gtkeventtype) //"day-selected":"tsl_gtk_day_select_event", //ѡ "changed" :"tsl_gtk_changed_event", //ı "preedit-changed":"tsl_gtk_preedit_changed_event" , - "activate-default":"tsl_gtk_activate_default_event_cb" + "activate-default":"tsl_gtk_activate_default_event_cb" , + GS_WINDOW_STATE_EVENT:"tsl_gtk_window_state_event" , + GS_FOCUS:"tsl_gtk_focus_event", + GS_FOCUS_IN_EVENT:"tsl_gtk_focus_in_event" , + GS_FOCUS_OUT_EVENT:"tsl_gtk_focus_out_event" ); end function connect_test(n,f); //ʹ @@ -7671,12 +7653,21 @@ type tgtk_ctl_object = class(_gtkeventtype) g_signal_handler_disconnect(FHandle,lnid); end //echo "\r\nconnect ===========================",FHandle,"=====",n; + eid := GetGtkEventNameOrId(ln); - fn := (getsignalmap())[ln]; - if not(fn and ifstring(fn)) then fn := "tsl_gtk_normal_event_cb"; - lnid := g_signal_connect_data(FHandle, ln, gettslvcleventhandler_(fn), eid,nil,0); + //fn := (getsignalmap())[ln]; + //if not(fn and ifstring(fn)) then fn := "tsl_gtk_normal_event_cb"; + //lnid := g_signal_connect_data(FHandle, ln, gettslvcleventhandler_(fn), eid,nil,0); + ptr := get_fptr_by_sigal_name(n); + if ptr then + begin + lnid := g_signal_connect_data(FHandle, ln, ptr, eid,nil,0); FConnectNameIds[ln] := lnid; FConnectHandlers[inttostr(eid)] := f; + end else + begin + echo "\r\n not find:",n; + end return lnid; end function DefaultDestroyHandler(); @@ -7873,8 +7864,12 @@ type tgtk_ctl_object = class(_gtkeventtype) end end + f_format_names; function FormularSignalName(n); begin + if not ifarray(f_format_names) then f_format_names := array(); + r := f_format_names[n]; + if r then return r; r := ""; for i := 1 to length(n) do begin @@ -7882,6 +7877,7 @@ type tgtk_ctl_object = class(_gtkeventtype) if vi="_" then r+="-"; else r+=vi; end + f_format_names[n] := r; return r; end function needdestroy();virtual; @@ -8123,7 +8119,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) _wapi.gtk_widget_set_can_focus(h,true); if isp and FClientWideget then //Ի begin - FClientObject := new tgtk_ctl_object(FClientWideget); + FClientObject := new tgtk_ctl_object_client(FClientWideget); _wapi.g_object_set_data(h,"gtk_clientwideget",FClientWideget); FClientObject.Connect("draw",thisfunction(scrollwindowdraw)); _wapi.gtk_widget_set_app_paintable(FClientWideget, TRUE); // @@ -8487,8 +8483,6 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) function scrolltimedo(ptr:pointer):integer; begin if ifnil(FStatscrollTime) then return 1; //ûйϢ - //obj := new ttmstruct(ptr); - //obj._setvalue_(0,0); t := now(); if (t-FStatscrollTime)<(1/24/3600/100) then return 1; //ʱ10 FStatscrollTime := nil; //ִ @@ -8506,8 +8500,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) begin if g_gtk_keytable[0x10] then ctl .|= _const.MK_Shift; if g_gtk_keytable[0x11] then ctl .|= _const.MK_Control; - end - + end len := length(fscrollinfos)-1; xy := fscrollinfos[len,2]; h := fscrollinfos[len,0]; @@ -8632,6 +8625,13 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) FHBardown; FScroller; +end +type tgtk_ctl_object_client = class(tgtk_ctl_object) + function create(h); + begin + inherited; + end + end type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) function Create(h);override; @@ -8655,16 +8655,6 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) 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 //Ϣַ @@ -8716,17 +8706,14 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) r := CallTslVclProc(_const.WM_CLOSE,0,0); return r; end - "activate-default": - begin - echo "\r\n activate-defalut",datetimetostr(now()); - end end; return inherited; end function GtkBaseEventName();override; begin - return inherited union2 array("configure-event","delete-event","scroll-event","activate-default"); + //return inherited union2 array("configure-event","delete-event","scroll-event","activate-default"); + return inherited union2 array(GS_CONFIGURE_EVENT,GS_DELETE_EVENT,GS_SCROLL_EVENT); end function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override; begin @@ -8741,7 +8728,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) end else begin - h := _wapi.gtk_window_new(0); //popup + h := _wapi.gtk_window_new(1); //popup end //_wapi.gtk_widget_set_events(h,0x3FFFFFE); @@ -8813,10 +8800,40 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) end else begin _wapi.gtk_widget_hide(h); + end + r := inherited; + if FClientObject then + begin + FClientObject.connect(GS_BUTTON_PRESS_EVENT,thisfunction(cleinteventpress)); + FClientObject.connect(GS_BUTTON_RELEASE_EVENT,thisfunction(cleinteventrelease)); + FClientObject.connect(GS_MOTION_NOTIFY_EVENT,thisfunction(cleinteventmove)); end - - return inherited; + return r; + end + function GSBUTTONRELEASEEVENT(a,b,c,d);override; + begin + return false; + end + function GSMOTIONNOTIFYEVENT(a,b,c,d);override; + begin + return false; + end + function GSBUTTONPRESSEVENT(a,b,c,d);override; + begin + return false; + end + function cleinteventpress(a,b,c,d); + begin + return inherited GSBUTTONPRESSEVENT(self,b,c,d); end + function cleinteventrelease(a,b,c,d); + begin + return inherited GSBUTTONRELEASEEVENT(self,b,c,d); + end + function cleinteventmove(a,b,c,d); + begin + return inherited GSMOTIONNOTIFYEVENT(self,b,c,d); + end end type tgtk_wnd_info = class() @@ -9374,6 +9391,75 @@ type _gtkeventtype=class static const GTK_DEST_DEFAULT_HIGHLIGHT =2; static const GTK_DEST_DEFAULT_DROP =4; static const GTK_DEST_DEFAULT_ALL =7; + static const GS_ACCEL_CLOSURES_CHANGED= "accel-closures-changed"; + static const GS_BUTTON_PRESS_EVENT= "button-press-event"; + static const GS_BUTTON_RELEASE_EVENT= "button-release-event"; + static const GS_CAN_ACTIVATE_ACCEL= "can-activate-accel"; + static const GS_CHILD_NOTIFY= "child-notify"; + static const GS_COMPOSITED_CHANGED= "composited-changed"; + static const GS_CONFIGURE_EVENT= "configure-event"; + static const GS_DAMAGE_EVENT= "damage-event"; + static const GS_DELETE_EVENT= "delete-event"; + static const GS_DESTROY= "destroy"; + static const GS_DESTROY_EVENT= "destroy-event"; + static const GS_DIRECTION_CHANGED= "direction-changed"; + static const GS_DRAG_BEGIN= "drag-begin"; + static const GS_DRAG_DATA_DELETE= "drag-data-delete"; + static const GS_DRAG_DATA_GET= "drag-data-get"; + static const GS_DRAG_DATA_RECEIVED= "drag-data-received"; + static const GS_DRAG_DROP= "drag-drop"; + static const GS_DRAG_END= "drag-end"; + static const GS_DRAG_FAILED= "drag-failed"; + static const GS_DRAG_LEAVE= "drag-leave"; + static const GS_DRAG_MOTION= "drag-motion"; + static const GS_DRAW= "draw"; + static const GS_ENTER_NOTIFY_EVENT= "enter-notify-event"; + static const GS_EVENT= "event"; + static const GS_EVENT_AFTER= "event-after"; + static const GS_FOCUS= "focus"; + static const GS_FOCUS_IN_EVENT= "focus-in-event"; + static const GS_FOCUS_OUT_EVENT= "focus-out-event"; + static const GS_GRAB_BROKEN_EVENT= "grab-broken-event"; + static const GS_GRAB_FOCUS= "grab-focus"; + static const GS_GRAB_NOTIFY= "grab-notify"; + static const GS_HIDE= "hide"; + static const GS_HIERARCHY_CHANGED= "hierarchy-changed"; + static const GS_KEY_PRESS_EVENT= "key-press-event"; + static const GS_KEY_RELEASE_EVENT= "key-release-event"; + static const GS_KEYNAV_FAILED= "keynav-failed"; + static const GS_LEAVE_NOTIFY_EVENT= "leave-notify-event"; + static const GS_MAP= "map"; + static const GS_MAP_EVENT= "map-event"; + static const GS_MNEMONIC_ACTIVATE= "mnemonic-activate"; + static const GS_MOTION_NOTIFY_EVENT= "motion-notify-event"; + static const GS_MOVE_FOCUS= "move-focus"; + static const GS_PARENT_SET= "parent-set"; + static const GS_POPUP_MENU= "popup-menu"; + static const GS_PROPERTY_NOTIFY_EVENT= "property-notify-event"; + static const GS_PROXIMITY_IN_EVENT= "proximity-in-event"; + static const GS_PROXIMITY_OUT_EVENT= "proximity-out-event"; + static const GS_QUERY_TOOLTIP= "query-tooltip"; + static const GS_REALIZE= "realize"; + static const GS_SCREEN_CHANGED= "screen-changed"; + static const GS_SCROLL_EVENT= "scroll-event"; + static const GS_SELECTION_CLEAR_EVENT= "selection-clear-event"; + static const GS_SELECTION_GET= "selection-get"; + static const GS_SELECTION_NOTIFY_EVENT= "selection-notify-event"; + static const GS_SELECTION_RECEIVED= "selection-received"; + static const GS_SELECTION_REQUEST_EVENT= "selection-request-event"; + static const GS_SHOW= "show"; + static const GS_SHOW_HELP= "show-help"; + static const GS_SIZE_ALLOCATE= "size-allocate"; + static const GS_STATE_CHANGED= "state-changed"; + static const GS_STATE_FLAGS_CHANGED= "state-flags-changed"; + static const GS_STYLE_SET= "style-set"; + static const GS_STYLE_UPDATED= "style-updated"; + static const GS_TOUCH_EVENT= "touch-event"; + static const GS_UNMAP= "unmap"; + static const GS_UNMAP_EVENT= "unmap-event"; + static const GS_UNREALIZE= "unrealize"; + static const GS_VISIBILITY_NOTIFY_EVENT= "visibility-notify-event"; + static const GS_WINDOW_STATE_EVENT= "window-state-event"; end { //cairo CAIRO_OPERATOR_CLEAR:=0; @@ -9464,6 +9550,10 @@ begin "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)); + "tsl_gtk_window_state_event": return mgnr.get(thisfunction(tsl_gtk_window_state_event)); + "tsl_gtk_focus_event": return mgnr.get(thisfunction(tsl_gtk_focus_event)); + "tsl_gtk_focus_in_event": return mgnr.get(thisfunction(tsl_gtk_focus_in_event)); + "tsl_gtk_focus_out_event": return mgnr.get(thisfunction(tsl_gtk_focus_out_event)); end ; end function get_instance_i(fn); @@ -9501,6 +9591,104 @@ begin end end end +////////////////////////new function////////////////////////////////////////////// +function c_g_e_value_changed(a:pointer;b:pointer):integer; //tsl_gtk_adj_value_changed_event +begin + return do_two_param_event(a, "value-changed"); +end + +function c_g_e_destroy(a:pointer; b:pointer;c:pointer):integer; //tsl_gtk_destroy_event +begin + return _gtkeventcall_(a,b,c); +end +function c_g_e_event(a:pointer;b:pointer;c:pointer):integer; //tsl_gtk_normal_event_cb +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_button_press_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_button_release_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_motion_notify_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_key_press_event(a:pointer;b:pointer;c:pointer):integer; +begin + //return _gtkeventcall_(a,c,b); + return _gtkeventcall_(a,c,b); +end +function c_g_e_key_release_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_scroll_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_draw(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_commit(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_configure_event(a:pointer;b:pointer;c:pointer):integer; +begin + return _gtkeventcall_(a,c,b); +end +function c_g_e_delete_event(a:pointer;b:pointer):integer; //tsl_gtk_delete_event +begin + return do_two_param_event(a, "delete-event"); +end +function c_g_e_activate_default(a:pointer;b:pointer):integer; //tsl_gtk_activate_default_event_cb +begin + return do_two_param_event(a, "activate-default"); +end +function c_g_e_window_state_event(w:pointer;state:pointer;user_data:pointer):integer; //tsl_gtk_window_state_event +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("window-state-event"),state); +end +function c_g_e_focus_in_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus-in-event"),state); +end +function c_g_e_focus_out_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus-out-event"),state); +end +function c_g_e_focus(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus"),state); +end +function c_g_e_activate(a:pointer;b:pointer):integer; //tsl_gtk_activate_event +begin + return do_two_param_event(a, "activate"); +end + +///////////////////////////////////////////////////////////// +function tsl_gtk_window_state_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("window-state-event"),state); +end +function tsl_gtk_focus_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus"),state); +end +function tsl_gtk_focus_in_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus-in-event"),state); +end +function tsl_gtk_focus_out_event(w:pointer;state:pointer;user_data:pointer):integer; +begin + return _gtkeventcall_(w,GetGtkEventNameOrId("focus-out-event"),state); +end + function tsl_gtk_idle(dlg:pointer):integer; begin return _gtkidledo_(dlg);