界面库

更新gtk,以及disabled背景色
This commit is contained in:
tslediter 2023-12-26 10:49:13 +08:00
parent 97570dea24
commit 85292744e9
5 changed files with 176 additions and 391 deletions

View File

@ -135,7 +135,9 @@ type tgraphiccontrol = class(TControl)
Canvas.DrawBitmap(self.BKBitmap,GetClientRect()); Canvas.DrawBitmap(self.BKBitmap,GetClientRect());
end else end else
begin begin
cl := Color; if Enabled then
cl := Color;
else cl := cl_disabled_brush;
if ifnumber(cl)then if ifnumber(cl)then
begin begin
Canvas.Brush.Color := cl; Canvas.Brush.Color := cl;

View File

@ -1002,7 +1002,13 @@ type TWinControl = class(tcontrol)
dc := e.wparam; dc := e.wparam;
if dc {and e.lparam}then if dc {and e.lparam}then
begin begin
cl := Color; if Enabled then
begin
cl := Color;
end else
begin
cl := cl_disabled_brush;
end
rect := array(0,0,0,0); rect := array(0,0,0,0);
if e.lparam=2 then if e.lparam=2 then
begin 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); _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} {$else}
_wapi.cairo_set_source_surface(dc, img, 0, 0); _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_rectangle(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]);
_wapi.cairo_clip(dc); _wapi.cairo_clip(dc);
_wapi.cairo_paint(dc); _wapi.cairo_paint(dc);

View File

