diff --git a/funcext/tvclib/tgraphiccontrol.tsf b/funcext/tvclib/tgraphiccontrol.tsf index dcaadc6..e6ea6cc 100644 --- a/funcext/tvclib/tgraphiccontrol.tsf +++ b/funcext/tvclib/tgraphiccontrol.tsf @@ -135,7 +135,9 @@ type tgraphiccontrol = class(TControl) Canvas.DrawBitmap(self.BKBitmap,GetClientRect()); end else begin - cl := Color; + if Enabled then + cl := Color; + else cl := cl_disabled_brush; if ifnumber(cl)then begin Canvas.Brush.Color := cl; diff --git a/funcext/tvclib/twincontrol.tsf b/funcext/tvclib/twincontrol.tsf index 162a135..4faedf0 100644 --- a/funcext/tvclib/twincontrol.tsf +++ b/funcext/tvclib/twincontrol.tsf @@ -1001,8 +1001,14 @@ type TWinControl = class(tcontrol) //if not(csCustomPaint in ControlState) and not(e.lparam) then return ; dc := e.wparam; if dc {and e.lparam}then - begin - cl := Color; + begin + if Enabled then + begin + cl := Color; + end else + begin + cl := cl_disabled_brush; + end rect := array(0,0,0,0); if e.lparam=2 then begin @@ -1266,7 +1272,6 @@ type TWinControl = class(tcontrol) _wapi.BitBlt(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1],memdc,rc[0],rc[1],SRCCOPY); //_wapi.BitBlt(dc,c[0],c[1],c[2],c[3],memdc,0,0,SRCCOPY); {$else} _wapi.cairo_set_source_surface(dc, img, 0, 0); - rc := ps.rcpaint; _wapi.cairo_rectangle(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]); _wapi.cairo_clip(dc); _wapi.cairo_paint(dc); diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 785d6fe..74717b9 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -110,9 +110,8 @@ type tsgtkapi = class(tgtkapis) y := g_object_get_data(hwd,"gtk_layout_y"); w := g_object_get_data(hwd,"gtk_layout_width"); h := g_object_get_data(hwd,"gtk_layout_height"); - 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)); + pcd := gtk_object_get_data_title_height(hwd); + gtk_window_move(hwd,x,max(0,y-pcd)); if w>=0 and h>=0 then begin //gtk_window_set_default_size(hwd,w,max(0,h-pcd)); @@ -248,8 +247,7 @@ type tsgtkapi = class(tgtkapis) if h then begin x0 := g_object_get_data(h,"gtk_layout_width"); - global g_w_c_width; - pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(h); y0 := g_object_get_data(h,"gtk_layout_height")-pcd; end rec := array(0,0,x0, max(0,y0)); @@ -261,8 +259,7 @@ type tsgtkapi = class(tgtkapis) ClientToScreen(hwnd,xy); h := g_object_get_data(hwnd,"gtk_layout_height"); w := g_object_get_data(hwnd,"gtk_layout_width"); - global g_w_c_width; - pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(hwnd); rec := array(xy[0],xy[1],xy[0]+w,max(0,xy[1]+h-pcd)); end function GetWindowInfo(hwnd :pointer;f:pointer):integer; @@ -273,7 +270,6 @@ type tsgtkapi = class(tgtkapis) function SetWindowPos(h:pointer;hWndInsertAfter:pointer; X:integer; Y:integer; cx:integer;cy:integer; uFlags:integer); begin //echo "\r\nset window pos:" ,x,"===",y,"=<>=",cx,"===",cy; - global g_w_c_width; if 0x400 .& uFlags then begin //echo "border set \r\n"; @@ -283,7 +279,7 @@ type tsgtkapi = class(tgtkapis) if not(h>0 or h<0) then return ; flg := 0; wt := static gtk_window_get_type(); - pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(h); if g_type_check_instance_is_a(h,wt) then //主窗口 begin x0 := g_object_get_data(h,"gtk_layout_x"); @@ -299,33 +295,6 @@ 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 - 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_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_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 } if gtk_window_get_resizable(h) then begin gtk_widget_set_size_request(h,1,1); @@ -391,13 +360,25 @@ type tsgtkapi = class(tgtkapis) if (not gtk_widget_is_toplevel(pt)) then begin pt := gtk_widget_get_toplevel(pt); - end - gtk_window_set_type_hint((dialog),0); - gtk_window_set_modal(GTK_WINDOW( dialog),TRUE); //屏蔽掉showmodal + end + //gtk_window_set_type_hint((dialog),0); + //gtk_window_set_modal(GTK_WINDOW( dialog),TRUE); //屏蔽掉showmodal gtk_window_set_transient_for( GTK_WINDOW(dialog),GTK_WINDOW(pt)); + //gtk_widget_set_sensitive(pt,false); //w.Visible := true; gtk_widget_show(dialog); g_object_set_data(dialog,"is_show_modaling",true); + pts := array(); + while pt do //获取有效的有效的父窗口 + begin + if gtk_widget_get_sensitive(pt) then + begin + gtk_widget_set_sensitive(pt,false); + pts[length(pts)] := pt; + pt := gtk_window_get_transient_for(pt); + end + end + g_object_set_data(dialog,"modaling_top_parent",pts); return true; end end @@ -406,17 +387,20 @@ type tsgtkapi = class(tgtkapis) 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 + //pt := GetParent(dialog); + gtk_window_set_transient_for( GTK_WINDOW(dialog),0); + //gtk_window_set_modal(GTK_WINDOW( dialog),false); //屏蔽掉showmodal + w.Visible := false; + gtk_widget_hide(dialog); + pts := g_object_get_data(dialog,"modaling_top_parent"); + if (pts) then begin - if (not gtk_widget_is_toplevel(pt)) then + g_object_set_data(dialog,"modaling_top_parent",0); + + for i,pt in pts do begin - pt := gtk_widget_get_toplevel(pt); - end - gtk_window_set_modal(GTK_WINDOW( dialog),false); //屏蔽掉showmodal - gtk_window_set_transient_for( GTK_WINDOW(dialog),0); - //w.Visible := false; - gtk_widget_hide(dialog); + gtk_widget_set_sensitive(pt,true); + end end end function GetParent(h); //获得父窗口 @@ -540,8 +524,7 @@ type tsgtkapi = class(tgtkapis) end if SizeChanged then //这个是不是应该放前面 begin - global g_w_c_width; - pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(h); gtk_widgetsizechanged(h,max(0,AHeight-pcd),AWidth); end {if SizeChanged then @@ -730,7 +713,7 @@ type tsgtkapi = class(tgtkapis) h := g_object_get_data(hwnd,"gtk_clientwideget"); if h then begin - //return gtk_widget_queue_draw(h); + return gtk_widget_queue_draw(h); if ifarray(rec) and ifnumber(rec[0]) and ifnumber(rec[1]) and ifnumber(rec[2]) and ifnumber(rec[3]) then begin gtk_widget_queue_draw_area(h,rec[0],rec[1],rec[2]-rec[0],rec[3]-rec[1]); @@ -900,13 +883,16 @@ type tsgtkapi = class(tgtkapis) gtk_rgb_color_rgb(gtk_object_get_data(hdc,"font.bkcolor"),bkr,bkg,bkb); //cairo_fill - end - + end //////////////////////////////////////////////////////// if udl then begin cairo_set_line_width(hdc,0.4); end + if bytetype(txt,tlen)=1 then //字符类型判断 + begin + tlen-=1; + end txts := array(); txtidx := 0; txti := ""; @@ -956,8 +942,7 @@ type tsgtkapi = class(tgtkapis) cairo_move_to(hdc,xx,yy); cairo_show_text(hdc,TslStringToGtk(v0)); cairo_stroke(hdc); - end - + end return 1; while idx<=tlen do begin @@ -1232,7 +1217,10 @@ type tsgtkapi = class(tgtkapis) end function SetActiveWindow(h); begin - hh := gtk_widget_get_toplevel(h); + if not IsGtkWidget(h) then return 0; + if gtk_widget_is_toplevel(h) then hh := h; + else + hh := gtk_widget_get_toplevel(h); if hh then gtk_window_present(hh); end function CreatePen(FS,w,FC); //gtk 模拟 pen @@ -1340,8 +1328,7 @@ type tsgtkapi = class(tgtkapis) begin h :=g_object_get_data(hwd,"gtk_layout_height"); w :=g_object_get_data(hwd,"gtk_layout_width"); - global g_w_c_width; - pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(hwnd); gtk_widgetsizechanged(hwd,max(0,h-pcd),w); end Function SetMenu(hwd:pointer;hmenu:pointer):integer; //设置菜单栏 @@ -1379,8 +1366,7 @@ type tsgtkapi = class(tgtkapis) end h :=g_object_get_data(hwd,"gtk_layout_height"); w :=g_object_get_data(hwd,"gtk_layout_width"); - global g_w_c_width; - pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := gtk_object_get_data_title_height(hwnd); gtk_widgetsizechanged(hwd,max(0,h-pcd),w); //移除原有窗口 //menubar 添加到窗口 @@ -1429,61 +1415,28 @@ type tsgtkapi = class(tgtkapis) function ClientToScreen(hwnd :pointer;var p:array of integer):integer; // 继续努力 begin if not hwnd then return ; - if not GTK_WIDGET(hwnd) then return ; - if {gdk_backend_is_wayland()} true then - begin - p1 := g_object_get_data(hwnd,"motion_xy"); - if ifarray(p1) then - begin - dx := p1["x_r"]-p1["x"]; - dy := p1["y_r"]-p1["y"]; - p[0]+=dx; - p[1]+=dy; - - end - return true; - end - x := g_object_get_data(hwnd,"gtk_layout_x"); - y := g_object_get_data(hwnd,"gtk_layout_y"); - p[0]+=x; - p[1]+=y; - if not gtk_widget_is_toplevel(hwnd) then + if not IsGtkWidget(hwnd) then return ; + p1 := g_object_get_data(hwnd,"motion_xy"); + if ifarray(p1) then begin - phwnd := GetParent(hwnd); - return ClientToScreen(phwnd,p); - end else - begin - mb := g_object_get_data(hwnd,"menubar"); - if mb and gtk_widget_is_visible(mb) then - begin - rec := zeros(4); - gtk_widget_get_allocation(mb,rec); - if rec[3]>1 then - begin - p[1]+= rec[3] ;//max(rec[3],25); - end - end + dx := p1["x_r"]-p1["x"]; + dy := p1["y_r"]-p1["y"]; + p[0]+=dx; + p[1]+=dy; + end return true; end function ScreenToClient(hwnd :pointer;var p:array of integer):integer;// 继续努力 begin - if {gdk_backend_is_wayland()}true then - begin - p1 := g_object_get_data(hwnd,"motion_xy"); - if ifarray(p1) then - begin - dx := p1["x_r"]-p1["x"]; - dy := p1["y_r"]-p1["y"]; - p[0]-=dx; - p[1]-=dy; - end - return true; - end - p1 := array(0,0); - ClientToScreen(hwnd,p1); - p[0]-=p1[0]; - p[1]-=p1[1]; + p1 := g_object_get_data(hwnd,"motion_xy"); + if ifarray(p1) then + begin + dx := p1["x_r"]-p1["x"]; + dy := p1["y_r"]-p1["y"]; + p[0]-=dx; + p[1]-=dy; + end return true; end function BeginPaint(hwd :pointer;strc:pointer):pointer; @@ -2153,8 +2106,7 @@ type tsgtkapi = class(tgtkapis) begin w :=g_object_get_data(hwnd,"gtk_layout_width"); h := g_object_get_data(hwnd,"gtk_layout_height"); - global g_w_c_width; - pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd :=gtk_object_get_data_title_height(hwnd); gtk_widgetsizechanged(hwnd,max(0,h-pcd),w); return true; end @@ -3032,10 +2984,17 @@ type tsgtkapi = class(tgtkapis) return 1; end function GetCaretBlinkTime():integer; - begin + begin + global g_Caret_Blink_Time; + return g_Caret_Blink_Time; end function SetCaretBlinkTime(uMSeconds :integer):integer; - begin + begin + global g_Caret_Blink_Time; + if uMSeconds>100 and uMSeconds<> g_Caret_Blink_Time then + begin + g_Caret_Blink_Time := integer(uMSeconds); + end end Function WinExec(lpCmdLine:string;nCmdShow:integer):integer; begin @@ -3049,6 +3008,7 @@ type tsgtkapi = class(tgtkapis) end function BringWindowToTop(hwd :pointer); begin + SetActiveWindow(hwd); end function GetWindowHandleByPID(); begin @@ -3059,6 +3019,7 @@ type tsgtkapi = class(tgtkapis) end function ForegroundWindow(hwnd); begin + SetActiveWindow(hwd); end //socket function socket(af:integer;tp:integer;protocol:integer):pointer;begin end @@ -3212,6 +3173,11 @@ type tgtkapis = class() //gtk gtk_object_data_values_global[inttostr(h),n] := v; //echo tostn(gtk_object_data_values_global); end + function gtk_object_get_data_title_height(h); //获取标题栏高度 + begin + global g_w_c_width; + return gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; + end function gtk_object_get_data(h,n); //获得数据 begin if not(h>0 or h<0) then return 0; @@ -3414,20 +3380,22 @@ type tgtkapis = class() //gtk end end - function TslStringToGtk(s); //ascii转utf8 + function TslStringToGtk2(s); //ascii转utf8 begin return ansitoutf8(s); end - function TslStringToGtk2(s); //ascii转utf8 - begin + function TslStringToGtk(s); //ascii转utf8 + begin + return ansitoutf8(s); global g_ansi_unit_cache ; - if not ifarray(g_ansi_unit_cache) then g_ansi_unit_cache := array(); r := g_ansi_unit_cache[s]; if ifnil(r) then begin r := ansitoutf8(s); - g_ansi_unit_cache[s] := r;; + g_ansi_unit_cache[s] := 1; + //echo "\r\ntrans:",length(trim(s))," ",r;//" >>",s; end + return ansitoutf8(s); return r; end function GtkStringToTsl(s); //ascii转utf8 @@ -4329,6 +4297,12 @@ type tgtkapis = class() //gtk _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w); end + procedure gtk_widget_queue_resize_no_redraw(w:pointer); + begin + _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(w); + end + procedure gtk_widget_queue_draw_area(w:pointer;x:integer;y:integer;wd:integer;ht:integer); begin _f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;ht:integer);cdecl;external getfuncptrbyname(0,functionname()); @@ -4975,7 +4949,7 @@ type tgtkapis = class() //gtk end return ##_f_(w,p); end - function gtk_window_get_transient_for(w:pointer); + function gtk_window_get_transient_for(w:pointer):pointer; begin _f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(w,p); @@ -5680,6 +5654,11 @@ type tgtkapis = class() //gtk _f_ := static function(instance:pointer; detailed_signal:string; c_handler:pointer;data:pointer;dd:pointer;f:integer):integer;cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(instance,detailed_signal,c_handler,data,dd,f); end + procedure g_signal_handler_disconnect(instance:pointer;id:integer); + begin + _f_ := static procedure(instance:pointer;id:integer);cdecl;external getfuncptrbyname(0,functionname()); + return ##_f_(instance,id); + end function g_signal_new(signal_name:string;itype:pointer;signal_flags:integer;class_offset:integer;accumulator:pointer;accu_data:pointer;c_marshaller:pointer;return_type:pointer;n_params:integer;p1:pointer;p2:pointer):integer; begin _f_ := static function(signal_name:string;itype:pointer;signal_flags:integer;class_offset:integer;accumulator:pointer;accu_data:pointer;c_marshaller:pointer;return_type:pointer;n_params:integer;p1:pointer;p2:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); @@ -5715,6 +5694,10 @@ type tgtkapis = class() //gtk _f_ := static function(lev:integer):pointer; cdecl;external getfuncptrbyname(0,functionname()); return ##_f_(lev); end + function gdk_backend_is_wayland(); //wayland 判断 + begin + return static is_wayland(); + end procedure gdk_window_set_back_pixmap(window:pointer;pixmap:pointer;parent_relative:integer); begin _f_ := static procedure(window:pointer;pixmap:pointer;parent_relative:integer);cdecl;external getfuncptrbyname(0,functionname()); @@ -6743,9 +6726,6 @@ type tgtk_ctl_object = class(_gtkeventtype) begin _const := getwin32const(); _wapi := gettswin32api(); - //FMousemoveernotify := new tenterouterlist(_wapi); - //FMousemoveernotify.Mousemovecall := thisfunction(widgetmousemovecall); - //FMousemoveernotify.Mousehittest := thisfunction(widgetmousehit); FsysCursors := array(); FsysCursors[0] := _wapi.gdk_cursor_new(2); FsysCursors[1] := _wapi.gdk_cursor_new(70); @@ -6802,7 +6782,6 @@ type tgtk_ctl_object = class(_gtkeventtype) if (msg = _const.WM_SYSCOMMAND and w = 0xF012) or (msg = _const.WM_NCLBUTTONDOWN and w= _const.HTCAPTION) then //WM_NCLBUTTONDOWN begin Fsyscommand0x12 := true; - //FMousemoveernotify.lock(); h := handle; x := _wapi.g_object_get_data(h,"gtk_layout_x"); y := _wapi.g_object_get_data(h,"gtk_layout_y"); @@ -7088,7 +7067,6 @@ type tgtk_ctl_object = class(_gtkeventtype) if FHitwidgetposition in array(10,11,12,15) then begin FHitwidgetposition += 100; - //FMousemoveernotify.lock(); h := handle; xy := array(0,0); _wapi.GetCursorPos(xy); @@ -7598,7 +7576,6 @@ type tgtk_ctl_object = class(_gtkeventtype) begin FHitwidgetposition := 0; Fsyscommand0x12info := nil; - //FMousemoveernotify.unlock(); //return ; end end @@ -7627,20 +7604,14 @@ type tgtk_ctl_object = class(_gtkeventtype) begin Fsyscommand0x12 := false; Fsyscommand0x12info := nil; - //FMousemoveernotify.unlock(); //return ; end end end end case mn of - GS_VISIBILITY_NOTIFY_EVENT: - begin - echo "visb:"; - end GS_DESTROY: begin - //FMousemoveernotify.unlock(); Fsyscommand0x12 := 0; Fsyscommand0x12info := nil; FHitwidgetposition := 0; @@ -7743,7 +7714,7 @@ type tgtk_ctl_object = class(_gtkeventtype) if FHandle=0 then return 0; for i,lnid in FConnectNameIds do begin - g_signal_handler_disconnect(FHandle,lnid); + _wapi.g_signal_handler_disconnect(FHandle,lnid); end FConnectNameIds := array(); FConnectHandlers := array(); @@ -7771,24 +7742,6 @@ type tgtk_ctl_object = class(_gtkeventtype) end return r; end - function getsignalmap();virtual; - begin - return array( - "destroy":"tsl_gtk_destroy_event", //销毁 - "activate":"tsl_gtk_activate_event", //活动 - "clicked":"tsl_gtk_clicked_event", //点击 - "value-changed":"tsl_gtk_adj_value_changed_event", //值改变 - "delete-event":"tsl_gtk_delete_event", //删除 - //"day-selected":"tsl_gtk_day_select_event", //日历选择 - "changed" :"tsl_gtk_changed_event", //改变 - "preedit-changed":"tsl_gtk_preedit_changed_event" , - "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(n,f); //连接消息 begin //删除connect @@ -7802,18 +7755,15 @@ type tgtk_ctl_object = class(_gtkeventtype) begin //echo "\r\n========================remove connect:",n; reindex(FConnectNameIds,array(ln:nil)); - g_signal_handler_disconnect(FHandle,lnid); + _wapi.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); ptr := get_fptr_by_sigal_name(n); if ptr then begin - lnid := g_signal_connect_data(FHandle, ln, ptr, eid,nil,0); + lnid := _wapi.g_signal_connect_data(FHandle, ln, ptr, eid,nil,0); FConnectNameIds[ln] := lnid; FConnectHandlers[inttostr(eid)] := f; end else @@ -7948,27 +7898,7 @@ type tgtk_ctl_object = class(_gtkeventtype) static _wapi; static _const; private - FHandle; - function gtk_widget_get_type():pointer; - begin - _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname()); - return ##_f_(); - end - procedure g_signal_handler_disconnect(instance:pointer;id:integer); - begin - _f_ := static procedure(instance:pointer;id:integer);cdecl;external getfuncptrbyname(0,functionname()); - return ##_f_(instance,id); - end - function g_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,functionname()); - return ##_f_(instance,detailed_signal,c_handler,data,dd,f); - end - function g_signal_new(signal_name:string;itype:pointer;signal_flags:integer;class_offset:integer;accumulator:pointer;accu_data:pointer;c_marshaller:pointer;return_type:pointer;n_params:integer;p1:pointer;p2:pointer):integer; - begin - _f_ := static function(signal_name:string;itype:pointer;signal_flags:integer;class_offset:integer;accumulator:pointer;accu_data:pointer;c_marshaller:pointer;return_type:pointer;n_params:integer;p1:pointer;p2:pointer):integer;cdecl;external getfuncptrbyname(0,functionname()); - return ##_f_(signal_name,itype,signal_flags,class_offset,accumulator,accu_data,c_marshaller,return_type,n_params,p1,p2); - end + FHandle; FConnectNameIds; FConnectHandlers; FValues; @@ -8001,9 +7931,9 @@ type tgtk_ctl_object = class(_gtkeventtype) //wm-user if FinitNewSignaled then return ; FinitNewSignaled := true; - for i,v in array(gtk_widget_get_type()) do + for i,v in array(_wapi.gtk_widget_get_type()) do begin - g_signal_new("wm-user", + _wapi.g_signal_new("wm-user", v, 2, 0, @@ -8036,7 +7966,6 @@ type tgtk_ctl_object = class(_gtkeventtype) begin return true; end - //static FMousemoveernotify; class function getfimobj(); begin if not FImobj then FImobj := new tgtk_im_object(nil); @@ -8070,16 +7999,6 @@ type tgtk_im_object = class(tgtk_ctl_object) Connect(v,f); end end - function getsignalmap();override; - begin - return array( - "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 function GtkEventDispatch(a,mn,c,d);override; //根据名称处理gtk消息 begin case mn of @@ -8100,6 +8019,11 @@ type tgtk_im_object = class(tgtk_ctl_object) function GtkBaseEventName();override; //绑定的消息 begin return array("commit");//,"preedit-changed","preedit-end","preedit-start","retrieve-surrounding");//"commit","delete-surrounding", + //"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 function focusin();//focus in begin @@ -8214,7 +8138,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) r := zeros(4); _wapi.gtk_widget_get_allocation(hd,r); cr := _wapi.gdk_cairo_create(_wapi.gtk_widget_get_window(hd)); - rec := zeros(4); + rec := zeros(4); _wapi.gdk_cairo_get_clip_rectangle(cr,rec); //echo ">>>1111",tostn(rec); //echo ">>>extents:"; @@ -8249,7 +8173,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) end CallTslVclProc(_const.WM_NCPAINT,0,cr); //绘制 end - end + end _wapi.cairo_destroy(cr); _wapi.gtk_object_set_data(cr); //echo "\r\ntime:",datetimetostr(now()),"===timeuses:",mtoc,"===",hd; @@ -8549,82 +8473,6 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object) w := makelong(_const.SB_THUMBTRACK,0); CallTslVclProc(_const.WM_VSCROLL,w,0,1); end - {function GtkEventDispatch_(a,mn,c,d);override; //原有的消息处理 - begin - //消息分发 - if mn="scroll-event" then - begin - h := a.handle; - - nt := now(); - if (nt-(1/24/3600/100))0 and dr<>1 then return ; - x := ed.x_root; - y := ed.y_root; - r := array(); - - _wapi.GetTopWidgetList(h,x,y,r); - lenr := length(r)-1; - for i := lenr downto 0 do - begin - ri := r[i][0]; - rxy := r[i][1]; - fv := _wapi.g_object_get_data(ri,"gtk_window_vscroll_bar"); - if fv and _wapi.gtk_widget_is_visible(fv) then - begin - ifdowheel := true; - break; - end - end - if not ifdowheel then - begin - ri := r[lenr][0]; - rxy := r[lenr][1]; - end - if ri and rxy then - begin - //if hasMessageFromGtkMessageQueue(-1,_const.LM_MOUSEWHEEL) then return true; //20230417暂时屏蔽 - if hasMessageFromGtkMessageQueue(-1,_const.WM_SIZE) then return true; - //if hasMessageFromGtkMessageQueue(-1,_const.WM_MOUSEMOVE) then return true; - WHEEL_DELTA := 120; - FScrollT := now(); - dr := (dr=1)?(-WHEEL_DELTA):(WHEEL_DELTA); - whist := feacheasylostMessageFromGtkMessageQueue(ri,_const.LM_MOUSEWHEEL); - for ii,iiv in whist do - begin - iivw := iiv[2]; - lowuperdword(iivw,iivc,iivdir); - dr+=iivdir; - end - if dr=0 then return true; - - xy := makelong(rxy[0],rxy[1]); - ctl := 0; - global g_gtk_buttontable,g_gtk_keytable; - if ifarray(g_gtk_buttontable) then - begin - ctl .|= g_gtk_buttontable[0]; - ctl .|= g_gtk_buttontable[1]; - end - if ifarray(g_gtk_keytable) then - begin - if g_gtk_keytable[0x10] then ctl .|= _const.MK_Shift; - if g_gtk_keytable[0x11] then ctl .|= _const.MK_Control; - end - dr := makelong(ctl,dr); - //clearMessageFromGtkMessageQueue(ri,_const.LM_MOUSEWHEEL); - AddMessageToGtkMessageQueue(ri,_const.LM_MOUSEWHEEL,dr,xy,1); - return true; - end - - end - return inherited; - end } private ftarget ; fscrollinfos; @@ -8826,7 +8674,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) begin //消息分发 //echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n"; - global g_gtk_shadow_size_nset,g_gtk_shadow_width,g_gtk_shadow_heigt,g_w_c_width; + global g_gtk_shadow_size_nset,g_gtk_shadow_width,g_gtk_shadow_heigt; case mn of GS_SHOW: begin @@ -8869,7 +8717,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) Exit; end if (cx <> AWidth) then _wapi.g_object_set_data(h,"gtk_layout_width",AWidth); - pcd := _wapi.gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0; + pcd := _wapi.gtk_object_get_data_title_height(h); if cy <> AHeight then begin _wapi.g_object_set_data(h,"gtk_layout_height",AHeight+pcd); @@ -8911,7 +8759,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) else begin h := _wapi.gtk_window_new(1); //popup - //_wapi.gtk_window_set_type_hint(h,11); //此处忽略类型 + //_wapi.gtk_window_set_type_hint(h,GDK_WINDOW_TYPE_HINT_MENU); //此处忽略类型 end _wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1); if not(hascap or srszie) then @@ -8934,7 +8782,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) _wapi.gtk_window_set_default_size(h,max(1,nWidth),max(1,nheight-pcd)); //顶层窗口采用设default if not srszie then begin - if gdk_backend_is_wayland() and hascap then _wapi.g_object_set_data(h,"size_has_shadow",true); + if _wapi.gdk_backend_is_wayland() and hascap then _wapi.g_object_set_data(h,"size_has_shadow",true); _wapi.g_object_set_data(h,"size_last_set",true); _wapi.g_object_set_data(h,"size_last_set_value",array(max(1,nWidth),max(1,nheight-pcd))); end @@ -8982,8 +8830,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) _wapi.gtk_widget_show_all(vbox); InitContainerList(h); //容器list if hwndparent then //设置parent _wapi.SetParent(h,hwndparent); - begin - + begin _wapi.g_object_set_data(h,"gtk_layout_parent",hwndparent); if _wapi.gtk_widget_is_toplevel(hwndparent) then trf := hWndParent; else @@ -9014,14 +8861,17 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window) end function GSBUTTONRELEASEEVENT(a,b,c,d);override; begin + if not _wapi.gtk_widget_get_sensitive(a.handle) then return true; return false; end function GSMOTIONNOTIFYEVENT(a,b,c,d);override; begin + if not _wapi.gtk_widget_get_sensitive(a.handle) then return true; return false; end function GSBUTTONPRESSEVENT(a,b,c,d);override; begin + if not _wapi.gtk_widget_get_sensitive(a.handle) then return true; return false; end function cleinteventpress(a,b,c,d); @@ -9289,25 +9139,7 @@ begin end function GetGtkEventNameOrId(n); //获得event begin - global G_E_ID_Name_1; - global G_E_ID_Name_2; - if not ifarray(G_E_ID_Name_1) then - begin - G_E_ID_Name_2 := array(); - G_E_ID_Name_1 := array( - "wm-user":10, - "destroy":11, - "activate":12, - "clicked":13, - "value-changed":14, - "delete-event":15, - "event":16 , - "window-sate-event":17); - for i,v in G_E_ID_Name_1 do - begin - G_E_ID_Name_2[v] := i; - end - end + global G_E_ID_Name_1,G_E_ID_Name_2; if ifstring(n) then begin ln := lowercase(n); @@ -9737,6 +9569,7 @@ CAIRO_OPERATOR_HSL_SATURATION:=26; CAIRO_OPERATOR_HSL_COLOR:=27; CAIRO_OPERATOR_HSL_LUMINOSITY:=28; } +/////////////////////////////非api上面的external 函数/////////////////////////////////////////////////// function gtk_init_check(argc:string;argcv:string):integer; begin _f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname()); @@ -9757,11 +9590,29 @@ 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,g_gtk_dragxy, - g_gtk_shadow_width,g_gtk_shadow_heigt,g_gtk_shadow_size_nset; + g_gtk_shadow_width,g_gtk_shadow_heigt,g_gtk_shadow_size_nset, + G_E_ID_Name_1,G_E_ID_Name_2,g_Caret_Blink_Time,g_ansi_unit_cache; + g_ansi_unit_cache := array(); + G_E_ID_Name_2 := array(); + G_E_ID_Name_1 := array( + "wm-user":10, + "destroy":11, + "activate":12, + "clicked":13, + "value-changed":14, + "delete-event":15, + "event":16 , + "window-sate-event":17); + for i,v in G_E_ID_Name_1 do + begin + G_E_ID_Name_2[v] := i; + end + g_Caret_Blink_Time := 800; g_gtk_dragxy := array(0,0); g_gtk_font_get_size := array(); gtk_init_check(nil,nil); @@ -9774,6 +9625,7 @@ begin g_gtk_keytable := array(0x10:0,0x11:0,0x12:0); g_gtk_call_handler_manager := new tinstancemanager(); kmp := keymap_get_default(); + if not kmp then return 0; signal_connect_data(kmp,"state-changed",g_gtk_call_handler_manager.get(thisfunction(tsl_gtk_keymp_state)),0,0); end function ugtk(); @@ -9786,25 +9638,14 @@ begin global g_gtk_call_handler_manager; if not g_gtk_call_handler_manager then return 0; mgnr := g_gtk_call_handler_manager; + fptr := findfunction(fname); + if fptr then + return mgnr.get(fptr); case fname of - "tsl_gtk_wmuser_event": return mgnr.get(thisfunction(tsl_gtk_wmuser_event)); - "tsl_gtk_destroy_event": return mgnr.get(thisfunction(tsl_gtk_destroy_event)); - "tsl_gtk_activate_event": return mgnr.get(thisfunction(tsl_gtk_activate_event)); - "tsl_gtk_activate_default_event_cb": return mgnr.get(thisfunction(tsl_gtk_activate_default_event_cb)); - "tsl_gtk_clicked_event": return mgnr.get(thisfunction(tsl_gtk_clicked_event)); - "tsl_gtk_adj_value_changed_event": return mgnr.get(thisfunction(tsl_gtk_adj_value_changed_event)); - "tsl_gtk_delete_event": return mgnr.get(thisfunction(tsl_gtk_delete_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_preedit_changed_event": return mgnr.get(thisfunction(tsl_gtk_preedit_changed_event)); "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)); - "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); @@ -9825,6 +9666,7 @@ procedure tsl_gtk_keymp_state(kmp:pointer;d:pointer); begin global g_gtk_keytable; g_gtk_keytable := array(0x10:0,0x11:0,0x12:0); + if not kmp then return ; state := keymap_get_modifier_state(kmp); if state>0 then begin @@ -9855,7 +9697,6 @@ begin end function c_g_e_visibility_notify_event(w:pointer;e:pointer;u_d:pointer):integer; // begin - echo ">>>visibility_notify_event:"; return false; //return do_two_param_event(a, "value-changed"); end @@ -9863,7 +9704,6 @@ function c_g_e_value_changed(a:pointer;b:pointer):integer; //tsl_gtk_adj_value_ 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); @@ -9937,25 +9777,6 @@ 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); @@ -9969,61 +9790,13 @@ begin return _gtkeventcall_(a,c,b); //获得消息处理函数的指针 end -function tsl_gtk_activate_default_event_cb(a:pointer;b:pointer):integer; -begin - //return _gtkeventcall_(a,c,b); - return do_two_param_event(a, "activate-default"); - //activate-default; -end -function tsl_gtk_preedit_changed_event(a:pointer;b:pointer;c:pointer):integer; -begin - return dotparamseevents(a, "preedit-changed", b, c); -end -function tsl_gtk_changed_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "changed"); -end -function tsl_gtk_day_select_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "day-selected"); -end -function tsl_gtk_delete_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "delete-event"); -end -function tsl_gtk_adj_value_changed_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "value-changed"); -end -function tsl_gtk_clicked_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "clicked"); -end -function tsl_gtk_activate_event(a:pointer;b:pointer):integer; -begin - return do_two_param_event(a, "activate"); -end - -function tsl_gtk_destroy_event(a:pointer; b:pointer;c:pointer):integer; -begin - return _gtkeventcall_(a,b,c); -end -function tsl_gtk_wmuser_event(a:pointer; p1:pointer;p2:pointer):integer; -begin - return dotparamseevents(a, "wm-user", p1, p2); -end function do_two_param_event( a:pointer;b:string):integer; begin return _gtkeventcall_(a,GetGtkEventNameOrId(b),0); end -function dotparamseevents(a:pointer; b:string;p1:pointer;p2:pointer):pointer; -begin - return _gtkeventcall_(a,GetGtkEventNameOrId(b),p1,p2); -end -function gdk_backend_is_wayland(); //wayland 判断 -begin - return static is_wayland(); -end +///////////////////////////////////////////////////////////// + + function is_wayland(); begin st := static sysgetenv("XDG_SESSION_TYPE"); @@ -10041,10 +9814,6 @@ begin "libc": begin return getdlsymaddress("libc.so.6",n); - end - "gtk": - begin - end else return getdlsymaddress("libgtk-3.so.0",n); end diff --git a/funcext/tvclib/utslvclconstant.tsf b/funcext/tvclib/utslvclconstant.tsf index 061aacb..e9dbec5 100644 --- a/funcext/tvclib/utslvclconstant.tsf +++ b/funcext/tvclib/utslvclconstant.tsf @@ -421,6 +421,7 @@ end type TSLUICONST=class(tmacroconst,tconstant) static const WM_TRAY=0x464;static const opInsert="opInsert+"; static const opRemove="opRemove-";static const opRecycling="opRecycling-";static const opclosemainwnd="~closemianwnd~"; + static const cl_disabled_pen=0xafafaf;static const cl_disabled_brush=0xf9f9f9; end type ws2def_h=class() static const AF_UNSPEC=0x0;static const AF_UNIX=0x1; diff --git a/funcext/tvclib/utslvclstdctl.tsf b/funcext/tvclib/utslvclstdctl.tsf index e2456c8..c266faa 100644 --- a/funcext/tvclib/utslvclstdctl.tsf +++ b/funcext/tvclib/utslvclstdctl.tsf @@ -425,7 +425,7 @@ type tcustombtn = class(TCustomControl) // Fbtnstate := 0; InvalidateRect(nil,false); end - end } + end } function dosetfocus(o,e);override;//获得焦点 begin {** @@ -1183,7 +1183,9 @@ type teditable=class(TSLUIBASE) // dc.pen.width := 1; if FSetFocused then dc.pen.color := 9869000;//rgb(200,150,150); else dc.pen.color := 11842740;//rgb(180,180,180); - dc.brush.Color := FHost.Color; + if fhost.Enabled then + dc.brush.Color := FHost.Color; + else dc.brush.color := cl_disabled_brush; dc.draw("RoundRect",array(rbc[0:1],rbc[2:3],array(3,3))); end end @@ -1205,7 +1207,7 @@ type teditable=class(TSLUIBASE) // if FHost and FHost.HandleAllocated()and ifstring(s)and s then begin dc := FHost.Canvas; - if not dc.HandleAllocated()then return; + if not dc.HandleAllocated()then return; neb := not(FHost.Enabled); if neb then begin @@ -1576,7 +1578,7 @@ type teditable=class(TSLUIBASE) // if not(FHost and FHost.HandleAllocated()and FHost.Canvas.HandleAllocated())then return; dc := FHost.Canvas; dc.font := font; - rec := GetEntryRect(); + rec := GetEntryRect(); if FReadOnly then begin dc.brush.color := freadonlyColor; @@ -4248,6 +4250,12 @@ type TcustomComboBox=class(TCustomComboBoxbase) visible := false; end end + protected + function SetEnabled(v);override; + begin + inherited; + if FEdit then FEdit.Enabled := v; + end public function create(AOwner);override; begin