界面库

更新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());
end else
begin
cl := Color;
if Enabled then
cl := Color;
else cl := cl_disabled_brush;
if ifnumber(cl)then
begin
Canvas.Brush.Color := cl;

View File

@ -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);

View File

@ -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))<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
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

View File

@ -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;

View File

@ -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