@ -110,8 +110,7 @@ type tsgtkapi = class(tgtkapis)
y := g_object_get_data(hwd,"gtk_layout_y"); y := g_object_get_data(hwd,"gtk_layout_y");
w := g_object_get_data(hwd,"gtk_layout_width"); w := g_object_get_data(hwd,"gtk_layout_width");
h := g_object_get_data(hwd,"gtk_layout_height"); h := g_object_get_data(hwd,"gtk_layout_height");
global g_w_c_width; pcd := gtk_object_get_data_title_height(hwd);
pcd := gtk_object_get_data(hwd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_window_move(hwd,x,max(0,y-pcd)); gtk_window_move(hwd,x,max(0,y-pcd));
if w>=0 and h>=0 then if w>=0 and h>=0 then
begin begin
@ -248,8 +247,7 @@ type tsgtkapi = class(tgtkapis)
if h then if h then
begin begin
x0 := g_object_get_data(h,"gtk_layout_width"); x0 := g_object_get_data(h,"gtk_layout_width");
global g_w_c_width; pcd := gtk_object_get_data_title_height(h);
pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
y0 := g_object_get_data(h,"gtk_layout_height")-pcd; y0 := g_object_get_data(h,"gtk_layout_height")-pcd;
end end
rec := array(0,0,x0, max(0,y0)); rec := array(0,0,x0, max(0,y0));
@ -261,8 +259,7 @@ type tsgtkapi = class(tgtkapis)
ClientToScreen(hwnd,xy); ClientToScreen(hwnd,xy);
h := g_object_get_data(hwnd,"gtk_layout_height"); h := g_object_get_data(hwnd,"gtk_layout_height");
w := g_object_get_data(hwnd,"gtk_layout_width"); w := g_object_get_data(hwnd,"gtk_layout_width");
global g_w_c_width; pcd := gtk_object_get_data_title_height(hwnd);
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
rec := array(xy[0],xy[1],xy[0]+w,max(0,xy[1]+h-pcd)); rec := array(xy[0],xy[1],xy[0]+w,max(0,xy[1]+h-pcd));
end end
function GetWindowInfo(hwnd :pointer;f:pointer):integer; 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); function SetWindowPos(h:pointer;hWndInsertAfter:pointer; X:integer; Y:integer; cx:integer;cy:integer; uFlags:integer);
begin begin
//echo "\r\nset window pos:" ,x,"===",y,"=<>=",cx,"===",cy; //echo "\r\nset window pos:" ,x,"===",y,"=<>=",cx,"===",cy;
global g_w_c_width;
if 0x400 .& uFlags then if 0x400 .& uFlags then
begin begin
//echo "border set \r\n"; //echo "border set \r\n";
@ -283,7 +279,7 @@ type tsgtkapi = class(tgtkapis)
if not(h>0 or h<0) then return ; if not(h>0 or h<0) then return ;
flg := 0; flg := 0;
wt := static gtk_window_get_type(); 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 //主窗口 if g_type_check_instance_is_a(h,wt) then //主窗口
begin begin
x0 := g_object_get_data(h,"gtk_layout_x"); 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"); h0 := g_object_get_data(h,"gtk_layout_height");
if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then if (cx>=0 and cy>=0) and ( cx<>w0 or cy<>h0) then
begin begin
{if gtk_window_get_resizable(h) then
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 if gtk_window_get_resizable(h) then
begin begin
gtk_widget_set_size_request(h,1,1); gtk_widget_set_size_request(h,1,1);
@ -392,12 +361,24 @@ type tsgtkapi = class(tgtkapis)
begin begin
pt := gtk_widget_get_toplevel(pt); pt := gtk_widget_get_toplevel(pt);
end end
gtk_window_set_type_hint((dialog),0); //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)); gtk_window_set_transient_for( GTK_WINDOW(dialog),GTK_WINDOW(pt));
//gtk_widget_set_sensitive(pt,false);
//w.Visible := true; //w.Visible := true;
gtk_widget_show(dialog); gtk_widget_show(dialog);
g_object_set_data(dialog,"is_show_modaling",true); 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; return true;
end end
end end
@ -406,17 +387,20 @@ type tsgtkapi = class(tgtkapis)
dialog := w.handle; dialog := w.handle;
if not g_object_get_data(dialog,"is_show_modaling") then return ; if not g_object_get_data(dialog,"is_show_modaling") then return ;
g_object_set_data(dialog,"is_show_modaling",false); g_object_set_data(dialog,"is_show_modaling",false);
pt := GetParent(dialog); //pt := GetParent(dialog);
if (pt) then 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 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 begin
pt := gtk_widget_get_toplevel(pt); gtk_widget_set_sensitive(pt,true);
end 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);
end end
end end
function GetParent(h); //获得父窗口 function GetParent(h); //获得父窗口
@ -540,8 +524,7 @@ type tsgtkapi = class(tgtkapis)
end end
if SizeChanged then //这个是不是应该放前面 if SizeChanged then //这个是不是应该放前面
begin begin
global g_w_c_width; pcd := gtk_object_get_data_title_height(h);
pcd := gtk_object_get_data(h,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_widgetsizechanged(h,max(0,AHeight-pcd),AWidth); gtk_widgetsizechanged(h,max(0,AHeight-pcd),AWidth);
end end
{if SizeChanged then {if SizeChanged then
@ -730,7 +713,7 @@ type tsgtkapi = class(tgtkapis)
h := g_object_get_data(hwnd,"gtk_clientwideget"); h := g_object_get_data(hwnd,"gtk_clientwideget");
if h then if h then
begin 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 if ifarray(rec) and ifnumber(rec[0]) and ifnumber(rec[1]) and ifnumber(rec[2]) and ifnumber(rec[3]) then
begin begin
gtk_widget_queue_draw_area(h,rec[0],rec[1],rec[2]-rec[0],rec[3]-rec[1]); gtk_widget_queue_draw_area(h,rec[0],rec[1],rec[2]-rec[0],rec[3]-rec[1]);
@ -901,12 +884,15 @@ type tsgtkapi = class(tgtkapis)
//cairo_fill //cairo_fill
end end
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
if udl then if udl then
begin begin
cairo_set_line_width(hdc,0.4); cairo_set_line_width(hdc,0.4);
end end
if bytetype(txt,tlen)=1 then //字符类型判断
begin
tlen-=1;
end
txts := array(); txts := array();
txtidx := 0; txtidx := 0;
txti := ""; txti := "";
@ -957,7 +943,6 @@ type tsgtkapi = class(tgtkapis)
cairo_show_text(hdc,TslStringToGtk(v0)); cairo_show_text(hdc,TslStringToGtk(v0));
cairo_stroke(hdc); cairo_stroke(hdc);
end end
return 1; return 1;
while idx<=tlen do while idx<=tlen do
begin begin
@ -1232,7 +1217,10 @@ type tsgtkapi = class(tgtkapis)
end end
function SetActiveWindow(h); function SetActiveWindow(h);
begin 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); if hh then gtk_window_present(hh);
end end
function CreatePen(FS,w,FC); //gtk 模拟 pen function CreatePen(FS,w,FC); //gtk 模拟 pen
@ -1340,8 +1328,7 @@ type tsgtkapi = class(tgtkapis)
begin begin
h :=g_object_get_data(hwd,"gtk_layout_height"); h :=g_object_get_data(hwd,"gtk_layout_height");
w :=g_object_get_data(hwd,"gtk_layout_width"); w :=g_object_get_data(hwd,"gtk_layout_width");
global g_w_c_width; pcd := gtk_object_get_data_title_height(hwnd);
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_widgetsizechanged(hwd,max(0,h-pcd),w); gtk_widgetsizechanged(hwd,max(0,h-pcd),w);
end end
Function SetMenu(hwd:pointer;hmenu:pointer):integer; //设置菜单栏 Function SetMenu(hwd:pointer;hmenu:pointer):integer; //设置菜单栏
@ -1379,8 +1366,7 @@ type tsgtkapi = class(tgtkapis)
end end
h :=g_object_get_data(hwd,"gtk_layout_height"); h :=g_object_get_data(hwd,"gtk_layout_height");
w :=g_object_get_data(hwd,"gtk_layout_width"); w :=g_object_get_data(hwd,"gtk_layout_width");
global g_w_c_width; pcd := gtk_object_get_data_title_height(hwnd);
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_widgetsizechanged(hwd,max(0,h-pcd),w); gtk_widgetsizechanged(hwd,max(0,h-pcd),w);
//移除原有窗口 //移除原有窗口
//menubar 添加到窗口 //menubar 添加到窗口
@ -1429,61 +1415,28 @@ type tsgtkapi = class(tgtkapis)
function ClientToScreen(hwnd :pointer;var p:array of integer):integer; // 继续努力 function ClientToScreen(hwnd :pointer;var p:array of integer):integer; // 继续努力
begin begin
if not hwnd then return ; if not hwnd then return ;
if not GTK_WIDGET(hwnd) then return ; if not IsGtkWidget(hwnd) then return ;
if {gdk_backend_is_wayland()} true then p1 := g_object_get_data(hwnd,"motion_xy");
if ifarray(p1) then
begin begin
p1 := g_object_get_data(hwnd,"motion_xy"); dx := p1["x_r"]-p1["x"];
if ifarray(p1) then dy := p1["y_r"]-p1["y"];
begin p[0]+=dx;
dx := p1["x_r"]-p1["x"]; p[1]+=dy;
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
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
end end
return true; return true;
end end
function ScreenToClient(hwnd :pointer;var p:array of integer):integer;// 继续努力 function ScreenToClient(hwnd :pointer;var p:array of integer):integer;// 继续努力
begin begin
if {gdk_backend_is_wayland()}true then p1 := g_object_get_data(hwnd,"motion_xy");
if ifarray(p1) then
begin begin
p1 := g_object_get_data(hwnd,"motion_xy"); dx := p1["x_r"]-p1["x"];
if ifarray(p1) then dy := p1["y_r"]-p1["y"];
begin p[0]-=dx;
dx := p1["x_r"]-p1["x"]; p[1]-=dy;
dy := p1["y_r"]-p1["y"];
p[0]-=dx;
p[1]-=dy;
end
return true;
end end
p1 := array(0,0);
ClientToScreen(hwnd,p1);
p[0]-=p1[0];
p[1]-=p1[1];
return true; return true;
end end
function BeginPaint(hwd :pointer;strc:pointer):pointer; function BeginPaint(hwd :pointer;strc:pointer):pointer;
@ -2153,8 +2106,7 @@ type tsgtkapi = class(tgtkapis)
begin begin
w :=g_object_get_data(hwnd,"gtk_layout_width"); w :=g_object_get_data(hwnd,"gtk_layout_width");
h := g_object_get_data(hwnd,"gtk_layout_height"); h := g_object_get_data(hwnd,"gtk_layout_height");
global g_w_c_width; pcd :=gtk_object_get_data_title_height(hwnd);
pcd := gtk_object_get_data(hwnd,"gtk_wnd_hs_caption")?g_w_c_width:0;
gtk_widgetsizechanged(hwnd,max(0,h-pcd),w); gtk_widgetsizechanged(hwnd,max(0,h-pcd),w);
return true; return true;
end end
@ -3033,9 +2985,16 @@ type tsgtkapi = class(tgtkapis)
end end
function GetCaretBlinkTime():integer; function GetCaretBlinkTime():integer;
begin begin
global g_Caret_Blink_Time;
return g_Caret_Blink_Time;
end end
function SetCaretBlinkTime(uMSeconds :integer):integer; 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 end
Function WinExec(lpCmdLine:string;nCmdShow:integer):integer; Function WinExec(lpCmdLine:string;nCmdShow:integer):integer;
begin begin
@ -3049,6 +3008,7 @@ type tsgtkapi = class(tgtkapis)
end end
function BringWindowToTop(hwd :pointer); function BringWindowToTop(hwd :pointer);
begin begin
SetActiveWindow(hwd);
end end
function GetWindowHandleByPID(); function GetWindowHandleByPID();
begin begin
@ -3059,6 +3019,7 @@ type tsgtkapi = class(tgtkapis)
end end
function ForegroundWindow(hwnd); function ForegroundWindow(hwnd);
begin begin
SetActiveWindow(hwd);
end end
//socket //socket
function socket(af:integer;tp:integer;protocol:integer):pointer;begin end 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; gtk_object_data_values_global[inttostr(h),n] := v;
//echo tostn(gtk_object_data_values_global); //echo tostn(gtk_object_data_values_global);
end 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); //获得数据 function gtk_object_get_data(h,n); //获得数据
begin begin
if not(h>0 or h<0) then return 0; if not(h>0 or h<0) then return 0;
@ -3414,20 +3380,22 @@ type tgtkapis = class() //gtk
end end
end end
function TslStringToGtk(s); //ascii转utf8 function TslStringToGtk2(s); //ascii转utf8
begin begin
return ansitoutf8(s); return ansitoutf8(s);
end end
function TslStringToGtk2(s); //ascii转utf8 function TslStringToGtk(s); //ascii转utf8
begin begin
return ansitoutf8(s);
global g_ansi_unit_cache ; global g_ansi_unit_cache ;
if not ifarray(g_ansi_unit_cache) then g_ansi_unit_cache := array();
r := g_ansi_unit_cache[s]; r := g_ansi_unit_cache[s];
if ifnil(r) then if ifnil(r) then
begin begin
r := ansitoutf8(s); r := ansitoutf8(s);
g_ansi_unit_cache[s] := r;; g_ansi_unit_cache[s] := 1;
//echo "\r\ntrans:",length(trim(s))," ",r;//" >>",s;
end end
return ansitoutf8(s);
return r; return r;
end end
function GtkStringToTsl(s); //ascii转utf8 function GtkStringToTsl(s); //ascii转utf8
@ -4329,6 +4297,12 @@ type tgtkapis = class() //gtk
_f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname()); _f_ := static procedure(w:pointer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w); return ##_f_(w);
end 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); procedure gtk_widget_queue_draw_area(w:pointer;x:integer;y:integer;wd:integer;ht:integer);
begin begin
_f_ := static procedure(w:pointer;x:integer;y:integer;wd:integer;ht:integer);cdecl;external getfuncptrbyname(0,functionname()); _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 end
return ##_f_(w,p); return ##_f_(w,p);
end end
function gtk_window_get_transient_for(w:pointer); function gtk_window_get_transient_for(w:pointer):pointer;
begin begin
_f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function(w:pointer;p:pointer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,p); return ##_f_(w,p);
@ -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()); _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); return ##_f_(instance,detailed_signal,c_handler,data,dd,f);
end 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; 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 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()); _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()); _f_ := static function(lev:integer):pointer; cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(lev); return ##_f_(lev);
end 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); procedure gdk_window_set_back_pixmap(window:pointer;pixmap:pointer;parent_relative:integer);
begin begin
_f_ := static procedure(window:pointer;pixmap:pointer;parent_relative:integer);cdecl;external getfuncptrbyname(0,functionname()); _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 begin
_const := getwin32const(); _const := getwin32const();
_wapi := gettswin32api(); _wapi := gettswin32api();
//FMousemoveernotify := new tenterouterlist(_wapi);
//FMousemoveernotify.Mousemovecall := thisfunction(widgetmousemovecall);
//FMousemoveernotify.Mousehittest := thisfunction(widgetmousehit);
FsysCursors := array(); FsysCursors := array();
FsysCursors[0] := _wapi.gdk_cursor_new(2); FsysCursors[0] := _wapi.gdk_cursor_new(2);
FsysCursors[1] := _wapi.gdk_cursor_new(70); 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 if (msg = _const.WM_SYSCOMMAND and w = 0xF012) or (msg = _const.WM_NCLBUTTONDOWN and w= _const.HTCAPTION) then //WM_NCLBUTTONDOWN
begin begin
Fsyscommand0x12 := true; Fsyscommand0x12 := true;
//FMousemoveernotify.lock();
h := handle; h := handle;
x := _wapi.g_object_get_data(h,"gtk_layout_x"); x := _wapi.g_object_get_data(h,"gtk_layout_x");
y := _wapi.g_object_get_data(h,"gtk_layout_y"); 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 if FHitwidgetposition in array(10,11,12,15) then
begin begin
FHitwidgetposition += 100; FHitwidgetposition += 100;
//FMousemoveernotify.lock();
h := handle; h := handle;
xy := array(0,0); xy := array(0,0);
_wapi.GetCursorPos(xy); _wapi.GetCursorPos(xy);
@ -7598,7 +7576,6 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin begin
FHitwidgetposition := 0; FHitwidgetposition := 0;
Fsyscommand0x12info := nil; Fsyscommand0x12info := nil;
//FMousemoveernotify.unlock();
//return ; //return ;
end end
end end
@ -7627,20 +7604,14 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin begin
Fsyscommand0x12 := false; Fsyscommand0x12 := false;
Fsyscommand0x12info := nil; Fsyscommand0x12info := nil;
//FMousemoveernotify.unlock();
//return ; //return ;
end end
end end
end end
end end
case mn of case mn of
GS_VISIBILITY_NOTIFY_EVENT:
begin
echo "visb:";
end
GS_DESTROY: GS_DESTROY:
begin begin
//FMousemoveernotify.unlock();
Fsyscommand0x12 := 0; Fsyscommand0x12 := 0;
Fsyscommand0x12info := nil; Fsyscommand0x12info := nil;
FHitwidgetposition := 0; FHitwidgetposition := 0;
@ -7743,7 +7714,7 @@ type tgtk_ctl_object = class(_gtkeventtype)
if FHandle=0 then return 0; if FHandle=0 then return 0;
for i,lnid in FConnectNameIds do for i,lnid in FConnectNameIds do
begin begin
g_signal_handler_disconnect(FHandle,lnid); _wapi.g_signal_handler_disconnect(FHandle,lnid);
end end
FConnectNameIds := array(); FConnectNameIds := array();
FConnectHandlers := array(); FConnectHandlers := array();
@ -7771,24 +7742,6 @@ type tgtk_ctl_object = class(_gtkeventtype)
end end
return r; return r;
end 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); //连接消息 function Connect(n,f); //连接消息
begin begin
//删除connect //删除connect
@ -7802,18 +7755,15 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin begin
//echo "\r\n========================remove connect:",n; //echo "\r\n========================remove connect:",n;
reindex(FConnectNameIds,array(ln:nil)); reindex(FConnectNameIds,array(ln:nil));
g_signal_handler_disconnect(FHandle,lnid); _wapi.g_signal_handler_disconnect(FHandle,lnid);
end end
//echo "\r\nconnect ===========================",FHandle,"=====",n; //echo "\r\nconnect ===========================",FHandle,"=====",n;
eid := GetGtkEventNameOrId(ln); 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); ptr := get_fptr_by_sigal_name(n);
if ptr then if ptr then
begin 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; FConnectNameIds[ln] := lnid;
FConnectHandlers[inttostr(eid)] := f; FConnectHandlers[inttostr(eid)] := f;
end else end else
@ -7949,26 +7899,6 @@ type tgtk_ctl_object = class(_gtkeventtype)
static _const; static _const;
private private
FHandle; 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
FConnectNameIds; FConnectNameIds;
FConnectHandlers; FConnectHandlers;
FValues; FValues;
@ -8001,9 +7931,9 @@ type tgtk_ctl_object = class(_gtkeventtype)
//wm-user //wm-user
if FinitNewSignaled then return ; if FinitNewSignaled then return ;
FinitNewSignaled := true; FinitNewSignaled := true;
for i,v in array(gtk_widget_get_type()) do for i,v in array(_wapi.gtk_widget_get_type()) do
begin begin
g_signal_new("wm-user", _wapi.g_signal_new("wm-user",
v, v,
2, 2,
0, 0,
@ -8036,7 +7966,6 @@ type tgtk_ctl_object = class(_gtkeventtype)
begin begin
return true; return true;
end end
//static FMousemoveernotify;
class function getfimobj(); class function getfimobj();
begin begin
if not FImobj then FImobj := new tgtk_im_object(nil); 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); Connect(v,f);
end end
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消息 function GtkEventDispatch(a,mn,c,d);override; //根据名称处理gtk消息
begin begin
case mn of case mn of
@ -8100,6 +8019,11 @@ type tgtk_im_object = class(tgtk_ctl_object)
function GtkBaseEventName();override; //绑定的消息 function GtkBaseEventName();override; //绑定的消息
begin begin
return array("commit");//,"preedit-changed","preedit-end","preedit-start","retrieve-surrounding");//"commit","delete-surrounding", 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 end
function focusin();//focus in function focusin();//focus in
begin begin
@ -8549,82 +8473,6 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
w := makelong(_const.SB_THUMBTRACK,0); w := makelong(_const.SB_THUMBTRACK,0);
CallTslVclProc(_const.WM_VSCROLL,w,0,1); CallTslVclProc(_const.WM_VSCROLL,w,0,1);
end 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))<FScrollT then
begin
//return true;
end
ed := new _GdkEventScroll(c);
dr := ed.direction;
if dr<>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 private
ftarget ; ftarget ;
fscrollinfos; fscrollinfos;
@ -8826,7 +8674,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
begin begin
//消息分发 //消息分发
//echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n"; //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 case mn of
GS_SHOW: GS_SHOW:
begin begin
@ -8869,7 +8717,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
Exit; Exit;
end end
if (cx <> AWidth) then _wapi.g_object_set_data(h,"gtk_layout_width",AWidth); 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 if cy <> AHeight then
begin begin
_wapi.g_object_set_data(h,"gtk_layout_height",AHeight+pcd); _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 else
begin begin
h := _wapi.gtk_window_new(1); //popup 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 end
_wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1); _wapi.gtk_object_set_data(h,"gtk_wnd_hs_caption",1);
if not(hascap or srszie) then 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 _wapi.gtk_window_set_default_size(h,max(1,nWidth),max(1,nheight-pcd)); //顶层窗口采用设default
if not srszie then if not srszie then
begin 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",true);
_wapi.g_object_set_data(h,"size_last_set_value",array(max(1,nWidth),max(1,nheight-pcd))); _wapi.g_object_set_data(h,"size_last_set_value",array(max(1,nWidth),max(1,nheight-pcd)));
end end
@ -8983,7 +8831,6 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
InitContainerList(h); //容器list InitContainerList(h); //容器list
if hwndparent then //设置parent _wapi.SetParent(h,hwndparent); if hwndparent then //设置parent _wapi.SetParent(h,hwndparent);
begin begin
_wapi.g_object_set_data(h,"gtk_layout_parent",hwndparent); _wapi.g_object_set_data(h,"gtk_layout_parent",hwndparent);
if _wapi.gtk_widget_is_toplevel(hwndparent) then trf := hWndParent; if _wapi.gtk_widget_is_toplevel(hwndparent) then trf := hWndParent;
else else
@ -9014,14 +8861,17 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
end end
function GSBUTTONRELEASEEVENT(a,b,c,d);override; function GSBUTTONRELEASEEVENT(a,b,c,d);override;
begin begin
if not _wapi.gtk_widget_get_sensitive(a.handle) then return true;
return false; return false;
end end
function GSMOTIONNOTIFYEVENT(a,b,c,d);override; function GSMOTIONNOTIFYEVENT(a,b,c,d);override;
begin begin
if not _wapi.gtk_widget_get_sensitive(a.handle) then return true;
return false; return false;
end end
function GSBUTTONPRESSEVENT(a,b,c,d);override; function GSBUTTONPRESSEVENT(a,b,c,d);override;
begin begin
if not _wapi.gtk_widget_get_sensitive(a.handle) then return true;
return false; return false;
end end
function cleinteventpress(a,b,c,d); function cleinteventpress(a,b,c,d);
@ -9289,25 +9139,7 @@ begin
end end
function GetGtkEventNameOrId(n); //获得event function GetGtkEventNameOrId(n); //获得event
begin begin
global G_E_ID_Name_1; global G_E_ID_Name_1,G_E_ID_Name_2;
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
if ifstring(n) then if ifstring(n) then
begin begin
ln := lowercase(n); ln := lowercase(n);
@ -9737,6 +9569,7 @@ CAIRO_OPERATOR_HSL_SATURATION:=26;
CAIRO_OPERATOR_HSL_COLOR:=27; CAIRO_OPERATOR_HSL_COLOR:=27;
CAIRO_OPERATOR_HSL_LUMINOSITY:=28; CAIRO_OPERATOR_HSL_LUMINOSITY:=28;
} }
/////////////////////////////非api上面的external 函数///////////////////////////////////////////////////
function gtk_init_check(argc:string;argcv:string):integer; function gtk_init_check(argc:string;argcv:string):integer;
begin begin
_f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname()); _f_ := static function(argc:string;argcv:string):integer;cdecl;external getfuncptrbyname(0,functionname());
@ -9757,11 +9590,29 @@ begin
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,"gdk_keymap_get_default"); _f_ := static function():pointer;cdecl;external getfuncptrbyname(0,"gdk_keymap_get_default");
return ##_f_(); return ##_f_();
end end
///////////////////////////////////////////////////////////////////////////
function igtk(); function igtk();
begin begin
global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable, 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_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_dragxy := array(0,0);
g_gtk_font_get_size := array(); g_gtk_font_get_size := array();
gtk_init_check(nil,nil); gtk_init_check(nil,nil);
@ -9774,6 +9625,7 @@ begin
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0); g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
g_gtk_call_handler_manager := new tinstancemanager(); g_gtk_call_handler_manager := new tinstancemanager();
kmp := keymap_get_default(); 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); signal_connect_data(kmp,"state-changed",g_gtk_call_handler_manager.get(thisfunction(tsl_gtk_keymp_state)),0,0);
end end
function ugtk(); function ugtk();
@ -9786,25 +9638,14 @@ begin
global g_gtk_call_handler_manager; global g_gtk_call_handler_manager;
if not g_gtk_call_handler_manager then return 0; if not g_gtk_call_handler_manager then return 0;
mgnr := g_gtk_call_handler_manager; mgnr := g_gtk_call_handler_manager;
fptr := findfunction(fname);
if fptr then
return mgnr.get(fptr);
case fname of 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)); "do_two_param_event": return mgnr.get(thisfunction(do_two_param_event));
"tsl_gtk_normal_event_cb": return mgnr.get(thisfunction(tsl_gtk_normal_event_cb)); "tsl_gtk_normal_event_cb": return mgnr.get(thisfunction(tsl_gtk_normal_event_cb));
"tsl_gtk_normal_event_bc": return mgnr.get(thisfunction(tsl_gtk_normal_event_bc)); "tsl_gtk_normal_event_bc": return mgnr.get(thisfunction(tsl_gtk_normal_event_bc));
"tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle)); "tsl_gtk_idle": return mgnr.get(thisfunction(tsl_gtk_idle));
"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 ;
end end
function get_instance_i(fn); function get_instance_i(fn);
@ -9825,6 +9666,7 @@ procedure tsl_gtk_keymp_state(kmp:pointer;d:pointer);
begin begin
global g_gtk_keytable; global g_gtk_keytable;
g_gtk_keytable := array(0x10:0,0x11:0,0x12:0); g_gtk_keytable := array(0x10:0,0x11:0,0x12:0);
if not kmp then return ;
state := keymap_get_modifier_state(kmp); state := keymap_get_modifier_state(kmp);
if state>0 then if state>0 then
begin begin
@ -9855,7 +9697,6 @@ begin
end end
function c_g_e_visibility_notify_event(w:pointer;e:pointer;u_d:pointer):integer; // function c_g_e_visibility_notify_event(w:pointer;e:pointer;u_d:pointer):integer; //
begin begin
echo ">>>visibility_notify_event:";
return false; return false;
//return do_two_param_event(a, "value-changed"); //return do_two_param_event(a, "value-changed");
end end
@ -9863,7 +9704,6 @@ function c_g_e_value_changed(a:pointer;b:pointer):integer; //tsl_gtk_adj_value_
begin begin
return do_two_param_event(a, "value-changed"); return do_two_param_event(a, "value-changed");
end end
function c_g_e_destroy(a:pointer; b:pointer;c:pointer):integer; //tsl_gtk_destroy_event function c_g_e_destroy(a:pointer; b:pointer;c:pointer):integer; //tsl_gtk_destroy_event
begin begin
return _gtkeventcall_(a,b,c); return _gtkeventcall_(a,b,c);
@ -9937,25 +9777,6 @@ function c_g_e_activate(a:pointer;b:pointer):integer; //tsl_gtk_activate_event
begin begin
return do_two_param_event(a, "activate"); return do_two_param_event(a, "activate");
end 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; function tsl_gtk_idle(dlg:pointer):integer;
begin begin
return _gtkidledo_(dlg); return _gtkidledo_(dlg);
@ -9969,61 +9790,13 @@ begin
return _gtkeventcall_(a,c,b); return _gtkeventcall_(a,c,b);
//获得消息处理函数的指针 //获得消息处理函数的指针
end 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; function do_two_param_event( a:pointer;b:string):integer;
begin begin
return _gtkeventcall_(a,GetGtkEventNameOrId(b),0); return _gtkeventcall_(a,GetGtkEventNameOrId(b),0);
end end
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(); function is_wayland();
begin begin
st := static sysgetenv("XDG_SESSION_TYPE"); st := static sysgetenv("XDG_SESSION_TYPE");
@ -10041,10 +9814,6 @@ begin
"libc": "libc":
begin begin
return getdlsymaddress("libc.so.6",n); return getdlsymaddress("libc.so.6",n);
end
"gtk":
begin
end end
else return getdlsymaddress("libgtk-3.so.0",n); else return getdlsymaddress("libgtk-3.so.0",n);
end end

