eumandy/eugtk/GtkEngine.e
2016-11-25 00:27:22 -07:00

9649 lines
278 KiB
Plaintext

-------------
namespace gtk
-------------
------------------------------------------------------------------------
-- This library is free software; you can redistribute it
-- and/or modify it under the terms of the GNU Lesser General
-- Public License as published by the Free Software Foundation;
-- either version 2 of the License, or (at your option) any later
-- version.
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Lesser General Public License for more details.
-- You should have received a copy of the GNU Lesser General Public
-- License along with this library; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Pl, Suite 330, Boston, MA 02111-1307 USA
------------------------------------------------------------------------
export constant
version = "4.12.0",
release = "Sept 1, 2016",
copyright = " © 2016 by Irv Mullins"
public object ACCEL_FONT = "italic 10" -- affects accels in menus;
public integer BTN_ICON_SIZE = 20 -- pixels;
public integer BTN_TEXT_SIZE = 12
public integer BTN_SHOW_IMG = 1
public include GtkEnums.e
-- GtkEnums includes most of Eu std libraries as public,
-- making them available to your eu programs without
-- having to specifically include them.
if not equal(gtk:version,enums:version) then -- these 2 must be in sync!
crash("Version mismatch: GtkEnums should be version %s",{version})
end if
-- std/math, std/locale, std/datetime, etc. aren't made
-- public, because that would cause too many conflicts,
-- requiring you to use namespaces everywhere,
-- but we do need them here;
include std/datetime.e
include std/locale.e
include std/math.e
include std/net/dns.e
include std/utils.e
include std/net/http.e
include std/pipeio.e as pipe
public constant -- 'shorthand' identifiers to save space in method prototypes;
P = C_POINTER, -- any valid pointer
B = C_BYTE, -- 8 bits (boolean)
I = C_INT, -- 32 (integer)
S = E_ATOM, -- 64 (string)
D = C_DOUBLE, -- 64 (double)
F = C_FLOAT, -- 32 (float)
A = E_INTEGER, -- 32/64 (glist ptr)
X = E_OBJECT, -- 32/64 (array of pointers)
V = E_SEQUENCE -- 32/64 (pointer to array of strings)
-- hopefully, the above are compatible with both 32 and 64-bit architectures
export object LIBS -- a single lib in UNIX, a sequence of dll's for Windows;
ifdef OSX then -- thanks to Pete Eberlein for testing with OSX!
LIBS = {open_dll("/opt/local/lib/libgtk-3.dylib" )}
elsifdef UNIX then -- Linux, BSD, etc.
LIBS = {open_dll("libgtk-3.so.0" )}
elsifdef WINDOWS then
object path = "C:/Program Files/GTK3-Runtime Win64/bin/" -- 3.18.6 is the vers. tested.
LIBS = dir(path & "*.dll") -- get a list of all .dll's in that folder;
LIBS = vslice(LIBS,1) -- retain only the filenames;
if atom(LIBS) then -- none found;
crash("\nFATAL ERROR:\n************ Cannot find GTK runtime libraries (.dlls)\n")
end if
atom x
for i = 1 to length(LIBS) do -- load each;
x = open_dll(LIBS[i])
if x = 0 then
display("Error loading []",{LIBS[i]})
else
LIBS[i] = x -- append this lib to list of libs;
end if
end for
end ifdef -- PLATFORMS;
if not object(LIBS) then -- no point in continuing;
crash("Required libraries not found!")
end if
constant cmd = pad_tail(command_line(),4,"")
if not gtk_func("gtk_init_check",{P,P},{0,0}) then -- initialize the GTK library;
crash("GTK Library error - cannot init GTK!")
else -- success!
gtk_proc("g_set_prgname",{S}," " & filename(cmd[2])) -- set default pgm name;
gtk_proc("g_type_init",{}) -- initialize normal GTK types;
end if
public constant -- two special types must be initialized at run-time;
gPIX = gtk_func("gdk_pixbuf_get_type"),
gCOMBO = gtk_func("gtk_combo_box_get_type")
-------------------------------------------------------------
-- Obtain a lot of sometimes useful system info;
-------------------------------------------------------------
include euphoria/info.e
constant os_info = os:uname()
export object
major_version = gtk_func("gtk_get_major_version"),
minor_version = gtk_func("gtk_get_minor_version"),
micro_version = gtk_func("gtk_get_micro_version"),
user_name = gtk_str_func("g_get_user_name"),
real_name = gtk_str_func("g_get_real_name"),
curr_dir = current_dir(),
home_dir = gtk_str_func("g_get_home_dir"),
temp_dir = gtk_str_func("g_get_tmp_dir"),
data_dir = gtk_str_func("g_get_user_data_dir"),
conf_dir = gtk_str_func("g_get_user_config_dir"),
runt_dir = gtk_str_func("g_get_user_runtime_dir"),
app_name = gtk_str_func("g_get_application_name"),
prg_name = gtk_str_func("g_get_prgname"),
lang_ = gtk_func("gtk_get_default_language"),
def_lang = gtk_str_func("pango_language_to_string",{P},{lang_}),
login = pathname(cmd[2]),
os_pid = os:get_pid(), -- process id: e.g:1234
os_name = os_info[1], -- e.g: Linux
os_distro = os_info[2], -- e.g: Mint17
os_version = os_info[3], -- e.g: 3.13.0-24-generic
os_compiled = os_info[4],
os_arch = os_info[5], -- e.g: AMD64
os_inc = getenv("EUINC"),
os_dir = getenv("EUDIR"),
os_path = getenv("PATH"),
os_shell = getenv("SHELL"),
os_term = getenv("TERM"),
eu_platform = platform_name(),
host_name = gtk_str_func("g_get_host_name"),
host_addr = "127.0.0.1"
ifdef BITS64 then
constant eu_arch_bits = "64"
elsedef
constant eu_arch_bits = "32"
end ifdef
if atom(os_term) then os_term = "none" end if
ifdef WINDOWS then
user_name = getenv("USERNAME")
real_name = getenv("USERNAME")
home_dir = getenv("HOMEPATH")
temp_dir = getenv("TEMP")
os_name = getenv("OS")
os_term = getenv("SESSIONNAME")
os_compiled = getenv("PROCESSOR_IDENTIFIER")
end ifdef
-- following added because Windows misbehaves in the ifdef above :(
if atom(os_term) then os_term = getenv("SESSIONNAME") end if
if atom(os_shell) then os_shell = getenv("ComSpec") end if
if atom(os_arch) then os_arch = getenv("PROCESSOR_ARCHITECTURE") end if
export object info = { -- above system info in key/value form, sometimes this is useful;
"version=" & version,
"release=" & release,
"copyright=" & copyright,
"major=" & to_string(major_version),
"minor=" & to_string(minor_version),
"micro=" & to_string(micro_version),
"user_name=" & user_name,
"real_name=" & real_name,
"host_name=" & host_name,
"host_addr=" & host_addr,
"home_dir=" & home_dir,
"temp_dir=" & temp_dir,
"curr_dir=" & curr_dir,
"data_dir=" & data_dir,
"conf_dir=" & conf_dir,
"runt_dir=" & runt_dir,
"app_name=" & app_name,
"prg_name=" & prg_name,
"os_pid=" & to_string(os:get_pid()),
"os_name=" & os_info[1],
"os_distro=" & os_info[2],
"os_vers=" & os_info[3],
"os_comp=" & os_compiled,
"os_arch=" & os_arch,
"os_term=" & os_term,
"os_shell=" & os_shell,
"os_inc=" & os_inc,
"os_dir=" & os_dir,
"os_path=" & os_path,
"def_lang=" & def_lang,
"eu_version=" & version_string_short(),
"eu_revision=" & to_string(version_revision()),
"eu_platform=" & eu_platform,
"eu_arch_bits=" & eu_arch_bits,
"eu_date=" & version_date(),
"today=" & datetime:format(datetime:now(),"%A %B %d, %Y"),
"start_time=" & datetime:format(datetime:now(),"%H:%M:%S"),
"CMD1=" & cmd[1],
"CMD2=" & canonical_path(cmd[2]),
"CMD3=" & pathname(canonical_path(cmd[2])),
$}
---------------------------
export function networked()
---------------------------
atom m = gtk_func("g_network_monitor_get_default")
return gtk_func("g_network_monitor_get_network_available",{P},{m})
end function
-----------------------------------
export function inet_connected() -- ping msftncsi
-----------------------------------
atom err = allocate(8) err = 0
atom x = gtk_func("g_network_address_parse_uri",{P,I,P},
{allocate_string("www.msftncsi.com"),80,err})
if x > 0 then return gtk_str_func("g_socket_connectable_to_string",{P},{x})
else return x
end if
end function
--------------------------------
export function get_net_address()
--------------------------------
object results
object addr
ifdef UNIX then
sequence tmp = temp_file(,"MYIP-")
system_exec(sprintf(`ifconfig | grep "inet addr:" > %s`,{tmp}),2)
results = trim(read_file(tmp))
results = split(results," ")
delete_file(tmp)
for i = 1 to length(results) do
if match("inet addr:",results[i]) = 1 then
addr = split(results[i],':')
host_addr = addr[2]
info[11] = "host_addr=" & host_addr
return host_addr
end if
end for
end ifdef
return "127.0.0.1"
end function
---------------------------------------------------------
public procedure requires(sequence a, object msg="Error")
---------------------------------------------------------
-- an easy way to ensure that your program is using the
-- appropriate GTK version;
object s = split(a,'.')
if length(s) < 3 then s = append(s,"0") end if
s[1] = to_number(s[1])
s[2] = to_number(s[2])
s[3] = to_number(s[3])
object msg2 = gtk_str_func("gtk_check_version",{I,I,I},{s[1],s[2],s[3]})
if string(msg2) then
Warn(,msg,msg2,
text:format("Requires Gtk version []\nInstalled is Gtk [].[].[]",
{a,major_version,minor_version,micro_version}))
abort(1)
end if
end procedure
enum NAME,PARAMS,RETVAL,VECTOR,CLASS
---------------------------------------------------------
public function create(integer class,
object p1=0, object p2=0, object p3=0, object p4=0,
object p5=0, object p6=0, object p7=0, object p8=0)
---------------------------------------------------------
-- This function does the following:
-- 1. initializes the class if not already initialized,
-- 2. creates a new instance of the class (returning a handle to that instance)
-- 3. optionally sets one or more properties and/or connects the default signal.
---------------------------------------------------------------------------------------
if class = GtkStockList then -- GtkStock is not a real widget, but we fake it
return newStockList()-- also, stock items are deprecated as of 3.10+
end if -- so don't get in the habit of using them too much :)
if class = GtkColumn then return newColumn(p1) end if
if not initialized[class] then -- create a routine_id for each 'method' in class
init(class) -- but only do it if this is the first call to that class
end if
object method = lookup("new",vslice(widget[class],1),widget[class],0)
if method[VECTOR] = -1 then -- a 'new' method name was not found;
Error(,,widget[class][$],"not implemented in this GTK version!")
abort(class)
end if
object props = 0, dataitem = 0
if sequence(p1) and sequence(p1[1]) then -- a list of properties was provided.
props = p1 -- save until widget is created,
p1 = 0 -- then set them in one 'swell foop'
elsif string(p1) and match("=",p1) then -- properties were provided in string form,
props = keyvalues(p1,,,,"\t\n\r")-- break them up into key/value pairs,
p1 = 0 -- save for later;
dataitem = vlookup("data",props,1,2)
end if
atom handle = 0
object params = method[PARAMS]
object args = {p1,p2,p3,p4,p5,p6,p7,p8}
args = args[1..length(params)] -- discard un-needed args;
ifdef PARAMS then display(params) end ifdef -- debug;
for i = 1 to length(params) do -- ensure values match formal params;
switch params[i] do
case S then -- convert string to pointer to cstring;
if string(args[i]) then
args[i] = allocate_string(args[i])
end if
case B then -- convert "1", "TRUE", or "YES" to 1,
if string(args[i]) then
if args[i] = "1"
or upper(args[i]) = "TRUE"
or upper(args[i]) = "YES" then
args[i] = 1
else
args[i] = 0 -- anything else is 0;
end if
end if
end switch
end for
ifdef CREATE then -- debug;
display(decode_method("CREATE",class,method))
puts(1,"\tArgs: ") display(args,{2,5,10,78,"%d","%.2g",32,127,1,0})
ifdef METHOD then display(method) end ifdef
end ifdef
if method[RETVAL] > 0 then -- it's a GTK function (routine_id is positive);
handle = c_func(method[VECTOR],args)
end if
if method[RETVAL] < -1 then -- it's a Eu func (a negated routine_id)
handle = call_func(-method[VECTOR],args) -- convert to positive rid and call;
end if
if handle = 0 then -- failure :(
ifdef CREATE then
display("Create failed for class []",{widget[class][$]})
end ifdef
return handle
end if
object sig = 0, arg1 = 0 ,arg2 = 0
switch class do -- connect a default signal for some common controls;
case GtkButton then sig ="clicked" arg1 = p2 arg2 = p3
case GtkToolButton then sig ="clicked" arg1 = p3 arg2 = p4
case GtkRadioButton then sig ="toggled" arg1 = p3 arg2 = p4
case GtkRadioToolButton then sig = "toggled" arg1 = p3 arg2 = p4
case GtkRadioMenuItem then sig ="toggled" arg1 = p3 arg2 = p4
case GtkMenuItem then sig ="activate" arg1 = p2 arg2 = p3
case GtkCheckMenuItem then sig = "toggled" arg1 = p2 arg2 = p3
case GtkCellRendererToggle then sig = "toggled" arg1 = p1 arg2 = p2
case GtkFontButton then sig = "font-set" arg1 = p2 arg2 = p3
case GtkStatusIcon then sig = "activate" arg1 = p1 arg2 = p2
case GtkSwitch then sig = "notify::active" arg1 = p1 arg2 = p2
case GtkColorButton then sig = "color-set" arg1 = p2 arg2 = p3
case GtkCalendar then sig = "day-selected-double-click" arg1 = p2 arg2 = p3
case GtkComboBoxText, GtkComboBoxEntry then sig ="changed" arg1 = p1 arg2 = p2
case GtkCheckButton then sig ="toggled" arg1 = p2 arg2 = p3
case GtkToggleButton then sig ="toggled" arg1 = p2 arg2 = p3
case GtkToggleToolButton then sig ="toggled" arg1 = p2 arg2 = p3
end switch
if atom(arg2) and arg2 = 0 then arg2 = dataitem end if
connect(handle,sig,arg1,arg2) -- connect per above switch;
ifdef CREATE then -- debug;
display("\t[] => []\n",{widget[class][$],handle})
end ifdef
register(handle,class)
if class = GtkWindow then -- if not otherwise specified, use OpenEu logo;
atom err= allocate(8,1)
gtk_func("gtk_window_set_default_icon_from_file",{P,P},
{allocate_string(locate_file("./thumbnails/mongoose.png"),1),err})
end if
----------------------------------------------------------------------
-- set properties using the new key/val style;
----------------------------------------------------------------------
object p = 0, signal, name, v1, v2, v3, v4
if not atom(props) then
if handle > 0 then
for i = 1 to length(props) do
while length(props[i]) < 5 do
props[i] &= 0
end while
for n = 1 to 5 do
props[i][n] = numeric_test(props[i][n])
end for
end for
for i = 1 to length(props) do
name = props[i][1]
v1 = props[i][2]
v2 = props[i][3]
v3 = props[i][4]
v4 = props[i][5]
ifdef SET then
display("\nset []->[]",{widget[class][$],props[i]})
end ifdef
if match("sig.",name) = 1 then
signal = name[5..$]
connect(handle,signal,v1,dataitem)
elsif match("$",name) = 1 then
signal = name[2..$]
connect(handle,signal,v1,dataitem)
elsif match("data.",name) = 1 then
set(handle,"data",name[6..$],v1)
else
set(handle,name,v1,v2,v3,v4)
end if
end for
end if
end if
return handle -- a pointer to the newly created instance
end function
------------------------------------------------------------------------
public function set(object handle, sequence property,
object p1=0, object p2=0, object p3=0, object p4=0,
object p5=0, object p6=0, object p7=0, object p8=0)
------------------------------------------------------------------------
-- This routine sets a property or sequence of properties
-- for the given widget.
-- In order to work with Glade, widget names in string form
-- may be used, otherwise set() expects a handle.
-- Property is always a string, p1...p8 are optional parameters.
-- Any parameter expected but not supplied is set to null, excess
-- parameters are discarded.
------------------------------------------------------------------------
integer class=-1
object name = "unknown"
object result = 0
object allocated = {}
name = handle
ifdef SETX then display({name,property,p1,p2,p3,p4}) end ifdef
if string(handle) then handle = pointer(handle) end if
if handle = 0 then
printf(1,"Critical error\n" &
"Objects must have a unique name!\n%s [%d]",{name,handle})
return 0
end if
object prop = 0
if string(property) and match("=",property) > 0 then -- convert string props
property = keyvalues(property,,,,"\t\t\n") -- to key/val form;
end if
if sequence(property) -- new create format (key=value pairs);
and not string(property) then
for i = 1 to length(property) do
while length(property[i]) < 5 do
property[i] &= 0
end while
for n = 1 to 5 do
property[i][n] = numeric_test(property[i][n])
end for
end for
for i = 1 to length(property) do
prop = property[i] if prop[1][1]='$' then continue end if
while length(prop) < 8 do prop &= 0 end while
set(handle,prop[1],prop[2],prop[3],prop[4],prop[5],prop[6],prop[7],prop[8])
end for
return 0
end if
class = vlookup(handle,registry,1,2,-1) -- get widget's class;
if class = -1 then -- fail;
display("Set invalid handle [] []",{handle,prop})
end if
property = "set_" & lower(join(split(property,' '),'_')) -- conform;
object method = lookup_method(class,property)
ifdef METHOD then display(method) end ifdef
if atom(method) then
if not set_property(handle,property[5..$],numeric_test(p1)) then
Error(,,"Cannot set property",class_name(handle) & property)
end if
return 0
end if
if method[VECTOR] = -1 then
Warn(,,"Method not found",
sprintf("%s->%s",{class_name(handle),property}))
return 0
end if
-- method was found;
object params = method[PARAMS]
switch method[1] do -- make life easier for a common operation;
case "set_from_file" then p1 = canonical_path(p1)
end switch
object args = {handle,p1,p2,p3,p4,p5,p6,p7,p8}
ifdef PARAMS then
puts(1,"Params: ") display(params)
puts(1,"Args: ") display(args)
end ifdef
args = args[1..length(params)] -- match args to formal parameters;
for i = 2 to length(args) do
switch params[i] do
case A then -- array of strings;
if not atom(args[i]) then
args[i] = allocate_string_pointer_array(args[i])
allocated &= args[i]
end if
case S then -- string;
if atom(args[i]) then
args[i] = sprintf("%g",args[i])
end if
if string(args[i]) then
args[i] = allocate_string(args[i])
allocated &= args[i]
end if
case B then
if string(args[i]) then
if equal("TRUE",upper(args[i]))
or equal("YES",upper(args[i]))
or equal("1",args[i]) then
args[i] = 1
end if
if equal("FALSE",upper(args[i]))
or equal("NO",upper(args[i]))
or equal("0",args[i]) then
args[i] = 0
end if
end if
case I,D then
if string(args[i]) then
args[i] = to_number(args[i])
end if
-- apply patches for zero-based indexes;
switch method[1] do
case "add_attribute",
"set_active",
"set_text_column",
"set_pixbuf_column",
"set_tooltip_column",
"set_search_column",
"attribute_connect",
"reorder_child",
"page",
"remove_page",
"set_current_page",
"set_sort_column_id" then args[i]-=1
end switch
end switch
end for
ifdef SET then -- debug;
display(decode_method("SET",class,method))
puts(1,"\tArgs: ")
display(decode_args(method,args),
{2,2,11,78,"%d","%2.22f",32,127,1,0})
puts(1,"\n")
end ifdef
if equal("set_name",property) then
p8 = find(handle,vslice(registry,1))
registry[p8][4] = p1
end if
if method[RETVAL] = 0 then -- it's a GTK proc;
c_proc(method[VECTOR],args)
end if
if method[RETVAL] > 0 then -- it's a GTK func;
result = c_func(method[VECTOR],args)
end if
if method[RETVAL] <-1 then -- it's a Eu func;
result = call_func(-method[VECTOR],args)
end if
if method[VECTOR] = -1 then -- GTK doesn't know about this method!
printf(1,
"Warning: %s->%s call is invalid," &
"******** perhaps you need a later GTK version",
{widget[class][$],property})
end if
if not equal("set_data",property) then
for i = 1 to length(allocated) do
free(allocated[i])
end for
end if
return result
end function
-----------------------------------------------------------------------------------
export function get(object handle, sequence property,
object p1=MINF, object p2=MINF, object p3=MINF, object p4=MINF, object p5=MINF)
-----------------------------------------------------------------------------------
-- This routine gets one or more values for a given property name.
-- Property name is always a string, handle is usually an atom,
-- but may sometimes be a string in order to work with Glade.
-----------------------------------------------------------------------------------
integer class
object name = "unknown"
if string(handle) then
name = handle
handle = pointer(handle)
end if
class = vlookup(handle,registry,1,2,-1) -- get widget's class;
if class = -1 then
return 0
end if
property = "get_" & lower(join(split(property,' '),'_'))
object method = lookup_method(class,property)
if atom(method) then -- not found, try fallback to Object;
return get_property(handle,property[5..$])
end if
-- else, method found;
object params = method[PARAMS]
if method[VECTOR] = -1 then
crash("\nERROR:\n****** Invalid call: %s->%s",{widget[class][$],method[1]})
end if
object result = {}
if string(p1) then p1 = allocate_string(p1,1) end if
if string(p2) then p2 = allocate_string(p2,1) end if
if string(p3) then p3 = allocate_string(p3,1) end if
if string(p4) then p4 = allocate_string(p4,1) end if
object args = {handle,allocate(8,1),allocate(8,1),allocate(8,1),allocate(8,1)}
if p1 > MINF then args[2]=p1 end if
if p2 > MINF then args[3]=p2 end if
if p3 > MINF then args[4]=p3 end if
if p4 > MINF then args[5]=p4 end if
args = args[1..length(params)]
ifdef GET then -- debug
display(decode_method("GET",class,method),0)
puts(1,"\tArgs: ")
display(decode_args(method,args),
{2,2,11,78,"%d","%2.22f",32,127,4,-1})
end ifdef
-----------------------------------------------------------------------------------
if method[RETVAL] = 0 then -- it's a GTK proc, may have multiple return values;
c_proc(method[VECTOR],args)
result = repeat(0,length(args))
for i = 1 to length(args) do
switch params[i] do -- convert arg pointer to value;
case D then result[i] = float64_to_atom(peek({args[i],8}))
case F then result[i] = float32_to_atom(peek({args[i],4}))
case I then result[i] = peek4s(args[i])
case B then result[i] = peek(args[i])
case A then result[i] = unpack_gs_str_list(args[i])
case X then result[i] = unpack_gs_atom_list(args[i])
case V then result[i] = deallocate_string_pointer_array(args[i])
case S then if args[i] > 0 then result[i] = peek_string(args[i]) end if
case else result[i] = args[i]
end switch
end for
result = result[2..$] -- don't return handle, just results;
goto "fini"
end if
--------------------------------------------------
if method[RETVAL] > 0 then -- it's a GTK func;
result = c_func(method[VECTOR],args)
switch method[RETVAL] do -- convert function result to value;
case A then result = unpack_gs_str_list(result)
case X then result = unpack_gs_atom_list(result)
case V then result = deallocate_string_pointer_array(result)
case S then if result > 0 then result = peek_string(result) else result = 0 end if
case I then
switch method[1] do -- patch for zero-based indexing;
case
"get_active",
"get_text_column",
"get_pixbuf_column",
"get_column",
"get_tooltip_column",
"get_search_column",
"get_current_page",
"get_index",
"get_item_index",
"page_num",
"get_sort_column_id" then result += 1
end switch
end switch
goto "fini"
end if
----------------------------------------------------------------------
if method[RETVAL] <-1 then -- it's a Eu func (negated routine_id);
result = call_func(-method[VECTOR],args)
end if
label "fini"
if method[CLASS] != GSList then -- for widgets created 'internally' by GTK
if method[CLASS] != 0 then -- as a result of creating a parent widget;
if not initialized[method[CLASS]] then init(method[CLASS]) end if
if atom(result) then register(result,method[CLASS])
else for z = 1 to length(result) do
register(result[z],method[CLASS]) -- must be registered;
end for
end if
end if
end if
ifdef GET then display("\tReturns: []\n",{result}) end ifdef
return result
end function
---------------------------------------------------
public function add(object parent, object child) -- add widgets to container;
---------------------------------------------------
ifdef ADD then
display("Add [] []",{parent,child})
end ifdef
if atom(child) and child = 0 then
display("Null pointer passed to add()\n")
return 0
end if
if class_id(child) = GdkPixbuf then -- issue a warning;
return Warn(,,"Cannot add a pixbuf to a container",
"Create an image from it first,\nthen add the image.",,child)
end if
if class_id(parent) = GtkBuilder then
load_builder(parent,child)
return 1
end if
if string(parent) then -- convert to handle;
parent = pointer(parent)
end if
if string(child) then -- convert to handle;
child = pointer(child)
end if
-- Switch below implements an easier-to-remember 'add' syntax
-- as an alias for the various 'set' calls shown.
-- The GTK original is still available, if you wish to use it.
switch class_id(parent) do
case GtkComboBoxText, GtkComboBoxEntry then
for i = 1 to length(child) do
set(parent,"append text",child[i])
end for
case GtkToolbar then
if atom(child) then
set(parent,"insert",child,-1)
else for i = 1 to length(child) do
add(parent,child[i])
end for
end if
return child
case GtkFileChooserDialog then
if atom(child) then
if class_id(child) = GtkFileFilter then
set(parent,"add filter",child)
end if
else for i = 1 to length(child) do
add(parent,child[i])
end for
end if
case GtkSizeGroup then
set(parent,"add widgets",child)
return child
case GtkTextTagTable then
set(parent,"add",child)
return child
case GtkTreeView then
set(parent,"append columns",child)
return child
case else
if atom(child) then
gtk_proc("gtk_container_add",{P,P},{parent,child})
else
for i = 1 to length(child) do
gtk_proc("gtk_container_add",{P,P},{parent,child[i]})
end for
end if
return child
end switch
return -1
end function
------------------------------------------------------------------------
public function pack(object parent, object child,
integer expand=0, integer fill=0, integer padding=0)
------------------------------------------------------------------------
-- pack a child widget or {list} of child widgets into parent container;
-- prepending a negative sign to the child pointer means
--'pack end'. this is an alias which is sometimes useful.
------------------------------------------------------------------------
if string(parent) then parent = pointer(parent) end if
if string(child) then child = pointer(child) end if
if atom(child) then
if child > 0 then
pack_start(parent,child,expand,fill,padding)
else
child = -child
pack_end(parent,child,expand,fill,padding)
end if
else
for i = 1 to length(child) do
pack(parent,child[i],expand,fill,padding)
end for
end if
return abs(child)
end function
function valid(object x)
object msg = "Invalid object []"
atom p
if string(x) then
p = pointer(x)
if p = 0 then
display(msg,{x})
return 0
else return p
end if
end if
if x = 0 then
display(msg)
end if
return x
end function
-- following 2 functions provided for compatibility with GTK calls;
public function pack_start(object parent, object child,
boolean expand=0, boolean fill=0, integer padding=0)
parent = valid(parent)
child = valid(child)
set(parent,"pack start",child,expand,fill,padding)
return child
end function
public function pack_end(object parent, object child,
boolean expand=0, boolean fill=0, integer padding=0)
parent = valid(parent)
child = valid(child)
set(parent,"pack end",child,expand,fill,padding)
return child
end function
----------------------------------
public procedure show(object x) -- show widget x or a {list} of widgets;
----------------------------------
if string(x) then x = pointer(x) end if
if atom(x) then
set(x,"show")
else
for i = 1 to length(x) do
show(x[i])
end for
end if
end procedure
-------------------------------------
public function show_all(object x) -- show container x and all children;
-------------------------------------
if string(x) then x = pointer(x) end if
if atom(x) then
set(x,"show all")
else
for i = 1 to length(x) do
set(x[i],"show all")
end for
end if
return 1
end function
---------------------------------
public function hide(object x) -- hide a widget or a {list} of widgets;
---------------------------------
if string(x) then x = pointer(x) end if
if atom(x) then
set(x,"hide")
else
for i = 1 to length(x) do
hide(x[i])
end for
end if
return 1
end function
--------------------------------------
public procedure hide_all(object x) -- hide container x and any children it contains;
--------------------------------------
set(x,"hide all")
end procedure
--------------------------------------
export function destroy(object ctl) -- destroy a widget or {list} of widgets;
--------------------------------------
if sequence(ctl) then
for i = 1 to length(ctl) do
destroy(ctl[i])
end for
else
if ctl > 0 then
set(ctl,"destroy")
deregister(ctl)
end if
end if
return 1
end function
--------------------------
export procedure main() -- start the GTK engine;
--------------------------
gtk_proc("gtk_main")
end procedure
without warning {not_reached}
--------------------------------------------------------------------------
export function Quit(atom ctl=0, object errcode=0) -- kill the GTK engine;
--------------------------------------------------------------------------
abort(errcode)
return 1
end function
export constant main_quit = call_back(routine_id("Quit"))
with warning {not_reached}
----------------------------------
function numeric_test(object x) -- convert numbers passed in key=value format;
----------------------------------
atom z
if atom(x) then
return x
end if
if string(x) then
if equal("TRUE",x) then return 1 end if
if equal("FALSE",x) then return 0 end if
if equal("YES",x) then return 1 end if
if equal("NO",x) then return 0 end if
if equal("VERTICAL",x) then return 1 end if
if equal("CENTER",x) then return 1 end if
if equal("HORIZONTAL",x) then return 0 end if
z = to_number(x)
if z != 0 then
ifdef NUM then display("string [] converted to number []",{x,z}) end ifdef
return z
else
ifdef NUM then display("returning string '[]'",{x}) end ifdef
return x
end if
end if
ifdef NUM then display("error []",x) end ifdef
return x
end function
------------------------------------------------------------------------
-- Following functions register and initialize class methods
------------------------------------------------------------------------
-- A class is initialized the first time a widget of that class is created.
-- This means the widget's method vectors are filled in with Eu routine_ids,
-- either direct or generated by define_c_func or define_c_proc as appropriate.
-- When a subsequent call is made to a widget method, that vector is
-- used by calling c_func, c_proc, or call_func.
-- If the call is to a method not implemented by the widget, but is
-- instead a method inherited from one of the widget's ancestors,
-- then that ancestor is also initialized if necessary.
-- This scheme means that program startup isn't delayed as it would be
-- if all 300+ widgets and nearly 4000 methods were to be initialized
-- first, most of which would likely never be used in any given program.
------------------------------------------------------------------------
global procedure init(integer class)
------------------------------------------------------------------------
object name, params, retval
ifdef INITX then
display("\nInit class:[] []",{class,widget[class][$]})
display(widget[class])
end ifdef
if initialized[class] then return end if
for method = 3 to length(widget[class])-1 do
name = sprintf("+%s_%s",{widget[class][NAME],widget[class][method][NAME]})
widget[class][method] = pad_tail(widget[class][method],5,0)
params = widget[class][method][PARAMS]
retval = widget[class][method][RETVAL]
if class = GtkSpinButton then
switch widget[class][method][NAME] do
case "get_increments","get_range" then params[2] = P params[3] = P
case else -- do nothing;
end switch
end if
if widget[class][method][RETVAL] = 0 then -- it's a GTK proc
widget[class][method][VECTOR] = define_proc(name,params)
goto "init"
end if
if widget[class][method][RETVAL] > 0 then -- it's a GTK func
widget[class][method][VECTOR] = define_func(name,params,retval)
goto "init"
end if
if widget[class][method][RETVAL] < -1 then -- it's a Eu func
widget[class][method][VECTOR] = widget[class][method][RETVAL]
end if
label "init"
initialized[class] = TRUE
ifdef INIT then
display("INIT: [].[] RID:[]",
{widget[class][$],widget[class][method][NAME],widget[class][method][VECTOR]})
end ifdef
ifdef INIT_ERR then
if widget[class][method][VECTOR] = -1 then -- function is invalid!
display("\tINIT ERROR: [].[] ERR:[]",
{widget[class][$],widget[class][method][NAME],widget[class][method][VECTOR]})
end if
end ifdef
end for
end procedure
------------------------------------------------------------------------
-- The registry associates a control's handle with its class,
-- so that future calls to set or get that control's properties
-- can go directly to the correct set of functions stored in the
-- large widget{} structure.
------------------------------------------------------------------------
export object registry = {}
----------------------------------------------------------------------------------------
global function register(atom handle, integer class, object name="-nil-", object v=math:MINF)
----------------------------------------------------------------------------------------
integer x = find(handle,vslice(registry,1))
if x > 0 then -- handle already exists in the registry,
ifdef REG_DUP then -- debug
display("Note: [] handle [] already registered to [] []",
{widget[class][$],handle,registry[x][3],name})
end ifdef
-- update it in case handle has been recycled.
registry[x] = {handle,class,widget[class][$],name,v}
return 1
end if
-- else, add the widget to the registry;
registry = append(registry,{handle,class,widget[class][$],name,v})
-- initialize class if this is the first use of that class;
if not initialized[class] then init(class) end if
ifdef REG then -- debug
printf(1,text:format("Registry + [3:20]\thandle: [1:10>]\tname: [4]\tvalue: [5]\n",registry[$]))
end ifdef
return 1
end function
------------------------------------
procedure deregister(atom handle) -- when object no longer used;
------------------------------------
integer x = find(handle,vslice(registry,1))
if x > 0 then
ifdef REG then
printf(1,text:format("Registry - [3:16]\thandle: [1:12>]\t",registry[x]))
if string(registry[x][4]) then printf(1,"name: %s",{registry[x][4]}) end if
puts(1,"\n")
end ifdef
registry = remove(registry,x)
end if
end procedure
-----------------------------------------
public function class_id(object handle) -- returns an integer widget class;
-----------------------------------------
if string(handle) then handle = pointer(handle) end if
return vlookup(handle,registry,1,2,-1)
end function
-------------------------------------------
public function class_name(object handle) -- returns class_name for a given handle;
-------------------------------------------
if string(handle) then handle = pointer(handle) end if
return vlookup(handle,registry,1,3,"!")
end function
------------------------------------------
public function object_name(atom handle) -- returns name of object, or -nil-;
------------------------------------------
return vlookup(handle,registry,1,4,"!")
end function
---------------------------------------
public function pointer(object name) -- returns handle to object or null,
---------------------------------------
return vlookup(name,registry,4,1,0)
end function
------------------------------------------------------------------------
function lookup_method(integer class, sequence prop)
------------------------------------------------------------------------
-- Finds the method to set or get a property for a given class,
-- if not found, ancestors of that class are checked until the method
-- is located.
if class = -1 then return 0 end if
ifdef LOOK then display("Look []->[]",{widget[class][$],prop}) end ifdef
object method = lookup(prop,vslice(widget[class],NAME),widget[class],0)
ifdef LOOKUP then display(widget[class][$]) end ifdef
if atom(method) then -- try sans the set_ or get_ prefix;
method = lookup(prop[5..$],vslice(widget[class],NAME),widget[class],0)
end if
if sequence(method) then -- method was found in this class, we're done!
return method
end if
object ancestor -- if not found, need to look for method in ancestors;
for i = 1 to length(widget[class][PARAMS]) do
ancestor = widget[class][PARAMS][i]
if ancestor = 0 then return 0 end if
if not initialized[ancestor] then
init(ancestor)
end if
ifdef LOOKUP then -- debug;
display("trying ancestor: []",{widget[ancestor][$]})
end ifdef
method = lookup(prop,vslice(widget[ancestor],NAME),widget[ancestor],0)
if atom(method) then
method = lookup(prop[5..$],vslice(widget[ancestor],NAME),widget[ancestor],0)
end if
if sequence(method) then -- found it!
ifdef LOOKUP then display("\t []",{method[1]}) end ifdef
return method
end if
end for
return -1 -- method not found (not implemented)
end function
-----------------------------------------------------------------------------
public function connect(object ctl, object sig, object fn=0, object data=0,
atom closure=0, integer flags=0)
-----------------------------------------------------------------------------
-- tells control to call your Eu function, sending data along for the ride,
-- whenever that control gets the specified signal.
integer result = -1
atom rid = 0
if atom(fn) and fn = 0 then -- no point in registering null functions!
return 0
end if
if string(ctl) then
ctl = pointer(ctl) -- convert name to pointer;
end if
if sequence(ctl) then
for i = 1 to length(ctl) do
connect(ctl[i],sig,fn,data,closure,flags)
end for
return 1
end if
if string(fn) then -- if interpreted, we can call functions by name if in scope;
ifdef COMPILE then -- do compile test if requested;
display("Connecting [] [] Signal '[]' Function [] Data []",
{class_name(ctl),ctl,sig,fn,data})
if not equal("Quit",fn) then
printf(1,"\n\tCaution: function %s will not link when compiled!\n\t********\n",{fn})
end if
end ifdef
rid = routine_id(fn)
if rid > 0 then -- named function is in scope;
fn = call_back(rid) -- so obtain a callback;
else
printf(1,"\n\tError: function %s is not in scope\n\t****** (make it global or link via routine_id)\n",{fn})
Warn(,,sprintf("function %s </b> is not in scope<b>",{fn}),"make it global or link via routine_id")
end if
end if
sig = join(split(sig,' '),'-') -- normalize signal names;
sig = allocate_string(sig) -- convert to string pointer;
if integer(data) then -- can be attached directly;
result = gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags})
free(sig)
return result
end if
if atom(data) then
data = prepend({data},"ATOM") -- must be serialized and unpacked later;
data = allocate_wstring(serialize(data)+1)
result = gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags})
free(sig)
return result
end if
if string(data) then
data = prepend({data},"STR") -- must be serialized and unpacked later;
data = allocate_wstring(serialize(data)+1)
result = gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags})
free(sig)
return result
end if
if sequence(data) then
data = prepend(data,"SEQ")-- must be serialized and unpacked later;
data = allocate_wstring(serialize(data)+1)
result = gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags})
free(sig)
return result
end if
end function
-------------------------------------------------------
export procedure disconnect(atom ctl, integer sigid) -- disconnect a signal from ctl;
-------------------------------------------------------
gtk_proc("g_signal_handler_disconnect",{P,I},{ctl,sigid})
end procedure
--------------------------------------
export function unpack(object data) -- retrieves data passed in a control's data space;
--------------------------------------
if atom(data) and data = 0 then return 0 end if
object result = deserialize(peek_wstring(data)-1)
switch result[1][1] do
case "ATOM","STR","INT" then return result[1][2]
case "SEQ" then return result[1][2..$]
case else return result
end switch
end function
-------------------------------------------------------
export function deallocate_string_pointer_array(atom x)
-------------------------------------------------------
integer i = 0
object result = {}
while peek4u(x+i) > 0 do
result = append(result,peek_string(peek4u(x+i)))
i += 8
end while
return result
end function
------------------------------------------------------------------------
-- following 3 'decode_x' functions are for debugging purposes,
-- they make displays more readable;
------------------------------------------------------------------------
function decode_args(object method, object args)
------------------------------------------------------------------------
for i = 1 to length(method[PARAMS]) do
switch method[PARAMS][i] do
case S then
if atom(args[i]) and args[i] > 0 then
args[i] = peek_string(args[i])
if length(args[i]) > 40 then
args[i] = args[i][1..40] & "..."
end if
args[i] = args[i]
end if
case else -- do not convert
end switch
end for
return args
end function
constant ptype = {0,P,I,D,F,S,B,A}
constant pname = {{},"None","Ptr ","Int ","Dbl ","Flt ","Str ","Bool ","Array "}
------------------------------------------------------------------------
function decode_params(object params)
------------------------------------------------------------------------
return transmute(params,ptype,pname)
end function
------------------------------------------------------------------------
function decode_method(sequence title, integer class, object method)
------------------------------------------------------------------------
object z = {}
integer n
z = prepend(method,widget[class][$])
z = prepend(z,title)
z[4] = decode_params(method[PARAMS])
while length(z) < 5 do
z = append(z,0)
end while
if length(method) >= RETVAL then
n = find(method[RETVAL],ptype)
z[5] = pname[n+1]
end if
return text:format("[]\n\tCall: []->[]\n\tParams: []\n\tReturn type: []\n\tVector: []",z)
end function
---------------------------------------------------------
public function to_sequence(atom glist, integer fmt=0) -- mostly internal use;
---------------------------------------------------------
-- convert glist pointer back to a Euphoria sequence;
-- results are returned in a choice of formats;
integer len = gtk_func("g_list_length",{P},{glist})
object s = {}
atom data
for i = 0 to len-1 do
data = gtk_func("g_slist_nth_data",{P,I},{glist,i})
switch fmt do
case 0 then s = append(s,peek_string(data))
case 1 then s = append(s,data)
case 2 then s = append(s,gtk_str_func("gtk_tree_path_to_string",{P},{data}))
case 3 then s = append(s,to_number(gtk_str_func("gtk_tree_path_to_string",{P},{data})))
case else Warn(,,"Converting glist to_sequence",
"invalid format supplied,\nvalues are 0 to 3")
end switch
end for
return s
end function
-----------------------------------------------------------------------------------------
-- METHOD DECLARATIONS:
-----------------------------------------------------------------------------------------
sequence initialized = repeat(0,500)
-- This is a set of flags which are set to 1 when a given widget has
-- been initialized. This prevents having to initialize a widget's
-- methods repeatedly. Size is larger than GtkFinal to allow 'plugin'
-- widgets to be added at runtime.
export sequence widget = repeat(0,GtkFinal)
-- This structure holds prototypes for each GTK method call,
-- organized by widget. When each widget is initialized,
-- vectors are added pointing to the routine_ids needed
-- to call the GTK functions that implement each method.
-- The widgets below need not be in any specific order.
-- Widget names must also be added to the list in GtkEnums
sequence stock_list = create(GtkStockList) -- a fake object;
widget[GObject] = {"g_object",
{0},
{"new",{I,S,S,I},P},
{"set",{P,S,P,P}},
{"set_property",{P,S,P},-routine_id("set_property")},
{"get_property",{P,S},-routine_id("get_property")},
{"get_data",{P,P},S},
{"set_data",{P,S,S}},
{"set_data_full",{P,S,S,P}},
{"steal_data",{P,S},P},
{"signal",{P,P,P,P,P,P},-routine_id("connect")},
{"connect",{P,P,P,P,P,P},-routine_id("connect")},
"GObject"}
constant
fn1 = define_proc("g_object_get",{P,P,P,P}),
doubles = {"angle","climb-rate","fraction","max-value","min-value",
"scale","value","pulse-step","scale","size-points","text-xalign",
"text-yalign","xalign","yalign"}
constant prop = allocate_string("property")
function set_property(object handle, object a, object b)
--------------------------------------------------------------
object params = {P,P,P,P}
if find(a,doubles) then params = {P,P,D,P} end if
if string(a) then a = allocate_string(a,1) end if
if string(b) then b = allocate_string(b,1) end if
gtk_proc("g_object_set",params,{handle,a,b,0})
return 1
end function
function get_property(atom handle, object p)
--------------------------------------------------
atom x = allocate(8,1)
if string(p) then p = allocate_string(p,1) end if
c_proc(fn1,{handle,p,x,0})
object result = peek4u(x)
return result
end function
widget[GtkAdjustment] = {"gtk_adjustment",
{GObject},
{"new",{D,D,D,D,D,D},P},
{"set_value",{P,D}},
{"get_value",{P},D},
{"clamp_page",{P,D,D}},
{"value_changed",{P}},
{"configure",{P,D,D,D,D,D,D}},
{"get_lower",{P},D},
{"get_page_increment",{P},D},
{"get_step_increment",{P},D},
{"get_minimum_increment",{P},D},
{"set_upper",{P,D}},
{"get_upper",{P},D},
{"set_page_increment",{P,D}},
{"set_page_size",{P,D}},
{"set_step_increment",{P,D}},
{"set_upper",{P,D}},
"GtkAdjustment"}
widget[GtkWidgetPath] = {"gtk_widget_path",
{GObject},
{"new",{},P},
{"append_type",{P,I},I},
{"append_with_siblings",{P,P,I},I},
{"append_for_widget",{P,P},I},
{"copy",{P},P,0,GtkWidgetPath},
{"get_object_type",{P},I},
{"has_parent",{P,I},B},
{"is_type",{P,I},B},
{"iter_add_class",{P,I,S}},
{"iter_add_region",{P,I,S,I}},
{"iter_clear_classes",{P,I}},
{"iter_clear_regions",{P,I}},
{"iter_get_name",{P,I},S},
{"iter_get_object_type",{P,I},I},
{"iter_get_siblings",{P,I},P,0,GtkWidgetPath},
{"iter_get_sibling_index",{P,I},I},
{"iter_has_class",{P,I,S},B},
{"iter_has_name",{P,I,S},B},
{"iter_has_qclass",{P,I,P},B},
{"iter_has_qname",{P,I,P},B},
{"iter_has_qregion",{P,I,P,I},B},
{"iter_has_region",{P,I,S,I},B},
{"iter_list_classes",{P,I},A,0,GSList},
{"iter_list_regions",{P,I},A,0,GSList},
{"iter_remove_class",{P,I,S}},
{"iter_remove_region",{P,I,S}},
{"iter_set_name",{P,I,S}},
{"iter_set_object_type",{P,I,I}},
{"iter_set_object_name",{P,I,S}}, -- 3.20
{"iter_get_object_name",{P,I},S}, -- 3.20
{"iter_get_state",{P,I},I}, -- 3.14
{"iter_set_state",{P,I,I}}, -- 3.14
{"length",{P},I},
{"prepend_type",{P,I}},
{"to_string",{P},S},
{"get_object_name",{P,I},S}, -- 3.20
{"set_object_name",{P,I,S}}, -- 3.20
"GtkWidgetPath"}
widget[GtkStyle] = {"gtk_style",
{GObject},
"GtkStyle"}
widget[GAction] = {"g_action",
{GObject},
{"name_is_valid",{S},B},
{"get_name",{P},S},
{"get_parameter_type",{P},I},
{"get_state_type",{P},I},
{"get_state_hint",{P},I},
{"get_enabled",{P},B},
{"get_state",{P},I},
{"change_state",{P,I}},
{"activate",{P,I}},
{"parse_detailed_name",{P,S,P,P},B},
{"print_detailed_name",{P,I},S},
"GAction"}
widget[GSimpleAction] = {"g_simple_action",
{GObject},
{"new",{S,I},P},
{"new_stateful",{S,I,I}},
{"set_enabled",{P,B}},
{"set_state",{P,I}},
{"set_state_hint",{P,I}},
"GSimpleAction"}
widget[GPropertyAction] = {"g_property_action",
{GObject},
{"new",{S,P,S},P},
"GPropertyAction"}
widget[GActionGroup] = {"g_action_group",
{GSimpleAction,GObject},
"GActionGroup"}
widget[GSimpleActionGroup] = {"g_simple_action_group",
{GApplication,GActionGroup,GObject},
{"new",{}},
"GSimpleActionGroup"}
widget[GActionMap] = {"g_action_map",
{0},
{"lookup_action",{P,S},P},
{"add_action_entries",{P,P,I,P}},
{"add_action",{P,P}},
{"remove_action",{P,S}},
"GActionMap"}
widget[GtkWidgetClass] = {"gtk_widget_class",
{GtkWidget,GtkBuildable,GObject},
{"set_template",{P,P}}, -- 3.10
{"set_template_from_resource",{P,S}}, -- 3.10
{"get_template_child",{P,I,S},P,0,GObject},
{"bind_template_child_full",{P,S,B,I}},
{"bind_template_callback_full",{P,S,P}},
{"set_connect_func",{P,P,P,P}},
{"set_css_name",{P,S}}, -- 3.20
{"get_css_name",{P},S}, -- 3.20
"GtkWidgetClass"}
widget[GtkWidget] = {"gtk_widget",
{GtkBuildable,GObject},
-- Aliases to fix awkward overrides; ordinarily you will use one of these 4,
{"set_font",{P,S},-routine_id("widget_set_font")},
{"set_color",{P,P},-routine_id("widget_set_foreground")},
{"set_foreground",{P,P},-routine_id("widget_set_foreground")},
{"set_background",{P,P},-routine_id("widget_set_background")},
-- Only use following versions when you need to change the color
-- of a control in a state other than normal. Rarely used since themes
-- often disallow the use of stateful colors;
{"override_background_color",{P,I,P},-routine_id("widget_override_background_color")},
{"override_color",{P,I,P},-routine_id("widget_override_color")},
----
{"new",{I},P},
{"destroy",{P}},
{"in_destruction",{P},B},
{"destroyed",{P},B},
{"unparent",{P}},
{"show",{P}},
{"show_now",{P}},
{"hide",{P}},
{"show_all",{P}},
{"map",{P}},
{"unmap",{P}},
{"realize",{P}},
{"unrealize",{P}},
{"draw",{P}},
{"queue_draw",{P}},
{"queue_resize",{P}},
{"queue_resize_no_redraw",{P}},
{"get_frame_clock",{P},P,0,GdkFrameClock},
{"add_tick_callback",{P,P,P,P},I},
{"remove_tick_callback",{P,I}}, -- GTK 3.8+
{"set_size_request",{P,P,P},-routine_id("widget_set_size_request")},
{"size_allocate",{P,P}},
{"size_allocate_with_baseline",{P,P,I}},
{"add_accelerator",{P,S,P,I,I}},
{"remove_accelerator",{P,P,I,I},B},
{"set_accel_path",{P,S,P}},
{"can_activate_accel",{P,I},B},
{"event",{P,P},B},
{"activate",{P},B},
{"reparent",{P,P}}, -- deprecated 3.14
{"intersect",{P,P,P},B},
{"is_focus",{P},B},
{"grab_focus",{P},B},
{"grab_default",{P}},
{"set_name",{P,S},-routine_id("widget_set_name")},
{"get_name",{P},S},
{"set_sensitive",{P,B}},
{"get_sensitive",{P},B},
{"set_parent",{P,P}},
{"get_parent",{P},P},
{"set_parent_window",{P,P}},
{"get_parent_window",{P},P},
{"set_events",{P,I}},
{"get_events",{P},I},
{"add_events",{P,I}},
{"set_device_events",{P,P,I}},
{"get_device_events",{P,P},I},
{"add_device_events",{P,P,I}},
{"set_device_enabled",{P,P,B}},
{"get_device_enabled",{P,P},B},
{"get_toplevel",{P},P},
{"get_ancestor",{P,I},P},
{"is_ancestor",{P,P},B},
{"set_visual",{P,P}},
{"get_visual",{P},P,0,GdkVisual},
{"get_pointer",{P,I,I}}, -- deprecated 3.4
{"translate_coordinates",{P,P,I,I,I,I},B},
{"hide_on_delete",{P},B},
{"set_direction",{P,I}},
{"get_direction",{P},I},
{"set_default_direction",{I}},
{"get_default_direction",{},I},
{"shape_combine_region",{P,P}},
{"create_pango_context",{P},P},
{"get_pango_context",{P},P,0,PangoContext},
{"create_pango_layout",{P,S},P},
{"queue_draw_area",{P,I,I,I,I}},
{"queue_draw_region",{P,P}},
{"set_app_paintable",{P,B}},
{"set_double_buffered",{P,B}}, -- deprecated 3.14
{"set_redraw_on_allocate",{P,B}},
{"mnemonic_activate",{P,B},B},
{"send_expose",{P,P},I},
{"send_focus_change",{P,P},B},
{"get_accessible",{P},P},
{"child_focus",{P,I},B},
{"child_notify",{P,S}},
{"freeze_child_notify",{P}},
{"get_child_visible",{P},B},
{"get_parent",{P},P},
{"get_path",{P},P,0,GtkWidgetPath},
{"get_settings",{P},P,0,GtkSettings},
{"get_clipboard",{P,I},P,0,GtkClipboard},
{"get_display",{P},P,0,GdkDisplay},
{"get_root_window",{P},P,0,GdkWindow}, -- deprecated 3.12
{"get_screen",{P},P,0,GdkScreen},
{"has_screen",{P},B},
{"get_size_request",{P,I,I}},
{"set_child_visible",{P,B}},
{"thaw_child_notify",{P}},
{"set_no_show_all",{P,B}},
{"get_no_show_all",{P},B},
{"add_mnemonic_label",{P,P}},
{"remove_mnemonic_label",{P,P}},
{"is_composited",{P},B},
{"set_tooltip_markup",{P,S}},
{"get_tooltip_markup",{P},S},
{"set_tooltip_text",{P,S}},
{"get_tooltip_text",{P},S},
{"set_tooltip_window",{P,P}},
{"get_tooltip_window",{P},P,0,GtkWindow},
{"set_has_tooltip",{P,B}},
{"get_has_tooltip",{P},B},
{"trigger_tooltip_query",{P}},
{"get_window",{P},P,0,GdkWindow},
{"register_window",{P,P}}, -- GTK 3.8+
{"unregister_window",{P,P}}, -- GTK 3.8+
{"get_allocated_width",{P},I},
{"get_allocated_height",{P},I},
{"get_allocation",{P},-routine_id("widget_get_allocation")},
{"set_allocation",{P,P}},
{"get_allocated_baseline",{P},I},
{"get_app_paintable",{P},B},
{"set_can_default",{P,B}},
{"get_can_default",{P},B},
{"get_can_focus",{P},B},
{"get_double_buffered",{P},B}, -- deprecated 3.14
{"get_has_window",{P},B},
{"get_sensitive",{P},B},
{"get_visible",{P},B},
{"is_visible",{P},B}, -- GTK 3.8+
{"set_visible",{P,B}},
{"set_state_flags",{P,I,B}},
{"unset_state_flags",{P,I}},
{"get_state_flags",{P},I},
{"has_default",{P},B},
{"has_focus",{P},B},
{"has_visible_focus",{P},B},
{"has_grab",{P},B},
{"is_drawable",{P},B},
{"is_toplevel",{P},B},
{"set_window",{P,P}},
{"set_receives_default",{P,B}},
{"get_receives_default",{P},B},
{"set_support_multidevice",{P,B}},
{"get_support_multidevice",{P},B},
{"set_realized",{P,B}},
{"get_realized",{P},B},
{"set_mapped",{P,B}},
{"get_mapped",{P},B},
{"device_is_shadowed",{P,P},B},
{"get_modifier_mask",{P,I},I},
{"insert_action_group",{P,S,P}},
{"get_opacity",{P},D}, -- GTK 3.8+
{"set_opacity",{P,D}}, -- GTK 3.8+
{"get_path",{P},P,0,GtkWidgetPath},
{"get_style",{P},P,0,GtkStyle},
{"get_style_context",{P},P,0,GtkStyleContext},
{"reset_style",{P}},
{"get_preferred_height",{P,I,I}},
{"get_preferred_width",{P,I,I}},
{"get_preferred_height_for_width",{P,I,I,I}},
{"get_preferred_width_for_height",{P,I,I,I}},
{"get_preferred_height_and_baseline_for_width",{P,I,I,I,I,I}},
{"get_request_mode",{P},I},
{"get_preferred_size",{P,P,P}},
{"get_preferred_size_and_baseline",{P,P,I,I}},
{"get_halign",{P},I},
{"set_halign",{P,I}},
{"get_valign",{P},I},
{"set_valign",{P,I}},
{"set_margin_left",{P,I}}, -- deprecated 3.12
{"get_margin_left",{P},I}, -- deprecated 3.12
{"set_margin_right",{P,I}}, -- deprecated 3.12
{"get_margin_right",{P},I}, -- deprecated 3.12
{"get_margin_end",{P},I}, -- new 3.12
{"set_margin_end",{P,I}}, -- new 3.12
{"get_margin_start",{P},I}, -- new 3.12
{"set_margin_start",{P,I}}, -- new 3.12
{"set_margin_top",{P,I}},
{"get_margin_top",{P},I},
{"set_margin_bottom",{P,I}},
{"get_margin_bottom",{P},I},
{"get_hexpand",{P},B},
{"set_hexpand",{P,B}},
{"get_hexpand_set",{P},B},
{"set_hexpand_set",{P,B}},
{"get_vexpand",{P},B},
{"set_vexpand",{P,B}},
{"get_vexpand_set",{P},B},
{"set_vexpand_set",{P,B}},
{"queue_compute_expand",{P}},
{"compute_expand",{P,I},B},
{"init_template",{P}},
{"get_automated_child",{P,I,S},P,0,GObject},
{"get_clip",{P,P}}, -- 3.14
{"set_clip",{P},P}, -- 3.14
{"get_action_group",{P,S},P,0,GActionGroup}, -- 3.16
{"list_action_prefixes",{P},A}, -- 3.16
{"get_font_map",{P},P,0,PangoFontMap}, -- 3.18
{"set_font_map",{P,P}}, -- 3.18
{"get_font_options",{P},P}, -- 3.18
{"set_font_options",{P,P}}, -- 3.18
{"signal",{P,P,P,P,P,P},-routine_id("connect")},
{"list_accel_closures",{P},X,0,GList},
{"get_font",{P},-routine_id("widget_get_font")},
{"get_allocated_size",{P,P,I}}, -- 3.20
{"get_focus_on_click",{P},B}, -- 3.20
{"set_focus_on_click",{P,B}}, -- 3.20
"GtkWidget"}
function widget_set_size_request(atom ctl, object x=0, object y=0)
if string(x) then
x = split(x,'x')
y = to_number(x[2])
x = to_number(x[1])
end if
gtk_func("gtk_widget_set_size_request",{P,I,I},{ctl,x,y})
return 1
end function
function widget_get_font(atom x)
object layout = get(x,"layout")
object context = gtk_func("pango_layout_get_context",{P},{layout})
object descr = gtk_func("pango_context_get_font_description",{P},{context})
return gtk_str_func("pango_font_description_to_string",{P},{descr})
end function
function widget_get_allocation(atom obj)
atom al = allocate(32,1)
gtk_func("gtk_widget_get_allocation",{P,P},{obj,al})
return peek4u({al,4})
end function
function widget_set_name(atom ctl, object name)
gtk_proc("gtk_widget_set_name",{P,P},{ctl,name})
integer x = find(ctl,vslice(registry,1))
if x > 0 then
registry[x][4] = peek_string(name)
end if
return 1
end function
-- This allows specifying a font name, e.g. "Courier bold 12" as a string,
-- instead of a pango font description object;
function widget_set_font(atom x, object fnt)
fnt = gtk_func("pango_font_description_from_string",{P},{fnt})
gtk_proc("gtk_widget_override_font",{P,P},{x,fnt})
return 1
end function
-- The functions below handle color conversion to/from rgba,
-- as well as supplying easier-to-use method names for setting background
-- and foreground. These methods are only used to set the colors of a widget
-- in the NORMAL state, whereas if you want to set the colors in
-- some other state, such as mouse-over, etc, you use the original
-- set(widget,"override background",STATE,"color") syntax.
function widget_set_foreground(atom x, object c) -- alias 'color'
return widget_override_color(x,0,c)
end function
function widget_set_background(atom x, object c) -- alias 'background'
return widget_override_background_color(x,0,c)
end function
function widget_override_color(atom x, integer state=0, object c)
if atom(c) then
c = text:format("#[:06X]",c)
end if
gtk_proc("gtk_widget_override_color",{P,I,P},{x,state,to_rgba(c)})
return 1
end function
function widget_override_background_color(atom x, integer state=0, object c)
if atom(c) then
c = text:format("#[:06X]",c)
end if
gtk_proc("gtk_widget_override_background_color",{P,I,P},{x,state,to_rgba(c)})
return 1
end function
widget[GtkContainer] = {"gtk_container",
{GtkWidget,GtkBuildable,GObject},
{"add",{P,P}},
{"remove",{P,P}},
{"check_resize",{P}},
{"foreach",{P,P,P}},
{"get_children",{P},X},
{"get_path_for_child",{P,P},S},
{"set_focus_child",{P,P}},
{"get_focus_child",{P},P},
{"set_focus_vadjustment",{P,P}},
{"get_focus_vadjustment",{P},P,0,GtkAdjustment},
{"set_focus_hadjustment",{P,P}},
{"get_focus_hadjustment",{P},P,0,GtkAdjustment},
{"child_type",{P},I},
{"forall",{P,P,P}},
{"set_border",{P,I},-routine_id("set_border")},
{"set_border_width",{P,I}},
{"get_border_width",{P},I},
{"propagate_draw",{P,P,P}},
{"child_notify",{P,P,S}},
{"child_notify_by_pspec",{P,P,P}}, -- 3.18
{"class_install_child_properties",{P,I,P}}, -- 3.18
"GtkContainer"}
function set_border(atom cont, integer w) -- alias for 'border_width';
gtk_proc("gtk_container_set_border_width",{P,I},{cont,w})
return 1
end function
widget[GdkKeymap] = {"gdk_keymap",
{GObject},
{"new",{},-routine_id("new_keymap")},
{"get_default",{},-routine_id("new_keymap")},
{"get_for_display",{P},P,0,GdkKeymap},
{"get_capslock_state",{P},B},
{"get_numlock_state",{P},B},
{"get_modifier_state",{P},I},
{"get_direction",{P},I},
{"have_bidi_layouts",{P},B},
{"lookup_key",{P,P},I},
{"get_scroll_lock_state",{P,B}},
"GdkKeymap"}
function new_keymap(atom disp=0)
if disp=0 then
return gtk_func("gdk_keymap_get_default")
else
return gtk_func("gdk_keymap_get_for_display",{P},P)
end if
end function
widget[GtkBin] = {"gtk_bin",
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"get_child",{P},P},
"GtkBin"}
widget[GtkBox] = {"gtk_box",
{GtkContainer,GtkWidget,GtkOrientable,GtkBuildable,GObject},
{"new",{I,I},P},
{"pack_start",{P,P,B,B,I}},
{"pack_end",{P,P,B,B,I}},
{"set_homogeneous",{P,B}},
{"get_homogeneous",{P},B},
{"set_spacing",{P,I}},
{"get_spacing",{P},I},
{"reorder_child",{P,P,I}},
{"query_child_packing",{P,P,B,B,I,I}},
{"set_child_packing",{P,P,B,B,I,I}},
{"set_baseline_position",{P,I}},
{"get_baseline_position",{P},I},
{"get_center_widget",{P},P,0,GtkWidget}, -- 3.12
{"set_center_widget",{P,P}}, -- 3.12
"GtkBox"}
widget[GtkButtonBox] = {"gtk_button_box",
{GtkBox,GtkContainer,GtkWidget,GtkBuilder,GtkOrientable,GObject},
{"new",{I},P},
{"set_layout",{P,I}},
{"get_layout",{P},I},
{"set_child_secondary",{P,P,B}},
{"get_child_secondary",{P,P},B},
{"set_child_non_homogeneous",{P,P,B}},
{"get_child_non_homogeneous",{P,P},P},
"GtkButtonBox"}
widget[GtkWindowGroup] = {"gtk_window_group",
{GObject},
{"new",{},P},
{"add_window",{P,P}},
{"remove_window",{P,P}},
{"list_windows",{P},X,0,GList},
{"get_current_grab",{P},P,0,GtkWidget},
{"get_current_grab_device",{P,P},P,0,GtkWidget},
"GtkWindowGroup"}
-- shortcuts are new in 3.20, inadequate documentation means there's no way to test yet;
widget[GtkShortcutsWindow] = {"gtk_shortcuts_window",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GObject},
-- properties:
-- section-name
-- view-name
"GtkShortcutsWindow"}
widget[GtkShortcutsSection] = {"gtk_shortcuts_section",
{GtkBox,GtkContainer,GtkWidget,GObject},
-- properties;
-- max-height
-- section-name
-- title
-- view-name
"GtkShortcutsSection"}
widget[GtkShortcutsGroup] = {"gtk_shortcuts_group",
{GtkBox,GtkContainer,GtkWidget,GObject},
-- properties;
-- accel-size-group
-- height
-- title
-- title-size-group
-- view
"GtkShortcutsGroup"}
widget[GtkShortcutsShortcut] = {"gtk_shortcuts_shortcut",
{GtkBox,GtkContainer,GtkWidget,GObject},
-- properties;
-- accel-size-group
-- accelerator
-- title
-- title-size-group
"GtkShortcutsShortcut"}
widget[GtkShortcutsGesture] = {"gtk_shortcuts_gesture",
{GtkBox,GtkContainer,GtkWidget,GObject},
-- properties;
-- icon
-- icon-size-group
-- subtitle
-- title
-- title-size-group
"GtkShortcutsGesture"}
widget[GtkWindow] = {"gtk_window",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{I},P},
{"set_title",{P,S}},
{"get_title",{P},S},
{"set_resizable",{P,B}},
{"get_resizable",{P},B},
{"get_size",{P,I,I}},
{"set_size",{P,P},-routine_id("win_set_size")}, -- alias;
{"set_position",{P,P},-routine_id("win_set_pos")}, -- alias
--{"set_position",{P,I}}, -- alias above allows 2 forms of 'position';
{"set_default",{P,P}},
{"set_default_size",{P,I,I}},
{"get_default_size",{P,I,I}},
{"get_position",{P,I,I}},
{"add_accel_group",{P,P}},
{"remove_accel_group",{P,P}},
{"activate_focus",{P},B},
{"activate_default",{P},B},
{"set_modal",{P,B}},
{"get_modal",{P},B},
{"set_default_geometry",{P,I,I}},
{"set_geometry_hints",{P,P,P,I}},
{"set_gravity",{P,I}},
{"get_gravity",{P},I},
{"set_transient_for",{P,P}},
{"get_transient_for",{P},P,0,GtkWindow},
{"set_attached_to",{P,P}},
{"get_attached_to",{P},P,0,GtkWidget},
{"set_destroy_with_parent",{P,B}},
{"get_destroy_with_parent",{P},B},
{"set_hide_titlebar_when_maximized",{P,B}},
{"get_hide_titlebar_when_maximized",{P},B},
{"set_screen",{P,P}},
{"get_screen",{P},P,0,GdkScreen},
{"is_active",{P},B},
{"list_toplevels",{P},X,0,GSList},
{"has_toplevel_focus",{P},B},
{"add_mnemonic",{P,I,P}},
{"remove_mnemonic",{P,I,P}},
{"set_mnemonics_visible",{P,B}},
{"get_mnemonics_visible",{P},B},
{"mnemonic_activate",{P,I,I},B},
{"activate_key",{P,P},B},
{"propagate_key_event",{P,P},B},
{"get_focus",{P},P,0,GtkWidget},
{"set_focus",{P,P}},
{"set_focus_visible",{P,B}},
{"get_focus_visible",{P},B},
{"get_default_widget",{P},P,0,GtkWidget},
{"set_default",{P,P}},
{"present",{P}},
{"present_with_time",{P,P}},
{"iconify",{P}},
{"deiconify",{P}},
{"stick",{P}},
{"unstick",{P}},
{"maximize",{P}},
{"unmaximize",{P}},
{"fullscreen",{P}},
{"unfullscreen",{P}},
{"set_keep_above",{P,B}},
{"set_keep_below",{P,B}},
{"begin_resize_drag",{P,I,I,I,I,I}},
{"begin_move_drag",{P,I,I,I,I}},
{"set_decorated",{P,B}},
{"get_decorated",{P},B},
{"set_deletable",{P,B}},
{"get_deletable",{P},B},
{"set_mnemonic_modifier",{P,I}},
{"get_mnemonic_modifier",{P},I},
{"set_type_hint",{P,I}},
{"get_type_hint",{P},I},
{"set_skip_taskbar_hint",{P,B}},
{"get_skip_taskbar_hint",{P},B},
{"set_skip_pager_hint",{P,B}},
{"get_skip_pager_hint",{P},B},
{"set_urgency_hint",{P,B}},
{"get_urgency_hint",{P},B},
{"set_accept_focus",{P,B}},
{"get_accept_focus",{P},B},
{"set_focus_on_map",{P,B}},
{"get_focus_on_map",{P},B},
{"set_startup_id",{P,S}},
{"set_role",{P,S}},
{"get_role",{P},S},
{"get_icon",{P},P,0,GdkPixbuf},
{"get_icon_name",{P},S},
{"get_icon_list",{P},P,0,GList},
{"get_default_icon_list",{P},X,0,GList},
{"get_group",{P},P,0,GtkWindowGroup},
{"has_group",{P},B},
{"get_window_type",{P},I},
{"move",{P,I,I}},
{"parse_geometry",{P,S},B},
{"resize",{P,I,I}},
{"resize_to_geometry",{P,I,I}},
{"set_has_resize_grip",{P,B}},
{"get_has_resize_grip",{P},B},
{"resize_grip_is_visible",{P},B}, -- deprecated 3.14
{"get_resize_grip_area",{P,P},B}, -- deprecated 3.14
{"set_titlebar",{P,P}}, -- 3.10
{"get_titlebar",{P},P,0,GtkWidget}, -- 3.16
{"set_icon",{P,P},-routine_id("win_set_icon")},
{"restore",{P},-routine_id("win_restore")}, -- see below;
{"close",{P}}, -- 3.10
{"set_opacity",{P,D}},
{"is_maximized",{P},B}, -- 3.12
{"set_interactive_debugging",{B}}, -- 3.14
{"fullscreen_on_monitor",{P,P,I}}, -- 3.18
{"set_application",{P,P}},
{"get_application",{P},P,0,GtkApplication},
{"set_cursor",{P,P},-routine_id("win_set_cursor")},
"GtkWindow"}
function win_set_size(atom win, object size)
-- allow for WxH format to be passed;
if match("x",size) then size = split(size,'x') end if
if match("{",size) = 1 and match("}",size) = length(size) then
size = size[2..$-1]
size = split(size,',')
end if
set(win,"default_size",size[1],size[2])
return 1
end function
function win_set_pos(atom win, object pos)
if integer(pos) then -- only one integer passed;
gtk_proc("gtk_window_set_position",{P,I},{win,pos}) -- use original call;
return 1
end if
-- else position is WxH format, so call move instead;
if match("x",pos) then pos = split(pos,'x') end if
if match("{",pos) = 1 and match("}",pos) = length(pos) then
pos = pos[2..$-1]
pos = split(pos,',')
end if
set(win,"move",pos[1],pos[2])
return 1
end function
function win_set_cursor(atom win, object cursor)
atom gdkwin = get(win,"window")
cursor = create(GdkCursor,cursor)
set(gdkwin,"cursor",cursor)
return cursor
end function
-- this replaces a handy but deprecated GTK function which
-- restores a window to its original size after being resized
-- to fit larger contents;
function win_restore(atom win)
set(win,"hide")
set(win,"unrealize")
gtk_proc("gtk_window_set_position",{P,I},{win,1})
set(win,"show")
return 1
end function
-- manages the creation of window icon from a variety of source formats.
-- this makes life much easier for the programmer.
function win_set_icon(object win, object icon)
object path
if string(icon) then
path = locate_file(icon)--display(path)
if file_type(path) = 1 then
gtk_proc("gtk_window_set_icon_from_file",{P,P},
{win,allocate_string(path,1)})
return 1
else
gtk_proc("gtk_window_set_icon_name",{P,P},
{win,allocate_string(icon,1)})
return 1
end if
end if
if sequence(icon) then
gtk_proc("gtk_window_set_icon",{P,P},{win,xpm_to_pixbuf(icon)})
end if
if atom(icon) then
if class_id(icon) = GtkImage then
icon = get(icon,"pixbuf")
end if
if class_id(icon) = GdkPixbuf then
gtk_proc("gtk_window_set_icon",{P,P},{win,icon})
end if
return 1
end if
return 0
end function
widget[GtkMisc] = {"gtk_misc", -- deprecated 3.14
{GtkWidget,GtkBuildable,GObject},
{"set_alignment",{P,F,F}},
{"get_alignment",{P,F,F}},
{"set_padding",{P,I,I}},
{"get_padding",{P,I,I}},
"GtkMisc"}
widget[GtkLabel] = {"gtk_label",
{GtkMisc,GtkWidget,GtkBuildable,GObject},
{"new",{S},P},
{"new_with_mnemonic",{S},P,0,GtkLabel},
{"set_text",{P,S}},
{"set_value",{P,D},-routine_id("lbl_set_value")}, -- convenience, converts # to readable form;
{"get_text",{P},S},
{"set_markup",{P,S}},
{"set_text_with_mnemonic",{P,S}},
{"set_markup_with_mnemonic",{P,S}},
{"set_pattern",{P,S}},
{"set_justify",{P,I}},
{"get_justify",{P},I},
{"get_attributes",{P},P,0,PangoAttrList},
{"set_ellipsize",{P,I}},
{"get_ellipsize",{P},I},
{"set_width_chars",{P,I}},
{"get_width_chars",{P},I},
{"set_max_width_chars",{P,I}},
{"get_max_width_chars",{P},I},
{"set_line_wrap",{P,B}},
{"get_line_wrap",{P},B},
{"set_line_wrap_mode",{P,I}},
{"get_layout_offsets",{P,I,I}},
{"get_mnemonic_keyval",{P},I},
{"set_selectable",{P,B}},
{"get_selectable",{P},B},
{"select_region",{P,I,I}},
{"get_selection_bounds",{P,I,I},B},
{"set_mnemonic_widget",{P,P}},
{"get_mnemonic_widget",{P},P,0,GtkWidget},
{"get_label",{P},S},
{"get_layout",{P},P,0,PangoLayout},
{"get_line_wrap_mode",{P},I},
{"set_use_markup",{P,B}},
{"get_use_markup",{P},B},
{"set_use_underline",{P,B}},
{"get_use_underline",{P},B},
{"set_single_line_mode",{P,B}},
{"get_single_line_mode",{P},B},
{"set_angle",{P,D}},
{"get_current_uri",{P},S},
{"set_track_visited_links",{P,B}},
{"get_track_visited_links",{P},B},
{"set_lines",{P,I}}, -- 3.10
{"get_lines",{P},I}, -- 3.10
{"get_xalign",{P},F}, -- 3.16
{"get_yalign",{P},F}, -- 3.16
{"set_xalign",{P,F}}, -- 3.16
{"set_yalign",{P,F}}, -- 3.16
"GtkLabel"}
function lbl_set_value(atom lbl, atom val) -- provided for convenience;
set(lbl,"text",sprintf("%2.2f",val)) -- convert atom to string for label;
return 1
end function
widget[GtkImage] = {"gtk_image",
{GtkMisc,GtkWidget,GtkBuildable,GObject},
{"new",{P,I,I,I},-routine_id("newImage")},
{"set_image",{P,P,P},-routine_id("setImage")}, -- not a gtk func
{"set_from_file",{P,S}},
{"set_from_pixbuf",{P,P}},
{"set_from_icon_name",{P,S,I}},
{"set_from_animation",{P,P}},
{"set_from_gicon",{P,P,I}},
{"set_from_resource",{P,S}},
{"set_from_surface",{P,P}}, -- 3.10
{"clear",{P}},
{"set_pixel_size",{P,I}},
{"get_pixel_size",{P},I},
{"get_pixbuf",{P},P,0,GdkPixbuf}, -- doesn't work!
{"get_animation",{P},P,0,GdkPixbufAnimation},
{"get_storage_type",{P},I},
{"get_icon_name",{P},-routine_id("img_get_icon_name")},
"GtkImage"}
-----------------------------------------------------
-- create an image from a variety of source formats
----------------------------------------------------
function newImage(object icon=0, integer size=6, integer w=0, integer h=0)
if atom(icon) then
if icon = 0 then
return gtk_func("gtk_image_new") -- just a blank image requested;
else
switch class_id(icon) do
case GdkPixbuf then
icon = gtk_func("gtk_image_new_from_pixbuf",{P},{icon})
case GIcon then
icon = gtk_func("gtk_image_new_from_gicon",{P,I},{icon,size})
case CairoSurface_t then
icon = gtk_func("gtk_image_new_from_surface",{P},{icon})
case else -- do nothing
end switch
end if
return icon
end if
object theme, icon_info
if string(icon) then
if begins("gtk-",icon) then -- from stock (deprecated)
if size = 0 then size = 6 end if
return gtk_func("gtk_image_new_from_icon_name",{P,I},
{allocate_string(icon,1),size}) -- size is a GTK_ICON_SIZE_ enum;
end if
if file_exists(canonical_path(icon)) then -- from file
icon = canonical_path(icon)
if h = 0 and w = 0 then -- return at natural size;
return gtk_func("gtk_image_new_from_file",{P},
{allocate_string(icon,1)})
else
icon = newPixbuf(icon,w,h,size) -- resize it;
return gtk_func("gtk_image_new_from_pixbuf",{P},{icon})
end if
end if
if file_exists(locate_file(icon)) then -- from file
icon = locate_file(icon)
if h = 0 and w = 0 then -- return at natural size;
return gtk_func("gtk_image_new_from_file",{P},
{allocate_string(icon,1)})
else
icon = newPixbuf(icon,w,h,size) -- resize it;
return gtk_func("gtk_image_new_from_pixbuf",{P},{icon})
end if
end if
if size < 7 then
icon = gtk_func("gtk_image_new_from_icon_name",{P,I},{icon,size})
else
theme = create(GtkIconTheme) -- get current theme;
icon_info = get(theme,"lookup icon",icon,size) -- get icon details;
icon = get(icon_info,"load icon") -- load selected icon;
return create(GtkImage,icon)
end if
end if
return icon
end function
-----------------------------------------------------------------------------------
function setImage(atom img, object icon, integer size=0)
-----------------------------------------------------------------------------------
if size = 0 then
size = get(img,"pixel size")
end if
if string(icon) then
if file_exists(canonical_path(icon)) then -- from file
set(img,"from file",icon)
set(img,"pixel size",size)
return img
end if
if begins("gtk-",icon) then -- from stock (deprecated)
set(img,"from stock",icon)
return img
end if
set(img,"from icon name",icon)
return img
end if
return img
end function
function img_get_icon_name(atom img)
atom name = allocate(8), size = allocate(8)
atom fn = define_proc("gtk_image_get_icon_name",{P,P,P})
c_proc(fn,{img,name,size})
if name > 0 then
return {peek_string(peek4u(name)),peek4u(size)}
else return -1
end if
end function
widget[GdkCursor] = {"gdk_cursor",
{GObject},
{"new",{P,P,P},-routine_id("newCursor")},
{"get_display",{P},P,0,GdkDisplay},
{"get_image",{P},P,0,GdkPixbuf},
{"get_surface",{P,D,D},P,0,CairoSurface_t},
{"get_cursor_type",{P},I},
"GdkCursor"}
-- manages cursor creation from a variety of sources
function newCursor(object a, object b=0, integer c=0)
atom disp = gtk_func("gdk_display_get_default")
if string(a) then
return gtk_func("gdk_cursor_new_from_name",{P,P},{disp,allocate_string(a,1)})
end if
if class_id(a) = GdkPixbuf then
return gtk_func("gdk_cursor_new_from_pixbuf",{P,P,I,I},{disp,a,b,c})
end if
if class_id(a) = CairoSurface_t then
return gtk_func("gdk_cursor_new_from_surface",{P,P,D,D},{disp,a,b,c})
end if
if integer(a) then
return gtk_func("gdk_cursor_new_for_display",{P,I},{disp,a})
end if
end function
widget[GdkWindow] = {"gdk_window",
{GObject},
{"new",{P,P,I},P},
{"set_title",{P,S}},
{"destroy",{P}},
{"get_width",{P},I},
{"get_height",{P},I},
{"get_position",{P,I,I}},
{"get_device_position",{P,P,P,P,P},P,0,GdkWindow},
{"get_device_position_double",{P,P,P,P,P},P,0,GdkWindow},
{"get_origin",{P,I,I}},
{"get_parent",{P},P,0,GdkWindow},
{"get_toplevel",{P},P,0,GdkWindow},
{"get_children",{P},A,0,GList},
{"get_children_with_user_data",{P,P},A,0,GList},
{"peek_children",{P},P,0,GList},
{"get_events",{P},I},
{"set_events",{P,I}},
{"set_icon_name",{P,S}},
{"set_transient_for",{P,P}},
{"get_root_origin",{P,I,I}},
{"get_root_coords",{P,I,I,P,P}},
{"get_frame_extents",{P,P}},
{"set_modal_hint",{P,B}},
{"get_modal_hint",{P},B},
{"set_type_hint",{P,I}},
{"get_type_hint",{P},I},
{"get_window_type",{P},I},
{"get_display",{P},P,0,GdkDisplay},
{"get_screen",{P},P,0,GdkScreen},
{"get_visual",{P},P,0,GdkVisual},
{"show",{P}},
{"show_unraised",{P}},
{"hide",{P}},
{"is_destroyed",{P},B},
{"is_visible",{P},B},
{"is_viewable",{P},B},
{"is_input_only",{P},B},
{"is_shaped",{P},B},
{"set_composited",{P,B}}, -- deprecated 3.16
{"get_composited",{P},B}, -- deprecated 3.16
{"set_opacity",{P,D}},
{"set_cursor",{P,P}},
{"get_cursor",{P},P},
{"get_state",{P},I},
{"withdraw",{P}},
{"iconify",{P}},
{"deiconify",{P}},
{"stick",{P}},
{"unstick",{P}},
{"maximize",{P}},
{"unmaximize",{P}},
{"fullscreen",{P}},
{"unfullscreen",{P}},
{"set_fullscreen_mode",{P,I}},
{"get_fullscreen_mode",{P},I},
{"set_opacity",{P,D}},
{"scroll",{P,I,I}},
{"move_region",{P,P,I,I}},
{"shape_combine_region",{P,P,I,I}},
{"set_child_shapes",{P}},
{"merge_child_shapes",{P}},
{"input_shape_combine_region",{P,P,I,I}},
{"set_child_input_shapes",{P}},
{"merge_child_input_shapes",{P}},
{"get_geometry",{P,I,I,I,I}},
{"set_background_rgba",{P,P}},
{"set_fullscreen_mode",{P,I}},
{"get_fullscreen_mode",{P},I},
{"get_scale_factor",{P},I},
{"set_opaque_region",{P,P}},
{"get_effective_parent",{P},P,0,GdkWindow},
{"get_effective_toplevel",{P},P,0,GdkWindow},
{"beep",{}},
{"focus",{P,I}},
{"restack",{P,P,B}},
{"raise",{P}},
{"lower",{P}},
{"set_keep_above",{P,B}},
{"set_keep_below",{P,B}},
{"reparent",{P,P,I,I}},
{"ensure_native",{P},B},
{"has_native",{P},B},
{"register_dnd",{P}},
{"move",{P,I,I}},
{"scroll",{P,I,I}},
{"resize",{P,I,I}},
{"move_resize",{P,I,I,I,I}},
{"move_region",{P,P,I,I}},
{"begin_resize_drag",{P,I,I,I,I,I}},
{"begin_resize_drag_for_device",{P,I,P,I,I,I,I}},
{"begin_move_drag",{P,I,I,I,I}},
{"begin_move_drag_for_device",{P,P,I,I,I,I}},
{"show_window_menu",{P,P},B},
{"create_gl_context",{P,P},P,0,GdkGLContext}, -- 3.16
{"mark_paint_from_clip",{P,P}}, -- 3.16
{"get_clip_region",{P},P,0,CairoRegion_t},
{"begin_paint_rect",{P,P}},
{"begin_paint_region",{P,P}},
{"end_paint",{P}},
{"set_opaque_region",{P,P}},
{"get_visible_region",{P},P,0,CairoRegion_t},
{"set_invalidate_handler",{P,P}},
{"invalidate_rect",{P,P,B}},
{"invalidate_region",{P,P,B}},
{"invalidate_maybe_recurse",{P,P,P,P}},
{"get_update_area",{P},P,0,CairoRegion_t},
{"freeze_updates",{P}},
{"thaw_updates",{P}},
{"process_all_updates",{P}},
{"process_updates",{P,B}},
{"get_frame_clock",{P},P,0,GdkFrameClock},
{"set_user_data",{P,P}},
{"get_user_data",{P,P}},
{"set_override_redirect",{P,B}},
{"set_accept_focus",{P,B}},
{"get_accept_focus",{P},B},
{"set_focus_on_map",{P,B}},
{"get_focus_on_map",{P},B},
{"add_filter",{P,P,P}},
{"remove_filter",{P,P,P}},
{"set_background_pattern",{P,P}},
{"get_background_pattern",{P},P,0,CairoPattern_t},
{"set_geometry_hints",{P,P,I}},
{"set_functions",{P,I}},
{"get_pass_through",{P},B},
{"set_pass_through",{P,B}},
{"create_gl_context",{P,P},P,0,GdkGLContext},
{"mark_paint_from_clip",{P,P}},
"GdkWindow"}
widget[GdkPixbuf] = {"gdk_pixbuf",
{GObject},
{"new",{P,I,I,I},-routine_id("newPixbuf")},
{"get_from_window",{P,I,I,I,I},P,0,GdkPixbuf},
{"get_from_surface",{P,I,I,I,I},P,0,GdkPixbuf},
{"flip",{P,I},P,0,GdkPixbuf},
{"rotate_simple",{P,I},P,0,GdkPixbuf},
{"scale_simple",{P,I,I,I},P,0,GdkPixbuf},
{"add_alpha",{P,B,I,I,I},P,0,GdkPixbuf},
{"copy_area",{P,I,I,I,I,P,I,I}},
{"apply_embedded_orientation",{P},P,0,GdkPixbuf},
{"fill",{P,P}},
{"get_n_channels",{P},I},
{"get_has_alpha",{P},B},
{"get_colorspace",{P},I},
{"get_bits_per_sample",{P},I},
{"get_pixels_with_length",{P,I},P},
{"get_width",{P},I},
{"get_height",{P},I},
{"get_size",{P},-routine_id("getPixbufSize")},
{"get_rowstride",{P},I},
{"get_byte_length",{P},I},
{"get_option",{P,S},S},
{"saturate_and_pixelate",{P,P,F,B},0,GdkPixbuf},
{"composite_color_simple",{}},-- Cannot implement, use gtk_func if required.
{"save",{P,P,P,P},-routine_id("pb_save")},
{"get_file_info",{P,S},-routine_id("pb_get_file_info")},
{"get_format",{P,S},-routine_id("pb_get_format")},
"GdkPixbuf"}
-- creates a pixbuf from a variety of sources
function newPixbuf(object name, integer w=0, integer h=0, atom ratio=0)
-----------------------------------------------------------------------
atom err = allocate(32,1) err = 0
object path=allocate_string("gtk-missing-image",1)
object pix = 0
if string(name) then
path = canonical_path(locate_file(name))
if file_exists(path) then
ifdef PIXBUF then
display("PIXBUF from file: []",{abbreviate_path(path)},0)
end ifdef
path = allocate_string(path,1)
goto "build"
end if
if has_icon(name) then
path = icon_info(name)
ifdef PIXBUF then
display("PIXBUF from icon: []",{filename(path[3])},0)
end ifdef
if string(path[3]) then
path = allocate_string(path[3],1)
else
path = "!"
end if
goto "build"
else return 0
end if
else
ifdef PIXBUF then
display("PIXBUF from atom: [] []",{name,peek_string(name)},0)
end ifdef
end if -- string name;
label "build"
if h = 0 and w = 0 then -- return at original size;
ifdef PIXBUF then display("Orig size") end ifdef
pix = gtk_func("gdk_pixbuf_new_from_file",{P,P},{path,err})
else -- if one or other dimension given, scale it, otherwise size it;
if w > 0 and h = 0 then h = -1 end if
if w = 0 and h > 0 then w = -1 end if
ifdef PIXBUF then display("\t SCALE []x[] []",{w,h,ratio}) end ifdef
pix = gtk_func("gdk_pixbuf_new_from_file_at_scale",{P,I,I,B,P},{path,w,h,ratio,err})
end if
ifdef PIXBUF_ERR then
if pix = 0 then
display("CAUTION: cannot create pixbuf from []",{peek_string(path)})
end if
end ifdef
return pix
end function
-- save a pixbuf in various formats based on file extension(.png, .jpg, etc)
function pb_save(atom handle, object fn, object ft, object params = 0)
if string(fn) then fn = allocate_string(fn,1) end if
if string(ft) then ft = allocate_string(ft,1) end if
if string(params) then
params = split(params,'=')
for i = 1 to length(params) do
params[i] = allocate_string(params[i],1)
end for
end if
atom err = allocate(8,1) err = 0
if atom(params) then
return gtk_func("gdk_pixbuf_save",{P,P,P,P,P},{handle,fn,ft,err,0})
else
return gtk_func("gdk_pixbuf_save",{P,P,P,P,P,P,P},{handle,fn,ft,err,params[1],params[2],0})
end if
end function
function getPixbufSize(object pb)
return {get(pb,"width"),get(pb,"height")}
end function
function pb_get_file_info(atom pb, object name)
atom w = allocate(8,1), h = allocate(8,1)
object fmt = gtk_func("gdk_pixbuf_get_file_info",{P,P,P},
{name,w,h})
return {fmt,peek4u(w),peek4u(h)}
end function
function pb_get_format(atom pb, object name)
object fmt = pb_get_file_info(pb,name)
return fmt
end function
export function pixbuf_formats()
object fmts = gtk_func("gdk_pixbuf_get_formats")
register(fmts,GSList)
return unpack_gs_str_list(fmts)
end function
widget[GdkPixbufFormat] = {"gdk_pixbuf_format",
{GObject},
{"get_name",{P},S},
{"get_description",{P},S},
{"get_mime_types",{P},A},
-- {"extensions",{P},P}, -- error
{"is_writable",{P},B},
{"is_scalable",{P},B},
{"is_disabled",{P},B},
{"set_disabled",{P,B}},
{"get_license",{P},S},
"GdkPixbufFormat"}
widget[GtkDialog] = {"gtk_dialog",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"run",{P},I},
{"get_action_area",{P},P,0,GtkBox}, -- deprecated 3.12
{"get_content_area",{P},P,0,GtkBox},
{"response",{P,I}},
{"add_button",{P,S,I},P,0,GtkButton},
{"add_action_widget",{P,P,I}},
{"set_default_response",{P,I}},
{"set_response_sensitive",{P,I,B}},
{"get_response_for_widget",{P,P},I},
{"get_widget_for_response",{P,I},P,0,GtkWidget},
{"get_header_bar",{P},P,0,GtkContainer},-- GTK 3.12
"GtkDialog"}
widget[GtkMessageDialog] = {"gtk_message_dialog",
{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P,I,I,I,S,S},P},
{"new_with_markup",{P,I,I,I,S,S},P},
{"set_markup",{P,S}},
{"set_image",{P,P}}, -- deprecated 3.12
{"get_image",{P},P,0,GtkImage}, -- deprecated 3.12
{"format_secondary_text",{P,S,S}},
{"format_secondary_markup",{P,S,S}},
{"get_message_area",{P},P,0,GtkContainer},
"GtkMessageDialog"}
widget[GtkSeparator] = {"gtk_separator",
{GtkWidget,GObject,GtkBuildable,GtkOrientable},
{"new",{I},P},
"GtkSeparator"}
widget[GtkEditable] = {"gtk_editable",
{0},
{"select_region",{P,I,I}},
{"get_selection_bounds",{P,I,I}},
{"insert_text",{P,S,I,I}},
{"delete_text",{P,I,I}},
{"get_chars",{P,I,I},S},
{"cut_clipboard",{P}},
{"copy_clipboard",{P}},
{"paste_clipboard",{P}},
{"delete_selection",{P}},
{"set_position",{P,I}},
{"get_position",{P},I},
{"set_editable",{P,B}},
{"get_editable",{P},B},
"GtkEditable"}
widget[GtkTextIter] = {"gtk_text_iter",
{GObject},
{"get_buffer",{P},P,0,GtkTextBuffer},
{"copy",{P},P,0,GtkTextIter},
{"free",{P}},
{"get_offset",{P},I},
{"get_line",{P},I},
{"get_line_offset",{P},I},
{"get_line_index",{P},I},
{"get_visible_line_index",{P},I},
{"get_visible_line_offset",{P},I},
{"get_char",{P},I},
{"get_slice",{P,P},S},
{"get_text",{P,P},S},
{"get_visible_slice",{P,P},S},
{"get_visible_text",{P,P},S},
{"get_pixbuf",{P},P,0,GdkPixbuf},
{"get_marks",{P},X,0,GSList},
{"get_toggled_tags",{P,B},X,0,GSList},
{"get_child_anchor",{P},P,0,GtkTextChildAnchor},
{"begins_tag",{P,P},B},
{"ends_tag",{P,P},B},
{"toggles_tag",{P,P},B},
{"has_tag",{P,P},B},
{"get_tags",{P},X,0,GSList},
{"editable",{P,B},B},
{"can_insert",{P,B},B},
{"starts_word",{P},B},
{"ends_word",{P},B},
{"inside_word",{P},B},
{"starts_line",{P},B},
{"ends_line",{P},B},
{"starts_sentence",{P},B},
{"ends_sentence",{P},B},
{"inside_sentence",{P},B},
{"is_cursor_position",{P},B},
{"get_chars_in_line",{P},I},
{"get_bytes_in_line",{P},I},
{"get_attributes",{P,P},B},
{"get_language",{P},P,0,PangoLanguage},
{"is_end",{P},B},
{"is_start",{P},B},
{"forward_char",{P},B},
{"backward_char",{P},B},
{"forward_chars",{P,I},B},
{"backward_chars",{P,I},B},
{"forward_line",{P},B},
{"backward_line",{P},B},
{"forward_lines",{P,I},B},
{"backward_lines",{P,I},B},
{"forward_word_ends",{P,I},B},
{"backward_word_starts",{P,I},B},
{"forward_word_ends",{P},B},
{"backward_word_start",{P},B},
{"forward_cursor_position",{P},B},
{"backward_cursor_position",{P},B},
{"forward_cursor_positions",{P,I},B},
{"backward_cursor_positions",{P,I},B},
{"backward_sentence_start",{P},B},
{"backward_sentence_starts",{P,I},B},
{"forward_sentence_end",{P},B},
{"forward_sentence_ends",{P,I},B},
{"forward_visible_word_ends",{P,I},B},
{"backward_visible_word_starts",{P,I},B},
{"forward_visible_word_end",{P},B},
{"backward_visible_word_start",{P},B},
{"forward_visible_cursor_position",{P},B},
{"backward_visible_cursor_position",{P},B},
{"forward_visible_cursor_positions",{P,I},B},
{"backward_visible_cursor_positions",{P,I},B},
{"forward_visible_line",{P},B},
{"backward_visible_line",{P},B},
{"forward_visible_lines",{P,I},B},
{"backward_visible_lines",{P,I},B},
{"set_offset",{P,I}},
{"set_line",{P,I}},
{"set_line_offset",{P,I}},
{"set_line_index",{P,I}},
{"set_visible_line_index",{P,I}},
{"set_visible_line_offset",{P,I}},
{"forward_to_end",{P}},
{"forward_to_line_end",{P},B},
{"forward_to_tag_toggle",{P,P},B},
{"backward_to_tag_toggle",{P,P},B},
{"forward_find_char",{P,P,P,P},B},
{"backward_find_char",{P,P,P,P},B},
{"forward_search",{P,S,I,P,P,P},B},
{"backward_search",{P,S,I,P,P,P},B},
{"equal",{P,P},B},
{"compare",{P,P},I},
{"in_range",{P,P,P},B},
{"order",{P,P}},
{"starts_tag",{P,P},B}, -- 3.20
"GtkTextIter"}
widget[GtkEntry] = {"gtk_entry",
{GtkWidget,GtkEditable,GtkCellEditable,GtkBuildable,GObject},
{"new",{},P},
{"get_buffer",{P},P,0,GtkEntryBuffer},
{"set_buffer",{P,P}},
{"set_text",{P,S}},
{"set_value",{P,D},-routine_id("entry_set_value")}, -- not GTK, a convenience func;
{"get_text",{P},S},
{"get_value",{P},-routine_id("entry_get_value")}, -- not GTK, a convenience func;
{"get_text_length",{P},I},
{"get_text_area",{P,P}},
{"set_visibility",{P,B}},
{"get_visibility",{P},B},
{"set_invisible_char",{P,I}},
{"get_invisible_char",{P},I},
{"unset_invisible_char",{P}},
{"set_max_length",{P,I}},
{"get_max_length",{P},I},
{"set_activates_default",{P,B}},
{"get_activates_default",{P},B},
{"set_has_frame",{P,B}},
{"get_has_frame",{P},B},
{"set_width_chars",{P,I}},
{"get_width_chars",{P},I},
{"set_alignment",{P,F}},
{"get_alignment",{P},F},
{"set_placeholder_text",{P,S}}, -- GTK 3.2+
{"get_placeholder_text",{P},S}, -- GTK 3.2+
{"set_overwrite_mode",{P,B}},
{"get_overwrite_mode",{P},B},
{"get_layout",{P},P,0,PangoLayout},
{"get_layout_offsets",{P,I,I}},
{"set_completion",{P,P}},
{"get_completion",{P},P,0,GtkEntryCompletion},
{"set_progress_fraction",{P,D}},
{"set_progress_pulse_step",{P,D}},
{"progress_pulse",{P}},
{"set_icon_from_stock",{P,I,S}}, -- deprecated 3.10
{"set_icon_from_pixbuf",{P,I,P}},
{"set_icon_from_icon_name",{P,I,S}},
{"set_icon_from_gicon",{P,I,P}},
{"get_icon_storage_type",{P,I},I},
{"get_icon_pixbuf",{P,I},P,0,GdkPixbuf},
{"get_icon_name",{P,I},S},
{"get_icon_area",{P,I,I}},
{"get_icon_gicon",{P,I},P,0,GIcon},
{"set_icon_activatable",{P,I,B}},
{"set_icon_sensitive",{P,I,B}},
{"get_icon_at_pos",{P,I,I},I},
{"set_icon_tooltip_text",{P,I,S}},
{"get_icon_tooltip_text",{P,I},S},
{"set_icon_tooltip_markup",{P,I,S}},
{"get_icon_tooltip_markup",{P,I},S},
{"set_tabs",{P,P}}, -- 3.10
{"get_tabs",{P},P,0,PangoTabArray}, -- 3.10
{"get_max_width_chars",{P},I}, -- 3.12
{"set_max_width_chars",{P,I}}, -- 3.12
{"im_context_filter_keypress",{P,I},B},
{"grab_focus_without_selecting",{P}}, --3.16
"GtkEntry"}
function entry_get_value(atom x) -- retrieve input text as a number;
object txt = get(x,"text")
return to_number(txt)
end function
function entry_set_value(atom x, atom v) -- convert number to text equivalent;
if integer(v) then
set(x,"text",sprintf("%d",v))
else
set(x,"text",sprintf("%2.2f",v))
end if
return 1
end function
widget[GtkSpinButton] = {"gtk_spin_button",
{GtkEntry,GtkWidget,GtkEditable,GtkCellEditable,GtkOrientable,GtkBuildable,GObject},
{"set_adjustment",{P,P}},
{"get_adjustment",{P},P,0,GtkAdjustment},
{"set_digits",{P,I}},
{"get_digits",{P},I},
{"set_range",{P,D,D}},
{"get_range",{P,D,D}},
{"set_value",{P,D}},
{"get_value",{P},-routine_id("getSpinVal")},
{"get_value_as_int",{P},I},
{"set_update_policy",{P,I}},
{"set_numeric",{P,B}},
{"get_numeric",{P},B},
{"set_wrap",{P,B}},
{"get_wrap",{P},B},
{"spin",{P,I,D}},
{"update",{P}},
{"get_increments",{P,D,D}},
{"set_snap_to_ticks",{P,B}},
{"get_snap_to_ticks",{P},B},
{"configure",{P,P,D,I}},
{"new",{D,D,D},-routine_id("newSpinButton")},
"GtkSpinButton"}
-- create a spin button from an ajustment object or from a range of values
function newSpinButton(atom a=0, atom b=0, atom c=0)
----------------------------------------------------
atom sb = 0
if a+b+c = 0 then a = create(GtkAdjustment,0,0,100,1) end if
if class_id(a) = GtkAdjustment then
sb = gtk_func("gtk_spin_button_new",{P,D,I},{a,b,c})
else
sb = gtk_func("gtk_spin_button_new_with_range",{D,D,D},{a,b,c})
end if
return sb
end function
function getSpinVal(atom spin)
------------------------------
object range = get(spin,"range")
atom fn = define_func("gtk_spin_button_get_value",{P},D)
atom val = c_func(fn,{spin})
val = math:ensure_in_range(val,range)
return val
end function
widget[GtkOrientable] = {"gtk_orientable",
{GObject},
{"set_orientation",{P,I}},
{"get_orientation",{P},I},
"GtkOrientable"}
widget[GtkRange] = {"gtk_range",
{GtkWidget,GtkOrientable,GtkBuildable,GObject},
{"set_fill_level",{P,D}},
{"get_fill_level",{P},D},
{"set_restrict_to_fill_level",{P,B}},
{"get_restrict_to_fill_level",{P},B},
{"set_show_fill_level",{P,B}},
{"get_show_fill_level",{P},B},
{"set_adjustment",{P,P}},
{"get_adjustment",{P},P},
{"set_inverted",{P,B}},
{"get_inverted",{P},B},
{"set_value",{P,D}},
{"get_value",{P},D},
{"set_increments",{P,D,D}},
{"set_range",{P,D,D}},
{"set_round_digits",{P,I}},
{"get_round_digits",{P},I},
{"set_lower_stepper_sensitivity",{P,I}},
{"get_lower_stepper_sensitivity",{P},I},
{"set_upper_stepper_sensitivity",{P,I}},
{"get_upper_stepper_sensitivity",{P},I},
{"set_flippable",{P,B}},
{"get_flippable",{P},B},
{"set_min_slider_size",{P,I}},
{"get_min_slider_size",{P},I},
{"get_slider_range",{P,I,I}},
{"set_slider_size_fixed",{P,B}},
{"get_slider_size_fixed",{P},B},
"GtkRange"}
widget[GtkScale] = {"gtk_scale",
{GtkRange,GtkWidget,GtkOrientable,GtkBuildable,GObject},
{"set_digits",{P,I}},
{"get_digits",{P},I},
{"set_draw_value",{P,B}},
{"get_draw_value",{P},B},
{"set_has_origin",{P,B}},
{"get_has_origin",{P},B},
{"set_value_pos",{P,I}},
{"get_value_pos",{P},I},
{"get_layout",{P},P,0,PangoLayout},
{"get_layout_offsets",{P,I,I}},
{"add_mark",{P,D,I,S}},
{"clear_marks",{P}},
{"new",{P,P,P,P},-routine_id("newScale")},
"GtkScale"}
-- create scale from range or adjustment;
function newScale(integer orient, atom min=0, atom max=0, atom step=0)
if min+max+step = 0 then
return gtk_func("gtk_scale_new",{I,P},{orient,0})
end if
if class_id(min) = GtkAdjustment then
return gtk_func("gtk_scale_new",{I,P},{orient,min})
else
return gtk_func("gtk_scale_new_with_range",{I,D,D,D},{orient,min,max,step})
end if
end function
widget[GTimeout] = {"g_timeout",
{0},
{"new",{I,P,P},-routine_id("newTimeout")},
{"add",{I,P,P},-routine_id("newTimeout")},
"GTimeout"}
function newTimeout(integer ms, atom fn, atom data)
return gtk_func("g_timeout_add",{I,P,P},{ms,fn,data})
end function
widget[GIdle] = {"g_idle",
{0},
{"new",{P,P},-routine_id("newIdle")},
{"add",{P,P},-routine_id("newIdle")},
"GIdle"}
function newIdle(atom fn, atom data)
return gtk_func("g_idle_add",{P,P},{fn,data})
end function
widget[GNotification] = {"g_notification",
{0},
{"new",{S},P},
{"set_title",{P,S}},
{"set_body",{P,S}},
{"set_icon",{P,P}},
--{"set_priority",{P,I}}, error
{"set_default_action",{P,S}},
{"add_button",{P,S,S}},
{"add_button_with_target_value",{P,S,S,I}},
{"set_default_action_and_target_value",{P,S,I}},
"GNotification"}
widget[GApplication] = {"g_application",
{0},
{"new",{S,I},P},
{"get_id",{P},S},
{"set_id",{P,S}},
{"id_is_valid",{P,S},B},
{"get_inactivity_timeout",{P},I},
{"set_inactivity_timeout",{P,I}},
{"get_flags",{P},I},
{"set_flags",{P,I}},
{"get_resource_base_path",{P},S},
{"set_resource_base_path",{P,S}},
{"get_dbus_connection",{P},P},
{"get_dbus_object_path",{P},S},
{"get_is_registered",{P},B},
{"get_is_remote",{P},B},
{"register",{P,P,P},B},
{"hold",{P}},
{"release",{P}},
{"quit",{P}},
{"activate",{P}},
{"open",{P,P,I,I}},
{"send_notification",{P,S,P}},
{"withdraw_notification",{P,S}},
{"run",{P,I,P},I},
{"add_main_option_entries",{P,P}},
{"add_option_group",{P,P}},
{"add_main_option",{P,S,S,I,I,S,S}},
{"set_default",{P}},
{"mark_busy",{P}},
{"unmark_busy",{P}},
{"get_is_busy",{P},B},
{"bind_busy_property",{P,P,S}},
{"unbind_busy_property",{P,P,S}},
"GApplication"}
widget[GAppInfo] = {"g_app_info",
{0},
{"get_name",{P},S},
{"get_display_name",{P},S},
{"get_description",{P},S},
{"get_executable",{P},S},
{"get_commandline",{P},S},
{"get_icon",{P},P,0,GIcon},
{"launch",{P,P,P,P},B},
{"supports_files",{P},B},
{"supports_uris",{P},B},
{"launch_uris",{P,P,P,P},B},
{"should_show",{P},B},
{"can_delete",{P},B},
{"delete",{P},B},
{"set_as_default_for_type",{P,S,P},B},
{"set_as_default_for_extension",{P,S,P},B},
{"add_supports_type",{P,S,P},B},
{"can_remove_supports_type",{P},B},
{"remove_supports_type",{P,S,P},B},
{"get_all",{},P,0,GList},
"GAppInfo"}
widget[GFile] = {"g_file",
{GObject},
{"new",{P},-routine_id("newGFile")},
{"get_parse_name",{P},S},
{"parse_name",{S},P},
{"equal",{P,P},B},
{"get_basename",{P},S},
{"get_path",{P},S},
{"get_uri",{P},S},
{"get_parse_name",{P},S},
{"get_parent",{P},P,0,GFile},
{"has_parent",{P,P},B},
{"get_child",{P,S},P,0,GFile},
{"get_child_for_display_name",{P,S,P},P,0,GFile},
{"has_prefix",{P,P},B},
{"get_relative_path",{P,P},S},
{"resolve_relative_path",{P,S},P,0,GFile},
{"is_native",{P},B},
{"has_uri_scheme",{P,S},B},
{"get_uri_scheme",{P},S},
{"read",{P,P,P},P,0,GFileInputStream},
"GFile"}
-- create a GFile from a path or uri
function newGFile(object s)
if file_exists(canonical_path(locate_file(s))) then
return gtk_func("g_file_new_for_path",{P},
{allocate_string(canonical_path(locate_file(s)),1)})
else
return gtk_func("g_file_new_for_uri",{P},
{allocate_string(s,1)})
end if
return 0
end function
widget[GIcon] = {"g_icon",
{GObject},
{"hash",{P},I},
{"equal",{P,P},B},
{"to_string",{P},S},
{"new_for_string",{S,P},P},
{"new",{S},-routine_id("newGIcon")},
{"serialize",{P},P},
{"deserialize",{P},P,0,GIcon},
"GIcon"}
function newGIcon(object s)
if string(s) then s = allocate_string(s,1) end if
return gtk_func("g_icon_new_for_string",{P,P},{s,0})
end function
widget[GFileIcon] = {"g_file_icon",
{GIcon,GObject},
{"new",{P},P},
{"get_file",{P},P},
"GFileIcon"}
widget[GFileInfo] = {"g_file_info",
{GObject},
{"new",{},P},
{"get_name",{P},S},
{"get_display_name",{P},S},
{"get_edit_name",{P},S},
{"get_icon",{P},P,0,GIcon},
{"get_symbolic_icon",{P},P,0,GIcon},
{"get_content_type",{P},S},
{"get_size",{P},I},
{"get_modification_time",{P,P}},
{"get_symlink_target",{P},S},
{"get_etag",{P},S},
{"get_sort_order",{P},I},
{"get_deletion_date",{P},P,0,GDateTime},
{"set_is_hidden",{P,B}},
{"set_is_symlink",{P,B}},
{"set_name",{P,S}},
{"set_display_name",{P,S}},
{"set_edit_name",{P,S}},
{"set_icon",{P,P}},
{"set_symbolic_icon",{P,P}},
{"set_content_type",{P,S}},
{"set_size",{P,I}},
"GFileInfo"}
widget[GList] = {"g_list",
{GObject},
{"new",{},-routine_id("newGList")},
{"append",{P,P},P},
{"length",{P},I},
{"nth_data",{P,I},P},
"GList"}
function newGList()
atom x = allocate(64) x = 0 -- keep;
return x
end function
widget[GSList] = {"g_slist",
{GObject},
{"length",{P},I},
"GSList"}
object temp_list
export function unpack_gs_str_list(atom gs)
if gs = 0 then return 1 end if
atom fn = call_back(routine_id("gs_str_each"))
temp_list = {}
gtk_proc("g_slist_foreach",{P,P,P},{gs,fn,0})
return temp_list
end function
function gs_str_each(object x)
if x > 0 then
temp_list = append(temp_list,peek_string(x))
end if
return 1
end function
export function unpack_gs_atom_list(object gs)
temp_list = {}
atom fn = call_back(routine_id("gs_atom_each"))
gtk_proc("g_slist_foreach",{P,P,P},{gs,fn,0})
return temp_list
end function
function gs_atom_each(object x)
temp_list = append(temp_list,x)
return 1
end function
widget[GdkDisplay] = {"gdk_display",
{GObject},
{"new",{},-routine_id("newGdkDisplay")}, -- alias get_default;
{"open",{S},P,0,GdkDisplay},
{"get_name",{P},S},
{"get_n_screens",{P},I},
{"get_screen",{P,I},P,0,GdkScreen},
{"get_default_screen",{P},P,0,GdkScreen},
{"get_device_manager",{P},P,0,GdkDeviceManager},
{"device_is_grabbed",{P,P},B},
{"beep",{P}},
{"sync",{P}},
{"flush",{P}},
{"close",{P}},
{"is_closed",{P},B},
{"get_event",{P},P,0,GdkEvent},
{"peek_event",{P},P,0,GdkEvent},
{"put_event",{P,P}},
{"has_pending",{P},B},
{"set_double_click_time",{P,I}},
{"set_double_click_distance",{P,I}},
{"supports_cursor_color",{P},B},
{"supports_cursor_alpha",{P},B},
{"get_default_cursor_size",{P},I},
{"get_maximal_cursor_size",{P,I,I}},
{"get_default_group",{P},P,0,GdkWindow},
{"supports_selection_notification",{P},B},
{"request_selection_notification",{P,P},B},
{"supports_clipboard_persistence",{P},B},
{"store_clipboard",{P,P,I,P,I}},
{"supports_shapes",{P},B},
{"supports_input_shapes",{P},B},
{"supports_composite",{P},B}, -- deprecated 3.16
{"get_app_launch_context",{P},P,0,GtkAppLaunchContext},
{"notify_startup_complete",{P,S}},
"GdkDisplay"}
function newGdkDisplay() -- alias;
return gtk_func("gdk_display_get_default",{})
end function
widget[GdkDevice] = {"gdk_device",
{GObject},
{"get_name",{P},S},
{"get_device_type",{P},I},
{"get_display",{P},P,0,GdkDisplay},
{"get_has_cursor",{P},B},
{"get_n_axes",{P},I},
{"get_n_keys",{P},I},
{"warp",{P,P,I,I}},
{"grab",{P,P,I,B,I,P,P},I},
{"ungrab",{P,P}},
{"get_state",{P,P,D,P}},
{"get_position",{P,P,I,I}},
{"get_position_double",{P,P,D,D}},
{"get_window_at_position",{P,I,I},P,0,GdkWindow},
{"get_window_at_position_double",{P,D,D},P,0,GdkWindow},
{"get_history",{P,P,P,P,P,I},B},
{"free_history",{P,I}},
{"get_vendor_id",{P},S},
{"get_product_id",{P},S},
{"get_source",{P},P,0,GdkInputSource},
{"set_mode",{P,I},B},
{"get_mode",{P},I},
{"set_key",{P,I,I,I}},
{"get_key",{P,I,I,I},B},
{"get_axis",{P,D,I,D},B},
{"list_axes",{P},A,0,GList},
{"get_axis_value",{P,D,P,D},B},
{"get_last_event_window",{P},P,0,GdkWindow},
{"set_axis_use",{P,I,I}},
{"get_axis_use",{P,I},I},
{"get_associated_device",{P},P,0,GdkDevice},
{"list_slave_devices",{P},A,0,GList},
{"get_position",{P,P,I,I}},
"GdkDevice"}
widget[GdkScreen] = {"gdk_screen",
{GdkDevice,GObject},
{"new",{},-routine_id("newGdkScreen")}, -- alias get_default;
{"get_system_visual",{P},P,0,GdkVisual},
{"get_rgba_visual",{P},P,0,GdkVisual},
{"is_composited",{P},B},
{"get_root_window",{P},P,0,GdkWindow},
{"get_display",{P},P,0,GdkDisplay},
{"get_number",{P},I},
{"get_width",{P},I},
{"get_height",{P},I},
{"get_width_mm",{P},I},
{"get_height_mm",{P},I},
{"list_visuals",{P},P,0,GList},
{"get_toplevel_windows",{P},P,0,GList},
{"make_display_name",{P},S},
{"get_n_monitors",{P},I},
{"get_primary_monitor",{P},I},
{"get_monitor_geometry",{P,I,P}},
{"get_monitor_workarea",{P,I,P}},
{"get_monitor_at_point",{P,I,I},I},
{"get_monitor_at_window",{P,P},I},
{"get_monitor_height_mm",{P,I},I},
{"get_monitor_width_mm",{P,I},I},
{"get_monitor_plug_name",{P,I},S},
{"get_setting",{P,S,P},B},
{"get_font_options",{P},P,0,CairoFontOptions},
{"get_resolution",{P},D},
{"set_resolution",{P,D}},
{"get_active_window",{P},P,0,GdkWindow},
{"get_window_stack",{P},P,0,GList},
"GdkScreen"}
function newGdkScreen() -- alias;
return gtk_func("gdk_screen_get_default",{})
end function
widget[GdkVisual] = {"gdk_visual",
{GObject},
"GdkVisual"}
widget[GThemedIcon] = {"g_themed_icon",
{GIcon,GObject},
{"new",{S},P},
{"new_with_default_fallbacks",{S},P},
{"get_names",{P},P},
"GThemedIcon"}
widget[GtkThemedIcon] = {"gtk_themed_icon",
{GObject},
"GtkThemedIcon"}
widget[GEmblem] = {"g_emblem",
{GObject},
{"new",{P},P},
{"get_icon",{P},P,0,GIcon},
"GEmblem"}
widget[GEmblemedIcon] = {"g_emblemed_icon",
{GIcon,GObject},
{"new",{P,P},P},
"GEmblemedIcon"}
widget[GdkDeviceManager] = {"gdk_device_manager",
{GObject},
{"new",{P},-routine_id("newDeviceManager")},
{"get_display",{P},P,0,GdkDisplay},
{"list_devices",{P,I},X,0,GList},
{"get_client_pointer",{P},P,0,GdkDevice},
"GdkDeviceManager"}
function newDeviceManager(atom disp=0)
if disp = 0 then
disp = gtk_func("gdk_display_get_default")
end if
return gtk_func("gdk_display_get_device_manager",{P},{disp})
end function
widget[GtkAppChooser] = {"gtk_app_chooser",
{GtkWidget},
{"get_app_info",{P},P,0,GAppInfo},
{"get_content_type",{P},S},
{"refresh",{P}},
"GtkAppChooser"}
widget[GtkAppChooserButton] = {"gtk_app_chooser_button",
{GtkComboBox,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkCellLayout,GtkCellEditable,GObject},
{"new",{S},P},
{"append_custom_item",{P,S,S,P}},
{"append_separator",{P}},
{"set_active_custom_item",{P,S}},
{"set_show_default_item",{P,B}},
{"get_show_default_item",{P},B},
{"set_show_dialog_item",{P,B}},
{"get_show_dialog_item",{P},B},
{"set_heading",{P,S}},
{"get_heading",{P},S},
"GtkAppChooserButton"}
widget[GMenu] = {"g_menu",
{GObject},
{"new",{},P},
{"append",{P,S,S}},
"GMenu"}
widget[GSettings] = {"g_settings",
{GObject},
{"new",{S},P},
{"set_value",{P,S,P},B},
{"get_value",{P},P},
{"get_user_value",{P,S},P},
"GSettings"}
widget[GtkApplication] = {"gtk_application",
{GApplication,GObject},
{"new",{S,I},-routine_id("newApplication")},
{"add_window",{P,P}},
{"remove_window",{P,P}},
{"get_windows",{P},A,0,GList},
{"get_window_by_id",{P,I},P,0,GtkWindow},
{"get_active_window",{P},P,0,GtkWindow},
{"inhibit",{P,P,I,S},I},
{"uninhibit",{P,I}},
{"is_inhibited",{P,I},B},
{"get_app_menu",{P},P,0,GMenuModel},
{"set_app_menu",{P,P}},
{"get_menubar",{P},P,0,GMenuModel},
{"set_menubar",{P,P}},
{"add_accelerator",{P,S,S,P}},
{"remove_accelerator",{P,S,P}},
{"run",{P},-routine_id("app_run")},
{"activate",{P},-routine_id("app_activate")},
{"get_accels_for_action",{P,S},V}, -- 3.12
{"set_accels_for_action",{P,S,S}}, -- 3.12
{"list_action_descriptions",{P},V},
{"get_actions_for_accel",{P,S},V}, -- 3.14
{"get_menu_by_id",{P,S},P,0,GMenu}, -- 3.14
{"prefers_app_menu",{},B}, -- 3.14
"GtkApplication"}
function app_activate(object x)
gtk_proc("g_application_activate",{P},{x})
return 1
end function
function app_run(object x)
gtk_proc("g_application_run",{P,I,P},{x,0,0})
return 1
end function
function newApplication(object id, object flags)
if string(id) then id = allocate_string(id,1) end if
if gtk_func("g_application_id_is_valid",{P},{id}) then
return gtk_func("gtk_application_new",{P,I},{id,flags})
else
crash("Error: invalid application id!")
end if
return 0
end function
widget[GtkApplicationWindow] = {"gtk_application_window",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P},P},
{"set_show_menubar",{P,B}},
{"get_show_menubar",{P},B},
{"set_help_overlay",{P,P}}, -- 3.20
{"get_help_overlay",{P},P,0,GtkShortcutsWindow}, -- 3.20
{"get_id",{P},I},
"GtkApplicationWindow"}
widget[GtkActionable] = {"gtk_actionable",
{GtkWidget},
{"get_action_name",{P},S},
{"set_action_name",{P,S}},
{"get_action_target_value",{P},P},
{"set_action_target_value",{P,P}},
{"set_action_target",{P,S,P}},
{"set_detailed_action_name",{P,S}},
"GtkActionable"}
-- Soon to be deprecated, but still used internally by Glade;
widget[GtkAlignment] = {"gtk_alignment",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{F,F,F,F},P},
{"set",{P,F,F,F,F}},
{"get_padding",{P,I,I,I,I}},
{"set_padding",{P,I,I,I,I}},
"GtkAlignment"}
widget[GtkAppLaunchContext] = {"gdk_app_launch_context",
{GdkAppLaunchContext,GObject},
{"set_screen",{P,P}},
{"set_desktop",{P,I}},
{"set_timestamp",{P,I}},
{"set_icon",{P,P}},
{"set_icon_name",{P,S}},
"GtkAppLaunchContext"}
widget[GtkAspectFrame] = {"gtk_aspect_frame",
{GtkFrame,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,F,F,F,B},P},
{"set",{P,F,F,F,B}},
"GtkAspectFrame"}
widget[GtkAssistant] = {"gtk_assistant",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_current_page",{P,I}},
{"get_current_page",{P},I},
{"get_n_pages",{P},I},
{"get_nth_page",{P,I},P,0,GtkWidget},
{"prepend_page",{P,P},I},
{"append_page",{P,P},I},
{"insert_page",{P,P,I},I},
{"remove_page",{P,I}},
{"set_forward_page_func",{P,P,P,P}},
{"set_page_type",{P,P,P}},
{"get_page_type",{P,P},I},
{"set_page_title",{P,P,S}},
{"get_page_title",{P,P},S},
{"set_page_complete",{P,P,B}},
{"get_page_complete",{P,P},B},
{"add_action_widget",{P,P}},
{"remove_action_widget",{P,P}},
{"update_buttons_state",{P}},
{"commit",{P}},
{"next_page",{P}},
{"previous_page",{P}},
{"get_page_has_padding",{P,P},B}, -- 3.18
{"set_page_has_padding",{P,P,B}}, -- 3.18
"GtkAssistant"}
widget[GtkDrag] = {"gtk_drag",
{0},
{"get_data",{P,P,P,P}},
{"get_source_widget",{P},P,0,GtkWidget},
{"highlight",{P}},
{"unhighlight",{P}},
{"begin_with_coordinates",{P,P,P,I,P,I,I},P},
{"finish",{P,B,B,P}},
{"set_icon_widget",{P,P,I,I}},
{"set_icon_pixbuf",{P,P,I,I}},
{"set_icon_surface",{P,P}},
{"set_icon_name",{P,P,I,I}},
{"set_icon_gicon",{P,P,I,I}},
{"set_icon_default",{P}},
{"check_threshold",{P,I,I,I,I},B},
{"cancel",{P}}, -- 3.16
"GtkDrag"}
widget[GtkDragSource] = {"gtk_drag_source",
{GtkDrag},
{"set",{P,I,P,I,I}},
{"set_icon_pixbuf",{P,P}},
{"set_icon_name",{P,S}},
{"set_icon_gicon",{P,P}},
{"unset",{P}},
{"set_target_list",{P,P}},
{"get_target_list",{P},P,0,GtkTargetList},
{"add_text_targets",{P}},
{"add_image_targets",{P}},
{"add_uri_targets",{P}},
"GtkDragSource"}
widget[GtkDragDest] = {"gtk_drag_dest",
{GtkDrag},
{"set",{P,I,P,I,I}},
{"set_proxy",{P,P,I,B}},
{"unset",{P}},
{"find_target",{P,P,P},P},
{"get_target_list",{P},P,0,GtkTargetList},
{"set_target_list",{P,P}},
{"add_text_targets",{P}},
{"add_image_targets",{P}},
{"add_uri_targets",{P}},
{"set_track_motion",{P,B}},
{"get_track_motion",{P},B},
"GtkDragDest"}
widget[GtkCssProvider] = {"gtk_css_provider",
{GObject},
{"new",{P},-routine_id("new_css_provider")},
{"get_default",{},P,0,GtkCssProvider},
{"get_named",{S,S},P,0,GtkCssProvider},
{"load_from_data",{P,S,I,P},B},
{"load_from_file",{P,S,P},B},
{"load_from_path",{P,S,P},B},
{"load_from_resource",{P,S}}, -- 3.16
{"to_string",{P},S},
"GtkCssProvider"}
function new_css_provider(object name=0)
atom provider = gtk_func("gtk_css_provider_get_default")
atom style = create(GtkStyleContext)
atom screen = get(style,"screen")
atom err = allocate(64,1) err = 0
register(provider,GtkCssProvider)
if atom(name) then
set(style,"add provider for screen",screen,provider,800)
return provider
end if
if file_exists(canonical_path(locate_file(name))) then
if gtk_func("gtk_css_provider_load_from_path",{P,P,P},
{provider,allocate_string(canonical_path(locate_file(name)),1),err}) then
set(style,"add provider for screen",screen,provider,800)
return provider
else
printf(1,"Error finding or parsing css from path: %s \n",
{canonical_path(locate_file(name))})
end if
end if
if string(name) then
integer len = length(name)
name = allocate_string(name,1)
if gtk_func("gtk_css_provider_load_from_data",{P,P,I,P},{provider,name,len,err}) then
set(style,"add provider for screen",screen,provider,800)
end if
end if
return provider
end function
widget[GtkCssSection] = {"gtk_css_section",
{GObject},
{"get_end_line",{P},I},
{"get_end_position",{P},I},
{"get_file",{P},P,0,GFile},
{"get_parent",{P},P,0,GtkCssSection},
{"get_section_type",{P},I},
{"get_start_line",{P},I},
{"get_start_position",{P},I},
"GtkCssSection"}
widget[GtkStatusIcon] = {"gtk_status_icon", -- deprecated 3.14
{GObject},
{"new",{},P,0,GObject},
{"new_from_pixbuf",{P},P},
{"new_from_file",{S},P},
{"new_from_icon_name",{S},P},
{"new_from_gicon",{P},P},
{"set_from_pixbuf",{P,P}},
{"set_from_file",{P,S}},
{"set_from_icon_name",{P,S}},
{"set_from_gicon",{P,P}},
{"get_storage_type",{P},I},
{"get_pixbuf",{P},P,0,GdkPixbuf},
{"get_icon_name",{P},S},
{"get_gicon",{P},P},
{"get_size",{P},I},
{"set_screen",{P,P}},
{"get_screen",{P},P,0,GdkScreen},
{"set_tooltip_text",{P,S}},
{"get_tooltip_text",{P},S},
{"set_tooltip_markup",{P,S}},
{"get_tooltip_markup",{P},S},
{"set_has_tooltip",{P,B}},
{"get_has_tooltip",{P},P},
{"set_title",{P,S}},
{"get_title",{P},S},
{"set_name",{P,S}},
{"set_visible",{P,B}},
{"get_visible",{P},B},
{"is_embedded",{P},B},
{"get_geometry",{P,P,P,I},B},
{"get_x11_window_id",{P},I},
{"position_menu",{P,P,I,I,B},-routine_id("si_position_menu")},
"GtkStatusIcon"}
function si_position_menu(atom stat, atom menu, integer x, integer y, integer p)
atom fn = define_proc("gtk_status_icon_position_menu",{P,I,I,I,P})
c_proc(fn,{menu,x,y,p,stat}) -- menu and status_icon params swapped;
return 1
end function
widget[GtkOffscreenWindow] = {"gtk_offscreen_window",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"get_surface",{P},P,0,CairoSurface_t},
{"get_pixbuf",{P},P,0,GdkPixbuf},
"GtkOffscreenWindow"}
widget[GtkComboBox] = {"gtk_combo_box",
{GtkBin,GtkContainer,GtkWidget,GtkCellLayout,GtkCellEditable,GtkBuildable,GObject},
{"new",{P},-routine_id("newComboBox")},
{"set_wrap_width",{P,I}},
{"get_wrap_width",{P},I},
{"set_row_span_column",{P,I}},
{"get_row_span_column",{P},I},
{"set_column_span_column",{P,I}},
{"get_column_span_column",{P},I},
{"set_active",{P,I}},
{"get_active",{P},I},
{"set_id_column",{P,I}},
{"get_id_column",{P},I},
{"set_active_id",{P,S},B},
{"get_active_id",{P},S},
{"set_model",{P,P}},
{"get_model",{P},P,0,GtkTreeModel},
{"popup_for_device",{P,P}},
{"popup",{P}},
{"popdown",{P}},
{"set_row_separator_func",{P,P,P,P}},
{"get_row_separator_func",{P},P},
{"set_add_tearoffs",{P,B}}, -- deprecated 3.10
{"get_add_tearoffs",{P},B}, -- deprecated 3.10
{"set_title",{P,S}}, -- deprecated 3.10
{"get_title",{P},S}, -- deprecated 3.10
{"set_focus_on_click",{P,B}},
{"get_focus_on_click",{P},B},
{"set_button_sensitivity",{P,I}},
{"get_button_sensitivity",{P},I},
{"get_has_entry",{P},B},
{"set_entry_text_column",{P,I}},
{"get_entry_text_column",{P},I},
{"set_popup_fixed_width",{P,B}},
{"get_popup_fixed_width",{P},B},
{"set_activates_default",{P,B},-routine_id("combo_set_activates_default")},
{"get_entry",{P},-routine_id("combo_get_entry")},
"GtkComboBox"}
-- create a combo box either empty or from a model
function newComboBox(object x=0)
if x = 0 then
return gtk_func("gtk_combo_box_new",{},{})
end if
if class_id(x) = GtkListStore then
return gtk_func("gtk_combo_box_new_with_model",{P},{x})
end if
end function
function combo_get_entry(atom box)
atom x = get(box,"child")
register(x,GtkEntry)
return x
end function
function combo_set_activates_default(atom box, boolean z)
atom x = get(box,"child")
register(x,GtkEntry)
set(x,"property","activates-default",z)
return 1
end function
widget[GtkComboBoxText] = {"gtk_combo_box_text",
{GtkCellLayout,GtkCellEditable,GtkComboBox,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"new_with_entry",{},P},
{"append",{P,S,S}},
{"prepend",{P,S,S}},
{"insert",{P,I,S,S}},
{"append_text",{P,S}},
{"prepend_text",{P,S}},
{"insert_text",{P,I,S}},
{"remove",{P,I}},
{"remove_all",{P}},
{"get_active_text",{P},S},
"GtkComboBoxText"}
widget[GtkComboBoxEntry] = {"gtk_combo_box_text",
{GtkComboBoxText,GtkComboBox,GtkBin,GtkContainer,GtkWidget,GObject},
{"new",{},-routine_id("new_combo_box_entry")},
"GtkComboBoxEntry"}
function new_combo_box_entry() -- alias;
return gtk_func("gtk_combo_box_text_new_with_entry",{},{})
end function
widget[GtkFrame] = {"gtk_frame",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S},P},
{"set_label",{P,S}},
{"get_label",{P},S},
{"set_label_align",{P,F,F}},
{"get_label_align",{P,F,F}},
{"set_label_widget",{P,P}},
{"get_label_widget",{P},P,0,GtkWidget},
{"set_shadow_type",{P,I}},
{"get_shadow_type",{P},I},
"GtkFrame"}
widget[GtkModelButton] = {"gtk_model_button", -- new in 3.16
{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{},P},
"GtkModelButton"}
widget[GtkButton] = {"gtk_button",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},-routine_id("newButton")},
{"new_from_icon_name",{S,I},P,0,GtkWidget}, -- 3.10
{"set_relief",{P,I}},
{"get_relief",{P},I},
{"set_label",{P,S}},
{"get_label",{P},S},
{"set_use_underline",{P,B}},
{"get_use_underline",{P},B},
{"set_focus_on_click",{P,B}},
{"get_focus_on_click",{P},B},
{"set_alignment",{P,F,F}}, -- deprecated 3.14
{"get_alignment",{P,F,F}}, -- deprecated 3.15
{"set_image",{P,P},-routine_id("setBtnImage")},
{"get_image",{P},P,0,GtkImage},
{"set_image_position",{P,I}},
{"get_image_position",{P},I},
{"set_always_show_image",{P,B}}, -- GTK 3.6+
{"get_always_show_image",{P},B}, -- GTK 3.6+
{"get_event_window",{P},P,0,GdkWindow},
"GtkButton"}
function setBtnImage(atom btn, object img)
------------------------------------------
if class_id(img) = GdkPixbuf then
img = create(GtkImage,img)
end if
if string(img) then
if file_exists(canonical_path(img)) then
img = canonical_path(img)
elsif file_exists(canonical_path("~" & img)) then
img = canonical_path("~" & img)
end if
img = create(GdkPixbuf,img,20,20,1)
img = create(GtkImage,img)
end if
if atom(img) then
gtk_proc("gtk_button_set_image",{P,P},{btn,img})
end if
return 1
end function
-- handles creation of buttons with icons from various sources;
-- this function modified greatly from earlier versions, in order
-- to circumvent the misguided idea that buttons, menus, etc. should not have
-- icons (even though window managers have settings to show or hide these
-- icons as the USER prefers)
function newButton(object cap = 0)
----------------------------------
atom btn = 0
object tmp, t1, box, lbl = 0, icon = 0
if atom(cap) then
if cap = 0 then -- blank button;
btn = gtk_func("gtk_button_new",{})
register(btn,GtkButton)
return btn
else
btn = gtk_func("gtk_button_new",{})
register(btn,GtkButton)
set(btn,"use underline",TRUE)
if class_id(cap) = GdkPixbuf then -- convert to image;
cap = create(GtkImage,cap)
end if
if class_id(cap) = GtkImage then
set(btn,"image",cap) -- add image to btn
set(btn,"always show image",BTN_SHOW_IMG)
end if
return btn
end if
end if
if string(cap) then
if match("#",cap) = 0 then
btn = gtk_func("gtk_button_new_from_stock",{P},{allocate_string(cap)})
register(btn,GtkButton)
set(btn,"always show image",BTN_SHOW_IMG)
set(btn,"use underline",TRUE)
return btn
end if
tmp = split(cap,'#')
btn = gtk_func("gtk_button_new_with_mnemonic",{P},{allocate_string(tmp[2],1)})
register(btn,GtkButton)
set(btn,"use underline",TRUE)
t1 = canonical_path(locate_file(tmp[1]))
if match("gtk-",cap) = 1 then
btn = gtk_func("gtk_button_new")
register(btn,GtkButton)
box = create(GtkBox,0,5)
add(btn,box)
icon = create(GtkImage,tmp[1],ceil(BTN_ICON_SIZE/10))
if icon > 0 then add(box,icon) end if
if length(tmp[2]) > 0 then
lbl = gtk_func("gtk_label_new_with_mnemonic",{P},{allocate_string(tmp[2])})
register(lbl,GtkLabel)
set(lbl,"font",sprintf("%d",BTN_TEXT_SIZE))
add(box,lbl)
end if
set(btn,"always show image",BTN_SHOW_IMG)
set(btn,"use underline",TRUE)
return btn
elsif file_exists(t1) then
icon = create(GdkPixbuf,t1,BTN_ICON_SIZE,0,1)
else
icon = create(GtkImage,tmp[1],BTN_ICON_SIZE,0,1)
end if
set(btn,"image",icon)
set(btn,"always show image",BTN_SHOW_IMG)
set(btn,"use underline",TRUE)
return btn
end if
btn = gtk_func("gtk_button_new",{})
register(btn,GtkButton)
return btn
end function
widget[GtkToggleButton] = {"gtk_toggle_button",
{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},-routine_id("newToggleButton")},
{"new_with_label",{S},P},
{"new_with_mnemonic",{S},P},
{"set_mode",{P,B}},
{"get_mode",{P},B},
{"toggled",{P}},
{"set_active",{P,B}},
{"get_active",{P},B},
{"set_inconsistent",{P,B}},
{"get_inconsistent",{P},B},
"GtkToggleButton"}
function newToggleButton(object cap = 0)
atom btn = 0
object tmp, t1, icon = 0
if atom(cap) then
if cap = 0 then -- blank button;
btn = gtk_func("gtk_toggle_button_new",{})
register(btn,GtkToggleButton)
return btn
else
btn = gtk_func("gtk_toggle_button_new",{})
register(btn,GtkToggleButton)
if class_id(cap) = GdkPixbuf then -- convert to image;
cap = create(GtkImage,cap)
end if
if class_id(cap) = GtkImage then
set(btn,"image",cap) -- add image to btn
set(btn,"always show image",BTN_SHOW_IMG)
end if
return btn
end if
end if
if string(cap) then
if match("#",cap) = 0 then
btn = gtk_func("gtk_toggle_button_new_with_mnemonic",{P},{allocate_string(cap)})
register(btn,GtkToggleButton)
return btn
end if
tmp = split(cap,'#')
btn = gtk_func("gtk_toggle_button_new_with_mnemonic",{P},{allocate_string(tmp[2],1)})
register(btn,GtkToggleButton)
t1 = canonical_path(locate_file(tmp[1]))
if match("gtk-",cap) = 1 then
icon = create(GtkImage,tmp[1],ceil(BTN_ICON_SIZE/5))
elsif file_exists(t1) then
icon = create(GdkPixbuf,t1,BTN_ICON_SIZE,0,1)
else
icon = create(GtkImage,tmp[1],BTN_ICON_SIZE,0,1)
end if
set(btn,"image",icon)
set(btn,"always show image",BTN_SHOW_IMG)
return btn
end if
btn = gtk_func("gtk_toggle_button_new",{})
register(btn,GtkToggleButton)
return btn
end function
widget[GtkCheckButton] = {"gtk_check_button",
{GtkToggleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},-routine_id("newCheckButton")},
{"new_with_label",{S},P,0,GtkCheckButton},
{"new_with_mnemonic",{S},P,0,GtkCheckButton},
"GtkCheckButton"}
function newCheckButton(object cap = 0)
atom btn = 0
object tmp, t1, icon = 0
if atom(cap) then
if cap = 0 then -- blank button;
btn = gtk_func("gtk_check_button_new",{})
register(btn,GtkCheckButton)
return btn
else
btn = gtk_func("gtk_check_button_new",{})
register(btn,GtkCheckButton)
if class_id(cap) = GdkPixbuf then -- convert to image;
cap = create(GtkImage,cap)
end if
if class_id(cap) = GtkImage then
set(btn,"image",cap) -- add image to btn
set(btn,"always show image",BTN_SHOW_IMG)
end if
return btn
end if
end if
if string(cap) then
if match("#",cap) = 0 then
btn = gtk_func("gtk_check_button_new_with_mnemonic",{P},{allocate_string(cap)})
register(btn,GtkCheckButton)
return btn
end if
tmp = split(cap,'#')
btn = gtk_func("gtk_check_button_new_with_mnemonic",{P},{allocate_string(tmp[2],1)})
register(btn,GtkCheckButton)
t1 = canonical_path(locate_file(tmp[1]))
if match("gtk-",cap) = 1 then
icon = create(GtkImage,tmp[1],ceil(BTN_ICON_SIZE/5))
elsif file_exists(t1) then
icon = create(GdkPixbuf,t1,BTN_ICON_SIZE,0,1)
else
icon = create(GtkImage,tmp[1],BTN_ICON_SIZE,0,1)
end if
set(btn,"image",icon)
set(btn,"always show image",BTN_SHOW_IMG)
return btn
end if
btn = gtk_func("gtk_check_button_new",{})
register(btn,GtkCheckButton)
return btn
end function
widget[GtkRadioButton] = {"gtk_radio_button",
{GtkCheckButton,GtkToggleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P},-routine_id("newRadioButton")},
{"set_group",{P,P}},
{"get_group",{P},P},
{"join_group",{P,P}},
"GtkRadioButton"}
function newRadioButton(atom group=0, object cap = 0)
atom btn = 0
object tmp, t1, icon = 0
if atom(cap) then
if cap = 0 then -- blank button;
btn = gtk_func("gtk_radio_button_new",{P},{group})
register(btn,GtkRadioButton)
return btn
else
btn = gtk_func("gtk_radio_button_new",{P},{group})
register(btn,GtkRadioButton)
if class_id(cap) = GdkPixbuf then -- convert to image;
cap = create(GtkImage,cap)
end if
if class_id(cap) = GtkImage then
set(btn,"image",cap) -- add image to btn
set(btn,"always show image",BTN_SHOW_IMG)
end if
return btn
end if
end if
if string(cap) then
if match("#",cap) = 0 then
btn = gtk_func("gtk_radio_button_new_with_mnemonic_from_widget",{P,P},{group,cap})
register(btn,GtkRadioButton)
return btn
end if
tmp = split(cap,'#')
btn = gtk_func("gtk_radio_button_new_with_mnemonic_from_widget",{P,P},{group,allocate_string(tmp[2],1)})
register(btn,GtkRadioButton)
t1 = canonical_path(locate_file(tmp[1]))
if match("gtk-",cap) = 1 then
icon = create(GtkImage,tmp[1],ceil(BTN_ICON_SIZE/5))
elsif file_exists(t1) then
icon = create(GdkPixbuf,t1,BTN_ICON_SIZE,0,1)
else
icon = create(GtkImage,tmp[1],BTN_ICON_SIZE,0,1)
end if
set(btn,"image",icon)
set(btn,"always show image",BTN_SHOW_IMG)
return btn
end if
btn = gtk_func("gtk_radio_button_new",{P},{group})
register(btn,GtkRadioButton)
return btn
end function
widget[GtkColorButton] = {"gtk_color_button",
{GtkColorChooser,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},-routine_id("newColorButton")},
{"set_title",{P,S}},
{"get_title",{P},S},
{"show_editor",{P,B}}, -- 3.20
"GtkColorButton"}
function newColorButton(object c=0)
if string(c) then c = to_rgba(c) end if
if c=0 then return gtk_func("gtk_color_button_new")
else return gtk_func("gtk_color_button_new_with_rgba",{P},{c})
end if
end function
widget[GtkFontButton] = {"gtk_font_button",
{GtkFontChooser,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkActionable,GtkBuildable,GObject},
{"new",{P,P,P},-routine_id("newFontButton")},
{"set_font_name",{P,S}},
{"get_font_name",{P},S},
{"set_show_style",{P,B}},
{"get_show_style",{P},B},
{"set_show_size",{P,B}},
{"get_show_size",{P},B},
{"set_use_font",{P,B}},
{"get_use_font",{P},B},
{"set_use_size",{P,B}},
{"get_use_size",{P},B},
{"set_title",{P,S}},
{"get_title",{P},S},
"GtkFontButton"}
function newFontButton(object f=0, object fn=0, object data=0)
if string(f) then f = allocate_string(f,1) end if
atom fnt
if f = 0 then
fnt = gtk_func("gtk_font_button_new")
else fnt = gtk_func("gtk_font_button_new_with_font",{P},{f})
end if
if string(fn) or fn > 0 then
connect(fnt,"font-set",fn,data)
end if
return fnt
end function
widget[GtkLinkButton] = {"gtk_link_button",
{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{S,S},-routine_id("newLinkButton")},
{"set_uri",{P,S}},
{"get_uri",{P},S},
{"set_visited",{P,B}},
{"get_visited",{P},B},
"GtkLinkButton"}
function newLinkButton(object link, object lbl=0)
if lbl = 0 then return gtk_func("gtk_link_button_new",{S},{link})
else return gtk_func("gtk_link_button_new_with_label",{S,S},{link,lbl})
end if
end function
widget[GtkLockButton] = {"gtk_lock_button", -- unable to make this work!
{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},P},
{"set_permission",{P,P}},
{"get_permission",{P},P,0,GPermission},
"GtkLockButton"}
widget[GPermission] = {"g_permission",
{GObject},
{"get_allowed",{P},B},
{"get_can_acquire",{P},B},
{"get_can_release",{P},B},
{"acquire",{P,P,P},B},
{"acquire_async",{P,P,P,P}},
{"acquire_finish",{P,P,P},B},
{"release",{P,P,P},B},
{"release_async",{P,P,P,P}},
{"finish",{P,P,P},B},
{"impl_update",{P,B,B,B}},
"GPermission"}
widget[GSimplePermission] = {"g_simple_permission",
{GPermission},
{"new",{B},P},
"GSimplePermission"}
widget[GtkScaleButton] = {"gtk_scale_button",
{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkActionable,GObject},
{"new",{I,D,D,D,P},P},
{"set_adjustment",{P,P}},
{"get_adjustment",{P},P,0,GtkAdjustment},
{"set_value",{P,D}},
{"get_value",{P},D},
{"get_popup",{P},P,0,GtkWidget},
{"get_plus_button",{P},P,0,GtkButton},
{"get_minus_button",{P},P,0,GtkButton},
{"set_icons",{P,A}},
"GtkScaleButton"}
widget[GtkMenu] = {"gtk_menu",
{GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P},-routine_id("newMenu")},
{"attach",{P,P,I,I,I,I}},
{"attach_to_widget",{P,P,P}},
{"get_attach_widget",{P},P,0,GtkWidget},
{"get_for_attach_widget",{P},P,0,GList},
{"detach",{P}},
{"popup",{P,P,P,P,P,I,I}},
{"popdown",{P}},
{"reposition",{P}},
{"set_active",{P,I}},
{"get_active",{P},P,0,GtkMenuItem},
{"popup_for_device",{P,P,P,P,P,P,P,I,I}},
{"set_accel_group",{P,P}},
{"get_accel_group",{P},P,0,GtkAccelGroup},
{"set_accel_path",{P,S}},
{"get_accel_path",{P},S},
{"set_title",{P,S}}, -- deprecated 3.10
{"get_title",{P},S}, -- deprecated 3.10
{"set_monitor",{P,I}},
{"get_monitor",{P},I},
{"set_tearoff_state",{P,B}}, -- deprecated 3.10
{"get_tearoff_state",{P},B}, -- deprecated 3.10
{"set_reserve_toggle_size",{P,B}},
{"get_reserve_toggle_size",{P},B},
{"set_screen",{P,P}},
{"popup_at_pointer",{P,P}}, -- 3.22
{"popup_at_rect",{P,P,P,I,I,P}}, -- 3.22
{"popup_at_widget",{P,P,I,I,P}}, -- 3.22
"GtkMenu"}
function newMenu(object x=0)
if class_id(x) = GMenuModel then
return gtk_func("gtk_menu_new_from_model",{P},{x})
else
return gtk_func("gtk_menu_new")
end if
end function
widget[GtkMenuBar] = {"gtk_menu_bar",
{GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P},-routine_id("newMenuBar")},
{"set_pack_direction",{P,I}},
{"get_pack_direction",{P},I},
{"set_child_pack_direction",{P,I}},
{"get_child_pack_direction",{P},I},
"GtkMenuBar"}
function newMenuBar(atom x=0)
if class_id(x) = GMenuModel then
return gtk_func("gtk_menu_bar_new_from_model",{P},{x})
else
return gtk_func("gtk_menu_bar_new")
end if
end function
widget[GMenu] = {"g_menu",
{GMenuModel,GObject},
{"new",{},P},
{"freeze",{P}},
{"insert",{P,I,S,S}},
{"prepend",{P,S,S}},
{"append",{P,S,S}},
{"insert_item",{P,I,P}},
{"append_item",{P,P}},
{"prepend_item",{P,P}},
{"insert_section",{P,I,S,P}},
{"prepend_section",{P,S,P}},
{"append_section",{P,S,P}},
{"append_submenu",{P,S,P}},
{"insert_submenu",{P,I,S,P}},
{"prepend_submenu",{P,S,P}},
{"remove",{P,I}},
"GMenu"}
widget[GMenuModel] = {"g_menu_model",
{GObject},
{"is_mutable",{P},B},
{"get_n_items",{P},I},
{"get_item_attribute",{P,I,S,S,P},B},
{"get_item_link",{P,I,S},P,0,GMenuModel},
{"items_changed",{P,I,I,I}},
"GMenuModel"}
widget[GMenuItem] = {"g_menu_item",
{GObject},
{"new",{S,S},P},
{"new_section",{S,P},P,0,GMenuItem},
{"new_submenu",{S,P},P,0,GMenuItem},
{"set_label",{P,S}},
{"set_action_and_target_value",{P,S,P}},
{"set_detailed_action",{P,S}},
{"set_section",{P,P}},
{"set_submenu",{P,P}},
{"set_attribute_value",{P,P,P}},
{"set_link",{P,S,P}},
"GMenuItem"}
widget[GtkMenuButton] = {"gtk_menu_button", --3.6
{GtkToggleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{},P},
{"set_popup",{P,P}},
{"get_popup",{P},P,0,GtkMenu},
{"set_menu_model",{P,P}},
{"get_menu_model",{P},P,0,GMenuModel},
{"set_direction",{P,I}},
{"get_direction",{P},I},
{"set_align_widget",{P,P}},
{"get_align_widget",{P},P,0,GtkWidget},
{"set_popover",{P,P}}, -- 3.12
{"get_popover",{P},P,0,GtkPopover}, -- 3.12
{"set_use_popover",{P,B}}, -- 3.12
{"get_use_popover",{P},B}, -- 3.12
"GtkMenuButton"}
widget[GtkMenuItem] = {"gtk_menu_item",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P,P,P},-routine_id("newMenuItem")},
{"set_label",{P,S},-routine_id("mi_set_label")},
{"get_label",{P},-routine_id("mi_get_label")},
{"set_image",{P,P},-routine_id("mi_set_image")},
{"get_image",{P},-routine_id("mi_get_image")},
{"set_use_underline",{P,B}},
{"get_use_underline",{P},B},
{"set_submenu",{P,P}},
{"get_submenu",{P},P,0,GtkWidget},
{"select",{P}},
{"deselect",{P}},
{"activate",{P}},
{"toggle_size_allocate",{P,I}},
{"set_reserve_indicator",{P,B}},
{"get_reserve_indicator",{P},B},
{"add_accelerator",{P,P,P},-routine_id("mi_add_accelerator")},
"GtkMenuItem"}
-- all this just to allow images and accels on menu items!
constant activate = allocate_string("activate")
function newMenuItem(object stk=0, object fn=0, object data=0, object accels=0)
object item, img = 0
if match("#",stk) then
stk = split(stk,'#')
img = stk[1]
stk = stk[2]
goto "next"
end if
if not match("#",stk) then
if match("gtk-",stk) then
img = stk
stk = "_" & proper(stk[5..$])
end if
end if
label "next"
item = gtk_func("gtk_menu_item_new_with_mnemonic",{P},{allocate_string(stk,1)})
register(item,GtkMenuItem)
label "accels "
if atom(img) and img = 0 then
item = mi_add_accelerator(item,accels)
else
item = mi_add_accelerator(item,accels,img)
end if
return item
end function
function mi_add_accelerator(atom item, object accels, object img = 0)
atom x = allocate(8,1)
integer key, mods
object child = get(item,"child")
if atom(img) and img = 0 then -- do nothing
else
img = get_icon_image(img,3)
end if
if sequence(accels) then
gtk_proc("gtk_accelerator_parse", {P,P,P},
{allocate_string(accels[2],1),x,x+4})
key = peek4u(x) mods = peek4u(x+4)
gtk_proc("gtk_widget_add_accelerator",{P,P,P,I,I,I},
{item,activate,accels[1],key,mods,GTK_ACCEL_VISIBLE})
if class_id(child) = -1 then
gtk_proc("gtk_accel_label_set_accel_widget",{P,P},{child,item})
gtk_proc("gtk_accel_label_set_accel",{P,I,I},{child,key,mods})
end if
end if
gtk_proc("g_object_ref",{P},{child})
gtk_proc("gtk_container_remove",{P,P},{item,child})
atom box = create(GtkButtonBox)
set(box,"margin left",0)
set(box,"layout",GTK_BUTTONBOX_START)
if atom(img) and img > 0 then
add(box,img)
register(img,GtkImage)
set(box,"halign",0)
set(img,"margin left",0)
set(img,"margin right",0)
set(box,"child non_homogeneous",img,TRUE)
end if
register(child,GtkAccelLabel)
pack_start(box,child,1,1) -- put the label back
set(box,"child non_homogeneous",child,TRUE)
set(child,"halign",0)
set(child,"margin left",0)
if sequence(accels) then
object txt = gtk_str_func("gtk_accelerator_get_label",{I,I},{key,mods})
if string(txt) then
atom acc = create(GtkLabel)
set(acc,"padding",0,0)
set(acc,"markup",txt)
if sequence(ACCEL_FONT) then
set(acc,"font",ACCEL_FONT)
end if
add(box,acc)
set(box,"child secondary",acc,TRUE)
set(box,"child non_homogeneous",acc,TRUE)
end if
end if
add(item,box)
return item
end function
function mi_set_label(atom item, object lbl)
if string(lbl) then lbl = allocate_string(lbl,1) end if
atom b = get(item,"child")
object list = get(b,"children")
if atom(list) then
list &= 0
end if
for i = 1 to length(list) do
if class_id(list[i]) = GtkAccelLabel then
gtk_proc("gtk_label_set_text",{P,P},{list[i],lbl})
return 1
end if
end for
return 1
end function
export function mi_get_label(atom item)
atom b = get(item,"child")
object list = get(b,"children")
for i = 1 to length(list) do
if class_id(list[i]) = GtkAccelLabel then
return gtk_str_func("gtk_label_get_text",{P},{list[i]})
end if
end for
return 0
end function
function mi_set_image(atom item, object img)
if string(img) then img = get_icon_image(img,GTK_ICON_SIZE_MENU) end if
img = get(img,"pixbuf")
atom b = get(item,"child")
object l = get(b,"children")
for i = 1 to length(l) do
if class_id(l[i]) = GtkImage then
gtk_proc("gtk_image_set_from_pixbuf",{P,P},{l[i],img})
return 1
end if
end for
return 1
end function
function gmi_get_image(atom item)
atom b = get(item,"child")
object l = get(b,"children")
for i = 1 to length(l) do
if class_id(l[i]) = GtkImage then
return l[i]
end if
end for
return 1
end function
function mi_set_use_underline(atom item, boolean use)
atom b = get(item,"child")
object l = get(b,"children")
for i = 1 to length(l) do
if class_id(l[i]) = GtkAccelLabel then
gtk_proc("gtk_label_set_use_underline",{P,B},{l[i],use})
return 1
end if
end for
return 1
end function
function mi_get_use_underline(atom item)
atom b = get(item,"child")
object l = get(b,"children")
l = to_sequence(l,1)
for i = 1 to length(l) do
if class_id(l[i]) = GtkAccelLabel then
return gtk_func("gtk_label_get_use_underline",{P},{l[i]})
end if
end for
return 1
end function
widget[GtkImageMenuItem] = {"gtk_image_menu_item",
{GtkMenuItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P,P,P,P},-routine_id("newMenuItem")},
"GtkImageMenuItem"}
widget[GtkRadioMenuItem] = {"gtk_radio_menu_item",
{GtkCheckMenuItem,GtkMenuItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P,P,P,P},-routine_id("newRadioMenuItem")},
{"set_group",{P,P}},
{"get_group",{P},P},
{"join_group",{P,P}}, -- 3.18
"GtkRadioMenuItem"}
function newRadioMenuItem(atom group, object stk, object fn, object data, object accels=0)
object item, img = 0
if match("#",stk) then
stk = split(stk,'#')
img = stk[1]
stk = stk[2]
goto "next"
end if
if not match("#",stk) then
if match("gtk-",stk) then
img = stk
end if
end if
label "next"
if group = 0 then
item = gtk_func("gtk_radio_menu_item_new_with_mnemonic",{P,P},
{group,allocate_string(stk,1)})
else
item = gtk_func("gtk_radio_menu_item_new_with_mnemonic_from_widget",
{P,P},{group,allocate_string(stk,1)})
end if
register(item,GtkMenuItem)
if atom(img) and img = 0 then
item = mi_add_accelerator(item,accels)
else
item = mi_add_accelerator(item,accels,img)
end if
return item
end function
widget[GtkCheckMenuItem] = {"gtk_check_menu_item",
{GtkMenuItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P,P,P},-routine_id("newCheckMenuItem")},
{"set_active",{P,B}},
{"get_active",{P},B},
{"toggled",{P}},
{"set_inconsistent",{P,B}},
{"get_inconsistent",{P},B},
{"set_draw_as_radio",{P,B}},
{"get_draw_as_radio",{P},B},
"GtkCheckMenuItem"}
function newCheckMenuItem(object stk,object fn, object data, object accels=0)
object item, img = 0
if match("#",stk) then
stk = split(stk,'#')
img = stk[1]
stk = stk[2]
goto "next"
end if
if not match("#",stk) then
if match("gtk-",stk) then
img = stk
end if
end if
label "next"
item = gtk_func("gtk_check_menu_item_new_with_mnemonic",{P},{allocate_string(stk,1)})
register(item,GtkCheckMenuItem)
if atom(img) and img = 0 then
item = mi_add_accelerator(item,accels)
else
item = mi_add_accelerator(item,accels,img)
end if
return item
end function
widget[GtkNumerableIcon] = {"gtk_numerable_icon", -- deprecated 3.14
{GEmblemedIcon,GObject},
{"new",{P},P,0,GIcon},
{"new_with_style_context",{P,P},P,0,GIcon},
{"get_background_gicon",{P},P,0,GIcon},
{"set_background_gicon",{P,P}},
{"get_background_icon_name",{P},S},
{"set_background_icon_name",{P,S}},
{"get_count",{P},I},
{"set_count",{P,I}},
{"get_label",{P},S},
{"set_label",{P,S}},
{"get_style_context",{P},P,0,GtkStyleContext},
{"set_style_context",{P,P}},
"GtkNumerableIcon"}
widget[GtkEventBox] = {"gtk_event_box",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_above_child",{P,B}},
{"get_above_child",{P},B},
{"set_visible_window",{P,B}},
{"get_visible_window",{P},B},
"GtkEventBox"}
widget[GtkExpander] = {"gtk_expander",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P},-routine_id("newExpander")},
{"set_spacing",{P,I}},
{"get_spacing",{P},I},
{"set_expanded",{P,B}},
{"get_expanded",{P},B},
{"set_label",{P,S}},
{"get_label",{P},S},
{"set_label_widget",{P,P}},
{"get_label_widget",{P},P},
{"set_label_fill",{P,B}},
{"get_label_fill",{P},B},
{"set_use_underline",{P,B}},
{"get_use_underline",{P},B},
{"set_use_markup",{P,B}},
{"get_use_markup",{P},B},
{"set_resize_toplevel",{P,B}},
{"get_resize_toplevel",{P},B},
"GtkExpander"}
function newExpander(object caption="")
if string(caption) and match("_",caption) then
return gtk_func("gtk_expander_new_with_mnemonic",{P},{caption})
else
return gtk_func("gtk_expander_new",{P},{caption})
end if
end function
widget[GtkToolItem] = {"gtk_tool_item",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_homogeneous",{P,B}},
{"get_homogeneous",{P},B},
{"set_expand",{P,B}},
{"get_expand",{P},B},
{"set_tooltip_text",{P,S}},
{"set_tooltip_markup",{P,S}},
{"set_use_drag_window",{P,B}},
{"get_use_drag_window",{P},B},
{"set_visible_horizontal",{P,B}},
{"get_visible_horizontal",{P},B},
{"set_visible_vertical",{P,B}},
{"get_visible_vertical",{P},B},
{"set_is_important",{P,B}},
{"get_is_important",{P},B},
{"get_ellipsize_mode",{P},I},
{"get_icon_size",{P},I},
{"get_orientation",{P},I},
{"get_toolbar_style",{P},I},
{"get_relief_style",{P},I},
{"get_text_alignment",{P},F},
{"get_text_orientation",{P},I},
{"retrieve_proxy_menu_item",{P},P,0,GtkMenuItem},
{"set_proxy_menu_item",{P,S,P}},
{"get_proxy_menu_item",{P,S},P,0,GtkMenuItem},
{"rebuild_menu",{P}},
{"toolbar_reconfigured",{P}},
{"get_text_size_group",{P},P,0,GtkSizeGroup},
"GtkToolItem"}
widget[GtkToolButton] = {"gtk_tool_button",
{GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P},-routine_id("newToolButton")},
{"set_label",{P,S}},
{"get_label",{P},S},
{"set_use_underline",{P,B}},
{"get_use_underline",{P},B},
{"set_stock_id",{P,S}}, -- deprecated 3.10
{"get_stock_id",{P},S}, -- deprecated 3.10
{"set_icon_name",{P,S}},
{"get_icon_name",{P},S},
{"set_icon_widget",{P,P}},
{"get_icon_widget",{P},P,0,GtkWidget},
{"set_label_widget",{P,P}},
{"get_label_widget",{P},P,0,GtkWidget},
"GtkToolButton"}
function newToolButton(object icn=0, object lbl=0)
--------------------------------------------------
atom btn = 0
if string(icn) then
if match("gtk-",icn) = 1 then
btn = gtk_func("gtk_tool_button_new_from_stock",{P},{allocate_string(icn,1)})
set(btn,"always show icon",TRUE)
return btn
else
icn = create(GtkImage,icn)
end if
end if
if string(lbl) then
lbl = allocate_string(lbl,1)
end if
btn = gtk_func("gtk_tool_button_new",{P,P},{icn,lbl})
return btn
end function
widget[GtkMenuToolButton] = {"gtk_menu_tool_button",
{GtkToolButton,GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P,P},-routine_id("newMenuToolButton")},
{"set_menu",{P,P}},
{"get_menu",{P},P,0,GtkMenu},
{"set_arrow_tooltip_text",{P,S}},
{"set_arrow_tooltip_markup",{P,S}},
"GtkMenuToolButton"}
function newMenuToolButton(object icn=0, object lbl=0)
if string(icn) then
icn = create(GtkImage,icn,1)
end if
if string(lbl) then
lbl = allocate_string(lbl,1)
end if
atom btn = gtk_func("gtk_menu_tool_button_new",{P,P},{icn,lbl})
return btn
end function
widget[GtkToggleToolButton] = {"gtk_toggle_tool_button",
{GtkToolButton,GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{S},-routine_id("newToggleToolButton")},
{"set_active",{P,B}},
{"get_active",{P},B},
"GtkToggleToolButton"}
function newToggleToolButton(object x)
atom btn
if string(x) then
btn = gtk_func("gtk_toggle_tool_button_new_from_stock",{S},{x})
elsif atom(x) then
btn = gtk_func("gtk_toggle_tool_button_new")
if class_id(btn) = GdkPixbuf then
set(btn,"image",create(GtkImage,btn))
end if
end if
return btn
end function
widget[GtkRadioToolButton] = {"gtk_radio_tool_button",
{GtkToggleToolButton,GtkToolButton,GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{P},-routine_id("newRadioToolButton")},
{"set_group",{P,P}},
{"get_group",{P},P},
"GtkRadioToolButton"}
function newRadioToolButton(atom id)
if class_id(id) = GtkRadioToolButton then
return gtk_func("gtk_radio_tool_button_new_from_widget",{P},{id})
else
return gtk_func("gtk_radio_tool_button_new",{P},{id})
end if
end function
widget[GtkSeparatorToolItem] = {"gtk_separator_tool_item",
{GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_draw",{P,B}},
{"get_draw",{P},B},
"GtkSeparatorToolItem"}
widget[GtkOverlay] = {"gtk_overlay",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"add_overlay",{P,P}},
{"get_overlay_pass_through",{P,P},B}, -- 3.18
{"set_overlay_pass_through",{P,P,B}}, -- 3.18
"GtkOverlay"}
widget[GtkScrollable] = {"gtk_scrollable",
{GObject},
{"set_hadjustment",{P,P}},
{"get_hadjustment",{P},P,0,GtkAdjustment},
{"set_vadjustment",{P,P}},
{"get_vadjustment",{P},P,0,GtkAdjustment},
{"set_hscroll_policy",{P,I}},
{"get_hscroll_policy",{P},I},
{"set_vscroll_policy",{P,I}},
{"get_vscroll_policy",{P},I},
{"get_border",{P,P},B}, -- 3.16
"GtkScrollable"}
widget[GtkScrolledWindow] = {"gtk_scrolled_window",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P,P},P},
{"set_hadjustment",{P,P}},
{"get_hadjustment",{P},P,0,GtkAdjustment},
{"set_vadjustment",{P,P}},
{"get_vadjustment",{P},P,0,GtkAdjustment},
{"get_hscrollbar",{P},P,0,GtkWidget},
{"get_vscrollbar",{P},P,0,GtkWidget},
{"set_policy",{P,I,I}},
{"get_policy",{P,I,I}},
{"set_placement",{P,I}},
{"unset_placement",{P}},
{"set_shadow_type",{P,I}},
{"get_shadow_type",{P},I},
{"set_min_content_width",{P,I}},
{"get_min_content_width",{P},I},
{"set_min_content_height",{P,I}},
{"get_min_content_height",{P},I},
{"set_kinetic_scrolling",{P,B}},
{"get_kinetic_scrolling",{P},B},
{"set_capture_button_press",{P,B}},
{"get_capture_button_press",{P},B},
{"set_headers",{P,P}},
{"add_with_viewport",{P,P}}, -- deprecated 3.8
{"get_overlay_scrolling",{P},B}, -- 3.16
{"set_overlay_scrolling",{P,B}}, -- 3.16
"GtkScrolledWindow"}
widget[GtkSidebar] = {"gtk_sidebar", -- 3.16
{GtkBin,GtkContainer,GtkWidget,GObject},
{"new",{},P},
{"set_stack",{P,P}},
{"get_stack",{P},P,0,GtkStack},
"GtkSidebar"}
widget[GtkTextBuffer] = {"gtk_text_buffer",
{GObject},
{"new",{P},P},
{"get_line_count",{P},I},
{"get_char_count",{P},I},
{"get_tag_table",{P},P,0,GtkTextTagTable},
{"insert",{P,P,S,I}},
{"insert_at_cursor",{P,S,I}},
{"insert_interactive",{P,P,S,I,B},B},
{"insert_interactive_at_cursor",{P,S,I,B},B},
{"insert_range",{P,P,P,P}},
{"insert_range_interactive",{P,P,P,P,B},B},
{"insert_with_tags",{P,P,S,I,P,P}},
{"insert_with_tags_by_name",{P,P,S,I,S}},
{"insert_markup",{P,P,S,I}}, -- 3.16
{"delete",{P,P,P}},
{"delete_interactive",{P,P,P,B},B},
{"backspace",{P,P,B,B},B},
{"set_text",{P,P},-routine_id("setBufferText")},
{"get_text",{P},-routine_id("getBufferText")},
{"get_slice",{P,P,P,B},S},
{"insert_pixbuf",{P,P,P}},
{"insert_child_anchor",{P,P,P}},
{"create_child_anchor",{P,P},P,0,GtkTextChildAnchor},
{"create_mark",{P,S,P,B},P,0,GtkTextMark},
{"move_mark",{P,P,P}},
{"move_mark_by_name",{P,S,P}},
{"add_mark",{P,P,P}},
{"delete_mark",{P,P}},
{"delete_mark_by_name",{P,S}},
{"get_mark",{P,S},P,0,GtkTextMark},
{"get_insert",{P},P,0,GtkTextMark},
{"get_selection_bound",{P},P,0,GtkTextMark},
{"get_selection_bounds",{P},-routine_id("getSelectionBounds")},
{"get_has_selection",{P},B},
{"place_cursor",{P,P}},
{"select_range",{P,P,P}},
{"apply_tag",{P,P,P,P}},
{"remove_tag",{P,P,P,P}},
{"apply_tag_by_name",{P,S,P,P}},
{"remove_tag_by_name",{P,S,P,P}},
{"remove_all_tags",{P,P,P}},
{"create_tag",{P,S,S,S},P,0,GtkTextTag},
{"get_iter_at_line_offset",{P,P,I,I}},
{"get_iter_at_offset",{P,P,I}},
{"get_iter_at_line",{P,P,I}},
{"get_iter_at_line_index",{P,P,I,I}},
{"get_iter_at_mark",{P,P,P}},
{"get_iter_at_child_anchor",{P,P,P}},
{"get_start_iter",{P,P}},
{"get_end_iter",{P,P}},
{"get_bounds",{P,P,P}},
{"set_modified",{P,B}},
{"get_modified",{P},B},
{"delete_selection",{P,B,B},B},
{"paste_clipboard",{P,P,P,B}},
{"copy_clipboard",{P,P}},
{"cut_clipboard",{P,P,B}},
{"get_selection_bounds",{P,P,P},B},
{"begin_user_action",{P}},
{"end_user_action",{P}},
{"add_selection_clipboard",{P,P}},
{"remove_selection_clipboard",{P,P}},
{"deserialize",{P,P,I,P,I,I,P},B},
{"deserialize_set_can_create_tags",{P,I,B}},
{"deserialize_get_can_create_tags",{P,I},B},
{"get_copy_target_list",{P},P,0,GtkTargetList},
{"get_deserialize_formats",{P,I},P},
{"get_paste_target_list",{P},P,0,GtkTargetList},
{"get_serialize_formats",{P,I},P},
{"register_deserialize_format",{P,S,P,P,P},P},
{"register_deserialize_tagset",{P,S},P},
{"register_serialize_format",{P,S,P,P,P},P},
{"register_serialize_tagset",{P,S},P},
{"serialize",{P,P,P,P,P,I},I},
{"unregister_deserialize_format",{P,P}},
{"unregister_serialize_format",{P,P}},
{"insert_markup",{P,P,S,I}}, -- 3.16
"GtkTextBuffer"}
export constant
fnBufStart = define_proc("gtk_text_buffer_get_start_iter",{P,P}),
fnBufEnd = define_proc("gtk_text_buffer_get_end_iter",{P,P}),
fnBufGet = define_func("gtk_text_buffer_get_text",{P,P,P,B},S),
fnBufSet = define_proc("gtk_text_buffer_set_text",{P,S,I}),
fnBufIns = define_func("gtk_text_buffer_get_insert",{P},P),
fnBufIter = define_proc("gtk_text_buffer_get_iter_at_mark",{P,P,P}),
fnBufBounds = define_func("gtk_text_buffer_get_selection_bounds",{P,P,P},B)
function getBufferText(object buf)
atom start = allocate(64) c_proc(fnBufStart,{buf,start})
atom fini = allocate(64) c_proc(fnBufEnd,{buf,fini})
object result = c_func(fnBufGet,{buf,start,fini,1})
return peek_string(result)
end function
function getSelectionBounds(object buf)
atom start = allocate(100)
atom fini = allocate(100)
atom iter = allocate(100)
if c_func(fnBufBounds,{buf,start,fini}) then
return {start,fini}
else
start = c_func(fnBufIns,{buf})
c_proc(fnBufIter,{buf,iter,start})
return {iter,iter}
end if
end function
function setBufferText(object buf, object txt)
object len
if atom(txt) then
len = peek_string(txt)
len = length(len)
else
len = length(txt)
txt = allocate_string(txt)
end if
c_proc(fnBufSet,{buf,txt,len})
return 1
end function
widget[GtkClipboard] = {"gtk_clipboard",
{GObject},
{"new",{I},-routine_id("newClipboard")},
{"get_default",{P},P,0,GtkClipboard},-- 3.16
{"get_for_display",{P,I},P,0,GtkClipboard},
{"get_display",{P},P,0,GdkDisplay},
{"set_with_data",{P,P,I,P,P,P},B},
{"set_with_owner",{P,P,I,P,P,P},B},
{"get_owner",{P},P,0,GObject},
{"clear",{P}},
{"set_text",{P,S,I}},
{"set_image",{P,P}},
{"request_contents",{P,I,P,P}},
{"request_text",{P,P,P}},
{"request_image",{P,P,P}},
{"request_targets",{P,P,P}},
{"request_rich_text",{P,P,P,P}},
{"request_uris",{P,P,P}},
{"wait_for_contents",{P,I},P,0,GtkSelectionData},
{"wait_for_text",{P},S},
{"wait_for_image",{P},P,0,GdkPixbuf},
{"wait_for_rich_text",{P,P,I,I},I},
{"wait_for_uris",{P},A},
{"wait_is_text_available",{P},B},
{"wait_is_image_available",{P},B},
{"wait_is_rich_text_available",{P,P},B},
{"wait_is_uris_available",{P},B},
{"wait_for_targets",{P,P,I},B},
{"wait_is_target_available",{P,I},B},
{"set_can_store",{P,P,I}},
{"store",{P}},
{"get_selection",{P},P}, -- 3.22
"GtkClipboard"}
function newClipboard(integer i=0) -- just use default clipboard;
return gtk_func("gtk_clipboard_get",{I},{i})
end function
widget[GtkSelectionData] = {"gtk_selection_data",
{0},
{"set",{P,I,I,S,I}},
{"set_text",{P,S,I},B},
{"get_text",{P},S},
{"set_pixbuf",{P,P},B},
{"get_pixbuf",{P},P,0,GdkPixbuf},
{"set_uris",{P,S},B},
{"get_uris",{P},A},
{"get_targets",{P,P,I},B},
{"targets_include_image",{P,B},B},
{"targets_include_text",{P},B},
{"targets_include_uri",{P},B},
{"targets_include_rich_text",{P,P},B},
{"get_selection",{P},P},
{"get_data",{P},S},
{"get_length",{P},I},
{"get_data_with_length",{P,I},S},
{"get_data_type",{P},I},
{"get_display",{P},P,0,GdkDisplay},
{"get_format",{P},I},
{"get_target",{P},I},
"GtkSelectionData"}
widget[GtkCellArea] = {"gtk_cell_area",
{GtkCellLayout,GtkBuildable,GObject},
{"add",{P,P}},
{"remove",{P,P}},
{"set_property",{P,P,S,P}},
{"get_property",{P,P,S,P}},
{"has_renderer",{P,P},B},
{"foreach",{P,P}},
{"foreach_alloc",{P,P,P,P,P,P,P}},
{"event",{P,P,P,P,P,I},I},
{"render",{P,P,P,P,P,P,I,B}},
{"get_cell_allocation",{P,P,P,P,P,P}},
{"get_cell_at_position",{P,P,P,P,I,I,P},P,0,GtkCellRenderer},
{"create_context",{P},P,0,GtkCellAreaContext},
{"copy_context",{P,P},P,0,GtkCellAreaContext},
{"get_request_mode",{P},I},
{"get_preferred_width",{P,P,P,I,I}},
{"get_preferred_height_for_width",{P,P,P,I,I,I}},
{"get_preferred_height",{P,P,P,I,I}},
{"get_preferred_width_for_height",{P,P,P,I,I,I}},
{"get_current_path",{P},S},
{"apply_attributes",{P,P,P,B,B}},
{"attribute_connect",{P,P,S,I}},
{"attribute_disconnect",{P,P,S}},
{"attribute_get_column",{P,P,S},I}, -- 3.14
{"is_activatable",{P},B},
{"activate",{P,P,P,P,I,B},B},
{"activate_cell",{P,P,P,P,P,I},B},
{"focus",{P,I},B},
{"set_focus_cell",{P,P}},
{"get_focus_cell",{P},P,0,GtkCellRenderer},
{"add_focus_sibling",{P,P,P}},
{"remove_focus_sibling",{P,P,P}},
{"is_focus_sibling",{P,P,P},B},
{"get_focus_siblings",{P,P},X,0,GList},
{"get_focus_from_sibling",{P,P},P,0,GtkCellRenderer},
{"get_edited_cell",{P},P,0,GtkCellRenderer},
{"get_edit_widget",{P},P,0,GtkCellEditable},
{"stop_editing",{P,B}},
{"inner_cell_area",{P,P,P,P}},
{"request_renderer",{P,P,P,P,I,I,I}},
{"class_install_property",{P,I,P}},
{"class_find_cell_property",{P,S},P},
{"class_list_cell_properties",{P,I},P},
"GtkCellArea"}
widget[GtkCellAreaCell] = {"gtk_cell_area_cell",
{GtkCellArea},
{"set_property",{P,P,S,P}},
{"get_property",{P,P,S,P}},
"GtkCellAreaCell"}
widget[GtkCellAreaBox] = {"gtk_cell_area_box",
{GtkCellLayout,GtkCellArea,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"pack_start",{P,P,B,B,B}},
{"pack_end",{P,P,B,B,B}},
{"set_spacing",{P,I}},
{"get_spacing",{P},I},
"GtkCellAreaBox"}
widget[GtkCellAreaContext] = {"gtk_cell_area_context",
{GObject},
{"get_area",{P},P,0,GtkCellArea},
{"allocate",{P,I,I}},
{"reset",{P}},
{"get_preferred_width",{P,I,I}},
{"get_preferred_height",{P,I,I}},
{"get_preferred_height_for_width",{P,I,I,I}},
{"get_preferred_width_for_height",{P,I,I,I}},
{"get_allocation",{P,I,I}},
{"push_preferred_width",{P,I,I}},
{"push_preferred_height",{P,I,I}},
"GtkCellAreaContext"}
widget[GtkCellEditable] = {"gtk_cell_editable",
{GtkWidget},
{"start_editing",{P,P}},
{"editing_done",{P}},
{"remove_widget",{P}},
"GtkCellEditable"}
widget[GtkCellLayout] = {"gtk_cell_layout",
{GObject},
{"pack_start",{P,P,B}},
{"pack_end",{P,P,B}},
{"get_area",{P},P,0,GtkCellArea},
{"get_cells",{P},X,0,GList},
{"reorder",{P,P,I}},
{"clear",{P}},
{"add_attribute",{P,P,S,I}},
{"set_cell_data_func",{P,P,P,P,P}},
{"clear_attributes",{P,P}},
"GtkCellLayout"}
widget[GtkCellRenderer] = {"gtk_cell_renderer",
{GObject},
{"set_fixed_size",{P,I,I}},
{"get_fixed_size",{P,I,I}},
{"set_visible",{P,B}},
{"get_visible",{P},B},
{"set_sensitive",{P,B}},
{"get_sensitive",{P},B},
{"set_alignment",{P,F,F}},
{"get_alignment",{P,F,F}},
{"set_padding",{P,I,I}},
{"get_padding",{P,I,I}},
{"get_state",{P,P,I},I},
{"is_activatable",{P},B},
{"get_aligned_area",{P,P,I,P,P}},
{"render",{P,P,P,P,P,I}},
{"activate",{P,P,P,P,P,P,I},B},
{"start_editing",{P,P,P,P,P,P,I},P,0,GtkCellEditable},
{"stop_editing",{P,B}},
{"get_preferred_height",{P,P,I,I}},
{"get_preferred_width",{P,P,I,I}},
{"get_preferred_height_for_width",{P,P,I,I,I}},
{"get_preferred_width_for_height",{P,P,I,I,I}},
{"get_preferred_size",{P,P,P,P}},
{"get_request_mode",{P},I},
"GtkCellRenderer"}
-- Many properties exist for cell renderers, see GTK docs!
widget[GtkCellRendererAccel] = {"gtk_cell_renderer_accel",
{GtkCellRendererText,GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererAccel"}
widget[GtkCellRendererCombo] = {"gtk_cell_renderer_combo",
{GtkCellRendererText,GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererCombo"}
widget[GtkCellRendererText] = {"gtk_cell_renderer_text",
{GtkCellRenderer,GObject},
{"new",{},P},
{"set_fixed_height_from_font",{P,I}},
"GtkCellRendererText"}
widget[GtkCellRendererPixbuf] = {"gtk_cell_renderer_pixbuf",
{GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererPixbuf"}
widget[GtkCellRendererProgress] = {"gtk_cell_renderer_progress",
{GtkOrientable,GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererProgress"}
widget[GtkCellRendererSpin] = {"gtk_cell_renderer_spin",
{GtkCellRendererText,GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererSpin"}
widget[GtkCellRendererSpinner] = {"gtk_cell_renderer_spinner",
{GtkCellRenderer,GObject},
{"new",{},P},
"GtkCellRendererSpinner"}
widget[GtkCellRendererToggle] = {"gtk_cell_renderer_toggle",
{GtkCellRenderer,GObject},
{"new",{},P},
{"set_radio",{P,B}},
{"get_radio",{P},B},
{"set_active",{P,B}},
{"get_active",{P},B},
{"set_activatable",{P,B}},
{"get_activatable",{P},B},
"GtkCellRendererToggle"}
widget[GtkTreeModelFilter] = {"gtk_tree_model_filter",
{GtkTreeModel,GtkTreeDragSource,GObject},
{"new",{P,P},P},
{"set_visible_func",{P,P,P,P}},
{"set_modify_func",{P,I,P,P,P,P}},
{"set_visible_column",{P,I}},
{"get_model",{P},P,0,GtkTreeModel},
{"convert_child_iter_to_iter",{P,P,P},B},
{"convert_iter_to_child_iter",{P,P,P},B},
{"convert_child_path_to_path",{P,P},P,0,GtkTreePath},
{"convert_path_to_child_path",{P,P},P,0,GtkTreePath},
{"refilter",{P}},
{"clear_cache",{P}},
"GtkTreeModelFilter"}
widget[GtkTreeModelSort] = {"gtk_tree_model_sort",
{GtkTreeSortable,GtkTreeModel,GtkTreeDragSource,GObject},
{"new_with_model",{P},P},
{"get_model",{P},P,0,GtkTreeModel},
{"convert_child_path_to_path",{P,P},P,0,GtkTreePath},
{"convert_child_iter_to_iter",{P,P,P},B},
{"convert_path_to_child_path",{P,P},P,0,GtkTreePath},
{"convert_iter_to_child_iter",{P,P,P}},
{"reset_default_sort_func",{P}},
{"clear_cache",{P}},
"GtkTreeModelSort"}
widget[GtkListStore] = {"gtk_list_store",
{GtkTreeModel,GtkTreeSortable,GtkTreeDragSource,GtkTreeDragDest,GtkBuildable,GObject},
{"new",{P},-routine_id("newListStore")},
{"clear",{P}},
{"set_data",{P,P},-routine_id("ls_set_data")},
{"get_data",{P},-routine_id("ls_get_data")},
{"get_n_rows",{P},-routine_id("ls_get_n_rows")},
{"get_n_cols",{P},-routine_id("ls_get_n_cols")},
{"set_row_data",{P,I,P},-routine_id("ls_set_row_data")},
{"get_row_data",{P,I},-routine_id("ls_get_row_data")},
{"set_col_data",{P,I,I,P},-routine_id("ls_set_col_data")},
{"get_col_data",{P,I,I},-routine_id("ls_get_col_data")},
{"get_col_data_from_iter",{P,I,I},-routine_id("ls_get_col_data_from_iter")},
{"remove_row",{P,I},-routine_id("ls_remove_row")},
{"replace_row",{P,I,P},-routine_id("ls_replace_row")},
{"insert_row",{P,I,P},-routine_id("ls_insert_row")},
{"prepend_row",{P,P},-routine_id("ls_prepend_row")},
{"append_row",{P,P},-routine_id("ls_append_row")},
{"set_swap_rows",{P,I,I},-routine_id("ls_set_swap_rows")},
{"set_move_before",{P,I,I},-routine_id("ls_set_move_before")},
{"set_move_after",{P,I,I},-routine_id("ls_set_move_after")},
"GtkListStore"}
-- almost all calls to GtkListStore are overridden with Euphoria calls,
-- because the GTK versions are just too complex and tedious to set up,
-- making them impractical to use.
constant
TM1 = define_func("gtk_tree_model_get_iter_first",{P,P},I),
TM2 = define_func("gtk_tree_model_iter_next",{P,P},I),
TM3 = define_func("gtk_tree_model_get_iter_from_string",{P,P,P},P),
TM4 = define_proc("gtk_tree_model_get",{P,P,I,P,I}),
TM5 = define_func("gtk_tree_model_get_column_type",{P,I},I),
LS0 = define_proc("gtk_list_store_clear",{P}),
LS1 = define_proc("gtk_list_store_insert",{P,P,I}),
LS2 = define_proc("gtk_list_store_append",{P,P}),
LS3 = define_proc("gtk_list_store_swap",{P,P,P}),
LS4 = define_proc("gtk_list_store_move_before",{P,P,P}),
LS5 = define_proc("gtk_list_store_move_after",{P,P,P}),
LS6 = define_func("gtk_list_store_iter_is_valid",{P,P},B)
function newListStore(object params)
object proto = I & repeat(P,length(params))
params = length(params) & params -- must build func params 'on the fly'
atom fn = define_func("gtk_list_store_new",proto,P)
return c_func(fn,params)
end function
function ls_get_n_rows(object store)
return gtk_func("gtk_tree_model_iter_n_children",{P,P},{store,0})
end function
function ls_get_n_cols(object store)
return gtk_func("gtk_tree_model_get_n_columns",{P},{store})
end function
function ls_set_data(object store, object data)
atom iter = allocate(32,1)
for row = 1 to length(data) do
c_proc(LS1,{store,iter,length(data)}) -- new row
if string(data[row]) then
ls_set_row_data(store,row,{data[row]})
else
ls_set_row_data(store,row,data[row])
end if
end for
return 1
end function
function ls_set_row_data(atom store, integer row, object data)
integer max_col = ls_get_n_cols(store)
for col = 1 to math:min({length(data),max_col}) do
ls_set_col_data(store,row,col,data[col])
end for
return 1
end function
function ls_set_col_data(object store, object row, integer col, object data)
integer max_col = ls_get_n_cols(store)
if col < 1 or col > max_col then
crash("Invalid column #%d",col)
end if
atom s = allocate_string(sprintf("%d",row-1),1)
atom iter = allocate(32,1)
if not c_func(TM3,{store,iter,s}) then
return -1
end if
object prototype = {P,P,I,P,I}
integer col_type = c_func(TM5,{store,col-1})
switch col_type do
case gSTR then prototype = {P,P,I,S,I}
if atom(data) then data = sprintf("%2.2f",data) end if
case gDBL,gFLT then prototype = {P,P,I,D,I}
case gPIX then prototype = {P,P,I,P,I}
case gINT,gBOOL then prototype = {P,P,I,I,I}
case else
display("Error in []->ls_set_col_data: col [] type [] expects [], got []",
{get(store,"name"),col,col_type,vlookup(col_type,storage_types,1,2,"!"),data})
?1/0
end switch
if string(data) then
data = allocate_string(data) -- don't free these strings!
end if
atom fn = define_proc("gtk_list_store_set",prototype)
object params = {store,iter,col-1,data,-1}
c_proc(fn,params)
return 1
end function
function ls_get_data(object store)
object data = {}
for row = 1 to ls_get_n_rows(store) do
data = append(data,ls_get_row_data(store,row))
end for
return data
end function
function ls_get_row_data(object store, integer row)
object data = {}
integer max_row = ls_get_n_rows(store)
if row > max_row then return -1 end if
integer max_col = ls_get_n_cols(store)
for i = 1 to max_col do
data = append(data,ls_get_col_data(store,row,i))
end for
if max_col = 1 then
return data[1] else return data
end if
end function
function ls_get_col_data(atom store, integer row, integer col)
atom x = allocate(32,1)
object result
ifdef LISTSTORE then
display("Get Col Data ~ row [] col []",{row,col})
end ifdef
integer col_type = c_func(TM5,{store,col-1})
ifdef BITS64 then
poke8(x,col_type)
elsedef
poke4(x,col_type)
end ifdef
atom iter = allocate(32,1)
c_func(TM3,{store,iter,allocate_string(sprintf("%d",row-1),1)})
if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 then
display("Error in ls_get_col_data 2 ") abort(0) end if
c_proc(TM4,{store,iter,col-1,x,-1})
if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 then
display("Error in ls_get_col_data 3") abort(0) end if
switch col_type do
case gSTR then
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(x)
elsedef
result = peek4u(x)
end ifdef
if result > 0 then
result = peek_string(result)
end if
case gINT then result = peek4u(x)
case gBOOL then result = peek(x)
case gDBL then result = float64_to_atom(peek({x,8}))
case gFLT then result = float32_to_atom(peek({x,4}))
case gPIX then result = peek4u(x)
case else display("Error in ls_get_col_data 4") abort(0)
end switch
ifdef LISTSTORE then
display("Result []",{result})
end ifdef
return result
end function
function ls_get_col_data_from_iter(atom store, atom iter, integer col)
atom x = allocate(64,1)
object result
ifdef LISTSTORE then
display("Get Col Data from Iter ~ store [] iter [] col []\n",{store,iter,col})
end ifdef
integer col_type = c_func(TM5,{store,col-1})
ifdef BITS64 then
poke8(x,col_type)
elsedef
poke4(x,col_type)
end ifdef
if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 then
display("Error in ls_get_col_datafromiter 1 ") abort(0) end if
c_proc(TM4,{store,iter,col-1,x,-1})
if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 then
display("Error in ls_get_col_datafromiter 2 ") abort(0) end if
switch col_type do
case gSTR then
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(x)
elsedef
result = peek4u(x)
end ifdef
if result > 0 then
result = peek_string(result)
end if
case gINT then result = peek4u(x)
case gBOOL then result = peek(x)
case gDBL then result = float64_to_atom(peek({x,8}))
case gFLT then result = float32_to_atom(peek({x,4}))
case gPIX then result = peek4u(x)
case else display("Error in ls_get_col_datafromiter 3") abort(0)
end switch
ifdef LISTSTORE then
display("Result []",{result})
end ifdef
return result
end function
function ls_insert_row(object store, object data, integer pos)
object tmp = ls_get_data(store)
tmp = insert(tmp,data,pos)
set(store,"clear")
ls_set_data(store,tmp)
return tmp
end function
function ls_append_row(atom store, object data)
object tmp = ls_get_data(store)
tmp = append(tmp,data)
set(store,"clear")
set(store,"data",tmp)
return tmp
end function
function ls_prepend_row(atom store, object data)
object tmp = ls_get_data(store)
tmp = prepend(tmp,data)
set(store,"clear")
set(store,"data",tmp)
return tmp
end function
function ls_remove_row(atom store, integer row)
object tmp = ls_get_data(store)
tmp = remove(tmp,row)
set(store,"clear")
ls_set_data(store,tmp)
return tmp
end function
function ls_replace_row(atom store, object data, integer row)
object tmp = ls_get_data(store)
set(store,"clear")
tmp = replace(tmp,{data},row)
ls_set_data(store,tmp)
return tmp
end function
function ls_set_swap_rows(atom store, integer row_a, integer row_b)
if get(store,"is sorted") then
Warn(0,,"Can't move items in a sorted list!")
return -1
end if
atom iter_a = allocate(32,1), iter_b = allocate(32,1)
c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1),1)})
c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-1),1)})
c_proc(LS3,{store,iter_a,iter_b})
return get(store,"data")
end function
function ls_set_move_before(atom store, integer row_a, integer row_b)
if get(store,"is sorted") then
Error(0,,"Can't move items in a sorted list!")
return -1
end if
atom iter_a = allocate(32,1), iter_b = allocate(32,1)
c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1),1)})
c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-1),1)})
c_proc(LS4,{store,iter_b,iter_a})
return get(store,"data")
end function
function ls_set_move_after(atom store, integer row_a, integer row_b)
if get(store,"is sorted") then
Error(0,,"Can't move items in a sorted list!")
return -1
end if
atom iter_a = allocate(32,1), iter_b = allocate(32,1)
c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1),1)})
c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-1),1)})
c_proc(LS5,{store,iter_b,iter_a})
return get(store,"data")
end function
widget[GtkTreeStore] = {"gtk_tree_store",
{GtkTreeModel,GtkTreeDragSource,GtkTreeDragDest,GtkTreeSortable,GtkBuildable,GObject},
{"new",{P},-routine_id("newTreeStore")},
{"get_n_rows",{P},-routine_id("ts_get_n_rows")},
{"get_n_cols",{P},-routine_id("ts_get_n_cols")},
{"get_data",{P},-routine_id("ts_get_data")},
{"set_data",{P,P},-routine_id("ts_set_data")},
{"set_row_data",{P,P,P},-routine_id("ts_set_row_data")},
{"remove_row",{P,I},-routine_id("ts_remove_row")},
{"insert_row",{P,P,P,I}},
{"insert_before",{P,P,P,P}},
{"insert_after",{P,P,P,P}},
{"prepend",{P,P,P}},
{"append",{P,P,P}},
{"is_ancestor",{P,P,P},B},
{"iter_depth",{P,P},I},
{"clear",{P}},
{"swap",{P,P,P}},
{"move_before",{P,P,P}},
{"move_after",{P,P,P}},
"GtkTreeStore"}
function newTreeStore(object params)
object proto = I & repeat(P,length(params))
params = length(params) & params -- must build func params 'on the fly'
atom fn = define_func("gtk_tree_store_new",proto,P)
return c_func(fn,params)
end function
function ts_get_n_rows(object store)
return gtk_func("gtk_tree_model_iter_n_children",{P,P},{store,0})
end function
function ts_get_n_cols(object store)
return gtk_func("gtk_tree_model_get_n_columns",{P},{store})
end function
function ts_set_data(object store, object data)
atom iter = allocate(32,1)
for row = 1 to length(data) do
gtk_proc("gtk_tree_store_append",{P,P,P},{store,iter,0})
ts_set_row_data(store,data[row],iter)
end for
return 1
end function
constant TSA = define_proc("gtk_tree_store_append",{P,P,P})
-- the following should really be recursive, but that's too complicated
-- for me to figure out! Anyway, four deep should be enough.
function ts_set_row_data(atom store, object data, object parent = 0)
atom iter1 = allocate(32,1)
atom iter2 = allocate(32,1)
atom iter3 = allocate(32,1)
atom iter4 = allocate(32,1)
for i = 1 to length(data) do
if string(data[i]) then
ts_set_row_col_data(store,parent,i,data[i])
else
for j = 1 to length(data[i]) do
if string(data[i][j]) then
c_proc(TSA,{store,iter1,parent})
ts_set_row_col_data(store,iter1,1,data[i][j])
else
for k = 1 to length(data[i][j]) do
if string(data[i][j][k]) then
c_proc(TSA,{store,iter2,iter1})
ts_set_row_col_data(store,iter2,1,data[i][j][k])
else
for l = 1 to length(data[i][j][k]) do
if string(data[i][j][k][l]) then
c_proc(TSA,{store,iter3,iter2})
ts_set_row_col_data(store,iter3,1,data[i][j][k][l])
else
for m = 1 to length(data[i][j][k][l]) do
c_proc(TSA,{store,iter4,iter3})
ts_set_row_col_data(store,iter4,1,data[i][j][k][l][m])
end for
end if
end for
end if
end for
end if
end for
end if
end for
return 1
end function
function ts_set_row_col_data(object store, object iter, integer col, object item)
integer max_col = ts_get_n_cols(store)
if col < 1 or col > max_col then
crash("Invalid column #%d",col)
end if
object prototype = {P,P,I,P,I}
integer col_type
col_type = c_func(TM5,{store,col-1})
switch col_type do
case gDBL,gFLT then prototype = {P,P,I,D,I}
case gSTR, gPIX then prototype = {P,P,I,P,I}
case gBOOL,gINT then prototype = {P,P,I,I,I}
if atom(item) then item = sprintf("%g",item) end if
case else Warn(,,"Unknown column type",
"Expecting gSTR, gBOOL, gINT, gDBL, gFLT, or gPIX")
end switch
if string(item[1]) then item = item[1] end if
if string(item) then item = allocate_string(item,1) end if
atom fn = define_proc("gtk_tree_store_set",prototype)
object params = {store,iter,col-1,item,-1}
c_proc(fn,params)
return iter
end function
function ts_get_data(atom store)
object rowdata = {}
object column = {}
for row = 1 to ts_get_n_rows(store) do
for col = 1 to ts_get_n_cols(store) do
column = append(column,get(store,"col data",col))
end for
rowdata = append(rowdata,column)
column = {}
end for
return rowdata
end function
function ts_remove_row(atom store, integer row)
object tmp = get(store,"data")
tmp = remove(tmp,row)
set(store,"data",tmp)
return tmp
end function
widget[GtkTreeDragSource] = {"gtk_tree_drag_source",
{0},
"GtkTreeDragSource"}
widget[GtkTreeDragDest] = {"gtk_tree_drag_dest",
{0},
"GtkTreeDragDest"}
widget[GtkTreePath] = {"gtk_tree_path",
{GObject},
{"new",{P},-routine_id("newTreePath")},
{"to_string",{P},S},
{"to_integer",{P},-routine_id("tp_to_integer")},
{"new_first",{},P,0,GtkTreePath},
{"append_index",{P,I}},
{"prepend_index",{P,I}},
{"get_depth",{P},I},
{"get_indices",{P},A},
{"get_indices_with_depth",{P,I},A},
{"free",{P}},
{"copy",{P},P,0,GtkTreePath},
{"compare",{P,P},I},
{"next",{P}},
{"prev",{P},B},
{"up",{P},B},
{"down",{P}},
{"is_ancestor",{P,P},B},
{"is_descendant",{P,P},B},
"GtkTreePath"}
function newTreePath(object x=0)
if atom(x) and x > 0 then
x = sprintf("%d",x-1)
end if
if string(x) then
x = allocate_string(x,1)
end if
if x > 0 then
return gtk_func("gtk_tree_path_new_from_string",{P},{x})
else
return gtk_func("gtk_tree_path_new",{},{})
end if
end function
function tp_to_integer(object x)
integer n = to_number(gtk_str_func("gtk_tree_path_to_string",{P},{x}))
return n+1
end function
widget[GtkTreeRowReference] = {"gtk_tree_row_reference",
{GObject},
{"new",{P,P},P,0,GtkTreeRowReference},
{"get_model",{P},P,0,GtkTreeModel},
{"get_path",{P},P,0,GtkTreePath},
{"valid",{P},B},
{"free",{P}},
{"copy",{P},P,0,GtkTreeRowReference},
{"inserted",{P,P}},
{"deleted",{P,P}},
{"reordered",{P,P,P,A}},
"GtkTreeRowReference"}
widget[GtkTreeIter] = {"gtk_tree_iter",
{GObject},
{"new",{},-routine_id("newTreeIter")},
{"copy",{P},P,0,GtkTreeIter},
{"free",{P}},
"GtkTreeIter"}
function newTreeIter()
return allocate(64) -- keep;
end function
widget[GtkTreeModel] = {"gtk_tree_model",
{GObject},
{"get_flags",{P},I},
{"get_n_columns",{P},I},
{"get_column_type",{P,I},I},
{"get_iter",{P,P,P},B},
{"get_iter_first",{P,P},B},
{"get_path",{P,P},P,0,GtkTreePath},
{"get_value",{P,P,I},-routine_id("tm_get_value")},
{"set_value",{P,I,I,P},-routine_id("tm_set_value")},
{"iter_next",{P,P},B},
{"iter_previous",{P,P},B},
{"iter_children",{P,P,P},B},
{"iter_has_child",{P,P},B},
{"iter_n_children",{P,P},I},
{"iter_nth_child",{P,P,P,I},B},
{"iter_parent",{P,P,P},B},
{"get_string_from_iter",{P,P},-routine_id("tm_get_string_from_iter")},
{"ref_node",{P,P}},
{"unref_node",{P,P}},
{"foreach",{P,P,P}},
{"n_rows",{P},-routine_id("tm_get_n_rows")},
{"row_changed",{P,P,P}},
{"row_inserted",{P,P,P}},
{"row_has_child_toggled",{P,P,P}},
{"row_deleted",{P,P}},
{"rows_reordered",{P,P,P,P}},
{"get_iter_n",{P,I},-routine_id("tm_get_iter_n")},
{"get_iter_from_string",{P,P},-routine_id("tm_get_iter_from_string")},
{"get_iter_from_path",{P,P},-routine_id("tm_get_iter_from_path")},
{"get_col_value",{P,P,I},-routine_id("tm_get_col_value")},
{"get_row_values",{P,P},-routine_id("tm_get_row_values")},
{"get_col_data",{P,P,P},-routine_id("tm_get_col_data")},
{"get_row_data",{P,I},-routine_id("tm_get_row_values")},
"GtkTreeModel"}
constant
fntmget = define_proc("gtk_tree_model_get_value",{P,P,I,P}),
fncoltype = define_func("gtk_tree_model_get_column_type",{P,I},I),
gtvfn = define_proc("gtk_tree_model_get",{P,P,I,P,I}),
tmncol = define_func("gtk_tree_model_get_n_columns",{P},I)
function tm_get_n_rows(atom model)
atom fn = define_func("gtk_tree_model_iter_n_children",{P,P},I)
return c_func(fn,{model,0})
end function
function tm_get_string_from_iter(atom model, atom iter)
atom fn = define_func("gtk_tree_model_get_string_from_iter",{P,P},P)
return peek_string(c_func(fn,{model,iter}))
end function
function tm_get_iter_from_string(atom model, object str)
atom iter = allocate(64)
atom fn = define_func("gtk_tree_model_get_iter_from_string",{P,P,P},P)
if string(str) then str = allocate_string(str,1) end if
if c_func(fn,{model,iter,str}) then
return iter
end if
return 0
end function
function tm_get_iter_n(atom model, integer path)
return tm_get_iter_from_string(model,sprintf("%d",path-1))
end function
function tm_get_iter_from_path(atom model, object path)
return tm_get_iter_from_string(model,peek_string(path))
end function
function tm_get_value(atom mdl, atom iter, integer col)
atom x = allocate(64,1)
integer ct = c_func(fncoltype,{mdl,col-1})
object result
ifdef BITS64 then
poke8(x,ct)
elsedef
poke4(x,ct)
end ifdef
c_proc(gtvfn,{mdl,iter,col-1,x,-1})
switch ct do
case gSTR then
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(x)
elsedef
result = peek4u(x)
end ifdef
if result > 0 then
return peek_string(result)
else
return sprintf("%d",result)
end if
case gBOOL,gINT then return peek4u(x)
case gFLT then return float32_to_atom(peek({x,4}))
case gPIX then return peek4u(x)
case else return sprintf("%d",x)
end switch
return sprintf("Oops %d",ct)
end function
function tm_get_row_values(atom mdl, atom iter)
integer ncols = c_func(tmncol,{mdl})
object results = repeat(0,ncols)
for n = 1 to ncols do
results[n] = tm_get_value(mdl,iter,n)
end for
return results
end function
function tm_get_col_value(atom mdl, integer row, integer col)
atom iter = allocate(32,1)
object data = tm_get_row_values(mdl,iter)
return data[col]
end function
function tm_set_col_value(atom mdl, integer row, integer col, object data)
atom iter = tm_get_iter_n(mdl,row)
atom fn = define_proc("gtk_list_store_set",{P,P,I,P,I})
if string(data) then data = allocate_string(data,1) end if
c_proc(fn,{mdl,iter,col-1,data,-1})
return 1
end function
function tm_get_col_data(atom mdl, integer row, integer col)
atom iter = tm_get_iter_n(mdl,row)
object data = tm_get_row_values(mdl,iter)
return data[col]
end function
widget[GtkTreeSortable] = {"gtk_tree_sortable",
{GtkTreeModel,GObject},
{"sort_column_changed",{P}},
{"set_sort_column_id",{P,I,I}},
{"get_sort_column_id",{P},-routine_id("ts_get_sort_col_id")},
{"get_sort_order",{P},-routine_id("ts_get_sort_order")},
{"is_sorted",{P},-routine_id("ts_is_sorted")},
{"set_sort_func",{P,I,P,P,P}},
{"set_default_sort_func",{P,P,P,P}},
{"has_default_sort_func",{P},B},
"GtkTreeSortable"}
function ts_is_sorted(atom mdl)
return gtk_func("gtk_tree_sortable_get_sort_column_id",{P,P,P},{mdl,0,0})
end function
function ts_get_sort_col_id(atom mdl)
integer col = allocate(32,1), order = allocate(32,1)
if gtk_func("gtk_tree_sortable_get_sort_column_id",{P,P,P},{mdl,col,order}) then
return peek4u(col)+1
else
return -1
end if
end function
function ts_get_sort_order(atom mdl)
integer col = allocate(32,1), order = allocate(32,1)
if gtk_func("gtk_tree_sortable_get_sort_column_id",{P,P,P},{mdl,col,order}) then
return peek4u(order)
else
return -1
end if
end function
widget[GtkViewport] = {"gtk_viewport",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkScrollable,GObject},
{"new",{P,P},P},
{"set_shadow_type",{P,I}},
{"get_shadow_type",{P},I},
{"get_bin_window",{P},P,0,GdkWindow},
{"get_view_window",{P},P,0,GdkWindow},
"GtkViewport"}
widget[GtkAppChooserWidget] = {"gtk_app_chooser_widget",
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkAppChooser,GObject},
{"new",{S},P},
{"set_show_default",{P,B}},
{"get_show_default",{P},B},
{"set_show_recommended",{P,B}},
{"get_show_recommended",{P},B},
{"set_show_fallback",{P,B}},
{"get_show_fallback",{P},B},
{"set_show_other",{P,B}},
{"get_show_other",{P},B},
{"set_show_all",{P,B}},
{"get_show_all",{P},B},
{"set_default_text",{P,S}},
{"get_default_text",{P},S},
"GtkAppChooserWidget"}
widget[GtkVolumeButton] = {"gtk_volume_button",
{GtkScaleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkActionable,GObject},
{"new",{},P},
"GtkVolumeButton"}
widget[GtkColorChooserWidget] = {"gtk_color_chooser_widget",
{GtkColorChooser,GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
"GtkColorChooserWidget"}
widget[GtkColorChooser] = {"gtk_color_chooser",
{GObject},
{"set_rgba",{P,P},-routine_id("cc_set_rgba")},
{"get_rgba",{P,I},-routine_id("cc_get_rgba")},
{"set_use_alpha",{P,B},-routine_id("cc_set_alpha")},
{"get_use_alpha",{P},-routine_id("cc_get_alpha")},
{"add_palette",{P,I,I,I,A}},
"GtkColorChooser"}
function cc_set_rgba(atom x, object c)
if string(c) then
c = to_rgba(c)
else
c = to_rgba(text:format("#[X]",c))
end if
gtk_proc("gtk_color_chooser_set_rgba",{P,P},{x,c})
return 1
end function
function cc_get_rgba(atom x, integer fmt)
atom fn = define_proc("gtk_color_chooser_get_rgba",{P,P})
atom rgba = allocate(32,1)
c_proc(fn,{x,rgba})
object c = gtk_func("gdk_rgba_to_string",{P},{rgba})
return fmt_color(c,fmt)
end function
function cc_set_alpha(atom x, integer b)
gtk_proc("gtk_color_chooser_set_use_alpha",{P,B},{x,b})
return 1
end function
function cc_get_alpha(atom x)
atom fn = define_func("gtk_color_chooser_get_use_alpha",{P},B)
return c_func(fn,{x})
end function
widget[GtkColorSelection] = {"gtk_color_selection", -- deprecated
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"set_has_opacity_control",{P,B}},
{"get_has_opacity_control",{P},B},
{"set_has_palette",{P,B}},
{"get_has_palette",{P},B},
{"set_current_rgba",{P,S},-routine_id("cs_set_current_rgba")},
{"get_current_rgba",{P,I},-routine_id("cs_get_current_rgba")},
{"set_current_alpha",{P,I}},
{"get_current_alpha",{P},I},
{"set_previous_rgba",{P,S},-routine_id("cs_set_previous_rgba")},
{"get_previous_rgba",{P,I},-routine_id("cs_get_previous_rgba")},
{"set_previous_alpha",{P,I}},
{"get_previous_alpha",{P},I},
{"is_adjusting",{P},B},
"GtkColorSelection"}
------------------------------------------------------------------------
-- following color functions make using RGB colors much easier,
-- converting automatically between various color notations
------------------------------------------------------------------------
function cs_set_current_rgba(atom x, object c)
c =peek_string(c)
gtk_proc("gtk_color_selection_set_current_rgba",{P,P},{x,to_rgba(c)})
return 1
end function
function cs_set_previous_rgba(atom x, object c)
c = peek_string(c)
gtk_proc("gtk_color_selection_set_previous_rgba",{P,P},{x,to_rgba(c)})
return 1
end function
function cs_get_current_rgba(atom x, integer fmt=0)
atom rgba = allocate(32,1)
atom fn = define_proc("gtk_color_selection_get_current_rgba",{P,P})
c_proc(fn,{x,rgba})
object c = gtk_func("gdk_rgba_to_string",{P},{rgba})
return fmt_color(c,fmt)
end function
function cs_get_previous_rgba(atom x, integer fmt=0)
atom rgba = allocate(32,1)
atom fn = define_proc("gtk_color_selection_get_previous_rgba",{P,P})
c_proc(fn,{x,rgba})
object c = gtk_func("gdk_rgba_to_string",{rgba})
return fmt_color(c,fmt)
end function
widget[GtkNativeDialog] = {"gtk_native_dialog",
{},
{"show",{P}},
{"hide",{P}},
{"destroy",{P}},
{"get_visible",{P},B},
{"set_modal",{P,B}},
{"get_modal",{P},B},
{"set_title",{P,S}},
{"get_title",{P},S},
{"set_transient_for",{P,P}},
{"get_transient_for",{P},P},
{"run",{P}},
"GtkNativeDialog"}
widget[GtkFileChooserNative] = {"gtk_file_chooser_native",
{},
{"new",{S,P,I,S,S},P},
{"get_accept_label",{P},S},
{"set_accept_label",{P,S}},
{"get_cancel_label",{P},S},
{"set_cancel_label",{P,S}},
"GtkFileChooserNative"}
widget[GtkFileChooser] = {"gtk_file_chooser",
{GtkWidget},
{"set_action",{P,I}},
{"get_action",{P},I},
{"set_local_only",{P,B}},
{"get_local_only",{P},B},
{"set_select_multiple",{P,B}},
{"get_select_multiple",{P},B},
{"set_show_hidden",{P,B}},
{"get_show_hidden",{P},B},
{"set_do_overwrite_confirmation",{P,B}},
{"get_do_overwrite_confirmation",{P},B},
{"set_create_folders",{P,B}},
{"get_create_folders",{P},B},
{"get_current_name",{P},S}, --GTK3.10
{"set_current_name",{P,S}},
{"set_filename",{P,S}},
{"get_filename",{P},S},
{"get_filenames",{P},A,0,GSList},
{"select_filename",{P,S}},
{"unselect_filename",{P},S},
{"select_all",{P}},
{"unselect_all",{P}},
{"set_current_folder",{P,S}},
{"get_current_folder",{P},S},
{"set_uri",{P,S}},
{"get_uri",{P},S},
{"select_uri",{P,S}},
{"unselect_uri",{P,S}},
{"get_uris",{P},A,0,GSList},
{"set_current_folder_uri",{P,S}},
{"get_current_folder_uri",{P},S},
{"set_preview_widget",{P,P}},
{"get_preview_widget",{P},P,0,GtkWidget},
{"set_preview_widget_active",{P,B}},
{"get_preview_widget_active",{P},B},
{"set_use_preview_label",{P,B}},
{"get_use_preview_label",{P},B},
{"get_preview_filename",{P},S},
{"get_preview_uri",{P},S},
{"set_extra_widget",{P,P}},
{"get_extra_widget",{P},P,0,GtkWidget},
{"add_filter",{P,P}},
{"remove_filter",{P,P}},
{"list_filters",{P},X,0,GSList},
{"set_filter",{P,P}},
{"get_filter",{P},P,0,GtkFileFilter},
{"add_shortcut_folder",{P,S,P},B},
{"remove_shortcut_folder",{P,S,P},B},
{"list_shortcut_folders",{P},A,0,GSList},
{"add_shortcut_folder_uri",{P,S,P},B},
{"remove_shortcut_folder_uri",{P,S,P},B},
{"list_shortcut_folder_uris",{P},A,0,GSList},
{"get_current_folder_file",{P},P,0,GFile},
{"get_file",{P},P,0,GFile},
{"get_files",{P},X,0,GFile},
{"get_preview_file",{P},P,0,GFile},
{"select_file",{P,P,P},B},
{"set_current_folder_file",{P,P,P},B},
{"set_file",{P,P,P},B},
{"unselect_file",{P,P}},
"GtkFileChooser"}
widget[GtkFileChooserButton] = {"gtk_file_chooser_button",
{GtkFileChooser,GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{S,I},P},
{"new_with_dialog",{P},P},
{"set_title",{P,S}},
{"get_title",{P},S},
{"set_width_chars",{P,I}},
{"get_width_chars",{P},I},
{"set_focus_on_click",{P,B}},
{"get_focus_on_click",{P},B},
"GtkFileChooserButton"}
widget[GtkFileChooserWidget] = {"gtk_file_chooser_widget",
{GtkFileChooser,GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{I},P},
"GtkFileChooserWidget"}
widget[GtkFileFilter] = {"gtk_file_filter",
{GtkBuildable,GObject},
{"new",{},P},
{"set_name",{P,S}},
{"get_name",{P},S},
{"add_mime_type",{P,S}},
{"add_pattern",{P,S}},
{"add_pixbuf_formats",{P}},
{"add_custom",{P,I,P,P,P}},
{"get_needed",{P},I},
{"filter",{P,P},B},
"GtkFileFilter"}
widget[GtkFontChooser] = {"gtk_font_chooser",
{GObject},
{"get_font_family",{P},P,0,PangoFontFamily},
{"get_font_face",{P},P,0,PangoFontFace},
{"get_font_size",{P},I},
{"set_font",{P,S}},
{"get_font",{P},S},
{"set_font_desc",{P,P}},
{"get_font_desc",{P},P,0,PangoFontDescription},
{"set_preview_text",{P,S}},
{"get_preview_text",{P},S},
{"set_show_preview_entry",{P,B}},
{"get_show_preview_entry",{P},B},
{"set_filter_func",{P,P,P,P}},
{"get_font_map",{P},P,0,PangoFontMap}, -- 3.18
{"set_font_map",{P,P}}, -- 3.18
"GtkFontChooser"}
widget[GtkFontChooserWidget] = {"gtk_font_chooser_widget",
{GtkFontChooser,GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
"GtkFontChooserWidget"}
widget[GtkInfoBar] = {"gtk_info_bar",
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"add_action_widget",{P,P,I}},
{"add_button",{P,S,I},P,0,GtkButton},
{"set_response_sensitive",{P,I,B}},
{"set_default_response",{P,I}},
{"response",{P,I}},
{"set_message_type",{P,I}},
{"get_message_type",{P},I},
{"get_action_area",{P},P,0,GtkWidget},
{"get_content_area",{P},P,0,GtkWidget},
{"set_show_close_button",{P,B}}, -- 3.10
{"get_show_close_button",{P},B}, -- 3.10
"GtkInfoBar"}
widget[GtkRecentChooser] = {"gtk_recent_chooser",
{GObject},
{"set_show_private",{P,B}},
{"get_show_private",{P},B},
{"set_show_not_found",{P,B}},
{"get_show_not_found",{P},B},
{"set_show_icons",{P,B}},
{"get_show_icons",{P},B},
{"set_select_multiple",{P,B}},
{"get_select_multiple",{P},B},
{"set_local_only",{P,B}},
{"get_local_only",{P},B},
{"set_limit",{P,I}},
{"get_limit",{P},I},
{"set_show_tips",{P,B}},
{"get_show_tips",{P},B},
{"set_sort_type",{P,I}},
{"get_sort_type",{P},I},
{"set_sort_func",{P,P,P,P}},
{"set_current_uri",{P,S,P},B},
{"get_current_uri",{P},S},
{"get_current_item",{P},P,0,GtkRecentInfo},
{"select_uri",{P,S,P},B},
{"unselect_uri",{P,S}},
{"select_all",{P}},
{"unselect_all",{P}},
{"get_items",{P},A,0,GSList},
{"get_uris",{P},A},
{"add_filter",{P,P}},
{"remove_filter",{P,P}},
{"list_filters",{P},X,0,GSList},
{"set_filter",{P,P}},
{"get_filter",{P},P,0,GtkRecentFilter},
"GtkRecentChooser"}
widget[GtkRecentChooserWidget] = {"gtk_recent_chooser_widget",
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkRecentChooser,GObject},
{"new",{P},-routine_id("newRecentChooserWidget")},
"GtkRecentChooserWidget"}
function newRecentChooserWidget(atom x=0)
if class_id(x) = GtkRecentManager then
return gtk_func("gtk_recent_chooser_widget_new_for_manager",{P},{x})
else
return gtk_func("gtk_recent_chooser_widget_new")
end if
end function
widget[GtkStatusbar] = {"gtk_statusbar",
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"get_context_id",{P,S},I},
{"push",{P,I,S},I},
{"pop",{P,I}},
{"remove",{P,I,I}},
{"remove_all",{P,I}},
{"get_message_area",{P},P},
"GtkStatusBar"}
widget[GtkFixed] = {"gtk_fixed",
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"put",{P,P,I,I}},
{"move",{P,P,I,I}},
"GtkFixed"}
widget[GtkGrid] = {"gtk_grid",
{GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"attach",{P,P,I,I,I,I}},
{"attach_next_to",{P,P,P,I,I,I}},
{"get_child_at",{P,I,I},P,0,GtkWidget},
{"insert_row",{P,I}},
{"remove_row",{P,I}}, --3.10
{"insert_column",{P,I}},
{"remove_column",{P,I}}, --3.10
{"insert_next_to",{P,P,I}},
{"set_row_homogeneous",{P,B}},
{"get_row_homogeneous",{P},B},
{"set_column_homogeneous",{P,B}},
{"get_column_homogeneous",{P},B},
{"set_row_spacing",{P,I}},
{"get_row_spacing",{P},I},
{"set_column_spacing",{P,I}},
{"get_column_spacing",{P},I},
{"set_baseline_row",{P,I}}, --3.10
{"get_baseline_row",{P},I}, --3.10
{"set_row_baseline_position",{P,I,I}}, --3.10
{"get_row_baseline_position",{P,I},I}, --3.10
"GtkGrid"}
widget[GtkPaned] = {"gtk_paned",
{GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{I},P},
{"add1",{P,P}},
{"add2",{P,P}},
{"pack1",{P,P,B,B}},
{"pack2",{P,P,B,B}},
{"get_child1",{P},P,0,GtkWidget},
{"get_child2",{P},P,0,GtkWidget},
{"set_position",{P,I}},
{"get_position",{P},I},
{"get_handle_window",{P},P,0,GdkWindow},
{"get_wide_handle",{P},B}, -- 3.16
{"set_wide_handle",{P,B}}, -- 3.16
"GtkPaned"}
widget[GtkIconInfo] = {"gtk_icon_info",
{GObject},
{"new",{P,P},-routine_id("newIconInfo")},
{"get_base_size",{P},I},
{"get_base_scale",{P},I}, --3.10
{"get_filename",{P},S},
{"get_display_name",{P},S}, -- deprecated 3.14
{"get_builtin_pixbuf",{P},P,0,GdkPixbuf}, -- deprecated 3.14
{"load_icon",{P},-routine_id("icon_info_load_icon")},
{"load_surface",{P,P,P},P,0,CairoSurface_t},
{"load_icon_async",{P,P,P,P}},
{"load_icon_finish",{P,P,P},P,0,GdkPixbuf},
{"load_symbolic",{P,P,P,P,P,B,P},P,0,GdkPixbuf},
{"load_symbolic_async",{P,P,P,P,P,P,P,P}},
{"load_symbolic_finish",{P,P,P,P},P,0,GdkPixbuf},
{"load_symbolic_for_context",{P,P,P,P},P,0,GdkPixbuf},
{"load_symbolic_for_context_async",{P,P,P,P,P}},
{"load_symbolic_for_context_finish",{P,P,P,P},P,0,GdkPixbuf},
{"set_raw_coordinates",{P,B}}, -- deprecated 3.14
{"get_embedded_rect",{P,P},B}, -- deprecated 3.14
{"get_attach_points",{P,A,P},B}, -- deprecated 3.14
{"is_symbolic",{P},B}, -- 3.12
"GtkIconInfo"}
function newIconInfo(atom theme, atom pix) -- reorder params;
return gtk_func("gtk_icon_info_new_for_pixbuf",{P,P},{theme,pix})
end function
function icon_info_load_icon(atom info) -- allow for err, register object;
atom err = allocate(8,1) err = 0
atom icn = gtk_func("gtk_icon_info_load_icon",{P,P},{info,err})
register(icn,GdkPixbuf)
return icn
end function
widget[GtkIconTheme] = {"gtk_icon_theme",
{GObject},
{"new",{P},-routine_id("newIconTheme")},
{"set_screen",{P,P}},
{"set_search_path",{P,S,I}},
{"get_search_path",{P,P,I}},
{"append_search_path",{P,S}},
{"prepend_search_path",{P,S}},
{"set_custom_theme",{P,S}},
{"has_icon",{P,S},B},
{"lookup_icon",{P,P,I,I},P,0,GtkIconInfo},
{"lookup_icon_for_scale",{P,P,I,I,I},P,0,GtkIconInfo},
{"choose_icon",{P,A,I,I},P,0,GtkIconInfo},
{"choose_icon_for_scale",{P,A,I,I,I},P,0,GtkIconInfo},
{"lookup_by_gicon",{P,P,I,I},P,0,GtkIconInfo},
{"load_icon",{P,S,I,I},-routine_id("icon_theme_load_icon")},
{"load_icon_for_scale",{P,S,I,I,I,P},P,0,GdkPixbuf},
{"load_surface",{P,S,I,I,P,I,P},P,0,CairoSurface_t},
{"list_contexts",{P},-routine_id("icon_theme_list_contexts")},
{"list_icons",{P,S},-routine_id("icon_theme_list_icons")},
{"get_icon_sizes",{P,S},A},
{"rescan_if_needed",{P},B},
{"get_example_icon_name",{P},S},
{"add_builtin_icon",{S,I,P}},
{"add_resource_path",{P,S}}, -- 3.14
"GtkIconTheme"}
function newIconTheme(atom x=0)
if class_id(x) = GdkScreen then
return gtk_func("gtk_icon_theme_get_for_screen",{P},{x})
else
return gtk_func("gtk_icon_theme_get_default")
end if
end function
function icon_theme_load_icon(atom theme, object name, integer size, integer flags)
atom err = allocate(8,1) err = 0
return gtk_func("gtk_icon_theme_load_icon",{P,P,I,I,P},{theme,name,size,flags,err})
end function
function icon_theme_list_contexts(atom theme)
object list = gtk_func("gtk_icon_theme_list_contexts",{P},{theme})
return to_sequence(list)
end function
function icon_theme_list_icons(atom theme, object context)
object list = gtk_func("gtk_icon_theme_list_icons",{P,P},{theme,context})
return to_sequence(list)
end function
widget[GtkIconView] = {"gtk_icon_view",
{GtkCellLayout,GtkScrollable,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"new_with_area",{P},P},
{"new_with_model",{P},P},
{"set_model",{P,P}},
{"get_model",{P},P,0,GtkTreeModel},
{"set_text_column",{P,I}},
{"get_text_column",{P},I},
{"set_markup_column",{P,I}},
{"get_markup_column",{P},I},
{"set_pixbuf_column",{P,I}},
{"get_pixbuf_column",{P},I},
{"get_visible_range",{P,I,I},B},
{"get_path_at_pos",{P,I,I},P,0,GtkTreePath},
{"get_item_at_pos",{P,I,I,I,I},B},
{"convert_widget_to_bin_window_coords",{P,I,I,I,I}},
{"set_cursor",{P,P,P,B}},
{"get_cursor",{P,I,I},B},
{"selected_foreach",{P,P,P}},
{"set_selection_mode",{P,I}},
{"get_selection_mode",{P},I},
{"set_columns",{P,I}},
{"get_columns",{P},I},
{"set_spacing",{P,I}},
{"get_spacing",{P},I},
{"set_row_spacing",{P,I}},
{"get_row_spacing",{P},I},
{"set_column_spacing",{P,I}},
{"get_column_spacing",{P},I},
{"set_margin",{P,I}},
{"get_margin",{P},I},
{"set_item_padding",{P,I}},
{"get_item_padding",{P},I},
{"set_activate_on_single_click",{P,B}}, --3.8
{"get_activate_on_single_click",{P},B}, --3.8
{"get_cell_rect",{P,P,P,P},B}, --3.6
{"select_path",{P,P}},
{"unselect_path",{P,P}},
{"path_is_selected",{P,P},B},
{"get_selected_items",{P},X,0,GList},
{"select_all",{P}},
{"unselect_all",{P}},
{"item_activated",{P,P}},
{"scroll_to_path",{P,P,B,F,F}},
{"get_visible_range",{P,I,I},B},
{"set_tooltip_item",{P,P,P}},
{"set_tooltip_cell",{P,P,P,P}},
{"get_tooltip_context",{P,I,I,B,P,P,P},B},
{"set_tooltip_column",{P,I}},
{"get_tooltip_column",{P},I},
{"get_item_row",{P,P},I},
{"get_item_column",{P,P},I},
{"enable_model_drag_source",{P,I,P,I,I}},
{"enable_model_drag_dest",{P,P,I,I}},
{"unset_model_drag_source",{P}},
{"unset_model_drag_dest",{P}},
{"set_reorderable",{P,B}},
{"get_reorderable",{P},B},
{"set_drag_dest_item",{P,I,I}},
{"get_drag_dest_item",{P,I,I}},
{"get_dest_item_at_pos",{P,I,I,I,I},B},
{"create_drag_icon",{P,P},P,0,CairoSurface_t},
"GtkIconView"}
widget[GtkLayout] = {"gtk_layout",
{GtkContainer,GtkWidget,GtkBuildable,GtkScrollable,GObject},
{"new",{P,P},P},
{"put",{P,P,I,I}},
{"move",{P,P,I,I}},
{"set_size",{P,I,I}},
{"get_size",{P,I,I}},
{"get_bin_window",{P},P,0,GdkWindow},
"GtkLayout"}
widget[GtkSeparatorMenuItem] = {"gtk_separator_menu_item",
{GtkMenuItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{},P},
"GtkSeparatorMenuItem"}
widget[GtkRecentChooserMenu] = {"gtk_recent_chooser_menu",
{GtkMenu,GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GtkRecentChooser,GObject},
{"new",{},P},
{"new_for_manager",{P},P},
{"set_show_numbers",{P,B}},
{"get_show_numbers",{P},B},
"GtkRecentChooserMenu"}
widget[GtkRecentFilter] = {"gtk_recent_filter",
{GtkBuildable,GObject},
{"new",{},P},
{"set_name",{P,S}},
{"get_name",{P},S},
{"add_mime_type",{P,S}},
{"add_pattern",{P,S}},
{"add_pixbuf_formats",{P}},
{"add_group",{P,S}},
{"add_age",{P,I}},
{"add_application",{P,S}},
{"add_custom",{P,I,P,P,P}},
{"get_needed",{P},I},
{"filter",{P,P},B},
"GtkRecentFilter"}
widget[GtkRecentInfo] = {"gtk_recent_info",
{GObject},
{"get_uri",{P},S},
{"get_display_name",{P},S},
{"get_description",{P},S},
{"get_mime_type",{P},S},
{"get_added",{P},I},
{"get_modified",{P},I},
{"get_visited",{P},I},
{"get_private_hint",{P},B},
{"get_application_info",{P,S,S,I,I},B},
{"get_applications",{P,I},V},
{"last_application",{P},S},
{"has_application",{P,S},B},
{"create_app_info",{P,S,P},P,0,GAppInfo},
{"get_groups",{P,I},A},
{"has_group",{P,S},B},
{"get_icon",{P,I},P,0,GdkPixbuf},
{"get_gicon",{P},P,0,GIcon},
{"get_short_name",{P},S},
{"get_uri_display",{P},S},
{"get_age",{P},I},
{"is_local",{P},B},
{"exists",{P},B},
{"match",{P,P},B},
"GtkRecentInfo"}
widget[GtkSettings] = {"gtk_settings",
{GtkStyleProvider,GObject},
{"new",{},-routine_id("newSettings")},
{"reset_property",{P,S}}, -- 3.20
"GtkSettings"}
function newSettings(atom x=0)
if class_id(x) = GdkScreen then
return gtk_func("gtk_settings_get_for_screen",{P},{x})
else
return gtk_func("gtk_settings_get_default")
end if
end function
widget[GtkSizeGroup] = {"gtk_size_group",
{GtkBuildable,GObject},
{"new",{I},P},
{"set_mode",{P,I}},
{"get_mode",{P},I},
{"set_ignore_hidden",{P,B}},
{"get_ignore_hidden",{P},B},
{"add_widget",{P,P}},
{"add_widgets",{P,P},-routine_id("sg_add_widgets")},
{"remove_widget",{P,P}},
{"get_widgets",{P},X,0,GSList},
"GtkSizeGroup"}
function sg_add_widgets(atom group, object widgets) -- allow {list} of widgets;
if atom(widgets) then
set(group,"add widget",widgets)
else
for i = 1 to length(widgets) do
set(group,"add widget",widgets[i])
end for
end if
return 1
end function
widget[GtkTargetEntry] = {"gtk_target_entry",
{GObject},
{"new",{S,I,I},P},
{"copy",{P},P,0,GtkTargetEntry},
{"free",{P}},
"GtkTargetEntry"}
widget[GtkTargetList] = {"gtk_target_list",
{GObject},
{"new",{P,I},P},
{"add",{P,P,I,I}},
{"add_table",{P,P,I}},
{"add_text_targets",{P,I}},
{"add_image_targets",{P,I,B}},
{"add_uri_targets",{P,I}},
{"add_rich_text_targets",{P,I,B,P}},
{"remove",{P,P}},
{"find",{P,P,P},B},
"GtkTargetList"}
widget[GtkTextChildAnchor] = {"gtk_text_child_anchor",
{GObject},
{"new",{},P},
{"get_deleted",{P},B},
{"get_widgets",{P},X,0,GList},
"GtkTextChildAnchor"}
widget[GtkTextMark] = {"gtk_text_mark",
{GObject},
{"new",{S,B},P},
{"set_visible",{P,B}},
{"get_visible",{P},B},
{"get_deleted",{P},B},
{"get_name",{P},S},
{"get_buffer",{P},P,0,GtkTextBuffer},
{"get_left_gravity",{P},B},
"GtkTextMark"}
widget[GtkTextTag] = {"gtk_text_tag",
{GObject},
{"new",{S},P},
{"set_priority",{P,I}},
{"get_priority",{P},I},
{"event",{P,P,P,P},B},
{"changed",{P,B}}, -- 3.20
"GtkTextTag"}
widget[GtkTextAttributes] = {"gtk_text_attributes",
{GObject},
{"new",{},P},
{"copy",{P},P,0,GtkTextAttributes},
{"copy_values",{P,P}},
"GtkTextAttributes"}
widget[GtkTextTagTable] = {"gtk_text_tag_table",
{GtkBuildable,GObject},
{"new",{},P},
{"add",{P,P}},
{"remove",{P,P}},
{"lookup",{P,S},P,0,GtkTextTag},
{"foreach",{P,P,P}},
{"get_size",{P},I},
"GtkTextTagTable"}
widget[GtkMenuShell] = {"gtk_menu_shell",
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"append",{P,P},-routine_id("ms_append")},
{"prepend",{P,P}},
{"insert",{P,P,I}},
{"deactivate",{P}},
{"select_item",{P,P}},
{"select_first",{P,B}},
{"deselect",{P}},
{"activate_item",{P,P,B}},
{"cancel",{P}},
{"set_take_focus",{P,B}},
{"get_take_focus",{P},B},
{"get_selected_item",{P},P,0,GtkWidget},
{"get_parent_shell",{P},P,0,GtkWidget},
{"bind_model",{P,P,S,B}}, --3.6
"GtkMenuShell"}
function ms_append(atom menu, object items) -- allow {list} of items;
if atom(items) then
gtk_proc("gtk_menu_shell_append",{P,P},{menu,items})
else
for i = 1 to length(items) do
ms_append(menu,items[i])
end for
end if
return 1
end function
widget[GtkNotebook] = {"gtk_notebook",
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"append_page",{P,P,P},I},
{"append_page_menu",{P,P,P,P},I},
{"prepend_page",{P,P,P},I},
{"prepend_page_menu",{P,P,P,P},I},
{"insert_page",{P,P,P,I},I},
{"insert_page_menu",{P,P,P,P,I},I},
{"remove_page",{P,I}},
{"page_num",{P,I},I},
{"next_page",{P}},
{"prev_page",{P}},
{"reorder_child",{P,P,I}},
{"set_tab_pos",{P,I}},
{"get_tab_pos",{P},I},
{"set_show_tabs",{P,B}},
{"get_show_tabs",{P},B},
{"set_show_border",{P,B}},
{"get_show_border",{P},B},
{"set_scrollable",{P,B}},
{"get_scrollable",{P},B},
{"popup_enable",{P}},
{"popup_disable",{P}},
{"get_current_page",{P},I},
{"set_menu_label",{P,P},0,GtkWidget},
{"get_menu_label",{P,P},P},
{"get_menu_label_text",{P,P},S},
{"get_n_pages",{P},I},
{"get_nth_page",{P,I},P,0,GtkWidget},
{"set_tab_label",{P,P}},
{"get_tab_label",{P,P},P,0,GtkWidget},
{"set_tab_label_text",{P,P,S}},
{"get_tab_label_text",{P,P},S},
{"set_tab_detachable",{P,P,B}},
{"get_tab_detachable",{P,P},B},
{"set_current_page",{P,I}},
{"set_group_name",{P,S}},
{"get_group_name",{P},S},
{"set_action_widget",{P,P,I}},
{"get_action_widget",{P,I},P,0,GtkWidget},
{"detach_tab",{P,P}}, -- 3.16
"GtkNotebook"}
widget[GtkSocket] = {"gtk_socket",
{GtkContainer,GtkWidget,GObject},
{"new",{},P},
{"add_id",{P,P}},
{"get_id",{P},P},
{"get_plug_window",{P},P,0,GdkWindow},
"GtkSocket"}
widget[GtkPlug] = {"gtk_plug",
{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{I},P},
{"get_id",{P},I},
{"get_embedded",{P},B},
{"get_socket_window",{P},P,0,GdkWindow},
"GtkPlug"}
widget[GtkToolPalette] = {"gtk_tool_palette",
{GtkScrollable,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"set_exclusive",{P,P,B}},
{"get_exclusive",{P,P},B},
{"set_expand",{P,P,B}},
{"get_expand",{P,P},B},
{"set_group_position",{P,P,I}},
{"get_group_position",{P,P},I},
{"set_icon_size",{P,I}},
{"get_icon_size",{P},I},
{"unset_icon_size",{P}},
{"set_style",{P,I}},
{"get_style",{P},I},
{"unset_style",{P}},
{"add_drag_dest",{P,P,I,I,I}},
{"get_drag_item",{P,P},P,0,GtkWidget},
{"get_drop_group",{P,I,I},P,0,GtkToolItemGroup},
{"set_drag_source",{P,I}},
"GtkToolPalette"}
widget[GtkTextView] = {"gtk_text_view",
{GtkScrollable,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"new_with_buffer",{P},P},
{"set_buffer",{P,P}},
{"get_buffer",{P},P,0,GtkTextBuffer},
{"scroll_to_mark",{P,P,D,B,D,D}},
{"scroll_to_iter",{P,P,D,B,D,D},B},
{"scroll_mark_onscreen",{P,P}},
{"place_cursor_onscreen",{P},B},
{"get_visible_rect",{P,P}},
{"get_iter_location",{P,P,P}},
{"get_cursor_locations",{P,P,P,P}},
{"get_line_at_y",{P,P,I,I}},
{"get_line_yrange",{P,P,I,I}},
{"get_iter_at_location",{P,P,I,I}},
{"get_iter_at_position",{P,P,I,I,I}},
{"buffer_to_window_coords",{P,P,I,I,I,I}},
{"window_to_buffer_coords",{P,P,I,I,I,I}},
{"get_window",{P,I},P,0,GdkWindow},
{"set_border_window_size",{P,I,I}},
{"get_border_window_size",{P,P},I},
{"forward_display_line",{P,P},B},
{"backward_display_line",{P,P},B},
{"forward_display_line_end",{P,P},B},
{"backward_display_line_start",{P,P},B},
{"starts_display_line",{P,P},B},
{"move_visually",{P,P,I},B},
{"add_child_at_anchor",{P,P,P}},
{"add_child_in_window",{P,P,P,I,I}},
{"move_child",{P,P,I,I}},
{"set_wrap_mode",{P,I}},
{"get_wrap_mode",{P},I},
{"set_editable",{P,B}},
{"get_editable",{P},B},
{"set_cursor_visible",{P,B}},
{"get_cursor_visible",{P},B},
{"set_overwrite",{P,B}},
{"get_overwrite",{P},B},
{"set_pixels_above_lines",{P,I}},
{"get_pixels_above_lines",{P},I},
{"set_pixels_below_lines",{P,I}},
{"get_pixels_below_lines",{P},I},
{"set_pixels_inside_wrap",{P,I}},
{"get_pixels_inside_wrap",{P},I},
{"set_justification",{P,I}},
{"get_justification",{P},I},
{"set_left_margin",{P,I}},
{"get_left_margin",{P},I},
{"set_right_margin",{P,I}},
{"get_right_margin",{P},I},
{"set_indent",{P,I}},
{"get_indent",{P},I},
{"set_tabs",{P,A}},
{"get_tabs",{P},A,0,PangoTabArray},
{"set_accepts_tab",{P,B}},
{"get_accepts_tab",{P},B},
{"im_context_filter_keypress",{P,P},B},
{"get_default_attributes",{P},P,0,GtkTextAttributes},
{"reset_im_context",{P}},
{"set_input_purpose",{P,I}}, -- 3.6+
{"get_input_purpose",{P},I}, -- 3.6+
{"set_input_hints",{P,I}}, -- 3.6+
{"get_input_hints",{P},I}, -- 3.6+
{"get_monospace",{P},B}, -- 3.16
{"set_monospace",{P,B}}, -- 3.16
{"get_bottom_margin",{P},I}, -- 3.18
{"set_bottom_margin",{P,I}}, -- 3.18
{"get_top_margin",{P},I}, -- 3.18
{"set_top_margin",{P,I}}, -- 3.18
{"reset_cursor_blink",{P}}, -- 3.20
"GtkTextView"}
widget[GtkToolShell] = {"gtk_tool_shell", -- WARNING!
{GtkWidget}, -- see GTK3 docs re: GtkToolShell functions
{"get_ellipsize_mode",{P},I},
{"get_icon_size",{P},I},
{"get_orientation",{P},I},
{"get_relief_style",{P},I},
{"get_style",{P},I},
{"get_text_alignment",{P},F},
{"get_text_orientation",{P},I},
{"get_text_size_group",{P},P,0,GtkSizeGroup},
{"rebuild_menu",{P}},
"GtkToolShell"}
widget[GtkToolbar] = {"gtk_toolbar",
{GtkToolShell,GtkContainer,GtkWidget,GtkOrientable,GtkBuildable,GObject},
{"new",{},P},
{"insert",{P,P,I}},
{"get_item_index",{P,P},I},
{"get_n_items",{P},I},
{"get_nth_item",{P},P},
{"get_drop_index",{P,I,I},I},
{"set_drop_highlight_item",{P,P,I}},
{"set_show_arrow",{P,B}},
{"get_show_arrow",{P},B},
{"set_icon_size",{P,I}},
{"get_icon_size",{P},I},
{"unset_icon_size",{P}},
{"set_style",{P,I}},
{"get_style",{P},I},
{"unset_style",{P}},
"GtkToolbar"}
widget[GtkToolItemGroup] = {"gtk_tool_item_group",
{GtkToolShell,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S},P},
{"set_collapsed",{P,B}},
{"get_collapsed",{P},B},
{"set_ellipsize",{P,I}},
{"get_ellipsize",{P},I},
{"get_drop_item",{P,I,I},P,0,GtkToolItem},
{"get_n_items",{P},I},
{"get_nth_item",{P,I},P,0,GtkToolItem},
{"set_label",{P,S}},
{"get_label",{P},S},
{"set_label_widget",{P,P}},
{"get_label_widget",{P},P,0,GtkWidget},
{"set_header_relief",{P,I}},
{"get_header_relief",{P},I},
{"insert",{P,P,I}},
{"set_item_position",{P,P,I}},
"GtkToolItemGroup"}
widget[GtkTooltip] = {"gtk_tooltip",
{GObject},
{"set_text",{P,S}},
{"set_markup",{P,S}},
{"set_icon",{P,P}},
{"set_icon_from_icon_name",{P,S,I}},
{"set_icon_from_gicon",{P,P,I}},
{"set_custom",{P,P}},
{"trigger_tooltip_query",{P}},
{"set_tip_area",{P,P}},
"GtkTooltip"}
function newColumn(object params)
params = keyvalues(params)
atom c = create(GtkTreeViewColumn)
atom r = -1
object t = vlookup("type",params,1,2)
switch t do
case "text","markup" then r = create(GtkCellRendererText)
case "pixbuf" then r = create(GtkCellRendererPixbuf)
case "progress" then r = create(GtkCellRendererProgress)
case "spin" then r = create(GtkCellRendererSpin)
case "toggle" then r = create(GtkCellRendererToggle)
case "combo" then r = create(GtkCellRendererCombo)
case else display("Error specifying cell renderer type")
end switch
if r = -1 then
Warn(,,"Create new column","Must specify a renderer type (i.e. type=text)")
abort(1)
end if
set(c,{{"pack start",r,TRUE}})
for i = 1 to length(params) do
if equal("TRUE",params[i][2]) then params[i][2] = 1 end if
if equal("FALSE",params[i][2]) then params[i][2] = 0 end if
if equal("1",params[i][2]) then params[i][2] = 1 end if
if equal("0",params[i][2]) then params[i][2] = 0 end if
if match("column.",params[i][1]) then
set(c,params[i][1][8..$],params[i][2])
elsif match("renderer.",params[i][1]) then
set(r,params[i][1][10..$],params[i][2])
elsif equal("cell_data_func",params[i][1]) then
params[i][2] = to_number(params[i][2])
set(c,"cell data func",r,params[i][2])
else
switch params[i][1] do
case "type" then break -- do nothing
case "title","sort_column_id" then set(c,params[i][1],params[i][2])
case "toggled" then connect(r,"toggled",_(params[i][2]))
case "edited" then connect(r,"edited",_(params[i][2]))
--display("Connecting [] []",{params[i][2],_(params[i][2])})
case else set(c,"add attribute",r,params[i][1],params[i][2])
end switch
end if
end for
set(c,"data","renderer",sprintf("%d",r))
return c
end function
widget[GtkTreeView] = {"gtk_tree_view",
{GtkContainer,GtkWidget,GtkBuildable,GtkScrollable,GObject},
{"new",{P},-routine_id("newTreeView")},
{"set_model",{P,P}},
{"get_model",{P},P,0,GtkTreeModel},
{"get_selection",{P},P,0,GtkTreeSelection},
{"set_headers_visible",{P,B}},
{"get_headers_visible",{P},B},
{"set_headers_clickable",{P,B}},
{"get_headers_clickable",{P},B},
{"set_show_expanders",{P,B}},
{"get_show_expanders",{P},B},
{"set_expander_column",{P,P}},
{"get_expander_column",{P},P,0,GtkTreeViewColumn},
{"set_level_indentation",{P,I}},
{"get_level_indentation",{P},I},
{"columns_autosize",{P}},
{"set_rules_hint",{P,B}}, -- deprecated 3.14
{"get_rules_hint",{P},B}, -- deprecated 3.14
{"set_activate_on_single_click",{P,B}}, -- GTK 3.8+
{"get_activate_on_single_click",{P},B}, -- GTK 3.8+
{"append_column",{P,P},I},
{"append_columns",{P,P},-routine_id("tv_append_columns")},
{"remove_column",{P,P,I}},
{"insert_column",{P,P,I}},
{"insert_column_with_attributes",{P,I,S,S,I,I}},
{"insert_column_with_data_func",{P,I,S,P,P,P,P}},
{"get_n_columns",{P},I},
{"get_column",{P,I},P,0,GtkTreeViewColumn},
{"get_columns",{P},X,0,GList},
{"move_column_after",{P,P,P}},
{"set_column_drag_function",{P,P,P,P}},
{"scroll_to_point",{P,I,I}},
{"scroll_to_cell",{P,P,P,P,F,F},-routine_id("tv_scroll_to_cell")},
{"set_cursor",{P,P,P,B}},
{"set_cursor_on_cell",{P,P,P,P,B}},
{"get_cursor",{P,P,P}},
{"row_activated",{P,P,P}},
{"expand_row",{P,P,B},B},
{"expand_all",{P}},
{"expand_to_path",{P,P}},
{"collapse_all",{P}},
{"map_expanded_rows",{P,P,P}},
{"row_expanded",{P,P},B},
{"set_reorderable",{P,B}},
{"get_reorderable",{P,B}},
{"get_path_at_pos",{P,I,I,P,P,I,I},B},
{"is_blank_at_pos",{P,I,I,P,P,I,I},B},
{"get_cell_area",{P,P,P,P}},
{"get_background_area",{P,P,P,P}},
{"get_visible_rect",{P,P}},
{"get_visible_range",{P,P,P},B},
{"get_bin_window",{P},P,0,GdkWindow},
{"convert_bin_window_to_tree_coords",{P,I,I,I,I}},
{"convert_bin_window_to_widget_coords",{P,I,I,I,I}},
{"convert_tree_to_bin_window_coords",{P,I,I,I,I}},
{"convert_tree_to_widget_coords",{P,I,I,I,I}},
{"convert_widget_to_bin_window_coords",{P,I,I,I,I}},
{"convert_widget_to_tree_coords",{P,I,I,I,I}},
{"enable_model_drag_dest",{P,P,I,I}},
{"enable_model_drag_source",{P,I,P,I,I}},
{"unset_rows_drag_source",{P}},
{"unset_rows_drag_dest",{P}},
{"set_drag_dest_row",{P,P,I}},
{"get_drag_dest_row",{P,P,P}},
{"get_drag_dest_row_at_pos",{P,I,I,P,P},B},
{"create_row_drag_icon",{P,P},P,0,CairoSurface_t},
{"set_enable_search",{P,B}},
{"get_enable_search",{P},B},
{"set_search_column",{P,I}},
{"get_search_column",{P},I},
{"set_search_equal_func",{P,P,P,P}},
{"get_search_equal_func",{P},P},
{"set_search_entry",{P,P}},
{"get_search_entry",{P},P,0,GtkEntry},
{"set_search_position_func",{P,P,P,P}},
{"get_search_position_func",{P},P},
{"set_fixed_height_mode",{P,B}},
{"get_fixed_height_mode",{P},B},
{"set_hover_selection",{P,B}},
{"get_hover_selection",{P},B},
{"set_hover_expand",{P,B}},
{"get_hover_expand",{P},B},
{"set_destroy_count_func",{P,P,P,P}},
{"set_row_separator_func",{P,P,P,P}},
{"get_row_separator_func",{P},P},
{"set_rubber_banding",{P,B}},
{"get_rubber_banding",{P},B},
{"set_enable_tree_lines",{P,B}},
{"get_enable_tree_lines",{P},B},
{"set_grid_lines",{P,B}},
{"get_grid_lines",{P},B},
{"set_tooltip_row",{P,P,P}},
{"set_tooltip_cell",{P,P,P,P,P}},
{"set_tooltip_column",{P,I}},
{"get_tooltip_column",{P},I},
{"get_tooltip_context",{P,I,I,B,P,P,P},B},
{"select_row",{P,P,D,D},-routine_id("tv_select_row")},
{"get_selected_row_data",{P,P},-routine_id("tv_get_selected_row_data")},
{"get_selected_col_data",{P,P,I},-routine_id("tv_get_selected_col_data")},
"GtkTreeView"}
function newTreeView(atom x=0)
if class_id(x) = GtkTreeModel then
return gtk_func("gtk_tree_view_new_with_model",{P},{x})
else
return gtk_func("gtk_tree_view_new")
end if
end function
constant sfn1 = define_func("gtk_tree_view_get_model",{P},P)
constant sfn2 = define_func("gtk_tree_model_get_n_columns",{P},I)
constant sfn3 = define_func("gtk_tree_model_get_iter",{P,P,P},B)
constant sfn4 = define_func("gtk_tree_model_get_column_type",{P,I},I)
constant sp1 = define_proc("gtk_tree_model_get",{P,P,I,P,I})
function tv_get_selected_col_data(atom view, atom path, integer col)
object data = tv_get_selected_row_data(view,path)
return data[col]
end function
function tv_get_selected_row_data(atom view, atom path)
atom mdl = c_func(sfn1,{view})
integer ncols = c_func(sfn2,{mdl})
object data = repeat(0,ncols)
object types = repeat(0,ncols)
atom iter = allocate(32,1)
object result
if c_func(sfn3,{mdl,iter,path}) then
for i = 1 to length(data) do
data[i] = allocate(32,1)
types[i] = c_func(sfn4,{mdl,i-1})
c_proc(sp1,{mdl,iter,i-1,data[i],-1})
end for
end if
for i = 1 to length(data) do
switch types[i] do
case gSTR then
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(data[i])
elsedef
result = peek4u(data[i])
end ifdef
if result > 0 then
result = peek_string(result)
end if
data[i] = result
case else data[i] = peek4u(data[i])
end switch
end for
return data
end function
function tv_scroll_to_cell(atom v, atom p, atom c=0, integer align=0, atom row=0, atom col=0)
gtk_proc("gtk_tree_view_scroll_to_cell",{P,P,P,I,F,F},{v,p,c,align,row,col})
return 1
end function
function tv_append_columns(atom store, object cols)
if atom(cols) then
gtk_func("gtk_tree_view_append_column",{P,P},{store,cols})
else
for i = 1 to length(cols) do
tv_append_columns(store,cols[i])
end for
end if
return 1
end function
function tv_select_row(atom tv, object path, atom rowalign=0, atom colalign=0)
path = create(GtkTreePath,path)
gtk_func("gtk_tree_view_scroll_to_cell",
{P,P,I,I,F,F},{tv,path,0,1,rowalign,colalign})
return 1
end function
widget[GtkTreeViewColumn] = {"gtk_tree_view_column",
{GtkCellLayout,GtkBuildable,GObject},
{"new",{},P},
{"set_title",{P,S}},
{"get_title",{P},S},
{"pack_start",{P,P,B}},
{"pack_end",{P,P,B}},
{"clear",{P}},
{"clicked",{P}},
{"add_attribute",{P,P,S,I}},
{"set_spacing",{P,I}},
{"get_spacing",{P},I},
{"set_visible",{P,B}},
{"get_visible",{P},B},
{"set_resizable",{P,B}},
{"get_resizable",{P},B},
{"set_sizing",{P,I}},
{"get_sizing",{P},I},
{"set_fixed_width",{P,I}},
{"get_fixed_width",{P},I},
{"set_min_width",{P,I}},
{"get_min_width",{P},I},
{"set_max_width",{P,I}},
{"get_max_width",{P},I},
{"set_expand",{P,B}},
{"get_expand",{P},B},
{"set_clickable",{P,B}},
{"get_clickable",{P},B},
{"set_widget",{P,P}},
{"get_widget",{P},P},
{"get_button",{P},P,0,GtkWidget},
{"set_alignment",{P,F}},
{"get_alignment",{P},F},
{"set_reorderable",{P,B}},
{"get_reorderable",{P},B},
{"set_sort_column_id",{P,I}},
{"get_sort_column_id",{P},I},
{"set_sort_indicator",{P,B}},
{"get_sort_indicator",{P},B},
{"set_sort_order",{P,I}},
{"get_sort_order",{P},I},
{"cell_set_cell_data",{P,P,P,B,B}},
{"cell_get_size",{P,P,I,I,I,I}},
{"cell_get_position",{P,P,I,I},B},
{"cell_is_visible",{P},B},
{"focus_cell",{P,P}},
{"queue_resize",{P}},
{"get_tree_view",{P},P,0,GtkTreeView},
{"get_x_offset",{P},I},
"GtkTreeViewColumn"}
widget[GtkTreeSelection] = {"gtk_tree_selection",
{GObject},
{"set_mode",{P,I}},
{"get_mode",{P},I},
{"set_select_function",{P,P,P,P}},
{"get_select_function",{P},P},
{"get_user_data",{P},P},
{"get_tree_view",{P},P},
{"get_selected",{P,P,P},B},
{"selected_foreach",{P,P,P}},
{"count_selected_rows",{P},I},
{"select_path",{P,P}},
{"unselect_path",{P,P}},
{"path_is_selected",{P,P},B},
{"select_iter",{P,P}},
{"unselect_iter",{P,P}},
{"iter_is_selected",{P,P},B},
{"select_all",{P}},
{"unselect_all",{P}},
{"select_range",{P,P,P}},
{"unselect_range",{P,P,P}},
{"get_selected_row",{P,P},-routine_id("ts_get_selected_row")},
{"get_selected_rows",{P,P},-routine_id("ts_get_selected_rows")},
{"get_selected_row_data",{P},-routine_id("ts_get_selected_row_data")},
"GtkTreeSelection"}
function ts_get_selected_rows(atom selection, atom model)
object list = gtk_func("gtk_tree_selection_get_selected_rows",
{P,P},{selection,model})
list = to_sequence(list,3)
return list +1
end function
function ts_get_selected_row(atom selection, atom model)
object result = ts_get_selected_rows(selection,model)
if equal({},result) then return 0
else return result[1]
end if
end function
function ts_get_selected_row_data(atom selection)
atom mdl = allocate(32), iter = allocate(32)
integer n
object x,t, val, result
if gtk_func("gtk_tree_selection_get_selected",{P,P,P},{selection,mdl,iter}) then
mdl = peek4u(mdl)
n = gtk_func("gtk_tree_model_get_n_columns",{P},{mdl})
x = repeat(0,n) t = x
for i = 1 to n do
val = allocate(32,1)
gtk_proc("gtk_tree_model_get",{P,P,I,P,I},{mdl,iter,i-1,val,-1})
t[i] = gtk_func("gtk_tree_model_get_column_type",{P,I},{mdl,i-1})
x[i] = val
end for
for i = 1 to length(x) do
switch t[i] do
case gSTR then
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(x[i])
elsedef
result = peek4u(x[i])
end ifdef
if result > 0 then
x[i] = peek_string(result)
end if
case gFLT then x[i] = float32_to_atom(peek({x[i],4}))
case gDBL then x[i] = float64_to_atom(peek({x[i],8}))
case else x[i] = peek4u(x[i])
end switch
end for
return x
end if
return -1
end function
widget[GtkActionBar] = {"gtk_action_bar", -- GTK 3.12
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"pack_start",{P,P}},
{"pack_end",{P,P}},
{"get_center_widget",{P},P},
{"set_center_widget",{P,P}},
"GtkActionBar"}
widget[GtkAccelLabel] = {"gtk_accel_label",
{GtkLabel,GtkMisc,GtkWidget,GtkBuildable,GObject},
{"new",{S},P},
{"get_accel",{P,I,I}}, -- 3.14
{"set_accel",{P,I,I}},
{"set_accel_closure",{P,P}},
{"set_accel_widget",{P,P}},
{"get_accel_widget",{P},P,0,GtkWidget},
{"get_accel_width",{P},I},
{"refetch",{P},B},
"GtkAccelLabel"}
widget[GtkAccelGroup] = {"gtk_accel_group",
{GObject},
{"new",{},P},
{"connect",{P,I,I,I,P}},
{"connect_by_path",{P,S,P}},
{"disconnect",{P,P},B},
{"disconnect_key",{P,I,I},B},
{"activate",{P,I,P,I,I},B},
{"lock",{P}},
{"unlock",{P}},
{"get_is_locked",{P},B},
{"from_accel_closure",{P},P,0,GtkAccelGroup},
{"get_modifier_mask",{P},I},
{"find",{P,P,P},P},
"GtkAccelGroup"}
widget[GtkArrow] = {"gtk_arrow", -- deprecated 3.14
{GtkMisc,GtkWidget,GtkBuildable,GObject},
{"new",{I,I},P},
{"set",{P,I,I}},
"GtkArrow"}
widget[GtkCalendar] = {"gtk_calendar",
{GtkWidget,GtkBuildable,GObject},
{"clear_marks",{P}},
{"get_date",{P,I},-routine_id("cal_get_date")},
{"get_ymd",{P,I},-routine_id("cal_get_ymd")},
{"get_eu_date",{P},-routine_id("cal_get_eu_date")},
{"get_day",{P},-routine_id("cal_get_day")},
{"get_month",{P},-routine_id("cal_get_month")},
{"get_year",{P},-routine_id("cal_get_year")},
{"get_datetime",{P,I},-routine_id("cal_get_datetime")},
{"get_day_is_marked",{P,I},B},
{"get_display_options",{P},I},
{"mark_day",{P,I},B},
{"new",{P},-routine_id("newCalendar")},
{"select_day",{P,I}},
{"select_month",{P,I,I},-routine_id("cal_select_month")},
{"set_display_options",{P,I}},
{"unmark_day",{P,I},B},
{"set_detail_func",{P,P,P,P}},
{"set_detail_width_chars",{P,I}},
{"get_detail_width_chars",{P},I},
{"get_detail_height_rows",{P},I},
{"set_detail_height_rows",{P,I}},
{"set_date",{P,P},-routine_id("cal_set_date")},
{"set_eu_date",{P,P},-routine_id("cal_set_date")},
{"set_day",{P,I},-routine_id("cal_set_day")},
{"set_month",{P,I},-routine_id("cal_set_month")},
{"set_year",{P,I},-routine_id("cal_set_year")},
"GtkCalendar"}
function newCalendar(object d = 0) -- create calendar, set optional date;
object cal = gtk_func("gtk_calendar_new")
if atom(d) and d = 0 then return cal
else gtk_proc("gtk_calendar_select_month",{P,I,I},{cal,d[2]-1,d[1]})
gtk_proc("gtk_calendar_select_day",{P,I},{cal,d[3]})
return cal
end if
end function
------------------------------------------------------------------------
-- Calendar convenience functions
------------------------------------------------------------------------
-- Handle odd month numbering scheme:
-- Q: If the first day of the month is 1, then why is the first month
-- of the year zero
-- A: Blame a C programmer!
-- Here we fix that, plus change the set_date routine from two steps
-- to one; also, provide for standard formatting to be used when
-- getting the date. See std/datetime.e for the formats available.
------------------------------------------------------------------------
constant get_date = define_proc("gtk_calendar_get_date",{P,I,I,I})
function cal_select_month(atom handle, integer mo, integer yr=0)
while mo < 1 do yr -= 1 mo += 12 end while
while mo > 12 do yr += 1 mo -= 12 end while
gtk_proc("gtk_calendar_select_month",{P,I,I},{handle,mo-1,yr})
return 1
end function
function cal_set_day(atom handle, integer day)
object curr = get(handle,"date")
curr[3] = day
cal_set_date(handle,curr)
return 1
end function
function cal_set_month(atom handle, integer month)
object curr = get(handle,"date")
curr[2] = month
cal_set_date(handle,curr)
return 1
end function
function cal_set_year(atom handle, integer year)
object curr = get(handle,"date")
curr[1] = year
cal_set_date(handle,curr)
return 1
end function
function cal_set_date(atom handle, object cdate)
object dt = 0
integer yr, mo, da
dt = datetime:parse(cdate,"%Y/%m/%d")
if atom(dt) then
dt = datetime:parse(cdate,"%Y,%m,%d")
end if
if atom(dt) then
dt = datetime:parse(cdate,"%m/%d/%y")
end if
if atom(dt) then
dt = datetime:parse(cdate,"%m/%d/%Y")
end if
if atom(dt) then
dt = datetime:parse(cdate,"%y/%m/%d")
end if
if atom(dt) then
if cdate[1] > 31 then -- Y/M/D
yr = cdate[1]
mo = cdate[2]
da = cdate[3]
end if
if cdate[3] > 31 then -- M/D/Y
mo = cdate[1]
da = cdate[2]
yr = cdate[3]
end if
else
yr = dt[1]
mo = dt[2]
da = dt[3]
end if
if yr < 1900 then yr += 1900 end if
gtk_proc("gtk_calendar_select_month",{P,I,I},{handle,mo-1,yr})
gtk_proc("gtk_calendar_select_day",{P,I},{handle,da})
return 1
end function
function setCalendarEuDate(atom handle, object edt)
edt[1] += 1900
return cal_set_date(handle,edt)
end function
function cal_get_date(atom handle, object fmt=0)
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
object clock
if atom(fmt) and fmt = 0 then
fmt = "%A, %b %d, %Y"
else
fmt = peek_string(fmt)
end if
object result
c_proc(get_date,{handle,y,m,d})
result = datetime:new(peek4u(y),peek4u(m)+1,peek4u(d))
clock = datetime:now()
result = result[1..3] & clock[4..6]
result = datetime:format(result,fmt)
return result
end function
function cal_get_datetime(atom handle, object fmt=1)
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
object result
c_proc(get_date,{handle,y,m,d})
result = datetime:now() -- for current hr,min,sec
result[1] = peek4u(y)
result[2] = peek4u(m)+1
result[3] = peek4u(d)
if fmt = 0 then -- set hr,min,sec to zero;
result[4] = 0
result[5] = 0
result[6] = 0
end if
return result
end function
function cal_get_eu_date(atom handle) --returns {y,m,d} in Eu fmt.
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
c_proc(get_date,{handle,y,m,d})
sequence result = {peek4u(y)-1900,peek4u(m)+1,peek4u(d)}
return result
end function
function cal_get_ymd(atom handle, integer full=0)
object clock
switch full do
case 0 then return cal_get_eu_date(handle) + {1900,0,0}
case 1 then return cal_get_eu_date(handle) + {1900,0,0} & {0,0,0}
case 2 then clock = datetime:now()
return cal_get_eu_date(handle) + {1900,0,0} & clock[4..6]
case else return cal_get_eu_date(handle) + {1900,0,0}
end switch
end function
function cal_get_day(atom handle)
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
c_proc(get_date,{handle,y,m,d})
integer result = peek4u(d)
return result
end function
function cal_get_month(atom handle)
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
c_proc(get_date,{handle,y,m,d})
integer result = peek4u(m)
return result+1
end function
function cal_get_year(atom handle)
atom y = allocate(8,1), m = allocate(8,1), d = allocate(8,1)
c_proc(get_date,{handle,y,m,d})
integer result = peek4u(y)
return result
end function
widget[GtkCellView] = {"gtk_cell_view",
{GtkCellLayout,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{P,P},-routine_id("newCellView")},
{"set_model",{P,P}},
{"get_model",{P},P},
{"set_displayed_row",{P,P}},
{"get_displayed_row",{P},P,0,GtkTreePath},
{"set_draw_sensitive",{P,B}},
{"get_draw_sensitive",{P},B},
{"set_fit_model",{P,B}},
{"get_fit_model",{P},B},
"GtkCellView"}
function newCellView(atom x=0, atom y=0)
if class_id(x) = GtkCellArea
and class_id(y) = GtkCellAreaContext then
return gtk_func("gtk_cell_view_new_with_context",{P,P},{x,y})
elsif atom(x) and x > 0 then
if class_id(x) = GdkPixbuf then
return gtk_func("gtk_cell_view_new_with_pixbuf",{P},{x})
end if
elsif string(x) then
return gtk_func("gtk_cell_view_new_with_markup",{P},{allocate_string(x)})
end if
end function
widget[GtkDrawingArea] = {"gtk_drawing_area",
{GtkWidget,GtkBuildable,GObject},
{"new",{},P},
"GtkDrawingArea"}
widget[GtkSearchEntry] = {"gtk_search_entry", --3.6
{GtkEntry,GtkWidget,GtkBuildable,GtkEditable,GtkCellEditable,GObject},
{"new",{},P},
{"handle_event",{P,P},B},
"GtkSearchEntry"}
widget[GtkEntryBuffer] = {"gtk_entry_buffer",
{GObject},
{"new",{S,I},P},
{"get_text",{P},S},
{"set_text",{P,S,I}},
{"get_bytes",{P},I},
{"get_length",{P},I},
{"set_max_length",{P,I}},
{"get_max_length",{P},I},
{"insert_text",{P,I,S,I},I},
{"delete_text",{P,I,I},I},
{"emit_deleted_text",{P,I,I}},
{"emit_inserted_text",{P,I,S,I}},
"GtkEntryBuffer"}
widget[GtkEntryCompletion] = {"gtk_entry_completion",
{GtkCellLayout,GtkBuildable,GObject},
{"new",{P},-routine_id("newEntryCompletion")},
{"get_entry",{P},P,0,GtkEntry},
{"set_model",{P,P}},
{"get_model",{P},P,0,GtkTreeModel},
{"set_match_func",{P,P,P,P}},
{"set_minimum_key_length",{P,I}},
{"get_minimum_key_length",{P},I},
{"compute_prefix",{P,S},S},
{"get_completion_prefix",{P},S},
{"insert_prefix",{P}},
{"insert_action_text",{P,I,S}},
{"insert_action_markup",{P,I,S}},
{"delete_action",{P,I}},
{"set_text_column",{P,I}},
{"get_text_column",{P},I},
{"set_inline_completion",{P,B}},
{"get_inline_completion",{P},B},
{"set_inline_selection",{P,B}},
{"get_inline_selection",{P},B},
{"set_popup_completion",{P,B}},
{"get_popup_completion",{P},B},
{"set_popup_set_width",{P,B}},
{"get_popup_set_width",{P},B},
{"set_popup_single_match",{P,B}},
{"get_popup_single_match",{P},B},
{"complete",{P}},
"GtkEntryCompletion"}
function newEntryCompletion(atom x=0)
if class_id(x) = GtkCellArea then
return gtk_func("gtk_entry_completion_new_with_area",{P},{x})
else
return gtk_func("gtk_entry_completion_new")
end if
end function
widget[GtkRevealer] = {"gtk_revealer", -- new in GTK 3.10
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_reveal_child",{P,B}},
{"get_reveal_child",{P},B},
{"get_child_revealed",{P},B},
{"set_transition_duration",{P,I}},
{"get_transition_duration",{P},I},
{"set_transition_type",{P,I}},
{"get_transition_type",{P},I},
"GtkRevealer"}
widget[GtkSearchBar] = {"gtk_search_bar", -- new in GTK 3.10
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"connect_entry",{P,P}},
{"set_search_mode",{P,B}},
{"get_search_mode",{P},B},
{"set_show_close_button",{P,B}},
{"get_show_close_button",{P},B},
{"handle_event",{P,P},B},
"GtkSearchBar"}
widget[GtkStack] = {"gtk_stack", -- new in GTK 3.10
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"add_named",{P,P,S}},
{"add_titled",{P,P,S,S}},
{"set_visible_child",{P,P}},
{"get_visible_child",{P},P,0,GtkWidget},
{"set_visible_child_name",{P,S}},
{"get_visible_child_name",{P},S},
{"set_visible_child_full",{P,S,I}},
{"set_homogeneous",{P,B}},
{"get_homogeneous",{P},B},
{"set_transition_duration",{P,I}},
{"get_transition_duration",{P},I},
{"set_transition_type",{P,I}},
{"get_transition_type",{P},I},
{"get_child_by_name",{P,S},P,0,GtkWidget}, -- 3.12
{"get_transition_running",{P},B}, -- 3.12
{"get_hhomogeneous",{P},B}, -- 3.16
{"set_hhomogeneous",{P,B}}, -- 3.16
{"get_vhomogeneous",{P},B}, -- 3.16
{"set_vhomogeneous",{P,B}}, -- 3.16
{"get_interpolate_size",{P},B}, -- 3.18
{"set_interpolate_size",{P,B}}, -- 3.18
"GtkStack"}
widget[GtkStackSidebar] = {"gtk_stack_sidebar", -- 3.16
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_stack",{P,P}},
{"get_stack",{P},P,0,GtkStack},
"GtkStackSidebar"}
widget[GtkStackSwitcher] = {"gtk_stack_switcher",
{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"set_stack",{P,P}},
{"get_stack",{P},P,0,GtkStack},
"GtkStackSwitcher"}
widget[GtkScrollbar] = {"gtk_scrollbar",
{GtkRange,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{I,P},P},
"GtkScrollbar"}
widget[GtkInvisible] = {"gtk_invisible",
{GtkWidget,GtkBuildable,GObject},
{"new",{P},-routine_id("newInvisible")},
{"set_screen",{P,P}},
{"get_screen",{P},P,0,GdkScreen},
"GtkInvisible"}
function newInvisible(atom x=0)
if class_id(x) = GdkScreen then
return gtk_func("gtk_invisible_new_for_screen",{P},{x})
else
return gtk_func("gtk_invisible_new")
end if
end function
widget[GtkProgressBar] = {"gtk_progress_bar",
{GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"pulse",{P}},
{"set_fraction",{P,D}},
{"get_fraction",{P},D},
{"set_inverted",{P,B}},
{"get_inverted",{P},B},
{"set_show_text",{P,B}},
{"get_show_text",{P},B},
{"set_text",{P,S}},
{"get_text",{P},S},
{"set_ellipsize",{P,B}},
{"get_ellipsize",{P},B},
{"set_pulse_step",{P,D}},
{"get_pulse_step",{P},D},
"GtkProgressBar"}
widget[GtkSpinner] = {"gtk_spinner",
{GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"start",{P}},
{"stop",{P}},
"GtkSpinner"}
widget[GtkSwitch] = {"gtk_switch",
{GtkWidget,GtkBuildable,GtkActionable,GObject},
{"new",{},P},
{"set_active",{P,B}},
{"get_active",{P},B},
{"get_state",{P},B}, -- GTK3.14
{"set_state",{P,B}}, -- GTK3.14
"GtkSwitch"}
widget[GtkLevelBar] = {"gtk_level_bar",-- GTK3.6+
{GtkWidget,GtkBuildable,GtkBuildable,GtkOrientable,GObject},
{"new",{D,D},-routine_id("newLevelBar")},
{"new_for_interval",{D,D},P},
{"set_mode",{P,I}},
{"get_mode",{P},I},
{"set_value",{P,D}},
{"get_value",{P},D},
{"set_min_value",{P,D}},
{"get_min_value",{P},D},
{"set_max_value",{P,D}},
{"get_max_value",{P},D},
{"add_offset_value",{P,S,D}},
{"remove_offset_value",{P,S}},
{"get_offset_value",{P,S},D},
{"get_inverted",{P},B}, --GTK3.8+
{"set_inverted",{P,B}}, --GTK3.8+
"GtkLevelBar"}
function newLevelBar(atom x=0, atom y=0)
if x+y > 0 then
return gtk_func("gtk_level_bar_new_for_interval",{D,D},{x,y})
else
return gtk_func("gtk_level_bar_new")
end if
end function
widget[GtkAboutDialog] = {"gtk_about_dialog",
{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_program_name",{P,S}},
{"get_program_name",{P},S},
{"set_version",{P,S}},
{"get_version",{P},S},
{"set_copyright",{P,S}},
{"get_copyright",{P},S},
{"set_comments",{P,S}},
{"get_comments",{P},S},
{"set_license",{P,S}},
{"get_license",{P},S},
{"set_wrap_license",{P,B}},
{"get_wrap_license",{P},B},
{"set_license_type",{P,I}},
{"get_license_type",{P},I},
{"set_website",{P,S}},
{"get_website",{P},S},
{"set_website_label",{P,S}},
{"get_website_label",{P},S},
{"set_authors",{P,A}},
{"get_authors",{P},V},
{"set_artists",{P,A}},
{"get_artists",{P},V},
{"set_documenters",{P,A}},
{"get_documenters",{P},V},
{"set_translator_credits",{P,S}},
{"get_translator_credits",{P},S},
{"set_logo",{P,P},-routine_id("setAboutLogo")},
{"get_logo",{P},P,0,GdkPixbuf},
{"set_logo_icon_name",{P,S}},
{"get_logo_icon_name",{P},S},
{"add_credit_section",{P,S,A}},
"GtkAboutDialog"}
function setAboutLogo(atom dlg, object logo)
if string(logo) then
logo = locate_file(logo)
if file_type(logo) = 0 then return 0 end if
end if
if atom(logo) and class_id(logo) = GdkPixbuf then
return 0
else
logo = create(GdkPixbuf,logo)
end if
gtk_proc("gtk_about_dialog_set_logo",{P,P},{dlg,logo})
return 1
end function
widget[GtkAppChooserDialog] = {"gtk_app_chooser_dialog",
{GtkAppChooser,GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P,I,P},-routine_id("newAppChooserDialog")},
{"get_widget",{P},P,0,GtkAppChooserWidget},
{"set_heading",{P,S}},
{"get_heading",{P},S},
"GtkAppChooserDialog"}
function newAppChooserDialog(atom parent, integer flags, object x)
if string(x) and file_exists(canonical_path(x)) then
x = allocate_string(canonical_path(x),1)
x = gtk_func("g_file_new_for_path",{P},{x})
return gtk_func("gtk_app_chooser_dialog_new",{P,I,P},{parent,flags,x})
else
if string(x) then
x = allocate_string(x,1)
end if
return gtk_func("gtk_app_chooser_dialog_new_for_content_type",
{P,I,P},{parent,flags,x})
end if
end function
widget[GtkColorChooserDialog] = {"gtk_color_chooser_dialog",
{GtkColorChooser,GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P},P},
"GtkColorChooserDialog"}
widget[GtkColorSelectionDialog] = {"gtk_color_selection_dialog",
{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S},P},
{"get_color_selection",{P},P,0,GtkColorSelection},
"GtkColorSelectionDialog"}
widget[GtkFileChooserDialog] = {"gtk_file_chooser_dialog",
{GtkFileChooser,GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P,I,S},P},
"GtkFileChooserDialog"}
widget[GtkFontChooserDialog] = {"gtk_font_chooser_dialog",
{GtkFontChooser,GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P},P},
"GtkFontChooserDialog"}
widget[GtkStyleProvider] = {"gtk_style_provider",
{0},
{"get_style_property",{P,P,I,P,P},B},
"GtkStyleProvider"}
widget[GtkStyleContext] = {"gtk_style_context",
{GObject},
{"new",{},P},
{"add_provider",{P,P,I}},
{"add_provider_for_screen",{P,P,P,I},-routine_id("sc_add_provider_for_screen")},
{"get",{P,I,S,P,I}},
{"get_junction_sides",{P},I},
{"get_parent",{P},P,0,GtkStyleContext},
{"get_path",{P},P,0,GtkWidgetPath},
{"get_property",{P,S,I,P}},
{"get_screen",{P},P,0,GdkScreen},
{"get_frame_clock",{P},P,0,GdkFrameClock},
{"get_state",{P},I},
{"get_style",{P,S,P,I}},
{"get_style_property",{P,S,P}},
{"get_section",{P,S},P,0,GtkCssSection},
{"get_color",{P,I,P}},
{"get_background_color",{P,I,P}}, -- deprecated 3.16
{"get_border_color",{P,I,P}}, -- deprecated 3.16
{"get_border",{P,I,P}},
{"get_padding",{P,I,P}},
{"get_margin",{P,I,P}},
{"invalidate",{P}},
{"lookup_color",{P,S,P},B},
{"remove_provider",{P,P}},
{"remove_provider_for_screen",{P,P}},
{"reset_widgets",{P}},
{"set_background",{P,P}},
{"restore",{P}},
{"save",{P}},
{"set_junction_sides",{P,I}},
{"set_parent",{P,P}},
{"set_path",{P,P}},
{"add_class",{P,S}},
{"remove_class",{P,S}},
{"has_class",{P,S},B},
{"list_classes",{P},P,0,GList},
{"add_region",{P,S,I}}, -- deprecated 3.14
{"remove_region",{P,S}}, -- deprecated 3.14
{"has_region",{P,S,I},B}, -- deprecated 3.14
{"list_regions",{P},P,0,GList}, -- deprecated 3.14
{"get_screen",{P,P}},
{"set_frame_clock",{P,P}},
{"set_state",{P,I}},
{"set_scale",{P,I}}, -- 3.10
{"get_scale",{P},I}, -- 3.10
{"to_string",{P,I},S}, -- 3.20
"GtkStyleContext"}
function sc_add_provider_for_screen(atom context, atom scrn, atom pro, integer pri)
gtk_proc("gtk_style_context_add_provider_for_screen",{P,P,I},{scrn,pro,pri})
return 1
end function
widget[GtkRecentChooserDialog] = {"gtk_recent_chooser_dialog",
{GtkRecentChooser,GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P,P},P},
{"new_for_manager",{S,P,P,P},P},
"GtkRecentChooserDialog"}
widget[GtkPrintSettings] = {"gtk_print_settings",
{GObject},
{"new",{P,P},-routine_id("newPrintSettings")},
{"load_file",{P,S,P},B},
{"to_file",{P,S,P},B},
{"load_key_file",{P,P,S,P},B},
{"to_key_file",{P,P,S}},
{"copy",{P},P,0,GtkPrintSettings},
{"has_key",{P,S},B},
{"get",{P,S},S},
{"set",{P,S,S}},
{"unset",{P,S}},
{"foreach",{P,P,P}},
{"get_bool",{P,S},B},
{"set_bool",{P,S,B}},
{"get_double",{P,S},D},
{"get_double_with_default",{P,S,D},D},
{"set_double",{P,S,D}},
{"get_length",{P,S,I},D},
{"set_length",{P,S,D,I}},
{"get_int",{P,S},I},
{"get_int_with_default",{P,S,I},I},
{"set_int",{P,S,I}},
{"get_printer",{P},S},
{"set_printer",{P,S}},
{"get_orientation",{P},I},
{"set_orientation",{P,I}},
{"get_paper_size",{P},P,0,GtkPaperSize},
{"set_paper_size",{P,P}},
{"get_paper_width",{P,I},D},
{"set_paper_width",{P,D,I}},
{"get_paper_height",{P,I},D},
{"set_paper_height",{P,D,I}},
{"get_use_color",{P},B},
{"set_use_color",{P,B}},
{"get_collate",{P},B},
{"set_collate",{P,B}},
{"get_reverse",{P},B},
{"set_reverse",{P,B}},
{"get_duplex",{P},I},
{"set_duplex",{P,I}},
{"get_quality",{P},I},
{"set_quality",{P,I}},
{"get_n_copies",{P},I},
{"set_n_copies",{P,I}},
{"get_number_up",{P},I},
{"set_number_up",{P,I}},
{"get_number_up_layout",{P},I},
{"set_number_up_layout",{P,I}},
{"get_resolution",{P},I},
{"set_resolution",{P,I}},
{"get_resolution_x",{P},I},
{"get_resolution_y",{P},I},
{"get_printer_lpi",{P},D},
{"set_printer_lpi",{P,D}},
{"get_scale",{P},D},
{"set_scale",{P,D}},
{"get_print_pages",{P},I},
{"set_print_pages",{P,I}},
{"get_page_ranges",{P,I},P,0,GtkPageRange},
{"set_page_ranges",{P,P},-routine_id("ps_set_page_ranges")},
{"get_page_set",{P},I},
{"set_page_set",{P,I}},
{"get_default_source",{P},S},
{"set_default_source",{P,S}},
{"get_media_type",{P},S},
{"set_media_type",{P,S}},
{"get_dither",{P},S},
{"set_dither",{P,S}},
{"get_finishings",{P},S},
{"set_finishings",{P,S}},
{"get_output_bin",{P},S},
{"set_output_bin",{P,S}},
"GtkPrintSettings"}
function newPrintSettings(object x=0, object y=0)
atom err=allocate(8,1)
if atom(x) and x = 0 then
return gtk_func("gtk_print_settings_new")
end if
if class_id(x) = GKeyFile then
y = allocate_string(y,1)
return gtk_func("gtk_print_settings_new_from_key_file",{P,P,P},{x,y,err})
end if
if string(x) and file_exists(canonical_path(x)) then
x = allocate_string(canonical_path(x),1)
return gtk_func("gtk_print_settings_new_from_file",{P,P},{x,err})
end if
end function
function ps_set_page_ranges(atom x, object r)
atom m = allocate_data(8)
poke(m,r[1])
poke(m+4,r[2])
gtk_proc("gtk_print_settings_set_pages_ranges",{P,P,I},{x,m,2})
return 1
end function
widget[GtkPaperSize] = {"gtk_paper_size",
{0},
{"new",{P,P,D,D},-routine_id("newPaperSize")},
{"new_from_ppd",{S,S,D,D},P},
{"new_from_ipp",{S,D,D},P,0,GtkPaperSize}, -- 3.16
{"new_custom",{S,S,D,D,I},P},
{"copy",{P},P,0,GtkPaperSize},
{"is_equal",{P,P},B},
{"get_name",{P},S},
{"get_display_name",{P},S},
{"get_ppd_name",{P},S},
{"get_width",{P,I},D},
{"get_height",{P,I},D},
{"is_custom",{P},B},
{"set_size",{P,D,D,I}},
{"get_default_top_margin",{P,I},D},
{"get_default_bottom_margin",{P,I},D},
{"get_default_left_margin",{P,I},D},
{"get_default_right_margin",{P,I},D},
"GtkPaperSize"}
function newPaperSize(object a=0, object b=0, atom c=0, atom d=0)
if string(a) and atom(b) and b = 0 and c = 0 and d = 0 then
a = allocate_string(a,1)
return gtk_func("gtk_paper_size_new",{P},{a})
end if
if string(a) and atom(b) and b > 0 and c > 0 then
a = allocate_string(a,1)
return gtk_func("gtk_paper_size_new_from_ipp",{P,D,D},{a,b,c})
end if
if string(a) and string(b) and c > 0 and d > 0 then
a = allocate_string(a,1)
b = allocate_string(b,1)
return gtk_func("gtk_paper_size_new_from_ppd",{P,P,D,D},{a,b,c,d})
end if
end function
export function get_paper_sizes(integer cust=0)
object ps = gtk_func("gtk_paper_size_get_paper_sizes",{P},{cust})
ps = unpack_gs_atom_list(ps)
return ps
end function
export function get_paper_size_names(integer cust=0)
object ps = get_paper_sizes(cust)
for i = 1 to length(ps) do
ps[i] = gtk_str_func("gtk_paper_size_get_name",{P},{ps[i]})
end for
return ps
end function
widget[GtkPageSetup] = {"gtk_page_setup",
{GObject},
{"new",{},P},
{"copy",{P},P,0,GtkPageSetup},
{"get_orientation",{P},I},
{"set_orientation",{P,I}},
{"get_paper_size",{P},P,0,GtkPaperSize},
{"set_paper_size",{P,P}},
{"get_top_margin",{P,I},D},
{"set_top_margin",{P,D,I}},
{"get_bottom_margin",{P,I},D},
{"set_bottom_margin",{P,D,I}},
{"get_left_margin",{P,I},D},
{"set_left_margin",{P,D,I}},
{"get_right_margin",{P,I},D},
{"set_right_margin",{P,D,I}},
{"set_paper_size_and_default_margins",{P,P}},
{"get_paper_width",{P,I},D},
{"get_paper_height",{P,I},D},
{"get_page_width",{P,I},D},
{"get_page_height",{P,I},D},
{"new_from_file",{S,P},P,0,GtkPageSetup},
{"load_file",{P,S,P},B},
{"to_file",{P,S},-routine_id("ps_to_file")},
"GtkPageSetup"}
function ps_to_file(atom setup, object filename)
atom err = allocate(8,1) err = 0
return gtk_func("gtk_page_setup_to_file",{P,P,P},{setup,filename,err})
end function
widget[GtkPageRange] = {"gtk_page_range",
{0},
"GtkPageRange"}
widget[GtkPrintOperation] = {"gtk_print_operation",
{GObject},
{"new",{},P},
{"set_allow_async",{P,B}},
{"get_error",{P,P}},
{"set_default_page_setup",{P,P}},
{"get_default_page_setup",{P},P,0,GtkPageSetup},
{"set_print_settings",{P,P}},
{"get_print_settings",{P},P,0,GtkPrintSettings},
{"set_job_name",{P,S}},
{"get_job_name",{P},-routine_id("getPrintOpJobName")},
{"set_n_pages",{P,I}},
{"get_n_pages_to_print",{P},I},
{"set_current_page",{P,I}},
{"set_use_full_page",{P,B}},
{"set_unit",{P,I}},
{"set_export_filename",{P,S}},
{"set_show_progress",{P,B}},
{"set_track_print_status",{P,B}},
{"set_custom_tab_label",{P,S}},
{"run",{P,P,P,P},I},
{"cancel",{P}},
{"draw_page_finish",{P}},
{"set_defer_drawing",{P}},
{"get_status",{P},I},
{"get_status_string",{P},S},
{"is_finished",{P},B},
{"set_support_selection",{P,B}},
{"get_support_selection",{P},B},
{"set_has_selection",{P,B}},
{"get_has_selection",{P},B},
{"set_embed_page_setup",{P,B}},
{"get_embed_page_setup",{P},B},
"GtkPrintOperation"}
function getPrintOpJobName(atom op)
object job = allocate(32,1), err = allocate(32,1) err = 0
gtk_func("g_object_get",{P,P,P,P},{op,"job name",job,err})
object result
ifdef BITS64 then -- thanks pete eberlein
result = peek8u(job)
elsedef
result = peek4u(job)
end ifdef
if result > 0 then
result = peek_string(result)
end if
return result
end function
widget[GtkPrintContext] = {"gtk_print_context",
{GObject},
{"get_cairo_context",{P},P},
{"set_cairo_context",{P,P,D,D}},
{"get_page_setup",{P},P,0,GtkPageSetup},
{"get_width",{P},D},
{"get_height",{P},D},
{"get_dpi_x",{P},D},
{"get_dpi_y",{P},D},
{"get_pango_fontmap",{P},P,0,PangoFontMap},
{"create_pango_context",{P},P,0,PangoContext},
{"create_pango_layout",{P},P,0,PangoLayout},
{"get_hard_margins",{P,D,D,D,D},B},
"GtkPrintContext"}
widget[GtkPrintUnixDialog] = {"gtk_print_unix_dialog",
{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P},P},
{"set_page_setup",{P,P}},
{"get_page_setup",{P},P,0,GtkPageSetup},
{"set_current_page",{P,I}},
{"get_current_page",{P},I},
{"set_settings",{P,P}},
{"get_settings",{P},P,0,GtkPrintSettings},
{"get_selected_printer",{P},P,0,GtkPrinter},
{"add_custom_tab",{P,P,P}},
{"set_support_selection",{P,B}},
{"get_support_selection",{P},B},
{"get_has_selection",{P},B},
{"set_embed_page_setup",{P,B}},
{"get_embed_page_setup",{P},B},
{"set_manual_capabilities",{P,I}},
{"get_manual_capabilities",{P},I},
"GtkPrintUnixDialog"}
widget[GtkPageSetupUnixDialog] = {"gtk_page_setup_unix_dialog",
{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{S,P},P},
{"set_page_setup",{P,P}},
{"get_page_setup",{P},P,0,GtkPageSetup},
{"set_print_settings",{P,P}},
{"get_print_settings",{P},P,0,GtkPrintSettings},
"GtkPageSetupUnixDialog"}
widget[GtkListBox] = {"gtk_list_box", -- new in GTK 3.10
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"prepend",{P,P}},
{"insert",{P,P,I}},
{"select_row",{P,P}},
{"select_all",{P}}, -- 3.14
{"unselect_all",{P}}, -- 3.14
{"unselect_row",{P,P}}, -- 3.14
{"get_selected_row",{P},P,0,GtkListBoxRow},
{"get_selected_rows",{P},X,0,GList},-- 3.14
{"row_is_selected",{P},B}, -- 3.14
{"selected_foreach",{P,P,P}}, -- 3.14
{"set_selection_mode",{P,I}},
{"get_selection_mode",{P},I},
{"set_activate_on_single_click",{P,B}},
{"get_activate_on_single_click",{P},B},
{"set_adjustment",{P,P}},
{"get_adjustment",{P},P,0,GtkAdjustment},
{"set_placeholder",{P,P}},
{"get_row_at_index",{P,I},P,0,GtkListBoxRow},
{"get_row_at_y",{P,I},P,0,GtkListBoxRow},
{"invalidate_filter",{P}},
{"invalidate_headers",{P}},
{"invalidate_sort",{P}},
{"set_filter_func",{P,P,P,P}},
{"set_header_func",{P,P,P,P}},
{"set_sort_func",{P,P,P,P}},
{"drag_highlight_row",{P,P}},
{"drag_unhighlight_row",{P}},
{"bind_model",{P,P,P,P,P}}, -- 3.16
"GtkListBox"}
widget[GtkListBoxRow] = {"gtk_list_box_row",
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"changed",{P}},
{"get_header",{P},P,0,GtkWidget},
{"get_type",{},I},
{"set_header",{P,P}},
{"get_index",{P},I},
{"set_activatable",{P,B}},
{"set_selectable",{P,B}},
{"get_selectable",{P},B},
"GtkListBoxRow"}
widget[GtkPopover] = {"gtk_popover", -- new in GTK 3.12
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{P,P},-routine_id("newPopover")},
{"bind_model",{P,P,S}},
{"set_relative_to",{P,P}},
{"get_relative_to",{P},P,0,GtkWidget},
{"set_pointing_to",{P,P}},
{"get_pointing_to",{P,P},B},
{"set_position",{P,I}},
{"get_position",{P},I},
{"set_modal",{P,B}},
{"get_modal",{P},B},
{"get_transitions_enabled",{P},B},
{"set_transitions_enabled",{P,B}},
{"get_default_widget",{P},P,0,GtkWidget}, -- 3.18
{"set_default_widget",{P,P}}, -- 3.18
{"get_constrain_to",{P},P}, -- 3.20
{"set_constrain_to",{P,P}}, -- 3.20
{"popup",{P}}, -- 3.21
{"popdown",{P}}, -- 3.21
"GtkPopover"}
function newPopover(atom a=0, atom b=0)
if class_id(b) = GMenuModel then
return gtk_func("gtk_popover_new_from_model",{P,P},{a,b})
else
return gtk_func("gtk_popover_new",{P},{a})
end if
end function
widget[GtkPopoverMenu] = {"gtk_popover_menu", -- 3.16
{GtkPopover,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"open_submenu",{P,S}},
"GtkPopoverMenu"}
widget[GtkPlacesSidebar] = {"gtk_places_sidebar", -- new 3.10
{GtkScrolledWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_open_flags",{P,I}},
{"get_open_flags",{P},I},
{"set_location",{P,P}},
{"get_location",{P},P,0,GFile},
{"set_show_desktop",{P,B}},
{"get_show_desktop",{P},B},
{"add_shortcut",{P,P}},
{"remove_shortcut",{P,P}},
{"list_shortcuts",{P},A,0,GSList},
{"get_nth_bookmark",{P,I},P,0,GFile},
{"get_show_connect_to_server",{P},B}, -- deprecated 3.18
{"set_show_connect_to_server",{P,B}}, -- deprecated 3.18
{"set_local_only",{P,B}}, -- 3.12
{"get_local_only",{P},B}, -- 3.12
{"get_show_enter_location",{P},B}, --3.14
{"set_show_enter_location",{P,B}}, --3.14
{"get_show_other_locations",{P},B}, -- 3.18
{"set_show_other_locations",{P,B}}, -- 3.18
{"get_show_recent",{P},B}, -- 3.18
{"set_show_recent",{P,B}}, -- 3.18
{"get_show_trash",{P},B}, -- 3.18
{"set_show_trash",{P,B}}, -- 3.18
{"set_drop_targets_visible",{P,B,P}}, -- 3.18
"GtkPlacesSidebar"}
widget[GtkHeaderBar] = {"gtk_header_bar", -- new in GTK 3.10
{GtkContainer,GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"set_title",{P,S}},
{"get_title",{P},S},
{"set_subtitle",{P,S}},
{"get_subtitle",{P},S},
{"set_has_subtitle",{P,B}}, -- 3.12
{"get_has_subtitle",{P},B}, -- 3.12
{"set_custom_title",{P,P}},
{"get_custom_title",{P},P,0,GtkWidget},
{"pack_start",{P,P}},
{"pack_end",{P,P}},
{"set_show_close_button",{P,B}},
{"get_show_close_button",{P},B},
{"set_decoration_layout",{P,S}}, -- 3.12
{"get_decoration_layout",{P},S}, -- 3.12
"GtkHeaderBar"}
widget[GtkPrinter] = {"gtk_printer",
{GObject},
{"new",{S,P,B},P},
{"get_backend",{P},P},
{"get_name",{P},S},
{"get_state_message",{P},S},
{"get_description",{P},S},
{"get_location",{P},S},
{"get_icon_name",{P},S},
{"get_job_count",{P},I},
{"is_active",{P},B},
{"is_paused",{P},B},
{"is_accepting_jobs",{P},B},
{"is_virtual",{P},B},
{"is_default",{P},B},
{"accepts_ps",{P},B},
{"accepts_pdf",{P},B},
--{"list_papers",{P},X,0,GList}, -- buggy!
{"compare",{P,P},I},
{"has_details",{P},B},
{"request_details",{P}},
{"get_capabilities",{P},I},
{"get_default_page_size",{P},P,0,GtkPageSetup},
{"get_hard_margins",{P,D,D,D,D},B},
"GtkPrinter"}
widget[GtkPrintJob] = {"gtk_print_job",
{GObject},
{"new",{S,P,P,P},P},
{"get_settings",{P},P,0,GtkPrintSettings},
{"get_printer",{P},P,0,GtkPrinter},
{"get_title",{P},S},
{"get_status",{P},I},
{"set_source_file",{P,S,P},B},
{"get_surface",{P,P},P,0,CairoSurface_t},
{"send",{P,P,P,P}},
{"set_track_print_status",{P,B}},
{"get_track_print_status",{P},B},
{"get_pages",{P},I},
{"set_pages",{P,I}},
{"get_page_ranges",{P,I},P,0,GtkPageRange},
{"set_page_ranges",{P,P},-routine_id("setPageRanges")},
{"get_page_set",{P},I},
{"set_page_set",{P,I}},
{"get_num_copies",{P},I},
{"set_num_copies",{P,I}},
{"get_scale",{P},D},
{"set_scale",{P,D}},
{"get_n_up",{P},I},
{"set_n_up",{P,I}},
{"get_n_up_layout",{P},I},
{"set_n_up_layout",{P,I}},
{"get_rotate",{P},B},
{"set_rotate",{P,B}},
{"get_collate",{P},B},
{"set_collate",{P,B}},
{"get_reverse",{P},B},
{"set_reverse",{P,B}},
"GtkPrintJob"}
widget[GtkFlowBox] = {"gtk_flow_box", -- GTK 3.12
{GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"insert",{P,P,I}},
{"get_child_at_index",{P,I},P,0,GtkFlowBoxChild},
{"set_hadjustment",{P,P}},
{"set_vadjustment",{P,P}},
{"set_homogeneous",{P,B}},
{"get_homogeneous",{P},B},
{"set_row_spacing",{P,I}},
{"get_row_spacing",{P},I},
{"set_column_spacing",{P,I}},
{"get_column_spacing",{P},I},
{"set_min_children_per_line",{P,I}},
{"get_min_children_per_line",{P},I},
{"set_max_children_per_line",{P,I}},
{"get_max_children_per_line",{P},I},
{"set_activate_on_single_click",{P,B}},
{"get_activate_on_single_click",{P},B},
{"selected_foreach",{P,P,P}},
{"get_selected_children",{P},X,0,GList},
{"select_child",{P,P}},
{"unselect_child",{P,P}},
{"select_all",{P}},
{"unselect_all",{P}},
{"set_selection_mode",{P,I}},
{"get_selection_mode",{P},I},
{"set_filter_func",{P,P,P,P}},
{"invalidate_filter",{P}},
{"set_sort_func",{P,P,P,P}},
{"invalidate_sort",{P}},
{"bind_model",{P,P,P,P,P}}, -- 3.18
"GtkFlowBox"}
widget[GtkFlowBoxChild] = {"gtk_flow_box_child", -- GTK 3.12
{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GObject},
{"new",{},P},
{"get_index",{P},I},
{"is_selected",{P},B},
{"changed",{P}},
"GtkFlowBoxChild"}
widget[GtkMountOperation] = {"gtk_mount_operation",
{GObject},
{"new",{P},P},
{"is_showing",{P},B},
{"set_parent",{P,P}},
{"get_parent",{P},P,0,GtkWindow},
{"set_screen",{P,P}},
{"get_screen",{P},P,0,GdkScreen},
"GtkMountOperation"}
----------------------------------------------------------------------
-- stocklist is not a real GTK widget, we just fake it for convenience
----------------------------------------------------------------------
widget[GtkStockList] = {"gtk_stocklist", -- deprecated in GTK 3.12+
{0},
"GtkStockList"}
function newStockList()
object list = gtk_func("gtk_stock_list_ids")
return to_sequence(list)
end function
----------------------------------------------------------------------
-- Support for Gestures;
----------------------------------------------------------------------
widget[GtkEventController] = {"gtk_event_controller",
{GObject},
{"get_propagation_phase",{P},I},
{"set_propagation_phase",{P,I}},
{"handle_event",{P,P},B},
{"get_widget",{P},P,0,GtkWidget},
{"reset",{P}},
"GtkEventController"}
widget[GdkFrameClock] = {"gdk_frame_clock",
{GObject},
{"get_frame_time",{P},I},
{"request_phase",{P,P}},
{"begin_updating",{P}},
{"end_updating",{P}},
{"get_frame_counter",{P},I},
{"get_history_start",{P},I},
{"get_timings",{P,I},P},
{"get_current_timings",{P},P,0,GdkFrameTimings},
{"get_refresh_info",{P,I,I,I}},
"GdkFrameClock"}
widget[GdkFrameTimings] = {"gdk_frame_timings",
{GObject},
{"get_frame_counter",{P},I},
{"get_complete",{P},B},
{"get_frame_time",{P},I},
{"get_presentation_time",{P},I},
{"get_refresh_interval",{P},I},
{"get_predicted_presentation_time",{P},I},
"GdkFrameTimings"}
widget[GdkEvent] = {"gdk_event",
{GObject},
{"new",{},P},
{"peek",{},P,0,GdkEvent},
{"get",{},P,0,GdkEvent},
{"put",{P}},
{"copy",{P},P,0,GdkEvent},
{"get_axis",{P,I,D},B},
{"get_button",{P,P},B},
{"get_keycode",{P,P},B},
{"get_keyval",{P,P},B},
{"get_root_coords",{P,D,D},B},
{"get_scroll_direction",{P,P},B},
{"get_scroll_deltas",{P,D,D},B},
{"get_state",{P,P},B},
{"get_time",{P},I},
{"get_window",{P},P,0,GdkWindow},
{"get_event_type",{P},I},
{"get_event_sequence",{P},P,0,GdkEventSequence},
{"request_motions",{P}},
{"get_click_count",{P,P},B},
{"get_coords",{P,D,D},B},
{"triggers_context_menu",{P},B},
{"handler_set",{P,P,P}},
{"set_screen",{P,P}},
{"get_screen",{P},P,0,GdkScreen},
{"set_device",{P,P}},
{"get_device",{P},P,0,GdkDevice},
{"set_source_device",{P,P}},
{"get_source_device",{P},P,0,GdkDevice},
"GdkEvent"}
widget[GdkEventSequence] = {"gdk_event_sequence",
{GdkEvent},
"GdkEventSequence"}
widget[GtkGesture] = {"gtk_gesture", --GTK3.14
{GtkEventController,GObject},
{"get_device",{P},P},
{"get_window",{P},P},
{"set_window",{P,P}},
{"is_active",{P},B},
{"is_recognized",{P},B},
{"get_sequence_state",{P,P},I},
{"set_sequence_state",{P,P,I},B},
{"set_state",{P,I},B},
{"get_sequences",{P},A},
{"handles_sequence",{P,P},B},
{"get_last_updated_sequence",{P},P},
{"get_last_event",{P,P},P},
{"get_point",{P,P,D,D},B},
{"get_bounding_box",{P,P},B},
{"get_bounding_box_center",{P,D,D},B},
{"group",{P,P}},
{"ungroup",{P}},
{"get_group",{P},A},
{"is_grouped_with",{P,P},B},
"GtkGesture"}
widget[GtkGestureSingle] = {"gtk_gesture_single",
{GtkGesture,GtkEventController,GObject},
{"get_exclusive",{P},B},
{"set_exclusive",{P,B}},
{"get_touch_only",{P},B},
{"set_touch_only",{P,B}},
{"get_button",{P},I},
{"set_button",{P,I}},
{"get_current_button",{P},I},
{"get_current_sequence",{P},P},
"GtkGestureSingle"}
widget[GtkGestureRotate] = {"gtk_gesture_rotate",
{GtkGesture,GtkEventController,GObject},
{"new",{P},P},
{"get_angle_delta",{P},D},
"GtkGestureRotate"}
widget[GtkGestureZoom] = {"gtk_gesture_zoom",
{GtkGesture,GtkEventController,GObject},
{"new",{P},P},
{"get_scale_delta",{P},D},
"GtkGestureZoom"}
widget[GtkGestureDrag] = {"gtk_gesture_drag", -- 3.14
{GtkGestureSingle,GtkGesture,GtkEventController,GObject},
{"new",{P},P},
{"get_start_point",{P,D,D},B},
{"get_offset",{P,D,D},B},
"GtkGestureDrag"}
widget[GtkGesturePan] = {"gtk_gesture_pan",
{GtkGestureDrag,GtkGestureSingle,GtkGesture,GtkEventController,GObject},
{"new",{P,I},P},
{"get_orientation",{P},I},
{"set_orientation",{P,I}},
"GtkGesturePan"}
widget[GtkGestureSwipe] = {"gtk_gesture_swipe",
{GtkGestureSingle,GtkGesture,GtkEventController,GObject},
{"new",{P},P},
{"get_velocity",{P,D,D},B},
"GtkGestureSwipe"}
widget[GtkGestureLongPress] = {"gtk_gesture_long_press",
{GtkGestureSingle,GtkGesture,GtkEventController,GObject},
{"new",{P},P},
"GtkGestureLongPress"}
widget[GtkGestureMultiPress] = {"gtk_gesture_multi_press",
{GtkGestureSingle,GtkGesture,GtkEventController,GObject},
{"new",{P},P},
{"get_area",{P,P},B},
{"set_area",{P,P}},
"GtkGestureMultiPress"}
widget[GtkPadController] = {"gtk_pad_controller",
{GtkEventController,GObject},
{"new",{P,P,P},P},
{"set_action_entries",{P,P,I}},
{"set_action",{P,I,I,I,S,S}},
"GtkPadController"}
--------------------------------------------------------------------
-- Support for openGL;
--------------------------------------------------------------------
widget[GdkGLProfile] = {"gdk_gl_profile",
{},
"GdkGLProfile"}
widget[GdkGLContext] = {"gdk_gl_context",
{GObject},
{"new",{},-routine_id("newGLContext")},
{"clear_current",{}},
{"make_current",{P}},
{"get_version",{P,I,I}},
{"get_shared_context",{P},P,0,GdkGLContext},
{"get_window",{P},P,0,GdkWindow},
{"get_visual",{P},P,0,GdkVisual},
{"get_display",{P},P,0,GdkDisplay},
{"set_forward_compatible",{P,B}},
{"get_forward_compatible",{P},B},
{"set_debug_enabled",{P,B}},
{"get_debug_enabled",{P},B},
{"set_required_version",{P,I,I}},
{"get_required_version",{P,I,I}},
"GdkGLContext"}
function newGLContext() -- alias for new;
return c_func("gdk_gl_context_get_current")
end function
widget[GtkGLArea] = {"gtk_gl_area", -- GTK 3.16
{GtkWidget,GtkBuildable,GObject},
{"new",{},P},
{"get_context",{P},P},
{"set_has_alpha",{P,B}},
{"get_has_alpha",{P},B},
{"set_has_depth_buffer",{P,B}},
{"get_has_depth_buffer",{P},B},
{"make_current",{P}},
{"get_auto_render",{P},B},
{"set_auto_render",{P,B}},
{"get_error",{P},P},
{"set_error",{P,P}},
{"queue_render",{P}},
{"set_profile",{P,P}},
{"get_profile",{P},P,0,GdkGLProfile},
{"get_has_stencil_buffer",{P},B},
{"set_has_stencil_buffer",{P,B}},
{"attach_buffers",{P}},
{"get_required_version",{P,I,I}},
{"set_required_version",{P,I,I}},
{"get_use_es",{P},B}, -- 3.22
{"set_use_es",{P,B}}, -- 3.22
"GtkGLArea"}
----------------------------------------------------------------
-- low-level x11 functions;
----------------------------------------------------------------
widget[GdkX11Display] = {"gdk_x11_display",
{GObject},
{"get_user_time",{P},I},
{"broadcast_startup_message",{P,S,S,I}},
{"get_startup_notification_id",{P},S},
{"set_startup_notification_id",{P,S}},
{"get_xdisplay",{P},P},
{"grab",{P}},
{"ungrab",{P}},
{"set_cursor_theme",{P,S,I}},
{"set_window_scale",{P,I}},
{"get_glx_version",{P,I,I}},
"GdkX11Display"}
widget[GdkX11Screen] = {"gdk_x11_screen",
{GObject},
{"get_screen_number",{P},I},
{"get_xscreen",{P},P},
{"get_window_manager_name",{P},S},
{"get_monitor_output",{P,I},I},
{"lookup_visual",{P,I},P,0,GdkVisual},
{"get_number_of_desktops",{P},I},
{"get_current_desktop",{P},I},
"GdkX11Screen"}
widget[GdkX11Window] = {"gdk_x11_window",
{GObject},
{"lookup_for_display",{P,P},P,0,GdkWindow},
{"get_xid",{P},P},
{"move_to_current_desktop",{P}},
{"move_to_desktop",{P,I}},
{"get_desktop",{P},I},
"GdkX11Window"}
widget[GtkBindingSet] = {"gtk_binding_set",
{GObject},
{"new",{S},P},
{"by_class",{P},P},
{"find",{S},P},
{"activate",{P,I,I,P},B},
{"add_path",{P,P,S,I}},
"GtkBindingSet"}
widget[GtkBindingEntry] = {"gtk_binding_entry",
{GtkBindingSet},
{"add_signal",{P,I,I,S,P}},
{"add_signal_from_string",{P,S},I},
{"skip",{P,I,I}},
{"remove",{P,I,I}},
"GtkBindingEntry"}
widget[GdkPixbufAnimation] = {"gdk_pixbuf_animation",
{GdkPixbuf,GObject},
{"new",{P},-routine_id("newPixbufAnimation")},
{"get_width",{P},I},
{"get_height",{P},I},
{"get_delay_time",{P},I},
{"is_static_image",{P},B},
{"get_static_image",{P},P,0,GdkPixbuf},
{"get_iter",{P,P},P,0,GdkPixbufAnimationIter},
"GdkPixbufAnimation"}
function newPixbufAnimation(object name)
atom err = allocate(8,1) err = 0
if string(name)
and file_exists(canonical_path(name)) then
name = allocate_string(canonical_path(name),1)
end if
return gtk_func("gdk_pixbuf_animation_new_from_file",{P,P},{name,err})
end function
widget[GdkPixbufAnimationIter] = {"gdk_pixbuf_animation_iter",
{GObject},
{"get_pixbuf",{P},P,0,GdkPixbuf},
{"advance",{P,P},B},
{"get_delay_time",{P},I},
{"on_currently_loading_frame",{P},B},
"GdkPixbufAnimationIter"}
widget[GtkRecentManager] = {"gtk_recent_manager",
{GObject},
{"new",{},-routine_id("recent_manager_get_default")},
{"add_item",{P,S},B},
{"add_full",{P,S,P},B},
{"remove_item",{P,S,P},B},
{"lookup_item",{P,S,P},P,0,GtkRecentInfo},
{"has_item",{P,S},B},
{"move_item",{P,S,S,P},B},
{"get_items",{P},X,0,GtkRecentInfo},
{"purge_items",{P,P},I},
"GtkRecentManager"}
function recent_manager_get_default()
return gtk_func("gtk_recent_manager_get_default")
end function
widget[GtkBuildable] = {"gtk_buildable",
{GObject},
{"set_name",{P,S}},
{"get_name",{P},S},
{"add_child",{P,P,P,S}},
{"set_buildable_property",{P,P,S,P}},
{"construct_child",{P,P,S},P,0,GObject},
{"custom_tag_start",{P,P,P,S,P,P},B},
{"custom_tag_end",{P,P,P,S,P}},
{"custom_finished",{P,P,P,S,P}},
{"parser_finished",{P,P}},
{"get_internal_child",{P,P,S},P,0,GObject},
"GtkBuildable"}
widget[GtkBuilder] = {"gtk_builder",
{GObject},
{"new",{},P},
{"add_callback_symbol",{P,S,P}}, -- 3.10
{"lookup_callback_symbol",{P,S},P}, -- 3.10
{"set_application",{P,P}}, -- 3.10
{"get_application",{P},P,0,GtkApplication}, -- 3.10
{"add_from_file",{P,S},-routine_id("addBuilderObjects")},
{"add_from_string",{P,P},-routine_id("addBuilderObjectsStr")},
{"get_object",{P,P},P},
{"get_objects",{P},A,0,GSList},
{"connect",{P},-routine_id("builder_connect")},
{"set_translation_domain",{P,S}},
{"get_translation_domain",{P},S},
{"get_type_from_name",{P,S},I},
"GtkBuilder"}
export constant builder = create(GtkBuilder)
object current_builder_file = ""
export function ID(atom ctl) -- retrieve the Glade ID property;
return vlookup(ctl,registry,1,4,"!")
end function
export sequence class_name_index = repeat(0,length(widget))
for i = 1 to length(widget) do
if sequence(widget[i]) then
class_name_index[i] = widget[i][$]
end if
end for
constant bad_from_file = define_func("gtk_builder_add_from_file",{P,P,P},I)
constant bad_from_string = define_func("gtk_builder_add_from_string",{P,P,I,P},I)
-- add objects from Glade XML file;
function addBuilderObjects(atom bld, object fname)
atom err = allocate(8,1) err = 0
integer result = c_func(bad_from_file,{bld,fname,err})
if result = 0 then
printf(1,"Error code %d loading Builder\n",err)
if err = 0 then
printf(1,"***** GTK version mismatch or other error in Glade.\n")
printf(1,"\t(remove or change the 'requires...' line)")
Error(,,"Error 8623 loading glade file",peek_string(fname))
end if
abort(0)
end if
return result
end function
-- add object from inline string or string variable;
function addBuilderObjectsStr(atom bld, object str)
current_builder_file = str
atom err = allocate(8,1) err = 0
integer len = length(str)
str = allocate_string(str,1)
integer result = c_func(bad_from_string,{bld,str,len,err})
if result = 0 then
printf(1,"Error 8638: loading Builder %s\n",{current_builder_file})
if err = 0 then
printf(1,"***** GTK version mismatch or other error in Glade.\n")
printf(1,"\t(remove or change the 'requires...' line)")
end if
abort(0)
end if
return result
end function
-- link signals defined in Glade, this starts a 'for' loop,
-- running the builder_connect_function for each control;
function builder_connect(atom bld)
gtk_func("gtk_builder_connect_signals_full",{P,P,P},{bld,builder_connect_func,0})
return 1
end function
constant builder_connect_func = call_back(routine_id("builder_connect_function"))
-- links Glade controls to user-written or Eu functions
-----------------------------------------------------------------------------
function builder_connect_function(atom bld, atom obj, object sig, object hdlr, atom cxo)
-----------------------------------------------------------------------------
hdlr = peek_string(hdlr)
sig = peek_string(sig)
if atom(current_builder_file) and (current_builder_file > 0) then
current_builder_file = peek_string(current_builder_file)
end if
atom rid = routine_id(hdlr)
if rid = -1 then
printf(1,"-----------------------------------------------------------------------\n")
printf(1,"-- Undeclared function in %s\n",{current_builder_file})
printf(1,"-----------------------------------------------------------------------\n")
show_template(hdlr)
abort(1)
else
rid = call_back(rid)
connect(obj,sig,rid,cxo)
end if
return 1
end function
--------------------------------------------------------------------
procedure load_builder(object parent, object child, object prefix=0)
--------------------------------------------------------------------
object name, class, path
object x, tree
integer c,n
atom err = allocate(8,1)
current_builder_file = canonical_path(child)
if file_exists(current_builder_file) then
set(parent,"add from file",current_builder_file,err)
set(parent,"connect")
prefix = filebase(child)
if match(prefix,filebase(prg_name)) then
prefix = 0 -- do not prefix main file objects
end if
x = read_lines(canonical_path(child))
elsif string(child) then
set(parent,"add from string",child,err)
set(parent,"connect")
x = split(child,'\n')
end if
for i = 1 to length(x) do
if string(x[i]) and match("<object class",x[i]) then
c = match("class=",x[i]) + 7
n = match("id=",x[i]) + 4
class = x[i][c..$]
class = split(class," ")
class = class[1]
if class[$] = '"' then class = class[1..$-1] end if
name = x[i][n..$]
n = find('"',name)
name = name[1..n-1]
n = get(builder,"object",name)
if string(prefix) then
name = sprintf("%s:%s",{prefix,name})
end if
ifdef BUILDER then
display("[:25] [:36] [:10>]",{class,name,n})
end ifdef
class = find(class,class_name_index)
if class < 1 then
display("Error finding class for []",{name})
else
if not initialized[class] then
init(class)
end if
tree = widget[class][2]
for z = 1 to length(tree) do
init(tree[z])
end for
register(n,class,name)
end if
end if
end for
end procedure
-------------------------------------------------------------------------------
procedure show_template(object handlr) -- prompt for missing functions w/Glade;
-------------------------------------------------------------------------------
printf(1,"""
________
-----------------------------------------------------------------------
global function %s()
-----------------------------------------------------------------------
return 1
end function
""",{handlr})
end procedure
------------------------------------------------------------------------
-- Internet conveniences
------------------------------------------------------------------------
------------------------------------
export function show_uri(object uri)
------------------------------------
if atom(uri) then
return 0
end if
display("URI: []\n",{uri})
integer x = find('#',uri) -- in case link to html section;
object tmp
if x > 0 then
tmp = canonical_path(uri[1..x-1])
if file_exists(tmp) then
uri = tmp & uri[x..$]
end if
else
tmp = canonical_path(uri)
if file_exists(tmp) then
uri = tmp
end if
end if
ifdef WINDOWS then
system("explore " & uri,0)
return 1
end ifdef
atom err = allocate(8,1) err=0
object result = gtk_func("gtk_show_uri",{P,P,P,P},
{0,allocate_string(uri,1),0,err})
return result
end function
---------------------------------------------------------------------------
-- Icon functions
----------------------------
export function list_icons()
----------------------------
atom theme = gtk_func("gtk_icon_theme_get_default")
object list = gtk_func("gtk_icon_theme_list_icons",{P,P},{theme,0})
return to_sequence(list)
end function
----------------------------------------
export function has_icon(object name)
----------------------------------------
atom theme = gtk_func("gtk_icon_theme_get_default")
name = allocate_string(name,1)
return gtk_func("gtk_icon_theme_has_icon",{P,P},{theme,name})
end function
----------------------------------------------------------------
export function valid_icon(object list)
----------------------------------------------------------------
-- check a list of possible icon names
object result = 0
if atom(list[1]) then
list = {list}
end if
for i = 1 to length(list) do
result = get_icon_image(list[i]) --display(result)
if string(result) then return 1 end if
end for
return result
end function
---------------------------------------------------------------
export function valid_icon_name(object list)
---------------------------------------------------------------
-- check a list of possible icon names,
-- return string name of first valid
for i = 1 to length(list) do
if valid_icon({list[i]}) > 0 then
return list[i]
end if
if file_exists(locate_file(list[i])) then
return list[i]
end if
end for
return "gtk-missing-image"
end function
-- get image from a variety of sources;
------------------------------------------------------------------------------------
function get_icon_image(object icon, object sizex=0, object sizey=0, object sizez=1)
-------------------------------------------------------------------------------------
atom img = 0, ani = 0, default_theme, handle
handle = to_number(icon)
if class_id(handle) = GdkPixbuf then
img = create(GtkImage,handle)
return img
end if
if class_id(handle) = GtkImage then
return handle
end if
if find(icon,stock_list) then
img = gtk_func("gtk_image_new_from_stock",{P,I},
{allocate_string(icon,1),sizex})
return img
end if
default_theme = gtk_func("gtk_icon_theme_get_default",{})
if gtk_func("gtk_icon_theme_has_icon",{P,P},
{default_theme,allocate_string(icon,1)}) then
img = create(GdkPixbuf,icon,18,18,sizez)
img = create(GtkImage,img)
register(img,GtkImage)
--display("Has icon []",{icon})
return img
end if
icon = locate_file(icon)
if file_type(icon) = 1 then -- image from file
ani = create(GdkPixbufAnimation,icon,sizex,sizey)
if gtk_func("gdk_pixbuf_animation_is_static_image",{P},{ani}) then
ani = create(GdkPixbuf,icon,sizex*6,sizey*6,sizez)
img = create(GtkImage,ani)
else
img = create(GtkImage)
set(img,"from animation",ani)
end if
return img
end if
return 0
end function
--------------------------------------------------------
export function icon_info(object name, integer size=6)
--------------------------------------------------------
atom theme = gtk_func("gtk_icon_theme_get_default")
atom err = allocate(8,1) err = 0
atom icon_info = gtk_func("gtk_icon_theme_lookup_icon",{P,P,I,I},
{theme,name,size,GTK_ICON_LOOKUP_USE_BUILTIN})
object results = repeat(0,5)
results = {
gtk_func("gtk_icon_info_load_icon",{P,P},{icon_info,err}),
gtk_func("gtk_icon_info_get_display_name",{P},{icon_info}),
gtk_str_func("gtk_icon_info_get_filename",{P},{icon_info}),
gtk_func("gtk_icon_info_get_base_size",{P},{icon_info}),
gtk_func("gtk_icon_info_get_base_scale",{P},{icon_info})
}
return results
-- returns {1,2,3,4,5}
-- 1 = pointer to icon_info structure,
-- 2 = display name or null,
-- 3 = full path to icon file,
-- 4 = base size,
-- 5 = base scale
-- some entries missing in some cases
end function
-----------------------------------------------------------------------------------------
export function xpm_to_pixbuf(object xpm, integer w=0, integer h=0, integer interp=2)
-----------------------------------------------------------------------------------------
atom x = gtk_func("gdk_pixbuf_new_from_xpm_data",{P},
{allocate_string_pointer_array(xpm)})
if w + h > 0 then
x = gtk_func("gdk_pixbuf_scale_simple",{P,I,I,I},{x,w,h,interp})
end if
register(x,GdkPixbuf)
return x
end function
------------------------------------------------------------------------
-- Following 3 functions simplify method calls; used mostly internally,
-- but can also be called by the programmer to execute any GTK, GDK or
-- GLib function which has not been implemented in EuGTK.
-------------------------------------------------------------------------
export function gtk_func(object name, object params={}, object values={})
-------------------------------------------------------------------------
-- syntax: result = gtk_func("gtk_*_*",{formal params},{values})
-- where formal params might be {P,P,I} (function expects Ptr, Ptr, and Int)
-- and values are the values to be inserted into the formal params before
-- the function is called;
name = '+' & name
for i = 1 to length(params) do
if string(values[i]) then
values[i] = allocate_string(values[i],1)
end if
end for
if atom(values) then
values = {values}
end if
atom fn = define_func(name,params,P)
if fn > 0 then
return c_func(fn,values)
else
return -1
end if
end function
-----------------------------------------------------------------------------
export function gtk_str_func(object name, object params={}, object values={})
-----------------------------------------------------------------------------
-- syntax: same as above, except a string result is returned
for i = 1 to length(params) do
if string(values[i]) then
values[i] = allocate_string(values[i],1)
end if
end for
name = '+' & name
atom fn = define_func(name,params,P)
object result
if fn > 0 then
if length(params) > 0 then
result = c_func(fn,values)
else
result = c_func(fn,{})
end if
if result > 0 then
return peek_string(result)
end if
end if
return 0
end function
--------------------------------------------------------------------------
export function gtk_proc(object name, object params={}, object values={})
--------------------------------------------------------------------------
-- syntax: same as above, but no value is returned, used to call GTK procs
atom fn
if string(values) then values = {values} end if
name = '+' & name
for i = 1 to length(params) do
if sequence(values) and string(values[i]) then
values[i] = allocate_string(values[i]) -- keep
end if
end for
if length(params) = 0 then
fn = define_proc(name)
if fn > 0 then
c_proc(fn,{})
end if
else
fn = define_proc(name,params)
if fn > 0 then
if atom(values) then values = {values} end if
c_proc(fn,values)
end if
end if
return values
end function
-- The following 2 functions had to be added for Windows, so that we could search
-- a list of dlls until we find the function name requested. I'm not sure the '+'
-- is necessary for 32-bit Windows, since I don't have a 32-bit computer anymore.
----------------------------------------------------------------------------------------
export function define_proc(object name, object params={})
----------------------------------------------------------------------------------------
atom x
for i = 1 to length(LIBS) do
if atom(LIBS[i]) and LIBS[i] > 0 then
x = define_c_proc(LIBS[i],name,params)
if x > 0 then
return x
end if
end if
end for
return -1
end function
---------------------------------------------------------------------------
export function define_func(object name, object params={}, object values=P)
---------------------------------------------------------------------------
atom x
ifdef BITS32 and WINDOWS then name = '+' & name end ifdef
for i = 1 to length(LIBS) do
if atom(LIBS[i]) and LIBS[i] > 0 then
x = define_c_func(LIBS[i],name,params,values)
if x > 0 then
return x
end if
end if
end for
return -1
end function
-----------------------------------------------------------------------------------
-- Color handling routines - most are used internally, but exported if you need 'em
-----------------------------------------------------------------------------------
----------------------------------------
export function to_rgba(object color) -- converts a color description to rgba ptr;
----------------------------------------
atom rgba = allocate(32) -- keep;
object c = color
if string(c) then c = allocate_string(c,1) end if
if gtk_func("gdk_rgba_parse",{P,P},{rgba,c}) then
return rgba
else
printf(1,"\nError: invalid color '%s'\n******\n",{color})
return 0
end if
return rgba
end function
-------------------------------------------------------
export function from_rgba(object rgba, object fmt=0) -- converts rgba ptr to description;
-------------------------------------------------------
object result = gtk_str_func("gdk_rgba_to_string",{P},{rgba})
if fmt=0 then return result
else return fmt_color(result,fmt)
end if
end function
----------------------------------------------
function fmt_color(object s, integer fmt=0) -- Convert color to various formats;
----------------------------------------------
if atom(s) then
if string(peek_string(s)) then
s = peek_string(s)
end if
end if
object w
w = split_any(s,"(,)")
if length(w[1]) = 3 then
w[5] = "1"
end if
for i = 2 to 5 do
w[i] = to_number(w[i])
end for
if atom(w[5]) then
w[5] = round(w[5],100)
end if
switch fmt do
case 0 then return w[1..length(w[1])+1]
case 1 then return sprintf("#%02x%02x%02x",w[2..4])
case 2 then return (256*256*w[2])+(256*w[3])+ w[4]
case 3 then return {w[2],w[3],w[4]}
case 4 then return {w[2],w[3],w[4],w[5]}
case 5 then return {w[2],w[3],w[4],256*w[5]}
case 6 then return sprintf("rgba(%d,%d,%d,%2.2f)",w[2..$])
case 7 then return {w[2]/255,w[3]/255,w[4]/255,w[5]}
case 8 then return sprintf("r=#%x, g=#%x, b=#%x, alpha=#%x",w[2..5])
case else -- do nothing
end switch
return s
end function
------------------------------------------------------------------------
-- Following are 5 pre-built, easy to use popup dialogs
-- which save you the trouble of writing tons of code!
-- Refer to documentation/dialogs.html for details.
-- Rewritten for 4.8.8 to preserve images on dialog buttons despite
-- GTK developers' bland, boring preferences :P
-- Beginning with EuGTK 4.9.3, dialogs can be non-modal if desired.
------------------------------------------------------------------------
public function Info(object parent=0, object title="Info",
object pri_txt="", object sec_txt="",
object btns=GTK_BUTTONS_OK,
object image="dialog-information",
object icon=0,
integer modal=1,
object addon=0,
integer x=-1,
integer y=-1,
object name="Info")
return Custom(parent,title,pri_txt,sec_txt,btns,image,icon,modal,addon,x,y,name)
end function
public function Warn(object parent=0, object title="Warning",
object pri_txt="", object sec_txt="",
object btns=GTK_BUTTONS_CLOSE,
object image="dialog-warning",
object icon=0,
integer modal=1,
object addon=0,
integer x=-1,
integer y=-1,
object name="Warn")
return Custom(parent,title,pri_txt,sec_txt,btns,image,icon,modal,addon,x,y,name)
end function
public function Error(object parent=0, object title="Error",
object pri_txt="", object sec_txt="",
object btns=GTK_BUTTONS_OK_CANCEL,
object image="dialog-error",
object icon=0,
integer modal=1,
object addon=0,
integer x=-1,
integer y=-1,
object name="Error")
return Custom(parent,title,pri_txt,sec_txt,btns,image,icon,modal,addon,x,y,name)
end function
public function Question(object parent=0, object title="Question",
object pri_txt="", object sec_txt="",
object btns=GTK_BUTTONS_YES_NO,
object image="dialog-question",
object icon=0,
integer modal=1,
object addon=0,
integer x=-1,
integer y=-1,
object name="Question")
return Custom(parent,title,pri_txt,sec_txt,btns,image,icon,modal,addon,x,y,name)
end function
integer closedlg = call_back(routine_id("close_dialog"))
--------------------------------------------------------------
public function Custom(
object parent=0, --1
object title="Dialog", --2
object pri_txt="", --3
object sec_txt="", --4
object btns=GTK_BUTTONS_OK, --5
object image=0, --6
object icon=0, --7
integer modal=GTK_DIALOG_MODAL, --8
object addon=0, --9
integer x=-1, --10
integer y=-1, --11
object name="Custom") --12
--------------------------------------------------------------
atom dlg = create(GtkDialog)
atom btnbox = create(GtkButtonBox)
atom ca = 0
atom top = 0, left = 0, right = 0
atom lbl1 = 0
atom capanel = create(GtkBox,VERTICAL)
object btn = repeat(0,2)
if string(parent) then
parent = get(builder,"object",parent)
end if
if parent = 0 then
for i = 1 to length(registry) do
if registry[i][2] = 293 then
parent = registry[i][1]
exit
end if
end for
end if
if parent > 0 and atom(icon) and icon = 0 then
icon = get(parent,"icon name")
end if
if atom(pri_txt) and pri_txt > 0 then pri_txt = unpack(pri_txt) end if
if atom(sec_txt) and sec_txt > 0 then sec_txt = unpack(sec_txt) end if
if class_id(addon) = GdkPixbuf then addon = create(GtkImage,addon) end if
set(dlg,{
{"transient for",parent},
{"title"," " & title},
{"border width",5},
{"icon",icon},
{"position",GTK_WIN_POS_MOUSE}})
if string(name) then
set(dlg,"name",name)
end if
ca = get(dlg,"content area")
capanel = create(GtkBox,VERTICAL)
add(ca,capanel)
top = create(GtkBox,HORIZONTAL,2)
add(capanel,top)
left = create(GtkBox,VERTICAL,5)
right = create(GtkBox,VERTICAL,5)
add(top,{left,right})
if string(image) then
add(left,create(GtkImage,image,GTK_ICON_SIZE_DIALOG))
elsif image > 0 then
if class_id(image) = GdkPixbuf
or class_id(image) = GIcon then
image = create(GtkImage,image)
end if
add(left,image)
end if
lbl1 = create(GtkLabel)
set(lbl1,"name",name & "_label")
set(lbl1,"markup",text:format("<b>[]</b>\n[]",{pri_txt,sec_txt}))
set(lbl1,"halign",0)
add(right,lbl1)
if atom(addon) and addon > 0 then
atom p2 = create(GtkBox,VERTICAL)
add(capanel,p2)
if get(addon,"parent") != 0 then
set(addon,"reparent",p2)
else
add(p2,addon)
end if
end if
show_all(capanel)
if integer(btns) then
switch btns do
case GTK_BUTTONS_NONE then break
case GTK_BUTTONS_OK then
btn[1] = create(GtkButton,"gtk-ok")
set(dlg,"add action widget",btn[1],MB_OK)
show(btn[1])
case GTK_BUTTONS_OK_CANCEL then
btn[1] = create(GtkButton,"gtk-cancel")
btn[2] = create(GtkButton,"gtk-ok")
set(dlg,"add action widget",btn[1],MB_CANCEL)
set(dlg,"add action widget",btn[2],MB_OK)
show(btn[1]) show(btn[2])
case GTK_BUTTONS_CLOSE then
btn[1] = create(GtkButton,"gtk-close")
set(btn[1],"can default",TRUE)
set(dlg,"add action widget",btn[1],MB_CLOSE)
show(btn[1])
case GTK_BUTTONS_YES_NO then
btn[1] = create(GtkButton,"gtk-yes")
set(dlg,"add action widget",btn[1],MB_YES)
btn[2] = create(GtkButton,"gtk-no")
set(dlg,"add action widget",btn[2],MB_NO)
show(btn[1]) show(btn[2])
case else btn[1] = create(GtkButton,"gtk-ok")
set(btn[1],"can default",TRUE)
set(dlg,"add action widget",btn[1],MB_OK)
show(btn[1])
end switch
end if
if sequence(btns) and not atom(btns[1]) then
set(btnbox,"margin top",5)
pack(capanel,-btnbox)
for i = 1 to length(btns) do
while length(btns[i]) < 3 do btns[i] &= 0 end while
if atom(btns[i][2]) and btns[i][2] = 0 then btns[i][2] = closedlg end if
if atom(btns[i][3]) and btns[i][3] = 0 then btns[i][3] = {dlg,MB_CANCEL} end if
btns[i] = create(GtkButton,btns[i][1],btns[i][2],btns[i][3])
end for
add(btnbox,btns)
show_all(btnbox)
end if
if x+y > 0 then
set(dlg,"move",x,y)
end if
atom result = 0
set(dlg,"modal",modal)
if modal = GTK_DIALOG_NON_MODAL then
return show_all(dlg)
else
result = get(dlg,"run")
destroy(dlg)
end if
return result
end function
-------------------------------
export function run(object dlg)
-------------------------------
if string(dlg) then
dlg = pointer(dlg)
end if
object result = get(dlg,"run")
return result
end function
global integer dialog_return_value = 0
function close_dialog(object ctl, object dlg)
dlg = unpack(dlg)
dialog_return_value = dlg[2]
set(dlg[1],"hide")
return 1
end function
--------------------------------------------
-- Nifty shortcut, thanks to Greg Haberek,
-- allows using local functions without
-- call_back(routine_id()) and scope issues:
--------------------------------------------
export function _(sequence name, atom rid = routine_id(name))
if rid > 0 then
return call_back(rid)
end if
return 0
end function
---------------------------------
-- © 2016 by Irv Mullins
---------------------------------