View File

@ -421,6 +421,7 @@ end
type TSLUICONST=class(tmacroconst,tconstant) type TSLUICONST=class(tmacroconst,tconstant)
static const WM_TRAY=0x464;static const opInsert="opInsert+"; static const WM_TRAY=0x464;static const opInsert="opInsert+";
static const opRemove="opRemove-";static const opRecycling="opRecycling-";static const opclosemainwnd="~closemianwnd~"; 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 end
type ws2def_h=class() type ws2def_h=class()
static const AF_UNSPEC=0x0;static const AF_UNIX=0x1; static const AF_UNSPEC=0x0;static const AF_UNIX=0x1;

View File

@ -1183,7 +1183,9 @@ type teditable=class(TSLUIBASE) //
dc.pen.width := 1; dc.pen.width := 1;
if FSetFocused then dc.pen.color := 9869000;//rgb(200,150,150); if FSetFocused then dc.pen.color := 9869000;//rgb(200,150,150);
else dc.pen.color := 11842740;//rgb(180,180,180); 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))); dc.draw("RoundRect",array(rbc[0:1],rbc[2:3],array(3,3)));
end end
end end
@ -4248,6 +4250,12 @@ type TcustomComboBox=class(TCustomComboBoxbase)
visible := false; visible := false;
end end
end end
protected
function SetEnabled(v);override;
begin
inherited;
if FEdit then FEdit.Enabled := v;
end
public public
function create(AOwner);override; function create(AOwner);override;
begin begin