From 5106228da25e343949e917ed4dedc50107dbe116 Mon Sep 17 00:00:00 2001 From: mollusk Date: Fri, 25 Nov 2016 00:27:22 -0700 Subject: [PATCH] First commit --- editor | 13 + eugtk/GtkAboutDialog.e | 39 + eugtk/GtkCairo.e | 643 ++ eugtk/GtkEngine.e | 9648 +++++++++++++++++++++++ eugtk/GtkEnums.e | 1514 ++++ eugtk/GtkEvents.e | 277 + eugtk/GtkFileSelector.e | 454 ++ eugtk/GtkFontSelector.e | 154 + eugtk/GtkPrinter.e | 567 ++ eugtk/GtkSettings.e | 305 + mandy.exw | 16 + tools/WEE/EuGTK/GtkEngine.e | 8800 +++++++++++++++++++++ tools/WEE/EuGTK/GtkEnums.e | 1441 ++++ tools/WEE/EuGTK/GtkEvents.e | 222 + tools/WEE/EuGTK/GtkPrinter.e | 487 ++ tools/WEE/EuGTK/README.txt | 4 + tools/WEE/EuGTK/license.txt | 17 + tools/WEE/LICENSE | 22 + tools/WEE/README.md | 21 + tools/WEE/manifest.ex | 66 + tools/WEE/manifest.json | 150 + tools/WEE/mongoose-wee.ico | Bin 0 -> 16958 bytes tools/WEE/parser.e | 2959 +++++++ tools/WEE/scintilla.e | 2802 +++++++ tools/WEE/scintilla/License.txt | 20 + tools/WEE/scintilla/SciLexer.dll | Bin 0 -> 753152 bytes tools/WEE/scintilla/SciLexer64.dll | Bin 0 -> 1379328 bytes tools/WEE/scintilla/gtk_makefile | 110 + tools/WEE/scintilla/scintilla32.so | Bin 0 -> 1404915 bytes tools/WEE/scintilla/scintilla32armhf.so | Bin 0 -> 1344904 bytes tools/WEE/scintilla/scintilla64.so | Bin 0 -> 1448078 bytes tools/WEE/scintilla/scintillaOSX.dylib | Bin 0 -> 1296184 bytes tools/WEE/ui_gtk.e | 1504 ++++ tools/WEE/ui_win.e | 1866 +++++ tools/WEE/updater.ex | 106 + tools/WEE/wee | Bin 0 -> 2753488 bytes tools/WEE/wee.exw | 2879 +++++++ tools/WEE/wee.ico | Bin 0 -> 4286 bytes tools/WEE/weeicon.e | 507 ++ tools/WEE/window.ew | 2341 ++++++ tools/euphoria-manager | 200 + 41 files changed, 40154 insertions(+) create mode 100755 editor create mode 100644 eugtk/GtkAboutDialog.e create mode 100644 eugtk/GtkCairo.e create mode 100644 eugtk/GtkEngine.e create mode 100644 eugtk/GtkEnums.e create mode 100644 eugtk/GtkEvents.e create mode 100644 eugtk/GtkFileSelector.e create mode 100644 eugtk/GtkFontSelector.e create mode 100644 eugtk/GtkPrinter.e create mode 100644 eugtk/GtkSettings.e create mode 100644 mandy.exw create mode 100644 tools/WEE/EuGTK/GtkEngine.e create mode 100644 tools/WEE/EuGTK/GtkEnums.e create mode 100644 tools/WEE/EuGTK/GtkEvents.e create mode 100644 tools/WEE/EuGTK/GtkPrinter.e create mode 100644 tools/WEE/EuGTK/README.txt create mode 100644 tools/WEE/EuGTK/license.txt create mode 100644 tools/WEE/LICENSE create mode 100644 tools/WEE/README.md create mode 100644 tools/WEE/manifest.ex create mode 100644 tools/WEE/manifest.json create mode 100644 tools/WEE/mongoose-wee.ico create mode 100644 tools/WEE/parser.e create mode 100644 tools/WEE/scintilla.e create mode 100644 tools/WEE/scintilla/License.txt create mode 100644 tools/WEE/scintilla/SciLexer.dll create mode 100644 tools/WEE/scintilla/SciLexer64.dll create mode 100644 tools/WEE/scintilla/gtk_makefile create mode 100755 tools/WEE/scintilla/scintilla32.so create mode 100755 tools/WEE/scintilla/scintilla32armhf.so create mode 100755 tools/WEE/scintilla/scintilla64.so create mode 100755 tools/WEE/scintilla/scintillaOSX.dylib create mode 100644 tools/WEE/ui_gtk.e create mode 100644 tools/WEE/ui_win.e create mode 100644 tools/WEE/updater.ex create mode 100755 tools/WEE/wee create mode 100644 tools/WEE/wee.exw create mode 100644 tools/WEE/wee.ico create mode 100644 tools/WEE/weeicon.e create mode 100644 tools/WEE/window.ew create mode 100755 tools/euphoria-manager diff --git a/editor b/editor new file mode 100755 index 0000000..90174ba --- /dev/null +++ b/editor @@ -0,0 +1,13 @@ +#!/bin/bash + + + +if [ ! -f /usr/bin/eui ];then + sudo ./tools/euphoria-manager i + eui ./tools/WEE/wee.exw +else + if [ "${1}" = "-c" ];then + euc ./tools/WEE/wee.exw + fi + eui ./tools/WEE/wee.exw +fi diff --git a/eugtk/GtkAboutDialog.e b/eugtk/GtkAboutDialog.e new file mode 100644 index 0000000..3176199 --- /dev/null +++ b/eugtk/GtkAboutDialog.e @@ -0,0 +1,39 @@ + +------------------- +namespace about -- Generic About dialog +------------------- + +export constant version = "4.12.0" + +--# EXPORTS: about:Dialog -- use run(about:Dialog), not show() + +include GtkEngine.e +public include euphoria/info.e + +if not equal(version,gtk:version) then + Error(,,"GtkAboutDialog version mismatch","should be version " & gtk:version) +end if + +export atom Dialog = create(GtkAboutDialog,{ + {"name","about:dialog"}, + {"logo","thumbnails/eugtk.png"}, + {"program name",prg_name}, + {"version","EuGTK version: " & gtk:version}, + {"copyright",copyright}, + {"comments","For information on the Euphoria\nprogramming language, click below"}, + + -- must specify custom as the license type if supplying license text; + {"license type",GTK_LICENSE_CUSTOM}, + {"license",LGPL}, -- LGPL text is built into EuGTK + {"wrap license",0}, + + {"website","http://OpenEuphoria.org"}, + {"website label","OpenEuphoria"}, + {"authors",{"Irv Mullins"}}, + + --{"artists",0}, + --{"documenters",0}, + --{"translator credits",0}, + --{"add credit section","Special Thanks to",{"\nBob's Burgers\nDuff's Beer"}}, + $}) + diff --git a/eugtk/GtkCairo.e b/eugtk/GtkCairo.e new file mode 100644 index 0000000..24126d1 --- /dev/null +++ b/eugtk/GtkCairo.e @@ -0,0 +1,643 @@ + +---------------------------- +namespace cairo +---------------------------- + +export constant version = "4.12.0" + +include GtkEngine.e + +if not equal(version,gtk:version) then + Error(,,"GtkCairo version mismatch","should be version " & gtk:version) +end if + +export constant pango_version = gtk_str_func("pango_version_string") + +widget[GdkCairo_t] = {"gdk_cairo", +{Cairo_t}, + {"new",{P},-routine_id("newGdkCairo")}, + {"draw_from_gl",{P,P,I,I,I,I,I,I,I}}, -- 3.16 + {"get_clip_rectangle",{P},-routine_id("getClipRect")}, + {"set_source_pixbuf",{P,P,D,D}}, + {"set_source_window",{P,P,D,D}}, + {"region",{P,P}}, + {"region_create_from_surface",{P},P}, + {"surface_create_from_pixbuf",{P,I,P},P,0,CairoSurface_t}, + {"set_source_rgba",{P,I,I,I,D},-routine_id("setCairoRGBA")}, + {"set_color",{P,P},-routine_id("setCairoColor")}, +"GdkCairo_t"} + + function getClipRect(atom cr) + atom fn = define_func("gdk_cairo_get_clip_rectangle",{P,P},B) + atom rect = allocate(8,1) + if c_func(fn,{cr,rect}) then + return rect + else return -1 + end if + end function + + function newGdkCairo(atom win) + return gtk_func("gdk_cairo_create",{P},{win}) + end function + + ---------------------------------------------------------------- + -- to use the Cairo color specs, where colors are 0.0 => 1.0 + ---------------------------------------------------------------------- + function setCairoRGBA(atom cr, atom r, atom g, atom b, atom a=1) + gtk_proc("cairo_set_source_rgba",{P,D,D,D,D},{cr,r,g,b,a}) + return 1 + end function + + -------------------------------------------- + -- it's easier to use named colors + -------------------------------------------- + function setCairoColor(atom cr, object color) + if atom(color) then color = sprintf("#%06x",color) end if + color = to_rgba(color) + color = from_rgba(color,7) + setCairoRGBA(cr,color[1],color[2],color[3],color[4]) + return 1 + end function + +widget[Cairo_t] = {"cairo", +{GObject}, + {"create",{P},P}, + {"reference",{P},P}, + {"destroy",{P}}, + {"status",{P},I}, + {"save",{P}}, + {"restore",{P}}, + {"get_target",{P},P,0,CairoSurface_t}, + {"push_group",{P}}, + {"push_group_with_content",{P,P}}, + {"pop_group",{P},P}, + {"pop_group_to_source",{P}}, + {"get_group_target",{P},P}, + {"set_source_rgb",{P,D,D,D}}, + {"set_source",{P,P}}, + {"get_source",{P},P}, + {"set_source_surface",{P,P,D,D}}, + {"set_antialias",{P,I}}, + {"get_antialias",{P},I}, + {"set_dash",{P,P,I,D}}, + {"get_dash_count",{P},I}, + {"get_dash",{P,D,D}}, + {"set_fill_rule",{P,I}}, + {"get_fill_rule",{P},I}, + {"set_line_cap",{P,I}}, + {"get_line_cap",{P},I}, + {"set_line_join",{P,I}}, + {"get_line_join",{P},I}, + {"set_line_width",{P,D}}, + {"get_line_width",{P},D}, + {"set_miter_limit",{P,I}}, + {"get_miter_limit",{P},I}, + {"set_operator",{P,I}}, + {"get_operator",{P},I}, + {"set_tolerance",{P,D}}, + {"get_tolerance",{P},D}, + {"clip",{P}}, + {"clip_preserve",{P}}, + {"clip_extents",{P,D,D,D,D}}, + {"in_clip",{P,D,D},B}, + {"reset_clip",{P}}, + {"rectangle_list_destroy",{P}}, + {"fill",{P}}, + {"fill_preserve",{P}}, + {"fill_extents",{P,D,D,D,D}}, + {"in_fill",{P,D,D},B}, + {"mask",{P,P}}, + {"mask_surface",{P,P,D,D}}, + {"paint",{P}}, + {"paint_with_alpha",{P,D}}, + {"stroke",{P}}, + {"stroke_preserve",{P}}, + {"stroke_extents",{P,D,D,D,D}}, + {"in_stroke",{P,D,D},B}, + {"copy_page",{P}}, + {"show_page",{P}}, + {"copy_path",{P},P}, + {"copy_path_flat",{P},P}, + {"path_destroy",{P}}, + {"append_path",{P,P}}, + {"has_current_point",{P},B}, + {"get_current_point",{P,D,D}}, + {"new_path",{P}}, + {"new_sub_path",{P}}, + {"close_path",{P}}, + {"set_user_data",{P,S,P,P},I}, + {"get_user_data",{P,S}}, + {"arc",{P,D,D,D,D,D}}, + {"arc_negative",{P,D,D,D,D,D}}, + {"move_to",{P,D,D}}, + {"rel_move_to",{P,D,D}}, + {"line_to",{P,D,D}}, + {"rel_line_to",{P,D,D}}, + {"rectangle",{P,D,D,D,D}}, + {"glyph_path",{P,I,I}}, + {"text_path",{P,S}}, + {"curve_to",{P,D,D,D,D,D,D}}, + {"rel_curve_to",{P,D,D,D,D,D,D}}, + {"path_extents",{P,D,D,D,D}}, + {"set_font_face",{P,S}}, + {"device_get_type",{P},I}, + {"device_status",{P},I}, + {"status_to_string",{I},S}, + {"translate",{P,D,D}}, + {"scale",{P,D,D}}, + {"rotate",{P,D}}, + {"transform",{P,P}}, + {"translate",{P,D,D}}, + {"scale",{P,D,D}}, + {"rotate",{P,D}}, + {"transform",{P,P}}, + {"set_matrix",{P,P}}, + {"get_matrix",{P,P}}, + {"identity_matrix",{P}}, + {"user_to_device",{P,D,D}}, + {"user_to_device_distance",{P,D,D}}, + {"device_to_user",{P,D,D}}, + {"device_to_user_distance",{P,D,D}}, + {"version",{},I}, + {"version_string",{},S}, + {"set_font_size",{P,D}}, + {"set_font_matrix",{P,P}}, + {"get_font_matrix",{P,P}}, + {"set_font_options",{P,P}}, + {"get_font_options",{P,P}}, + {"select_font_face",{P,S,I,I}}, + {"get_font_face",{P},P}, + {"set_scaled_font",{P,P}}, + {"get_scaled_font",{P},P}, + {"show_glyphs",{P,P}}, + {"show_text_glyphs",{P,S,I,P,I,P,I,I}}, + {"font_extents",{P,P}}, + {"text_extents",{P,S,P}}, + {"glyph_extents",{P,P,I,P}}, + {"toy_font_face_create",{S,I,I},P}, + {"toy_font_face_get_slant",{P},I}, + {"toy_font_face_get_weight",{P},I}, + {"glyph_allocate",{I},P}, + {"glyph_free",{P}}, + {"text_cluster_allocate",{I},P}, + {"text_cluster_free",{P}}, + {"show_text",{P,S}}, + {"set_source_rgba",{P,D,D,D,D},-routine_id("setCairoRGBA")}, + {"set_color",{P,S},-routine_id("setCairoColor")}, + {"should_draw_window",{P,P},-routine_id("CairoShouldDrawWin")}, + {"transform_to_window",{P,P,P},-routine_id("CairoTransformToWin")}, +"Cairo_t"} + + function CairoShouldDrawWin(atom cr, atom win) + return gtk_func("gtk_cairo_should_draw_window",{P,P},{cr,win}) + end function + + function CairoTransformToWin(atom cr, atom win1, atom win2) + gtk_proc("gtk_cairo_transform_to_window",{P,P,P},{cr,win1,win2}) + return 1 + end function + +widget[CairoPattern_t] = {0, +{Cairo_t}, +"CairoPattern_t"} + +widget[CairoFontOptions] = {"cairo_font_options", +{0}, +"CairoFontOptions"} + +widget[CairoContent_t] = {0, +{Cairo_t}, +"CairoContent_t"} + +widget[CairoStatus_t] = {0, +{0}, +"CairoStatus_t"} + +widget[CairoPattern] = {"cairo_pattern", +{CairoPattern_t}, + {"new",{P},-routine_id("newCairoPattern")}, + {"add_color_stop_rgb",{P,D,D,D,D}}, + {"add_color_stop_rgba",{P,D,D,D,D,D}}, + {"get_color_stop_count",{P,I},P,0,CairoStatus_t}, + {"get_color_stop_rgba",{P,I,D,D,D,D,D},P,0,CairoStatus_t}, + {"create_rgb",{D,D,D},P,0,CairoPattern_t}, + {"create_rgba",{D,D,D,D},P,0,CairoPattern_t}, + {"get_rgba",{P,D,D,D,D},P,0,CairoPattern_t}, + {"create_for_surface",{P},P,0,CairoPattern_t}, + {"reference",{P},P,0,CairoPattern_t}, + {"destroy",{P}}, + {"status",{P},P,0,CairoStatus_t}, + {"set_extend",{P,I}}, + {"get_extend",{P},I}, + {"set_filter",{P,I}}, + {"get_filter",{P},I}, + {"set_matrix",{P,P}}, + {"get_matrix",{P,P}}, + {"get_type",{P},I}, + {"get_reference_count",{P},I}, +"CairoPattern"} + + function newCairoPattern(atom surf) + return gtk_func("cairo_pattern_create_for_surface",{P},{surf}) + end function + +widget[CairoLinearGradient] = {"cairo_pattern", +{CairoPattern}, + {"new",{D,D,D,D},-routine_id("newLinearGradient"),0,CairoPattern_t}, + {"get_linear_points",{P,D,D,D,D},P,0,CairoStatus_t}, +"CairoLinearGradient"} + + function newLinearGradient(atom a, atom b, atom c, atom d) + return gtk_func("cairo_pattern_create_linear",{D,D,D,D},{a,b,c,d}) + end function + +widget[CairoRadialGradient] = {"cairo_pattern", +{CairoPattern}, + {"new",{D,D,D,D,D,D},-routine_id("newRadialGradient"),0,CairoPattern_t}, + {"get_radial_circles",{P,D,D,D,D,D,D},P,0,CairoStatus_t}, +"CairoRadialGradient"} + + function newRadialGradient(atom a, atom b, atom c, atom d, atom e, atom f) + return gtk_func("cairo_pattern_create_radial",{D,D,D,D,D,D},{a,b,c,d,e,f}) + end function + +widget[CairoRegion_t] = {"cairo_region_t", -- FIXME! +{Cairo_t}, +"CairoRegion_t"} + +widget[CairoSurface_t] = {"cairo_surface_t", +{Cairo_t}, + {"get_write_to_png",{P,S},-routine_id("writetoPNG")}, + {"create_similar",{P,P,I,I},P,0,CairoSurface_t}, + {"create_for_rectangle",{P,D,D,D,D},P,0,CairoSurface_t}, + {"reference",{P},P,0,CairoSurface_t}, + {"destroy",{P}}, + {"finish",{P}}, + {"flush",{P}}, + {"get_font_options",{P,P}}, + {"mark_dirty",{P}}, + {"mark_dirty_rectangle",{P,I,I,I,I}}, + {"show_page",{P}}, +"CairoSurface_t"} + + function writetoPNG(atom surf, object name) -- note difference in call name; + return gtk_func("cairo_surface_write_to_png",{P,S},{surf,name}) + end function + +widget[CairoImageSurface] = {"cairo_image_surface", +{CairoSurface_t}, + {"new",{P},-routine_id("newCairoImageSurface")}, + {"get_format",{P},I}, + {"get_width",{P},P}, + {"get_height",{P},P}, + {"get_stride",{P},I}, +"CairoImageSurface"} + + function newCairoImageSurface(object png) + if string(png) then + png = locate_file(png) if file_type(png) = 1 then + png = allocate_string(png) + end if + end if + return gtk_func("cairo_image_surface_create_from_png",{S},{png}) + end function + +widget[PangoCairoLayout] = {"pango_cairo", +{PangoLayout}, + {"new",{P},-routine_id("newPangoCairoLayout")}, + {"update_layout",{P,P},-routine_id("updateLayout")}, + {"show_glyph_string",{P,P,P}}, + {"show_glyph_item",{P,S,P}}, + {"show_layout_line",{P,P}}, + {"layout_line_path",{P,P}}, + {"layout_path",{P,P}}, +"PangoCairoLayout"} + + function newPangoCairoLayout(atom cr) + atom pcl = gtk_func("pango_cairo_create_layout",{P},{cr}) + register(pcl,PangoLayout) + return pcl + end function + + function updateLayout(atom pl, atom cr) -- params swapped; + gtk_proc("pango_cairo_update_layout",{P,P},{cr,pl}) + return 1 + end function + +widget[PangoFont] = {"pango_font", +{0}, + {"describe",{P},P,0,PangoFontDescription}, + {"describe_with_absolute_size",{P},P,0,PangoFontDescription}, + {"get_coverage",{P,P},P}, + {"get_metrics",{P,P},P}, + {"get_font_map",{P},P,0,PangoFontMap}, +"PangoFont"} + +widget[PangoAttrList] = {"pango_attr_list", +{0}, +"PangoAttrList"} + +widget[PangoFontDescription] = {"pango_font_description", +{PangoFont}, + {"new",{P},-routine_id("newPangoFontDescription")}, + {"copy",{P},P,0,PangoFontDescription}, + {"copy_static",{P},P,0,PangoFontDescription}, + {"hash",{P},I}, + {"equal",{P,P},B}, + {"free",{P}}, + {"set_family",{P,S}}, + {"set_family_static",{P,S}}, + {"get_family",{P},S}, + {"set_style",{P,I}}, + {"get_style",{P},I}, + {"set_variant",{P,I}}, + {"get_variant",{P},P}, + {"set_weight",{P,I}}, + {"get_weight",{P},I}, + {"set_stretch",{P,I}}, + {"get_stretch",{P},I}, + {"set_size",{P,I}}, + {"get_size",{P},I}, + {"set_absolute_size",{P,D}}, + {"get_size_is_absolute",{P},B}, + {"set_gravity",{P,I}}, + {"get_gravity",{P},I}, + {"get_set_fields",{P},I}, + {"unset_fields",{P,I}}, + {"merge",{P,P,B}}, + {"merge_static",{P,P,B}}, + {"better_match",{P,P,P},B}, + -- from_string, see new + {"to_string",{P},S}, + {"to_filename",{P},S}, +"PangoFontDescription"} + + function newPangoFontDescription(object name=0) + if atom(name) then + return gtk_func("pango_font_description_new") + else + return gtk_func("pango_font_description_from_string",{P},{allocate_string(name,1)}) + end if + end function + +widget[PangoContext] = {"pango_context", +{GObject}, + {"new",{},P}, + {"load_font",{P,P},P}, + {"load_fontset",{P,P,P},P}, + {"get_metrics",{P,P,P},P}, + {"list_families",{P,A,I}}, + {"set_font_description",{P,P}}, + {"get_font_description",{P},P,0,PangoFontDescription}, + {"set_font_map",{P,P}}, + {"get_font_map",{P},P}, + {"set_base_gravity",{P,I}}, + {"get_language",{P},P}, + {"set_language",{P,P}}, + {"get_layout",{P},P}, + {"get_base_dir",{P},I}, + {"set_base_dir",{P,I}}, + {"get_base_gravity",{P},I}, + {"set_base_gravity",{P,I}}, + {"get_gravity",{P},I}, + {"get_gravity_hint",{P},I}, + {"set_gravity_hint",{P,I}}, + {"get_matrix",{P},P}, + {"set_matrix",{P,P}}, +"PangoContext"} + +widget[PangoFontsetSimple] = {"pango_fontset_simple", +{GObject}, + {"new",{P},P}, + {"append",{P,P}}, + {"size",{P},I}, +"PangoFontsetSimple"} + +widget[PangoFontSet] = {"pango_fontset", +{PangoFontsetSimple}, + {"get_font",{P,I},P,0,PangoFont}, + {"get_metrics",{P},P}, + {"foreach",{P,P,P}}, +"PangoFontSet"} + +widget[PangoFontMap] = {"pango_font_map", +{PangoFontSet}, + {"create_context",{P},P}, + {"load_font",{P,P,S},P}, + {"load_fontset",{P,P,S,P},P}, + {"list_families",{P,A,I}}, + {"get_shape_engine_type",{P},S}, + {"get_serial",{P},I}, + {"changed",{P}}, +"PangoFontMap"} + +widget[PangoFontFace] = {"pango_font_face", +{PangoFontMap}, + {"get_face_name",{P},S}, + {"list_sizes",{P,P,I}}, + {"describe",{P},P,0,PangoFontDescription}, + {"is_synthesized",{P},B}, +"PangoFontFace"} + +widget[PangoFontFamily] = {"pango_font_family", +{PangoFontFace}, + {"get_name",{P},S}, + {"is_monospace",{P},B}, + {"list_faces",{P,P,I}}, +"PangoFontFamily"} + +widget[PangoLayout] = {"pango_layout", +{GObject}, + {"new",{P},-routine_id("newPangoLayout")}, + {"set_text",{P,P},-routine_id("pl_set_text")}, + {"get_text",{P},S}, + {"get_character_count",{P},I}, + {"set_markup",{P,S},-routine_id("pl_set_markup")}, + {"set_markup_with_accel",{P,S,I,I},-routine_id("pl_set_markup_with_accel")}, + {"set_font_description",{P,P}}, + {"get_font_description",{P},P}, + {"set_attributes",{P,P}}, + {"get_attributes",{P},P,0,PangoAttrList}, + {"set_width",{P,I}}, + {"get_width",{P},I}, + {"set_height",{P,I}}, + {"get_height",{P},I}, + {"get_size",{P,I,I}}, + {"get_pixel_size",{P,I,I}}, + {"set_wrap",{P,I}}, + {"get_wrap",{P},I}, + {"is_wrapped",{P},B}, + {"set_ellipsize",{P,I}}, + {"get_ellipsize",{P},I}, + {"is_ellipsized",{P},B}, + {"set_indent",{P,I}}, + {"get_extents",{P,P,P}}, + {"get_indent",{P},I}, + {"get_pixel_size",{P,I,I}}, + {"get_size",{P,I,I}}, + {"set_spacing",{P,I}}, + {"get_spacing",{P},I}, + {"set_justify",{P,B}}, + {"get_justify",{P},B}, + {"set_auto_dir",{P,B}}, + {"get_auto_dir",{P},B}, + {"set_alignment",{P,P}}, + {"get_alignment",{P},P}, + {"set_tabs",{P,A}}, + {"get_tabs",{P},A}, + {"set_single_paragraph_mode",{P,B}}, + {"get_single_paragraph_mode",{P},B}, + {"get_unknown_glyphs_count",{P},I}, + {"get_log_attrs",{P,P,I}}, + {"get_log_attrs_readonly",{P,I},P}, + {"index_to_pos",{P,I,P}}, + {"index_to_line_x",{P,I,B,I,I}}, + {"xy_to_line",{P,I,I,I,I},B}, + {"get_cursor_pos",{P,I,P,P}}, + {"move_cursor_visually",{P,B,I,I,I,I,I}}, + {"get_pixel_extents",{P,P,P}}, + {"get_baseline",{P},I}, + {"get_line_count",{P},I}, + {"get_line",{P,I},P,0,PangoLayoutLine}, + {"get_line_readonly",{P,I},P,0,PangoLayoutLine}, + {"get_lines",{P},A,0,GSList}, + {"get_lines_readonly",{P},A,0,GSList}, + {"get_iter",{P},P,0,PangoLayoutIter}, + {"show_layout",{P,P},-routine_id("pl_show_layout")}, + {"get_context",{P},P,0,PangoContext}, + {"context_changed",{P}}, + {"get_serial",{P},I}, + {"get_extents",{P,P,P}}, +"PangoLayout"} + + function newPangoLayout(atom cr=0) + if cr=0 then + Error(,,"requires cairo_t as param!") + end if + return gtk_func("pango_cairo_create_layout",{P},{cr}) + end function + + function pl_set_text(atom layout, object txt) + if string(txt) then + txt = allocate_string(txt,1) + end if + gtk_proc("pango_layout_set_text",{P,P,I},{layout,txt,-1}) + return 1 + end function + + function pl_set_markup(atom layout, object txt) + if string(txt) then + txt = allocate_string(txt,1) + end if + gtk_proc("pango_layout_set_markup",{P,P,I},{layout,txt,-1}) + return 1 + end function + + function pl_set_markup_with_accel(atom layout, object txt, + integer marker, integer char) + if string(txt) then + txt = allocate_string(txt,1) + end if + gtk_proc("pango_layout_set_markup_with_accel",{P,P,I,I,I}, + {layout,txt,-1,marker,char}) + return 1 + end function + + function pl_show_layout(atom pcl, atom cr) + gtk_proc("pango_cairo_show_layout",{P,P},{cr,pcl}) + return 1 + end function + +widget[PangoLayoutLine] = {"pango_layout_line", +{0}, + {"ref",{P},P}, + {"unref",{P}}, + {"get_extents",{P,P,P}}, + {"get_pixel_extents",{P,P,P}}, + {"index_to_x",{P,I,B,I}}, + {"x_to_index",{P,I,I,I},B}, + {"get_x_ranges",{P,I,I,P,P}}, +"PangoLayoutLine"} + +widget[PangoLayoutIter] = {"pango_layout_iter", +{0}, + {"copy",{P},P,0,PangoLayoutIter}, + {"free",{P}}, + {"next_run",{P},B}, + {"next_char",{P},B}, + {"next_cluster",{P},B}, + {"next_line",{P},B}, + {"at_last_line",{P},B}, + {"get_index",{P},I}, + {"get_baseline",{P},I}, + {"get_run",{P},P,0,PangoLayoutRun}, + {"get_run_readonly",{P},P,0,PangoLayoutRun}, + {"get_line",{P},P,0,PangoLayoutLine}, + {"get_line_readonly",{P},P,0,PangoLayoutLine}, + {"get_layout",{P},P,0,PangoLayout}, + {"get_char_extents",{P,P}}, + {"get_cluster_extents",{P,P,P}}, + {"get_run_extents",{P,P,P}}, + {"get_line_yrange",{P,I,I}}, + {"get_line_extents",{P,P,P}}, + {"get_layout_extents",{P,P,P}}, +"PangoLayoutIter"} + +widget[PangoLayoutRun] = {"pango_layout_run", +{0}, +"PangoLayoutRun"} + +widget[PangoTabArray] = {"pango_tab_array", +{0}, + {"new",{I,B},P}, + {"get_size",{P},I}, + {"resize",{P,I}}, + {"set_tab",{P,I,I,I}}, + {"get_tab",{P,I,P,P}}, + {"get_tabs",{P,P,P}}, + {"get_position_in_pixels",{P},B}, +"PangoTabArray"} + +widget[PangoLanguage] = {"pango_language", +{GObject}, + {"new",{S},-routine_id("newPangoLanguage")}, + {"get_default",{P},-routine_id("getDefaultLanguage")}, + {"get_sample_string",{P},-routine_id("getSampleStr")}, + {"to_string",{P},S}, + {"matches",{P,S},B}, + {"includes_script",{P,P},B}, +"PangoLanguage"} + + function newPangoLanguage(object s) + return gtk_func("pango_language_from_string",{S},{s}) + end function + + function getDefaultLanguage(object junk) + return gtk_str_func("pango_language_get_default") + end function + + function getSampleStr(object x) + return gtk_str_func("pango_language_get_sample_string",{P},{x}) + end function + +export enum by * 2 + PANGO_STRETCH_ULTRA_CONDENSED, + PANGO_STRETCH_EXTRA_CONDENSED, + PANGO_STRETCH_CONDENSED, + PANGO_STRETCH_SEMI_CONDENSED, + PANGO_STRETCH_NORMAL, + PANGO_STRETCH_SEMI_EXPANDED, + PANGO_STRETCH_EXPANDED = 64, + PANGO_STRETCH_EXTRA_EXPANDED, + PANGO_STRETCH_ULTRA_EXPANDED + +export enum by * 2 + PANGO_FONT_MASK_FAMILY, + PANGO_FONT_MASK_STYLE, + PANGO_FONT_MASK_VARIANT, + PANGO_FONT_MASK_WEIGHT, + PANGO_FONT_MASK_STRETCH, + PANGO_FONT_MASK_SIZE, + PANGO_FONT_MASK_GRAVITY + + diff --git a/eugtk/GtkEngine.e b/eugtk/GtkEngine.e new file mode 100644 index 0000000..d3e9129 --- /dev/null +++ b/eugtk/GtkEngine.e @@ -0,0 +1,9648 @@ + +------------- +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 is not in scope",{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("]",{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("[]\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 +--------------------------------- diff --git a/eugtk/GtkEnums.e b/eugtk/GtkEnums.e new file mode 100644 index 0000000..741f014 --- /dev/null +++ b/eugtk/GtkEnums.e @@ -0,0 +1,1514 @@ + +---------------- +namespace enums +---------------- + +export constant version = "4.12.0" + +public include std/io.e +public include std/os.e +public include std/dll.e +public include std/text.e +public include std/math.e +public include std/error.e +public include std/text.e +public include std/types.e +public include std/search.e +public include std/convert.e +public include std/console.e +public include std/filesys.e +public include std/machine.e +public include std/sequence.e +public include std/serialize.e + +public constant LGPL = read_file(locate_file("resources/license.txt")) + +--------------------------------------------------------------------------------- +-- ListView/TreeView storage types. Use these when creating new +-- GtkListStores or GtkTreeStores +--------------------------------------------------------------------------------- +public enum + gCHAR = 12, gUCHAR = 16, gINT = 24, gUINT = 28, + gLONG = 32, gULONG = 36, gINT64 = 40, gUINT64 = 44, + gDBL = 60, gFLT = 56, gSTR = 64, gPTR = 68, gBOOL= 20, gDOL = 99 +-- plus gPIX and gCOMBO, which must be defined at run-time +-- by GtkEngine.e ... don't ask me why! + +public sequence storage_types = { + {12,"gCHAR"}, + {16,"gUCHAR"}, + {20,"gBOOL"}, + {24,"gINT"}, + {28,"gUINT", + {32,"gLONG"}, + {36,"gULONG"}, + {40,"gINT64"}, + {44,"gUINT64"}, + {56,"gFLT"}, + {60,"gDBL"}, + {64,"gSTR"}, + {68,"gPTR"}, + {99,"gDOL"} +}} +-- here's a list of GObject types; +public enum type OBJECT by 4 + void = 4, + GInterface, + gchar, + guchar, + gboolean, + gint, + guint, + glong, + gulong, + gint64, + guint64, + GEnum, + GFlags, + gfloat, + gdouble, + gchararray, + gpointer, + GBoxed, + GParam +end type + +------------------------------------------------------------------------ +-- These are the widget class names used to create GTK widgets; +-- GObject MUST be first on the list, and GtkFinal must be last! +-- Other than that, order is unimportant, but try to keep 'em in +-- alphabetical order just to be neat. +------------------------------------------------------------------------ +public enum type WIDGET + GObject, + GAction, + GActionGroup, + GActionMap, + GAppInfo, + GApplication, + GDateTime, + GEmblem, + GEmblemedIcon, + GFile, + GFileIcon, + GFileInfo, + GFileInputStream, + GIcon, + GIdle, + GInputStream, + GKeyFile, + GList, + GMenu, + GMenuItem, + GMenuModel, + GNotification, + GPermission, + GPropertyAction, + GSettings, + GSimpleAction, + GSimpleActionGroup, + GSimplePermission, + GSList, + GThemedIcon, + GTimeout, + Cairo_t, + CairoFontOptions, + CairoContent_t, + CairoLinearGradient, + CairoPattern, + CairoPattern_t, + CairoRadialGradient, + CairoRegion_t, + CairoImageSurface, + CairoStatus_t, + CairoSurface_t, + GdkAppLaunchContext, + GdkCairo_t, + GdkCursor, + GdkDevice, + GdkDeviceManager, + GdkDisplay, + GdkEvent, + GdkEventSequence, + GdkFrameClock, + GdkFrameTimings, + GdkGLContext, + GdkGLProfile, + GdkInputSource, + GdkKeymap, + GdkPixbuf, + GdkPixbufAnimation, + GdkPixbufAnimationIter, + GdkPixbufFormat, + GdkScreen, + GdkVisual, + GdkWindow, + GdkX11Display, + GdkX11Screen, + GdkX11Window, + GtkAboutDialog, + GtkAccelGroup, + GtkAccelLabel, + GtkActionable, + GtkActionBar, + GtkAdjustment, + GtkAlignment, + GtkAppChooser, + GtkAppChooserButton, + GtkAppChooserDialog, + GtkAppChooserWidget, + GtkAppLaunchContext, + GtkApplication, + GtkApplicationWindow, + GtkArrow, + GtkAspectFrame, + GtkAssistant, + GtkBin, + GtkBindingEntry, + GtkBindingSet, + GtkBox, + GtkBuildable, + GtkBuilder, + GtkButton, + GtkButtonBox, + GtkCalendar, + GtkCellArea, + GtkCellAreaBox, + GtkCellAreaCell, + GtkCellAreaContext, + GtkCellEditable, + GtkCellLayout, + GtkCellRenderer, + GtkCellRendererAccel, + GtkCellRendererCombo, + GtkCellRendererPixbuf, + GtkCellRendererProgress, + GtkCellRendererSpin, + GtkCellRendererSpinner, + GtkCellRendererText, + GtkCellRendererToggle, + GtkCellView, + GtkCheckButton, + GtkCheckMenuItem, + GtkClipboard, + GtkColorButton, + GtkColorChooser, + GtkColorChooserDialog, + GtkColorChooserWidget, + GtkColorSelection, + GtkColorSelectionDialog, + GtkColumn, Column, -- aliases for GtkTreeViewColumn.new function; + GtkComboBox, + GtkComboBoxEntry, + GtkComboBoxText, + GtkContainer, + GtkCssProvider, + GtkCssSection, + GtkDialog, + GtkDrag, + GtkDragDest, + GtkDragSource, + GtkDrawingArea, + GtkEditable, + GtkEntry, + GtkEntryBuffer, + GtkEntryCompletion, + GtkEventBox, + GtkEventController, + GtkExpander, + GtkFileChooser, + GtkFileChooserButton, + GtkFileChooserDialog, + GtkFileChooserNative, + GtkFileChooserWidget, + GtkFileFilter, + GtkFixed, + GtkFlowBox, + GtkFlowBoxChild, + GtkFontButton, + GtkFontChooser, + GtkFontChooserDialog, + GtkFontChooserWidget, + GtkFrame, + GtkGesture, + GtkGestureSingle, + GtkGestureDrag, + GtkGestureLongPress, + GtkGestureMultiPress, + GtkGesturePan, + GtkGestureRotate, + GtkGestureSwipe, + GtkGestureZoom, + GtkGLArea, + GtkGrid, + GtkHeaderBar, + GtkIconInfo, + GtkIconTheme, + GtkIconView, + GtkImage, + GtkImageMenuItem, + GtkInfoBar, + GtkInvisible, + GtkLabel, + GtkLayout, + GtkLevelBar, + GtkLinkButton, + GtkListBox, + GtkListBoxRow, + GtkListStore, + GtkLockButton, + GtkMenu, + GtkMenuBar, + GtkMenuButton, + GtkMenuItem, + GtkMenuShell, + GtkMenuToolButton, + GtkMessageDialog, + GtkMisc, + GtkModelButton, + GtkMountOperation, + GtkNativeDialog, + GtkNotebook, + GtkNumerableIcon, + GtkOffscreenWindow, + GtkOrientable, + GtkOverlay, + GtkPadController, + GtkPaperSize, + GtkPageRange, + GtkPageSetup, + GtkPageSetupUnixDialog, + GtkPaned, + GtkPlacesSidebar, + GtkPlug, + GtkPopover, + GtkPopoverMenu, + GtkPrinter, + GtkPrintContext, + GtkPrintJob, + GtkPrintSettings, + GtkPrintOperation, + GtkPrintUnixDialog, + GtkProgressBar, + GtkRadioButton, + GtkRadioMenuItem, + GtkRadioToolButton, + GtkRange, + GtkRecentChooser, + GtkRecentChooserDialog, + GtkRecentChooserMenu, + GtkRecentChooserWidget, + GtkRecentFilter, + GtkRecentInfo, + GtkRecentManager, + GtkRevealer, + GtkScale, + GtkScaleButton, + GtkScrollable, + GtkScrollbar, + GtkScrolledWindow, + GtkSearchBar, + GtkSearchEntry, + GtkSelectionData, + GtkSeparator, + GtkSeparatorMenuItem, + GtkSeparatorToolItem, + GtkSettings, + GtkShortcutsGesture, + GtkShortcutsGroup, + GtkShortcutsSection, + GtkShortcutsShortcut, + GtkShortcutsWindow, + GtkSocket, + GtkSidebar, + GtkSizeGroup, + GtkSpinButton, + GtkSpinner, + GtkStack, + GtkStackSidebar, + GtkStackSwitcher, + GtkStatusbar, + GtkStatusIcon, + GtkStockList, + GtkStyle, + GtkStyleContext, + GtkStyleProvider, + GtkSwitch, + GtkTargetEntry, + GtkTargetList, + GtkTextAttributes, + GtkTextBuffer, + GtkTextChildAnchor, + GtkTextIter, + GtkTextMark, + GtkTextTag, + GtkTextTagTable, + GtkTextView, + GtkThemedIcon, + GtkToggleButton, + GtkToggleToolButton, + GtkToolbar, + GtkToolButton, + GtkToolItem, + GtkToolItemGroup, + GtkToolPalette, + GtkToolShell, + GtkTooltip, + GtkTreeDragDest, + GtkTreeDragSource, + GtkTreeIter, + GtkTreeModel, + GtkTreeModelFilter, + GtkTreeModelSort, + GtkTreePath, + GtkTreeRowReference, + GtkTreeSelection, + GtkTreeSortable, + GtkTreeStore, + GtkTreeView, + GtkTreeViewColumn, + GtkViewport, + GtkVolumeButton, + GtkWidget, + GtkWidgetClass, + GtkWidgetPath, + GtkWindow, + GtkWindowGroup, + PangoAttrList, + PangoCairoLayout, + PangoContext, + PangoFont, + PangoFontSet, + PangoFontsetSimple, + PangoFontDescription, + PangoFontFace, + PangoFontFamily, + PangoFontMap, + PangoLanguage, + PangoLayout, + PangoLayoutIter, + PangoLayoutLine, + PangoLayoutRun, + PangoTabArray, + GtkFinal +end type + +------------------------------------------------------------------------ + +public enum -- Response codes returned by button presses, etc; + MB_YES = -8, + MB_NO = -9, + MB_OK = -5, + MB_CANCEL = -6, + MB_CLOSE = -7, + MB_ABORT = -4, + MB_NONE = -1, + MB_REJECT = -2, + MB_ACCEPT = -3, + MB_APPLY = -10, + MB_HELP = -11 + +----------------------------------------------------------------------------------------- +-- a zillion or so GTK_CONSTANTS used to make code clearer. See GTK docs. +----------------------------------------------------------------------------------------- + +public enum type Orientation + VERTICAL = 1, HORIZONTAL = 0 end type + +public enum type SortOrder + UNSORTED = -1, ASCENDING = 1, DESCENDING = 2 end type + +public enum by 2 -- Cursors: + GDK_X_CURSOR = 0, + GDK_ARROW, + GDK_BASED_ARROW_DOWN, + GDK_BASED_ARROW_UP, + GDK_BOAT, + GDK_BOGOSITY, + GDK_BOTTOM_LEFT_CORNER, + GDK_BOTTOM_RIGHT_CORNER, + GDK_BOTTOM_SIDE, + GDK_BOTTOM_TEE, + GDK_BOX_SPIRAL, + GDK_CENTER_PTR, + GDK_CIRCLE, + GDK_CLOCK, + GDK_COFFEE_MUG, + GDK_CROSS, + GDK_CROSS_REVERSE, + GDK_CROSSHAIR, + GDK_DIAMOND_CROSS, + GDK_DOT, + GDK_DOTBOX, + GDK_DOUBLE_ARROW, + GDK_DRAFT_LARGE, + GDK_DRAFT_SMALL, + GDK_DRAPED_BOX, + GDK_EXCHANGE, + GDK_FLEUR, + GDK_GOBBLER, + GDK_GUMBY, + GDK_HAND1, + GDK_HAND2, + GDK_HEART, + GDK_ICON, + GDK_IRON_CROSS, + GDK_LEFT_PTR, + GDK_LEFT_SIDE, + GDK_LEFT_TEE, + GDK_LEFTBUTTON, + GDK_LL_ANGLE, + GDK_LR_ANGLE, + GDK_MAN, + GDK_MIDDLEBUTTON, + GDK_MOUSE, + GDK_PENCIL, + GDK_PIRATE, --? + GDK_PLUS, + GDK_QUESTION_ARROW, + GDK_RIGHT_PTR, + GDK_RIGHT_SIDE, + GDK_RIGHT_TEE, + GDK_RIGHTBUTTON, + GDK_RTL_LOGO, + GDK_SAILBOAT, + GDK_SB_DOWN_ARROW, + GDK_SB_H_DOUBLE_ARROW, + GDK_SB_LEFT_ARROW, + GDK_SB_RIGHT_ARROW, + GDK_SB_UP_ARROW, + GDK_SB_V_DOUBLE_ARROW, + GDK_SHUTTLE, + GDK_SIZING, + GDK_SPIDER, + GDK_SPRAYCAN, + GDK_STAR, + GDK_TARGET, + GDK_TCROSS, + GDK_TOP_LEFT_ARROW, + GDK_TOP_LEFT_CORNER, + GDK_TOP_RIGHT_CORNER, + GDK_TOP_SIDE, + GDK_TOP_TEE, + GDK_TREK, + GDK_UL_ANGLE, + GDK_UMBRELLA, + GDK_UR_ANGLE, + GDK_WATCH, + GDK_XTERM, + GDK_LAST_CURSOR = 153, + GDK_BLANK_CURSOR = -2, + GDK_CURSOR_IS_PIXMAP = -1 + +public enum + GTK_LICENSE_UNKNOWN = 0, + GTK_LICENSE_CUSTOM, + GTK_LICENSE_GPL_2_0, + GTK_LICENSE_GPL_3_0, + GTK_LICENSE_LGPL_2_1, + GTK_LICENSE_LGPL_3_0, + GTK_LICENSE_BSD, + GTK_LICENSE_MIT_X11, + GTK_LICENSE_ARTISTIC, + GTK_LICENSE_GPL_2_0_ONLY, + GTK_LICENSE_GPL_3_0_ONLY, + GTK_LICENSE_LGPL_2_1_ONLY, + GTK_LICENSE_LGPL_3_0_ONLY, + + GTK_ACCEL_VISIBLE = 1, + GTK_ACCEL_LOCKED = 2, + GTK_ACCEL_MASK = 7, + + GTK_ALIGN_FILL = 0, + GTK_ALIGN_START, + GTK_ALIGN_END, + GTK_ALIGN_CENTER, + + GTK_ANCHOR_CENTER = 0, + GTK_ANCHOR_NORTH, + GTK_ANCHOR_NORTH_WEST, + GTK_ANCHOR_NORTH_EAST, + GTK_ANCHOR_SOUTH, + GTK_ANCHOR_SOUTH_WEST, + GTK_ANCHOR_SOUTH_EAST, + GTK_ANCHOR_WEST, + GTK_ANCHOR_EAST, + GTK_ANCHOR_N = 1, + GTK_ANCHOR_NW, + GTK_ANCHOR_NE, + GTK_ANCHOR_S, + GTK_ANCHOR_SW, + GTK_ANCHOR_SE, + GTK_ANCHOR_W, + GTK_ANCHOR_E, + + GTK_APPLICATION_INHIBIT_LOGOUT = 1, + GTK_APPLICATION_INHIBIT_SWITCH = 2, + GTK_APPLICATION_INHIBIT_SUSPEND = 4, + GTK_APPLICATION_INHIBIT_IDLE = 8, + + G_APPLICATION_FLAGS_NONE = 0, + G_APPLICATION_IS_SERVICE, + G_APPLICATION_IS_LAUNCHER, + G_APPLICATION_HANDLES_OPEN = 4, + G_APPLICATION_HANDLES_COMMAND_LINE = 8, + G_APPLICATION_SEND_ENVIRONMENT = 16, + G_APPLICATION_NON_UNIQUE = 32, + +-- arrows are deprecated + GTK_ARROWS_BOTH = 0, + GTK_ARROWS_START, + GTK_ARROWS_END, + + GTK_ARROW_UP = 0, + GTK_ARROW_DOWN, + GTK_ARROW_LEFT, + GTK_ARROW_RIGHT, + GTK_ARROW_NONE, + + GTK_ASSISTANT_PAGE_CONTENT = 0, + GTK_ASSISTANT_PAGE_INTRO, + GTK_ASSISTANT_PAGE_CONFIRM, + GTK_ASSISTANT_PAGE_SUMMARY, + GTK_ASSISTANT_PAGE_PROGRESS, + GTK_ASSISTANT_PAGE_CUSTOM, + + GTK_EXPAND = 1, + GTK_SHRINK = 2, + GTK_FILL = 4, + + GTK_BASELINE_POSITION_TOP = 0, + GTK_BASELINE_POSITION_CENTER, + GTK_BASELINE_POSITION_BOTTOM, + + GTK_BORDER_STYLE_NONE = 0, + GTK_BORDER_STYLE_SOLID, + GTK_BORDER_STYLE_INSET, + GTK_BORDER_STYLE_OUTSET, + GTK_BORDER_STYLE_HIDDEN, + GTK_BORDER_STYLE_DOTTED, + GTK_BORDER_STYLE_DASHED, + GTK_BORDER_STYLE_DOUBLE, + GTK_BORDER_STYLE_GROOVE, + GTK_BORDER_STYLE_RIDGE, + + GTK_BUTTON_ROLE_NORMAL = 0, + GTK_BUTTON_ROLE_CHECK, + GTK_BUTTON_ROLE_RADIO, + + GTK_BUTTONS_NONE = 0, + GTK_BUTTONS_OK, + GTK_BUTTONS_CLOSE, + GTK_BUTTONS_CANCEL, + GTK_BUTTONS_YES_NO, + GTK_BUTTONS_OK_CANCEL, + + GTK_BUTTONBOX_DEFAULT_STYLE = 0, + GTK_BUTTONBOX_SPREAD, + GTK_BUTTONBOX_EDGE, + GTK_BUTTONBOX_START, + GTK_BUTTONBOX_END, + GTK_BUTTONBOX_CENTER, + GTK_BUTTONBOX_EXPAND, + + GTK_CALENDAR_SHOW_HEADING = 1, + GTK_CALENDAR_SHOW_DAY_NAMES = 2, + GTK_CALENDAR_NO_MONTH_CHANGE = 4, + GTK_CALENDAR_SHOW_WEEK_NUMBERS = 8, + GTK_CALENDAR_SHOW_DETAILS = 16, + + GTK_CORNER_TOP_LEFT = 0, + GTK_CORNER_BOTTOM_LEFT, + GTK_CORNER_TOP_RIGHT, + GTK_CORNER_BOTTOM_RIGHT, + + GTK_CURVE_TYPE_LINEAR = 0, + GTK_CURVE_TYPE_SPLINE, + GTK_CURVE_TYPE_FREE, + + GTK_DELETE_CHARS = 0, + GTK_DELETE_WORD_ENDS, + GTK_DELETE_WORDS, + GTK_DELETE_DISPLAY_LINES, + GTK_DELETE_DISPLAY_LINE_ENDS, + GTK_DELETE_PARAGRAPH_ENDS, + GTK_DELETE_PARAGRAPHS, + GTK_DELETE_WHITESPACE, + + GTK_DIALOG_NON_MODAL = 0, + GTK_DIALOG_MODAL = 1, + GTK_DIALOG_DESTROY_WITH_PARENT = 2, + GTK_DIALOG_NO_SEPARATOR = 4, + + GTK_DIR_TAB_FORWARD = 0, + GTK_DIR_TAB_BACKWARD, + GTK_DIR_UP, + GTK_DIR_DOWN, + GTK_DIR_LEFT, + GTK_DIR_RIGHT, + + GTK_EVENT_SEQUENCE_NONE = 0, + GTK_EVENT_SEQUENCE_CLAIMED, + GTK_EVENT_SEQUENCE_DENIED, + + GTK_EXPANDER_COLLAPSED = 0, + GTK_EXPANDER_SEMI_COLLAPSED, + GTK_EXPANDER_SEMI_EXPANDED, + GTK_EXPANDER_EXPANDED, + + GTK_FILE_CHOOSER_ACTION_OPEN = 0, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, + + GTK_ICON_SIZE_INVALID = 0, + GTK_ICON_SIZE_MENU, + GTK_ICON_SIZE_SMALL_TOOLBAR, + GTK_ICON_SIZE_LARGE_TOOLBAR, + GTK_ICON_SIZE_BUTTON, + GTK_ICON_SIZE_DND, + GTK_ICON_SIZE_DIALOG, + + GTK_ICON_LOOKUP_NO_SVG = 1, + GTK_ICON_LOOKUP_FORCE_SVG = 2, + GTK_ICON_LOOKUP_USE_BUILTIN = 4, + GTK_ICON_LOOKUP_GENERIC_FALLBACK = 8, + GTK_ICON_LOOKUP_FORCE_SIZE = 16, + + GTK_IMAGE_EMPTY = 0, + GTK_IMAGE_PIXBUF, + GTK_IMAGE_STOCK, + GTK_IMAGE_ICON_SET, + GTK_IMAGE_ANIMATION, + GTK_IMAGE_ICON_NAME, + GTK_IMAGE_GICON, + + GTK_IM_PREEDIT_NOTHING = 0, + GTK_IM_PREEDIT_CALLBACK, + GTK_IM_PREEDIT_NONE, + + GTK_IM_STATUS_NOTHING = 0, + GTK_IM_STATUS_CALLBACK, + GTK_IM_STATUS_NONE, + + GTK_INPUT_HINT_NONE = 0, + GTK_INPUT_HINT_SPELLCHECK, + GTK_INPUT_HINT_NO_SPELLCHECK, + GTK_INPUT_HINT_WORD_COMPLETION = 4, + GTK_INPUT_HINT_LOWERCASE = 8, + GTK_INPUT_HINT_UPPERCASE_CHARS = 16, + GTK_INPUT_HINT_UPPERCASE_WORDS = 32, + GTK_INPUT_HINT_UPPERCASE_SENTENCES = 64, + + GTK_JUSTIFY_LEFT = 0, + GTK_JUSTIFY_RIGHT, + GTK_JUSTIFY_CENTER, + GTK_JUSTIFY_FILL, + + GTK_LEVEL_BAR_MODE_CONTINUOUS = 0, + GTK_LEVEL_BAR_MODE_DISCRETE, + + GTK_MATCH_ALL = 0, + GTK_MATCH_ALL_TAIL, + GTK_MATCH_HEAD, + GTK_MATCH_TAIL, + GTK_MATCH_EXACT, + GTK_MATCH_LAST, + + GTK_PIXELS = 0, + GTK_INCHES, + GTK_CENTIMETERS, + + GTK_MESSAGE_INFO = 0, + GTK_MESSAGE_WARNING, + GTK_MESSAGE_QUESTION, + GTK_MESSAGE_ERROR, + GTK_MESSAGE_OTHER, + + GTK_ICON_INFO = 0, + GTK_ICON_WARNING, + GTK_ICON_QUESTION, + GTK_ICON_ERROR, + GTK_ICON_OTHER, + + GTK_MOVEMENT_LOGICAL_POSITIONS = 0, + GTK_MOVEMENT_VISUAL_POSITIONS, + GTK_MOVEMENT_WORDS, + GTK_MOVEMENT_DISPLAY_LINES, + GTK_MOVEMENT_DISPLAY_LINE_ENDS, + GTK_MOVEMENT_PARAGRAPHS, + GTK_MOVEMENT_PARAGRAPH_ENDS, + GTK_MOVEMENT_PAGES, + GTK_MOVEMENT_BUFFER_ENDS, + GTK_MOVEMENT_HORIZONTAL_PAGES, + + GTK_ORIENTATION_HORIZONTAL = 0, + GTK_ORIENTATION_VERTICAL, + + GTK_PACK_START = 0, + GTK_PACK_END, + + GTK_PAN_DIRECTION_LEFT = 0, + GTK_PAN_DIRECTION_RIGHT, + GTK_PAN_DIRECTION_UP, + GTK_PAN_DIRECTION_DOWN, + + GTK_PATH_PRIO_LOWEST = 0, + GTK_PATH_PRIO_GTK = 4, + GTK_PATH_PRIO_APPLICATION = 8, + GTK_PATH_PRIO_THEME = 10, + GTK_PATH_PRIO_RC = 12, + GTK_PATH_PRIO_HIGHEST = 15, + + GTK_PATH_WIDGET = 0, + GTK_PATH_WIDGET_CLASS, + GTK_PATH_CLASS, + + GTK_PHASE_NONE = 0, + GTK_PHASE_CAPTURE, + GTK_PHASE_BUBBLE, + GTK_PHASE_TARGET, + + GTK_POLICY_ALWAYS = 0, + GTK_POLICY_AUTOMATIC, + GTK_POLICY_NEVER, + GTK_POLICY_EXTERNAL, + + GTK_POS_LEFT = 0, + GTK_POS_RIGHT, + GTK_POS_TOP, + GTK_POS_BOTTOM, + LEFT = 0, --aliases; + RIGHT, + TOP, + BOTTOM + +public enum by * 2 + GTK_PRINT_CAPABILITY_PAGE_SET = 0, + GTK_PRINT_CAPABILITY_COPIES = 2, + GTK_PRINT_CAPABILITY_COLLATE, + GTK_PRINT_CAPABILITY_REVERSE, + GTK_PRINT_CAPABILITY_SCALE, + GTK_PRINT_CAPABILITY_GENERATE_PDF, + GTK_PRINT_CAPABILITY_GENERATE_PS, + GTK_PRINT_CAPABILITY_PREVIEW, + GTK_PRINT_CAPABILITY_NUMBER_UP, + GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT, + + GTK_REGION_EVEN = 0, + GTK_REGION_ODD = 1, + GTK_REGION_FIRST, + GTK_REGION_LAST, + GTK_REGION_ONLY, + GTK_REGION_SORTED, + + GTK_STATE_FLAG_NORMAL = 0, + GTK_STATE_FLAG_ACTIVE = 1, + GTK_STATE_FLAG_PRELIGHT, + GTK_STATE_FLAG_SELECTED, + GTK_STATE_FLAG_INSENSITIVE, + GTK_STATE_FLAG_INCONSISTENT, + GTK_STATE_FLAG_FOCUSED, + GTK_STATE_FLAG_BACKDROP, + GTK_STATE_FLAG_DIR_LTR , + GTK_STATE_FLAG_DIR_RTL, + GTK_STATE_FLAG_LINK, + GTK_STATE_FLAG_VISITED, + GTK_STATE_FLAG_CHECKED + +public enum + GTK_PROGRESS_LEFT_TO_RIGHT = 0, + GTK_PROGRESS_RIGHT_TO_LEFT, + GTK_PROGRESS_BOTTOM_TO_TOP, + GTK_PROGRESS_TOP_TO_BOTTOM, + + GTK_RELIEF_NORMAL = 0, + GTK_RELIEF_HALF, + GTK_RELIEF_NONE, + + GTK_RESIZE_PARENT = 0, + GTK_RESIZE_QUEUE, + GTK_RESIZE_IMMEDIATE, + + GTK_REVEALER_TRANSITION_TYPE_NONE = 0, + GTK_REVEALER_TRANSITION_TYPE_CROSSFADE, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN, + + GTK_SCROLL_STEPS = 0, + GTK_SCROLL_PAGES, + GTK_SCROLL_ENDS, + GTK_SCROLL_HORIZONTAL_STEPS, + GTK_SCROLL_HORIZONTAL_PAGES, + GTK_SCROLL_HORIZONTAL_ENDS, + + GTK_SCROLL_NONE = 0, + GTK_SCROLL_JUMP, + GTK_SCROLL_STEP_BACKWARD, + GTK_SCROLL_STEP_FORWARD, + GTK_SCROLL_PAGE_BACKWARD, + GTK_SCROLL_PAGE_FORWARD, + GTK_SCROLL_STEP_UP, + GTK_SCROLL_STEP_DOWN, + GTK_SCROLL_PAGE_UP, + GTK_SCROLL_PAGE_DOWN, + GTK_SCROLL_STEP_LEFT, + GTK_SCROLL_STEP_RIGHT, + GTK_SCROLL_PAGE_LEFT, + GTK_SCROLL_PAGE_RIGHT, + GTK_SCROLL_START, + GTK_SCROLL_END, + + GTK_SELECTION_NONE = 0, + GTK_SELECTION_SINGLE, + GTK_SELECTION_BROWSE, + GTK_SELECTION_MULTIPLE, + + GTK_SHADOW_NONE = 0, + GTK_SHADOW_IN, + GTK_SHADOW_OUT, + GTK_SHADOW_ETCHED_IN, + GTK_SHADOW_ETCHED_OUT, + + GTK_STATE_NORMAL = 0, + GTK_STATE_ACTIVE, + GTK_STATE_PRELIGHT, + GTK_STATE_SELECTED, + GTK_STATE_INSENSITIVE, + GTK_STATE_INCONSISTENT, + GTK_STATE_FOCUSED, + GTK_STATE_PRESSED = 1, + GTK_STATE_MOUSEOVER, + + GTK_TEXT_DIR_NONE = 0, + GTK_TEXT_DIR_LTR, + GTK_TEXT_DIR_RTL, + + GTK_TEXT_EXTEND_SELECTION_WORD = 0, + GTK_TEXT_EXTEND_SELECTION_LINE, + + GTK_TOOLBAR_ICONS = 0, + GTK_TOOLBAR_TEXT, + GTK_TOOLBAR_BOTH, + GTK_TOOLBAR_BOTH_HORIZ, + + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID = -1, + GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID = -2, + + GTK_UPDATE_CONTINUOUS = 0, + GTK_UPDATE_DISCONTINUOUS, + GTK_UPDATE_DELAYED, + + GTK_VISIBILITY_NONE = 0, + GTK_VISIBILITY_PARTIAL, + GTK_VISIBILITY_FULL, + + GTK_WIN_POS_NONE = 0, + GTK_WIN_POS_CENTER, + GTK_WIN_POS_MOUSE, + GTK_WIN_POS_CENTER_ALWAYS, + GTK_WIN_POS_CENTER_ON_PARENT, + + GTK_WINDOW_TOPLEVEL = 0, + GTK_WINDOW_POPUP, + + GTK_SORT_ASCENDING = 1, + GTK_SORT_DESCENDING, + + GTK_DRAG_RESULT_SUCCESS = 0, + GTK_DRAG_RESULT_NO_TARGET, + GTK_DRAG_RESULT_USER_CANCELLED, + GTK_DRAG_RESULT_TIMEOUT_EXPIRED, + GTK_DRAG_RESULT_GRAB_BROKEN, + GTK_DRAG_RESULT_ERROR, + + PANGO_ELLIPSIZE_NONE = 0, + PANGO_ELLIPSIZE_START, + PANGO_ELLIPSIZE_MIDDLE, + PANGO_ELLIPSIZE_END, + + GDK_SOLID = 0, + GDK_TILED, + GDK_STIPPLED, + GDK_OPAQUE_STIPPLED, + + GTK_RESPONSE_NONE = -1, + GTK_RESPONSE_REJECT = -2, + GTK_RESPONSE_ACCEPT = -3, + GTK_RESPONSE_DELETE_EVENT = -4, + GTK_RESPONSE_OK = -5, + GTK_RESPONSE_CANCEL = -6, + GTK_RESPONSE_CLOSE = -7, + GTK_RESPONSE_YES = -8, + GTK_RESPONSE_NO = -9, + GTK_RESPONSE_APPLY = -10, + GTK_RESPONSE_HELP = -11, + + GTK_TREE_VIEW_COLUMN_GROW_ONLY = 0, + GTK_TREE_VIEW_COLUMN_AUTOSIZE, + GTK_TREE_VIEW_COLUMN_FIXED, + + GTK_TREE_VIEW_GRID_LINES_NONE = 0, + GTK_TREE_VIEW_GRID_LINES_HORIZONTAL, + GTK_TREE_VIEW_GRID_LINES_VERTICAL, + GTK_TREE_VIEW_GRID_LINES_BOTH, + + GTK_TEXT_WINDOW_PRIVATE = 0, + GTK_TEXT_WINDOW_WIDGET, + GTK_TEXT_WINDOW_TEXT, + GTK_TEXT_WINDOW_LEFT, + GTK_TEXT_WINDOW_RIGHT, + GTK_TEXT_WINDOW_TOP, + GTK_TEXT_WINDOW_BOTTOM, + + G_NOTIFICATION_PRIORITY_NORMAL = 0, + G_NOTIFICATION_PRIORITY_LOW, + G_NOTIFICATION_PRIORITY_HIGH, + G_NOTIFICATION_PRIORITY_URGENT, + + G_USER_DIRECTORY_DESKTOP = 0, + G_USER_DIRECTORY_DOCUMENTS, + G_USER_DIRECTORY_DOWNLOAD, + G_USER_DIRECTORY_MUSIC, + G_USER_DIRECTORY_PICTURES, + G_USER_DIRECTORY_PUBLIC_SHARE, + G_USER_DIRECTORY_TEMPLATES, + G_USER_DIRECTORY_VIDEOS, + G_USER_N_DIRECTORIES, + + GTK_WRAP_NONE = 0, + GTK_WRAP_CHAR, + GTK_WRAP_WORD, + GTK_WRAP_WORD_CHAR, + + GDK_WINDOW_TYPE_HINT_NORMAL = 0, + GDK_WINDOW_TYPE_HINT_DIALOG, + GDK_WINDOW_TYPE_HINT_MENU, + GDK_WINDOW_TYPE_HINT_TOOLBAR, + GDK_WINDOW_TYPE_HINT_SPLASHSCREEN, + GDK_WINDOW_TYPE_HINT_UTILITY, + GDK_WINDOW_TYPE_HINT_DOCK, + GDK_WINDOW_TYPE_HINT_DESKTOP, + GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU, + GDK_WINDOW_TYPE_HINT_POPUP_MENU, + GDK_WINDOW_TYPE_HINT_TOOLTIP, + GDK_WINDOW_TYPE_HINT_NOTIFICATION, + GDK_WINDOW_TYPE_HINT_COMBO, + GDK_WINDOW_TYPE_HINT_DND, + + GDK_ACTION_DEFAULT = 0, + GDK_ACTION_COPY = 1, + GDK_ACTION_MOVE = 2, + GDK_ACTION_LINK = 4, + GDK_ACTION_PRIVATE = 8, + GDK_ACTION_ASK = 16, + + GTK_CELL_RENDERER_MODE_INERT = 0, + GTK_CELL_RENDERER_MODE_ACTIVATABLE, + GTK_CELL_RENDERER_MODE_EDITABLE, + + GTK_CELL_RENDERER_ACCEL_MODE_GTK = 0, + GTK_CELL_RENDERER_ACCEL_MODE_OTHER, + + GTK_DEST_DEFAULT_MOTION = 1, + GTK_DEST_DEFAULT_HIGHLIGHT = 2, + GTK_DEST_DEFAULT_DROP = 4, + GTK_DEST_DEFAULT_ALL = 0x07, + + GTK_TARGET_SAME_APP = 1, + GTK_TARGET_SAME_WIDGET = 2, + GTK_TARGET_OTHER_APP = 4, + GTK_TARGET_OTHER_WIDGET = 8, + + GTK_SIZE_GROUP_NONE = 0, + GTK_SIZE_GROUP_HORIZONTAL, + GTK_SIZE_GROUP_VERTICAL, + GTK_SIZE_GROUP_BOTH + +public enum + MOUSE_BUTTON1 = 1, + MOUSE_BUTTON2, + MOUSE_BUTTON3 + +public enum + PANGO_SCALE = 1000, + PANGO_STYLE_NORMAL= 0, + PANGO_STYLE_OBLIQUE, + PANGO_STYLE_ITALIC, + + PANGO_STRETCH_ULTRA_CONDENSED = 0, + PANGO_STRETCH_EXTRA_CONDENSED, + PANGO_STRETCH_CONDENSED, + PANGO_STRETCH_SEMI_CONDENSED, + PANGO_STRETCH_NORMAL, + PANGO_STRETCH_SEMI_EXPANDED, + PANGO_STRETCH_EXPANDED, + PANGO_STRETCH_EXTRA_EXPANDED, + PANGO_STRETCH_ULTRA_EXPANDED, + + PANGO_VARIANT_NORMAL=1, + PANGO_VARIANT_SMALL_CAPS, + + PANGO_WEIGHT_THIN = 100, + PANGO_WEIGHT_ULTRALIGHT = 200, + PANGO_WEIGHT_LIGHT = 300, + PANGO_WEIGHT_BOOK = 380, + PANGO_WEIGHT_NORMAL = 400, + PANGO_WEIGHT_MEDIUM = 500, + PANGO_WEIGHT_SEMIBOLD = 600, + PANGO_WEIGHT_BOLD = 700, + PANGO_WEIGHT_ULTRABOLD = 800, + PANGO_WEIGHT_HEAVY = 900, + PANGO_WEIGHT_ULTRAHEAVY = 1000, + PANGO_UNIT = 1024 + +public enum + GTK_RECENT_SORT_NONE = 0, + GTK_RECENT_SORT_MRU, + GTK_RECENT_SORT_LRU, + GTK_RECENT_SORT_CUSTOM + + public enum by * 2 -- GdkModifierTypes + GDK_SHIFT_MASK = 1, + GDK_LOCK_MASK, + GDK_CONTROL_MASK, + GDK_MOD1_MASK, -- Alt+ + GDK_MOD2_MASK, + GDK_MOD3_MASK, + GDK_MOD4_MASK, + GDK_MOD5_MASK, + GDK_BUTTON1_MASK, + GDK_BUTTON2_MASK, + GDK_BUTTON3_MASK, + GDK_BUTTON4_MASK, + GDK_BUTTON5_MASK, + SHFT = 1, -- 'shorthand' versions of above + LOCK, + CTL, + ALT + + public enum -- events + GDK_NOTHING = -1, + GDK_DELETE, + GDK_DESTROY, + GDK_EXPOSE, + GDK_MOTION_NOTIFY, + GDK_BUTTON_PRESS, + GDK_2BUTTON_PRESS, + GDK_3BUTTON_PRESS, + GDK_BUTTON_RELEASE, + GDK_KEY_PRESS, + GDK_KEY_RELEASE, + GDK_ENTER_NOTIFY, + GDK_LEAVE_NOTIFY, + GDK_FOCUS_CHANGE, + GDK_CONFIGURE, + GDK_MAP, + GDK_UNMAP + +public enum -- event masks + GDK_EXPOSURE_MASK = 2, + GDK_POINTER_MOTION_MASK = 4, + GDK_POINTER_MOTION_HINT_MASK = 8, + GDK_BUTTON_MOTION_MASK = 16, + GDK_BUTTON1_MOTION_MASK = #20, + GDK_BUTTON2_MOTION_MASK = #40, + GDK_BUTTON3_MOTION_MASK = #80, + GDK_BUTTON_PRESS_MASK = #100, + GDK_BUTTON_RELEASE_MASK = #200, + GDK_KEY_PRESS_MASK = #400, + GDK_KEY_RELEASE_MASK = #800, + GDK_ENTER_NOTIFY_MASK = #1000, + GDK_LEAVE_NOTIFY_MASK = #2000, + GDK_FOCUS_CHANGE_MASK = #4000, + GDK_STRUCTURE_MASK = #8000, + GDK_PROPERTY_CHANGE_MASK = #10000, + GDK_VISIBILITY_NOTIFY_MASK = #20000, + GDK_PROXIMITY_IN_MASK = #40000, + GDK_PROXIMITY_OUT_MASK = #80000, + GDK_SUBSTRUCTURE_MASK = #100000, + GDK_SCROLL_MASK = #200000, + GDK_ALL_EVENTS_MASK = #3FFFFE, + + GDK_PROPERTY_NOTIFY = 16, + GDK_SELECTION_CLEAR, + GDK_SELECTION_REQUEST, + GDK_SELECTION_NOTIFY, + GDK_PROXIMITY_IN, + GDK_PROXIMITY_OUT, + GDK_DRAG_ENTER, + GDK_DRAG_LEAVE, + GDK_DRAG_MOTION, + GDK_DRAG_STATUS, + GDK_DROP_START, + GDK_DROP_FINISHED, + GDK_CLIENT_EVENT, + GDK_VISIBILITY_NOTIFY, + GDK_NO_EXPOSE, + GDK_SCROLL, + GDK_WINDOW_STATE, + GDK_SETTING, + GDK_OWNER_CHANGE, + GDK_GRAB_BROKEN, + GDK_DAMAGE, + + GDK_FULLSCREEN_ON_CURRENT_MONITOR = 0, + GDK_FULLSCREEN_ON_ALL_MONITORS, + + GTK_PAGE_SET_ALL = 0, + GTK_PAGE_SET_EVEN, + GTK_PAGE_SET_ODD, + + GTK_PAGE_ORIENTATION_PORTRAIT = 0, + GTK_PAGE_ORIENTATION_LANDSCAPE, + GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT, + GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE, + + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG = 0, + GTK_PRINT_OPERATION_ACTION_PRINT, + GTK_PRINT_OPERATION_ACTION_PREVIEW, + GTK_PRINT_OPERATION_ACTION_EXPORT, + + GTK_PRINT_OPERATION_RESULT_ERROR = 0, + GTK_PRINT_OPERATION_RESULT_APPLY, + GTK_PRINT_OPERATION_RESULT_CANCEL, + GTK_PRINT_OPERATION_RESULT_IN_PROGRESS, + + GTK_PRINT_STATUS_INITIAL = 0, + GTK_PRINT_STATUS_PREPARING, + GTK_PRINT_STATUS_GENERATING_DATA, + GTK_PRINT_STATUS_SENDING_DATA, + GTK_PRINT_STATUS_PENDING, + GTK_PRINT_STATUS_PENDING_ISSUE, + GTK_PRINT_STATUS_PRINTING, + GTK_PRINT_STATUS_FINISHED, + GTK_PRINT_STATUS_FINISHED_ABORTED, + + GTK_PRINT_DUPLEX_SIMPLE = 0, + GTK_PRINT_DUPLEX_HORIZONTAL, + GTK_PRINT_DUPLEX_VERTICAL, + + GTK_PRINT_PAGES_ALL = 0, + GTK_PRINT_PAGES_CURRENT, + GTK_PRINT_PAGES_RANGES, + GTK_PRINT_PAGES_SELECTION, + + GTK_PRINT_QUALITY_LOW = 0, + GTK_PRINT_QUALITY_NORMAL, + GTK_PRINT_QUALITY_HIGH, + GTK_PRINT_QUALITY_DRAFT, + + GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM = 0, + GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP, + GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TOP_BOTTOM, + GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP, + GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT, + GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT, + GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT, + GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT, + + GTK_STYLE_PROVIDER_PRIORITY_FALLBACK = 1, + GTK_STYLE_PROVIDER_PRIORITY_THEME = 200, + GTK_STYLE_PROVIDER_PRIORITY_SETTINGS = 400, + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION = 600, + GTK_STYLE_PROVIDER_PRIORITY_USER = 800, + + GTK_UNIT_PIXEL = 0, + GTK_UNIT_POINTS, + GTK_UNIT_INCH, + GTK_UNIT_MM, + + GTK_STACK_TRANSITION_TYPE_NONE = 0, + GTK_STACK_TRANSITION_TYPE_CROSSFADE, + GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT, + GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT, + GTK_STACK_TRANSITION_TYPE_SLIDE_UP, + GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN, + GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT, + GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_UP, -- GTK3.12 from here down + GTK_STACK_TRANSITION_TYPE_OVER_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_LEFT, + GTK_STACK_TRANSITION_TYPE_OVER_RIGHT, + GTK_STACK_TRANSITION_TYPE_UNDER_UP, + GTK_STACK_TRANSITION_TYPE_UNDER_DOWN, + GTK_STACK_TRANSITION_TYPE_UNDER_LEFT, + GTK_STACK_TRANSITION_TYPE_UNDER_RIGHT, + GTK_STACK_TRANSITION_TYPE_OVER_UP_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_DOWN_UP, + GTK_STACK_TRANSITION_TYPE_OVER_LEFT_RIGHT, + GTK_STACK_TRANSITION_TYPE_OVER_RIGHT_LEFT, + + GTK_PLACES_OPEN_NORMAL = 0, + GTK_PLACES_OPEN_NEW_TAB, + GTK_PLACES_OPEN_NEW_WINDOW, + + GDK_PIXBUF_ROTATE_NONE = 0, + GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE = 90, + GDK_PIXBUF_ROTATE_UPSIDEDOWN = 180, + GDK_PIXBUF_ROTATE_CLOCKWISE = 270, + + GDK_INTERP_NEAREST = 0, + GDK_INTERP_TILES, + GDK_INTERP_BILINEAR, + GDK_INTERP_HYPER, + + CAIRO_EXTEND_REPEAT = 1, + + CAIRO_FILL_RULE_EVEN_ODD = 1, + CAIRO_FILL_RULE_WINDING = 0, + + CAIRO_FONT_SLANT_NORMAL = 0, + CAIRO_FONT_SLANT_ITALIC, + CAIRO_FONT_SLANT_OBLIQUE, + + CAIRO_FONT_WEIGHT_NORMAL = 0, NORMAL = 0, + CAIRO_FONT_WEIGHT_BOLD, BOLD = 1, + + CAIRO_FORMAT_INVALID = -1, + CAIRO_FORMAT_ARGB32 = 0, + CAIRO_FORMAT_RGB24, + CAIRO_FORMAT_A8, + CAIRO_FORMAT_A1, + CAIRO_FORMAT_RGB16_565, + + CAIRO_LINE_CAP_BUTT = 0, + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_CAP_SQUARE, + + CAIRO_LINE_JOIN_MITER = 0, + CAIRO_LINE_JOIN_ROUND, + CAIRO_LINE_JOIN_BEVEL, + + CAIRO_OPERATOR_CLEAR = 0, + CAIRO_OPERATOR_SOURCE, + CAIRO_OPERATOR_OVER, + CAIRO_OPERATOR_IN, + CAIRO_OPERATOR_OUT, + CAIRO_OPERATOR_ATOP, + CAIRO_OPERATOR_DEST, + CAIRO_OPERATOR_DEST_OVER, + CAIRO_OPERATOR_DEST_IN, + CAIRO_OPERATOR_DEST_OUT, + CAIRO_OPERATOR_DEST_ATOP, + CAIRO_OPERATOR_XOR, + CAIRO_OPERATOR_ADD, + CAIRO_OPERATOR_SATURATE, + CAIRO_OPERATOR_MULTIPLY, + CAIRO_OPERATOR_SCREEN, + CAIRO_OPERATOR_OVERLAY, + CAIRO_OPERATOR_DARKEN, + CAIRO_OPERATOR_LIGHTEN, + CAIRO_OPERATOR_COLOR_DODGE, + CAIRO_OPERATOR_COLOR_BURN, + CAIRO_OPERATOR_HARD_LIGHT, + CAIRO_OPERATOR_SOFT_LIGHT, + CAIRO_OPERATOR_DIFFERENCE, + CAIRO_OPERATOR_EXCLUSION, + CAIRO_OPERATOR_HSL_HUE, + CAIRO_OPERATOR_HSL_SATURATION, + CAIRO_OPERATOR_HSL_COLOR, + CAIRO_OPERATOR_HSL_LUMINOSITY, + + CAIRO_PDF_VERSION_1_4 = 0, + CAIRO_PDF_VERSION_1_5, + + CAIRO_SVG_VERSION_1_1 = 0, + CAIRO_SVG_VERSION_1_2, + + CAIRO_SURFACE_TYPE_IMAGE = 0, + CAIRO_SURFACE_TYPE_PDF, + CAIRO_SURFACE_TYPE_PS, + CAIRO_SURFACE_TYPE_XLIB, + CAIRO_SURFACE_TYPE_XCB, + CAIRO_SURFACE_TYPE_GLITZ, + CAIRO_SURFACE_TYPE_QUARTZ, + CAIRO_SURFACE_TYPE_WIN32, + CAIRO_SURFACE_TYPE_BEOS, + CAIRO_SURFACE_TYPE_DIRECTFB, + CAIRO_SURFACE_TYPE_SVG, + CAIRO_SURFACE_TYPE_OS2, + CAIRO_SURFACE_TYPE_WIN32_PRINTING, + CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, + CAIRO_SURFACE_TYPE_SCRIPT, + CAIRO_SURFACE_TYPE_QT, + CAIRO_SURFACE_TYPE_RECORDING, + CAIRO_SURFACE_TYPE_VG, + CAIRO_SURFACE_TYPE_GL, + CAIRO_SURFACE_TYPE_DRM, + CAIRO_SURFACE_TYPE_TEE, + CAIRO_SURFACE_TYPE_XML, + CAIRO_SURFACE_TYPE_SKIA, + CAIRO_SURFACE_TYPE_SUBSURFACE, + + CAIRO_FONT_TYPE_TOY = 0, + CAIRO_FONT_TYPE_FT, + CAIRO_FONT_TYPE_WIN32, + CAIRO_FONT_TYPE_QUARTZ, + CAIRO_FONT_TYPE_USER + +public enum + ICON_PIXBUF = 1, + ICON_DISPLAY_NAME, + ICON_FILENAME, + ICON_BASE_SIZE, + ICON_BASE_SCALE, + ICON_IS_SYMBOLIC, + + G_KEY_FILE_NONE = 0, + G_KEY_FILE_KEEP_COMMENTS, + G_KEY_FILE_KEEP_TRANSLATIONS + + +-- local function to implement widget types; +function _(atom x, integer t) +if x = 0 then + crash("Invalid type - pointer is null!") +end if +init(t) register(x,t) +return x +end function + +------------------------------------------------------------------------ +-- GTK Widget Types -- used rarely, with caution +------------------------------------------------------------------------ +global type Object(atom x)return _(x,GObject)end type +global type Window(atom x)return _(x,GtkWindow)end type +global type Dialog(atom x)return _(x,GtkDialog)end type +global type AboutDialog(atom x)return _(x,GtkAboutDialog)end type +global type Assistant(atom x)return _(x,GtkAssistant)end type +global type Box(atom x)return _(x,GtkBox)end type +global type Grid(atom x)return _(x,GtkGrid)end type +global type Revealer(atom x)return _(x,GtkRevealer)end type +global type ListBox(atom x)return _(x,GtkListBox)end type +global type FlowBox(atom x)return _(x,GtkFlowBox)end type +global type Stack(atom x)return _(x,GtkStack)end type +global type StackSwitcher(atom x)return _(x,GtkStackSwitcher)end type +global type Sidebar(atom x)return _(x,GtkSidebar)end type +global type ActionBar(atom x)return _(x,GtkActionBar)end type +global type HeaderBar(atom x)return _(x,GtkHeaderBar)end type +global type Overlay(atom x)return _(x,GtkOverlay)end type +global type ButtonBox(atom x)return _(x,GtkButtonBox)end type +global type Paned(atom x)return _(x,GtkPaned)end type +global type Layout(atom x)return _(x,GtkLayout)end type +global type Notebook(atom x)return _(x,GtkNotebook)end type +global type Expander(atom x)return _(x,GtkExpander)end type +global type AspectFrame(atom x)return _(x,GtkAspectFrame)end type +global type Label(atom x)return _(x,GtkLabel)end type +global type Image(atom x)return _(x,GtkImage)end type +global type Spinner(atom x)return _(x,GtkSpinner)end type +global type InfoBar(atom x)return _(x,GtkInfoBar)end type +global type ProgressBar(atom x)return _(x,GtkProgressBar)end type +global type LevelBar(atom x)return _(x,GtkLevelBar)end type +global type Statusbar(atom x)return _(x,GtkStatusbar)end type +global type AccelLabel(atom x)return _(x,GtkAccelLabel)end type +global type Button(atom x)return _(x,GtkButton)end type +global type CheckButton(atom x)return _(x,GtkCheckButton)end type +global type RadioButton(atom x)return _(x,GtkRadioButton)end type +global type ToggleButton(atom x)return _(x,GtkToggleButton)end type +global type LinkButton(atom x)return _(x,GtkLinkButton)end type +global type MenuButton(atom x)return _(x,GtkMenuButton)end type +global type Switch(atom x)return _(x,GtkSwitch)end type +global type ScaleButton(atom x)return _(x,GtkScaleButton)end type +global type VolumeButton(atom x)return _(x,GtkVolumeButton)end type +global type LockButton(atom x)return _(x,GtkLockButton)end type +global type Entry(atom x)return _(x,GtkEntry)end type +global type EntryBuffer(atom x)return _(x,GtkEntryBuffer)end type +global type EntryCompletion(atom x)return _(x,GtkEntryCompletion)end type +global type Scale(atom x)return _(x,GtkScale)end type +global type SpinButton(atom x)return _(x,GtkSpinButton)end type +global type SearchEntry(atom x)return _(x,GtkSearchEntry)end type +global type SearchBar(atom x)return _(x,GtkSearchBar)end type +global type Editable(atom x)return _(x,GtkEditable)end type +global type TextMark(atom x)return _(x,GtkTextMark)end type +global type TextBuffer(atom x)return _(x,GtkTextBuffer)end type +global type TextTag(atom x)return _(x,GtkTextTag)end type +global type TextTagTable(atom x)return _(x,GtkTextTagTable)end type +global type TextView(atom x)return _(x,GtkTextView)end type +global type TreeModel(atom x)return _(x,GtkTreeModel)end type +global type TreeModelSort(atom x)return _(x,GtkTreeModelSort)end type +global type TreeSelection(atom x)return _(x,GtkTreeSelection)end type +global type TreeViewColumn(atom x)return _(x,GtkTreeViewColumn)end type +global type TreeView(atom x)return _(x,GtkTreeView)end type +global type IconView(atom x)return _(x,GtkIconView)end type +global type CellRendererText(atom x)return _(x,GtkCellRendererText)end type +global type CellRendererAccel(atom x)return _(x,GtkCellRendererAccel)end type +global type CellRendererCombo(atom x)return _(x,GtkCellRendererCombo)end type +global type CellRendererPixbuf(atom x)return _(x,GtkCellRendererPixbuf)end type +global type CellRendererProgress(atom x)return _(x,GtkCellRendererProgress)end type +global type CellRendererSpin(atom x)return _(x,GtkCellRendererSpin)end type +global type CellRendererToggle(atom x)return _(x,GtkCellRendererToggle)end type +global type CellRendererSpinner(atom x)return _(x,GtkCellRendererSpinner)end type +global type ListStore(atom x)return _(x,GtkListStore)end type +global type TreeStore(atom x)return _(x,GtkTreeStore)end type +global type ComboBox(atom x)return _(x,GtkComboBox)end type +global type ComboBoxText(atom x)return _(x,GtkComboBoxText)end type +global type Menu(atom x)return _(x,GtkMenu)end type +global type MenuBar(atom x)return _(x,GtkMenuBar)end type +global type MenuItem(atom x)return _(x,GtkMenuItem)end type +global type RadioMenuItem(atom x)return _(x,GtkRadioMenuItem)end type +global type CheckMenuItem(atom x)return _(x,GtkCheckMenuItem)end type +global type SeparatorMenuItem(atom x)return _(x,GtkSeparatorMenuItem)end type +global type Toolbar(atom x)return _(x,GtkToolbar)end type +global type ToolItem(atom x)return _(x,GtkToolItem)end type +global type ToolPalette(atom x)return _(x,GtkToolPalette)end type +global type ToolButton(atom x)return _(x,GtkToolButton)end type +global type MenuToolButton(atom x)return _(x,GtkMenuToolButton)end type +global type ToggleToolButton(atom x)return _(x,GtkToggleToolButton)end type +global type RadioToolButton(atom x)return _(x,GtkRadioToolButton)end type +global type Popover(atom x)return _(x,GtkPopover)end type +global type PopoverMenu(atom x)return _(x,GtkPopoverMenu)end type +global type ColorChooser(atom x)return _(x,GtkColorChooser)end type +global type ColorButton(atom x)return _(x,GtkColorButton)end type +global type ColorChooserWidget(atom x)return _(x,GtkColorChooserWidget)end type +global type ColorChooserDialog(atom x)return _(x,GtkColorChooserDialog)end type +global type FileChooser(atom x)return _(x,GtkFileChooser)end type +global type FileChooserButton(atom x)return _(x,GtkFileChooserButton)end type +global type FileChooserDialog(atom x)return _(x,GtkFileChooserDialog)end type +global type FileChooserWidget(atom x)return _(x,GtkFileChooserWidget)end type +global type FileFilter(atom x)return _(x,GtkFileFilter)end type +global type FontChooser(atom x)return _(x,GtkFontChooser)end type +global type FontButton(atom x)return _(x,GtkFontButton)end type +global type FontChooserWidget(atom x)return _(x,GtkFontChooserWidget)end type +global type FontChooserDialog(atom x)return _(x,GtkFontChooserDialog)end type +global type PlacesSidebar(atom x)return _(x,GtkPlacesSidebar)end type +global type Frame(atom x)return _(x,GtkFrame)end type +global type Scrollbar(atom x)return _(x,GtkScrollbar)end type +global type ScrolledWindow(atom x)return _(x,GtkScrolledWindow)end type +global type Adjustment(atom x)return _(x,GtkAdjustment)end type +global type Calendar(atom x)return _(x,GtkCalendar)end type +global type GLArea(atom x)return _(x,GtkGLArea)end type +global type Tooltip(atom x)return _(x,GtkTooltip)end type +global type Viewport(atom x)return _(x,GtkViewport)end type +global type Widget(atom x)return _(x,GtkWidget)end type +global type Container(atom x)return _(x,GtkContainer)end type +global type Bin(atom x)return _(x,GtkBin)end type +global type Range(atom x)return _(x,GtkRange)end type +global type PrintContext(atom x)return _(x,GtkPrintContext)end type +global type ListBoxRow(atom x)return _(x,GtkListBoxRow)end type +global type FontFamily(atom x)return _(x,PangoFontFamily)end type +global type FontFace(atom x)return _(x,PangoFontFace)end type +global type FontDescription(atom x)return _(x,PangoFontDescription)end type +global type AppChooserDialog(atom x)return _(x,GtkAppChooserDialog)end type +global type PaperSize(atom x)return _(x,GtkPaperSize)end type +global type DrawingArea(atom x)return _(x,GtkDrawingArea)end type +global type RecentChooserDialog(atom x)return _(x,GtkRecentChooserDialog)end type +global type RecentChooserWidget(atom x)return _(x,GtkRecentChooserWidget)end type +global type RecentChooser(atom x)return _(x,GtkRecentChooser)end type +global type RecentFilter(atom x)return _(x,GtkRecentFilter)end type +global type RecentChooserMenu(atom x)return _(x,GtkRecentChooserMenu)end type +global type EventBox(atom x)return _(x,GtkEventBox)end type +global type TreeModelFilter(atom x)return _(x,GtkTreeModelFilter)end type +global type Application(atom x)return _(x,GtkApplication)end type +global type ApplicationWindow(atom x)return _(x,GtkApplicationWindow)end type +global type Pixbuf(atom x)return _(x,GdkPixbuf)end type +global type IconTheme(atom x)return _(x,GtkIconTheme)end type +global type Cairo_T(atom x)return _(x,Cairo_t)end type +global type CellArea(atom x)return _(x,GtkCellArea)end type + +----------------------------- +-- copyright 2016 Irv Mullins +----------------------------- + diff --git a/eugtk/GtkEvents.e b/eugtk/GtkEvents.e new file mode 100644 index 0000000..fde1785 --- /dev/null +++ b/eugtk/GtkEvents.e @@ -0,0 +1,277 @@ + +---------------- +namespace events +---------------- + +export constant version = "4.12.0" + +--Thanks to Pete Eberlein for helping with this! + +include GtkEngine.e +include std/convert.e + +if not equal(version,gtk:version) then + Error(,,"GtkEvents version mismatch","should be version " & gtk:version) +end if + +-- Maps keys from keypad to match same keys on keyboard, +-- maps control/arrow keys to negative numbers, so they +-- can be differentiated from the same ascii character +-- values; + +constant keyvalues = { +{8,-8}, -- bksp +{9,-9}, -- tab +{20,-20}, -- scroll lock +{27,27}, -- escape +{80,-80}, -- home 'P' +{81,-81}, -- left arrow 'Q' +{82,-82}, -- up arrow 'R' +{83,-83}, -- right arrow 'S' +{84,-84}, -- down arrow 'T' +{85,-85}, -- page up 'U' +{86,-86}, -- page dn 'V' +{87,-87}, -- end 'W' +{99,-99}, -- insert 'c' +{103,-103}, +{127,-127}, -- num lock + +{141,13}, -- keypad Enter, with or w/o numlock; + +-- keypad keys w/o numlock; +{149,-149}, -- keypad home +{150,-150}, -- keypad left +{151,-151}, -- keypad up +{152,-152}, -- keypad right +{153,-153}, -- keypad down +{154,-154}, -- keypad pg up +{155,-155}, -- keypad pg dn +{156,-156}, -- keypad end +{157,-157}, -- keypad 5 +{158,-158}, -- keypad ins +{159,-159}, -- keypad del + +-- keypad keys with numlock - return ascii 0..9 +{170,'*'},{171,'+'},{173,'-'},{175,'/'}, +{176,48},{177,49},{178,50},{179,51},{180,52}, -- keypad numbers 0..4 +{181,53},{182,54},{183,55},{184,56},{185,57}, -- keypad numbers 5..9 + +-- F keys; +{190,-190}, -- F1 +{191,-191}, -- F2 +{192,-192}, -- F3 +{193,-193}, -- F4 +{194,-194}, -- F5 +{195,-195}, -- F6 +{196,-196}, -- F7 +{197,-197}, -- F8 +{198,-198}, -- F9 +{199,-199}, -- F10 +{200,-200}, -- F11 +{201,-201}, -- F12 +{227,-227}, -- left ctl +{228,-228}, -- right ctl +{229,-229}, +{225,-225}, -- left shift +{226,-226}, -- right shift +{228,-228}, +{233,-233}, -- left alt +{234,-234}, -- right alt +{236,-236}, +{255,-255}, -- delete +$} + +constant shiftkeys = { +{32,-9}, -- shift tab +$} + +constant event_names = { + {3,"focus-in"}, + {11,"focus-out"} + } + +---------------------------------------------------------------------- +export function key(atom event) -- get key pressed; +---------------------------------------------------------------------- +if event = 0 then return 0 end if +integer k = peek(event+16) +integer z = peek(event+17) +integer s = state(event) +ifdef BITS64 then + k = peek(event+28) + z = peek(event+29) +end ifdef +switch z do + case 0 then return k + case 255 then return vlookup(k,keyvalues,1,2,k) + case 254 then return vlookup(k,shiftkeys,1,2,k) +end switch +return 0 +end function + +--(32/64)struct GdkEventButton +-- 0 0 GdkEventType type a.k.a. id +-- 4 8 GtkWindow *window +-- 8 16 gint8 send_event +-- 12 20 guint32 time +-- 16 24 gdouble x +-- 24 32 gdouble y +-- 32 40 gdouble *axes +-- 36 48 guint state +-- 40 52 guint button +-- 44 56 GdkDevice *device +-- 48 64 gdouble x_root, y_root + +--------------------------------------------------------------------- +export function id(atom event) +--------------------------------------------------------------------- +if event > 0 then return peek4u(event) else return event end if +end function + +--------------------------------------------------------------------- +export function name(atom event) +--------------------------------------------------------------------- +event = id(event) +for i = 1 to length(event_names) do + if event = event_names[i][1] then + return event_names[i][2] + end if +end for +return -1 +end function + +--------------------------------------------------------------------- +export function window(atom event) -- get event window +--------------------------------------------------------------------- +ifdef BITS64 then + return peek8u(event + 8) +end ifdef + return peek4u(event + 4) +end function + +--------------------------------------------------------------------- +export function time(atom event) -- get event time +--------------------------------------------------------------------- +ifdef BITS64 then + return peek4u(event + 20) +end ifdef + return peek4u(event + 12) +end function + +--------------------------------------------------------------------- +export function xy(atom event) -- get mouse button x y; +--------------------------------------------------------------------- +ifdef BITS64 then + return floor({ + float64_to_atom(peek({event + 24, 8})), + float64_to_atom(peek({event + 32, 8}))}) +end ifdef + return floor({ + float64_to_atom(peek({event + 16, 8})), + float64_to_atom(peek({event + 24, 8}))}) +end function + +--------------------------------------------------------------------- +export function axes(atom event) +--------------------------------------------------------------------- +ifdef BITS64 then + return float64_to_atom(peek({event + 40, 8})) +end ifdef + return float64_to_atom(peek({event + 32, 8})) +end function + +--------------------------------------------------------------------- +export function button(atom event) -- get mouse button clicked; +--------------------------------------------------------------------- +ifdef BITS64 then + return peek(event+52) +end ifdef +return peek(event+40) +end function + +---------------------------------------------------------------------- +export function state(atom event) +---------------------------------------------------------------------- +ifdef BITS64 then + return peek(event+48) +end ifdef +return peek(event+36) +end function + +---------------------------------------------------------------------- +export function device(atom event) +---------------------------------------------------------------------- +ifdef BITS64 then + return peek(event+56) +end ifdef +return peek(event+44) +end function + +--------------------------------------------------------------------- +export function clicks(atom event) +--------------------------------------------------------------------- +atom ct = allocate(64) +object result + if gtk_func("gdk_event_get_click_count",{P,I},{event,ct}) then + result = peek4u(ct) + else + result = -1 + end if + free(ct) +return result +end function + +--------------------------------------------------------------------- +export function scroll_dir(atom event) +--------------------------------------------------------------------- +atom dir = allocate(64) +object result + if gtk_func("gdk_event_get_scroll_direction",{P,I},{event,dir}) then + result = peek4u(dir) + else + result = -1 + end if + free(dir) +return result +end function + +--------------------------------------------------------------------------------- +export function pending() -- used sometimes when using timeout or eu tasks +--------------------------------------------------------------------------------- + return gtk_func("gtk_events_pending") +end function + +------------------------------------------------------------------------ +export procedure main_iteration() +------------------------------------------------------------------------ + gtk_proc("gtk_main_iteration") +end procedure + +----------------------------------------------------------------------------------- +export procedure main_iteration_do(integer i) -- used sometimes when multi-tasking; +----------------------------------------------------------------------------------- + gtk_proc("gtk_main_iteration_do",{I},i) +end procedure + +------------------------------------------------------------------------ +-- following routine traps the enter key when Entry is activated, +-- and uses it like the tab key - so it works like people expect. +-- When using Glade, connect each entry's 'activate' signal to +-- trap_enter_key +------------------------------------------------------------------------ +constant gsig = define_proc("g_signal_emit_by_name",{P,P,P}) +constant fsig = allocate_string("move-focus") +------------------------------------------------------------------------ +global function trap_enter_key(atom ctl, atom event) +----------------------------------------------------------------------- + if class_id(ctl) = GtkEntry then + if event = 0 then + c_proc(gsig,{ctl,allocate_string("move-focus"),0}) + return 1 + end if + end if +return 0 +end function + + + diff --git a/eugtk/GtkFileSelector.e b/eugtk/GtkFileSelector.e new file mode 100644 index 0000000..91959ac --- /dev/null +++ b/eugtk/GtkFileSelector.e @@ -0,0 +1,454 @@ + +------------------------- +namespace fileselector -- Generic file selection dialog; +------------------------- + +--# EXPORTS: +/* + -- functions: + fileselector:New() + fileselector:Open() + fileselector:Save() + fileselector:SaveAs() + fileselector:CreateFolder() + fileselector:SelectFolder() + + -- returns: + full file path if successful, e.g. "/home/irv/demos/test99.ex" + or an atom: + MB_ABORT when dialog is closed + MB_CANCEL when cancel button is clicked. +*/ + +include GtkEngine.e + +export constant version = "4.12.0" + +if not equal(version,gtk:version) then + Error(,,"GtkFileSelector version mismatch","should be version " & gtk:version) +end if + + +-- default settings, change before calling the dialog if required; +export boolean + create_folders = TRUE, + local_only = TRUE, + select_multiple = FALSE, + show_hidden = FALSE, + do_overwrite_confirmation = TRUE, + show_preview = FALSE, + preview_widget_active = TRUE + +export sequence preview_size = {200,200} + +export atom preview_max = 150 -- default size + +export object selected_filter=0, filters = {"euphoria","text"} + +-- may change filters before calling the dialog +-- (or every 5,000 miles, whichever comes first) + +-- IOW, to show only .css files, add the line: +-- fileselector:filters = {"css"} +-- before calling: +-- fileselector:Open("~/demos/*") + +-- note that the syntax of the parameter to Open() is important: +-- ~/demos or ~/demos/ will only cause the dialog to highlight the ~/demos folder, +-- ~/demos/* will open the demos folder and display the [filtered] file types +-- ~/demos/*.css will show folders and all *.css files + +-- combining filters with wildcards: +-- fileselector:filters = {"images"} +-- fileselector:Open("~/demos/glade/*") +-- the above will show all images in the specified directory, + +-- whereas: +-- fileselector:Open("~/demos/glade/*.png") +-- will show only .png images in the specified directory, +-- regardless of how the filters are set. + +-- below, only .png images will be shown, but drop-down options to show .html and .c files +-- will be available also: +-- fileselector:filters = {"html","c"} +-- fileselector:Open("~/demos/glade/*.png") + +-------------------------------------- +function generate_filter(object name) +-------------------------------------- +object filter = 0 + + switch name do + + case "images",".jpg",".gif",".png",".xpm" then filter = create(GtkFileFilter,{ + {"name","Images"},{"add mime type","image/*"}}) + + case "euphoria",".eu",".e",".exw" then filter = create(GtkFileFilter,{ + {"name","Euphoria files"},{"add pattern","*.e"}, + {"add pattern","*.ex"},{"add pattern","*.cfg"}}) + + case "text",".text",".txt" then filter = create(GtkFileFilter,{ + {"name","All text"},{"add mime type","text/plain"}}) + + case "c",".c",".h" then filter = create(GtkFileFilter,{ + {"name","C source code"},{"add mime type","text/x-c"}, + {"add pattern","*.c"},{"add pattern","*.h"}}) + + case "c++" then filter = create(GtkFileFilter,{ + {"name","C++ source code"},{"add pattern","*.c++"}}) + + case "css",".css" then filter = create(GtkFileFilter,{ + {"name","css markup"},{"add mime type","text/css"}, + {"add pattern","*.css"}}) + + case "python",".python",".py" then filter = create(GtkFileFilter,{ + {"name","Python"},{"add mime type","text/x-python"}}) + + case "html",".htm",".html" then filter = create(GtkFileFilter,{ + {"name","html source"},{"add mime type","text/html"}, + {"add pattern","*.html"}}) + + case "ini",".ini" then filter = create(GtkFileFilter,{ + {"name","ini"},{"add pattern","*.ini"}}) + + case "all" then filter = create(GtkFileFilter,{ + {"name","All files"},{"add pattern","*"}}) + + case "dir" then filter = create(GtkFileFilter,{ + {"name","Directories"},{"add mime type","inode/directory"}}) + + end switch + +return filter + +end function + +constant update_preview = call_back(routine_id("UpdatePreview")) + +---------------------------------------------------------- +export function New(object current=0) +---------------------------------------------------------- +object result=0 +atom dlg = create(GtkFileChooserDialog) + +set(dlg,{ + {"name","FileNew"}, + {"title","Create a new file"}, + {"action",GTK_FILE_CHOOSER_ACTION_SAVE}, + {"preview widget active",preview_widget_active}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(current) and current > 0 then + set(dlg,"current name",unpack(current)) + end if + + result = get(dlg,"run") + if result = MB_OK then + result = get(dlg,"filename") + end if + +destroy(dlg) + +return result +end function +export constant new = call_back(routine_id("New")) + +---------------------------------------------------- +export function Open(object data=0, atom x=0) +---------------------------------------------------- +object result=0 +object filter=0 + +if atom(data) and data > 0 then data = unpack(data) end if +if string(data) and equal("*",filename(data)) then filters &= {"all"} end if + +atom dlg = create(GtkFileChooserDialog) + +set(dlg,{ + {"name","FileOpen"}, + {"title","Open a file"}, + {"action",GTK_FILE_CHOOSER_ACTION_OPEN}, + {"preview widget active",preview_widget_active}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(data) and data > 0 then + data = unpack(data) + end if + + if string(data) then + if file_exists(canonical_path(data)) then + set(dlg,"filename",canonical_path(data)) + else + if not equal("*",filename(data)) then + filter = create(GtkFileFilter,{ -- build a custom filter; + {"name",filename(data) & " files"}, + {"add pattern",filename(data)}}) + set(dlg,"add filter",filter) + set(dlg,"filter",filter) + end if + set(dlg,"filename",canonical_path(data)) -- change to desired folder; + end if + end if + + result = get(dlg,"run") + + if result = MB_OK then + result = get(dlg,"filename") + end if + + destroy(dlg) + +return result +end function +export constant open = call_back(routine_id("Open")) + +---------------------------------------------------- +export function Save(object data, object x=0) +---------------------------------------------------- +object result=0 +atom dlg = create(GtkFileChooserDialog) +atom f + +set(dlg,{ + {"name","FileSave"}, + {"title","Save this file"}, + {"action",GTK_FILE_CHOOSER_ACTION_SAVE}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(data) and data > 0 then + set(dlg,"current name",unpack(data)) + end if + + if string(data) then + set(dlg,"current name",data) + end if + + result = get(dlg,"run") + + if result = MB_OK then + result = get(dlg,"filename") + end if + +destroy(dlg) + +return result +end function +export constant save = call_back(routine_id("Save")) + +----------------------------------------------------------- +export function SaveAs(object data=0, object x=0) +----------------------------------------------------------- +object result=0 +atom dlg = create(GtkFileChooserDialog) + +set(dlg,{ + {"name=FileSaveAs"}, + {"title","Save this file with a new name"}, + {"action",GTK_FILE_CHOOSER_ACTION_SAVE}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(data) and data > 0 then + set(dlg,"current name",unpack(data)) + elsif string(data) then + set(dlg,"current name",data) + end if + + result = get(dlg,"run") + + if result = MB_OK then + result = get(dlg,"filename") + end if + + destroy(dlg) + +return result +end function +export constant save_as = call_back(routine_id("SaveAs")) + +--------------------------------------------------------------- +export function CreateFolder(object data=0, object x=0) +--------------------------------------------------------------- +object result=0 +atom dlg = create(GtkFileChooserDialog) + +set(dlg,{ + {"name=NewFolder"}, + {"title","Create a new folder"}, + {"action",GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(data) and data > 0 then + set(dlg,"current name",unpack(data)) + end if + + result = get(dlg,"run") + + if result = MB_OK then + result = get(dlg,"filename") + end if + +destroy(dlg) + +return result +end function +export constant create_folder = call_back(routine_id("CreateFolder")) + +--------------------------------------------------------------- +export function SelectFolder(object data=0, object x=0) +--------------------------------------------------------------- +object result=0 +atom dlg = create(GtkFileChooserDialog) + +set(dlg,{ + {"name","SelectFolder"}, + {"title","Select a folder"}, + {"action",GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER}, + + {"add button","gtk-cancel",MB_CANCEL}, + {"add button","gtk-ok",MB_OK}, + {"create folders",create_folders}, + {"local only",local_only}, + {"select multiple",select_multiple}, + {"show hidden",show_hidden}, + {"do overwrite confirmation",do_overwrite_confirmation}}) + + for i = 1 to length(filters) do + set(dlg,"add filter",generate_filter(filters[i])) + end for + + if show_preview = TRUE then + atom preview = create(GtkImage) + set(dlg,"preview widget",preview) + connect(dlg,"update-preview",update_preview,preview) + end if + + if atom(data) and data > 0 then + data = unpack(data) + if string(data) then + if file_exists(canonical_path(data)) then + set(dlg,"filename",canonical_path(data)) + else + set(dlg,"filename",data) + end if + end if + end if + +result = get(dlg,"run") + +if result = MB_OK then + result = get(dlg,"filename") +end if + +destroy(dlg) + +return result +end function +export constant select_folder = call_back(routine_id("SelectFolder")) + +------------------------------------------------------------------------------ +function UpdatePreview(atom dlg, atom preview) -- local: follow focus changes; +------------------------------------------------------------------------------ +object pix +atom ratio +object dimensions +object fn = get(dlg,"filename") + +if string(fn) then -- avoid trying to preview a directory! + pix = create(GdkPixbuf,fn) + if pix > 0 then + dimensions = get(pix,"size") + ratio = preview_max / dimensions[1] + dimensions *= {ratio,ratio} + pix = get(pix,"scale simple",dimensions[1],dimensions[2],1) + set(preview,"from pixbuf",pix) + end if +end if + +return 0 +end function + diff --git a/eugtk/GtkFontSelector.e b/eugtk/GtkFontSelector.e new file mode 100644 index 0000000..dc5165f --- /dev/null +++ b/eugtk/GtkFontSelector.e @@ -0,0 +1,154 @@ + +---------------------- +namespace fontselector -- Generic font selector dialog +---------------------- + +--# EXPORTS +/* + -- functions -- callbacks + fontselector:Select() fontselector:select + fontselector:FilterFonts() fontselector:filter + +-- fontlist +*/ + +include GtkEngine.e +include GtkCairo.e +include std/wildcard.e +include std/hash.e + +export constant version = "4.12.0" + +if not equal(version,gtk:version) then + Error(,,"GtkFontSelector version mismatch","should be version " & gtk:version) +end if + +-- Optional parameter is preferred (default) font, the one to be +-- returned if the font dialog ok button is clicked without choosing +-- a different font. You can just specify a size here: "8" and that +-- will set only the dialog's size selector. +-- +-- You can specify a full font name and size: e.g. Purisa bold 16, +-- and that font will be the one highlighted for selection. +-- If you specify a font that doesn't exist: e.g. Bogus italic 18, +-- and then use the returned font, GTK will do the best it can, +-- which will be to set the existing font to italic in 18pt. +-- Fairly fail-safe, in other words. +-- +-- Setting this does not filter the list of fonts shown by the dialog. +-- to do this, you need to set the pattern. See below. +-- +-- To exclude unwanted (and unreadable) fonts, such as symbols and +-- dingbats, add them to the exclude sequence. See below. +-- +-- pattern can be set prior to the select() call +-- pattern can be an array of font names, wildcards are ok +-- e.g. {"Courier*","purisa"} +-- if you use, for example, just {"Courier"}, without the wildcard, +-- no fonts will be found. +-- +-- {"sans"}, {"*sans"}, or {"*sans*"} will each return a different +-- set of matching font names! trial and error may be required. +-- +-- if pattern is left unset, ALL fonts will be shown! + +export atom dlg = create(GtkFontChooserDialog,"name=FontSelector") + +export object + name = 0, -- font name + title = "Choose a font", -- dialog title + preview_text = "This is an EuGTK font selector", + description = 0, -- a PangoFontDescription + family = 0, -- font family + style = 0, -- normal, oblique, italic + variant = 0, + weight = PANGO_WEIGHT_NORMAL, + mono_filter = 0, + font_list = {} + +export atom size = 12*1024 +export integer points = 12 +export sequence pattern = {"*"} + +export sequence exclude = {"*symbol*","*dingbat*","*webdings","*wingdings*"} +-- above list filters out unusable fonts; + +------------------------------------------------------------------------ +export function Select(object curr_fnt=0) +------------------------------------------------------------------------ + set(dlg,"title","Select a font") + set(dlg,"preview text",preview_text) + if string(curr_fnt) then + set(dlg,"font",curr_fnt) + end if + pattern = lower(pattern) + exclude = lower(exclude) + + set(dlg,"filter func",filter) + + if get(dlg,"run") then + name = get(dlg,"font") + description = create(PangoFontDescription,name) + family = get(description,"family") + size = get(description,"size") + points = math:round(size/PANGO_UNIT) + variant = get(description,"variant") + style = get(description,"style") + weight = get(description,"weight") + end if + + hide(dlg) -- we keep it around, since it's likely to be used again :p + +return name +end function +export constant select = call_back(routine_id("Select")) + +------------------------------------------------------------------------ +export function FilterFonts(object family, object face, object data) +------------------------------------------------------------------------ +integer result = 0 + +if mono_filter then + if gtk_func("pango_font_family_is_monospace",{P},{family}) = FALSE then + return 0 + end if +end if + +object name = lower(gtk_str_func("pango_font_family_get_name",{P},{family})) + for i = 1 to length(pattern) do + result = is_match(pattern[i],name) > 0 + if result = 1 then + for x = 1 to length(exclude) do + if is_match(exclude[x],name) then + return 0 + end if + end for + end if + return result + end for +return result +end function +export constant filter = call_back(routine_id("FilterFonts")) + +sequence weight_names = +{"thin","ultralight","light","book","normal","medium", +"semibold","bold","ultrabold","heavy","ultraheavy"} + +/* -- reference; + PANGO_WEIGHT_THIN = 100, + PANGO_WEIGHT_ULTRALIGHT = 200, + PANGO_WEIGHT_LIGHT = 300, + PANGO_WEIGHT_BOOK = 380, + PANGO_WEIGHT_NORMAL = 400, + PANGO_WEIGHT_MEDIUM = 500, + PANGO_WEIGHT_SEMIBOLD = 600, + PANGO_WEIGHT_BOLD = 700, + PANGO_WEIGHT_ULTRABOLD = 800, + PANGO_WEIGHT_HEAVY = 900, + PANGO_WEIGHT_ULTRAHEAVY = 1000, + PANGO_UNIT = 1024 + + PANGO_STYLE_NORMAL = 0, + PANGO_STYLE_OBLIQUE = 1, + PANGO_STYLE_ITALIC = 2 +*/ diff --git a/eugtk/GtkPrinter.e b/eugtk/GtkPrinter.e new file mode 100644 index 0000000..972a083 --- /dev/null +++ b/eugtk/GtkPrinter.e @@ -0,0 +1,567 @@ + +-------------------- +namespace printer -- Utility to make printing easier +-------------------- + +export constant version = "4.12.0" + + -- EXPORTS: + -- functions callbacks + -- printer:PrintFile() printer:print_file + -- printer:PrintText() printer:print_text + +-- This version handles most common printing needs, but it will not yet respect +-- 'marked up' a.k.a. 'rich' text, i.e. text with colors and styles as produced +-- by GTK3's TextView widget. It just prints them as plain text. +-- +-- However, it DOES print text marked up with GTK's HTML subset, so you can use +-- , , , , ... etc. in your printouts! This includes various +-- imbedded font styles and colors. +-- +-- More documentation is found in ~/documentation/printing.html + +include GtkEngine.e +include GtkCairo.e +include std/datetime.e + +if not equal(version,gtk:version) then + Error(,,"GtkPrinter version mismatch","should be version " & gtk:version) +end if + +-- The following exported variables can be modified before calling the +-- print routine: + +public object header = "[1]\n" -- default is just the page title + +public object subheader = "[1] page [5]\n\n" -- format for headers on pg.2 ... n +-- default subheader (above) prints page title and pg #; + +public object footer = "\nPrinted by EuGTK [8] on [9]'s computer" +-- default footer (above) prints date and user name; + +-- Info ID's for use in header and footer; +-- 1 = page title (for first page) +-- 2 = sub title (for subsequent pages - leave null to use page title (1) on all pgs) +-- 3 = file name +-- 4 = short name (file name w/o path) +-- 5 = current page number +-- 6 = n_pages printed e.g. pg 1 of n +-- 7 = n_copies requested +-- 8 = today's date in date_format +-- 9 = user name +--10 = user's real name +--11 = font name used for this print job +--12 = file length in bytes +--13 = file timestamp +--14 = exported filename, if any + +export integer + n_pages = 0, -- number of pages to print (0=all) + n_copies = 1, + collate = FALSE, + duplex = 0, + number_up = 1, + number_up_layout = 1, + units = GTK_UNIT_INCH, + use_line_numbers = TRUE, + use_color = TRUE, -- print eu comments in red if true + lines_per_page = 60, + wrap_at = 0, + track_status = TRUE, + show_progress = TRUE, -- enable the built-in progressbar + embed_page_setup = TRUE, + orientation = 0, + order = 0, + confirm = FALSE, + sourcecode = TRUE, + plaintext = FALSE, + use_full_page = FALSE, -- ignore margins + has_selection = FALSE, + support_selection = FALSE, + quality = GTK_PRINT_QUALITY_DRAFT, + action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + auto_lpp = TRUE + +export atom + scale = 100, + top_margin = 0.25, -- in inch units + left_margin = 0.25, + right_margin = 0.25, + bottom_margin = 0.25, + parent = 0, + + signal_status_changed = call_back(routine_id("show_status")), + signal_begin_print = call_back(routine_id("begin_print")), + signal_draw_page = call_back(routine_id("draw_page")), + signal_end_print = call_back(routine_id("end_print")), + signal_request_page_setup = 0, + signal_done = 0, + signal_ready = 0, + signal_got_page_size = 0 + +export object + name = 0, + font = "Ubuntu Mono 8", + jobname = 0, + settings_file = 0, + setup_file = 0, + export_file = 0, + page_ranges = 0, + page_set = GTK_PAGE_SET_ALL, + custom_tab_hook = 0, + custom_tab_label = 0, + custom_tab_func = 0 + +ifdef WINDOWS then font = "Courier New 16" end ifdef + +export object + line_number_format = "[:4] []\n", -- controls line # format AND code line! + paper_name = "na_letter", -- 8.5x11.0" + tabs = " ", -- replace tab chars with 8 spaces + file_name = 0, + short_name = 0, + page_title = 0, + sub_title = 0 + +export atom + progress = create(GtkProgressBar), + settings = create(GtkPrintSettings) + +-- use date and time formats in std/datetime.e; +export sequence date_format = "%A, %B %d %Y %l:%M %p" + +sequence user +ifdef WINDOWS then + user = "User" +elsedef + user = proper(getenv("USER")) +end ifdef + +-- for local use; +atom fontdesc +integer filesize = 0 +object timestamp = 0 +sequence text +sequence today = datetime:format(datetime:now(),date_format) + +export procedure reset() + n_pages = 0 + n_copies = 1 + collate = FALSE + duplex = 0 + number_up = 1 + number_up_layout = 1 + units = GTK_UNIT_INCH + use_line_numbers = TRUE + use_color = TRUE + lines_per_page = 60 + wrap_at = 0 + track_status = TRUE + show_progress = TRUE + embed_page_setup = TRUE + orientation = 0 + order = 0 + confirm = FALSE + sourcecode = TRUE + plaintext = FALSE + use_full_page = FALSE + has_selection = FALSE + support_selection = FALSE + quality = GTK_PRINT_QUALITY_DRAFT + action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG + auto_lpp = TRUE + + scale = 100 + top_margin = 0.25 + left_margin = 0.25 + right_margin = 0.25 + bottom_margin = 0.25 + parent = 0 + + name = 0 + paper_name = "na_letter" + font = "Ubuntu Mono 8" + jobname = 0 + settings_file = 0 + setup_file = 0 + export_file = 0 + page_ranges = 0 + page_set = GTK_PAGE_SET_ALL + custom_tab_hook = 0 + custom_tab_label = 0 + custom_tab_func = 0 + +end procedure + +------------------------------------------------------------------------ +export function PrintFile(object f=0, object x=0) +------------------------------------------------------------------------ + +if string(f) and string(x) then + page_title = f + file_name = canonical_path(x) + timestamp = file_timestamp(file_name) + filesize = file_length(file_name) + short_name = filebase(file_name) + text = read_file(file_name) + setup_printer() + return 1 +end if + +if string(f) and atom(x) and x = 0 then + f = canonical_path(f) + file_name = f + timestamp = file_timestamp(f) + filesize = file_length(f) + short_name = filebase(f) + page_title = filename(f) + text = read_file(f) + setup_printer() + return 1 +end if + +if string(f) and atom(x) and x < 100 then + page_title = f + short_name = f + file_name = f + text = read_file(x) + setup_printer() + return 1 +end if + +if atom(f) and atom(x) and x < 101 then + if atom(file_name) then + file_name = "" + end if + if atom(short_name) then + short_name = "" + end if + if atom(page_title) then + page_title = "" + end if + text = read_file(x) + setup_printer() + return 1 +end if + +if atom(f) and atom(x) then + x = unpack(x) + x = canonical_path(x) + file_name = x + short_name = filebase(x) + page_title = filename(x) + text = read_file(x) + setup_printer() + return 1 +end if + +return 1 +end function +export constant print_file = call_back(routine_id("PrintFile")) + +------------------------------------------------------------------------ +export function PrintText(object f=0, object x=0) +------------------------------------------------------------------------ + +if string(f) and string(x) then + page_title = f + text = x + setup_printer() + return 1 +end if + +if atom(f) and string(x) then + setup_printer() + text = x + return 1 +end if + +if atom(f) and atom(x) then + if atom(page_title) and page_title = 0 then + page_title = "" + end if + text = unpack(x) + setup_printer() + return 1 +end if + +return 0 +end function +export constant print_text = call_back(routine_id("PrintText")) + +integer status_code +sequence status_string + +----------------------------------------------- +export function show_status(atom op) +----------------------------------------------- +atom + fn1 = define_func("gtk_print_operation_get_status",{P},I), + fn2 = define_func("gtk_print_operation_get_status_string",{P},S) + +status_code = c_func(fn1,{op}) +status_string = peek_string(c_func(fn2,{op})) + +ifdef PRINT then display("Status [] []",{status_code,status_string}) end ifdef + +if show_progress then + set(progress,"text",status_string) +end if + +ifdef DELAY then sleep(0.15) end ifdef + +return 1 +end function + +------------------------------------------------------ +export function begin_print(atom op, atom context) +------------------------------------------------------ +ifdef PRINT then display("Begin printing [] pages ",length(text)) end ifdef + +fontdesc = create(PangoFontDescription,font) + +if auto_lpp then +atom setup = get(op,"default page setup") + atom pght = get(setup,"page height",GTK_UNIT_POINTS) + --display("Page height [] pt.",pght) + pght -= length(header) + pght -= length(footer) + atom fs = get(fontdesc,"size") / 1024 + --display("Font size []",fs) + fs = fs * (96/72) + integer lpp = 1 + while ((fs*lpp)) < pght do + lpp += 1 + --display("Text height [] lpp []",{(fs*lpp),lpp}) + end while + --display("New LPP []",lpp-1) + lines_per_page = lpp +end if + +text = process_text(text) + +set(op,"n pages",n_pages) + +-- important, as a new value for n_pages is computed +-- based on the length of the file being read, unless a set number +-- has been provided from the calling program. + +if show_progress then -- turn on the progress dialog in the calling program + show_all(progress) +end if + +return 1 +end function + +---------------------------------------------------------------------------- +export function draw_page(atom op, atom context, integer pg, atom data) +---------------------------------------------------------------------------- +atom fn6 = define_func("gtk_print_context_get_cairo_context",{P},P) + +atom cr = c_func(fn6,{context}) +atom pl = create(PangoCairoLayout,cr) + set(pl,"font description",fontdesc) + +pg += 1 +if pg > length(text) then + set(progress,"text","Printing complete") + return 0 +end if + +if show_progress then + set(progress,"text",sprintf("Printing page %d",pg)) + set(progress,"fraction",pg/n_pages) +end if + +ifdef DELAY then sleep(0.25) end ifdef + +object details = { + page_title,sub_title,file_name,short_name, + pg,n_pages,n_copies, + today,user,real_name,font,filesize,timestamp,export_file + } + +object page + +if atom(header) then header = "[1] page [5] of [6]\n\n" end if + +if pg = 1 or atom(subheader) then + page = text:format(header,details) + & flatten(text[pg]) + & text:format(footer,details) +else + page = text:format(subheader,details) + & flatten(text[pg]) + & text:format(footer,details) +end if + +if plaintext then + set(pl,"text",page,length(page)) +else + set(pl,"markup",page,length(page)) +end if + + set(pl,"update layout",cr) + set(pl,"show layout",cr) + +ifdef PRINT then printf(1,"Page %d\n",pg) end ifdef + +return 1 +end function + +------------------------------------------------------------------------ +function process_text(object txt) +------------------------------------------------------------------------ +txt = split(txt,'\n') +integer comment, n +object a,b +object test + + +for i = 1 to length(txt) do -- replace chars which will confuse markup + + txt[i] = join(split(txt[i],'&'),"&") + txt[i] = join(split(txt[i],"&amp;"),"&") + + if sourcecode then + txt[i] = join(split(txt[i],'<'),"<") + txt[i] = join(split(txt[i],'>'),">") + end if + + if use_color then + if match("--",txt[i]) then -- a comment; + txt[i] = split(txt[i],"--") + txt[i] = txt[i][1] & "-- " & txt[i][2] & "" + end if + end if + + if use_line_numbers then + txt[i] = text:format(line_number_format,{i,txt[i]}) + else + txt[i] &= '\n' + end if + +end for + +txt = breakup(txt,lines_per_page) + +if n_pages = 0 then -- no selection + n_pages = length(txt) +end if + +return txt +end function + +------------------------------------------------------------------------ +export function end_print() +------------------------------------------------------------------------ +status_string = "Printing complete" +ifdef PRINT then display(status_string) end ifdef +return 1 +end function + +--------------------------------------------------------------- +export function setup_printer() +--------------------------------------------------------------- +atom _size = create(GtkPaperSize,paper_name) +atom err = allocate(16) err = 0 +object results = 0 + +atom fn7 = define_func("gtk_print_operation_run",{P,I,P,P},I) +atom fn8 = define_func("gtk_print_run_page_setup_dialog",{P,P,P},P) + + set(settings,"paper size",_size,units) + set(settings,"n copies",n_copies) + set(settings,"collate",collate) + set(settings,"duplex",duplex) + set(settings,"reverse",order) + set(settings,"scale",scale) + set(settings,"quality",quality) + set(settings,"number up",number_up) + set(settings,"number up layout",number_up_layout) + + if string(name) then + set(settings,"printer",name) + end if + +atom setup = create(GtkPageSetup) + set(setup,"paper size",_size) + set(setup,"orientation",orientation) + set(setup,"left margin",left_margin,units) + set(setup,"right margin",right_margin,units) + set(setup,"top margin",top_margin,units) + set(setup,"bottom margin",bottom_margin,units) + +atom printop = create(GtkPrintOperation) + set(printop,"print settings",settings) + set(printop,"default page setup",setup) + set(printop,"show progress",show_progress) + set(printop,"track print status",track_status) + set(printop,"embed page setup",embed_page_setup) + set(printop,"support selection",support_selection) + set(printop,"has selection",has_selection) + set(printop,"use full page",use_full_page) + + if action = GTK_PRINT_OPERATION_ACTION_EXPORT then + export_file = canonical_path(export_file) + set(printop,"export filename",export_file) + end if + + if string(jobname) then + set(printop,"job name",jobname) + end if + + if custom_tab_hook != 0 then + set(printop,"custom tab label",custom_tab_label) + connect(printop,"create-custom-widget",custom_tab_func,printop) + connect(printop,"custom-widget-apply",custom_tab_hook) + end if + + connect(printop,"status-changed",signal_status_changed) + connect(printop,"begin-print",signal_begin_print) + connect(printop,"draw-page",signal_draw_page) + connect(printop,"end-print",signal_end_print) + connect(printop,"request-page-setup",signal_request_page_setup) + connect(printop,"done",signal_done) + connect(printop,"ready",signal_ready) + connect(printop,"got-page-size",signal_got_page_size) + + display(get(settings,"printer lpi")) + + c_func(fn7,{printop,action,parent,err}) -- start the print process; + + if string(setup_file) and file_exists(canonical_path(setup_file)) then + get(setup,"to file",canonical_path(setup_file)) + end if + +object jobname = get(printop,"job name") + if confirm then + if action = GTK_PRINT_OPERATION_ACTION_EXPORT then + if Question(0,"PDF Written", + sprintf("%s\nFolder: %s", + {filename(export_file),pathname(export_file)}), + sprintf("%s\nStatus: %d\n%s\nClick Yes to view",{jobname,status_code,status_string}) + ,,,"printer") then + show_uri(export_file) + end if + else + Info(0,"Print Job",jobname, + sprintf("Status: %d %s",{status_code,status_string}) + ,,"printer") + end if + end if + + page_title = 0 + n_pages = 0 + n_copies = 1 + action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG + +return 1 +end function + +header = "[1]\n\n" + +----------------------------- +-- copyright 2015 Irv Mullins +----------------------------- + diff --git a/eugtk/GtkSettings.e b/eugtk/GtkSettings.e new file mode 100644 index 0000000..033a31e --- /dev/null +++ b/eugtk/GtkSettings.e @@ -0,0 +1,305 @@ + +--------------------- +namespace settings -- functions to read and write config files (*.ini); +--------------------- + +export constant version = "4.12.0" + +--# EXPORTS +/* + --functions: + settings:Save() + settings:Load() + settings:Add() + + -- debug: + -d SETTINGS +*/ + +include GtkEngine.e + +if not equal(version,gtk:version) then + Error(,,"GtkSettings version mismatch","should be version " & gtk:version) +end if + +constant fmt = """[].[]=[]""" + +------------------------------------------------------------------------ +export function Save(sequence inifile, object ctl_list, integer debug=0) +------------------------------------------------------------------------ +-- writes an 'ini' type file (file name and extension are up to you) +-- with an entry for each control on ctl_list. The controls MUST have +-- been named, otherwise there's no way to save and retrieve the +-- value/setting for that control. +------------------------------------------------------------------------ +object comments = {} +object txt,line + +if file_exists(inifile) then + + txt = read_lines(inifile) + for i = 1 to length(txt) do -- extract the comments; + line = txt[i] + if match("--",line) = 1 + or match("!",line) = 1 + or match("+",line) = 1 + or equal("\n",line) + or equal({},line) then + comments = append(comments,line) + end if + end for + write_lines(inifile,comments) -- removing everything but the comments; +end if -- file exists + +object setting, tmp = 0, pos = {0,0} +object t1, name, prop +atom handle +integer class + +atom fn = open(inifile,"a") + +for x = 1 to length(ctl_list) do + + if string(ctl_list[x]) then + handle = pointer(ctl_list[x]) + else + handle = ctl_list[x] + end if + + name = get(handle,"name") + class = class_id(handle) + + if class=GtkWindow then -- special handling for multiple properties; + printf(fn,"%s\n",{get_setting(handle,"size")}) + pos = get(handle,"position") + printf(fn,"%s.position={%d,%d}\n",{name,pos[1],pos[2]}) + + else + setting = get_setting(handle) -- others have 1 obvious 'saveable' property + if length(setting) < 1 then + continue + end if + + if sequence(setting) then + printf(fn,"%s\n",{setting}) + end if + end if +end for + +flush(fn) +close(fn) + +-- if ! exists for this control:property, then ignore the updated setting; +tmp = read_lines(inifile) +for i = 1 to length(tmp) do + if match("--!",tmp[i]) = 1 then + t1 = split(tmp[i],"=") + t1 = t1[1][2..$] + end if +end for + +write_lines(inifile,tmp) + +return 1 +end function + +------------------------------------------------------------------------ +export function Load(sequence inifile, integer debug=0) +------------------------------------------------------------------------ +-- used to restore settings from the specified ini file. +-- this should be called after the controls are 'realized' + +object txt, line, obj, prop, val1=0, val2=0, val3=0, val4=0 + +if not(file_exists(inifile)) then + write_file(inifile,sprintf("--%s\n\n",{inifile}),TEXT_MODE) + display("Creating ini file: []",{inifile}) +else + if debug then display("Reading []",{inifile}) end if +end if + +txt = read_lines(inifile) + +integer err=0 +object a,b + +for i = 1 to length(txt) do + + line = txt[i] + + if match("--",line) > 2 then -- strip trailing comments; + line = line[1..match("--",line)-2] + end if + + if match("--!",line) = 1 then + line = line[4..$] -- keep it + end if + + if match("+",line) = 1 or match("!",line) then + line = line[2..$] -- dito + end if + + if match("--",line) or match(";",line) + or match("/*",line) then + continue -- a comment, do nothing with it + end if + + if length(line) > 0 then + line = split(line,'=') + a = line[1] b = line[2] + a = split(a,'.') + line = a & {b} + + if debug > 1 then display(line) end if + + if vlookup(line[1],registry,4,1,-1) = -1 then + err = i + Error(,"Ini Load Error", + sprintf("Invalid object name: %s",{line[1]}), + sprintf("Line #%d of %s",{i,filename(inifile)})) + else + if equal("data",line[2]) then + set(line[1],"data",line[3],line[4]) + else + set(line[1],line[2],line[3]) + end if + end if + end if +end for + +if debug = 1 then + for i = 1 to length(txt) do + if i = err then + display("ERROR:[:3]:[]",{i,txt[i]}) + else + display("[:3]:[]",{i,txt[i]}) + end if + end for +end if + +write_lines(inifile,txt) + +return 1 +end function + +------------------------------------------------------------------------------------------- +export function Add(object ini,object ctl, sequence prop, object v1=0, object v2=0) +------------------------------------------------------------------------------------------- +if atom(ctl) then ctl = get(ctl,"name") end if + +Delete(ini,ctl,prop) + +if equal("position",prop) or equal("size",prop) then +if string(v1) then v2 = v1[2] v1 = v1[1] end if +end if + +if atom(v2) and v2=0 then + writefln("+[].[]=[]",{ctl,prop,v1},{ini,"a"}) +else + writefln("+[].[]={[],[]}",{ctl,prop,v1,v2},{ini,"a"}) +end if + +return 1 +end function + +-------------------------------------------------------------------- +export function Delete(object ini,object ctl, sequence prop) +-------------------------------------------------------------------- +if atom(ctl) then ctl = get(ctl,"name") end if +object tmp = read_lines(ini) +object out = {} +object s1 = text:format("[].[]",{ctl,prop}) +for i = 1 to length(tmp) do + if match(s1,tmp[i]) then -- skip + else out &= {tmp[i]} + end if +end for +write_lines(ini,out) +return 1 +end function + +--------------------------------------------------------------------------------- +function get_setting(object self, object property = 0) +-- returns the 'important' value from a control +--------------------------------------------------------------------------------- +-- returns settings string +-- object must be a named object, e.g. MyButton + +-- MyButton.active=1 +-- My Calendar.date={YYYY,MM,DD} + +object name = 0 +object dt + +if string(self) then + name = self + self = vlookup(self,registry,4,1) +end if + +object val = 0 +object txt = {} + +integer x = find(self,vslice(registry,1)) + + ifdef SETTINGS then + display("SELF [] []",{x,self}) + display(registry[x]) + end ifdef + + switch class_id(self) do + -- this decides which value is the important one to save; + -- and stores the control's current value into the registry; + + case GtkEntry,GtkEntryBuffer then property = "text" + + case GtkCheckButton,GtkRadioButton, GtkToggleButton, + GtkSwitch,GtkComboBox,GtkComboBoxText, + GtkCheckMenuItem,GtkToggleToolButton, GtkSearchEntry + then property = "active" + + case GtkPopover then property = "position" + + case GtkFontButton then property = "font name" + + case GtkAdjustment,GtkSpinButton,GtkScaleButton,GtkVolumeButton, + GtkModelButton,GtkScale + then property = "value" + + case GtkEntryCompletion then property = "model" + + case GtkLinkButton then property = "uri" + + case GtkMenuItem then property = "sensitive" + + case GtkPaned then property = "position" + + case GtkFileChooser, GtkFileChooserButton, GtkFileChooserWidget, GtkFileChooserDialog + then property = "filename" + + case GtkFontChooser, GtkFontChooserWidget, GtkFontChooserDialog then + property = "font" + + case GtkCalendar then + dt = get(self,"datetime",0) + registry[x][5] = {"date",dt[1..3]} + txt &= text:format(fmt,{registry[x][4],"date",dt[1..3]}) + return txt + + case GtkColorButton,GtkColorChooser,GtkColorChooserWidget, + GtkColorChooserDialog then + registry[x][5] = {"rgba",get(self,"rgba",1)} + txt &= text:format(fmt,{registry[x][4],"rgba",get(self,"rgba",1)}) + return txt + + end switch + + if atom(property) then + return txt + end if + + val = get(self,property) + registry[x][5] = {property,val} + txt &= text:format(fmt,{registry[x][4],property,val}) + +return txt +end function diff --git a/mandy.exw b/mandy.exw new file mode 100644 index 0000000..f31fb31 --- /dev/null +++ b/mandy.exw @@ -0,0 +1,16 @@ +include "eugtk/GtkEngine.e" +include eugtk/GtkAboutDialog.e +include eugtk/GtkFileSelector.e +include eugtk/GtkEvents.e +include std/io.e + + +function nigger () + + atom clown1 = create(GdkPixbuf, 80,80,1) + Warn(0,,"You are getting a fucking warning from jitty", "but this is normal",,clown1,clown1) + + return 0 +end function + +nigger() diff --git a/tools/WEE/EuGTK/GtkEngine.e b/tools/WEE/EuGTK/GtkEngine.e new file mode 100644 index 0000000..8637eec --- /dev/null +++ b/tools/WEE/EuGTK/GtkEngine.e @@ -0,0 +1,8800 @@ + +------------- +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.9.4", + release = "Apr 15, 2015", + copyright = "© 2015 by Irv Mullins" + +public include GtkEnums.e +-- GtkEnums includes most of Eu std libraries, making them available to your eu programs +-- without specifically including them. std/math, std/locale, and std/datetime aren't +-- public, because that would cause too many conflicting names, requiring you to use +-- namespaces everywhere. + +if not equal(gtk:version,enums:version) then + crash("Version mismatch: GtkEnums should be version %s",{version}) +end if + +include std/datetime.e +include std/math.e + +public constant -- 'shorthand' identifiers save space in method prototypes; + P = C_POINTER, I = C_INT, S = E_OBJECT, B = C_BYTE, + D = C_DOUBLE, F = C_FLOAT, A = E_SEQUENCE + +export object LIBS + +constant windll = "C:\\gtk\\bin\\" -- assume this is where you put your gtk3.dll's + +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" )} +end ifdef + +ifdef WINDOWS then -- assuming you put the dlls in C:\\gtk... + LIBS = { + "libgtk-3-0.dll", + "libgdk-3-0.dll", + "libglib-2.0-0.dll", + "libgobject-2.0-0.dll", + "libgdk_pixbuf-2.0-0.dll", + "libpango-1.0-0.dll", + "libcairo-2.dll", + "libpangocairo-1.0-0.dll", + "libpng15-15.dll", + "librsvg-2-2.dll", + "libgio-2.0-0.dll" + } + atom x + chdir(windll) -- switch to dll folder so dll's can find other dll's + for i = 1 to length(LIBS) do + x = open_dll(windll & LIBS[i]) + if x = 0 then + display("Error loading []",{windll & LIBS[i]}) + else + LIBS[i] = x + end if + end for + +end ifdef + + if not object(LIBS) then + crash("GTK Libraries not found!") + end if + + for i = 1 to length(LIBS) do + if LIBS[i] = 0 then + crash("GTK Library %s not found!",{LIBS[i]}) + end if + end for + +constant cmd = command_line() -- used only to get program name + +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 constant + 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"), + host_name = gtk_str_func("g_get_host_name"), + home_dir = gtk_str_func("g_get_home_dir"), + temp_dir = gtk_str_func("g_get_tmp_dir"), + curr_dir = gtk_str_func("g_get_current_dir"), + data_dir = gtk_str_func("g_get_user_data_dir"), + conf_dir = gtk_str_func("g_get_user_config_dir"), + init_dir = init_curdir(), + 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"), + os_pid = os:get_pid(), -- process id 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] -- #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 + +ifdef UNIX then + export constant + host_addr = inet_address(), + os_architecture = os_info[5], -- e.g: x86_64 + os_shell = getenv("SHELL") -- e.g: /bin/bash +end ifdef + +ifdef WINDOWS then -- FIXME +export constant + host_addr = "localhost", + os_architecture = "unknown", + os_shell = "cmd.com" + end ifdef + +object os_term = getenv("TERM") + if atom(os_term) then os_term = "none" end if + +ifdef WINDOWS then os_term = "CMD.COM" end ifdef + +export constant info = { -- above system info in key/value form, sometimes more 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, + "init_dir=" & init_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_version=" & os_info[3], + "os_compiled=" & os_info[4], + "os_architecture=" & os_architecture, + "os_term=" & os_term, + "os_shell=" & os_shell, + "eu_version=" & version_string_short(), + "eu_revision=" & to_string(version_revision()), + "eu_date=" & version_date() + } + +ifdef WINDOWS then -- switch back from GTK3 dll folder + chdir(init_dir) +end ifdef + +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. links signals to your specified Eu function (for commonly-used widgets), +-- Widgets which have no default signal or which need to respond to a signal +-- other than the default must be linked manually, using connect(). +-- If no function is specified, no link will be created. +-- Immediately following the function identifier is an optional data item. +-- data item can contain anything - integer, atom, string, or mixed sequence. +------------------------------------------------------------------------------- + + if class = GtkStockList then -- GtkStock is not a real widget, + return newStockList() -- in addition, stock items are deprecated in 3.10+ + end if + + if not initialized[class] then -- create a routine_id for each 'method' in class + init(class) + end if + + object method = lookup("new",vslice(widget[class],1),widget[class],0) + if method[VECTOR] = -1 then -- if a 'new' method name not found, + puts(1,repeat('*',70)) + printf(1,"\nERROR 220: %s not implemented in this version of GTK!\n",widget[class]) + puts(1,repeat('*',70)) + puts(1,"\nPress any key ...") + wait_key() + abort(220) + end if + + object props = 0 + if sequence(p1) and sequence(p1[1]) then -- list of properties provided (new style) + props = p1 -- save until widget is created, then set them in one 'swell foop' + p1 = 0 + end if + + atom handle = 0 + object params = method[PARAMS] + object args = {p1,p2,p3,p4,p5,p6,p7,p8} + + args = args[1..length(params)] + + ifdef PARAMS then display(params) end ifdef -- debug + + for i = 1 to length(params) do + 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 + end switch + end for + + ifdef CREATE then -- debug + display(decode_method("Create",class,method)) + puts(1,"Args: ") display(args) + 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) + end if + + if handle = 0 then + ifdef CREATE then + Warn(,,"Create failed for class",widget[class][$]) + crash("Create failed for class %s",{widget[class][$]}) + end ifdef + return handle + end if + + switch class do -- connect a default signal for some common controls; + case GtkButton then connect(handle,"clicked",p2,p3) + case GtkToolButton then connect(handle,"clicked",p3,p4) + case GtkRadioButton then connect(handle,"toggled",p3,p4) + case GtkRadioToolButton then connect(handle,"toggled",p3,p4) + case GtkRadioMenuItem then connect(handle,"toggled",p3,p4) + case GtkMenuItem then connect(handle,"activate",p2,p3) + case GtkCheckMenuItem then connect(handle,"toggled",p2,p3) + case GtkCellRendererToggle then connect(handle,"toggled",p1,p2) + case GtkFontButton then connect(handle,"font-set",p2,p3) + case GtkStatusIcon then connect(handle,"activate",p1,p2) + case GtkColorButton then connect(handle,"color-set",p2,p3) + case GtkCalendar then connect(handle,"day-selected-double-click",p2,p3) + case GtkComboBoxText, GtkComboBoxEntry then connect(handle,"changed",p1,p2) + case GtkCheckButton, GtkToggleButton, GtkToggleToolButton + then connect(handle,"toggled",p2,p3) + end switch + + ifdef CREATE then -- debug + display("\t[] => []\n",{widget[class][$],handle}) + end ifdef + + register(handle,class) + + if not atom(props) then -- set properties using new style; + for i = 1 to length(props) do + while length(props[i]) < 4 do props[i] &= 0 end while + set(handle,props[i][1],props[i][2],props[i][3],props[i][4]) + end for + end if + + return handle -- a pointer to the newly created instance + +end function /*create*/ + +------------------------------------------------------------------------ +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 handle. +-- In order to work with Glade, widget names in string form +-- may be used. +-- 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, x +object name + + name = handle + if string(handle) then handle = pointer(handle) end if + if handle = 0 then + crash("Fatal error 325 Can't obtain a handle for %s",{name}) + end if + + object prop = 0 + if sequence(property) -- new create format + and not string(property) then + for i = 1 to length(property) do + prop = property[i] + 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 + --display(registry) + display("Error 343 in set() - invalid handle [] []",{handle,prop}) + abort(1) + end if + + property = "set_" & lower(join(split(property,' '),'_')) -- conform; + ifdef SET then + display("Line 349 []->[]",{widget[class][$],property}) + end ifdef + + object method = lookup_method(class,property) + + ifdef METHOD then display(method) end ifdef + + if atom(method) then -- method not defined, try fallback to generic Object; + if not setProperty(handle,property[5..$],p1) then + ifdef SET then --debug + printf(1,"Caution: %s not found for class %d %s\n", + {property,class,classname(handle)}) + end ifdef + end if + return 0 + end if + + -- else, 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} + + 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]) + end if + case S then -- string; + if string(args[i]) then + args[i] = allocate_string(args[i]) + 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", + "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 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}) + return 0 + end if + + if method[RETVAL] = 0 then -- it's a GTK proc + c_proc(method[VECTOR],args) + return 0 + end if + + if method[RETVAL] > 0 then -- it's a GTK func + return c_func(method[VECTOR],args) + end if + + if method[RETVAL] <-1 then -- it's a Eu func + return call_func(-method[VECTOR],args) + end if + + return 0 + +end function /*set*/ + +------------------------------------------------------------------------ +export function get(object handle, sequence property, + object p1=allocate(64), object p2=allocate(64), + object p3=allocate(64), object p4=allocate(64)) +------------------------------------------------------------------------ +-- 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. +-- +-- parameters p1...p4 are normally not supplied when calling get() +-- but are there to store return values from the GTK function. +-- For example, get(win,"default size") will return with the +-- window width in p1, height in p2, which are converted by the get +-- function into a Euphoria tuple {w,h} before returning. +------------------------------------------------------------------------ +integer class, x +object name + + if string(handle) then handle = pointer(handle) end if + + class = vlookup(handle,registry,1,2,-1) -- get widget's class; + + if class = -1 then + crash("Error 459 - unregistered handle %d",handle) + end if + + property = "get_" & lower(join(split(property,' '),'_')) + + object method = lookup_method(class,property) + object result = 0 + + if atom(method) then -- not found, try fallback to Object; + result = getProperty(handle,property[5..$]) + return result + end if + + -- else, method found; + object params = method[PARAMS] + object args = {handle,p1,p2,p3,p4} + 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[VECTOR] = -1 then + crash("\nERROR 478\n****** Invalid call: %s->%s",{widget[class][$],method[1]}) + end if + + for i = 2 to length(args) do -- convert args to pointers if necessary; + switch method[PARAMS][i] do + case S then + if string(args[i]) then args[i] = allocate_string(args[i]) end if + end switch + end for + + if method[RETVAL] = 0 then -- it's a GTK proc + c_proc(method[VECTOR],args) + + for i = 2 to length(method[PARAMS]) do -- convert returned values; + switch method[PARAMS][i] do + case D then args[i] = float64_to_atom(peek({args[i],8})) + case F then args[i] = float32_to_atom(peek({args[i],4})) + case S then if args[i] > 0 then args[i] = peek_string(args[i]) end if + case I then args[i] = peek4s(args[i]) + end switch + end for + result = args[2..$] + end if + + if method[RETVAL] > 0 then -- it's a GTK func + result = c_func(method[VECTOR],args) + switch method[RETVAL] do + case S then -- convert string pointer to string; + if result > 0 then + result = peek_string(result) + else + result = 0 + end if + case A then + result = to_sequence(result) + 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_sort_column_id" then result += 1 + end switch + end switch + end if + + if method[RETVAL] <-1 then -- it's a Eu func (negated routine_id) + result = call_func(-method[VECTOR],args) + end if + + if method[CLASS] != GSList then + if method[CLASS] != 0 then -- for widgets created 'internally' by GTK; + if not initialized[method[CLASS]] then init(method[CLASS]) end if + register(result,method[CLASS]) + end if + end if + + ifdef GET then -- debug + if string(result) then + display("\tReturns: '[]'",{result}) + else + display("\tReturns: []",{result}) + end if + end ifdef + + return result + +end function /*get*/ + +------------------------------------------------------------------------ +public function add(object parent, object child, object space = 0) +------------------------------------------------------------------------ +-- add a child widget or a {list} of child widgets to parent container +object name, class, handle + + if classid(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,\nor save it for later use!") + end if + + if classid(parent) = GtkBuilder then + load_builder(parent,child,space) + return 1 + end if + + if string(parent) then + parent = vlookup(parent,registry,4,1,-1) + end if + + if string(child) then + child = vlookup(child,registry,4,1,-1) + end if + + -- Switch below implements an easier-to-remember 'add' syntax + -- as an alias for the various calls shown. The GTK original is still available, + -- if you wish to use it. + + switch classid(parent) do + + case GtkComboBoxText, GtkComboBoxEntry then + for i = 1 to length(child) do + set(parent,"append text",child[i]) -- add is alias for "append text" + 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 classid(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 GtkTreeView then + set(parent,"append columns",child) + return child + + case GtkTreeViewColumn then + if child > 0 then + set(parent,"pack start",child) + else + set(parent,"pack end",-child) + end if + 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 /*add*/ + +------------------------------------------------------------------------ +public function pack(atom 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 atom(child) then + if child > 0 then + set(parent,"pack start",child,expand,fill,padding) + else + child = -child + set(parent,"pack end",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 child +end function + +-- following 2 calls are supplied for completeness; +public function pack_start(atom parent, object child, -- original GTK call + boolean expand=0, boolean fill=0, integer padding=0) +return pack(parent,child,expand,fill,padding) +end function + +public function pack_end(atom parent, object child, -- orignal GTK call + boolean expand=0, boolean fill=0, integer padding=0) +return pack(parent,-child,expand,fill,padding) +end function + +------------------------------------------------------------------------ +public procedure show(object x) +------------------------------------------------------------------------ + if atom(x) then -- show widget x or a {list} of widgets + set(x,"show") + else + for i = 1 to length(x) do + show(x[i]) + end for + end if +end procedure + +------------------------------------------------------------------------ +public procedure show_all(object x) +------------------------------------------------------------------------ + if atom(x) then + set(x,"show all") -- show container x and all children + else + for i = 1 to length(x) do + set(x[i],"show all") + end for + end if +end procedure + +------------------------------------------------------------------------ +public procedure hide(object x) +------------------------------------------------------------------------ + if atom(x) then -- hide a widget or a {list} of widgets; + set(x,"hide") + else + for i = 1 to length(x) do + hide(x[i]) + end for + end if +end procedure + +------------------------------------------------------------------------ +public procedure hide_all(object x) +------------------------------------------------------------------------ + set(x,"hide all") -- hide container x and any children it contains +end procedure + +------------------------------------------------------------------------ +public function Destroy(object ctl, object data) +------------------------------------------------------------------------ +-- destroy a widget or {list} of widgets; +if atom(data) then + gtk_proc("gtk_widget_destroy",{P},{data}) +else + for i = 1 to length(data) do + Destroy(0,data[i]) + end for +end if +return 1 +end function +export constant destroy = call_back(routine_id("Destroy")) + +------------------------------------------------------------------------ +export procedure main() +------------------------------------------------------------------------ + gtk_proc("gtk_main") -- start the GTK engine; +end procedure + +--------------------------------------------------------------------------------- +export function events_pending() -- used sometimes when using timeout or eu tasks +--------------------------------------------------------------------------------- + return gtk_func("gtk_events_pending") +end function + +------------------------------------------------------------------------ +export procedure main_iteration() +------------------------------------------------------------------------ + gtk_proc("gtk_main_iteration") +end procedure + +----------------------------------------------------------------------------------- +export procedure main_iteration_do(integer i) -- used sometimes when multi-tasking; +----------------------------------------------------------------------------------- + gtk_proc("gtk_main_iteration_do",{I},i) +end procedure + +without warning {not_reached} + ------------------------------------------------------------------------ + export function Quit(atom ctl=0, object errcode=0) + ------------------------------------------------------------------------ + abort(errcode) -- kill the GTK engine; + return 0 + end function + export constant main_quit = call_back(routine_id("Quit")) + + global function gtk_main_quit() + abort(0) + return 0 + end function +with warning {not_reached} + +------------------------------------------------------------------------ +-- Following are 4 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="dialog-information", + integer modal=1) + return Dialog(parent,title,pri_txt,sec_txt,btns,image,icon,modal) +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="dialog-warning", + integer modal=1) + return Dialog(parent,title,pri_txt,sec_txt,btns,image,icon,modal) +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="dialog-error", + integer modal=1) + return Dialog(parent,title,pri_txt,sec_txt,btns,image,icon,modal) +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="dialog-question", + integer modal=1) + return Dialog(parent,title,pri_txt,sec_txt,btns,image,icon,modal) +end function + +public function Dialog(object parent=0, object title="dialog", + object pri_txt="", object sec_txt="", + object btns=GTK_BUTTONS_OK, + object image=0, + object icon=0, + integer modal=1) + if modal = -1 then + return NonModalDialog(parent,title,pri_txt,sec_txt,btns,image,icon) + end if + + atom dlg = create(GtkDialog) + + if string(parent) then + parent = get(builder,"object",parent) + end if + + set(dlg,{ + {"transient for",parent}, + {"title",title}, + {"border width",10}, + {"position",GTK_WIN_POS_MOUSE}}) + + if atom(icon) and icon = 0 and parent > 0 then + icon = get(parent,"icon name") + end if + + if atom(icon) and icon > 0 then + set(dlg,"icon",icon) + end if + + if string(icon) then + set(dlg,"icon",icon) + end if + + object ca = get(dlg,"content area") + object panel = create(GtkBox,HORIZONTAL,10) + add(ca,panel) + object left = create(GtkBox,VERTICAL,5) + object right = create(GtkBox,VERTICAL,5) + add(panel,{left,right}) + + if string(image) then + add(left,create(GtkImage,image)) + elsif image > 0 then + if classid(image) = GdkPixbuf then + image = create(GtkImage,image) + end if + add(left,image) + end if + + if atom(modal) and modal > 1 then + atom addon = create(GtkButtonBox,HORIZONTAL) + add(ca,addon) + add(addon,modal) + show_all(addon) + end if + + object lbl1 = create(GtkLabel) + set(lbl1,"markup",text:format("[]\n[]",{pri_txt,sec_txt})) + set(lbl1,"halign",0) + + add(right,lbl1) + + show_all(panel) + + object btn = repeat(0,2) + + switch btns do + case GTK_BUTTONS_NONE then skip() -- do nothing + + case GTK_BUTTONS_OK then + btn[1] = create(GtkButton,"gtk-ok#_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#_Cancel") + btn[2] = create(GtkButton,"gtk-ok#_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#_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-no#_No") + btn[2] = create(GtkButton,"gtk-yes#_Yes") + set(dlg,"add action widget",btn[1],MB_NO) + set(dlg,"add action widget",btn[2],MB_YES) + show(btn[1]) + show(btn[2]) + + case else btn[1] = create(GtkButton,"gtk-ok#_OK") + set(btn[1],"can default",TRUE) + show(btn[1]) + set(dlg,"add action widget",btn[1],MB_OK) + + end switch + + atom result = get(dlg,"run") set(dlg,"destroy") + + 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],"destroy") +return 1 +end function + +-------------------------------------------------------------------------------------------- +export function NonModalDialog(object parent=0, object title="?", + object pri_txt="", object sec_txt="", + object btns=0, + object image="dialog-info", + object icon="dialog-info", + object modal=0) +------------------------------------------------------------------------------------------- +atom dlg = create(GtkWindow) + + integer closedlg = call_back(routine_id("close_dialog")) + + set(dlg,"title",title) + set(dlg,"border width",10) + set(dlg,"position",GTK_WIN_POS_MOUSE) + + if atom(icon) and icon = 0 and parent > 0 then + icon = get(parent,"icon name") + end if + + if atom(icon) and icon > 0 then + set(dlg,"icon",icon) + end if + + if string(icon) then + set(dlg,"icon",icon) + end if + + object panel = create(GtkBox,VERTICAL) + add(dlg,panel) + + object ca = create(GtkBox,HORIZONTAL,10) + add(panel,ca) + + object left = create(GtkBox,VERTICAL,5) + object right = create(GtkBox,VERTICAL,5) + add(ca,{left,right}) + + if atom(modal) and modal > 1 then + if classid(modal) != GtkButtonBox then + atom addon = create(GtkButtonBox,HORIZONTAL) + pack(panel,addon) + add(addon,modal) + else + pack(panel,modal) + end if + end if + + object btnbox = create(GtkButtonBox) + pack(panel,-btnbox) + + if sequence(btns) and not atom(btns[1]) then + 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) + end if + + label "images" + if string(image) then + add(left,create(GtkImage,image)) + elsif image > 0 then + if classid(image) = GdkPixbuf then + image = create(GtkImage,image) + end if + add(left,image) + end if + + object lbl1 = create(GtkLabel) + set(lbl1,"markup",text:format("[]\n[]",{pri_txt,sec_txt})) + set(lbl1,"halign",0) + + add(right,lbl1) + + show_all(dlg) + +return 0 +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 +-- generated by define_c_func or eu_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 the ancestor is initialized (if necessary). + +-- This scheme means that program startup isn't delayed as it would be +-- if all widgets and methods were to be initialized first, most of which +-- would likely not be used in any given program. + +------------------------------------------------------------------------ +global procedure init(integer class) +------------------------------------------------------------------------ +object name, params, retval + + ifdef INIT 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] + + for i = 1 to length(params) do + switch params[i] do + case A then params[i] = P + case D then + if equal("get_range",widget[class][method][NAME]) then + params[i] = P + end if + case F then + if class = GtkAspectFrame then -- do nothing + else switch widget[class][method][NAME] do + case "add_mark","set_fraction","set_alignment" then + skip() -- do nothing + case else params[i] = P + end switch + end if + case else -- do nothing + end switch + end for + + 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("\tCLASS:[] METHOD:[] 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 invalid! + display("\tINIT ERROR: CLASS:[] METHOD: [] ERR:[]", + {widget[class][$],widget[class][method][NAME],widget[class][method][VECTOR]}) + end if + end ifdef + + end for + +end procedure /*init*/ + +procedure skip() +end procedure + +export object registry = {} +------------------------------------------------------------------------ +-- 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 +-- widget{} structure. +--------------------------------------------------------------------------------------------- +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, + -- update it in case handle has been recycled. + ifdef REG_DUP then + display("Note: [] [] handle [] [] already registered to []", + {name,widget[class][$],handle,registry[x][3]}) + end ifdef + 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 + printf(1,text:format("Registry + [3:20]\thandle: [1:10>]\tname: [4] [5]\n",registry[$])) + end ifdef + +return 1 +end function /*register*/ + +--------------------------------------- +procedure deregister(atom handle) +--------------------------------------- +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 + +-- Returns an integer corresponding with a enumerated widget class; +------------------------------------------------------------------------ +public function classid(object handle) +------------------------------------------------------------------------ + return vlookup(handle,registry,1,2,-1) +end function + +-- returns classname as a string (e.g. "GtkWindow") for a given handle; +------------------------------------------------------------------------ +public function classname(atom handle) +------------------------------------------------------------------------ + return vlookup(handle,registry,1,3,"?") +end function + +-- returns name of object from registry +------------------------------------------------------------------------ +public function objectname(atom handle) +------------------------------------------------------------------------ + return vlookup(handle,registry,1,4,"?") +end function + +-- returns handle (pointer) to object given name or namespace:name: +------------------------------------------------------------------------ +public function pointer(object name) +------------------------------------------------------------------------ +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 found in this class; + 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 + 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 + ifdef LOOKUP then display("\t []",{method[1]}) end ifdef + return method + end if + + end for + + return -1 +end function /*lookup*/ + +----------------------------------------------------------------------------- +public function connect(object ctl, object sig, object fn=0, object data=0, + atom closure=0, integer flags=0) +----------------------------------------------------------------------------- +-- tells control to call fn, sending data along for the ride, +-- whenever that control gets the signal 'sig' + + if string(ctl) then ctl = pointer(ctl) end if -- convert name to pointer + + if atom(fn) and fn = 0 then -- no point in calling null functions! + return 0 + end if + + if string(fn) then -- if interpreted, can call functions by name if in scope. + + ifdef COMPILE then -- do compile test if requested; + display("Connecting [] Signal '[]' Data []",{classname(ctl),sig,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 + + atom rid = routine_id(fn) + if rid > 0 then -- named func 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}) + end if + + end if + + sig = allocate_string(sig) + + if integer(data) then -- can be attached directly; + return gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags}) + end if + + if atom(data) then + data = prepend({data},"ATOM") -- must be serialized and unpacked later; + data = allocate_wstring(serialize(data)+1) + return gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags}) + end if + + if string(data) then + data = prepend({data},"STR") -- must be serialized and unpacked later; + data = allocate_wstring(serialize(data)+1) + return gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags}) + end if + + if sequence(data) then + data = prepend(data,"SEQ")-- must be serialized and unpacked later; + data = allocate_wstring(serialize(data)+1) + return gtk_func("g_signal_connect_data",{P,S,P,P,I,I},{ctl,sig,fn,data,closure,flags}) + end if + +end function /*connect*/ + +------------------------------------------------------------------------ +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 + +------------------------------------------------------------------------ +-- following 3 'decode' 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[]\n\tCall: []->[]\n\tParams: []\n\tReturn type: []\n\tVector: []",z) +end function + +---------------------------------------------------------------- +export function valid_icon(object list) +---------------------------------------------------------------- +-- check a list of possible icon names, +-- return an image made from first one that is valid +object result = 0 +for i = 1 to length(list) do + result = get_icon_image(list[i]) + if result > 0 then return result end if +end for +return result +end function + +--------------------------------------------------------------- +export function valid_icon_name(object list) +--------------------------------------------------------------- +-- check a list of possible icon names, return name of first valid +for i = 1 to length(list) do + --display("Checking []",{list[i]}) + if valid_icon({list[i]}) > 0 then + return list[i] + end if +end for +return "gtk-missing-image" +end function + +------------------------------------------------------------------------ +function get_icon_image(object icon, integer size=6) +------------------------------------------------------------------------ +-- get image from a variety of sources; +atom img = 0, ani = 0, default_theme + + if string(icon) then + if find(icon,stock_list) then + img = gtk_func("gtk_image_new_from_stock",{P,I}, + {allocate_string(icon),size}) + return img + end if + end if + + if to_number(icon) > 0 then + icon = gtk_func("gdk_pixbuf_scale_simple",{P,I,I,I},{to_number(icon),30,30,GDK_INTERP_BILINEAR}) + img = create(GtkImage) + set(img,"from pixbuf",icon) + return img + end if + + img = 0 + default_theme = gtk_func("gtk_icon_theme_get_default",{}) + if gtk_func("gtk_icon_theme_has_icon",{P,P}, + {default_theme,allocate_string(icon)}) then + img = gtk_func("gtk_image_new_from_icon_name",{P,P}, + {allocate_string(icon),size}) + return img + end if + + img = 0 + icon = canonical_path(icon) + if file_exists(icon) then -- image from file + size *= 6 + img = create(GtkImage) + ani = create(GdkPixbufAnimation,icon) + if gtk_func("gdk_pixbuf_animation_is_static_image",{P},{ani}) then + ani = create(GdkPixbuf,icon,size,size) + set(img,"from pixbuf",ani) + else + set(img,"from animation",ani) + end if + return img + end if + +return -1 +end function + +------------------------------------------------------------------------ +public function to_sequence(atom glist, integer fmt=0) -- mostly internal +------------------------------------------------------------------------ +-- 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)) + ifdef TOSEQ then display(s) end ifdef + 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 + +------------------------------------------------------------------------ +-- Color handling routines - most are used internally +------------------------------------------------------------------------ + +---------------------------------------- +export function to_rgba(object color) +---------------------------------------- +-- converts a color description to rgba ptr; + atom rgba = allocate(32) + object c = color + if string(c) then c = allocate_string(c) end if + if gtk_func("gdk_rgba_parse",{P,P},{rgba,c}) then + return rgba + else + printf(1,"Error: invalid color '%s'\n******",{color}) + end if +return rgba +end function + +---------------------------------------------------- +export function from_rgba(object rgba, object fmt=0) +---------------------------------------------------- +-- converts rgba ptr to usable 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 usable formats - this can be used by the +-- programmer, refer to ~/demos/documentation/HowItWorks.html#colors + 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 + +------------------------------------------------------------------------ +-- METHOD DECLARATIONS: +------------------------------------------------------------------------ + +sequence initialized = repeat(0,1000) +-- 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. + +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 list below need not be in any specific order. +-- Widget names must also be added to the list in GtkEnums +------------------------------------------------------------------------ +sequence stock_list = create(GtkStockList) + +widget[GObject] = {"g_object", +{0}, -- {list of ancestors} + {"new",{I,S,S,I},P}, -- method,{formal params},return type + {"set",{P,S,P,P}}, + {"set_property",{P,S,P},-routine_id("setProperty")}, + {"get_property",{P,S},-routine_id("getProperty")}, + {"get_data",{P,S},S}, + {"set_data",{P,S,S}}, + {"set_data_full",{P,S,S,P}}, + {"steal_data",{P,S},P}, +"GObject"} -- human-readable name + + constant + fn1 = define_proc("g_object_get",{P,S,P,P}), + doubles = {"angle","climb-rate","fraction","max-value","min-value", + "scale","value","pulse-step","scale","size-points","text-xalign", + "text-yalign","xalign","yalign"} + + function setProperty(object handle, object a, object b) + -------------------------------------------------------------- + ifdef OBJ then + display("Handle []",handle) + display("Prop []",{a}) + display("Value []",b) + end ifdef + if find(a,doubles) then + if string(a) then a = allocate_string(a) end if + if string(b) then b = allocate_string(b) end if + gtk_proc("g_object_set",{P,P,D,P},{handle,a,b,0}) + else + if string(a) then a = allocate_string(a) end if + if string(b) then b = allocate_string(b) end if + gtk_proc("g_object_set",{P,P,P,P},{handle,a,b,0}) + end if + return 1 + end function + + function getProperty(atom handle, object p) + -------------------------------------------------- + atom x = allocate(32) + if string(p) then p = allocate_string(p) end if + c_proc(fn1,{handle,p,x,0}) + object result = peek4u(x) + free(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},P,0,GSList}, + {"iter_list_regions",{P,I},P,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_get_state",{P,I},I}, -- GTK3.14 + {"iter_set_state",{P,I,I}}, -- GTK3.14 + {"length",{P},I}, + {"prepend_type",{P,I}}, + {"to_string",{P},S}, +"GtkWidgetPath"} + +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("setFont")}, + {"set_color",{P,P},-routine_id("setFg")}, + {"set_foreground",{P,P},-routine_id("setFg")}, + {"set_background",{P,P},-routine_id("setBg")}, +-- only use following 2 versions when you need to change the color +-- of a control in a state other than normal; + {"override_background_color",{P,I,P},-routine_id("overrideBg")}, + {"override_color",{P,I,P},-routine_id("overrideFg")}, + {"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,I,I}}, + {"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},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_compositied",{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("getWidgetAllocation")}, + {"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_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 + {"signal",{P,P,P,P,P,P},-routine_id("connect")}, +"GtkWidget"} + + function getWidgetAllocation(atom obj) + atom al = allocate(4*4) + gtk_func("gtk_widget_get_allocation",{P,P},{obj,al}) + integer x,y,w,h + {x,y,w,h} = peek4u({al,4}) + free(al) + return {x,y,w,h} + 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", instead of + -- as a pango font description object; + function setFont(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 setFg(atom x, object c) + -------------------------------- + return overrideFg(x,0,c) + end function + + function setBg(atom x, object c) + -------------------------------- + return overrideBg(x,0,c) + end function + + function overrideFg(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 overrideBg(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[GtkAccessible] = {"gtk_accessible", +{GObject}, + {"set_widget",{P,P}}, + {"get_widget",{P},P,0,GtkWidget}, +"GtkAccessible"} + +widget[GtkActivatable] = {"gtk_activatable", +{GObject}, +"GtkActivatable"} + +widget[GActionGroup] = {"g_action_group", +{0}, +"GActionGroup"} + +widget[GtkContainer] = {"gtk_container", +{GtkWidget,GtkBuildable,GObject}, + {"add",{P,P}}, + {"remove",{P,P}}, + {"check_resize",{P}}, + {"foreach",{P,P,P}}, + {"get_children",{P},P,0,GList}, + {"get_path_for_child",{P,P},P}, + {"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_width",{P,I}}, + {"get_border_width",{P},I}, +"GtkContainer"} + +widget[GdkKeymap] = {"gdk_keymap", +{GObject}, + {"new",{},-routine_id("newKeymap")}, + {"get_default",{},-routine_id("newKeymap")}, + {"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}, +"GdkKeymap"} + + function newKeymap(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[GdkKeyval] = {"gdk_keyval", +{GdkKeymap,GObject}, + {"name",{I},S}, + {"from_name",{S},I}, + {"to_unicode",{I},I}, +"GdkKeyval"} + +widget[GtkBin] = {"gtk_bin", +{GtkContainer,GtkWidget,GtkBuildable,GObject}, + {"get_child",{P},P}, +"GtkBin"} + +widget[GtkModelButton] = {"gtk_model_button", -- new in 3.16 +{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GtkActivatable,GObject}, + {"new",{},P}, +"GtkModelButton"} + +widget[GtkButton] = {"gtk_button", +{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GtkActivatable,GObject}, + {"new",{P},-routine_id("newBtn")}, + {"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}}, + {"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 newBtn(object cap = 0) + --------------------------------------------------------------- + -- handles creation of buttons with icons from various sources; + -- this function modified greatly from earlier versions + --------------------------------------------------------------- + atom btn + object tmp, icon, title + atom child + + if atom(cap) and cap = 0 then + return gtk_func("gtk_button_new",{}) + end if + + if string(cap) then + + if match("#",cap) > 0 then + tmp = split(cap,'#') + icon = get_icon_image(tmp[1],GTK_ICON_SIZE_BUTTON) + title = tmp[2] + btn = gtk_func("gtk_button_new_with_mnemonic",{P},{title}) + register(btn,GtkButton) + if icon > 0 then + set(btn,"image",icon) + set(btn,"always show image",TRUE) + end if + return btn + end if + + if match("gtk-",cap) then + btn = gtk_func("gtk_button_new_with_mnemonic",{P}, + {allocate_string('_'&proper(cap[5..$]))}) + register(btn,GtkButton) + icon = get_icon_image(cap,GTK_ICON_SIZE_BUTTON) + if icon > 0 then set(btn,"image",icon) end if + set(btn,"always show image",TRUE) + return btn + end if + + btn = gtk_func("gtk_button_new_with_mnemonic",{P},{allocate_string(cap)}) + register(btn,GtkButton) + return btn + + else + + btn = gtk_func("gtk_button_new") + register(btn,GtkButton) + return btn + + end if + + return btn + end function + +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}, -- GTK 3.12.1 + {"set_center_widget",{P,P}}, -- GTK 3.12.1 +"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},P,0,GList}, + {"get_current_grab",{P},P,0,GtkWidget}, + {"get_current_grab_device",{P,P},P,0,GtkWidget}, +"GtkWindowGroup"} + +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_default",{P,P}}, + {"set_default_size",{P,I,I}}, + {"get_default_size",{P,I,I}}, + {"set_position",{P,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},P,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},P,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}, -- 3.16 + {"set_icon",{P,P},-routine_id("setWinIcon")}, + {"restore",{P},-routine_id("restoreWin")}, + {"close",{P}}, -- 3.10 + {"set_opacity",{P,D}}, + {"is_maximized",{P},B}, -- 3.12 + {"set_interactive_debugging",{B}}, -- 3.14 + {"get_application",{P},P,0,GtkApplication}, +"GtkWindow"} + + -- this replaces a handy but deprecated GTK function which + -- restores a window to its original size after being resized + -- to fit larger contents; + function restoreWin(atom win) + ----------------------------- + + set(win,"hide") + set(win,"unrealize") + set(win,"show") + return 1 + end function + + -- manages the creation of window icon from a variety of + -- source formats; makes life simpler for the programmer. + function setWinIcon(object win, object icon) + -------------------------------------------- + object path + + if string(icon) then + path = canonical_path(icon) + if file_exists(path) then + gtk_proc("gtk_window_set_icon_from_file",{P,P}, + {win,allocate_string(path)}) + return 1 + else + gtk_proc("gtk_window_set_icon_name",{P,P}, + {win,allocate_string(icon)}) + return 1 + end if + end if + + if atom(icon) then + if classid(icon) = GtkImage then + icon = get(icon,"pixbuf") + end if + if classid(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}, + {"set_text",{P,S}}, + {"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}, + {"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"} + +widget[GtkImage] = {"gtk_image", +{GtkMisc,GtkWidget,GtkBuildable,GObject}, + {"new",{P,I,I,I},-routine_id("newImage")}, + {"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}, + {"get_animation",{P},P,0,GdkPixbufAnimation}, + {"get_storage_type",{P},I}, + {"get_icon_name",{P},-routine_id("getIconName")}, + {"get_icon_size",{P},-routine_id("getIconSize")}, +"GtkImage"} + + -- create an image from a variety of source formats + function newImage(object icon=0, integer size=6, integer h, integer w) + ------------------------------------------------------------- + atom img = 0 + IconTheme theme = create(GtkIconTheme) + atom err = allocate(32) + err = 0 + + if atom(icon) and icon = 0 then -- blank image + return gtk_func("gtk_image_new") + end if + + if size = 0 then size = 6 end if + if size > 6 then -- load icon from theme, sized + img = gtk_func("gtk_icon_theme_load_icon",{P,S,I,I,P}, + {theme,icon,size,GTK_ICON_LOOKUP_USE_BUILTIN,err}) + return gtk_func("gtk_image_new_from_pixbuf",{P},{img}) + end if + + if string(icon) then + if begins("gtk-",icon) then -- from stock (deprecated) + return gtk_func("gtk_image_new_from_icon_name",{P,I}, + {allocate_string(icon),size}) + end if + + if file_exists(canonical_path(icon)) then -- from file + if size+h+w < 7 then + return gtk_func("gtk_image_new_from_file",{P}, + {allocate_string(canonical_path(icon))}) + else + img = newPixbuf(icon,size,h,w) + return gtk_func("gtk_image_new_from_pixbuf",{P},{img}) + end if + end if + + + return gtk_func("gtk_image_new_from_icon_name",{P,I},{icon,size}) + + end if + + switch classid(icon) do + case GdkPixbuf then + img = gtk_func("gtk_image_new_from_pixbuf",{P},{icon}) + case GIcon then + img = gtk_func("gtk_image_new_from_gicon",{P,I},{icon,size}) + case CairoSurface_t then + img = gtk_func("gtk_image_new_from_surface",{P},{icon}) + case else -- no conversion needed + end switch + + return img + end function + + + constant fnImageInfo = define_proc("gtk_image_get_icon_name",{P,P,P}) + + function getIconName(atom img) + ------------------------------ + atom name = allocate(32), size = allocate(32) + c_proc(fnImageInfo,{img,name,size}) + name = peek4u(name) + if name > 0 then + return peek_string(name) + else return "?" + end if + end function + + function getIconSize(atom img) + ------------------------------ + atom name = allocate(32), size = allocate(32) + c_proc(fnImageInfo,{img,name,size}) + return peek4u(size) + end function + +widget[GdkCursor] = {"gdk_cursor", +{GObject}, + {"new",{P,P,I,I},-routine_id("newCur")}, + {"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 newCur(object a, object b=0, integer c=0, integer d=0) + --------------------------------------------------------------- + if string(b) then + return gtk_func("gdk_cursor_new_from_name",{P,S}, + {a,allocate_string(b)}) + end if + if classid(b) = GdkPixbuf then + return gtk_func("gdk_cursor_new_from_pixbuf",{P,P,I,I},{a,b,c,d}) + end if + if classid(b) = CairoSurface_t then + return gtk_func("gdk_cursor_new_from_surface",{P,P,D,D},{a,b,c,d}) + end if + if classid(a) = GdkDisplay then + return gtk_func("gdk_cursor_new_for_display",{P,I},{a,b}) + end if + return gtk_func("gdk_cursor_new",{I},{a}) + end function + +widget[GdkWindow] = {"gdk_window", +{GObject}, + {"new",{P,P,P},P}, + {"set_title",{P,S}}, + {"destroy",{P}}, + {"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}, + {"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}}, + {"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,I,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}}, + {"get_visible_region",{P},P,0,CairoRegion_t}, + {"set_invalidate_handler",{P,I}}, + {"invalidate_rect",{P,P,B}}, + {"invalidate_region",{P,P,B}}, + {"invalidate_maybe_recurse",{P,P,I,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}, +"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",{P,I,I,I,I,I,P,P},P,0,GdkPixbuf}, + {"save",{P,P,P,P},-routine_id("savePixbuf")}, +"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) err = 0 + atom fn, fx + object path, pix + + if string(name) then + path = canonical_path(name) + if file_exists(path) then + path = allocate_string(path) + goto "build" + end if + + if has_icon(name) then + path = icon_info(name) + path = allocate_string(path[3]) + goto "build" + else return 0 + end if + end if -- string name; + + label "build" + + if h = 0 and w = 0 then -- return at original size; + return 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 + return gtk_func("gdk_pixbuf_new_from_file_at_scale",{P,I,I,B,P}, + {path,w,h,ratio,err}) + end if + + return 0 + end function + + -- save a pixbuf in various formats based on file extension(.png, .jpg, etc) + function savePixbuf(atom handle, object fn, object ft, object params = 0) + ------------------------------------------------------------------------- + fn = allocate_string(fn) + ft = allocate_string(ft) + if string(params) then + params = split(params,'=') + for i = 1 to length(params) do + params[i] = allocate_string(params[i]) + end for + end if + + atom err = allocate(16) 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 + +widget[GtkDialog] = {"gtk_dialog", +{GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject}, + {"new",{},P}, + {"run",{P},I}, + {"response",{P,I}}, + {"add_button",{P,S,I},P,0,GtkWidget}, + {"get_action_area",{P},P,0,GtkBox}, -- Deprecated 3.12 + {"add_action_widget",{P,P,I}}, + {"get_content_area",{P},P,0,GtkBox}, + {"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,GtkWidget},-- 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,GtkWidget}, +"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[GtkEntry] = {"gtk_entry", +{GtkWidget,GtkEditable,GtkCellEditable,GtkBuildable,GObject}, + {"new",{},P}, + {"get_buffer",{P},P,0,GtkEntryBuffer}, + {"set_buffer",{P,P}}, + {"set_text",{P,S}}, + {"get_text",{P},S}, + {"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}, + {"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_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"} + +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},D}, + {"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("newSpinBtn")}, +"GtkSpinButton"} + + constant + newsb1 = define_func("gtk_spin_button_new",{P,D,I},P), + newsb2 = define_func("gtk_spin_button_new_with_range",{D,D,D},P) + + -- create a spin button from an ajustment object or from a range of values + function newSpinBtn(atom a, atom b, atom c) + ------------------------------------------- + atom sb = 0 + if classid(a) = GtkAdjustment then + sb = c_func(newsb1,{a,b,c}) + else + sb = c_func(newsb2,{a,b,c}) + end if + return sb + 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 orient = 0 and min = 0 and max = 0 and step = 0 then + return gtk_func("gtk_scale_new",{I,P},{0,0}) + end if + if classid(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")}, +"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}, + {"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[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}, +"GFile"} + + -- create a GFile from a path or uri + function newGFile(object s) + --------------------------- + if file_exists(canonical_path(s)) then + return gtk_func("g_file_new_for_path",{S},{canonical_path(s)}) + else + return gtk_func("g_file_new_for_uri",{S},{s}) + 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}, +"GIcon"} + +widget[GFileIcon] = {"g_file_icon", +{GIcon,GObject}, + {"new",{P},P}, + {"get_file",{P},P}, +"GFileIcon"} + +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 + return x + end function + +widget[GSList] = {"g_slist", +{GObject}, +"GSList"} + +widget[GdkDisplay] = {"gdk_display", +{GObject}, + {"new",{},-routine_id("getDisplay")}, + {"open",{S},P,0,GdkDisplay}, + {"get_default",{},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}, + {"pointer_ungrab",{P,I}}, + {"pointer_is_grabbed",{P},B}, + {"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}}, + {"get_pointer",{P,S,I,I,I}}, + {"list_devices",{P},P,0,GList}, + {"get_window_at_pointer",{P,I,I},P,0,GdkWindow}, + {"warp_pointer",{P,S,I,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}, + {"get_app_launch_context",{P},P,0,GtkAppLaunchContext}, + {"notify_startup_complete",{P,S}}, +"GdkDisplay"} + + function getDisplay() + --------------------- + return gtk_func("gdk_display_get_default",{}) + end function + +widget[GdkDevice] = {"gdk_device", +{GObject}, + {"get_position",{P,P,I,I}}, +"GdkDevice"} + +widget[GdkScreen] = {"gdk_screen", +{GdkDevice,GObject}, + {"new",{},-routine_id("getDefScrn")}, + {"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 getDefScrn() + --------------------- + 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}, + {"get_display",{P},P,0,GdkDisplay}, + {"list_devices",{P,I},P,0,GList}, + {"get_client_pointer",{P},P,0,GdkDevice}, +"GdkDeviceManager"} + +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[GtkApplication] = {"gtk_application", +{GObject}, + {"new",{S,I},-routine_id("newApp")}, + {"add_window",{P,P}}, + {"remove_window",{P,P}}, + {"get_windows",{P},P,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("appRun")}, + {"activate",{P},-routine_id("appActivate")}, + {"get_accels_for_action",{P,S},P,0,GSList}, -- 3.12 + {"set_accels_for_action",{P,S,S}}, + {"list_action_descriptions",{P},P,0,GSList}, + {"get_actions_for_accel",{P,S},P}, -- 3.14 + {"get_menu_by_id",{P,S},P,0,GMenu}, -- 3.14 + {"prefers_app_menu",{},B}, -- 3.14 +"GtkApplication"} + + function appValid(object x) + --------------------------- + return gtk_func("g_application_id_is_valid",{S},{x}) + end function + + function appActivate(object x) + ------------------------------ + gtk_proc("g_application_activate",{P},{x}) + return 1 + end function + + function appRun(object x) + ------------------------- + gtk_proc("g_application_run",{P,I,P},{x,0,0}) + return 1 + end function + + function newApp(object id, object flags) + ---------------------------------------- + if string(id) then id = allocate_string(id) end if + if appValid(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}, + {"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"} + +widget[GtkAppLaunchContext] = {"gtk_app_launch_context", +{0}, +"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}}, +"GtkAssistant"} + +widget[GtkDrag] = {"gtk_drag", + {"cancel",{P}}, +"GtkDrag"} + +widget[GtkCssProvider] = {"gtk_css_provider", +{GObject}, + {"new",{P},-routine_id("newProvider")}, + {"get_default",{},P,0,GtkCssProvider}, + {"get_named",{S,S},P,0,GtkCssProvider}, + {"load_from_data",{P,S,I,P},B}, + {"load_from_string",{P,P},-routine_id("addCssfromString")}, + {"load_from_file",{P,P,P},B}, + {"load_from_path",{P,S,P},B}, + {"load_from_resource",{P,S}}, -- 3.16 + {"to_string",{P},S}, +"GtkCssProvider"} + + function newProvider(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) err = 0 + register(provider,GtkCssProvider) + if atom(name) then + set(style,"add provider for screen",screen,provider,800) + return provider + end if + if get(provider,"load from path",canonical_path(name),err) then + set(style,"add provider for screen",screen,provider,800) + else + printf(1,"Error finding or parsing css %s \n",{name}) + end if + return provider + end function + + function addCssfromString(atom provider, object str) + display("Pro [] str []",{provider,str}) + return gtk_func("gtk_css_provider_load_from_data",{P,P,I,P}, + {provider,allocate_string(str),length(str),0}) + end function + +widget[GtkCssSection] = {"gtk_css_section", +{GObject}, + {"get_end_line",{P},I}, + {"get_end_position",{P},I}, + {"get_file",{P},P}, + {"get_parent",{P},P,0,GtkCssSection}, + {"get_section_type",{P},I}, + {"get_start_line",{P},I}, + {"get_start_position",{P},I}, + {"ref",{P},P,0,GtkCssSection}, + {"unref",{P}}, +"GtkCssSection"} + +widget[GtkStatusIcon] = {"gtk_status_icon", -- Deprecated 3.14 +{GObject}, + {"new",{},P}, + {"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("StatIconPosMenu")}, +"GtkStatusIcon"} + + constant sipm = define_proc("gtk_status_icon_position_menu",{P,I,I,I,P}) + + function StatIconPosMenu(atom stat, atom menu, integer x, integer y, integer p) + display("Stat [] Menu []",{stat,menu}) + c_proc(sipm,{menu,x,y,p,stat}) + 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[GtkAlignment] = {"gtk_alignment", -- deprecated 3.14 +{GtkBin,GtkContainer,GtkWidget,GtkBuildable,GObject}, + {"new",{F,F,F,F},P}, + {"set",{P,F,F,F,F}}, + {"set_padding",{P,I,I,I,I}}, + {"get_padding",{P,I,I,I,I}}, +"GtkAlignment"} + +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}}, + {"get_active_id",{P},S}, + {"set_model",{P,P}}, + {"get_model",{P},P,0,GtkTreeModel}, + {"popup_for_device",{P,P}}, + {"popup",{P}}, + {"popdown",{P}}, + {"get_popup_accessible",{P},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("setActivatesDefault")}, +"GtkComboBox"} + + function setActivatesDefault(atom box, boolean z) + atom x = get(box,"child") + register(x,GtkEntry) + set(x,"property","activates-default",z) + return 1 + end function + + -- 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 classid(x) = GtkListStore then + return gtk_func("gtk_combo_box_new_with_model",{P},{x}) + end if + end function + +widget[GtkComboBoxText] = {"gtk_combo_box_text", +{GtkComboBox,GtkBin,GtkContainer,GtkWidget,GtkCellLayout,GtkCellEditable,GtkBuildable,GObject}, + {"new",{},P}, + {"new_with_entry",{},P}, + {"append",{P,P},-routine_id("appComboBoxText")}, + {"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}, + {"get_entry",{P},-routine_id("getComboEntry")}, +"GtkComboBoxText"} + + function getComboEntry(atom box) + atom x = get(box,"child") + register(x,GtkEntry) + return x + end function + + constant cbtadd = define_proc("gtk_combo_box_text_append",{P,P,P}) + + function appComboBoxText(object box, object txt) + if string(txt[1]) then + for i = 1 to length(txt) do + txt[i] = allocate_string(txt[i]) + c_proc(cbtadd,{box,txt[i],txt[i]}) + end for + else + c_proc(cbtadd,{box,allocate_string(txt)}) + end if + return 1 + end function + +widget[GtkComboBoxEntry] = {"gtk_combo_box_text", +{GtkComboBoxText,GtkComboBox,GtkBin,GtkContainer,GtkWidget,GObject}, + {"new",{},-routine_id("newComboBoxEntry")}, +"GtkComboBoxEntry"} + + function newComboBoxEntry() + --------------------------- + 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[GtkToggleButton] = {"gtk_toggle_button", +{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GtkActivatable,GObject}, + {"new",{P},-routine_id("newToggleBtn")}, + {"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"} + + -- handles creation of buttons with icons from various sources; + -- this function modified greatly from GTK versions prior to 10 + function newToggleBtn(object cap = 0) + --------------------------------------------------------------- + atom btn = 0, img = 0 + + if atom(cap) and cap = 0 then -- return a blank button; + return gtk_func("gtk_toggle_button_new") + end if + + object icon = 0, title = 0, tmp + if string(cap) then + if match("#",cap) then + tmp = split(cap,'#') + icon = tmp[1] + title = tmp[2] + else + icon = cap + title = cap + end if + end if + + btn = gtk_func("gtk_toggle_button_new_with_mnemonic",{P}, + {allocate_string(title)}) + + img = get_icon_image(icon,3) + if img > 0 then + title = allocate_string(title) + gtk_proc("gtk_button_set_image",{P,P},{btn,img}) + gtk_proc("gtk_button_set_label",{P,P},{btn,title}) + end if + + return btn + end function + +widget[GtkCheckButton] = {"gtk_check_button", +{GtkToggleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GtkActivatable,GObject}, + {"new",{P},-routine_id("newCheckBtn")}, + {"new_with_label",{S},P,0,GtkWidget}, + {"new_with_mnemonic",{S},P,0,GtkWidget}, +"GtkCheckButton"} + + function newCheckBtn(object cap = 0) +--------------------------------------------------------------- + atom btn = 0, img = 0 + + if atom(cap) and cap = 0 then -- return a blank button; + return gtk_func("gtk_check_button_new") + end if + + object icon = 0, title = 0, tmp + if string(cap) then + if match("#",cap) then + tmp = split(cap,'#') + icon = tmp[1] + title = tmp[2] + else + icon = cap + title = cap + end if + end if + + btn = gtk_func("gtk_check_button_new_with_mnemonic",{P}, + {allocate_string(title)}) + + img = get_icon_image(icon,GTK_ICON_SIZE_SMALL_TOOLBAR) + if img > 0 then + title = allocate_string(title) + gtk_proc("gtk_button_set_image",{P,P},{btn,img}) + gtk_proc("gtk_button_set_label",{P,P},{btn,title}) + end if + + return btn + end function + +widget[GtkRadioButton] = {"gtk_radio_button", +{GtkCheckButton,GtkToggleButton,GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActionable,GtkActivatable,GObject}, + {"new",{P,P},-routine_id("newRadioBtn")}, + {"set_group",{P,P}}, + {"get_group",{P},P,0,GSList}, + {"join_group",{P,P}}, +"GtkRadioButton"} + + function newRadioBtn(atom group, object cap = 0) +--------------------------------------------------------------- + atom btn = 0, img = 0 + + if atom(cap) and cap = 0 then -- return a blank button; + return gtk_func("gtk_radio_button_new_from_widget",{P},{group}) + end if + + object icon = 0, title = 0, tmp + if string(cap) then + if match("#",cap) then + tmp = split(cap,'#') + icon = tmp[1] + title = tmp[2] + else + icon = cap + title = cap + end if + end if + + btn = gtk_func("gtk_radio_button_new_with_mnemonic_from_widget",{P,P}, + {group,allocate_string(title)}) + + img = get_icon_image(icon,GTK_ICON_SIZE_BUTTON) + if img > 0 then + title = allocate_string(title) + gtk_proc("gtk_button_set_image",{P,P},{btn,img}) + gtk_proc("gtk_button_set_label",{P,P},{btn,title}) + end if + + return btn + end function + +widget[GtkColorButton] = {"gtk_color_button", +{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkColorChooser,GtkActionable,GtkActivatable,GObject}, + {"new",{P},-routine_id("new_color_button")}, + {"set_title",{P,S}}, + {"get_title",{P},S}, +"GtkColorButton"} + + function new_color_button(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", +{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkFontChooser,GtkActionable,GtkActivatable,GtkBuildable,GObject}, + {"new",{P,P,P},-routine_id("new_font_button")}, + {"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 new_font_button(object f=0, object fn=0, object data=0) + if string(f) then f = allocate_string(f) 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,GtkActivatable,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,GtkActivatable,GObject}, + {"new",{P},P}, + {"set_permission",{P,P}}, + {"get_permission",{P},P}, +"GtkLockButton"} + +widget[GtkScaleButton] = {"gtk_scale_button", +{GtkButton,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkActionable,GtkActivatable,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,GtkWidget}, + {"get_minus_button",{P},P,0,GtkWidget}, + {"set_icons",{P,P},-routine_id("setScaleButtonIcons")}, +"GtkScaleButton"} + + function setScaleButtonIcons(atom btn, object icons) + ---------------------------------------------------- + gtk_proc("gtk_scale_button_set_icons",{P,P}, + {btn,allocate_string_pointer_array(icons)}) + return 1 + end function + +widget[GtkMenu] = {"gtk_menu", +{GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GObject}, + {"new",{},P}, + {"new_from_model",{P},P}, + {"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,GSList}, + {"detach",{P}}, + {"popup",{P,P,P,P,P,I,I}}, + {"popdown",{P}}, + {"reposition",{P}}, + {"set_active",{P,I}}, + {"get_active",{P},P,0,GtkWidget}, + {"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}}, +"GtkMenu"} + +widget[GtkMenuBar] = {"gtk_menu_bar", +{GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GObject}, + {"new",{},P}, + {"new_from_model",{P},P}, + {"set_pack_direction",{P,I}}, + {"get_pack_direction",{P},I}, + {"set_child_pack_direction",{P,I}}, + {"get_child_pack_direction",{P},I}, +"GtkMenuBar"} + +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,GtkActivatable,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,GtkActivatable,GtkActionable,GObject}, + {"new",{P,P,P,P},-routine_id("newMenuItem")}, + {"new_with_label",{S},P}, + {"new_with_mnemonic",{S},P}, + {"set_label",{P,S},-routine_id("setMenuItemLabel")}, + {"get_label",{P},-routine_id("getMenuItemLabel")}, + {"set_image",{P,P},-routine_id("setMenuItemImage")}, + {"get_image",{P},-routine_id("getMenuItemImage")}, + {"set_use_underline",{P,B},-routine_id("setMenuItemUseUnderline")}, + {"get_use_underline",{P},-routine_id("getMenuItemUseUnderline")}, + {"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("addMenuAccel")}, +"GtkMenuItem"} + + function addMenuAccel(atom item, object accels, object img = 0) + atom x = allocate(8) + integer key, mods + + object child = get(item,"child") + + if atom(img) and img = 0 then + -- do nothing + else + img = get_icon_image(img,4) + 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,allocate_string("activate"),accels[1],key,mods,GTK_ACCEL_VISIBLE}) + + if classid(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,"layout",GTK_BUTTONBOX_START) + + if img > 0 then + add(box,img) + register(img,GtkImage) + set(box,"child non_homogeneous",img,TRUE) + end if + + register(child,GtkAccelLabel) + add(box,child) -- put the label back + set(box,"child non_homogeneous",child,TRUE) + + 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,"font","italic 10") + set(acc,"text",txt) + add(box,acc) + set(box,"child secondary",acc,TRUE) + set(box,"child non_homogeneous",acc,TRUE) + end if + end if + + add(item,box) + + free(x) + + return item + end function + + ------------------------------------------------------------------------------- + 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)}) + register(item,GtkRadioMenuItem) + + if atom(img) and img = 0 then + item = addMenuAccel(item,accels) + else + item = addMenuAccel(item,accels,img) + end if + + return item + end function + + function setMenuItemLabel(atom item, object lbl) + if string(lbl) then lbl = allocate_string(lbl) end if + atom b = get(item,"child") + object l = get(b,"children") + l = to_sequence(l,1) + for i = 1 to length(l) do + if classid(l[i]) = GtkAccelLabel then + gtk_proc("gtk_label_set_text",{P,P},{l[i],lbl}) + return 1 + end if + end for + return 1 + end function + + function getMenuItemLabel(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 classid(l[i]) = GtkAccelLabel then + return gtk_str_func("gtk_label_get_text",{P},{l[i]}) + end if + end for + return 1 + end function + + function setMenuItemImage(atom item, object img) + if string(img) then img = get_icon_image(img) end if + img = get(img,"pixbuf") + atom b = get(item,"child") + object l = get(b,"children") + l = to_sequence(l,1) + for i = 1 to length(l) do + if classid(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 getMenuItemImage(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 classid(l[i]) = GtkImage then + return l[i] + end if + end for + return 1 + end function + + function setMenuItemUseUnderline(atom item, boolean use) + atom b = get(item,"child") + object l = get(b,"children") + l = to_sequence(l,1) + for i = 1 to length(l) do + if classid(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 getMenuItemUseUnderline(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 classid(l[i]) = GtkAccelLabel then + return gtk_func("gtk_label_get_use_underline",{P},{l[i]}) + end if + end for + display(l) + 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,GtkActivatable,GtkActionable,GObject}, + {"new",{P,P,P,P,P},-routine_id("newRadioMenuItem")}, + {"set_group",{P,P}}, + {"get_group",{P},P,0,GSList}, +"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)}) + else + item = gtk_func("gtk_radio_menu_item_new_with_mnemonic_from_widget", + {P,P},{group,allocate_string(stk)}) + end if + register(item,GtkMenuItem) + + if atom(img) and img = 0 then + item = addMenuAccel(item,accels) + else + item = addMenuAccel(item,accels,img) + end if + + return item + end function + +widget[GtkCheckMenuItem] = {"gtk_check_menu_item", +{GtkMenuItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActivatable,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)}) + register(item,GtkCheckMenuItem) + + if atom(img) and img = 0 then + item = addMenuAccel(item,accels) + else + item = addMenuAccel(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("newExp")}, + {"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 newExp(sequence caption) + if 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,GtkActivatable,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,GtkWidget}, + {"set_proxy_menu_item",{P,S,P}}, + {"get_proxy_menu_item",{P,S},P,0,GtkWidget}, + {"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,GtkActivatable,GtkActionable,GObject}, + {"new",{P,P},-routine_id("newTB")}, + {"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 newTB(object icn=0, object lbl=0) + -------------------------------------------------- + if string(icn) then + if match("gtk-",icn) = 1 then + return gtk_func("gtk_tool_button_new_from_stock",{P},{allocate_string(icn)}) + end if + icn = create(GtkImage,icn) + end if + if string(lbl) then + lbl = allocate_string(lbl) + end if + atom 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,GtkActivatable,GtkActionable,GObject}, + {"new",{P,P},-routine_id("newMenuTB")}, + {"set_menu",{P,P}}, + {"get_menu",{P},P,0,GtkWidget}, + {"set_arrow_tooltip_text",{P,S}}, + {"set_arrow_tooltip_markup",{P,S}}, +"GtkMenuToolButton"} + + function newMenuTB(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) + 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,GtkActivatable,GtkActionable,GObject}, + {"new",{S},-routine_id("newToggleToolButton")}, + {"set_active",{P,B}}, + {"get_active",{P},B}, +"GtkToggleToolButton"} + + function newToggleToolButton(object txt) + ---------------------------------------- + return gtk_func("gtk_toggle_tool_button_new_from_stock",{S},{txt}) + end function + +widget[GtkRadioToolButton] = {"gtk_radio_tool_button", +{GtkToggleToolButton,GtkToolButton,GtkToolItem,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkActivatable,GtkActionable,GObject}, + {"new",{P},-routine_id("newRadioToolButton")}, + {"set_group",{P,P}}, + {"get_group",{P},P,0,GSList}, +"GtkRadioToolButton"} + + function newRadioToolButton(atom id) + ------------------------------------ + if classid(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,GtkActivatable,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}}, +"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}}, +"GtkTextBuffer"} + + 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}, + {"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}}, +"GtkClipboard"} + + function newClipBoard(integer i) + -------------------------------- + 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}}, + {"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}}, + {"is_activatable",{P},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},P,0,GSList}, + {"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}}, + {"request_renderer",{P,P,P,P,I,I,I}}, +"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", +{GtkCellArea,GtkCellLayout,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},P,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"} + +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", +{GtkTreeModel,GtkTreeSortable,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", -- HEAVILY-MODIFIED 4.8.2 +{GtkTreeModel,GtkTreeSortable,GtkTreeDragSource,GtkTreeDragDest,GtkBuildable,GObject}, + {"new",{P},-routine_id("newListStore")}, + {"clear",{P}}, + {"set_data",{P,P},-routine_id("setListData")}, + {"get_data",{P},-routine_id("getListData")}, + {"get_n_rows",{P},-routine_id("nListRows")}, + {"get_n_cols",{P},-routine_id("nListCols")}, + {"set_row_data",{P,I,P},-routine_id("setListRowData")}, + {"get_row_data",{P,I},-routine_id("getListRowData")}, + {"set_col_data",{P,I,I,P},-routine_id("setListColData")}, + {"get_col_data",{P,I,I},-routine_id("getListColData")}, + {"get_col_data_from_iter",{P,P,I},-routine_id("getListColDatafromIter")}, + {"remove_row",{P,I},-routine_id("removeListRow")}, + {"replace_row",{P,I,P},-routine_id("replaceListRow")}, + {"insert_row",{P,I,P},-routine_id("insertListRow")}, + {"prepend_row",{P,P},-routine_id("prependListRow")}, + {"append_row",{P,P},-routine_id("appendListRow")}, + {"set_swap_rows",{P,I,I},-routine_id("swapListRows")}, + {"set_move_before",{P,I,I},-routine_id("movebeforeListRows")}, + {"set_move_after",{P,I,I},-routine_id("moveafterListRows")}, + {"set_move_after",{P,I,I},-routine_id("moveafterListRows")}, +"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 nListRows(object store) + -------------------------------- + return gtk_func("gtk_tree_model_iter_n_children",{P,P},{store,0}) + end function + + function nListCols(object store) + -------------------------------- + return gtk_func("gtk_tree_model_get_n_columns",{P},{store}) + end function + + function setListData(object store, object data) + ----------------------------------------------- + atom iter = allocate(32) + integer len = length(data) + for row = 1 to len do + c_proc(LS1,{store,iter,len}) -- new row + if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 + then display("Error in setlistdata []",data[row]) abort(0) + end if + if string(data[row]) then + setListRowData(store,row,{data[row]}) + else + setListRowData(store,row,data[row]) + end if + end for + return 1 + end function + + function setListRowData(atom store, integer row, object data) + ----------------------------------------------------------- + integer max_col = nListCols(store) + for col = 1 to math:min({length(data),max_col}) do + setListColData(store,row,col,data[col]) + end for + return 1 + end function + + function setListColData(object store, object row, integer col, object data) + ---------------------------------------------------------------------------- + integer max_col = nListCols(store) + if col < 1 or col > max_col then + crash("Invalid column #%d",col) + end if + + atom iter = allocate(32) + if not c_func(TM3,{store,iter,allocate_string(sprintf("%d",row-1))}) 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} + case gDBL then prototype = {P,P,I,D,I} + case gFLT then prototype = {P,P,I,D,I} + case gPIX then prototype = {P,P,I,P,I} + case gINT then prototype = {P,P,I,I,I} + case gBOOL then prototype = {P,P,I,I,I} + case else display("Error in setlistcoldata 5 []",col_type) abort(0) + end switch + + if string(data) then data = allocate_string(data) 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 getListData(object store) + ---------------------------------- + object data = {} + for row = 1 to nListRows(store) do + data = append(data,getListRowData(store,row)) + end for + return data + end function + + function getListRowData(object store, integer row) + ------------------------------------------------ + object data = {} + integer max_row = nListRows(store) + if row > max_row then return -1 end if + + integer max_col = nListCols(store) + for i = 1 to max_col do + data = append(data,getListColData(store,row,i)) + end for + return data + end function + + function getListColData(atom store, integer row, integer col) + ----------------------------------------------------------- + atom x = allocate(64) + object result + + ifdef LISTSTORE then + if col = 2 then + display("Get Col Data ~ row [] col []",{row,col}) + end if + 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) + + c_func(TM3,{store,iter,allocate_string(sprintf("%d",row-1))}) + if gtk_func("gtk_list_store_iter_is_valid",{P,P},{store,iter}) = 0 then + display("Error in getlistcoldata 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 getlistcoldata 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 getlistcoldata 4") abort(0) + end switch + ifdef LISTSTORE then + if col = 2 then + display("Result [] getListColData",{result}) + end if + end ifdef + return result + end function + + function getListColDatafromIter(atom store, atom iter, integer col) + ------------------------------------------------------------------- + atom x = allocate(32) + object result + + ifdef LISTSTORE then + if col = 2 then + display("Get Col Data from Iter ~ store [] iter [] col []\n",{store,iter,col}) + end if + 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 getlistcoldatafromiter 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 getlistcoldatafromiter 2 ") abort(0) end if + + switch col_type do + case gSTR then + if peek4u(x) > 0 then result = peek_string(peek4u(x)) + else result = "err 1" 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 getlistcoldatafromiter 3") abort(0) + end switch + ifdef LISTSTORE then + if col = 2 then + display("Result [] getListColDataFromIter",{result}) + end if + end ifdef + return result + end function + + function insertListRow(object store, object data, integer pos) + -------------------------------------------------------------- + object tmp = getListData(store) + tmp = insert(tmp,data,pos) + set(store,"clear") + setListData(store,tmp) + return tmp + end function + + function appendListRow(atom store, object data) + ----------------------------------------------- + object tmp = getListData(store) + tmp = append(tmp,data) + set(store,"clear") + set(store,"data",tmp) + return tmp + end function + + function prependListRow(atom store, object data) + ------------------------------------------------ + object tmp = getListData(store) + tmp = prepend(tmp,data) + set(store,"clear") + set(store,"data",tmp) + return tmp + end function + + function removeListRow(atom store, integer row) + ----------------------------------------------- + object tmp = getListData(store) + tmp = remove(tmp,row) + set(store,"clear") + setListData(store,tmp) + return tmp + end function + + function replaceListRow(atom store, object data, integer row) + ------------------------------------------------------------- + object tmp = getListData(store) + set(store,"clear") + tmp = replace(tmp,{data},row) + setListData(store,tmp) + return tmp + end function + + function swapListRows(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), iter_b = allocate(32) + c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1))}) + c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-1))}) + c_proc(LS3,{store,iter_a,iter_b}) + return get(store,"data") + end function + + function movebeforeListRows(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), iter_b = allocate(32) + c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1))}) + c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-1))}) + c_proc(LS4,{store,iter_b,iter_a}) + return get(store,"data") + end function + + function moveafterListRows(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), iter_b = allocate(32) + c_func(TM3,{store,iter_a,allocate_string(sprintf("%d",row_a-1))}) + c_func(TM3,{store,iter_b,allocate_string(sprintf("%d",row_b-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("nTreeRows")}, + {"get_n_cols",{P},-routine_id("nTreeCols")}, + {"get_data",{P},-routine_id("getTreeData")}, + {"set_data",{P,P},-routine_id("setTreeData")}, + {"set_row_data",{P,P,P},-routine_id("setTreeRowData")}, + {"remove_row",{P,I},-routine_id("removeTreeRow")}, + {"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"} + + constant TSA = define_proc("gtk_tree_store_append",{P,P,P}) + constant TSX = define_proc("gtk_tree_store_insert",{P,P,P,I}) + + 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 nTreeRows(object store) + -------------------------------- + return gtk_func("gtk_tree_model_iter_n_children",{P,P},{store,0}) + end function + + function nTreeCols(object store) + -------------------------------- + return gtk_func("gtk_tree_model_get_n_columns",{P},{store}) + end function + + function setTreeData(object store, object data) + ----------------------------------------------- + atom iter = allocate(32) + puts(1,"\n") + for row = 1 to length(data) do + c_proc(TSA,{store,iter,0}) -- append new row + setTreeRowData(store,data[row],iter) + end for + return 1 + end function + + function setTreeRowData(atom store, object data, object parent = 0) + -------------------------------------------------------------------------- + atom iter1 = allocate(32) + atom iter2 = allocate(32) + atom iter3 = allocate(32) + atom iter4 = allocate(32) + for i = 1 to length(data) do + if string(data[i]) then + setTreeColData(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}) + setTreeColData(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}) + setTreeColData(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}) + setTreeColData(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}) + setTreeColData(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 setTreeColData(object store, object iter, integer col, object item) + ---------------------------------------------------------------------------- + integer max_col = nTreeCols(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 then prototype = {P,P,I,D,I} + case gFLT then prototype = {P,P,I,D,I} + case gPIX then prototype = {P,P,I,P,I} + case gINT then prototype = {P,P,I,I,I} + case gBOOL then prototype = {P,P,I,I,I} + case gSTR then prototype = {P,P,I,P,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) 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 getTreeData(atom store) + -------------------------------- + object rowdata = {} + object column = {} + for row = 1 to nTreeRows(store) do + for col = 1 to nTreeCols(store) do + column = append(column,get(store,"col data",col)) + end for + rowdata = append(rowdata,column) + column = {} + end for + return rowdata + end function + + function removeTreeRow(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("newPath")}, + {"to_string",{P},S}, + {"to_integer",{P},-routine_id("pathtoNumber")}, + {"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 newPath(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) + 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 pathtoNumber(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("newIter")}, + {"copy",{P},P,0,GtkTreeIter}, + {"free",{P}}, +"GtkTreeIter"} + + function newIter() + ------------------ + return allocate(64) + 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("getTMVal")}, + {"set_value",{P,I,I,P},-routine_id("setTMColVal")}, + {"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("tmStrIter")}, + {"ref_node",{P,P}}, + {"unref_node",{P,P}}, + {"foreach",{P,P,P}}, + {"n_rows",{P},-routine_id("getTMnRows")}, + {"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("tmIterN")}, + {"get_iter_from_string",{P,S},-routine_id("tmIterStr")}, + {"get_iter_from_path",{P,P},-routine_id("tmIterPath")}, + {"get_col_value",{P,P,I},-routine_id("tmColVal")}, + {"get_row_values",{P,P},-routine_id("tmRowVals")}, + {"get_col_data",{P,P,I},-routine_id("getTreeModelCol")}, + {"get_row_data",{P,I},-routine_id("getTreeModelRow")}, +"GtkTreeModel"} + + constant + tmstriter = define_func("gtk_tree_model_get_string_from_iter",{P,P},P), + tmiterstr = define_func("gtk_tree_model_get_iter_from_string",{P,S,P},P), + tmcolset = define_proc("gtk_list_store_set",{P,P,I,P,I}), + tmnrows = define_func("gtk_tree_model_iter_n_children",{P,P},I) + + function getTMnRows(atom model) + return c_func(tmnrows,{model,0}) + end function + + function tmStrIter(atom model, atom iter) + return peek_string(c_func(tmstriter,{model,iter})) + end function + + function tmIterStr(atom model, object str) + ------------------------------------------ + atom iter = newIter() + if string(str) then str = allocate_string(str) end if + if c_func(tmiterstr,{model,iter,str}) then + return iter + end if + return 0 + end function + + function tmIterN(atom model, integer path) + ------------------------------------------ + return tmIterStr(model,sprintf("%d",path-1)) + end function + + function tmIterPath(atom model, object path) + -------------------------------------------- + return tmIterStr(model,peek_string(path)) + end function + + 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 getTMVal(atom mdl, atom iter, integer col) + --------------------------------------------------- + atom x = allocate(64) + integer ct = c_func(fncoltype,{mdl,col-1}) + 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 + if peek4u(x) != 0 then return peek_string(peek4u(x)) + else return sprintf("%d",peek4u(x)) + end if + case gINT then return peek4u(x) + case gBOOL 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 tmRowVals(atom mdl, atom iter) + --------------------------------------- + integer ncols = c_func(tmncol,{mdl}) + object results = repeat(0,ncols) + for n = 1 to ncols do + results[n] = getTMVal(mdl,iter,n) + end for + return results + end function + + function tmColVal(atom mdl, integer row, integer col) + ----------------------------------------------------- + atom iter = allocate(32) + object data = tmRowVals(mdl,iter) + return data[col] + end function + + function setTMColVal(atom mdl, integer row, integer col, object data) + --------------------------------------------------------------------- + atom iter = tmIterN(mdl,row) + c_proc(tmcolset,{mdl,iter,col-1,allocate_string(data),-1}) + return 1 + end function + + function getTreeModelCol(atom mdl, integer row, integer col) + ------------------------------------------------------------ + object data = getTreeModelRow(mdl,row) + return data[col] + end function + + function getTreeModelRow(atom mdl, integer row) + ----------------------------------------------- + atom iter = tmIterN(mdl,row) + return tmRowVals(mdl,iter) + 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("TSgetSortColID")}, + {"get_sort_order",{P},-routine_id("TSgetSortOrder")}, + {"is_sorted",{P},-routine_id("TSisSorted")}, + {"set_sort_func",{P,I,P,P,P}}, + {"set_default_sort_func",{P,P,P,P}}, + {"has_default_sort_func",{P},B}, +"GtkTreeSortable"} + + constant TS1 = define_func("gtk_tree_sortable_get_sort_column_id",{P,P,P},B) + + function TSisSorted(atom mdl) + ----------------------------- + return gtk_func("gtk_tree_sortable_get_sort_column_id",{P,P,P},{mdl,0,0}) + end function + + function TSsetSortColID(atom mdl, integer col, integer order) + ------------------------------------------------------------- + gtk_proc("gtk_tree_sortable_set_sort_column_id",{P,I,I},{mdl,col-1,order}) + return 1 + end function + + function TSgetSortColID(atom mdl) + --------------------------------- + integer col = allocate(32), order = allocate(32) + if c_func(TS1,{mdl,col,order}) then + return peek4u(col)+1 + else + return 0 + end if + end function + + function TSgetSortOrder(atom mdl) + --------------------------------- + integer col = allocate(32), order = allocate(32) + if c_func(TS1,{mdl,col,order}) then + return peek4u(order) + else + return 0 + 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,GtkActivatable,GObject}, + {"new",{},P}, +"GtkVolumeButton"} + +widget[GtkColorChooserWidget] = {"gtk_color_chooser_widget", +{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkColorChooser,GObject}, + {"new",{},P}, +"GtkColorChooserWidget"} + +widget[GtkColorChooser] = {"gtk_color_chooser", +{GObject}, + {"set_rgba",{P,P},-routine_id("setccRGBA")}, + {"get_rgba",{P,I},-routine_id("getccRGBA")}, + {"set_use_alpha",{P,B},-routine_id("setccAlpha")}, + {"get_use_alpha",{P},-routine_id("getccAlpha")}, + {"add_palette",{P,I,I,I,A}}, +"GtkColorChooser"} + + constant + fngetccrgba = define_proc("gtk_color_chooser_get_rgba",{P,P}), + fngetccalpha = define_func("gtk_color_chooser_get_use_alpha",{P},B) + + function setccRGBA(atom x, object c) + ------------------------------------ + gtk_proc("gtk_color_chooser_set_rgba",{P,P},{x,to_rgba(c)}) + return 1 + end function + + function getccRGBA(atom x, integer fmt) + --------------------------------------- + atom rgba = allocate(32) + c_proc(fngetccrgba,{x,rgba}) + object c = gtk_func("gdk_rgba_to_string",{P},{rgba}) + return fmt_color(c,fmt) + end function + + function setccAlpha(atom x, integer b) + -------------------------------------- + gtk_proc("gtk_color_chooser_set_use_alpha",{P,B},{x,b}) + return 1 + end function + + function getccAlpha(atom x) + --------------------------- + return c_func(fngetccalpha,{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("setCurrentRGBA")}, + {"get_current_rgba",{P,I},-routine_id("getCurrentRGBA")}, + {"set_current_alpha",{P,I}}, + {"get_current_alpha",{P},I}, + {"set_previous_rgba",{P,S},-routine_id("setPreviousRGBA")}, + {"get_previous_rgba",{P,I},-routine_id("getPreviousRGBA")}, + {"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 +------------------------------------------------------------------------ + constant + fngetCurCol = define_proc("gtk_color_selection_get_current_rgba",{P,P}), + fngetPrevCol = define_proc("gtk_color_selection_get_previous_rgba",{P,P}) + + function setCurrentRGBA(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 setPreviousRGBA(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 getCurrentRGBA(atom x, integer fmt=0) + ---------------------------------------------- + atom rgba = allocate(32) + atom fn = define_func("gdk_rgba_to_string",{P},P) + c_proc(fngetCurCol,{x,rgba}) + object c = c_func(fn,{rgba}) + return fmt_color(c,fmt) + end function + + function getPreviousRGBA(atom x, integer fmt=0) + ----------------------------------------------- + atom rgba = allocate(32) + c_proc(fngetPrevCol,{x,rgba}) + object c = gtk_func("gdk_rgba_to_string",{rgba}) + return fmt_color(c,fmt) + end function + +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},P,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},A}, + {"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},P,0,GSList}, + {"add_shortcut_folder_uri",{P,S,P},B}, + {"remove_shortcut_folder_uri",{P,S,P},B}, + {"list_shortcut_folder_uris",{P},A}, + {"get_current_folder_file",{P},P,0,GFile}, + {"get_file",{P},P,0,GFile}, + {"get_files",{P},P,0,GSList}, + {"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", +{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkFileChooser,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", +{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkFileChooser,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}}, +"GtkFontChooser"} + +widget[GtkFontChooserWidget] = {"gtk_font_chooser_widget", +{GtkBox,GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkFontChooser,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,GtkWidget}, + {"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},A,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}, + {"new_for_manager",{P},P}, +"GtkRecentChooserWidget"} + +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("iconinfoLoadIcon")}, + {"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 iconinfoLoadIcon(atom info) + ------------------------------------ + atom err = allocate(8) err = 0 + atom icn = gtk_func("gtk_icon_info_load_icon",{P,P},{info,err}) + register(icn,GdkPixbuf) + return icn + end function + + function newIconInfo(atom theme, atom pix) + ------------------------------------------ + return gtk_func("gtk_icon_info_new_for_pixbuf",{P,P},{theme,pix}) + end function + +widget[GtkIconTheme] = {"gtk_icon_theme", +{GObject}, + {"new",{},-routine_id("getDefaultIconTheme")}, + {"get_for_screen",{P},P,0,GtkIconTheme}, + {"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,S,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("iconthemeLoadIcon")}, + {"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("iconthemeListContexts")}, + {"list_icons",{P,S},-routine_id("iconthemeListIcons")}, + {"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 iconthemeLoadIcon(atom theme, object name, integer size, integer flags) + -------------------------------------------------------------------------------- + atom err = allocate(8) err = 0 + return gtk_func("gtk_icon_theme_load_icon",{P,S,I,I,P},{theme,name,size,flags,err}) + end function + + function iconthemeListContexts(atom theme) + ------------------------------------------ + object list = gtk_func("gtk_icon_theme_list_contexts",{P},{theme}) + return to_sequence(list) + end function + + function iconthemeListIcons(atom theme, object context) + ------------------------------------------------------- + object list = gtk_func("gtk_icon_theme_list_icons",{P,S},{theme,context}) + return to_sequence(list) + end function + + function getDefaultIconTheme() + ------------------------------ + return gtk_func("gtk_icon_theme_get_default") + end function + +widget[GtkIconView] = {"gtk_icon_view", +{GtkContainer,GtkWidget,GtkBuildable,GtkCellLayout,GtkScrollable,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_path_at_pos",{P,I,I},P,0,GtkTreePath}, + {"get_item_at_pos",{P,I,I,P,P},B}, + {"convert_widget_to_bin_window_coords",{P,I,I,I,I}}, + {"set_cursor",{P,P,P,B}}, + {"get_cursor",{P,P,P},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},P,0,GSList}, + {"select_all",{P}}, + {"unselect_all",{P}}, + {"item_activated",{P,P}}, + {"scroll_to_path",{P,P,B,F,F}}, + {"get_visible_range",{P,P,P},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,P,I}}, + {"get_drag_dest_item",{P,P,I}}, + {"get_dest_item_at_pos",{P,I,I,P,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,GtkActivatable,GtkActionable,GObject}, + {"new",{},P}, +"GtkSeparatorMenuItem"} + +widget[GtkRecentChooserMenu] = {"gtk_recent_chooser_menu", +{GtkMenu,GtkMenuShell,GtkContainer,GtkWidget,GtkBuildable,GtkRecentChooser,GtkActivatable,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},A}, + {"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("getDefaultSettings")}, +"GtkSettings"} + + function getDefaultSettings() + return gtk_func("gtk_settings_get_default",{}) + 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("addWidgets")}, + {"remove_widget",{P,P}}, + {"get_widgets",{P},P,0,GSList}, +"GtkSizeGroup"} + + function addWidgets(atom group, object 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}, +"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}, +"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("appendMenuShell")}, + {"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 appendMenuShell(atom menu, object items) + ------------------------------------------------- + if atom(items) then + gtk_proc("gtk_menu_shell_append",{P,P},{menu,items}) + else + for i = 1 to length(items) do + appendMenuShell(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,P},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}}, +"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", +{GtkContainer,GtkWidget,GtkBuildable,GtkOrientable,GtkScrollable,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", +{GtkContainer,GtkWidget,GtkBuildable,GtkScrollable,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}, + {"reset_im_context",{P}}, + {"set_input_purpose",{P,I}}, -- GTK 3.6+ + {"get_input_purpose",{P},I}, -- GTK 3.6+ + {"set_input_hints",{P,I}}, -- GTK 3.6+ + {"get_input_hints",{P},I}, -- GTK 3.6+ + {"get_monospace",{P},B}, -- 3.16 + {"set_monospace",{P,B}}, -- 3.16 +"GtkTextView"} + +widget[GtkToolShell] = {"gtk_tool_shell", +{GtkWidget}, + {"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", +{GtkOrientable,GtkContainer,GtkWidget,GtkBuildable,GObject,GtkToolShell}, + {"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", +{GtkContainer,GtkWidget,GtkBuildable,GtkToolShell,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"} + +widget[GtkTreeView] = {"gtk_tree_view", +{GtkContainer,GtkWidget,GtkBuildable,GtkScrollable,GObject}, + {"new",{},P}, + {"new_with_model",{P},P}, + {"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("tvAppendCols")}, + {"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},A,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("tvScrol2Cel")}, + {"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("tvSelectRow")}, + {"get_selected_row_data",{P,P},-routine_id("getSelectedRowData")}, + {"get_selected_col_data",{P,P,I},-routine_id("getSelectedColData")}, +"GtkTreeView"} + + 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 getSelectedColData(atom view, atom path, integer col) + object data = getSelectedRowData(view,path) + return data[col] + end function + + function getSelectedRowData(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) + if c_func(sfn3,{mdl,iter,path}) then + for i = 1 to length(data) do + data[i] = allocate(32) + 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 + ? types[i] + switch types[i] do + case gSTR then data[i] = peek_string(peek4u(data[i])) + case else data[i] = peek4u(data[i]) + end switch + end for + return data + end function + + constant scrl2cell = define_proc("gtk_tree_view_scroll_to_cell",{P,P,P,I,F,F}) + + function tvScrol2Cel(atom v, atom p, atom c=0, integer align=0, atom row=0, atom col=0) + c_proc(scrl2cell,{v,p,c,align,row,col}) + return 1 + end function + + constant appcol = define_func("gtk_tree_view_append_column",{P,P},I) + function tvAppendCols(atom store, object cols) + --------------------------------------------------------------------------- + if atom(cols) then + c_func(appcol,{store,cols}) + else + for i = 1 to length(cols) do + c_func(appcol,{store,cols[i]}) + end for + end if + return 1 + end function + + function tvSelectRow(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,GtkWidget}, + {"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("getSelRow")}, + {"get_selected_rows",{P,P},-routine_id("getSelRows")}, + {"get_selected_row_data",{P},-routine_id("getSelRowData")}, + {"get_selected_row_col",{P,I},-routine_id("getSelRowCol")}, +"GtkTreeSelection"} + + constant + treeselection_fn1 = define_func("gtk_tree_selection_get_selected",{P,P,P},I), + treeselection_fn2 = define_func("gtk_tree_model_get_n_columns",{P},I), + treeselection_fn3 = define_func("gtk_tree_model_get_column_type",{P,I},I), + treeselection_p1 = define_proc("gtk_tree_model_get",{P,P,I,P,I}) + + function getSelRows(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 getSelRow(atom selection, atom model) + ------------------------------------------------- + object result = getSelRows(selection,model) + if equal({},result) then + return 0 + else + return result[1] + end if + end function + + function getSelRowData(atom selection) + ------------------------------------------------- + atom mdl = allocate(32), iter = allocate(32) + integer n + object x,t, val + if c_func(treeselection_fn1,{selection,mdl,iter}) then + mdl = peek4u(mdl) + n = c_func(treeselection_fn2,{mdl}) + x = repeat(0,n) t = x + for i = 1 to n do + val = allocate(32) + c_proc(treeselection_p1,{mdl,iter,i-1,val,-1}) + t[i] = c_func(treeselection_fn3,{mdl,i-1}) + x[i] = val + end for + for i = 1 to length(x) do + switch t[i] do + case gSTR then + if peek4u(x[i]) > 0 then + x[i] = peek_string(peek4u(x[i])) + 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 + + function getSelRowCol(atom selection, integer col) + object x = getSelRowData(selection) + return x[col] + 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,P},-routine_id("getCalendarDate")}, + {"get_ymd",{P,I},-routine_id("getCalendarYMD")}, + {"get_y,m,d",{P,I},-routine_id("getCalendarYMD")}, + {"get_eu_date",{P},-routine_id("getCalendarEuDate")}, + {"get_day",{P},-routine_id("getCalendarDay")}, + {"get_month",{P},-routine_id("getCalendarMonth")}, + {"get_year",{P},-routine_id("getCalendarYear")}, + {"get_day_is_marked",{P,I},B}, + {"get_display_options",{P},I}, + {"mark_day",{P,I},B}, + {"new",{P},-routine_id("new_calendar")}, + {"select_day",{P,I}}, + {"select_month",{P,I,I},-routine_id("selectCalendarMonth")}, + {"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("setCalendarDate")}, +"GtkCalendar"} + + function new_calendar(object d = 0) + 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 selectCalendarMonth(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 setCalendarDate(atom handle, object cdate) + ------------------------------------------------------------------------ + if string(cdate) then + cdate = split(cdate,',') + cdate[1] = to_number(cdate[1][2..$]) + cdate[2] = to_number(cdate[2]) + cdate[3] = to_number(cdate[3][1..$-1]) + end if + integer yr = cdate[1], mo = cdate[2], da = cdate[3] + 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 getCalendarDate(atom handle, object fmt=0) + ------------------------------------------------------------------------ + atom y = allocate(64) + atom m = allocate(64) + atom d = allocate(64) + object clock + if atom(fmt) then + fmt = "%A, %b %d, %Y" + 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) + free(y) free(m) free(d) + return result + end function + + ------------------------------------------------------------------------ + function getCalendarEuDate(atom handle) --returns {y,m,d} in Eu fmt. + ------------------------------------------------------------------------ + atom y = allocate(64) + atom m = allocate(64) + atom d = allocate(64) + c_proc(get_date,{handle,y,m,d}) + sequence result = {peek4u(y)-1900,peek4u(m)+1,peek4u(d)} + free(y) free(m) free(d) + return result + end function + + ------------------------------------------------------------------------ + function getCalendarYMD(atom handle, integer full=0) + ------------------------------------------------------------------------ + object clock + switch full do + case 0 then return getCalendarEuDate(handle) + {1900,0,0} + case 1 then return getCalendarEuDate(handle) + {1900,0,0} & {0,0,0} + case 2 then clock = datetime:now() + return getCalendarEuDate(handle) + {1900,0,0} & clock[4..6] + case else return getCalendarEuDate(handle) + {1900,0,0} + end switch + end function + + ------------------------------------------------------------------------ + function getCalendarDay(atom handle) + ------------------------------------------------------------------------ + atom y = allocate(64) + atom m = allocate(64) + atom d = allocate(64) + c_proc(get_date,{handle,y,m,d}) + integer result = peek4u(d) + free(y) free(m) free(d) + return result + end function + + ------------------------------------------------------------------------ + function getCalendarMonth(atom handle) + ------------------------------------------------------------------------ + atom y = allocate(64) + atom m = allocate(64) + atom d = allocate(64) + c_proc(get_date,{handle,y,m,d}) + integer result = peek4u(m) + free(y) free(m) free(d) + return result+1 + end function + + ------------------------------------------------------------------------ + function getCalendarYear(atom handle) + ------------------------------------------------------------------------ + atom y = allocate(64) + atom m = allocate(64) + atom d = allocate(64) + c_proc(get_date,{handle,y,m,d}) + integer result = peek4u(y) + free(y) free(m) free(d) + return result + end function + +widget[GtkCellView] = {"gtk_cell_view", +{GtkWidget,GtkBuildable,GtkCellLayout,GtkOrientable,GObject}, + {"new",{},P}, + {"new_with_context",{P},P}, + {"new_with_text",{S},P}, + {"new_with_markup",{S},P}, + {"new_with_pixbuf",{P},P}, + {"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"} + +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}, + {"new_with_area",{P},P}, + {"get_entry",{P},P,0,GtkWidget}, + {"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"} + +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 +"GtkStack"} + +widget[GtkStackSidebar] = {"gtk_stack_sidebar", +{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}, + {"new_for_screen",{P},P}, + {"set_screen",{P,P}}, + {"get_screen",{P},P,0,GdkScreen}, +"GtkInvisible"} + +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,GtkActivatable,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",{},P}, + {"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},B}, + {"get_inverted",{P},B}, --GTK3.8+ + {"set_inverted",{P,B}}, --GTK3.8+ +"GtkLevelBar"} + +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},A}, + {"set_artists",{P,A}}, + {"get_artists",{P},A}, + {"set_documenters",{P,A}}, + {"get_documenters",{P},A}, + {"set_translator_credits",{P,S}}, + {"get_translator_credits",{P},S}, + {"set_logo",{P,P}}, + {"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"} + +widget[GtkAppChooserDialog] = {"gtk_app_chooser_dialog", +{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkAppChooser,GObject}, + {"new",{P,I,P},-routine_id("newforURI")}, + {"new_for_uri",{P,I,S},-routine_id("newforURI")}, + {"new_for_file",{P,I,P},-routine_id("newforFIL")}, + {"new_for_content_type",{P,I,S},P}, + {"get_widget",{P},P,0,GtkAppChooserWidget}, + {"set_heading",{P,S}}, + {"get_heading",{P},S}, +"GtkAppChooserDialog"} + + function newforURI(atom parent, integer flags, object uri) + ---------------------------------------------------------- + return gtk_func("gtk_app_chooser_dialog_new_for_content_type",{P,I,P}, + {parent,flags,uri}) + end function + + function newforFIL(atom parent, integer flags, object fil) + ---------------------------------------------------------- + fil = allocate_string(canonical_path(fil)) + fil = gtk_func("g_file_new_for_path",{S},{fil}) + return gtk_func("gtk_app_chooser_dialog_new",{P,I,P}) + 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", +{GtkColorSelection,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[GtkStock] = {"gtk_stock", +{GObject}, +"GtkStock"} + +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("addProvider")}, + {"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}}, -- GTK3.10 + {"get_scale",{P},I}, -- GTK3.10 +"GtkStyleContext"} + + function addProvider(atom context, atom scrn, atom provider, integer priority) + ------------------------------------------------------------------------------ + gtk_proc("gtk_style_context_add_provider_for_screen",{P,P,I},{scrn,provider,priority}) + return 1 + end function + +widget[GtkRecentChooserDialog] = {"gtk_recent_chooser_dialog", +{GtkDialog,GtkWindow,GtkBin,GtkContainer,GtkWidget,GtkBuildable,GtkRecentChooser,GObject}, + {"new",{S,P,P},P}, + {"new_for_manager",{S,P,P,P},P}, +"GtkRecentChooserDialog"} + +widget[GtkPrintSettings] = {"gtk_print_settings", +{GObject}, + {"new",{},P}, + {"new_from_file",{S,P},P,0,GtkPrintSettings}, + {"new_from_key_file",{S,P},P,0,GtkPrintSettings}, + {"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("setPageRanges")}, + {"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 setPageRanges(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",{S},P}, + {"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"} + +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("setPgSetupToFile")}, +"GtkPageSetup"} + + function setPgSetupToFile(atom setup, object filename) + ------------------------------------------------------ + atom err = allocate(8) err = 0 + return gtk_func("gtk_page_setup_to_file",{P,P,P},{setup,filename,err}) + end function + +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), err = allocate(32) err = 0 + gtk_func("g_object_get",{P,S,P,P},{op,"job name",job,err}) + return peek_string(peek4u(job)) + 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}, + {"get_selected_rows",{P},A},-- 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}}, +"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}, + {"new_from_model",{P,P},P}, + {"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}}, +"GtkPopover"} + +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},P,0,GSList}, + {"get_nth_bookmark",{P,I},P,0,GFile}, + {"get_show_connect_to_server",{P},B}, + {"set_show_connect_to_server",{P,B}}, + {"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 +"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},P,0,GList}, + {"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},P,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}}, +"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 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 + +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[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[GdkGLProfile] = {"gdk_gl_profile", + {}, +"GdkGLProfile"} + +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}}, +"GtkGLArea"} + +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[GdkX11Display] = {"gdk_x11_display", +{GObject}, + {"get_user_time",{P},I}, + {"broadcase_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},B}, +"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[GdkGLContext] = {"gdk_gl_context", +{GObject}, + {"new",{},-routine_id("glContext")}, + {"get_current",{},-routine_id("glContext")}, + {"clear_current",{}}, + {"make_current",{P}}, + {"get_window",{P},P,0,GdkWindow}, + {"get_visual",{P},P,0,GdkVisual}, +"GdkGLContext"} + + function glContext() + return c_func("gdk_gl_context_get_current") + end function + +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("newPixbufAni")}, +"GdkPixbufAnimation"} + + function newPixbufAni(object name) + atom err = allocate(32) err = 0 + return gtk_func("gdk_pixbuf_animation_new_from_file",{P,P}, + {allocate_string(name),err}) + end function + +widget[PangoFont] = {"pango_font", +{0}, + {"get_metrics",{P,P},P}, + {"get_font_map",{P},P,0,PangoFontMap}, +"PangoFont"} + +widget[PangoFontDescription] = {"pango_font_description", +{PangoFont}, + {"new",{P},-routine_id("newPangoFontDescription")}, + {"set_family",{P,S}}, + {"get_family",{P},S}, + {"set_style",{P,I}}, + {"get_style",{P},I}, + {"set_variant",{P,I}}, + {"get_variant",{P},P}, + {"set_weight",{P,I}}, + {"get_weight",{P},I}, + {"set_stretch",{P,I}}, + {"get_stretch",{P},I}, + {"set_size",{P,I}}, + {"get_size",{P},I}, + {"set_absolute_size",{P,D}}, + {"get_size_is_absolute",{P},B}, + {"set_gravity",{P,I}}, + {"get_gravity",{P},I}, + {"to_string",{P},-routine_id("pfdtoStr")}, + {"to_filename",{P},S}, +"PangoFontDescription"} + + function newPangoFontDescription(object name=0) + ----------------------------------------------- + if atom(name) then + return gtk_func("pango_font_description_new") + end if + return gtk_func("pango_font_description_from_string",{S},{name}) + end function + + function pfdtoStr(atom fd) + -------------------------- + return gtk_str_func("pango_font_description_to_string",{P},{fd}) + end function + +widget[PangoContext] = {"pango_context", +{GObject}, + {"new",{},P}, + {"load_font",{P,P},P}, + {"load_fontset",{P,P,P},P}, + {"get_metrics",{P,P,P},P}, + {"list_families",{P,A,I}}, + {"set_font_description",{P,P}}, + {"get_font_description",{P},P}, + {"set_font_map",{P,P}}, + {"get_font_map",{P},P}, + {"set_base_gravity",{P,I}}, + {"get_language",{P},P}, + {"set_language",{P,P}}, + {"get_layout",{P},P}, + {"get_base_dir",{P},I}, + {"set_base_dir",{P,I}}, + {"get_base_gravity",{P},I}, + {"set_base_gravity",{P,I}}, + {"get_gravity",{P},I}, + {"get_gravity_hint",{P},I}, + {"set_gravity_hint",{P,I}}, + {"get_matrix",{P},P}, + {"set_matrix",{P,P}}, +"PangoContext"} + +widget[PangoFontsetSimple] = {"pango_fontset_simple", +{GObject}, + {"new",{P},P}, + {"append",{P,P}}, + {"size",{P},I}, +"PangoFontsetSimple"} + +widget[PangoFontSet] = {"pango_fontset", +{PangoFontsetSimple}, + {"get_font",{P,I},P,0,PangoFont}, + {"get_metrics",{P},P}, + {"foreach",{P,P,P}}, +"PangoFontSet"} + +widget[PangoFontMap] = {"pango_font_map", +{PangoFontSet}, + {"create_context",{P},P}, + {"load_font",{P,P,S},P}, + {"load_fontset",{P,P,S,P},P}, + {"list_families",{P,A,I}}, + {"get_shape_engine_type",{P},S}, +"PangoFontMap"} + + +widget[PangoFontFace] = {"pango_font_face", +{PangoFontMap}, + {"get_face_name",{P},-routine_id("getFaceName")}, + {"list_sizes",{P,P,I}}, + {"describe",{P},P,0,PangoFontDescription}, + {"is_synthesized",{P},B}, +"PangoFontFace"} + + function getFaceName(atom x) + ----------------------------- + return gtk_str_func("pango_font_face_get_face_name",{P},{x}) + end function + +widget[PangoFontFamily] = {"pango_font_family", +{PangoFontFace}, + {"get_name",{P},-routine_id("getFamilyName")}, + {"is_monospace",{P},B}, +"PangoFontFamily"} + + function getFamilyName(atom x) + ------------------------------ + return gtk_str_func("pango_font_family_get_name",{P},{x}) + end function + +widget[PangoLayout] = {"pango_layout", +{GObject}, + {"new",{P},P}, + {"set_text",{P,P},-routine_id("plSetTxt")}, + {"get_text",{P},S}, + {"set_markup",{P,S,I}}, + {"set_font_description",{P,P}}, + {"get_font_description",{P},P}, + {"set_width",{P,I}}, + {"get_width",{P},I}, + {"set_height",{P,I}}, + {"get_height",{P},I}, + {"set_wrap",{P,I}}, + {"get_wrap",{P},I}, + {"is_wrapped",{P},B}, + {"set_ellipsize",{P,I}}, + {"get_ellipsize",{P},I}, + {"is_ellipsized",{P},B}, + {"set_indent",{P,I}}, + {"get_extents",{P,P,P}}, + {"get_indent",{P},I}, + {"get_pixel_size",{P,I,I}}, + {"get_size",{P,I,I}}, + {"set_spacing",{P,I}}, + {"get_spacing",{P},I}, + {"set_justify",{P,B}}, + {"get_justify",{P},B}, + {"set_auto_dir",{P,B}}, + {"get_auto_dir",{P},B}, + {"set_alignment",{P,P}}, + {"get_alignment",{P},P}, + {"set_tabs",{P,A}}, + {"get_tabs",{P},A}, + {"set_single_paragraph_mode",{P,B}}, + {"get_single_paragraph_mode",{P},B}, + {"get_unknown_glyphs_count",{P},I}, + {"get_log_attrs",{P,P,I}}, + {"get_log_attrs_readonly",{P,I},P}, + {"index_to_pos",{P,I,P}}, + {"index_to_line",{P,I,B,I,I}}, + {"xy_to_line",{P,I,I,I,I},B}, + {"get_cursor_pos",{P,I,P,P}}, + {"move_cursor_visually",{P,B,I,I,I,I,I}}, + {"get_extents",{P,P,P}}, + {"get_pixel_extents",{P,P,P}}, + {"get_size",{P,I,I}}, + {"get_pixel_size",{P,I,I}}, + {"get_baseline",{P},I}, + {"get_line_count",{P},I}, + {"get_line",{P,I},P,0,PangoLayoutLine}, + {"get_line_readonly",{P,I},P,0,PangoLayoutLine}, + {"get_lines",{P},P,0,GSList}, + {"get_lines_readonly",{P},P,0,GSList}, + {"get_iter",{P},P,0,PangoLayoutIter}, +"PangoLayout"} + + function plSetTxt(atom layout, object txt) + gtk_proc("pango_layout_set_text",{P,P,I},{layout,allocate_string(txt),length(txt)}) + return 1 + end function + +widget[PangoLayoutLine] = {"pango_layout_line", +{0}, + {"ref",{P},P}, + {"unref",{P}}, + {"get_extents",{P,P,P}}, + {"get_pixel_extents",{P,P,P}}, + {"index_to_x",{P,I,B,I}}, + {"x_to_index",{P,I,I,I},B}, +"PangoLayoutLine"} + +widget[PangoLayoutIter] = {"pango_layout_iter", +{0}, + {"copy",{P},P,0,PangoLayoutIter}, + {"free",{P}}, + {"next_run",{P},B}, + {"next_char",{P},B}, + {"next_cluster",{P},B}, + {"next_line",{P},B}, + {"at_last_line",{P},B}, + {"get_index",{P},I}, + {"get_baseline",{P},I}, + {"get_run",{P},P,0,PangoLayoutRun}, + {"get_run_readonly",{P},P,0,PangoLayoutRun}, + {"get_line",{P},P,0,PangoLayoutLine}, + {"get_line_readonly",{P},P,0,PangoLayoutLine}, + {"get_layout",{P},P,0,PangoLayout}, + {"get_char_extents",{P,P}}, + {"get_cluster_extents",{P,P,P}}, + {"get_run_extents",{P,P,P}}, + {"get_line_yrange",{P,I,I}}, + {"get_line_extents",{P,P,P}}, + {"get_layout_extents",{P,P,P}}, +"PangoLayoutIter"} + +widget[PangoLayoutRun] = {"pango_layout_run", +{0}, +"PangoLayoutRun"} + +widget[PangoTabArray] = {"pango_tab_array", +{0}, +"PangoTabArray"} + +widget[PangoLanguage] = {"pango_language", +{GObject}, + {"new",{S},-routine_id("newPangoLanguage")}, + {"get_default",{P},-routine_id("getDefaultLanguage")}, + {"get_sample_string",{P},-routine_id("getSampleStr")}, + {"to_string",{P},S}, + {"matches",{P,S},B}, + {"includes_script",{P,P},B}, +"PangoLanguage"} + + function newPangoLanguage(object s) + ----------------------------------- + return gtk_func("pango_language_from_string",{S},{s}) + end function + + function getDefaultLanguage(object junk) + ---------------------------------------- + return gtk_str_func("pango_language_get_default") + end function + + function getSampleStr(object x) + ------------------------------- + return gtk_str_func("pango_language_get_sample_string",{P},{x}) + end function + +widget[PangoLayout] = {"pango_layout", +{GObject}, + {"new",{P},P}, + {"set_text",{P,P},-routine_id("plSetTxt")}, + {"get_text",{P},S}, + {"set_markup",{P,S,I}}, + {"set_font_description",{P,P}}, + {"get_font_description",{P},P}, + {"set_width",{P,I}}, + {"get_width",{P},I}, + {"set_height",{P,I}}, + {"get_height",{P},I}, + {"set_wrap",{P,I}}, + {"get_wrap",{P},I}, + {"is_wrapped",{P},B}, + {"set_ellipsize",{P,I}}, + {"get_ellipsize",{P},I}, + {"is_ellipsized",{P},B}, + {"set_indent",{P,I}}, + {"get_extents",{P,P,P}}, + {"get_indent",{P},I}, + {"get_pixel_size",{P,I,I}}, + {"get_size",{P,I,I}}, + {"set_spacing",{P,I}}, + {"get_spacing",{P},I}, + {"set_justify",{P,B}}, + {"get_justify",{P},B}, + {"set_auto_dir",{P,B}}, + {"get_auto_dir",{P},B}, + {"set_alignment",{P,P}}, + {"get_alignment",{P},P}, + {"set_tabs",{P,A}}, + {"get_tabs",{P},A}, + {"set_single_paragraph_mode",{P,B}}, + {"get_single_paragraph_mode",{P},B}, + {"get_unknown_glyphs_count",{P},I}, + {"get_log_attrs",{P,P,I}}, + {"get_log_attrs_readonly",{P,I},P}, + {"index_to_pos",{P,I,P}}, + {"index_to_line",{P,I,B,I,I}}, + {"xy_to_line",{P,I,I,I,I},B}, + {"get_cursor_pos",{P,I,P,P}}, + {"move_cursor_visually",{P,B,I,I,I,I,I}}, + {"get_extents",{P,P,P}}, + {"get_pixel_extents",{P,P,P}}, + {"get_size",{P,I,I}}, + {"get_pixel_size",{P,I,I}}, + {"get_baseline",{P},I}, + {"get_line_count",{P},I}, + {"get_line",{P,I},P,0,PangoLayoutLine}, + {"get_line_readonly",{P,I},P,0,PangoLayoutLine}, + {"get_lines",{P},P,0,GSList}, + {"get_lines_readonly",{P},P,0,GSList}, + {"get_iter",{P},P,0,PangoLayoutIter}, +"PangoLayout"} + +widget[GdkCairo_t] = {"gdk_cairo", +{Cairo_t}, + {"new",{P},-routine_id("newGdkCairo")}, + {"draw_from_gl",{P,P,I,I,I,I,I,I,I}}, -- 3.16 + {"get_clip_rectangle",{P,P},B}, + {"set_source_pixbuf",{P,P,D,D}}, + {"set_source_window",{P,P,D,D}}, + {"region",{P,P}}, + {"region_create_from_surface",{P},P}, + {"surface_create_from_pixbuf",{P,I,P},P,0,CairoSurface_t}, + {"set_source_rgba",{P,I,I,I,D},-routine_id("setCairoRGBA")}, + {"set_color",{P,P},-routine_id("setCairoColor")}, +"GdkCairo_t"} + + function newGdkCairo(atom win) + ------------------------------ + return gtk_func("gdk_cairo_create",{P},{win}) + end function + + ---------------------------------------------------------------- + -- to use the Cairo color specs, where colors are 0.0 => 1.0 + ---------------------------------------------------------------------- + function setCairoRGBA(atom cr, atom r, atom g, atom b, atom a=1) + gtk_proc("cairo_set_source_rgba",{P,D,D,D,D},{cr,r,g,b,a}) + return 1 + end function + + -------------------------------------------- + -- it's easier to use named colors + -------------------------------------------- + function setCairoColor(atom cr, object color) + if atom(color) then color = sprintf("#%06x",color) end if + color = to_rgba(color) + color = from_rgba(color,7) + setCairoRGBA(cr,color[1],color[2],color[3],color[4]) + return 1 + end function + +widget[Cairo_t] = {"cairo", +{GObject}, + {"create",{P},P}, + {"reference",{P},P}, + {"destroy",{P}}, + {"status",{P},I}, + {"save",{P}}, + {"restore",{P}}, + {"get_target",{P},P,0,CairoSurface_t}, + {"push_group",{P}}, + {"push_group_with_content",{P,P}}, + {"pop_group",{P},P}, + {"pop_group_to_source",{P}}, + {"get_group_target",{P},P}, + {"set_source_rgb",{P,D,D,D}}, + {"set_source",{P,P}}, + {"get_source",{P},P}, + {"set_source_surface",{P,P,D,D}}, + {"set_antialias",{P,I}}, + {"get_antialias",{P},I}, + {"set_dash",{P,P,I,D}}, + {"get_dash_count",{P},I}, + {"get_dash",{P,D,D}}, + {"set_fill_rule",{P,I}}, + {"get_fill_rule",{P},I}, + {"set_line_cap",{P,I}}, + {"get_line_cap",{P},I}, + {"set_line_join",{P,I}}, + {"get_line_join",{P},I}, + {"set_line_width",{P,D}}, + {"get_line_width",{P},D}, + {"set_miter_limit",{P,I}}, + {"get_miter_limit",{P},I}, + {"set_operator",{P,I}}, + {"get_operator",{P},I}, + {"set_tolerance",{P,D}}, + {"get_tolerance",{P},D}, + {"clip",{P}}, + {"clip_preserve",{P}}, + {"clip_extents",{P,D,D,D,D}}, + {"in_clip",{P,D,D},B}, + {"reset_clip",{P}}, + {"rectangle_list_destroy",{P}}, + {"fill",{P}}, + {"fill_preserve",{P}}, + {"fill_extents",{P,D,D,D,D}}, + {"in_fill",{P,D,D},B}, + {"mask",{P,P}}, + {"mask_surface",{P,P,D,D}}, + {"paint",{P}}, + {"paint_with_alpha",{P,D}}, + {"stroke",{P}}, + {"stroke_preserve",{P}}, + {"stroke_extents",{P,D,D,D,D}}, + {"in_stroke",{P,D,D},B}, + {"copy_page",{P}}, + {"show_page",{P}}, + {"copy_path",{P},P}, + {"copy_path_flat",{P},P}, + {"path_destroy",{P}}, + {"append_path",{P,P}}, + {"has_current_point",{P},B}, + {"get_current_point",{P,D,D}}, + {"new_path",{P}}, + {"new_sub_path",{P}}, + {"close_path",{P}}, + {"set_user_data",{P,S,P,P},I}, + {"get_user_data",{P,S}}, + {"arc",{P,D,D,D,D,D}}, + {"arc_negative",{P,D,D,D,D,D}}, + {"move_to",{P,D,D}}, + {"rel_move_to",{P,D,D}}, + {"line_to",{P,D,D}}, + {"rel_line_to",{P,D,D}}, + {"rectangle",{P,D,D,D,D}}, + {"glyph_path",{P,I,I}}, + {"text_path",{P,S}}, + {"curve_to",{P,D,D,D,D,D,D}}, + {"rel_curve_to",{P,D,D,D,D,D,D}}, + {"path_extents",{P,D,D,D,D}}, + {"set_font_face",{P,S}}, + {"device_get_type",{P},I}, + {"device_status",{P},I}, + {"status_to_string",{I},S}, + {"translate",{P,D,D}}, + {"scale",{P,D,D}}, + {"rotate",{P,D}}, + {"transform",{P,P}}, + {"translate",{P,D,D}}, + {"scale",{P,D,D}}, + {"rotate",{P,D}}, + {"transform",{P,P}}, + {"set_matrix",{P,P}}, + {"get_matrix",{P,P}}, + {"identity_matrix",{P}}, + {"user_to_device",{P,D,D}}, + {"user_to_device_distance",{P,D,D}}, + {"device_to_user",{P,D,D}}, + {"device_to_user_distance",{P,D,D}}, + {"version",{},I}, + {"version_string",{},S}, + {"set_font_size",{P,D}}, + {"set_font_matrix",{P,P}}, + {"get_font_matrix",{P,P}}, + {"set_font_options",{P,P}}, + {"get_font_options",{P,P}}, + {"select_font_face",{P,S,I,I}}, + {"get_font_face",{P},P}, + {"set_scaled_font",{P,P}}, + {"get_scaled_font",{P},P}, + {"show_glyphs",{P,P}}, + {"show_text_glyphs",{P,S,I,P,I,P,I,I}}, + {"font_extents",{P,P}}, + {"text_extents",{P,S,P}}, + {"glyph_extents",{P,P,I,P}}, + {"toy_font_face_create",{S,I,I},P}, + {"toy_font_face_get_slant",{P},I}, + {"toy_font_face_get_weight",{P},I}, + {"glyph_allocate",{I},P}, + {"glyph_free",{P}}, + {"text_cluster_allocate",{I},P}, + {"text_cluster_free",{P}}, + {"show_text",{P,S}}, + {"set_source_rgba",{P,D,D,D,D},-routine_id("setCairoRGBA")}, + {"set_color",{P,S},-routine_id("setCairoColor")}, +"Cairo_t"} + +widget[CairoPattern_t] = {0, +{Cairo_t}, +"CairoPattern_t"} + +widget[CairoPattern] = {"cairo_pattern", +{CairoPattern_t}, + {"new",{P},-routine_id("newCairoPattern")}, + {"add_color_stop_rgb",{P,D,D,D,D}}, + {"add_color_stop_rgba",{P,D,D,D,D,D}}, + {"get_color_stop_count",{P,I},P,0,CairoStatus_t}, + {"get_color_stop_rgba",{P,I,D,D,D,D,D},P,0,CairoStatus_t}, + {"create_rgb",{D,D,D},P,0,CairoPattern_t}, + {"create_rgba",{D,D,D,D},P,0,CairoPattern_t}, + {"get_rgba",{P,D,D,D,D},P,0,CairoPattern_t}, + {"create_for_surface",{P},P,0,CairoPattern_t}, + {"reference",{P},P,0,CairoPattern_t}, + {"destroy",{P}}, + {"status",{P},P,0,CairoStatus_t}, + {"set_extend",{P,I}}, + {"get_extent",{P},I}, + {"set_filter",{P,I}}, + {"get_filter",{P},I}, + {"set_matrix",{P,P}}, + {"get_matrix",{P,P}}, + {"get_type",{P},I}, + {"get_reference_count",{P},I}, +"CairoPattern"} + + function newCairoPattern(atom surf) + ----------------------------------- + return gtk_func("cairo_pattern_create_for_surface",{P},{surf}) + end function + +widget[CairoLinearGradient] = {"cairo_pattern", +{CairoPattern}, + {"new",{D,D,D,D},-routine_id("newLinearGradient"),0,CairoPattern_t}, + {"get_linear_points",{P,D,D,D,D},P,0,CairoStatus_t}, +"CairoLinearGradient"} + + function newLinearGradient(atom a, atom b, atom c, atom d) + ---------------------------------------------------------- + return gtk_func("cairo_pattern_create_linear",{D,D,D,D},{a,b,c,d}) + end function + +widget[CairoRadialGradient] = {"cairo_pattern", +{CairoPattern}, + {"new",{D,D,D,D,D,D},-routine_id("newRadialGradient"),0,CairoPattern_t}, + {"get_radial_circles",{P,D,D,D,D,D,D},P,0,CairoStatus_t}, +"CairoRadialGradient"} + + function newRadialGradient(atom a, atom b, atom c, atom d, atom e, atom f) + -------------------------------------------------------------------------- + return gtk_func("cairo_pattern_create_radial",{D,D,D,D,D,D},{a,b,c,d,e,f}) + end function + +widget[CairoRegion_t] = {"cairo_region_t", +{Cairo_t}, +"CairoRegion_t"} + +widget[CairoSurface_t] = {"cairo_surface_t", +{Cairo_t}, + {"get_write_to_png",{P,S},-routine_id("writetoPNG")}, + {"create_similar",{P,P,I,I},P,0,CairoSurface_t}, + {"create_for_rectangle",{P,D,D,D,D},P,0,CairoSurface_t}, + {"reference",{P},P,0,CairoSurface_t}, + {"destroy",{P}}, + {"finish",{P}}, + {"flush",{P}}, + {"get_font_options",{P,P}}, + {"mark_dirty",{P}}, + {"mark_dirty_rectangle",{P,I,I,I,I}}, + {"show_page",{P}}, +"CairoSurface_t"} + + function writetoPNG(atom surf, object name) + ------------------------------------------- + return gtk_func("cairo_surface_write_to_png",{P,S},{surf,name}) + end function + +widget[CairoImageSurface] = {"cairo_image_surface", +{CairoSurface_t}, + {"new",{P},-routine_id("newCairoImageSurface")}, + {"get_format",{P},I}, + {"get_width",{P},P}, + {"get_height",{P},P}, + {"get_stride",{P},I}, +"CairoImageSurface"} + + function newCairoImageSurface(object png) + ----------------------------------------- + if string(png) then + png = allocate_string(canonical_path(png)) + end if + return gtk_func("cairo_image_surface_create_from_png",{S},{png}) + end function + +widget[PangoCairoLayout] = {"pango_cairo", +{PangoLayout}, + {"new",{P},-routine_id("newPangoCairoLayout"),0,PangoLayout}, + {"update_layout",{P,P},-routine_id("updateLayout")}, + {"show_glyph_string",{P,P,P}}, + {"show_glyph_item",{P,S,P}}, + {"show_layout",{P,P},-routine_id("showLayout")}, + {"show_layout_line",{P,P}}, + {"layout_line_path",{P,P}}, + {"layout_path",{P,P}}, +"PangoCairoLayout"} + + function newPangoCairoLayout(atom cr) + ------------------------------------- + return gtk_func("pango_cairo_create_layout",{P},{cr}) + end function + + function updateLayout(atom pl, atom cr) + --------------------------------------- + gtk_proc("pango_cairo_update_layout",{P,P},{cr,pl}) + return 1 + end function + + function showLayout(atom pl, atom cr) + ------------------------------------- + gtk_proc("pango_cairo_show_layout",{P,P},{cr,pl}) + return 1 + end function + +--TODO: these are not yet implemented; +widget[CairoFontOptions] = {0,{0},"CairoFontOptions"} +widget[CairoContent_t] = {0,{0},"CairoContent_t"} +widget[CairoStatus_t] = {0,{0},"CairoStatus_t"} +widget[CairoSurfaceType_t] = {0,{0},"CairoSurfaceType_t"} +widget[GtkPrintOperationPreview] = {0,{0},"GtkPrintOperationPreview"} +widget[GtkPageRange] = {0,{0},"GtkPageRange"} +widget[GdkPixbufAnimationIter] = {0,{0},"GdkPixbufAnimationIter"} + +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 + {"add_from_file",{P,S},-routine_id("addBuilderObjects")}, + {"add_from_string",{P,P},-routine_id("addBuilderObjectsStr")}, + {"get_object",{P,S},P}, + {"get_objects",{P},P,0,GSList}, + {"set_application",{P,P}}, -- 3.10 + {"get_application",{P},P}, -- 3.10 + {"connect",{P},-routine_id("builder_connect")}, + {"set_translation_domain",{P,S}}, + {"get_translation_domain",{P},S}, + {"set_application",{P,P}}, + {"get_application",{P},P,0,GtkApplication}, + {"get_type_from_name",{P,S},I}, +"GtkBuilder"} + +export constant builder = create(GtkBuilder) +object current_builder_file = "" + +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) + current_builder_file = fname + atom err = allocate(32) err = 0 + integer result = c_func(bad_from_file,{bld,fname,err}) + if result = 0 then + printf(1,"Error loading Builder from file: %s \n",{current_builder_file}) + printf(1,"Possible GTK version mismatch or other error in Glade.\n\n") + ? 1/0 + end if + return result + end function + + -- add object from string or include-file contents; + function addBuilderObjectsStr(atom bld, object str) + current_builder_file = str + atom err = allocate(32) err = 0 + integer len = length(str) + str = allocate_string(str) + integer result = c_func(bad_from_string,{bld,str,len,err}) + if result = 0 then + printf(1,"Error %d loading Builder from string or include: %s!\n", + {err,current_builder_file}) + printf(1,"\tGTK version mismatch or other error in Glade.\n\n") + 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, atom flags, atom data) + ----------------------------------------------------------------------------------------- + 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 +object x, tree +integer c,n +atom err = allocate(32) + + if file_exists(canonical_path(child)) then + set(parent,"add from file",canonical_path(child),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("]",{class,name,n}) + end ifdef + class = find(class,class_name_index) + 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 for + +end procedure + +-------------------------------------------------------------------------------------------- +procedure show_template(object handlr) -- used with Glade and GtkBuilder to prompt for missing functions +-------------------------------------------------------------------------------------------- +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 +integer x = find('#',uri) +object tmp +if x > 0 then + tmp = canonical_path(uri[1..x-1]) + if file_exists(tmp) then + uri = "file:///" & tmp & uri[x..$] + end if +else + tmp = canonical_path(uri) + if file_exists(tmp) then + uri = "file:///" & tmp + end if +end if + +atom err = allocate(100) err = 0 +object result = gtk_func("gtk_show_uri",{P,P,P,P}, + {0,allocate_string(uri),0,err}) + free(err) + +return result +end function + +-------------------------------- +export function inet_address() -- only works on linux; +-------------------------------- +object ip +sequence tmp = temp_file(,"MYIP-") +if system_exec(sprintf("ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' > %s ",{tmp}),0) = 0 then + ip = read_lines(tmp) + if length(ip) = 0 then + return "127.0.0.1" + else + return ip[1] + end if +end if +return -1 +end function + +--------------------------------- +export function inet_connected() +--------------------------------- +return not equal("127.0.0.1",inet_address()) +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) +return gtk_func("gtk_icon_theme_has_icon",{P,P},{theme,name}) +end function + +-------------------------------------------------------- +export function icon_info(object name, integer size=6) +-------------------------------------------------------- +atom theme = gtk_func("gtk_icon_theme_get_default") +atom err = allocate(32) 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 +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 named is called; + for i = 1 to length(params) do + if string(values[i]) then + values[i] = allocate_string(values[i]) + end if + end for +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, so no +-- conversion from a pointer is needed; + for i = 1 to length(params) do + if string(values[i]) then + values[i] = allocate_string(values[i]) + end if + end for + 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 "unknown" +end function + +-------------------------------------------------------------------------- +export procedure 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 + for i = 1 to length(params) do + if not atom(values) and string(values[i]) then + values[i] = allocate_string(values[i]) + 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 + +end procedure + +-- 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. +---------------------------------------------------------------------------------------- +export function define_proc(object name, object params={}) +---------------------------------------------------------------------------------------- +atom x + for i = 1 to length(LIBS) do + x = define_c_proc(LIBS[i],name,params) + if x > 0 then + return x + end if + end for + ifdef GTK_ERR then + display("? 9045 Proc []",{name}) + end ifdef + return -1 +end function + +-------------------------------------------------------------------- +export function define_func(object name, object params={}, object values=P) +-------------------------------------------------------------------- +atom x + for i = 1 to length(LIBS) do + x = define_c_func(LIBS[i],name,params,values) + if x > 0 then + return x + end if + end for + ifdef GTK_ERR then + display("? 9061 Func []",{name}) + end ifdef + return -1 +end function + +------------------------- +-- © 2015 by Irv Mullins +------------------------- diff --git a/tools/WEE/EuGTK/GtkEnums.e b/tools/WEE/EuGTK/GtkEnums.e new file mode 100644 index 0000000..227fd3c --- /dev/null +++ b/tools/WEE/EuGTK/GtkEnums.e @@ -0,0 +1,1441 @@ +---------------- +namespace enums +---------------- +export constant version = "4.9.4" + +public include std/io.e +public include std/os.e +public include std/dll.e +public include std/text.e +public include std/math.e +public include std/error.e +public include std/types.e +public include std/search.e +public include std/convert.e +public include std/console.e +public include std/filesys.e +public include std/machine.e +public include std/sequence.e +public include std/serialize.e + +public constant LGPL = read_file(canonical_path("~/demos/license.txt")) + +--------------------------------------------------------------------------------- +-- ListView/TreeView storage types. Use these when creating new +-- GtkListStores or GtkTreeStores +--------------------------------------------------------------------------------- +public enum + gCHAR = 12, gUCHAR = 16, gINT = 24, gUINT = 28, + gLONG = 32, gULONG = 36, gINT64 = 40, gUINT64 = 44, + gDBL = 60, gFLT = 56, + gSTR = 64, gPTR = 68, gBOOL= 20 +-- plus gPIX and gCOMBO, which must be defined at run-time +-- by GtkEngine.e ... don't ask me why! + +-- here's a list of GObject types; +public enum type OBJECT by 4 + void = 4, + GInterface, + gchar, + guchar, + gboolean, + gint, + guint, + glong, + gulong, + gint64, + guint64, + GEnum, + GFlags, + gfloat, + gdouble, + gchararray, + gpointer, + GBoxed, + GParam +end type + +------------------------------------------------------------------------ +-- These are the widget names used to create GTK widgets; +-- GObject MUST be first on the list. +-- Other than that, order is unimportant, but try to keep 'em in +-- alphabetical order just to be neat. +------------------------------------------------------------------------ +public enum type WIDGET + GObject, + GActionGroup, + GAppInfo, + GEmblem, + GEmblemedIcon, + GFile, + GFileIcon, + GIcon, + GIdle, + GList, + GMenu, + GMenuItem, + GMenuModel, + GSList, + GThemedIcon, + GTimeout, + Cairo_t, + CairoFontOptions, + CairoContent_t, + CairoLinearGradient, + CairoPattern, + CairoPattern_t, + CairoRadialGradient, + CairoRegion_t, + CairoImageSurface, + CairoStatus_t, + CairoSurface_t, + CairoSurfaceType_t, + GdkCairo_t, + GdkCursor, + GdkDevice, + GdkDeviceManager, + GdkDisplay, + GdkEvent, + GdkEventSequence, + GdkFrameClock, + GdkFrameTimings, + GdkGLContext, + GdkGLProfile, + GdkKeymap, + GdkKeyval, + GdkPixbuf, + GdkPixbufAnimation, + GdkPixbufAnimationIter, + GdkScreen, + GdkVisual, + GdkWindow, + GdkX11Display, + GdkX11Screen, + GdkX11Window, + GtkAboutDialog, + GtkAccelGroup, + GtkAccelLabel, + GtkAccessible, + GtkActionable, + GtkActionBar, + GtkActivatable, + GtkAdjustment, + GtkAlignment, + GtkAppChooser, + GtkAppChooserButton, + GtkAppChooserDialog, + GtkAppChooserWidget, + GtkAppLaunchContext, + GtkApplication, + GtkApplicationWindow, + GtkArrow, + GtkAspectFrame, + GtkAssistant, + GtkBin, + GtkBindingEntry, + GtkBindingSet, + GtkBox, + GtkBuildable, + GtkBuilder, + GtkButton, + GtkButtonBox, + GtkCalendar, + GtkCellArea, + GtkCellAreaBox, + GtkCellAreaCell, + GtkCellAreaContext, + GtkCellEditable, + GtkCellLayout, + GtkCellRenderer, + GtkCellRendererAccel, + GtkCellRendererCombo, + GtkCellRendererPixbuf, + GtkCellRendererProgress, + GtkCellRendererSpin, + GtkCellRendererSpinner, + GtkCellRendererText, + GtkCellRendererToggle, + GtkCellView, + GtkCheckButton, + GtkCheckMenuItem, + GtkClipboard, + GtkColorButton, + GtkColorChooser, + GtkColorChooserDialog, + GtkColorChooserWidget, + GtkColorSelection, + GtkColorSelectionDialog, + GtkComboBox, + GtkComboBoxEntry, + GtkComboBoxText, + GtkContainer, + GtkCssProvider, + GtkCssSection, + GtkDialog, + GtkDrag, + GtkDrawingArea, + GtkEditable, + GtkEntry, + GtkEntryBuffer, + GtkEntryCompletion, + GtkEventBox, + GtkEventController, + GtkExpander, + GtkFileChooser, + GtkFileChooserButton, + GtkFileChooserDialog, + GtkFileChooserWidget, + GtkFileFilter, + GtkFixed, + GtkFlowBox, + GtkFlowBoxChild, + GtkFontButton, + GtkFontChooser, + GtkFontChooserDialog, + GtkFontChooserWidget, + GtkFrame, + GtkGesture, + GtkGestureSingle, + GtkGestureDrag, + GtkGestureLongPress, + GtkGestureMultiPress, + GtkGesturePan, + GtkGestureRotate, + GtkGestureSwipe, + GtkGestureZoom, + GtkGLArea, + GtkGrid, + GtkHeaderBar, + GtkIconInfo, + GtkIconTheme, + GtkIconView, + GtkImage, + GtkImageMenuItem, + GtkInfoBar, + GtkInvisible, + GtkLabel, + GtkLayout, + GtkLevelBar, + GtkLinkButton, + GtkListBox, + GtkListBoxRow, + GtkListStore, + GtkLockButton, + GtkMenu, + GtkMenuBar, + GtkMenuButton, + GtkMenuItem, + GtkMenuShell, + GtkMenuToolButton, + GtkMessageDialog, + GtkMisc, + GtkModelButton, + GtkMountOperation, + GtkNotebook, + GtkNumerableIcon, + GtkOffscreenWindow, + GtkOrientable, + GtkOverlay, + GtkPaperSize, + GtkPageRange, + GtkPageSetup, + GtkPageSetupUnixDialog, + GtkPaned, + GtkPlacesSidebar, + GtkPlug, + GtkPopover, + GtkPopoverMenu, + GtkPrinter, + GtkPrintContext, + GtkPrintJob, + GtkPrintSettings, + GtkPrintOperation, + GtkPrintOperationPreview, + GtkPrintUnixDialog, + GtkProgressBar, + GtkRadioButton, + GtkRadioMenuItem, + GtkRadioToolButton, + GtkRange, + GtkRcStyle, + GtkRecentChooser, + GtkRecentChooserDialog, + GtkRecentChooserMenu, + GtkRecentChooserWidget, + GtkRecentFilter, + GtkRecentInfo, + GtkRevealer, + GtkScale, + GtkScaleButton, + GtkScrollable, + GtkScrollbar, + GtkScrolledWindow, + GtkSearchBar, + GtkSearchEntry, + GtkSelectionData, + GtkSeparator, + GtkSeparatorMenuItem, + GtkSeparatorToolItem, + GtkSettings, + GtkSocket, + GtkSidebar, + GtkSizeGroup, + GtkSpinButton, + GtkSpinner, + GtkStack, + GtkStackSidebar, + GtkStackSwitcher, + GtkStatusbar, + GtkStatusIcon, + GtkStock, + GtkStockList, + GtkStyle, + GtkStyleContext, + GtkStyleProvider, + GtkSwitch, + GtkTargetEntry, + GtkTargetList, + GtkTextAttributes, + GtkTextBuffer, + GtkTextChildAnchor, + GtkTextMark, + GtkTextTag, + GtkTextTagTable, + GtkTextView, + GtkThemedIcon, + GtkToggleButton, + GtkToggleToolButton, + GtkToolbar, + GtkToolButton, + GtkToolItem, + GtkToolItemGroup, + GtkToolPalette, + GtkToolShell, + GtkTooltip, + GtkTreeDragDest, + GtkTreeDragSource, + GtkTreeIter, + GtkTreeModel, + GtkTreeModelFilter, + GtkTreeModelSort, + GtkTreePath, + GtkTreeRowReference, + GtkTreeSelection, + GtkTreeSortable, + GtkTreeStore, + GtkTreeView, + GtkTreeViewColumn, + GtkViewport, + GtkVolumeButton, + GtkWidget, + GtkWidgetPath, + GtkWindow, + GtkWindowGroup, + PangoCairoLayout, + PangoContext, + PangoFont, + PangoFontSet, + PangoFontsetSimple, + PangoFontDescription, + PangoFontFace, + PangoFontFamily, + PangoFontMap, + PangoLanguage, + PangoLayout, + PangoLayoutIter, + PangoLayoutLine, + PangoLayoutRun, + PangoTabArray +end type + +global integer GtkFinal = PangoTabArray + 1 + +------------------------------------------------------------------------ + +public enum -- Response codes returned by button presses, etc; + MB_YES = -8, + MB_NO = -9, + MB_OK = -5, + MB_CANCEL = -6, + MB_CLOSE = -7, + MB_ABORT = -4, + MB_NONE = -1, + MB_REJECT = -2, + MB_ACCEPT = -3, + MB_APPLY = -10, + MB_HELP = -11 + +public enum -- Orientation: + VERTICAL = 1, HORIZONTAL = 0 + +public enum -- Sort Order: + UNSORTED = -1, ASCENDING = 1, DESCENDING = 2 + +public enum by 2 -- Cursors: + GDK_X_CURSOR = 0, + GDK_ARROW, + GDK_BASED_ARROW_DOWN, + GDK_BASED_ARROW_UP, + GDK_BOAT, + GDK_BOGOSITY, + GDK_BOTTOM_LEFT_CORNER, + GDK_BOTTOM_RIGHT_CORNER, + GDK_BOTTOM_SIDE, + GDK_BOTTOM_TEE, + GDK_BOX_SPIRAL, + GDK_CENTER_PTR, + GDK_CIRCLE, + GDK_CLOCK, + GDK_COFFEE_MUG, + GDK_CROSS, + GDK_CROSS_REVERSE, + GDK_CROSSHAIR, + GDK_DIAMOND_CROSS, + GDK_DOT, + GDK_DOTBOX, + GDK_DOUBLE_ARROW, + GDK_DRAFT_LARGE, + GDK_DRAFT_SMALL, + GDK_DRAPED_BOX, + GDK_EXCHANGE, + GDK_FLEUR, + GDK_GOBBLER, + GDK_GUMBY, + GDK_HAND1, + GDK_HAND2, + GDK_HEART, + GDK_ICON, + GDK_IRON_CROSS, + GDK_LEFT_PTR, + GDK_LEFT_SIDE, + GDK_LEFT_TEE, + GDK_LEFTBUTTON, + GDK_LL_ANGLE, + GDK_LR_ANGLE, + GDK_MAN, + GDK_MIDDLEBUTTON, + GDK_MOUSE, + GDK_PENCIL, + GDK_PIRATE, + GDK_PLUS, + GDK_QUESTION_ARROW, + GDK_RIGHT_PTR, + GDK_RIGHT_SIDE, + GDK_RIGHT_TEE, + GDK_RIGHTBUTTON, + GDK_RTL_LOGO, + GDK_SAILBOAT, + GDK_SB_DOWN_ARROW, + GDK_SB_H_DOUBLE_ARROW, + GDK_SB_LEFT_ARROW, + GDK_SB_RIGHT_ARROW, + GDK_SB_UP_ARROW, + GDK_SB_V_DOUBLE_ARROW, + GDK_SHUTTLE, + GDK_SIZING, + GDK_SPIDER, + GDK_SPRAYCAN, + GDK_STAR, + GDK_TARGET, + GDK_TCROSS, + GDK_TOP_LEFT_ARROW, + GDK_TOP_LEFT_CORNER, + GDK_TOP_RIGHT_CORNER, + GDK_TOP_SIDE, + GDK_TOP_TEE, + GDK_TREK, + GDK_UL_ANGLE, + GDK_UMBRELLA, + GDK_UR_ANGLE, + GDK_WATCH, + GDK_XTERM, + GDK_LAST_CURSOR = 153, + GDK_BLANK_CURSOR = -2, + GDK_CURSOR_IS_PIXMAP = -1 + +public enum + + GTK_LICENSE_UNKNOWN = 0, + GTK_LICENSE_CUSTOM, + GTK_LICENSE_GPL_2_0, + GTK_LICENSE_GPL_3_0, + GTK_LICENSE_LGPL_2_1, + GTK_LICENSE_LGPL_3_0, + GTK_LICENSE_BSD, + GTK_LICENSE_MIT_X11, + GTK_LICENSE_ARTISTIC, + + GTK_ACCEL_VISIBLE = 1, + GTK_ACCEL_LOCKED = 2, + GTK_ACCEL_MASK = 7, + + GTK_ALIGN_FILL = 0, + GTK_ALIGN_START, + GTK_ALIGN_END, + GTK_ALIGN_CENTER, + + GTK_ANCHOR_CENTER = 0, + GTK_ANCHOR_NORTH, + GTK_ANCHOR_NORTH_WEST, + GTK_ANCHOR_NORTH_EAST, + GTK_ANCHOR_SOUTH, + GTK_ANCHOR_SOUTH_WEST, + GTK_ANCHOR_SOUTH_EAST, + GTK_ANCHOR_WEST, + GTK_ANCHOR_EAST, + GTK_ANCHOR_N = 1, + GTK_ANCHOR_NW, + GTK_ANCHOR_NE, + GTK_ANCHOR_S, + GTK_ANCHOR_SW, + GTK_ANCHOR_SE, + GTK_ANCHOR_W, + GTK_ANCHOR_E, + + GTK_APPLICATION_INHIBIT_LOGOUT = 1, + GTK_APPLICATION_INHIBIT_SWITCH = 2, + GTK_APPLICATION_INHIBIT_SUSPEND = 4, + GTK_APPLICATION_INHIBIT_IDLE = 8, + + G_APPLICATION_FLAGS_NONE = 0, + G_APPLICATION_IS_SERVICE, + G_APPLICATION_IS_LAUNCHER, + G_APPLICATION_HANDLES_OPEN = 4, + G_APPLICATION_HANDLES_COMMAND_LINE = 8, + G_APPLICATION_SEND_ENVIRONMENT = 16, + G_APPLICATION_NON_UNIQUE = 32, + +-- arrows are deprecated + GTK_ARROWS_BOTH = 0, + GTK_ARROWS_START, + GTK_ARROWS_END, + + GTK_ARROW_UP = 0, + GTK_ARROW_DOWN, + GTK_ARROW_LEFT, + GTK_ARROW_RIGHT, + GTK_ARROW_NONE, + + GTK_ASSISTANT_PAGE_CONTENT = 0, + GTK_ASSISTANT_PAGE_INTRO, + GTK_ASSISTANT_PAGE_CONFIRM, + GTK_ASSISTANT_PAGE_SUMMARY, + GTK_ASSISTANT_PAGE_PROGRESS, + GTK_ASSISTANT_PAGE_CUSTOM, + + GTK_EXPAND = 1, + GTK_SHRINK = 2, + GTK_FILL = 4, + + GTK_BASELINE_POSITION_TOP = 0, + GTK_BASELINE_POSITION_CENTER, + GTK_BASELINE_POSITION_BOTTOM, + + GTK_BORDER_STYLE_NONE = 0, + GTK_BORDER_STYLE_SOLID, + GTK_BORDER_STYLE_INSET, + GTK_BORDER_STYLE_OUTSET, + GTK_BORDER_STYLE_HIDDEN, + GTK_BORDER_STYLE_DOTTED, + GTK_BORDER_STYLE_DASHED, + GTK_BORDER_STYLE_DOUBLE, + GTK_BORDER_STYLE_GROOVE, + GTK_BORDER_STYLE_RIDGE, + + GTK_BUTTON_ROLE_NORMAL = 0, + GTK_BUTTON_ROLE_CHECK, + GTK_BUTTON_ROLE_RADIO, + + GTK_BUTTONS_NONE = 0, + GTK_BUTTONS_OK, + GTK_BUTTONS_CLOSE, + GTK_BUTTONS_CANCEL, + GTK_BUTTONS_YES_NO, + GTK_BUTTONS_OK_CANCEL, + + GTK_BUTTONBOX_DEFAULT_STYLE = 0, + GTK_BUTTONBOX_SPREAD, + GTK_BUTTONBOX_EDGE, + GTK_BUTTONBOX_START, + GTK_BUTTONBOX_END, + GTK_BUTTONBOX_CENTER, + GTK_BUTTONBOX_EXPAND, + + GTK_CALENDAR_SHOW_HEADING = 1, + GTK_CALENDAR_SHOW_DAY_NAMES = 2, + GTK_CALENDAR_NO_MONTH_CHANGE = 4, + GTK_CALENDAR_SHOW_WEEK_NUMBERS = 8, + GTK_CALENDAR_SHOW_DETAILS = 16, + + GTK_CORNER_TOP_LEFT = 0, + GTK_CORNER_BOTTOM_LEFT, + GTK_CORNER_TOP_RIGHT, + GTK_CORNER_BOTTOM_RIGHT, + + GTK_CURVE_TYPE_LINEAR = 0, + GTK_CURVE_TYPE_SPLINE, + GTK_CURVE_TYPE_FREE, + + GTK_DELETE_CHARS = 0, + GTK_DELETE_WORD_ENDS, + GTK_DELETE_WORDS, + GTK_DELETE_DISPLAY_LINES, + GTK_DELETE_DISPLAY_LINE_ENDS, + GTK_DELETE_PARAGRAPH_ENDS, + GTK_DELETE_PARAGRAPHS, + GTK_DELETE_WHITESPACE, + + GTK_DIALOG_NON_MODAL = 0, + GTK_DIALOG_MODAL = 1, + GTK_DIALOG_DESTROY_WITH_PARENT = 2, + GTK_DIALOG_NO_SEPARATOR = 4, + + NON_MODAL = -1, -- for EuGTK + + GTK_DIR_TAB_FORWARD = 0, + GTK_DIR_TAB_BACKWARD, + GTK_DIR_UP, + GTK_DIR_DOWN, + GTK_DIR_LEFT, + GTK_DIR_RIGHT, + + GTK_EVENT_SEQUENCE_NONE = 0, + GTK_EVENT_SEQUENCE_CLAIMED, + GTK_EVENT_SEQUENCE_DENIED, + + GTK_EXPANDER_COLLAPSED = 0, + GTK_EXPANDER_SEMI_COLLAPSED, + GTK_EXPANDER_SEMI_EXPANDED, + GTK_EXPANDER_EXPANDED, + + GTK_FILE_CHOOSER_ACTION_OPEN = 0, + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, + + GTK_ICON_SIZE_INVALID = 0, + GTK_ICON_SIZE_MENU, + GTK_ICON_SIZE_SMALL_TOOLBAR, + GTK_ICON_SIZE_LARGE_TOOLBAR, + GTK_ICON_SIZE_BUTTON, + GTK_ICON_SIZE_DND, + GTK_ICON_SIZE_DIALOG, + + GTK_ICON_LOOKUP_NO_SVG = 1, + GTK_ICON_LOOKUP_FORCE_SVG = 2, + GTK_ICON_LOOKUP_USE_BUILTIN = 4, + GTK_ICON_LOOKUP_GENERIC_FALLBACK = 8, + GTK_ICON_LOOKUP_FORCE_SIZE = 16, + + GTK_IMAGE_EMPTY = 0, + GTK_IMAGE_PIXBUF, + GTK_IMAGE_STOCK, + GTK_IMAGE_ICON_SET, + GTK_IMAGE_ANIMATION, + GTK_IMAGE_ICON_NAME, + GTK_IMAGE_GICON, + + GTK_IM_PREEDIT_NOTHING = 0, + GTK_IM_PREEDIT_CALLBACK, + GTK_IM_PREEDIT_NONE, + + GTK_IM_STATUS_NOTHING = 0, + GTK_IM_STATUS_CALLBACK, + GTK_IM_STATUS_NONE, + + GTK_INPUT_HINT_NONE = 0, + GTK_INPUT_HINT_SPELLCHECK, + GTK_INPUT_HINT_NO_SPELLCHECK, + GTK_INPUT_HINT_WORD_COMPLETION = 4, + GTK_INPUT_HINT_LOWERCASE = 8, + GTK_INPUT_HINT_UPPERCASE_CHARS = 16, + GTK_INPUT_HINT_UPPERCASE_WORDS = 32, + GTK_INPUT_HINT_UPPERCASE_SENTENCES = 64, + + GTK_JUSTIFY_LEFT = 0, + GTK_JUSTIFY_RIGHT, + GTK_JUSTIFY_CENTER, + GTK_JUSTIFY_FILL, + + GTK_LEVEL_BAR_MODE_CONTINUOUS = 0, + GTK_LEVEL_BAR_MODE_DISCRETE, + + GTK_MATCH_ALL = 0, + GTK_MATCH_ALL_TAIL, + GTK_MATCH_HEAD, + GTK_MATCH_TAIL, + GTK_MATCH_EXACT, + GTK_MATCH_LAST, + + GTK_PIXELS = 0, + GTK_INCHES, + GTK_CENTIMETERS, + + GTK_MESSAGE_INFO = 0, + GTK_MESSAGE_WARNING, + GTK_MESSAGE_QUESTION, + GTK_MESSAGE_ERROR, + GTK_MESSAGE_OTHER, + + GTK_ICON_INFO = 0, + GTK_ICON_WARNING, + GTK_ICON_QUESTION, + GTK_ICON_ERROR, + GTK_ICON_OTHER, + + GTK_MOVEMENT_LOGICAL_POSITIONS = 0, + GTK_MOVEMENT_VISUAL_POSITIONS, + GTK_MOVEMENT_WORDS, + GTK_MOVEMENT_DISPLAY_LINES, + GTK_MOVEMENT_DISPLAY_LINE_ENDS, + GTK_MOVEMENT_PARAGRAPHS, + GTK_MOVEMENT_PARAGRAPH_ENDS, + GTK_MOVEMENT_PAGES, + GTK_MOVEMENT_BUFFER_ENDS, + GTK_MOVEMENT_HORIZONTAL_PAGES, + + GTK_ORIENTATION_HORIZONTAL = 0, + GTK_ORIENTATION_VERTICAL, + + GTK_PACK_START = 0, + GTK_PACK_END, + + GTK_PAN_DIRECTION_LEFT = 0, + GTK_PAN_DIRECTION_RIGHT, + GTK_PAN_DIRECTION_UP, + GTK_PAN_DIRECTION_DOWN, + + GTK_PATH_PRIO_LOWEST = 0, + GTK_PATH_PRIO_GTK = 4, + GTK_PATH_PRIO_APPLICATION = 8, + GTK_PATH_PRIO_THEME = 10, + GTK_PATH_PRIO_RC = 12, + GTK_PATH_PRIO_HIGHEST = 15, + + GTK_PATH_WIDGET = 0, + GTK_PATH_WIDGET_CLASS, + GTK_PATH_CLASS, + + GTK_PHASE_NONE = 0, + GTK_PHASE_CAPTURE, + GTK_PHASE_BUBBLE, + GTK_PHASE_TARGET, + + GTK_POLICY_ALWAYS = 0, + GTK_POLICY_AUTOMATIC, + GTK_POLICY_NEVER, + + GTK_POS_LEFT = 0, + GTK_POS_RIGHT, + GTK_POS_TOP, + GTK_POS_BOTTOM, + LEFT = 0, --aliases; + RIGHT, + TOP, + BOTTOM + +public enum by * 2 + GTK_PRINT_CAPABILITY_PAGE_SET = 0, + GTK_PRINT_CAPABILITY_COPIES = 2, + GTK_PRINT_CAPABILITY_COLLATE, + GTK_PRINT_CAPABILITY_REVERSE, + GTK_PRINT_CAPABILITY_SCALE, + GTK_PRINT_CAPABILITY_GENERATE_PDF, + GTK_PRINT_CAPABILITY_GENERATE_PS, + GTK_PRINT_CAPABILITY_PREVIEW, + GTK_PRINT_CAPABILITY_NUMBER_UP, + GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT, + + GTK_REGION_EVEN = 0, + GTK_REGION_ODD = 1, + GTK_REGION_FIRST, + GTK_REGION_LAST, + GTK_REGION_ONLY, + GTK_REGION_SORTED, + + GTK_STATE_FLAG_NORMAL = 0, + GTK_STATE_FLAG_ACTIVE = 1, + GTK_STATE_FLAG_PRELIGHT, + GTK_STATE_FLAG_SELECTED, + GTK_STATE_FLAG_INSENSITIVE, + GTK_STATE_FLAG_INCONSISTENT, + GTK_STATE_FLAG_FOCUSED, + GTK_STATE_FLAG_BACKDROP, + GTK_STATE_FLAG_DIR_LTR , + GTK_STATE_FLAG_DIR_RTL, + GTK_STATE_FLAG_LINK, + GTK_STATE_FLAG_VISITED, + GTK_STATE_FLAG_CHECKED + +public enum + GTK_PROGRESS_LEFT_TO_RIGHT = 0, + GTK_PROGRESS_RIGHT_TO_LEFT, + GTK_PROGRESS_BOTTOM_TO_TOP, + GTK_PROGRESS_TOP_TO_BOTTOM, + + GTK_RELIEF_NORMAL = 0, + GTK_RELIEF_HALF, + GTK_RELIEF_NONE, + + GTK_RESIZE_PARENT = 0, + GTK_RESIZE_QUEUE, + GTK_RESIZE_IMMEDIATE, + + GTK_REVEALER_TRANSITION_TYPE_NONE = 0, + GTK_REVEALER_TRANSITION_TYPE_CROSSFADE, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP, + GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN, + + GTK_SCROLL_STEPS = 0, + GTK_SCROLL_PAGES, + GTK_SCROLL_ENDS, + GTK_SCROLL_HORIZONTAL_STEPS, + GTK_SCROLL_HORIZONTAL_PAGES, + GTK_SCROLL_HORIZONTAL_ENDS, + + GTK_SCROLL_NONE = 0, + GTK_SCROLL_JUMP, + GTK_SCROLL_STEP_BACKWARD, + GTK_SCROLL_STEP_FORWARD, + GTK_SCROLL_PAGE_BACKWARD, + GTK_SCROLL_PAGE_FORWARD, + GTK_SCROLL_STEP_UP, + GTK_SCROLL_STEP_DOWN, + GTK_SCROLL_PAGE_UP, + GTK_SCROLL_PAGE_DOWN, + GTK_SCROLL_STEP_LEFT, + GTK_SCROLL_STEP_RIGHT, + GTK_SCROLL_PAGE_LEFT, + GTK_SCROLL_PAGE_RIGHT, + GTK_SCROLL_START, + GTK_SCROLL_END, + + GTK_SELECTION_NONE = 0, + GTK_SELECTION_SINGLE, + GTK_SELECTION_BROWSE, + GTK_SELECTION_MULTIPLE, + + GTK_SHADOW_NONE = 0, + GTK_SHADOW_IN, + GTK_SHADOW_OUT, + GTK_SHADOW_ETCHED_IN, + GTK_SHADOW_ETCHED_OUT, + + GTK_STATE_NORMAL = 0, + GTK_STATE_ACTIVE, + GTK_STATE_PRELIGHT, + GTK_STATE_SELECTED, + GTK_STATE_INSENSITIVE, + GTK_STATE_INCONSISTENT, + GTK_STATE_FOCUSED, + GTK_STATE_PRESSED = 1, + GTK_STATE_MOUSEOVER, + + GTK_TEXT_DIR_NONE = 0, + GTK_TEXT_DIR_LTR, + GTK_TEXT_DIR_RTL, + + GTK_TOOLBAR_ICONS = 0, + GTK_TOOLBAR_TEXT, + GTK_TOOLBAR_BOTH, + GTK_TOOLBAR_BOTH_HORIZ, + + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID = -1, + GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID = -2, + + GTK_UPDATE_CONTINUOUS = 0, + GTK_UPDATE_DISCONTINUOUS, + GTK_UPDATE_DELAYED, + + GTK_VISIBILITY_NONE = 0, + GTK_VISIBILITY_PARTIAL, + GTK_VISIBILITY_FULL, + + GTK_WIN_POS_NONE = 0, + GTK_WIN_POS_CENTER, + GTK_WIN_POS_MOUSE, + GTK_WIN_POS_CENTER_ALWAYS, + GTK_WIN_POS_CENTER_ON_PARENT, + + GTK_WINDOW_TOPLEVEL = 0, + GTK_WINDOW_POPUP, + + GTK_SORT_ASCENDING = 1, + GTK_SORT_DESCENDING, + + GTK_DRAG_RESULT_SUCCESS = 0, + GTK_DRAG_RESULT_NO_TARGET, + GTK_DRAG_RESULT_USER_CANCELLED, + GTK_DRAG_RESULT_TIMEOUT_EXPIRED, + GTK_DRAG_RESULT_GRAB_BROKEN, + GTK_DRAG_RESULT_ERROR, + + PANGO_ELLIPSIZE_NONE = 0, + PANGO_ELLIPSIZE_START, + PANGO_ELLIPSIZE_MIDDLE, + PANGO_ELLIPSIZE_END, + + GDK_SOLID = 0, + GDK_TILED, + GDK_STIPPLED, + GDK_OPAQUE_STIPPLED, + + GTK_RESPONSE_NONE = -1, + GTK_RESPONSE_REJECT = -2, + GTK_RESPONSE_ACCEPT = -3, + GTK_RESPONSE_DELETE_EVENT = -4, + GTK_RESPONSE_OK = -5, + GTK_RESPONSE_CANCEL = -6, + GTK_RESPONSE_CLOSE = -7, + GTK_RESPONSE_YES = -8, + GTK_RESPONSE_NO = -9, + GTK_RESPONSE_APPLY = -10, + GTK_RESPONSE_HELP = -11, + + GTK_TREE_VIEW_COLUMN_GROW_ONLY = 0, + GTK_TREE_VIEW_COLUMN_AUTOSIZE, + GTK_TREE_VIEW_COLUMN_FIXED, + + GTK_TREE_VIEW_GRID_LINES_NONE = 0, + GTK_TREE_VIEW_GRID_LINES_HORIZONTAL, + GTK_TREE_VIEW_GRID_LINES_VERTICAL, + GTK_TREE_VIEW_GRID_LINES_BOTH, + + GTK_TEXT_WINDOW_PRIVATE = 0, + GTK_TEXT_WINDOW_WIDGET, + GTK_TEXT_WINDOW_TEXT, + GTK_TEXT_WINDOW_LEFT, + GTK_TEXT_WINDOW_RIGHT, + GTK_TEXT_WINDOW_TOP, + GTK_TEXT_WINDOW_BOTTOM, + + G_USER_DIRECTORY_DESKTOP = 0, + G_USER_DIRECTORY_DOCUMENTS, + G_USER_DIRECTORY_DOWNLOAD, + G_USER_DIRECTORY_MUSIC, + G_USER_DIRECTORY_PICTURES, + G_USER_DIRECTORY_PUBLIC_SHARE, + G_USER_DIRECTORY_TEMPLATES, + G_USER_DIRECTORY_VIDEOS, + G_USER_N_DIRECTORIES, + + GTK_WRAP_NONE = 0, + GTK_WRAP_CHAR, + GTK_WRAP_WORD, + GTK_WRAP_WORD_CHAR, + + GDK_WINDOW_TYPE_HINT_NORMAL = 0, + GDK_WINDOW_TYPE_HINT_DIALOG, + GDK_WINDOW_TYPE_HINT_MENU, + GDK_WINDOW_TYPE_HINT_TOOLBAR, + GDK_WINDOW_TYPE_HINT_SPLASHSCREEN, + GDK_WINDOW_TYPE_HINT_UTILITY, + GDK_WINDOW_TYPE_HINT_DOCK, + GDK_WINDOW_TYPE_HINT_DESKTOP, + GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU, + GDK_WINDOW_TYPE_HINT_POPUP_MENU, + GDK_WINDOW_TYPE_HINT_TOOLTIP, + GDK_WINDOW_TYPE_HINT_NOTIFICATION, + GDK_WINDOW_TYPE_HINT_COMBO, + GDK_WINDOW_TYPE_HINT_DND, + + GDK_ACTION_DEFAULT = 0, + GDK_ACTION_COPY = 1, + GDK_ACTION_MOVE = 2, + GDK_ACTION_LINK = 4, + GDK_ACTION_PRIVATE = 8, + GDK_ACTION_ASK = 16, + + GTK_CELL_RENDERER_MODE_INERT = 0, + GTK_CELL_RENDERER_MODE_ACTIVATABLE, + GTK_CELL_RENDERER_MODE_EDITABLE, + + GTK_CELL_RENDERER_ACCEL_MODE_GTK = 0, + GTK_CELL_RENDERER_ACCEL_MODE_OTHER, + + GTK_DEST_DEFAULT_MOTION = 1, + GTK_DEST_DEFAULT_HIGHLIGHT = 2, + GTK_DEST_DEFAULT_DROP = 4, + GTK_DEST_DEFAULT_ALL = 0x07, + + GTK_SIZE_GROUP_NONE = 0, + GTK_SIZE_GROUP_HORIZONTAL, + GTK_SIZE_GROUP_VERTICAL, + GTK_SIZE_GROUP_BOTH + +public enum + MOUSE_BUTTON1 = 1, + MOUSE_BUTTON2, + MOUSE_BUTTON3 + +public enum + PANGO_SCALE = 1000, + PANGO_STYLE_NORMAL= 0, + PANGO_STYLE_OBLIQUE, + PANGO_STYLE_ITALIC, + + PANGO_STRETCH_ULTRA_CONDENSED = 0, + PANGO_STRETCH_EXTRA_CONDENSED, + PANGO_STRETCH_CONDENSED, + PANGO_STRETCH_SEMI_CONDENSED, + PANGO_STRETCH_NORMAL, + PANGO_STRETCH_SEMI_EXPANDED, + PANGO_STRETCH_EXPANDED, + PANGO_STRETCH_EXTRA_EXPANDED, + PANGO_STRETCH_ULTRA_EXPANDED, + + PANGO_VARIANT_NORMAL=1, + PANGO_VARIANT_SMALL_CAPS, + + PANGO_WEIGHT_THIN = 100, + PANGO_WEIGHT_ULTRALIGHT = 200, + PANGO_WEIGHT_LIGHT = 300, + PANGO_WEIGHT_BOOK = 380, + PANGO_WEIGHT_NORMAL = 400, + PANGO_WEIGHT_MEDIUM = 500, + PANGO_WEIGHT_SEMIBOLD = 600, + PANGO_WEIGHT_BOLD = 700, + PANGO_WEIGHT_ULTRABOLD = 800, + PANGO_WEIGHT_HEAVY = 900, + PANGO_WEIGHT_ULTRAHEAVY = 1000, + PANGO_UNIT = 1024 + +public enum + GTK_RECENT_SORT_NONE = 0, + GTK_RECENT_SORT_MRU, + GTK_RECENT_SORT_LRU, + GTK_RECENT_SORT_CUSTOM + + public enum by * 2 -- GdkModifierTypes + GDK_SHIFT_MASK = 1, + GDK_LOCK_MASK, + GDK_CONTROL_MASK, + GDK_MOD1_MASK, -- Alt+ + GDK_MOD2_MASK, + GDK_MOD3_MASK, + GDK_MOD4_MASK, + GDK_MOD5_MASK, + GDK_BUTTON1_MASK, + GDK_BUTTON2_MASK, + GDK_BUTTON3_MASK, + GDK_BUTTON4_MASK, + GDK_BUTTON5_MASK, + SHFT = 1, -- 'shorthand' versions of above + LOCK, + CTL, + ALT + + public enum -- events + GDK_NOTHING = -1, + GDK_DELETE, + GDK_DESTROY, + GDK_EXPOSE, + GDK_MOTION_NOTIFY, + GDK_BUTTON_PRESS, + GDK_2BUTTON_PRESS, + GDK_3BUTTON_PRESS, + GDK_BUTTON_RELEASE, + GDK_KEY_PRESS, + GDK_KEY_RELEASE, + GDK_ENTER_NOTIFY, + GDK_LEAVE_NOTIFY, + GDK_FOCUS_CHANGE, + GDK_CONFIGURE, + GDK_MAP, + GDK_UNMAP + +public enum -- event masks + GDK_EXPOSURE_MASK = 2, + GDK_POINTER_MOTION_MASK = 4, + GDK_POINTER_MOTION_HINT_MASK = 8, + GDK_BUTTON_MOTION_MASK = 16, + GDK_BUTTON1_MOTION_MASK = #20, + GDK_BUTTON2_MOTION_MASK = #40, + GDK_BUTTON3_MOTION_MASK = #80, + GDK_BUTTON_PRESS_MASK = #100, + GDK_BUTTON_RELEASE_MASK = #200, + GDK_KEY_PRESS_MASK = #400, + GDK_KEY_RELEASE_MASK = #800, + GDK_ENTER_NOTIFY_MASK = #1000, + GDK_LEAVE_NOTIFY_MASK = #2000, + GDK_FOCUS_CHANGE_MASK = #4000, + GDK_STRUCTURE_MASK = #8000, + GDK_PROPERTY_CHANGE_MASK = #10000, + GDK_VISIBILITY_NOTIFY_MASK = #20000, + GDK_PROXIMITY_IN_MASK = #40000, + GDK_PROXIMITY_OUT_MASK = #80000, + GDK_SUBSTRUCTURE_MASK = #100000, + GDK_SCROLL_MASK = #200000, + GDK_ALL_EVENTS_MASK = #3FFFFE, + + GDK_PROPERTY_NOTIFY = 16, + GDK_SELECTION_CLEAR, + GDK_SELECTION_REQUEST, + GDK_SELECTION_NOTIFY, + GDK_PROXIMITY_IN, + GDK_PROXIMITY_OUT, + GDK_DRAG_ENTER, + GDK_DRAG_LEAVE, + GDK_DRAG_MOTION, + GDK_DRAG_STATUS, + GDK_DROP_START, + GDK_DROP_FINISHED, + GDK_CLIENT_EVENT, + GDK_VISIBILITY_NOTIFY, + GDK_NO_EXPOSE, + GDK_SCROLL, + GDK_WINDOW_STATE, + GDK_SETTING, + GDK_OWNER_CHANGE, + GDK_GRAB_BROKEN, + GDK_DAMAGE, + + GDK_FULLSCREEN_ON_CURRENT_MONITOR = 0, + GDK_FULLSCREEN_ON_ALL_MONITORS, + + GTK_PAGE_SET_ALL = 0, + GTK_PAGE_SET_EVEN, + GTK_PAGE_SET_ODD, + + GTK_PAGE_ORIENTATION_PORTRAIT = 0, + GTK_PAGE_ORIENTATION_LANDSCAPE, + GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT, + GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE, + + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG = 0, + GTK_PRINT_OPERATION_ACTION_PRINT, + GTK_PRINT_OPERATION_ACTION_PREVIEW, + GTK_PRINT_OPERATION_ACTION_EXPORT, + + GTK_PRINT_OPERATION_RESULT_ERROR = 0, + GTK_PRINT_OPERATION_RESULT_APPLY, + GTK_PRINT_OPERATION_RESULT_CANCEL, + GTK_PRINT_OPERATION_RESULT_IN_PROGRESS, + + GTK_PRINT_STATUS_INITIAL = 0, + GTK_PRINT_STATUS_PREPARING, + GTK_PRINT_STATUS_GENERATING_DATA, + GTK_PRINT_STATUS_SENDING_DATA, + GTK_PRINT_STATUS_PENDING, + GTK_PRINT_STATUS_PENDING_ISSUE, + GTK_PRINT_STATUS_PRINTING, + GTK_PRINT_STATUS_FINISHED, + GTK_PRINT_STATUS_FINISHED_ABORTED, + + GTK_PRINT_DUPLEX_SIMPLE = 0, + GTK_PRINT_DUPLEX_HORIZONTAL, + GTK_PRINT_DUPLEX_VERTICAL, + + GTK_PRINT_PAGES_ALL = 0, + GTK_PRINT_PAGES_CURRENT, + GTK_PRINT_PAGES_RANGES, + GTK_PRINT_PAGES_SELECTION, + + GTK_PRINT_QUALITY_LOW = 0, + GTK_PRINT_QUALITY_NORMAL, + GTK_PRINT_QUALITY_HIGH, + GTK_PRINT_QUALITY_DRAFT, + + GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM = 0, + GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP, + GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TOP_BOTTOM, + GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP, + GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT, + GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT, + GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT, + GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT, + + GTK_STYLE_PROVIDER_PRIORITY_FALLBACK = 1, + GTK_STYLE_PROVIDER_PRIORITY_THEME = 200, + GTK_STYLE_PROVIDER_PRIORITY_SETTINGS = 400, + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION = 600, + GTK_STYLE_PROVIDER_PRIORITY_USER = 800, + + GTK_UNIT_PIXEL = 0, + GTK_UNIT_POINTS, + GTK_UNIT_INCH, + GTK_UNIT_MM, + + GTK_STACK_TRANSITION_TYPE_NONE = 0, + GTK_STACK_TRANSITION_TYPE_CROSSFADE, + GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT, + GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT, + GTK_STACK_TRANSITION_TYPE_SLIDE_UP, + GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN, + GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT, + GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_UP, -- GTK3.12 from here down + GTK_STACK_TRANSITION_TYPE_OVER_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_LEFT, + GTK_STACK_TRANSITION_TYPE_OVER_RIGHT, + GTK_STACK_TRANSITION_TYPE_UNDER_UP, + GTK_STACK_TRANSITION_TYPE_UNDER_DOWN, + GTK_STACK_TRANSITION_TYPE_UNDER_LEFT, + GTK_STACK_TRANSITION_TYPE_UNDER_RIGHT, + GTK_STACK_TRANSITION_TYPE_OVER_UP_DOWN, + GTK_STACK_TRANSITION_TYPE_OVER_DOWN_UP, -- GTK3.14 from here down + GTK_STACK_TRANSITION_TYPE_OVER_LEFT_RIGHT, + GTK_STACK_TRANSITION_TYPE_OVER_RIGHT_LEFT, + + GTK_PLACES_OPEN_NORMAL = 0, + GTK_PLACES_OPEN_NEW_TAB, + GTK_PLACES_OPEN_NEW_WINDOW, + + GDK_PIXBUF_ROTATE_NONE = 0, + GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE = 90, + GDK_PIXBUF_ROTATE_UPSIDEDOWN = 180, + GDK_PIXBUF_ROTATE_CLOCKWISE = 270, + + GDK_INTERP_NEAREST = 0, + GDK_INTERP_TILES, + GDK_INTERP_BILINEAR, + GDK_INTERP_HYPER, + + CAIRO_EXTEND_REPEAT = 1, + + CAIRO_FILL_RULE_EVEN_ODD = 1, + CAIRO_FILL_RULE_WINDING = 0, + + CAIRO_FONT_SLANT_NORMAL = 0, + CAIRO_FONT_SLANT_ITALIC, + CAIRO_FONT_SLANT_OBLIQUE, + + CAIRO_FONT_WEIGHT_NORMAL = 0, NORMAL = 0, + CAIRO_FONT_WEIGHT_BOLD, BOLD = 1, + + CAIRO_FORMAT_INVALID = -1, + CAIRO_FORMAT_ARGB32 = 0, + CAIRO_FORMAT_RGB24, + CAIRO_FORMAT_A8, + CAIRO_FORMAT_A1, + CAIRO_FORMAT_RGB16_565, + + CAIRO_LINE_CAP_BUTT = 0, + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_CAP_SQUARE, + + CAIRO_LINE_JOIN_MITER = 0, + CAIRO_LINE_JOIN_ROUND, + CAIRO_LINE_JOIN_BEVEL, + + CAIRO_OPERATOR_CLEAR = 0, + CAIRO_OPERATOR_SOURCE, + CAIRO_OPERATOR_OVER, + CAIRO_OPERATOR_IN, + CAIRO_OPERATOR_OUT, + CAIRO_OPERATOR_ATOP, + CAIRO_OPERATOR_DEST, + CAIRO_OPERATOR_DEST_OVER, + CAIRO_OPERATOR_DEST_IN, + CAIRO_OPERATOR_DEST_OUT, + CAIRO_OPERATOR_DEST_ATOP, + CAIRO_OPERATOR_XOR, + CAIRO_OPERATOR_ADD, + CAIRO_OPERATOR_SATURATE, + CAIRO_OPERATOR_MULTIPLY, + CAIRO_OPERATOR_SCREEN, + CAIRO_OPERATOR_OVERLAY, + CAIRO_OPERATOR_DARKEN, + CAIRO_OPERATOR_LIGHTEN, + CAIRO_OPERATOR_COLOR_DODGE, + CAIRO_OPERATOR_COLOR_BURN, + CAIRO_OPERATOR_HARD_LIGHT, + CAIRO_OPERATOR_SOFT_LIGHT, + CAIRO_OPERATOR_DIFFERENCE, + CAIRO_OPERATOR_EXCLUSION, + CAIRO_OPERATOR_HSL_HUE, + CAIRO_OPERATOR_HSL_SATURATION, + CAIRO_OPERATOR_HSL_COLOR, + CAIRO_OPERATOR_HSL_LUMINOSITY, + + CAIRO_PDF_VERSION_1_4 = 0, + CAIRO_PDF_VERSION_1_5, + + CAIRO_SVG_VERSION_1_1 = 0, + CAIRO_SVG_VERSION_1_2, + + CAIRO_SURFACE_TYPE_IMAGE = 0, + CAIRO_SURFACE_TYPE_PDF, + CAIRO_SURFACE_TYPE_PS, + CAIRO_SURFACE_TYPE_XLIB, + CAIRO_SURFACE_TYPE_XCB, + CAIRO_SURFACE_TYPE_GLITZ, + CAIRO_SURFACE_TYPE_QUARTZ, + CAIRO_SURFACE_TYPE_WIN32, + CAIRO_SURFACE_TYPE_BEOS, + CAIRO_SURFACE_TYPE_DIRECTFB, + CAIRO_SURFACE_TYPE_SVG, + CAIRO_SURFACE_TYPE_OS2, + CAIRO_SURFACE_TYPE_WIN32_PRINTING, + CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, + CAIRO_SURFACE_TYPE_SCRIPT, + CAIRO_SURFACE_TYPE_QT, + CAIRO_SURFACE_TYPE_RECORDING, + CAIRO_SURFACE_TYPE_VG, + CAIRO_SURFACE_TYPE_GL, + CAIRO_SURFACE_TYPE_DRM, + CAIRO_SURFACE_TYPE_TEE, + CAIRO_SURFACE_TYPE_XML, + CAIRO_SURFACE_TYPE_SKIA, + CAIRO_SURFACE_TYPE_SUBSURFACE, + + CAIRO_FONT_TYPE_TOY = 0, + CAIRO_FONT_TYPE_FT, + CAIRO_FONT_TYPE_WIN32, + CAIRO_FONT_TYPE_QUARTZ, + CAIRO_FONT_TYPE_USER + +public enum ICON_PIXBUF = 1, + ICON_DISPLAY_NAME, + ICON_FILENAME, + ICON_BASE_SIZE, + ICON_BASE_SCALE, + ICON_IS_SYMBOLIC + +function _(atom x, integer t) +if x = 0 then + crash("Invalid type - pointer is null!") +end if +init(t) register(x,t) +return x +end function + +------------------------------------------------------------------------ +-- GTK Widget Types -- used rarely, with caution +------------------------------------------------------------------------ +global type Object(atom x)return _(x,GObject)end type +global type Window(atom x)return _(x,GtkWindow)end type +global type Dialog(atom x)return _(x,GtkDialog)end type +global type AboutDialog(atom x)return _(x,GtkAboutDialog)end type +global type Assistant(atom x)return _(x,GtkAssistant)end type +global type Box(atom x)return _(x,GtkBox)end type +global type Grid(atom x)return _(x,GtkGrid)end type +global type Revealer(atom x)return _(x,GtkRevealer)end type +global type ListBox(atom x)return _(x,GtkListBox)end type +global type FlowBox(atom x)return _(x,GtkFlowBox)end type +global type Stack(atom x)return _(x,GtkStack)end type +global type StackSwitcher(atom x)return _(x,GtkStackSwitcher)end type +global type Sidebar(atom x)return _(x,GtkSidebar)end type +global type ActionBar(atom x)return _(x,GtkActionBar)end type +global type HeaderBar(atom x)return _(x,GtkHeaderBar)end type +global type Overlay(atom x)return _(x,GtkOverlay)end type +global type ButtonBox(atom x)return _(x,GtkButtonBox)end type +global type Paned(atom x)return _(x,GtkPaned)end type +global type Layout(atom x)return _(x,GtkLayout)end type +global type Notebook(atom x)return _(x,GtkNotebook)end type +global type Expander(atom x)return _(x,GtkExpander)end type +global type AspectFrame(atom x)return _(x,GtkAspectFrame)end type +global type Label(atom x)return _(x,GtkLabel)end type +global type Image(atom x)return _(x,GtkImage)end type +global type Spinner(atom x)return _(x,GtkSpinner)end type +global type InfoBar(atom x)return _(x,GtkInfoBar)end type +global type ProgressBar(atom x)return _(x,GtkProgressBar)end type +global type LevelBar(atom x)return _(x,GtkLevelBar)end type +global type Statusbar(atom x)return _(x,GtkStatusbar)end type +global type AccelLabel(atom x)return _(x,GtkAccelLabel)end type +global type Button(atom x)return _(x,GtkButton)end type +global type CheckButton(atom x)return _(x,GtkCheckButton)end type +global type RadioButton(atom x)return _(x,GtkRadioButton)end type +global type ToggleButton(atom x)return _(x,GtkToggleButton)end type +global type LinkButton(atom x)return _(x,GtkLinkButton)end type +global type MenuButton(atom x)return _(x,GtkMenuButton)end type +global type Switch(atom x)return _(x,GtkSwitch)end type +global type ScaleButton(atom x)return _(x,GtkScaleButton)end type +global type VolumeButton(atom x)return _(x,GtkVolumeButton)end type +global type LockButton(atom x)return _(x,GtkLockButton)end type +global type Entry(atom x)return _(x,GtkEntry)end type +global type EntryBuffer(atom x)return _(x,GtkEntryBuffer)end type +global type EntryCompletion(atom x)return _(x,GtkEntryCompletion)end type +global type Scale(atom x)return _(x,GtkScale)end type +global type SpinButton(atom x)return _(x,GtkSpinButton)end type +global type SearchEntry(atom x)return _(x,GtkSearchEntry)end type +global type SearchBar(atom x)return _(x,GtkSearchBar)end type +global type Editable(atom x)return _(x,GtkEditable)end type +global type TextMark(atom x)return _(x,GtkTextMark)end type +global type TextBuffer(atom x)return _(x,GtkTextBuffer)end type +global type TextTag(atom x)return _(x,GtkTextTag)end type +global type TextTagTable(atom x)return _(x,GtkTextTagTable)end type +global type TextView(atom x)return _(x,GtkTextView)end type +global type TreeModel(atom x)return _(x,GtkTreeModel)end type +global type TreeModelSort(atom x)return _(x,GtkTreeModelSort)end type +global type TreeSelection(atom x)return _(x,GtkTreeSelection)end type +global type TreeViewColumn(atom x)return _(x,GtkTreeViewColumn)end type +global type TreeView(atom x)return _(x,GtkTreeView)end type +global type IconView(atom x)return _(x,GtkIconView)end type +global type CellRendererText(atom x)return _(x,GtkCellRendererText)end type +global type CellRendererAccel(atom x)return _(x,GtkCellRendererAccel)end type +global type CellRendererCombo(atom x)return _(x,GtkCellRendererCombo)end type +global type CellRendererPixbuf(atom x)return _(x,GtkCellRendererPixbuf)end type +global type CellRendererProgress(atom x)return _(x,GtkCellRendererProgress)end type +global type CellRendererSpin(atom x)return _(x,GtkCellRendererSpin)end type +global type CellRendererToggle(atom x)return _(x,GtkCellRendererToggle)end type +global type CellRendererSpinner(atom x)return _(x,GtkCellRendererSpinner)end type +global type ListStore(atom x)return _(x,GtkListStore)end type +global type TreeStore(atom x)return _(x,GtkTreeStore)end type +global type ComboBox(atom x)return _(x,GtkComboBox)end type +global type ComboBoxText(atom x)return _(x,GtkComboBoxText)end type +global type Menu(atom x)return _(x,GtkMenu)end type +global type MenuBar(atom x)return _(x,GtkMenuBar)end type +global type MenuItem(atom x)return _(x,GtkMenuItem)end type +global type RadioMenuItem(atom x)return _(x,GtkRadioMenuItem)end type +global type CheckMenuItem(atom x)return _(x,GtkCheckMenuItem)end type +global type SeparatorMenuItem(atom x)return _(x,GtkSeparatorMenuItem)end type +global type Toolbar(atom x)return _(x,GtkToolbar)end type +global type ToolItem(atom x)return _(x,GtkToolItem)end type +global type ToolPalette(atom x)return _(x,GtkToolPalette)end type +global type ToolButton(atom x)return _(x,GtkToolButton)end type +global type MenuToolButton(atom x)return _(x,GtkMenuToolButton)end type +global type ToggleToolButton(atom x)return _(x,GtkToggleToolButton)end type +global type RadioToolButton(atom x)return _(x,GtkRadioToolButton)end type +global type Popover(atom x)return _(x,GtkPopover)end type +global type PopoverMenu(atom x)return _(x,GtkPopoverMenu)end type +global type ColorChooser(atom x)return _(x,GtkColorChooser)end type +global type ColorButton(atom x)return _(x,GtkColorButton)end type +global type ColorChooserWidget(atom x)return _(x,GtkColorChooserWidget)end type +global type ColorChooserDialog(atom x)return _(x,GtkColorChooserDialog)end type +global type FileChooser(atom x)return _(x,GtkFileChooser)end type +global type FileChooserButton(atom x)return _(x,GtkFileChooserButton)end type +global type FileChooserDialog(atom x)return _(x,GtkFileChooserDialog)end type +global type FileChooserWidget(atom x)return _(x,GtkFileChooserWidget)end type +global type FileFilter(atom x)return _(x,GtkFileFilter)end type +global type FontChooser(atom x)return _(x,GtkFontChooser)end type +global type FontButton(atom x)return _(x,GtkFontButton)end type +global type FontChooserWidget(atom x)return _(x,GtkFontChooserWidget)end type +global type FontChooserDialog(atom x)return _(x,GtkFontChooserDialog)end type +global type PlacesSidebar(atom x)return _(x,GtkPlacesSidebar)end type +global type Frame(atom x)return _(x,GtkFrame)end type +global type Scrollbar(atom x)return _(x,GtkScrollbar)end type +global type ScrolledWindow(atom x)return _(x,GtkScrolledWindow)end type +global type Adjustment(atom x)return _(x,GtkAdjustment)end type +global type Calendar(atom x)return _(x,GtkCalendar)end type +global type GLArea(atom x)return _(x,GtkGLArea)end type +global type Tooltip(atom x)return _(x,GtkTooltip)end type +global type Viewport(atom x)return _(x,GtkViewport)end type +global type Widget(atom x)return _(x,GtkWidget)end type +global type Container(atom x)return _(x,GtkContainer)end type +global type Bin(atom x)return _(x,GtkBin)end type +global type Range(atom x)return _(x,GtkRange)end type +global type PrintContext(atom x)return _(x,GtkPrintContext)end type +global type ListBoxRow(atom x)return _(x,GtkListBoxRow)end type +global type FontFamily(atom x)return _(x,PangoFontFamily)end type +global type FontDescription(atom x)return _(x,PangoFontDescription)end type +global type AppChooserDialog(atom x)return _(x,GtkAppChooserDialog)end type +global type PaperSize(atom x)return _(x,GtkPaperSize)end type +global type DrawingArea(atom x)return _(x,GtkDrawingArea)end type +global type RecentChooserDialog(atom x)return _(x,GtkRecentChooserDialog)end type +global type RecentChooserWidget(atom x)return _(x,GtkRecentChooserWidget)end type +global type RecentChooser(atom x)return _(x,GtkRecentChooser)end type +global type RecentFilter(atom x)return _(x,GtkRecentFilter)end type +global type RecentChooserMenu(atom x)return _(x,GtkRecentChooserMenu)end type +global type EventBox(atom x)return _(x,GtkEventBox)end type +global type TreeModelFilter(atom x)return _(x,GtkTreeModelFilter)end type +global type Application(atom x)return _(x,GtkApplication)end type +global type ApplicationWindow(atom x)return _(x,GtkApplicationWindow)end type +global type Pixbuf(atom x)return _(x,GdkPixbuf)end type +global type IconTheme(atom x)return _(x,GtkIconTheme)end type +global type Cairo_T(atom x)return _(x,Cairo_t)end type +------------------------- +-- © 2015 by Irv Mullins +------------------------- diff --git a/tools/WEE/EuGTK/GtkEvents.e b/tools/WEE/EuGTK/GtkEvents.e new file mode 100644 index 0000000..6ff271d --- /dev/null +++ b/tools/WEE/EuGTK/GtkEvents.e @@ -0,0 +1,222 @@ + +namespace events + +--Thanks to Pete Eberlein for helping with this! + +include GtkEngine.e +include std/convert.e + +-- Maps keys from keypad to match same keys on keyboard, +-- maps control/arrow keys to negative numbers, so they +-- can be differentiated from the same ascii character +-- values; + +constant keyvalues = { +{8,-8}, -- bksp +{9,-9}, -- tab +{20,-20}, -- scroll lock +{27,27}, -- escape +{80,-80}, -- home 'P' +{81,-81}, -- left arrow 'Q' +{82,-82}, -- up arrow 'R' +{83,-83}, -- right arrow 'S' +{84,-84}, -- down arrow 'T' +{85,-85}, -- page up 'U' +{86,-86}, -- page dn 'V' +{87,-87}, -- end 'W' +{99,-99}, -- insert 'c' +{103,-103}, +{127,-127}, -- num lock + +{141,13}, -- keypad Enter, with or w/o numlock; + +-- keypad keys w/o numlock; +{149,-149}, -- keypad home +{150,-150}, -- keypad left +{151,-151}, -- keypad up +{152,-152}, -- keypad right +{153,-153}, -- keypad down +{154,-154}, -- keypad pg up +{155,-155}, -- keypad pg dn +{156,-156}, -- keypad end +{157,-157}, -- keypad 5 +{158,-158}, -- keypad ins +{159,-159}, -- keypad del + +-- keypad keys with numlock - return ascii 0..9 +{170,'*'},{171,'+'},{173,'-'},{175,'/'}, +{176,48},{177,49},{178,50},{179,51},{180,52}, -- keypad numbers 0..4 +{181,53},{182,54},{183,55},{184,56},{185,57}, -- keypad numbers 5..9 + +-- F keys; +{190,-190}, -- F1 +{191,-191}, -- F2 +{192,-192}, -- F3 +{193,-193}, -- F4 +{194,-194}, -- F5 +{195,-195}, -- F6 +{196,-196}, -- F7 +{197,-197}, -- F8 +{198,-198}, -- F9 +{199,-199}, -- F10 +{200,-200}, -- F11 +{201,-201}, -- F12 +{227,-227}, -- left ctl +{228,-228}, -- right ctl +{229,-229}, +{225,-225}, -- left shift +{226,-226}, -- right shift +{228,-228}, +{233,-233}, -- left alt +{234,-234}, -- right alt +{236,-236}, +{255,-255}, -- delete +$} + +constant shiftkeys = { +{32,-9}, -- shift tab +$} + +---------------------------------------------------------------------- +export function key(atom event) -- get key pressed; +---------------------------------------------------------------------- +integer k = peek(event+16) +integer z = peek(event+17) +integer s = state(event) +ifdef BITS64 then + k = peek(event+28) + z = peek(event+29) +end ifdef +switch z do + case 0 then return k + case 255 then return vlookup(k,keyvalues,1,2,k) + case 254 then return vlookup(k,shiftkeys,1,2,k) +end switch +return 0 +end function + +--------------------------------------------------------------------- +export function id(atom event) +--------------------------------------------------------------------- +return peek4u(event) +end function + +---------------------------------------------------------------------- +export function state(atom event) +---------------------------------------------------------------------- +ifdef BITS64 then + return peek(event+24) +end ifdef +return peek(event+12) +end function + +---------------------------------------------------------------------- +export function hwcode(atom event) +---------------------------------------------------------------------- +ifdef BITS64 then + return peek({event+28,2}) +end ifdef +return peek({event+16,2}) +end function + +--------------------------------------------------------------------- +export function button(atom event) -- get mouse button clicked; +--------------------------------------------------------------------- +ifdef BITS64 then + return peek(event+52) +end ifdef +return peek(event+40) +end function + +--(32/64)struct GdkEventButton +-- 0 0 GdkEventType type +-- 4 8 GtkWindow *window +-- 8 16 gint8 send_event +-- 12 20 guint32 time +-- 16 24 gdouble x +-- 24 32 gdouble y +-- 32 40 gdouble *axes +-- 36 48 guint state +-- 40 52 guint button +-- 44 56 GdkDevice *device +-- 48 64 gdouble x_root, y_root + +--------------------------------------------------------------------- +export function window(atom event) -- get event window +--------------------------------------------------------------------- +ifdef BITS64 then + return peek8u(event + 8) +end ifdef + return peek4u(event + 4) +end function + +--------------------------------------------------------------------- +export function time(atom event) -- get event time +--------------------------------------------------------------------- +ifdef BITS64 then + return peek4u(event + 20) +end ifdef + return peek4u(event + 12) +end function + + +--------------------------------------------------------------------- +export function xy(atom event) -- get mouse button x y; +--------------------------------------------------------------------- +ifdef BITS64 then + return { + float64_to_atom(peek({event + 24, 8})), + float64_to_atom(peek({event + 32, 8}))} +end ifdef + return { + float64_to_atom(peek({event + 16, 8})), + float64_to_atom(peek({event + 24, 8}))} +end function + +--------------------------------------------------------------------- +export function clicks(atom event) +--------------------------------------------------------------------- +atom ct = allocate(64) +object result + if gtk_func("gdk_event_get_click_count",{P,I},{event,ct}) then + result = peek4u(ct) + else + result = -1 + end if + free(ct) +return result +end function + +--------------------------------------------------------------------- +export function scroll_dir(atom event) +--------------------------------------------------------------------- +atom dir = allocate(64) +object result + if gtk_func("gdk_event_get_scroll_direction",{P,I},{event,dir}) then + result = peek4u(dir) + else + result = -1 + end if + free(dir) +return result +end function + +------------------------------------------------------------------------ +-- following routine traps the enter key when Entry is activated, +-- and uses it like the tab key - so it works like people expect. +-- in Glade, connect each entry's 'activate' signal to +-- trap_enter_key +------------------------------------------------------------------------ +constant gsig = define_proc("g_signal_emit_by_name",{P,P,P}) +constant fsig = allocate_string("move-focus") +------------------------------------------------------------------------ +global function trap_enter_key(atom ctl, atom event) +----------------------------------------------------------------------- + if classid(ctl) = GtkEntry then + if event = 0 then + c_proc(gsig,{ctl,allocate_string("move-focus"),0}) + return 1 + end if + end if +return 0 +end function diff --git a/tools/WEE/EuGTK/GtkPrinter.e b/tools/WEE/EuGTK/GtkPrinter.e new file mode 100644 index 0000000..d738116 --- /dev/null +++ b/tools/WEE/EuGTK/GtkPrinter.e @@ -0,0 +1,487 @@ +------------------ +namespace printer +------------------ +constant version = "4.9.4" + +include GtkEngine.e +include std/datetime.e + +-------------------------------------------------------------------------------- +-- This version handles most common printing needs, but it will not yet respect +-- 'marked up' a.k.a. 'rich' text, i.e. text with colors and styles such as +-- set by test59. It just prints them as plain text. +-- However, it DOES print text marked up with GTK's HTML subset, so you can use +-- , , , length(text) then + set(progress,"text","Printing complete") + return 0 +end if + +if show_progress then + set(progress,"text",sprintf("Printing page %d",pg)) + set(progress,"fraction",pg/n_pages) +end if + +ifdef DELAY then sleep(0.25) end ifdef + +object details = { + page_title,sub_title,file_name,short_name, + pg,n_pages,n_copies, + today,user,real_name,font,filesize,timestamp,export_file + } + +object page + +if atom(header) then header = "[1] page [5] of [6]\n\n" end if + +if pg = 1 or atom(subheader) then + page = text:format(header,details) + & flatten(text[pg]) + & text:format(footer,details) +else + page = text:format(subheader,details) + & flatten(text[pg]) + & text:format(footer,details) +end if + + set(pl,"markup",page,length(page)) + set(pl,"update layout",cr) + set(pl,"show layout",cr) + +ifdef PRINT then printf(1,"Page %d\n",pg) end ifdef + +return 1 +end function + +------------------------------------------------------------------------ +function process_text(object txt) +------------------------------------------------------------------------ +txt = split(txt,'\n') +integer comment +object a,b +object test + + +for i = 1 to length(txt) do -- replace chars which will confuse markup + + txt[i] = join(split(txt[i],'&'),"&") + txt[i] = join(split(txt[i],"&amp;"),"&") + + if sourcecode then + txt[i] = join(split(txt[i],'<'),"<") + txt[i] = join(split(txt[i],'>'),">") + end if + + if use_color then + comment = match("--",txt[i]) + if comment then + comment -=1 + txt[i] = txt[i][1..comment] & "" & txt[i][comment+1..$] & "" + end if + end if + + if use_line_numbers then + txt[i] = text:format(line_number_format,{i,txt[i]}) + else + txt[i] &= '\n' + end if + +end for + +txt = breakup(txt,lines_per_page) +if n_pages = 0 then -- no selection + n_pages = length(txt) +end if + +return txt +end function + +------------------------------------------------------------------------ +export function end_print() +------------------------------------------------------------------------ +status_string = "Printing complete" +ifdef PRINT then display(status_string) end ifdef +return 1 +end function + +--------------------------------------------------------------- +export function setup_printer() +--------------------------------------------------------------- +atom _size = create(GtkPaperSize,paper_name) +atom err = allocate(16) err = 0 +object results = 0 + +atom fn7 = define_func("gtk_print_operation_run",{P,I,P,P},I) +atom fn8 = define_func("gtk_print_run_page_setup_dialog",{P,P,P},P) + + set(settings,"paper size",_size,units) + set(settings,"n copies",n_copies) + set(settings,"collate",collate) + set(settings,"duplex",duplex) + set(settings,"reverse",order) + set(settings,"scale",scale) + set(settings,"quality",quality) + set(settings,"number up",number_up) + set(settings,"number up layout",number_up_layout) + + if string(name) then + set(settings,"printer",name) + end if + +atom setup = create(GtkPageSetup) + set(setup,"paper size",_size) + set(setup,"orientation",orientation) + set(setup,"left margin",left_margin,units) + set(setup,"right margin",right_margin,units) + set(setup,"top margin",top_margin,units) + set(setup,"bottom margin",bottom_margin,units) + +atom printop = create(GtkPrintOperation) + set(printop,"print settings",settings) + set(printop,"default page setup",setup) + set(printop,"show progress",show_progress) + set(printop,"track print status",track_status) + set(printop,"embed page setup",embed_page_setup) + set(printop,"support selection",support_selection) + set(printop,"has selection",has_selection) + set(printop,"use full page",use_full_page) + + if action = GTK_PRINT_OPERATION_ACTION_EXPORT then + export_file = canonical_path(export_file) + set(printop,"export filename",export_file) + end if + + if string(jobname) then + set(printop,"job name",jobname) + end if + + if custom_tab_hook != 0 then + set(printop,"custom tab label",custom_tab_label) + connect(printop,"create-custom-widget",custom_tab_func,printop) + connect(printop,"custom-widget-apply",custom_tab_hook) + end if + + connect(printop,"status-changed",signal_status_changed) + connect(printop,"begin-print",signal_begin_print) + connect(printop,"draw-page",signal_draw_page) + connect(printop,"end-print",signal_end_print) + connect(printop,"request-page-setup",signal_request_page_setup) + connect(printop,"done",signal_done) + connect(printop,"ready",signal_ready) + connect(printop,"got-page-size",signal_got_page_size) + + c_func(fn7,{printop,action,parent,err}) -- start the print process; + + if string(settings_file) then + get(settings,"to file",settings_file) + end if + if string(setup_file) then + get(setup,"to file",setup_file) + end if + +object jobname = get(printop,"job name") + if confirm then + if action = GTK_PRINT_OPERATION_ACTION_EXPORT then + if Question(0,"PDF Written", + sprintf("%s\nFolder: %s", + {filename(export_file),pathname(export_file)}), + sprintf("%s\nStatus: %d\n%s\nClick Yes to view",{jobname,status_code,status_string}) + ,,,"cups") then + show_uri(export_file) + end if + else + Info(0,"Print Job",jobname, + sprintf("Status: %d %s",{status_code,status_string}) + ,,"cups") + end if + end if + + page_title = 0 + n_pages = 0 + n_copies = 1 + action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG + +return 1 +end function + +header = "[1]\n\n" + +------------------------- +-- © 2015 by Irv Mullins +------------------------- diff --git a/tools/WEE/EuGTK/README.txt b/tools/WEE/EuGTK/README.txt new file mode 100644 index 0000000..4a8a2bf --- /dev/null +++ b/tools/WEE/EuGTK/README.txt @@ -0,0 +1,4 @@ +GTK Library for Euphoria 4.0 +by Irv Mullins + +https://sites.google.com/site/euphoriagtk/Home diff --git a/tools/WEE/EuGTK/license.txt b/tools/WEE/EuGTK/license.txt new file mode 100644 index 0000000..cb50219 --- /dev/null +++ b/tools/WEE/EuGTK/license.txt @@ -0,0 +1,17 @@ + +LGPL ~ GNU Lesser General Public License version 3.0 + +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 diff --git a/tools/WEE/LICENSE b/tools/WEE/LICENSE new file mode 100644 index 0000000..81d84c0 --- /dev/null +++ b/tools/WEE/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 peberlein + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/tools/WEE/README.md b/tools/WEE/README.md new file mode 100644 index 0000000..bcba757 --- /dev/null +++ b/tools/WEE/README.md @@ -0,0 +1,21 @@ +# WEE +A small code-aware editor for Euphoria programming + +### Featuring +* [Scintilla](http://www.scintilla.org/) editor control with syntax highlighting +* subroutines list +* automatic if/while/for/procedure/function expansion +* code identifier completion +* jump to subroutine declaration +* ex.err monitoring +* show subroutine arguments + +Supports Windows + +Supports Linux and Mac OS using [EuGTK](https://sites.google.com/site/euphoriagtk/Home) + +Requires [Euphoria 4.1.0 Beta 2](http://openeuphoria.org/wiki/view/DownloadEuphoria.wc) or later. + +### How to Get It + +Create a folder called "Wee" and download [updater.ex](https://github.com/peberlein/WEE/raw/master/updater.ex). Run "eui updater.ex" to download/update the files for your platform. Run "eui wee" to run the editor, or compile/bind/shroud it for convenience. diff --git a/tools/WEE/manifest.ex b/tools/WEE/manifest.ex new file mode 100644 index 0000000..11c4b65 --- /dev/null +++ b/tools/WEE/manifest.ex @@ -0,0 +1,66 @@ +include std/pretty.e +include std/io.e +include std/hash.e +include std/os.e +include std/pipeio.e + + +sequence files +files = { +-- platform independent + {"wee.exw", 0, 0, 0}, + {"scintilla.e", 0, 0, 0}, + {"parser.e", 0, 0, 0}, + {"updater.ex", 0, 0, 0}, + {"weeicon.e", 0, 0, 0}, +-- windows + {"ui_win.e", 0, 0, 0, WINDOWS}, + {"window.ew", 0, 0, 0, WINDOWS}, +-- GTK + {"ui_gtk.e", 0, 0, 0, LINUX, OSX}, + {"EuGTK/GtkEngine.e", 0, 0, 0, LINUX, OSX}, + {"EuGTK/GtkEnums.e", 0, 0, 0, LINUX, OSX}, + {"EuGTK/GtkPrinter.e", 0, 0, 0, LINUX, OSX}, + {"EuGTK/GtkEvents.e", 0, 0, 0, LINUX, OSX}, + {"EuGTK/README.txt", 0, 0, 0, LINUX, OSX}, + {"EuGTK/license.txt", 0, 0, 0, LINUX, OSX}, +-- scintilla + {"scintilla/SciLexer.dll", 0, 0, 32, WINDOWS}, + {"scintilla/SciLexer64.dll", 0, 0, 64, WINDOWS}, + {"scintilla/scintilla32.so", 0, 0, 32, LINUX}, + {"scintilla/scintilla64.so", 0, 0, 64, LINUX}, + {"scintilla/scintillaOSX.dylib", 0, 0, 64, OSX}, + {"scintilla/scintilla32armhf.so", 0, 0, 32, LINUX}, + {"scintilla/License.txt", 0, 0, 0} +} + +object file, p + +-- returns +function read_until_eof(object pipe) + sequence result = {} + object o = pipeio:read(pipe, 1024) + while sequence(o) and length(o) do + result &= o + o = pipeio:read(pipe, 1024) + end while + return result +end function + +for i = 1 to length(files) do + files[i][2] = hash(read_file(files[i][1]), HSIEH30) + -- git log -n 1 --format=oneline -- ui_gtk.e + p = pipeio:exec("git log -n1 --format=oneline -- "&files[i][1], pipeio:create()) + files[i][3] = pipeio:read(p[pipeio:STDOUT], 10) + pipeio:kill(p) + + p = pipeio:exec("git show "&files[i][3]&":"&files[i][1], pipeio:create()) + object h = hash(read_until_eof(p[pipeio:STDOUT]), HSIEH30) + pipeio:kill(p) + + printf(1, "%s %s %d %d\n", {files[i][1], files[i][3], files[i][2], h}) + files[i][2] = h +end for + +--display(files) +? write_file("manifest.json", pretty_sprint(files, {2})) diff --git a/tools/WEE/manifest.json b/tools/WEE/manifest.json new file mode 100644 index 0000000..7d4b309 --- /dev/null +++ b/tools/WEE/manifest.json @@ -0,0 +1,150 @@ +{ + { + "wee.exw", + 334537086, + "0dcf6d4cb0", + 0 + }, + { + "scintilla.e", + 13846666, + "e3cc5860ac", + 0 + }, + { + "parser.e", + 215958451, + "87365ad72b", + 0 + }, + { + "updater.ex", + 273638869, + "befd7e9c4a", + 0 + }, + { + "weeicon.e", + 39797371, + "fdc3db69d4", + 0 + }, + { + "ui_win.e", + 740860035, + "839c798be8", + 0, + 2 + }, + { + "window.ew", + 904400105, + "87365ad72b", + 0, + 2 + }, + { + "ui_gtk.e", + 59538677, + "839c798be8", + 0, + 3, + 4 + }, + { + "EuGTK/GtkEngine.e", + 132693288, + "4df40ce0cd", + 0, + 3, + 4 + }, + { + "EuGTK/GtkEnums.e", + 202551058, + "506cdc498b", + 0, + 3, + 4 + }, + { + "EuGTK/GtkPrinter.e", + 443615540, + "506cdc498b", + 0, + 3, + 4 + }, + { + "EuGTK/GtkEvents.e", + 1050187785, + "506cdc498b", + 0, + 3, + 4 + }, + { + "EuGTK/README.txt", + 332011652, + "04aa6ff6c9", + 0, + 3, + 4 + }, + { + "EuGTK/license.txt", + 70721840, + "506cdc498b", + 0, + 3, + 4 + }, + { + "scintilla/SciLexer.dll", + 376057439, + "b6035dbac0", + 32, + 2 + }, + { + "scintilla/SciLexer64.dll", + 971949613, + "683bd7ddbf", + 64, + 2 + }, + { + "scintilla/scintilla32.so", + 794231462, + "b6035dbac0", + 32, + 3 + }, + { + "scintilla/scintilla64.so", + 778289070, + "b6035dbac0", + 64, + 3 + }, + { + "scintilla/scintillaOSX.dylib", + 510448282, + "b6035dbac0", + 64, + 4 + }, + { + "scintilla/scintilla32armhf.so", + 572289041, + "e3cc5860ac", + 32, + 3 + }, + { + "scintilla/License.txt", + 662502963, + "b6035dbac0", + 0 + } +} \ No newline at end of file diff --git a/tools/WEE/mongoose-wee.ico b/tools/WEE/mongoose-wee.ico new file mode 100644 index 0000000000000000000000000000000000000000..48e56fca8f713bb29e0896997310419df4d41f8d GIT binary patch literal 16958 zcmeHP2Ut{B79KwX+YhzCC0WkM50Cn#s(3UGK}lT>aMt} z*(_^}NvzR0^g5sqD>HU=FQ>!`8f^SR@ue(lM~nb+4w@=F&+?*T2%P_qrN#K1g0sXhWN|^*N^`N<7Owq z=s(7QIIV2*n}gu_I2EN7es5wQ2!4rK>^89zf&1#r`y!cQfl#U#JT6_)>G@`OeS3?g ziZxbYD`5PGo0a&zoOea(ItKW8h942b{}J24FQngQPH58om=gh?v@(Eiz8ua=?PEBc7i zO1~Ky8Ue!t7iq=LmjhS!So1m4iy^)rfPZ3k4ay_s2RHW1+>!^v0$#=Fs^Q(U=mX-zjCuY@- zn*1^9vIyL8ExC2&Q{mQJz&HRzsU=Fh9B#i&C&6XqUT|6QPj-(8Sqes0uHd?2??Y^J zOe`(6d-X^)IS{2OVr=InL4R8z5ar|L%EF{Pl{Mxtb5xj=4`Zgqf!zWrOjz_6c9U(e znH3Kt2V-kbaF5=1KS);UqshUms|k=5TR1HJ>*GNlf6|KEe{(j*JH;An&Ee)K>4Z=G zaq!-71iaQBe0r}x0=}E%;J-Bo`q}u9eY_o#e9HXQAy%Ckb#l=_k3WLf`okLdg+dP~N_mqGbky$*1Kp;epV)_TISRfB-=JL(0@+qoE?(Ue^8fXK2|=3Jx8}7Q zJ0}BQTz^gme^f|n@q(`@Fh;izMWPzSz+E`0}5 zzgKpK5K61{aQ@w7uLgV1RKeb?^J=)#N^$?@Gwhr_WEABfM$DXyhzgSn82(Y=t5ooJ z)HeW+m@m+86v4a3gPETQkd>RgY#k77D;pt7E;>yy-RP-nRI!uJOPhT-VF^Gibl#zJ zU(cboU}7J{o|~~}v%cDF1o~0*18FMwNe67_CV>#=7=UL93*j6Hl$OnUnfTGqh2j3Z z+ut?-9G0XjvHK%Wd>bE-Q~<++7J*)u?x3j8&^fWYVy=pXty^m2@ZF8wTFWau)s z)+7s&7XRRbcAwUqaC7&VX%g^5UqG@qbqGQ`sMz^3@P{Q8yo2kxpKK4=B9FKO&1;7` zO?#HFzf>MD-VeHV?Fzkm^@8q(M$pY&29ks{7~?%3y4XZQ&wxxYFtR`yL^Q`iYIcCe z5Tz8eIEuqgl=g%##z;f`W`n6?2m~bM)wF`&(AL&=xs#LAMh6FnSVKcYN~5b>a=Ba| z(2l88YI#7N-a+;UU$MJ`ZYStH!U60T$~3SO@AeB)LBI36(4|Wk=+UDm82bMmy1S); z!N~WaQ(rsi>bMcQ4swEbdKhW#&&ksn<6s?KUFE!_|NdKYV6e|j7=>$raR&sYmG@I; z+0M>xUTkb^?d8jt5gtHeV4I){10 z?tg%FNAieuoVk=COPC?i&oamOoWhRS&03nNnhDY3W4R zYfs6$^ZTop$=2hZZ`9H0pot&(G8*ODDh8j8$AEm9;m~o=sdIPesAs_T(6|piX|*3G zORsf@p^v2#i-RdXu%5maY*D|+ZVa#&;}~UWe4fL@!@pIB{p+v4!cRZ_q*A?S&z_sE zuC5!3iVmCb`)ezUWr|da@p_n#V*Fzpr7TDniC3}%bavtReo>Tkz*F*db3BZ(ftgE~ z((aOekuTzSHZd`=`|`^#@A82XZhwD&aB*?rSF>_uWo4tkzwdsDMAB-mAuwHGfWEAR z{0^N>>3l}0GIa<6${jKPiR(XdVk9^%&v@*euINTG z@b>oJ`{>alCC-~SZ-TwOJp=~_!_uWoS^Y1+{GxnMg^L$2J`4^HI)dE|I5}#gK`BK> z!sPsOBy+duObwibo#esi`$d-NeBpy<01i7*r{%kveMnlFAMuR#t$+iExM0MH5wK;; z76=Uug)?W)!13e9!PwXswr}6gHDmPd-MfJMM$xx#UrTM+xjLb=yf?R#I!Ay|uff#R6l5|P)YsR8mzNjB#KeF| zB!ZzshqCu70>B5-o8;u=2HYoq#i5Ki%<7c<4aV{cvcWnXIsngD@}Ba{QF~y11P?=d@qXSFO99epvS<`px?a@yL%0@W47X1v1)5iF{V0x z$|0kFZlv7XvSrIE2nYH&4i3Hd`~SD?1Gmgxc6L_a@2ShsGSvOT}> z!w)||adGkEqeqYaNVK7$0i2zkw~?&r3fNX+jeH&=TWE^;KDsI2i#dw_%RZnSp*nus z`Kin|(l@n9lO}z|=bvAmJ$p8+UcDL~Ja_)W0>b^H`(QQkZ-t#r19g~eoCr=QhX zS11&058SzP2M!)Q2pAK?f&~j;;lhPLvBBB1XIWXjpZarod3h7s$N*LJPoKz7x<~)# z;fSEcZ2id|()rKSX(9~u{}4RmzI<-IpfS~DKrum}RPh($Wa7k$$N4^xFl1z8z>Xa| z7#xfb7i<*ZPfKVQ@}Jmb6|6oRkK*^9d3bJ} zi~P$~-nD1lo7-sWKgoh}?ILMW8F7L7*&qEtWlLD-Ea2C zz}ngx1`Qenix)4}h#9F7?jvSvpCVQ*A)oQ4j-i<2E~0N3=pS>Dx2O3K--HwF?CTu$ zk7t&FHv7-;qYuOw>=wt#*s){1)6>)ITap3U`1R}8LqI?Pq@<+479JO9>}>uC!&_nvZ!eC*aU)}x*E0_Tr* zKfrGjjBcCLcyVwD&FmxD%o{guz|TKxm{VA?WJv`M z-$8vo?iq33GIyPDzkV@&X% zH5t%;p!kTc{QP_{FfhhQW`$_(jzIjmY3vt(B zzxn*%OI(-xd~z$#+mt_lOJ&sYF=1h01-Pf59uhTBYOl!3%3}M2+e>IKKBajSigBH4 zj(fB7CpRzV^-quwP{+-G=KBP7S&)ynLcA1LTVu`>bK-=1Ddi!#If&kr2M)iMEv&4} z3~TlL&hLZe4tOSxPe@3(tR5$5M-J@lXl`!K;%2T5o+p!eLyzl3;B4}%jC<{ zar-75hhd`m>`X^7HRc_2#j>(ci3GITnkzY>NjI`ZGnErRLji50C1NPSvtp~dKsf|# z3txQk1qYqQ(3m@twKN_2{wg!{OX`^U&t%gGKb@N?k4pM7*n0+etl5X(y376*xUIyt zrSYl$hCHnA)$I2Qpjy~!{<5_(@LdOIXGcj?)bi@vw{I))aRu^q?(Xh@=PIs>QOu>@ zqg+!Uad%4wwnBBOXKqE8*-k6y88I=@ zHJC4YtOU&~Na8-eo{=butuTlh`ZTXtR_;LSN&bq~+#}`y zI}_8HU;yT_?dGRo+*kOWNLCg>`J~^%YkmIQ6%D!XPyH=@+u27Cb7xa9C-&*0MT-ie zqN2{D-}^o^B>0%Kv$cC`W6c`hZ2%nZ|QF9Ud(>2j_l!>hV<=U4!V*0{gDW4+9FwY9tStBU_I z@IvWMr>dfKkLn_6o8OiB{L!AMs`zSPRq4N-E`GPSU9kYa|H~@l*;(%t{$}7pMSh>} zOO6ewIeo~Y^7KB-s0y$B<;@ICt?cW{PyBGB5f8!M0jQ{`u literal 0 HcmV?d00001 diff --git a/tools/WEE/parser.e b/tools/WEE/parser.e new file mode 100644 index 0000000..cc7c8c2 --- /dev/null +++ b/tools/WEE/parser.e @@ -0,0 +1,2959 @@ +-- parser.e +-- +-- Copyright (c) 2015 Pete Eberlein +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy +-- of this software and associated documentation files (the "Software"), to deal +-- in the Software without restriction, including without limitation the rights +-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +-- copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in +-- all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +-- THE SOFTWARE. + +-- todo: +-- OE4 while "with entry" and "label" +-- OE4 loop until +-- OE4 labels and goto +-- get_declarations with namespace shouldn't include local symbols + +include std/filesys.e +include std/os.e +include std/text.e +include std/map.e + + +constant + OE4 = 1, -- enable OpenEuphoria 4 syntax + ERROR_ABORT = 0, -- enable abort on errors? + ERROR_PRINT = 0 -- enable printing errors? +sequence defined_words +defined_words = {"OE", "OE4"} +if platform() = WIN32 then + defined_words &= {"WINDOWS", "WIN32"} +elsif platform() = LINUX then + defined_words &= {"LINUX", "UNIX"} +elsif platform() = OSX then + defined_words &= {"OSX", "UNIX"} +end if + +ifdef WINDOWS then +-- don't try to open these as files +constant dos_devices = {"CON","PRN","AUX","CLOCK$","NUL","COM1","LPT1","LPT2","LPT3","COM2","COM3","COM4"} +end ifdef + +-- where to search for standard include files +global sequence include_search_paths +include_search_paths = include_paths(0) +if sequence(getenv("EUDIR")) then + include_search_paths = append(include_search_paths, getenv("EUDIR") & SLASH & "include") +end if + +-- ast node types that are also opcodes +global constant + END = 0, + LOAD = 1, + LOADHI = 2, + MOV = 3, + ADD = 4, + ADDU8 = 5, + MUL = 6, + DIV = 7, + REM = 8, + JL = 9, + JLE = 10, + JE = 11, + JNE = 12, + JMP = 13, + EQ = 14, + NEQ = 15, + LT = 16, + GTE = 17, + LTE = 18, + GT = 19, + QPRINT = 20, + SUB = 21, + SUBU8 = 22, + NOT = 23, + NEG = 24, + AND = 25, + OR = 26, + XOR = 27, + CAT = 28 -- {CAT, expr, expr} + +global constant + DECL_ATOM = 1, + DECL_CONSTANT = 2, + DECL_ENUM = 3, + DECL_FUNCTION = 4, + DECL_INTEGER = 5, + DECL_NAMESPACE = 6, + DECL_OBJECT = 7, + DECL_PROCEDURE = 8, + DECL_SEQUENCE = 9, + DECL_TYPE = 10 + +-- ast node types that are not opcodes +global constant + VAR_DECL = 256, -- {VAR_DECL, "type", pos, {"name", pos, scope-start, [expr]}...} + ASSIGN = 257, -- {ASSIGN, "name", pos, expr} + FUNC = 258, -- {FUNC, "name", pos, [args...]} + PROC = 259, -- {PROC, "name", pos, [args...]} + VARIABLE = 260, -- {VARIABLE, "name", pos} + SUBSCRIPT = 261, -- {SUBSCRIPT, expr, index-expr} + SLICE = 262, -- {SLICE, expr, start-expr, end-expr} + CONST_DECL = 263, -- {CONST_DECL, {"name", pos, scope-start, expr}... } + RETURN = 265, -- {RETURN, [expr]} + EXIT = 266, -- {EXIT} + SEQ = 267, -- {SEQ, [expr,]...} + NUMBER = 268, + WHILE = 269, -- {WHILE, expr, scope-start, scope-end, stmts...} + IF = 270, -- {IF, expr, {scope-start, scope-end, stmts...}, + -- [expr, {scope-start, scope-end, elsif-stmts...},]... + -- [{scope-start, scope-end, else-stmts...}]} + ELSE = 271, + FOR = 272, -- {FOR, name, pos, expr, expr, by, scope-start, scope-end, stmts...} + FUNC_DECL = 273, -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + PROC_DECL = 274, -- {PROC_DECL, ...} + TYPE_DECL = 275, -- {TYPE_DECL, ...} + SEQ_ASSIGN = 276, -- {SEQ_ASSIGN, ["name1", pos1,]... expr} + ADDTO = 277, -- {ADDTO, "name", pos, expr} + SUBTO = 278, + MULTO = 279, + DIVTO = 280, + CATTO = 281, + STRING = 282, -- {STRING, "string-literal"} + SUB_ASSIGN = 283, -- {SUB_ASSIGN, "name", pos, index-expr..., expr} + SUB_ADDTO = 284, + SUB_SUBTO = 285, + SUB_MULTO = 286, + SUB_DIVTO = 287, + SUB_CATTO = 288, + SLICE_ASSIGN = 289, -- {SLICE_ASSIGN, "name", pos, index-expr..., start-expr, end-expr, expr} + SLICE_ADDTO = 290, + SLICE_SUBTO = 291, + SLICE_MULTO = 292, + SLICE_DIVTO = 293, + SLICE_CATTO = 294, + SEQ_LEN = 295, -- {SEQ_LEN}, shorthand for length of enclosing sequence in SUBSCRIPT, SLICE, SUB_*, SLICE_* + ENUM_DECL = 296, -- {ENUM_DECL, "typename"|"", pos, '+'|'-'|'*'|'/', expr, + -- {"name", pos, scope-start, [expr]}...} + INCLUDE = 297, -- {INCLUDE, includes-idx, scope-start, ["namespace"]} + GLOBAL = 298, -- {GLOBAL, decl...} + PUBLIC = 299, -- {PUBLIC, decl...} + EXPORT = 300, -- {EXPORT, decl...} + NAMESPACE = 301, -- {NAMESPACE, "name"} + IFDEF = 302, -- same layout as IF + ELSEDEF = 303, + SWITCH = 304, -- {SWITCH, expr, bool-fallthru, label-string, + -- [{case-values...}, {scope-start, scope-end, stmts...},]... } + -- ("case else" will have case-values={} ) + BREAK = 305, -- {BREAK, [label-string]} + CONTINUE = 306, -- {CONTINUE, [label-string]} + DEFAULT = 307, -- {DEFAULT}, used for default arguments in subroutine calls + ENTRY = 308, -- {ENTRY}, used with while loops + RETRY = 309, -- {RETRY}, used with while loops + LABEL = 310, -- {LABEL, "label"} + GOTO = 311, -- {GOTO, "label"} + ELSIF = 312, -- only for lookup table + ELSIFDEF = 313, -- only for lookup table + CASE = 314, -- {CASE, prev-scope-end, scope-start, [values, ...]} (case else will have no values) + KEYWORD = 315, + WITH = 316, + WITHOUT = 317, + SYNTAX_ERROR = 318, -- {SYNTAX_ERROR, pos, len, "message"} + LOOP = 319, -- {LOOP, scope-start, scope-end, stmts...} + UNTIL = 320 -- {UNTIL, expr} + +-- keep a copy of parsed files, reparsing if timestamp changes +sequence cache -- { {"path", timestamp, stmts...} ...} +cache = {} + +-- a sequence of maps makes identifier lookups fast +sequence maps -- map "decl-name" -> { locator... } +maps = {} +-- functions, procedures, types, enum types, namespace, include-as: +-- locator = ast-index +-- variables, constants, enum values: +-- locator = { ast-index, pos, scope-start, [scope-end] } + +-- returns a if test is true, otherwise b +function choose(integer test, object a, object b) + if test then + return a + end if + return b +end function + +-- use lookup table for faster keyword checking +map:map lookup_table = map:new_from_kvpairs({ + {"?", QPRINT}, {"&", CAT}, {"+", ADD}, {"-",SUB}, {"*", MUL}, {"/", DIV}, + {"=", EQ}, {"!=", NEQ}, {"<", LT}, {"<=", LTE}, {">", GT}, {">=", GTE}, + {"not", NOT}, {"or", OR}, {"and", AND}, {"xor", XOR}, + {"global", GLOBAL}, {"constant", CONST_DECL}, {"return", RETURN}, + {"while", WHILE}, {"if", IF}, {"else", ELSE}, {"elsif", ELSIF}, {"end", END}, + {"for", FOR}, {"to", KEYWORD}, {"by", KEYWORD}, {"do", KEYWORD}, {"exit", EXIT}, + {"function", FUNC_DECL}, {"procedure", PROC_DECL}, {"type", TYPE_DECL}, + {"+=", ADDTO}, {"-=", SUBTO}, {"*=", MULTO}, {"/=", DIVTO}, {"&=", CATTO}, + {"\"", '"'}, {"$", '$'}, {"'", '\''}, {"(", '('}, {"{", '{'}, + {"include", INCLUDE}, {"with", WITH}, {"without", WITHOUT} +} & choose(OE4, { + {"namespace", NAMESPACE}, {"public", PUBLIC}, {"export", EXPORT}, + {"ifdef", IFDEF}, {"elsifdef", ELSIFDEF}, {"elsedef", ELSEDEF}, + {"switch", SWITCH}, {"case", CASE}, {"break", BREAK}, + {"continue", CONTINUE}, {"as", KEYWORD}, {"enum", ENUM_DECL}, + {"default", DEFAULT}, {"entry", ENTRY}, {"retry", RETRY}, {"label", LABEL}, + {"goto", GOTO}, {"routine", KEYWORD}, {"fallthru", KEYWORD}, {"`", '`'} +},{})) + +-- returns text from file, else -1 +function read_file(sequence file_name) + integer f + object line + sequence text + + ifdef WINDOWS then + if find(upper(filename(file_name)), dos_devices) then + return -1 + end if + end ifdef + + f = open(file_name, "rb") + if f = -1 then + return -1 + end if + line = gets(f) + text = {} + while sequence(line) do + text &= line + line = gets(f) + end while + close(f) + return text +end function + +sequence text, source_filename, tok, errors +text = "" +source_filename = "" +tok = "" +errors = {} -- { {SYNTAX_ERROR, pos, len, msg}... } + +integer idx, tok_idx, ifdef_ok, ast_idx +idx = 1 +tok_idx = 1 +ifdef_ok = 1 +ast_idx = 1 -- current top-level ast index used for declaring stuff + +map:map cur_map -- the current maps[] during parsing + + +-- declare name, with name = "name" or {"name", pos, scope-start, [scope-end]} +procedure declare(sequence name) + object loc = ast_idx + + if length(name) = 0 or length(name[1]) = 0 then + return + end if + + if sequence(name[1]) then + loc = name +-- if length(value) < 3 or +-- not sequence(value[1]) or +-- not atom(value[2]) or +-- not atom(value[3]) or +-- (length(value) >= 4 and (not atom(value[4]) or value[4] <= value[3])) then +-- puts(1, "invalid declaration\n") +-- pretty_print(1, value) +-- return +-- end if + name = name[1] + loc[1] = ast_idx + end if + + map:put(cur_map, name, append(map:get(cur_map, name, {}), loc)) +end procedure + +function prefixed(sequence s) + return s[1] = GLOBAL or s[1] = PUBLIC or s[1] = EXPORT +end function + +-- update the declarations in this ast to the end of scope +procedure declare_ast(sequence ast, integer start_idx, integer scope_end, integer top = 0) + + for j = start_idx to length(ast) do + sequence s = ast[j] + integer n = prefixed(s) + integer decl = s[n+1] + + if top then + ast_idx = j + + if decl = NAMESPACE then + -- {NAMESPACE, "name"} + declare(s[n+2]) + + elsif decl = INCLUDE and n+4 <= length(s) then + -- {INCLUDE, includes-idx, scope-start, ["namespace"]} + declare(s[n+4]) -- include as + + elsif decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + declare(s[n+2]) + sequence args = s[n+4] + integer sub_scope_end = s[n+6] + for i = 1 to length(args) do + declare(args[i][2..4] & sub_scope_end) + end for + declare_ast(s, n+7, sub_scope_end) + + elsif decl = CONST_DECL then + -- {CONST_DECL, {"name", pos, scope-start, expr}... } + for i = n+2 to length(s) do + declare(s[i][1..3] & scope_end) + end for + + elsif decl = ENUM_DECL then + -- {ENUM_DECL, "typename"|"", pos, '+'|'-'|'*'|'/', expr, + -- {"name", pos, scope-start, [expr]}...} + if length(s[n+2]) then + declare(s[n+2]) + end if + for i = n+6 to length(s) do + declare(s[i][1..3] & scope_end) + end for + elsif decl = NAMESPACE then + declare({s[1],1,1}) + end if + + end if + + if decl = VAR_DECL then + -- {VAR_DECL, "type", pos, {"name", pos, scope-start, [expr]}...} + for i = n+4 to length(s) do + declare(s[i][1..3] & scope_end) + end for + + elsif decl = WHILE then + -- {WHILE, expr, scope-start, scope-end, stmts...} + declare_ast(s, n+5, s[n+4]) + + elsif decl = IF then + -- {IF, expr, {scope-start, scope-end, stmts...}, + -- [expr, {scope-start, scope-end, elsif-stmts...},]... + -- [{scope-start, scope-end, else-stmts...}]} + for i = n+2 to length(s) by 2 do + if i = length(s) then + declare_ast(s[i], 3, s[i][2]) + else + declare_ast(s[i+1], 3, s[i+1][2]) + end if + end for + + elsif decl = FOR then + -- {FOR, "name", pos, expr, expr, by, scope-start, scope-end, stmts...} + declare(s[n+2..n+3] & s[n+7..n+8]) + declare_ast(s, n+9, s[n+8]) + + elsif decl = SWITCH then + -- {SWITCH, expr, bool-fallthru, label-string, + -- [{case-values...}, {scope-start, scope-end, stmts...},]... } + -- ("case else" will have case-values={} ) + for i = n+6 to length(s) by 2 do + declare_ast(s[i], 3, s[i][2]) + end for + + elsif decl = LOOP then + -- {LOOP, scope-start, scope-end, stmts...} + declare_ast(s, n+4, s[n+3]) + + end if + end for +end procedure + + +-- prints an error message indicated at tok_idx +procedure error(sequence msg) + integer line, start + + if length(tok) then + errors = append(errors, {SYNTAX_ERROR, tok_idx, length(tok), msg}) + end if + + if not ERROR_PRINT then return end if + + line = 1 + start = 1 + + if tok_idx > length(text) then + tok_idx = length(text) + end if + + for i = 1 to tok_idx do + if text[i] = '\n' then + line += 1 + start = i+1 + end if + end for + for i = tok_idx to length(text) do + if text[i] = '\n' then + --? {start, idx, tok_idx} + printf(2, "%s:%d\n%s\n%s%s\n", { + source_filename, + line, + msg, + text[start..i], + repeat(' ', tok_idx - start) & '^'}) + if ERROR_ABORT then abort(1) end if + --wait_key() + return + end if + end for + puts(2, "unexpected end of file\n") + if ERROR_ABORT then abort(1) end if +end procedure + +constant ALPHA = 1, NUM = 2, HEX = 4, WS = 8, PUNCT = 16, ALPHANUM = 32 +sequence chars = repeat(0, 255) +chars['A'..'Z'] = ALPHA + ALPHANUM +chars['a'..'z'] = ALPHA + ALPHANUM +chars['_'] = ALPHA + choose(OE4, NUM + HEX + ALPHANUM, 0) +chars['0'..'9'] = NUM + HEX + ALPHANUM +chars['A'..'F'] += HEX +chars['a'..'f'] += choose(OE4, HEX, 0) +chars[':'] = choose(OE4, ALPHANUM, 0) +chars['\n'] = WS +chars['\t'] = WS +chars['\r'] = WS +chars[' '] = WS +chars['<'] = PUNCT +chars['>'] = PUNCT +chars['+'] = PUNCT +chars['-'] = PUNCT +chars['*'] = PUNCT +chars['/'] = PUNCT +chars['&'] = PUNCT +chars['!'] = PUNCT + + +procedure skip_hashbang() + integer c = 0 + if length(text) >= 2 and text[1] = '#' and text[2] = '!' then + -- skip special comment for shell interpreter + while not find(c, "\r\n") do + idx += 1 + if idx > length(text) then return end if + c = text[idx] + end while + end if +end procedure + +procedure skip_whitespace() + integer c + if idx > length(text) then return end if + c = text[idx] + while find(c, "\t\r\n -") or (OE4 and c='/') do + if c = '-' then + if idx >= length(text) or text[idx+1] != '-' then + exit + end if + -- skip comment + while not find(c, "\r\n") do + idx += 1 + if idx > length(text) then return end if + c = text[idx] + end while + elsif OE4 and c = '/' then + if idx >= length(text) or text[idx+1] != '*' then + return + end if + idx += 2 + -- skip multiline comment + while idx <= length(text) and not equal(text[idx-1..idx], "*/") do + idx += 1 + end while + end if + idx += 1 + if idx > length(text) then return end if + c = text[idx] + end while +end procedure + + +function isalpha(integer c) + return and_bits(chars[c], ALPHA) + --return (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z') or (OE4 and c = '_') +end function + +function isnum(integer c) + return and_bits(chars[c], NUM) + --return (c >= '0' and c <= '9') or (OE4 and c = '_') +end function + +function isalphanum(integer c) + return and_bits(chars[c], ALPHANUM) + --return isalpha(c) or isnum(c) or c = '_' or (OE4 and c = ':') +end function + +function ishex(integer c) + return and_bits(chars[c], HEX) + --return isnum(c) or (c >= 'A' and c <= 'F') +end function + +function ispunct(integer c) + return and_bits(chars[c], PUNCT) +end function + +procedure num_token() + -- parse new hex/binary/octal format + if OE4 and idx <= length(text) and text[tok_idx] = '0' and + idx = tok_idx+1 and find(text[idx], "xXbBoO") then + idx += 1 + while idx <= length(text) and ishex(text[idx]) do + idx += 1 + end while + return + end if + + -- parse digits if not starting with '.' + if text[tok_idx] != '.' then + while idx <= length(text) and isnum(text[idx]) do + idx += 1 + end while + if idx < length(text) and text[idx] = '.' and text[idx+1] != '.' then + idx += 1 + end if + end if + + -- parse fractional digits + while idx <= length(text) and isnum(text[idx]) do + idx += 1 + end while + + -- parse exponent + if idx <= length(text) and (text[idx] = 'e' or text[idx] = 'E') then + idx += 1 + while idx <= length(text) and isnum(text[idx]) do + idx += 1 + end while + end if +end procedure + +function token(sequence try) + if length(tok) = 0 then + skip_whitespace() + if idx > length(text) then + return equal(tok, try) + end if + tok_idx = idx + idx += 1 + switch text[tok_idx] do + case 'a','b','c','d','e','f','g','h','i','j','k','l','m','n', + 'o','p','q','r','s','t','u','v','w','x','y','z','_', + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N', + 'O','P','Q','R','S','T','U','V','W','X','Y','Z' then + while idx <= length(text) and (isalphanum(text[idx]) or (OE4 and text[idx] = ':')) do + idx += 1 + end while + case '0','1','2','3','4','5','6','7','8','9' then + num_token() + case '.' then + if idx <= length(text) and text[idx] = '.' then + idx += 1 + else + num_token() + end if + case '+','-','*','/','&','<','>','!' then + if idx <= length(text) and text[idx] = '=' then + idx += 1 + end if + case '#' then + while idx <= length(text) and ishex(text[idx]) do + idx += 1 + end while + end switch + tok = text[tok_idx..idx-1] + -- printf(1, "token: %s\n", {tok}) + end if + if equal(tok, try) then + tok = "" + return 1 + end if + return 0 +end function + +procedure expect(sequence try) + if not token(try) then + error("expected '" & try & "', not '"&tok&"'") + tok = "" + end if +end procedure + +function identifier() + if length(tok) = 0 then + if token("") then + return 0 + end if + end if + -- note: namespace is the only keyword than can also be used as an identifier + return isalpha(tok[1]) and map:get(lookup_table, tok, NAMESPACE) = NAMESPACE +end function + +function get_token() + sequence result + if length(tok) = 0 then + token("") + end if + result = tok + tok = "" + return result +end function + + +function escape_character(integer c) + integer i + sequence s + i = find(c, "trn\\\'\"") + if i = 0 then + error("unknown escape character") + return c + end if + s = "\t\r\n\\\'\"" + return s[i] +end function + +function string_literal() + sequence s + s = "" + + -- check for triple-quoted string + if idx+1 <= length(text) and text[idx] = '"' and text[idx+1] = '"' then + -- triple-quoted string + integer start_idx = idx+2 + idx += 2 + while text[idx] != '"' or text[idx+1] != '"' or text[idx+2] != '"' do + idx += 1 + if idx+2 > length(text) then + error("unexpected end of file") + exit + end if + end while + idx += 3 + return text[start_idx..idx-4] + end if + + while idx <= length(text) and text[idx] != '"' do + if text[idx] = '\n' or text[idx] = '\r' then + error("unterminated string literal") + return s + end if + if text[idx] = '\\' then + idx += 1 + if idx <= length(text) then + s &= escape_character(text[idx]) + end if + else + s &= text[idx] + end if + idx += 1 + if idx > length(text) then + error("unexpected end of file") + return s + end if + end while + idx += 1 + return s +end function + +function multiline_string_literal() + integer start_idx + + start_idx = idx + while text[idx] != '`' do + idx += 1 + if idx > length(text) then + error("unexpected end of file") + return text[start_idx..idx-1] + end if + end while + idx += 1 + return text[start_idx..idx-2] +end function + +function character_literal() + integer c = 0 + if idx <= length(text) then + c = text[idx] + if c = '\n' or c = '\r' then + error("unterminated character literal") + end if + idx += 1 + if c = '\\' and idx <= length(text) then + c = escape_character(text[idx]) + idx += 1 + end if + end if + if idx > length(text) then + error("unexpected end of file") + return c + end if + if text[idx] != '\'' then + tok_idx = idx + error("expected '''") + end if + idx += 1 + return c +end function + +-- returns a bare or quoted filename following an include statement +-- when quoted, backslashes must be escaped +function include_filename() + sequence s + skip_whitespace() + if idx <= length(text) and text[idx] = '\"' then + idx += 1 + tok_idx = idx + return string_literal() + end if + s = "" + tok_idx = idx + while idx <= length(text) and not find(text[idx], "\t\r\n ") do + s &= text[idx] + idx += 1 + end while + return s +end function + + +-- returns a sequence of paths from the eu.cfg +-- name is path to eu.cfg file, mode can be "interpret", "translate", "bind" +global function parse_eu_cfg(sequence name, sequence mode = "interpret") + integer fd, section_ok = 1 + object line + sequence result = {} + sequence allowed_sections = {"[all]", "["&mode&"]"} + ifdef WINDOWS then + allowed_sections &= {"[windows]", "["&mode&":windows]"} + end ifdef + ifdef UNIX then + allowed_sections &= {"[unix]", "["&mode&":unix]"} + end ifdef + + fd = open(name, "r") + if fd = -1 then return {} end if + line = gets(fd) + while sequence(line) do + line = trim(line) + if length(line) then + if line[1] = '-' then + -- comment or compiler option, ignore it + elsif line[1] = '[' then + -- section + section_ok = find(line, allowed_sections) + elsif section_ok then + result = append(result, line) + end if + end if + line = gets(fd) + end while + close(fd) + return result +end function + +-- returns a unique timestamp for filename, or -1 if doesn't exist or is a directory +global function get_timestamp(sequence file_name) + object info + + ifdef WINDOWS then + if find(upper(filename(file_name)), dos_devices) then + return -1 + end if + end ifdef + + info = dir(file_name) + if atom(info) or length(info) = 0 or length(info[1]) < 9 then + return -1 + end if + info = info[1] + if find('d', info[D_ATTRIBUTES]) or find('D', info[D_ATTRIBUTES]) then + return -1 -- don't work on directories or devices + end if + -- timestamp is contrived (unlike seconds since epoch) + -- just needs to be unique so we can tell if a file was changed. + -- there will be gaps since not all months have 31 days. + return info[D_SECOND] + 60 * ( + info[D_MINUTE] + 60 * ( + info[D_HOUR] + 24 * ( + info[D_DAY] + 31 * ( + info[D_MONTH] + 12 * + info[D_YEAR])))) +end function + +-- returns index of new/existing cache entry +function cache_entry(sequence filename) + object tmp + integer f + + -- find an existing entry + for i = 1 to length(cache) do + if equal(cache[i][1], filename) then + return i + end if + end for + + -- create new cache and map entries + cache = append(cache, {filename, 0}) + maps = append(maps, map:new()) + return length(cache) +end function + +-- returns -1 if not found, or index of cache entry +function include_file(sequence filename) + sequence state, tmp, paths + atom ts = -1 + integer f + + tmp = filename + ts = get_timestamp(tmp) + if ts = -1 and not equal(source_filename, "") then + -- checks for the include file in the same directory as the parent + tmp = dirname(source_filename) & SLASH & tmp + ts = get_timestamp(tmp) + --printf(1, "%s %d\n", {tmp, ts}) + if ts = -1 then + -- search for a eu.cfg in the same directory as the parent? + tmp = dirname(source_filename) & SLASH & "eu.cfg" + paths = parse_eu_cfg(tmp) + for i = 1 to length(paths) do + tmp = paths[i] + if tmp[$] != SLASH then + tmp &= SLASH + end if + tmp &= filename + ts = get_timestamp(tmp) + if ts != -1 then + exit + end if + end for + end if + end if + if ts = -1 then + -- search standard include paths (of the editor interpreter instance) + paths = include_search_paths + -- try EUDIR too + for i = 1 to length(paths) do + tmp = paths[i] + if tmp[$] != SLASH then + tmp &= SLASH + end if + tmp &= filename + ts = get_timestamp(tmp) + --printf(1, "%s %d\n", {tmp, ts}) + if ts != -1 then + exit + end if + end for + end if + if ts = -1 then + return -1 -- file not found + end if + + filename = canonical_path(tmp, 0, CORRECT) + + -- verify that the file can be opened + f = open(filename, "rb") + if f = -1 then + puts(2, "Warning: unable to read file: "&filename&"\n") + return -1 -- unable to read file + end if + close(f) + + --printf(1, "%s %d\n", {tmp, ts}) + return cache_entry(filename) +end function + + +function to_number(sequence s) + atom x, y + integer base, start + + x = 0 + y = 0 + base = 10 + start = 1 + + if s[1] = '#' then + base = 16 + start = 2 + elsif OE4 and length(s) >= 2 and s[1] = '0' then + if s[2] = 'b' or s[2] = 'B' then + base = 2 + start = 2 + elsif s[2] = 'x' or s[2] = 'X' then + base = 16 + start = 2 + elsif s[2] = 'o' or s[2] = 'O' then + base = 8 + start = 2 + end if + end if + + for i = start to length(s) do + if s[i] = '.' then + y = 1 + elsif s[i] != '_' then + if y = 0 then + x = x * base + (s[i] - '0') + if s[i] >= 'A' then + x += (10 - 'A') + end if + else + -- fractional part + y /= base + x += y * (s[i] - '0') + -- FIXME, this is probably not accurate + if s[i] >= 'A' then + x += y * (10 - 'A') + end if + end if + end if + end for + return x +end function + +function variable_or_function_call() + sequence e = {VARIABLE, get_token(), tok_idx} + --printf(1, "identifier %s\n", {e[2]}) + if token("(") then + -- function call + e[1] = FUNC + if not token(")") then + --printf(1, "function call %s\n", {e[2]}) + integer ok = 1 + while ok do + if OE4 and token(",") then + e = append(e, {DEFAULT}) + else + e = append(e, expr(1)) + ok = token(",") + end if + end while + expect(")") + end if + else + while token("[") do + e = {SUBSCRIPT, e, expr(1)} + if token("..") then + e[1] = SLICE + e = append(e, expr(1)) + expect("]") + exit + end if + expect("]") + end while + end if + return e +end function + +constant precedence = { + 0, -- LOAD + 0, -- LOADHI + 0, -- MOV + 4, -- ADD + 0, -- ADDU8 + 5, -- MUL + 5, -- DIV + 0, -- REM + 2, -- JL + 2, -- JLE + 2, -- JE + 2, -- JNE + 0, -- JMP + 2, -- EQ + 2, -- NEQ + 2, -- LT + 2, -- GTE + 2, -- LTE + 2, -- GT + 0, -- QPRINT + 4, -- SUB + 0, -- SUBU8 + 0, -- NOT + 0, -- NEG + 1, -- AND + 1, -- OR + 1, -- XOR + 3 -- CAT +} + +function expr(integer depth) + sequence e, t + + t = get_token() + switch t do + case "not" then + e = {NOT, expr(100)} + case "(" then + e = expr(1) + expect(")") + case "-" then + e = {NEG, expr(100)} + if length(e[2]) and e[2][1] = NUMBER then + e = {NUMBER, -e[2][2]} + end if + case "+" then + e = expr(100) + case "\"" then + e = {STRING, string_literal()} + case "`" then + e = {STRING, multiline_string_literal()} + case "'" then + e = {NUMBER, character_literal()} + case "$" then + e = {SEQ_LEN} + case "{" then + e = {SEQ} + if not token("}") then + e = append(e, expr(1)) + while token(",") do + if OE4 and token("$") then exit end if + e = append(e, expr(1)) + end while + expect("}") + end if + + case else + tok = t + if identifier() then + e = variable_or_function_call() + elsif length(tok) and (isnum(tok[1]) or tok[1] = '#' or tok[1] = '.') then + e = {NUMBER, to_number(get_token())} + else + return {SYNTAX_ERROR, tok_idx, length(tok), "expected an expression"} + end if + end switch + + while 1 do + t = get_token() + switch t do + case "and","or","xor","<","<=",">",">=","=","!=","&","+","-","*","/" then + integer op = map:get(lookup_table, t) + if depth > precedence[op] then + exit + end if + e = {op, e, expr(precedence[op])} + case else + exit + end switch + end while + + tok = t + return e +end function + +-- returns a boolean +function ifdef_reduce(sequence e) + if length(e) = 0 then + return 0 + elsif e[1] = AND then + return ifdef_reduce(e[2]) and ifdef_reduce(e[3]) + elsif e[1] = OR then + return ifdef_reduce(e[2]) or ifdef_reduce(e[3]) + elsif e[1] = XOR then + return ifdef_reduce(e[2]) xor ifdef_reduce(e[3]) + elsif e[1] = NOT then + return not ifdef_reduce(e[2]) + elsif e[1] = VARIABLE then + return find(e[2], defined_words) != 0 + end if + return 0 +end function + +function variable_declaration() + sequence result, tmp + integer save_idx + + save_idx = idx + result = {VAR_DECL, get_token(), tok_idx} + if not identifier() then + -- restore the last token + tok = result[2] + tok_idx = result[3] + idx = save_idx + return {} + end if + + while 1 do + tmp = {get_token(), tok_idx, 0} + if OE4 and token("=") then + tmp = append(tmp, expr(1)) + end if + tmp[3] = tok_idx -- scope-start + result = append(result, tmp) + if not token(",") or (OE4 and token("$")) then + exit + end if + if not identifier() then + error("expected an identifier") + exit + end if + end while + + return result +end function + +function constant_declaration() + sequence result, tmp + + result = {CONST_DECL} + while identifier() do + tmp = {get_token(), tok_idx, 0, 0} + expect("=") + tmp[4] = expr(1) + tmp[3] = tok_idx -- scope-start + result = append(result, tmp) + if not token(",") or (OE4 and token("$")) then + return result + end if + end while + error("expected an identifier name") + return result +end function + +function assignment_or_procedure_call() + sequence result, ops + integer ok, save_idx = idx + + if not identifier() then + return {} + end if + + result = {0, get_token(), tok_idx} + if token("(") then + -- procedure call + result[1] = PROC + if not token(")") then + ok = 1 + while ok do + if OE4 and token(",") then + result = append(result, {DEFAULT}) + else + result = append(result, expr(1)) + ok = token(",") + end if + end while + expect(")") + end if + return result + + elsif token("[") then + ops = {SUB_ASSIGN, SUB_ADDTO, SUB_SUBTO, SUB_MULTO, SUB_DIVTO, SUB_CATTO} + tok = "[" + while token("[") do + result = append(result, expr(1)) + if token("..") then + result = append(result, expr(1)) + expect("]") + ops = {SLICE_ASSIGN, SLICE_ADDTO, SLICE_SUBTO, SLICE_MULTO, SLICE_DIVTO, SLICE_CATTO} + exit + end if + expect("]") + end while + else + ops = {ASSIGN, ADDTO, SUBTO, MULTO, DIVTO, CATTO} + end if + + if token("=") then + result[1] = ops[1] + elsif token("+=") then + result[1] = ops[2] + elsif token("-=") then + result[1] = ops[3] + elsif token("*=") then + result[1] = ops[4] + elsif token("/=") then + result[1] = ops[5] + elsif token("&=") then + result[1] = ops[6] + else + tok = result[2] + tok_idx = result[3] + idx = save_idx + return {} + end if + return append(result, expr(1)) +end function + +function subroutine_declaration(integer subroutine) + sequence result, args, tmp + result = {subroutine, "", 0} + if identifier() then + result[2] = get_token() + result[3] = tok_idx + else + error("expected an identifier name") + end if + expect("(") + args = {} + while not token(")") do + if length(args) and not token(",") then + error("expected ',' or ')'") + exit + end if + if identifier() then + tmp = {get_token(), 0, 0, 0} + else + error("expected a type name") + exit + end if + if identifier() then + tmp[2] = get_token() + tmp[3] = tok_idx + else + error("expected an argument name") + exit + end if + if OE4 and token("=") then + tmp = append(tmp, expr(1)) + end if + tmp[4] = tok_idx -- scope-start + args = append(args, tmp) + end while + result = append(result, args) + return result +end function + +function enum_declaration() + sequence result, tmp + + result = {ENUM_DECL, "", 0, '+', {NUMBER, 1}} + if token("type") then + if identifier() then + result[2] = get_token() + result[3] = tok_idx -- scope-start + else + error("expected an identifier name") + end if + end if + if token("by") then + if token("+") then + elsif token("-") then + result[4] = '-' + elsif token("*") then + result[4] = '*' + elsif token("/") then + result[4] = '/' + else + error("expected one of: + - * /") + end if + result[5] = expr(1) + end if + while identifier() do + tmp = {get_token(), tok_idx, 0} + if token("=") then + tmp = append(tmp, expr(1)) + end if + tmp[3] = tok_idx -- scope-start + result = append(result, tmp) + if not token(",") or (OE4 and token("$")) then + exit + end if + end while + if length(result[2]) then + expect("end") + expect("type") + end if + return result +end function + +function for_declaration() + sequence result + result = {FOR, "", 0} + if identifier() then + result[2] = get_token() + result[3] = tok_idx + else + error("expected an identifier name") + end if + expect("=") + result = append(result, expr(1)) + expect("to") + result = append(result, expr(1)) + if token("by") then + result = append(result, expr(1)) + else + result = append(result, {NUMBER, 1}) + end if + if OE4 and token("label") then + if token("\"") and length(string_literal()) then + else + error("expected a label string") + end if + end if + expect("do") + return result +end function + + +function filter_case_statements(sequence result, sequence ast) + -- {SWITCH, expr, bool-fallthru, label-string, + -- [{case-values...}, {scope-start, scope-end, stmts...},]... } + -- ("case else" will have case-values={} ) + integer case_idx = 0, scope_start, scope_end + + scope_start = ast[1] + for i = 3 to length(ast) do + sequence s = ast[i] + if s[1] = CASE then + scope_end = s[2] + if case_idx then + result = append(result, scope_start & scope_end & ast[case_idx+1..i-1]) + end if + result = append(result, s[4..$]) + case_idx = i + scope_start = s[3] + end if + end for + if case_idx then + scope_end = ast[2] + result = append(result, scope_start & scope_end & ast[case_idx+1..$]) + end if + return result +end function + +procedure with_or_without(integer mode) + if token("type_check") then + elsif token("warning") then + if not OE4 then return end if + if token("save") or token("restore") or token("strict") then + return + end if + if token("=") or token("&=") or token("+=") then + end if + if token("{") then + while tok_idx < length(text) and not token("}") do + get_token() + end while + end if + elsif token("trace") then + elsif token("profile") then + elsif token("profile_time") then + elsif OE4 and token("batch") then + elsif OE4 and token("indirect_includes") then + elsif OE4 and token("inline") then + else + error("unknown with/without option") + end if +end procedure + + +constant NONE = 0 + +function check_mode(integer mode, sequence token) + if mode = NONE then + return 0 + elsif mode = IF then + tok = "if" + elsif mode = WHILE then + tok = "while" + elsif mode = FOR then + tok = "for" + elsif mode = SWITCH then + tok = "switch" + elsif mode = FUNC_DECL then + tok = "function" + elsif mode = PROC_DECL then + tok = "procedure" + elsif mode = TYPE_DECL then + tok = "type" + elsif mode = IFDEF or mode = ELSEDEF then + return 0 + else + tok = "unknown" + end if + error("expected 'end "&tok&"' not '"&token&"'") + tok = token + return 1 +end function + +constant + PROC_FLAG = 1, -- return is allowed + FUNC_FLAG = 2, -- return with expr is allowed + LOOP_FLAG = 4, -- exit is allowed + CASE_FLAG = 8, -- case statement allowed + UNTIL_FLAG = 16 -- until statement is allowed + +function return_statement(integer flags) + if and_bits(flags, FUNC_FLAG) then + return {RETURN, expr(1)} + elsif and_bits(flags, PROC_FLAG) then + return {RETURN} + end if + error("'return' is not allowed here") + return {} +end function + + +-- mode is NONE, FUNC_DEC, PROC_DECL, TYPE_DECL, IF, IFDEF, SWITCH, WHILE, FOR +-- sub is 0, FUNC, PROC (used to determine if return needs expr) +function statements(integer mode, integer flags) + sequence ast, s, t + integer var_decl_ok, prefix, prefix_idx, saved_ifdef_ok + integer case_ok = and_bits(flags, CASE_FLAG) + + flags -= case_ok -- clear CASE_FLAG if set + s = {} + ast = {idx, 0} -- scope-start, scope-end + var_decl_ok = OE4 or find(mode, {NONE,FUNC_DECL,PROC_DECL,TYPE_DECL}) + prefix = 0 + while idx <= length(text) do + t = get_token() + switch t do + case "elsif", "else" then + tok = t + exit + + case "elsifdef", "elsedef" then + tok = t + exit + + case "end" then + if mode != NONE then + exit + end if + + case "global" then + prefix = GLOBAL + prefix_idx = tok_idx + case "public" then + prefix = PUBLIC + prefix_idx = tok_idx + case "export" then + prefix = EXPORT + prefix_idx = tok_idx + + case "while" then + s = {WHILE, expr(1)} + if OE4 and token("with") then + expect("entry") + elsif OE4 and token("entry") then + -- weird early syntax? appears in std includes + end if + if OE4 and token("label") then + if token("\"") and length(string_literal()) then + -- optional label string + else + error("expected a label string") + end if + end if + expect("do") + s &= statements(WHILE, or_bits(flags, LOOP_FLAG)) + expect("while") + + case "loop" then + s = {LOOP} + if OE4 and token("with") then + expect("entry") + end if + if OE4 and token("label") then + if token("\"") and length(string_literal()) then + -- optional label string + else + error("expected a label string") + end if + end if + expect("do") + s &= statements(LOOP, or_bits(flags, LOOP_FLAG + UNTIL_FLAG)) + expect("loop") + + case "until" then + if not and_bits(flags, LOOP_FLAG + UNTIL_FLAG) = LOOP_FLAG + UNTIL_FLAG then + error("until must be inside a loop") + end if + s = {UNTIL, expr(1)} + + case "entry" then + if not and_bits(flags, LOOP_FLAG) then + error("entry must be inside a loop") + end if + s = {ENTRY} + + case "label" then + if token("\"") then + s = {LABEL, string_literal()}-- optional label string + else + error("expected a label string") + end if + + case "for" then + s = for_declaration() + s &= statements(FOR, or_bits(flags, LOOP_FLAG)) + -- {FOR, name, pos, expr, expr, by, scope-start, scope-end, stmts...} + expect("for") + + case "exit" then + if not and_bits(flags, LOOP_FLAG) then + tok = t + error("'exit' must be inside a loop") + tok = "" + end if + s = {EXIT} + if OE4 and token("\"") then + s &= {string_literal()} -- optional label string + end if + + case "if" then + s = {IF, expr(1)} + expect("then") + s = append(s, statements(IF, flags)) + while token("elsif") do + s = append(s, expr(1)) + expect("then") + s = append(s, statements(IF, flags)) + end while + if token("else") then + s = append(s, statements(ELSE, flags)) + end if + expect("if") + + case "ifdef" then + saved_ifdef_ok = ifdef_ok + flags += case_ok + ifdef_ok = ifdef_reduce(expr(1)) and saved_ifdef_ok + expect("then") + s = choose(ifdef_ok, statements(IFDEF, flags), {}) + while token("elsifdef") do + ifdef_ok = ifdef_reduce(expr(1)) and length(s) = 0 and saved_ifdef_ok + expect("then") + s = choose(ifdef_ok, statements(IFDEF, flags), s) + end while + if token("elsedef") then + ifdef_ok = length(s) = 0 and saved_ifdef_ok + s = choose(ifdef_ok, statements(ELSEDEF, flags), s) + end if + expect("ifdef") + ifdef_ok = saved_ifdef_ok + flags -= case_ok + if length(s) then + -- splice statements into ast + ast &= s[3..$] + s = {} + end if + + case "switch" then + s = {SWITCH, expr(1), 0, ""} + if token("with") then + expect("fallthru") + s[3] = 1 -- enable fallthru + end if + if token("label") then + if token("\"") then + s[4] = string_literal() -- optional label string + else + error("expected a label string") + end if + end if + expect("do") + s = filter_case_statements(s, statements(SWITCH, or_bits(flags, CASE_FLAG))) + expect("switch") + + case "case" then + s = {CASE, tok_idx, 0} + if not case_ok then + tok = t + error("'case' must be inside 'switch'") + tok = "" + end if + if not token("else") then + while identifier() or find(tok[1], "\"'0123456789#") do + if token("\"") then + s = append(s, '"'&string_literal()&'"') -- case values + elsif token("'") then + s = append(s, '\''&character_literal()&'\'') -- case values + else + s = append(s, get_token()) -- case values + end if + if not token(",") then exit end if + end while + expect("then") + end if + s[3] = tok_idx -- scope-start + + case "break" then + s = {BREAK} + if token("\"") then + s = append(s, string_literal()) -- optional label string + end if + + case "continue" then + s = {CONTINUE} + if token("\"") then + s = append(s, string_literal()) -- optional label string + end if + + case "goto" then + s = {GOTO} + expect("\"") + s = append(s, string_literal()) -- label string + + case "?" then + s = {QPRINT, expr(1)} + + case "with" then + if check_mode(mode, "with") then exit end if + with_or_without(1) + + case "without" then + if check_mode(mode, "without") then exit end if + with_or_without(0) + + case "include" then + if check_mode(mode, "include") then exit end if + tok = include_filename() + s = {INCLUDE, -1, idx} + if ifdef_ok then + s[2] = include_file(tok) + if s[2] = -1 then + error("can't find '"&tok&"'") + end if + end if + tok = "" + + if OE4 and token("as") then + if identifier() then + s = append(s, get_token()) + s[3] = tok_idx + else + error("expected an identifier") + end if + end if + if prefix = PUBLIC then + s = PUBLIC & s + prefix = 0 + end if + if not ifdef_ok then + s = {} + end if + + case "constant" then + if check_mode(mode, "constant") then exit end if + s = constant_declaration() + + case "function" then + if check_mode(mode, "function") then exit end if + s = subroutine_declaration(FUNC_DECL) + s &= statements(FUNC_DECL, or_bits(flags, FUNC_FLAG)) + expect("function") + + case "procedure" then + if check_mode(mode, "procedure") then exit end if + s = subroutine_declaration(PROC_DECL) + s &= statements(PROC_DECL, or_bits(flags, PROC_FLAG)) + expect("procedure") + + case "type" then + if check_mode(mode, "type") then exit end if + s = subroutine_declaration(TYPE_DECL) + s &= statements(TYPE_DECL, or_bits(flags, FUNC_FLAG)) + expect("type") + + case "return" then + s = return_statement(flags) + + case "enum" then + if check_mode(mode, "enum") then exit end if + s = enum_declaration() + + case "namespace" then + if mode != NONE or length(ast) > 2 then + error("namespace must be the first statement") + elsif not identifier() then + error("expected namespace identifier") + end if + s = {NAMESPACE, get_token()} + + case "{" then + s = {SEQ_ASSIGN} + while identifier() do + s &= {get_token(), tok_idx} + if not token(",") then + exit + end if + end while + expect("}") + expect("=") + s &= {expr(1)} + + case else + tok = t + if identifier() then + if var_decl_ok then + s = variable_declaration() + end if + if length(s) = 0 then + s = assignment_or_procedure_call() + end if + if length(s) = 0 then + error("expected statement, not '"&tok&"'") + tok = "" + end if + + elsif length(tok) then + error("expected statement, not '"&tok&"'") + tok = "" + end if + end switch + + if length(s) then + if prefix then + if (length(s) > 0 and find(s[1], {VAR_DECL, CONST_DECL, ENUM_DECL, + PROC_DECL, FUNC_DECL, TYPE_DECL})) then + s = prefix & s + prefix = 0 + else + tok_idx = prefix_idx + error("scope prefix wasn't expected here") + tok = "" + end if + end if + ast = append(ast, s) + s = {} + end if + if length(errors) then + ast &= errors + errors = {} + end if + + end while + ast[2] = idx -- scope-end + return ast +end function + +global function parse(sequence source_text, sequence file_name) + integer cache_idx + sequence ast + + file_name = canonical_path(file_name, 0, CORRECT) + cache_idx = cache_entry(file_name) + + source_filename = file_name + text = source_text + idx = 1 + tok_idx = 1 + tok = "" + ifdef_ok = 1 + ast_idx = 3 + cur_map = maps[cache_idx] + map:clear(cur_map) + skip_hashbang() + ast = statements(NONE, 0) + declare_ast(ast, 3, length(text), 1) + ast[1..2] = cache[cache_idx][1..2] + cache[cache_idx] = ast + + return ast +end function + +global function parse_file(sequence file_name) + object text = read_file(file_name) + if atom(text) then + return {} -- unable to read file + end if + return parse(text, file_name) +end function + +-- during get_decls we might need to reparse a file if its timestamp changed +procedure check_cache_timestamp(integer idx) + sequence ast, file_name + atom ts + file_name = cache[idx][1] + ts = get_timestamp(file_name) + if cache[idx][2] != ts then + cache[idx][2] = ts + ast = parse_file(file_name) + if length(ast) >= 2 then + ast[1] = file_name + ast[2] = ts + cache[idx] = ast + end if + end if +end procedure + + + +constant + F = "function", + P = "procedure", + T = "type", + I = "integer", + O = "object", + S = "sequence", + A = "atom", + builtins = { + {F, "abort", I, "errcode", 0}, + {F, "and_bits", O, "a", 0, O, "b", 0}, + {F, "append", S, "target", 0, O, "x", 0}, + {F, "arctan", O, "tangent", 0}, + {T, A, O, "x", 0}, + {F, "c_func", I, "rid", 0, S, "args", 1}, + {P, "c_proc", I, "rid", 0, S, "args", 1}, + {F, "call", I, "id", 0, S, "args", 1}, + {F, "call_func", I, "id", 0, S, "args", 1}, + {P, "call_proc", I, "id", 0, S, "args", 1}, + {P, "clear_screen"}, + {P, "close", A, "fn", 0}, + {F, "command_line"}, + {F, "compare", O, "compared", 0, O, "reference", 0}, + {F, "cos", O, "angle", 0}, + {F, "date"}, + {P, "delete", O, "x", 0}, + {F, "delete_routine", O, "x", 0, I, "rid", 0}, + {F, "equal", O, "left", 0, O, "right", 0}, + {F, "find", O, "needle", 0, S, "haystack", 0, I, "start", 1}, + {F, "floor", O, "value", 0}, + {F, "get_key"}, + {F, "getc", I, "fn", 0}, + {F, "getenv", S, "var_name", 0}, + {F, "gets", I, "fn", 0}, + {F, "hash", O, "source", 0, A, "algo", 0}, + {F, "head", S, "source", 0, A, "size", 1}, + {F, "include_paths", I, "convert", 0}, + {F, "insert", S, "target", 0, O, "what", 0, I, "index", 0}, + {T, I, O, "x", 0}, + {F, "length", O, "target", 0}, + {F, "log", O, "value", 0}, + {F, "machine_func", I, "machine_id", 0, O, "args", 1}, + {P, "machine_proc", I, "machine_id", 0, O, "args", 1}, + {F, "match", S, "needle", 0, S, "haystack", 0, I, "start", 1}, + {P, "mem_copy", A, "destination", 0, A, "origin", 0, I, "len", 0}, + {P, "mem_set", A, "destination", 0, I, "byte_value", 0, I, "how_many", 0}, + {F, "not_bits", O, "a", 0}, + {T, O, O, "x", 0}, + {F, "open", S, "path", 0, S, "mode", 0, I, "cleanup", 1}, + {F, "option_switches"}, + {F, "or_bits", O, "a", 0, O, "b", 0}, + {F, "peek", O, "addr_n_length", 0}, + {F, "peek2s", O, "addr_n_length", 0}, + {F, "peek2u", O, "addr_n_length", 0}, + {F, "peek4s", O, "addr_n_length", 0}, + {F, "peek4u", O, "addr_n_length", 0}, + {F, "peek8s", O, "addr_n_length", 0}, + {F, "peek8u", O, "addr_n_length", 0}, + {F, "peek_string", A, "addr", 0}, + {F, "peeks", O, "addr_n_length", 0}, + {F, "pixel"}, + {F, "platform"}, + {P, "poke", A, "addr", 0, O, "x", 0}, + {P, "poke2", A, "addr", 0, O, "x", 0}, + {P, "poke4", A, "addr", 0, O, "x", 0}, + {P, "poke8", A, "addr", 0, O, "x", 0}, + {P, "position", I, "row", 0, I, "column", 0}, + {F, "power", O, "base", 0, O, "exponent", 0}, + {F, "prepend", S, "target", 0, O, "x", 0}, + {P, "print", I, "fn", 0, O, "x", 0}, + {P, "printf", I, "fn", 0, S, "format", 0, O, "values", 0}, + {P, "puts", I, "fn", 0, O, "text", 0}, + {F, "rand", O, "maximum", 0}, + {F, "remainder", O, "dividend", 0, O, "divisor", 0}, + {F, "remove", S, "target", 0, A, "start", 0, A, "stop", 1}, + {F, "repeat", O, "item", 0, A, "count", 0}, + {F, "replace", S, "target", 0, O, "replacement", 0, I, "start", 0, I, "stop", 1}, + {F, "routine_id", S, "routine_name", 0}, + {T, S, O, "x", 0}, + {F, "sin", O, "angle", 0}, + {F, "splice", S, "target", 0, O, "what", 0, I, "index", 0}, + {F, "sprintf", S, "format", 0, O, "values", 0}, + {F, "sqrt", O, "value", 0}, + {P, "system", S, "command", 0, I, "mode", 1}, + {F, "system_exec", S, "command", 0, I, "mode", 1}, + {F, "tail", S, "source", 0, A, "size", 1}, + {F, "tan", O, "angle", 0}, + {P, "task_clock_start"}, + {P, "task_clock_stop"}, + {F, "task_create", I, "rid", 0, S, "args", 0}, + {F, "task_list"}, + {F, "task_schedule", A, "task_id", 0, O, "schedule", 0}, + {F, "task_self"}, + {F, "task_schedule", A, "task_id", 0}, + {F, "task_suspend", A, "task_id", 0}, + {F, "task_yield"}, + {F, "time"}, + {P, "trace", I, "mode", 0}, + {F, "xor_bits", O, "a", 0, O, "b", 0} + } + +map:map builtins_map = map:new() +for i = 1 to length(builtins) do + +end for + +global function get_builtins() + sequence s + s = {} + for i = 1 to length(builtins) do + if i > 1 then s &= ' ' end if + s &= builtins[i][2] + end for + return s +end function + + +function is_namespace(sequence ast, sequence name_space) + if length(ast) >= 3 and ast[3][1] = NAMESPACE and equal(ast[3][2], name_space) then + return 1 + end if + return 0 +end function + + +sequence include_ids, include_flags +constant + FILTER_LOCAL = 1, -- #01 + FILTER_GLOBAL = 2, -- #02 + FILTER_PUBLIC = 4, -- #04 + FILTER_EXPORT = 8, -- #08 + FILTER_INCLUDE = 16, -- #10 + FILTER_INCLUDE_AS = 32, -- #20 + FILTER_ALL = 63 -- #3F + + +function get_include_filter(sequence s, sequence name_space, integer filter, integer prefix) + integer idx, include_filter + + idx = s[2] -- cache[] index + check_cache_timestamp(idx) + if length(name_space) then + --if length(s) >= 3 then + -- printf(1, "filter=%x namespace=%s include as %s\n", {filter, name_space, s[3]}) + --end if + if filter = FILTER_GLOBAL + FILTER_PUBLIC + FILTER_EXPORT then + -- include as namespace -> include + include_filter = FILTER_PUBLIC + elsif and_bits(filter, FILTER_PUBLIC) and prefix = FILTER_PUBLIC then + -- a public include from nested include + include_filter = FILTER_PUBLIC + elsif and_bits(filter, FILTER_INCLUDE_AS) and length(cache[idx]) >= 3 and + equal(cache[idx][3], {NAMESPACE, name_space}) then + -- include has same namespace + include_filter = FILTER_GLOBAL + FILTER_PUBLIC + FILTER_EXPORT + + else + include_filter = 0 + end if + elsif and_bits(filter, FILTER_INCLUDE_AS) then + -- top-level include + include_filter = FILTER_GLOBAL + FILTER_PUBLIC + FILTER_EXPORT + elsif and_bits(filter, FILTER_PUBLIC) and prefix = FILTER_PUBLIC then + -- public sub-include + include_filter = FILTER_GLOBAL + FILTER_PUBLIC + else + -- sub-include + include_filter = FILTER_GLOBAL + end if + idx = find(s[2], include_ids) + if idx = 0 then + -- new entry + include_ids &= s[2] + include_flags &= 0 + idx = length(include_ids) + elsif and_bits(include_flags[idx], include_filter) = include_filter then + -- avoid adding the same symbols again + return -1 + end if + + include_filter = and_bits(include_filter, not_bits(include_flags[idx])) + include_flags[idx] = or_bits(include_flags[idx], include_filter) + + return include_filter + FILTER_INCLUDE +end function + + +-- returns {{"subroutine-type", "name", ["arg1-type", "arg1-name", is_default]... }... } +function get_args(sequence ast, sequence word, sequence name_space, integer filter) + sequence result, s + integer x, decl, prefix, include_filter + + if length(name_space) and is_namespace(ast, name_space) then + filter = and_bits(filter, FILTER_INCLUDE + FILTER_INCLUDE_AS + FILTER_PUBLIC) + if filter = 0 then + return {} -- no namespace or mismatch + end if + end if + + result = {} + for i = 3 to length(ast) do + s = ast[i] + + prefix = power(2, find(s[1], {GLOBAL, PUBLIC, EXPORT})) + if prefix > 1 then + s = s[2..$] -- remove prefix + end if + decl = s[1] + if and_bits(filter, prefix) = 0 and decl != INCLUDE then + decl = 0 + end if + + if decl = INCLUDE and and_bits(filter, FILTER_INCLUDE) then + -- {INCLUDE, includes-index, scope-start, ["namespace"]} + x = s[2] + if x != -1 and and_bits(filter, FILTER_INCLUDE) then + include_filter = get_include_filter(s, name_space, filter, prefix) + if include_filter != -1 then + result &= get_args(cache[x], word, name_space, include_filter) + end if + end if + + elsif decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL and equal(s[2], word) then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + if decl = FUNC_DECL then + result &= {{"function", s[2]}} + elsif decl = PROC_DECL then + result &= {{"procedure", s[2]}} + elsif decl = TYPE_DECL then + result &= {{"type", s[2]}} + end if + for j = 1 to length(s[4]) do -- display arguments + result[$] &= {s[4][j][1], s[4][j][2], length(s[4][j]) = 5} -- {"type", "name", has-default} + end for + + end if + end for + -- scan builtins + if length(result) = 0 then + for i = 1 to length(builtins) do + if equal(word, builtins[i][2]) then + result &= {builtins[i]} + exit + end if + end for + end if + return result +end function + +function type_to_decl(sequence name) + if equal(name, "atom") then + return DECL_ATOM + elsif equal(name, "sequence") then + return DECL_SEQUENCE + elsif equal(name, "integer") then + return DECL_INTEGER + end if + return DECL_OBJECT +end function + +-- to prevent recursion, symbols may be included from a file +-- only once for each type of flag: global, public, export + +-- namespace matches: +-- top-level file has same namespace +-- top-level file has include as same namespace +-- included file has same namespace +-- included file is publicly included by file with same namespace + +-- get a list of declarations from ast in scope at pos +-- returns {{"name1", pos1, type1}, {"name2", pos2, type2}...} +-- pos may be be an integer for the position in the current file, +-- or {pos, "include-path"} for included files. + +function get_decls(sequence ast, integer pos, sequence name_space, integer filter) + sequence result, s + integer x, decl, prefix, include_filter + + if length(name_space) and is_namespace(ast, name_space) then + filter = and_bits(filter, FILTER_INCLUDE + FILTER_INCLUDE_AS + FILTER_PUBLIC) + if filter = 0 then + return {} -- no namespace or mismatch + end if + end if + + result = {} + + if length(name_space) = 0 and length(ast) >= 3 and ast[3][1] = NAMESPACE then + if and_bits(filter, FILTER_PUBLIC) then + result = {{ast[3][2] & ':', 1, DECL_NAMESPACE}} + end if + end if + + for i = 3 to length(ast) do + s = ast[i] + + prefix = power(2, find(s[1], {GLOBAL, PUBLIC, EXPORT})) + if prefix > 1 then + s = s[2..$] -- remove prefix + end if + decl = s[1] + if and_bits(prefix, filter) = 0 and decl != INCLUDE then + -- the scope modifier didn't pass the filter + decl = 0 + end if + + if decl = INCLUDE and and_bits(filter, FILTER_INCLUDE) then + -- {INCLUDE, includes-index, scope-start, ["namespace"]} + x = s[2] -- includes-index into cache + if x != -1 then + --printf(1, "include %s filter=%x\n", {cache[x][1], filter}) + if length(name_space) and and_bits(filter, FILTER_INCLUDE_AS) and + length(s) >= 4 and equal(s[4], name_space) and pos >= s[3] then + -- found a matching "include as" + filter = 0 + include_filter = FILTER_GLOBAL+FILTER_PUBLIC+FILTER_EXPORT+FILTER_INCLUDE + result = {} + name_space = {} + else + include_filter = get_include_filter(s, name_space, filter, prefix) + end if + if include_filter != -1 then + check_cache_timestamp(x) + s = get_decls(cache[x], 0, name_space, include_filter) + --printf(1, "%s: %d\n", {cache[x][1], length(cache[x])}) + for j = 1 to length(s) do + --printf(1, "%s: %d\n", {s[j-1], s[j]}) + if not sequence(s[j][2]) then + s[j][2] = {cache[x][1], s[j][2]} -- is {filename, pos} + end if + end for + result &= s + end if + end if + + elsif decl = CONST_DECL then + -- {CONST_DECL, {"name", pos, scope-start, expr}... } + --printf(1, "constant\n", {}) + for j = 2 to length(s) do + --printf(1, " %s: %d\n", {s[j][1], s[j][2]}) + if length(s[j]) >= 3 and (pos >= s[j][3] or filter) then -- in scope? + result = append(result, {s[j][1], s[j][2], DECL_CONSTANT}) + end if + end for + + elsif decl = VAR_DECL then + -- {VAR_DECL, "type", pos, {"name", pos, scope-start, [expr]}...} + --printf(1, s[2] & "\n", {}) + for j = 4 to length(s) do + --printf(1, " %s: %d\n", {s[j][1], s[j][2]}) + if length(s[j]) >= 3 and (pos >= s[j][3] or filter) then -- in scope? + result = append(result, {s[j][1], s[j][2], type_to_decl(s[2])}) + end if + end for + + elsif decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + if decl = FUNC_DECL then + --printf(1, "function %s: %d scope=%d..%d\n", {s[2], s[3], s[5], s[6]}) + result = append(result, {s[2], s[3], DECL_FUNCTION}) + elsif decl = PROC_DECL then + --printf(1, "procedure %s: %d scope=%d..%d\n", {s[2], s[3], s[5], s[6]}) + result = append(result, {s[2], s[3], DECL_PROCEDURE}) + elsif decl = TYPE_DECL then + --printf(1, "type %s: %d scope=%d..%d\n", {s[2], s[3], s[5], s[6]}) + result = append(result, {s[2], s[3], DECL_TYPE}) + end if + if length(s) >= 6 and pos >= s[5] and pos <= s[6] then -- in scope? + for j = 1 to length(s[4]) do -- display arguments + if length(s[4][j]) >= 4 and pos >= s[4][j][4] then + --printf(1, " %s %s: %d\n", {s[4][j][1], s[4][j][2], s[4][j][3]}) + result = append(result, {s[4][j][2], s[4][j][3], type_to_decl(s[4][j][1])}) + end if + end for + result &= get_decls(s[5..$], pos, name_space, filter) + end if + + elsif decl = FOR then + -- {FOR, name, pos, expr, expr, by, scope-start, scope-end, stmts...} + if length(s) >= 8 and pos >= s[7] and pos <= s[8] then -- in scope? + --printf(1, "for %s: %d\n", {s[2], s[3]}) + result = append(result, {s[2], s[3], DECL_ATOM}) + result &= get_decls(s[7..$], pos, name_space, filter) + end if + + elsif decl = WHILE then + -- {WHILE, expr, scope-start, scope-end, stmts...} + if length(s) >= 4 and pos >= s[3] and pos <= s[4] then -- in scope? + result &= get_decls(s[3..$], pos, name_space, filter) + end if + + elsif decl = LOOP then + -- {LOOP, scope-start, scope-end, stmts...} + if length(s) >= 3 and pos >= s[2] and pos <= s[3] then -- in scope? + result &= get_decls(s[2..$], pos, name_space, filter) + end if + + elsif decl = IF then + -- {IF, expr, {scope-start, scope-end, stmts...}, + -- [expr, {scope-start, scope-end, elsif-stmts...},]... + -- [{scope-start, scope-end, else-stmts...}]} + for j = 2 to length(s) by 2 do + x = (j != length(s)) + if length(s[j+x]) >= 2 and pos >= s[j+x][1] and pos <= s[j+x][2] then -- in scope? + result &= get_decls(s[j+x], pos, name_space, filter) + end if + end for + + elsif decl = ENUM_DECL then + -- {ENUM_DECL, "typename"|"", pos, '+'|'-'|'*'|'/', expr, + -- {"name", pos, scope-start, [expr]}...} + if length(s[2]) then -- has typename + result = append(result, {s[2], s[3], DECL_TYPE}) + end if + for j = 6 to length(s) do + if length(s[j]) >= 3 and pos >= s[j][3] then -- in scope? + result = append(result, {s[j][1], s[j][2], DECL_ENUM}) + end if + end for + + end if + end for + return result +end function + +global function get_declarations(sequence ast, integer pos, sequence name_space) + include_ids = {} + include_flags = {} + return get_decls(ast, pos, name_space, choose(length(name_space), FILTER_INCLUDE + FILTER_INCLUDE_AS, FILTER_ALL)) +end function + +global function get_subroutines(sequence ast) + sequence result, s + integer decl, n + + result = {} + for i = 3 to length(ast) do + s = ast[i] + n = prefixed(s) + decl = s[n+1] + + if decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + result = append(result, {s[n+2], s[n+3]}) + end if + end for + return result +end function + +-- returns {["subroutine-type", {["arg1-type", "arg1-name", has-default]...}, ]...} +global function get_subroutine_arguments(sequence ast, sequence word, sequence namespace) + include_ids = {} + include_flags = {} + return get_args(ast, word, namespace, FILTER_ALL) +end function + + + +-- returns {word, namespace, start, end} otherwise {""} +global function word_pos(sequence text, integer pos) + if pos > length(text) then + return {""} + end if + for i = pos+1 to 1 by -1 do + -- find the start of the word + if i = 1 or not isalphanum(text[i-1]) then + -- find the end of the word + while pos < length(text) and isalphanum(text[pos+1]) do + pos += 1 + end while + -- words must start with a letter + if i <= length(text) and isalpha(text[i]) then + -- look for a colon + for j = i to pos do + if text[j] = ':' then + -- found namespace and word + return {text[j+1..pos], text[i..j-1], j+1, pos} + end if + end for + -- found word only + return {text[i..pos], "", i, pos} + end if + exit + end if + end for + return {""} +end function + + +sequence suggested_includes, suggested_word, suggested_namespace, suggested_path + +function walk_include(sequence path_name, sequence dirent) + sequence decls + + path_name &= SLASH & dirent[D_NAME] + if length(path_name) < 2 or (path_name[$] != 'e' and path_name[$] != 'E') or path_name[$-1] != '.' then + -- path_name doesn't end with .e or .E + return 0 + end if + integer cache_idx = cache_entry(canonical_path(path_name, 0, CORRECT)) + if cache_idx > 0 then + check_cache_timestamp(cache_idx) + + include_ids = {} + include_flags = {} + sequence ast = cache[cache_idx] + if length(suggested_namespace) = 0 or is_namespace(ast, suggested_namespace) then + integer filter = FILTER_GLOBAL + FILTER_PUBLIC + FILTER_EXPORT + if length(suggested_namespace) then + filter += FILTER_INCLUDE + end if + decls = get_decls(ast, 0, suggested_namespace, filter) + for i = 1 to length(decls) do + --puts(1, " "&decls[i]&"\n") + if length(decls[i][1]) >= length(suggested_word) and + equal(decls[i][1][1..length(suggested_word)], suggested_word) then + --puts(1, dirent[D_NAME]&" matched!\n") + suggested_includes = append(suggested_includes, + {decls[i][1] & " --include "& path_name[length(suggested_path)+2..$], + {ast[1], decls[i][2]}, decls[i][3]}) + end if + end for + end if + end if + + return 0 -- keep searching all files +end function + +constant walk_include_id = routine_id("walk_include") + +-- returns a list of include files which contain a declaration decl +global function suggest_includes(sequence word, sequence name_space) + sequence paths, path, result + + suggested_includes = {} + suggested_word = word + suggested_namespace = name_space + paths = include_search_paths + for i = 1 to length(paths) do + path = paths[i] + --puts(1, "include_dir="&paths[i]&"\n") + if path[$] = SLASH then + path = path[1..$-1] + end if + if length(path) > 8 and equal(path[$-7..$], SLASH & "include") then + suggested_path = path + if walk_dir(path, walk_include_id, 1) = 0 then + -- success! + end if + end if + end for + result = suggested_includes + suggested_includes = {} + return result +end function + +-- parse argument expressions, returning the last argument position +global function parse_argument_position(sequence source_text) + integer arg, old_idx + sequence e + + text = source_text + idx = 1 + tok_idx = 1 + tok = "" + arg = 1 + for i = 1 to 1000 do + if tok_idx > length(text) then + return arg + end if + if token(")") then + return 0 + end if + if token(",") then + arg += 1 + end if + old_idx = tok_idx + e = expr(1) + --? {e, tok, tok_idx} + --if length(e) = 0 and length(tok) = 0 then + if old_idx = tok_idx then + return arg + end if + end for + printf(1, "stuck parsing argument position for \"%s\"\n", {text}) + ? e + ? tok + return arg +end function + +-- cur_ast: {cache-idx...} +-- cur_scope: {FILTER_* or'd...} +sequence cur_ast, cur_scope, check_result = {} +integer cur_sub = 0 -- whether or not inside subroutine + +-- scan ast for a declaration at pos, returns 0 if not found, otherwise +-- one of FUNC_DECL, PROC_DECL, TYPE_DEC, VAR_DECL, CONST_DECL or FOR +function decl_kind(sequence ast, integer start_idx, integer pos) + for j = start_idx to length(ast) do + sequence s = ast[j] + integer decl = s[1] + + if decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + if pos = s[3] then + return decl + end if + sequence args = s[4] + for i = 1 to length(args) do + if pos = args[i][3] then + return VAR_DECL + end if + end for + decl = decl_kind(s, 7, pos) + if decl then + return decl + end if + + elsif decl = VAR_DECL then + -- {VAR_DECL, "type", pos, {"name", pos, scope-start, [expr]}...} + for i = 4 to length(s) do + if pos = s[i][2] then + return decl + end if + end for + + elsif decl = CONST_DECL then + -- {CONST_DECL, {"name", pos, scope-start, expr}... } + for i = 2 to length(s) do + if pos = s[i][2] then + return decl + end if + end for + + elsif decl = WHILE then + -- {WHILE, expr, scope-start, scope-end, stmts...} + if pos >= s[3] and pos <= s[4] then + decl = decl_kind(s, 5, pos) + if decl then + return decl + end if + end if + + elsif decl = LOOP then + -- {LOOP, scope-start, scope-end, stmts...} + if pos >= s[2] and pos <= s[3] then + decl = decl_kind(s, 4, pos) + if decl then + return decl + end if + end if + + elsif decl = IF then + -- {IF, expr, {scope-start, scope-end, stmts...}, + -- [expr, {scope-start, scope-end, elsif-stmts...},]... + -- [{scope-start, scope-end, else-stmts...}]} + decl = 0 + for i = 2 to length(s) by 2 do + if i = length(s) then + if pos >= s[i][1] and pos <= s[i][2] then + decl = decl_kind(s[i], 3, pos) + end if + else + if pos >= s[i+1][1] and pos <= s[i+1][2] then + decl = decl_kind(s[i+1], 3, pos) + end if + end if + if decl then + return decl + end if + end for + + elsif decl = FOR then + -- {FOR, "name", pos, expr, expr, by, scope-start, scope-end, stmts...} + if pos = s[3] then + return decl + end if + if pos >= s[7] and pos <= s[8] then + decl = decl_kind(s, 9, pos) + if decl then + return decl + end if + end if + + elsif decl = ENUM_DECL then + -- {ENUM_DECL, "typename"|"", pos, '+'|'-'|'*'|'/', expr, + -- {"name", pos, scope-start, [expr]}...} + if pos = s[3] then + return TYPE_DECL + end if + for i = 6 to length(s) do + if pos = s[i][2] then + return CONST_DECL + end if + end for + + elsif decl = SWITCH then + -- {SWITCH, expr, bool-fallthru, label-string, + -- [{case-values...}, {scope-start, scope-end, stmts...},]... } + -- ("case else" will have case-values={} ) + for i = 6 to length(s) by 2 do + if pos >= s[i][1] and pos <= s[i][2] then + decl = decl_kind(s[i], 3, pos) + if decl then + return decl + end if + end if + end for + end if + end for + return 0 +end function + +-- returns the decl kind if pos in scope of loc d, otherwise 0 +function decl_check(sequence ast, object d, integer pos, integer filter) + sequence s + if sequence(d) then + -- variable, constant, enum value or for-variable declaration + s = ast[d[1]] + else + -- function, procedure, type or enum-type declaration + s = ast[d] + end if + -- get scope modifier bits + integer prefix = power(2, find(s[1], {GLOBAL, PUBLIC, EXPORT})) + if and_bits(prefix, filter) = 0 then + return 0 + end if + if prefix > 1 then + s = s[2..$] -- remove scope modifier + end if + if atom(d) then + return s[1] + end if + -- d: { ast-index, pos, scope-start, [scope-end] } + if s[1] = VAR_DECL or s[1] = CONST_DECL or s[1] = ENUM_DECL then + -- top level always in scope + if and_bits(filter, FILTER_LOCAL) and cur_sub = 0 and pos < d[3] and cur_ast[1] = d[1] then + -- euphoria currently doesn't allow top-level forward references in the same file + return 0 + end if + return s[1] + end if + if and_bits(filter, FILTER_LOCAL) and pos >= d[3] and (length(d) < 4 or pos <= d[4]) then + -- in scope + return decl_kind({s}, 1, d[2]) + end if + return 0 +end function + +-- return a sequence of cache_idx +function public_includes(integer cache_idx, sequence result) + sequence ast = cache[cache_idx] + if cache_idx > 0 and not find(cache_idx, result) then + result &= cache_idx + for i = 3 to length(ast) do + sequence s = ast[i] + if s[1] = PUBLIC and s[2] = INCLUDE and s[3] != -1 then + result = public_includes(s[3], result) + end if + end for + end if + return result +end function + +-- returns 1 if the type of declaration "name" at pos is in the list of decls +-- otherwise 0 +function check_name(sequence name, integer pos, sequence decls) + integer ns = find(':', name) + sequence asts = cur_ast + sequence name_space = "" + if ns then + name_space = name[1..ns-1] + name = name[ns+1..$] + asts = {} + + sequence ast = cache[cur_ast[1]] + -- scan for include as + for i = 3 to length(ast) do + sequence s = ast[i] + integer n = prefixed(s) + if s[n+1] = INCLUDE and s[n+2] != -1 and length(s) >= n+4 and equal(s[n+4], name_space) and pos >= s[n+3] then + asts = public_includes(s[n+2], asts) + exit + end if + end for + + if length(asts) = 0 then + if equal(name_space, "eu") then + ns = 0 -- special builtins namespace + else + -- search includes for a matching namespace + for i = 1 to length(cur_ast) do + integer cache_idx = cur_ast[i] + ast = cache[cache_idx] + -- does it have a matching namespace at the top + if and_bits(cur_scope[i], FILTER_PUBLIC) and is_namespace(ast, name_space) then + asts = public_includes(cache_idx, asts) + end if + end for + end if + end if + + end if + for j = 1 to length(asts) do + integer cache_idx = asts[j] + sequence entries = map:get(maps[cache_idx], name, {}) + sequence ast = cache[cache_idx] + integer filter = cur_scope[find(asts[j], cur_ast)] + for i = 1 to length(entries) do + integer decl = decl_check(ast, entries[i], pos, filter) + if find(decl, decls) then + return 1 + end if + end for + end for + if ns = 0 then + sequence sub_decls = {PROC_DECL, FUNC_DECL, TYPE_DECL} + -- check builtins + for i = 1 to length(builtins) do + if equal(builtins[i][2], name) then + return find(sub_decls[find(builtins[i][1], {P, F, T})], decls) + end if + end for + end if + return 0 +end function + + +-- scan for variables only, which may be used for assignment +procedure check_var(sequence name, integer pos) + if not check_name(name, pos, {VAR_DECL}) then + check_result &= {pos, length(name), "variable '"&name&"' has not been declared"} + end if +end procedure + +-- scan for variables, constants, enum values, or for-variables +procedure check_identifier(sequence name, integer pos) + if not check_name(name, pos, {VAR_DECL, CONST_DECL, ENUM_DECL, FOR}) then + check_result &= {pos, length(name), "identifier '"&name&"' has not been declared"} + end if +end procedure + +-- scan for functions or types, used for function call +procedure check_func(sequence name, integer pos) + if not check_name(name, pos, {FUNC_DECL, TYPE_DECL, ENUM_DECL}) then + check_result &= {pos, length(name), "function '"&name&"' has not been declared"} + end if +end procedure + +-- scan for types or typed enum, used for variable declaration +procedure check_type(sequence name, integer pos) + if not check_name(name, pos, {TYPE_DECL, ENUM_DECL}) then + check_result &= {pos, length(name), "type '"&name&"' has not been declared"} + end if +end procedure + +constant proc_list = choose(OE4, {PROC_DECL, FUNC_DECL, TYPE_DECL, ENUM_DECL}, {PROC_DECL}) + +-- scan for procedures (OE4: or functions or types) +procedure check_proc(sequence name, integer pos) + if not check_name(name, pos, proc_list) then + check_result &= {pos, length(name), "procedure '"&name&"' has not been declared"} + end if +end procedure + +procedure check_expr(sequence expr) + integer decl + + if length(expr) = 0 then return end if + + decl = expr[1] + if decl = VARIABLE then + -- {VARIABLE, "name", pos} + check_identifier(expr[2], expr[3]) + + elsif decl = FUNC then + -- {FUNC, "name", pos, [args...]} + check_func(expr[2], expr[3]) + for i = 4 to length(expr) do + check_expr(expr[i]) + end for + + elsif find(decl, {ADD, SUB, MUL, DIV, NEG, NOT, GT, LT, GTE, LTE, EQ, + NEQ, OR, XOR, AND, SUBSCRIPT, CAT, SLICE, SEQ}) then + for i = 2 to length(expr) do + check_expr(expr[i]) + end for + + elsif decl = SYNTAX_ERROR then + -- {SYNTAX_ERROR, pos, len, "message"} + check_result &= expr[2..4] + + end if +end procedure + +procedure attempt_redefine(sequence name, integer pos) + check_result &= {pos, length(name), "attempt to redefine '"&name&"'"} +end procedure + +-- scan "name" at pos for redefinitions +procedure check_redefinition(sequence name, integer pos) + integer cache_idx = cur_ast[1] + sequence ast = cache[cache_idx] + sequence entries = map:get(maps[cache_idx], name, {}) + + for i = 1 to length(entries) do + object d = entries[i] + if atom(d) then + sequence s = ast[d] + -- d: ast-index (func/proc/type/enum-type) + if not cur_sub then + integer n = prefixed(s) + if find(s[n+1], {NAMESPACE, INCLUDE}) then + -- it must be a namespace or include-as + if s[n+1] = NAMESPACE or s[n+3] < pos then + -- check if pos is another include-as with the same name + for j = i+1 to length(entries) do + if atom(entries[j]) then + s = ast[entries[j]] + n = prefixed(s) + if s[n+1] = INCLUDE and n+3 <= length(s) and s[n+3] = pos then + attempt_redefine(name, pos) + return + end if + end if + end for + end if + elsif not find(s[n+1], {FUNC_DECL, PROC_DECL, TYPE_DECL, ENUM_DECL}) then + -- not a subroutine? something is wrong with the parser + printf(1, "%s %d %d\n", {name, s[n+1], d}) + ? entries + elsif n+3 <= length(s) and s[n+3] < pos then + --printf(1, "%s at %d with %d\n", {name, pos, s[n+3]}) + attempt_redefine(name, pos) + return + end if + end if + elsif d[2] < pos then + -- d: {ast-index, pos, scope-start, [scope-end]} + sequence s = ast[d[1]] + integer n = prefixed(s) + integer top_level = 1 + if find(s[n+1], {FUNC_DECL, PROC_DECL, TYPE_DECL}) and s[n+3] != d[2] then + top_level = 0 + end if + if cur_sub != top_level and decl_check(ast, d, pos, FILTER_LOCAL) then + attempt_redefine(name, pos) + return + end if + end if + end for +end procedure + +-- add an include to the cur_ast and calculate it's visibility/scope +procedure check_include(sequence s, integer filter) + integer n = s[1] != INCLUDE + integer cache_idx = s[n+2] + integer cur_idx = find(cache_idx, cur_ast) + + if cache_idx = -1 then + return + end if + + if cur_idx = 0 then + -- create a new entry + check_cache_timestamp(cache_idx) + cur_ast = append(cur_ast, cache_idx) + cur_scope = append(cur_scope, filter) + else + -- existing entry, filter bits already set? + if and_bits(cur_scope[cur_idx], filter) = filter then + return + end if + -- update the filter bits and rescan the ast + cur_scope[cur_idx] = or_bits(cur_scope[cur_idx], filter) + end if + + -- scan the ast for sub-includes + sequence ast = cache[cache_idx] + for i = 3 to length(ast) do + s = ast[i] + if s[1] = INCLUDE then + if and_bits(filter, FILTER_LOCAL) then + check_include(s, FILTER_GLOBAL+FILTER_PUBLIC+FILTER_EXPORT) + else + check_include(s, FILTER_GLOBAL) + end if + elsif s[1] = PUBLIC and s[2] = INCLUDE then + if and_bits(filter, FILTER_LOCAL) then + check_include(s, FILTER_GLOBAL+FILTER_PUBLIC+FILTER_EXPORT) + else + check_include(s, and_bits(filter, FILTER_GLOBAL+FILTER_PUBLIC)) + end if + end if + end for +end procedure + +procedure check_ast(sequence ast, integer start_idx) + + for j = start_idx to length(ast) do + sequence s = ast[j] + integer n = prefixed(s) + integer decl = s[n+1] + + if decl = INCLUDE then + -- {INCLUDE, includes-idx, scope-start, ["namespace"]} + if n+4 <= length(s) then + check_redefinition(s[n+4], s[n+3]) + end if + + elsif decl = FUNC_DECL or decl = PROC_DECL or decl = TYPE_DECL then + -- {FUNC_DECL, "name", pos, + -- {{"arg-type", "arg-name", pos, scope-start, [expr]}...}, + -- scope-start, scope-end, stmts...} + sequence args = s[n+4] + check_redefinition(s[n+2], s[n+3]) + cur_sub = 1 + for i = 1 to length(args) do + check_redefinition(args[i][2], args[i][3]) + if length(args[i]) >= 5 then + check_expr(args[i][5]) + end if + end for + check_ast(s, n+7) + cur_sub = 0 + + elsif decl = PROC then + -- {PROC, "name", pos, [args...]} + check_proc(s[n+2], s[n+3]) + for i = n+4 to length(s) do + check_expr(s[i]) + end for + + elsif decl = VAR_DECL then + -- {VAR_DECL, "type", pos, {"name", pos, scope-start, [expr]}...} + check_type(s[n+2], s[n+3]) + for i = n+4 to length(s) do + check_redefinition(s[i][1], s[i][2]) + if length(s[i]) >= 4 then + check_expr(s[i][4]) + end if + end for + + elsif decl = CONST_DECL then + -- {CONST_DECL, {"name", pos, scope-start, expr}... } + for i = n+2 to length(s) do + check_redefinition(s[i][1], s[i][2]) + check_expr(s[i][4]) + end for + + elsif decl = WHILE then + -- {WHILE, expr, scope-start, scope-end, stmts...} + check_expr(s[n+2]) + check_ast(s, n+5) + + elsif decl = LOOP then + -- {LOOP, scope-start, scope-end, stmts...} + check_ast(s, n+4) + + elsif decl = IF then + -- {IF, expr, {scope-start, scope-end, stmts...}, + -- [expr, {scope-start, scope-end, elsif-stmts...},]... + -- [{scope-start, scope-end, else-stmts...}]} + for i = n+2 to length(s) by 2 do + if i = length(s) then + check_ast(s[i], 3) + else + check_expr(s[i]) + check_ast(s[i+1], 3) + end if + end for + + elsif decl = FOR then + -- {FOR, "name", pos, expr, expr, by, scope-start, scope-end, stmts...} + check_redefinition(s[n+2], s[n+3]) + check_expr(s[n+4]) -- first + check_expr(s[n+5]) -- last + check_expr(s[n+6]) -- by + check_ast(s, n+9) + + elsif decl = ENUM_DECL then + -- {ENUM_DECL, "typename"|"", pos, '+'|'-'|'*'|'/', expr, + -- {"name", pos, scope-start, [expr]}...} + if length(s[n+2]) then + check_redefinition(s[n+2], s[n+3]) + end if + check_expr(s[n+5]) + for i = n+6 to length(s) do + check_redefinition(s[i][1], s[i][2]) + if length(s[i]) >= 4 then + check_expr(s[i][4]) + end if + end for + + elsif decl = SWITCH then + -- {SWITCH, expr, bool-fallthru, label-string, + -- [{case-values...}, {scope-start, scope-end, stmts...},]... } + -- ("case else" will have case-values={} ) + check_expr(s[n+2]) + for i = n+6 to length(s) by 2 do + check_ast(s[i], 3) + end for + + elsif find(decl, {ASSIGN, SUB_ASSIGN, SUB_ADDTO, SUB_SUBTO, SUB_MULTO, + SUB_DIVTO, SUB_CATTO, SLICE_ASSIGN, SLICE_ADDTO, + SLICE_SUBTO, SLICE_MULTO, SLICE_DIVTO, SLICE_CATTO}) then + -- {ASSIGN, "name", pos, expr} + -- {SUB_ASSIGN, "name", pos, index-expr..., expr} + -- {SLICE_ASSIGN, "name", pos, index-expr..., start-expr, end-expr, expr} + check_var(s[n+2], s[n+3]) + for i = n+4 to length(s) do + check_expr(s[i]) + end for + + elsif decl = SEQ_ASSIGN then + -- {SEQ_ASSIGN, ["name1", pos1,]... expr} + for i = n+2 to length(s)-1 by 2 do + check_var(s[i], s[i+1]) + end for + check_expr(s[$]) + + elsif decl = QPRINT or decl = UNTIL then + check_expr(s[2]) + + elsif decl = SYNTAX_ERROR then + -- {SYNTAX_ERROR, pos, len, "message"} + check_result &= s[2..4] + end if + + end for +end procedure + +-- returns sequence of error positions, lengths, and messages: +-- {pos1, len1, msg1, pos2, len2, msg2, ...} +global function parse_errors(sequence source_text, sequence file_name) + integer cache_idx + sequence result, ast + + file_name = canonical_path(file_name, 0, CORRECT) +--atom t0 = time() + ast = parse(source_text, file_name) +--? time() - t0 + cache_idx = cache_entry(file_name) + cur_ast = {} + cur_scope = {} + -- check includes up front, so forward references work + check_include({INCLUDE, cache_idx}, FILTER_ALL) + check_ast(ast, 3) + result = check_result + cur_ast = {} + cur_scope = {} + check_result = {} + return result +end function + diff --git a/tools/WEE/scintilla.e b/tools/WEE/scintilla.e new file mode 100644 index 0000000..eec7c63 --- /dev/null +++ b/tools/WEE/scintilla.e @@ -0,0 +1,2802 @@ +-- scintilla.e + +-- Scintilla Documentation: +-- www.scintilla.org/ScintillaDoc.html + + +include std/dll.e +include std/machine.e +include std/error.e +include std/filesys.e + +sequence dll, send_message +ifdef WINDOWS then + ifdef BITS64 then + dll = "scintilla\\SciLexer64.dll" + elsedef + dll = "scintilla\\SciLexer.dll" + end ifdef + send_message = "Scintilla_DirectFunction" +elsedef + ifdef OSX then + dll = "scintilla/scintillaOSX.dylib" + elsifdef BITS64 then + dll = "scintilla/scintilla64.so" + elsifdef ARM then + dll = "scintilla/scintilla32armhf.so" + elsedef + dll = "scintilla/scintilla32.so" + end ifdef + send_message = "scintilla_send_message" +end ifdef + +constant cmd_line = command_line() + +atom scintilla +scintilla = open_dll(dirname(cmd_line[1]) & SLASH & dll) +if scintilla = 0 and length(cmd_line) >= 2 then + scintilla = open_dll(dirname(cmd_line[2]) & SLASH & dll) +end if +if scintilla = 0 then + scintilla = open_dll(dll) +end if + +constant + scintilla_new_ = define_c_func(scintilla, "scintilla_new", {}, C_POINTER), + scintilla_send_message_ = define_c_func(scintilla, send_message, {C_POINTER, C_LONG, C_LONG, C_LONG}, C_LONG) + +--? {scintilla, scintilla_new_, scintilla_send_message_} + +if scintilla = 0 or scintilla_send_message_ = -1 then + crash("failed to open scintilla DLL "&dll&"\n") +end if + + +global function scintilla_new() + return c_func(scintilla_new_, {}) +end function + +global function scintilla_send_message(atom hwnd, atom m, object w, object l) + if sequence(w) then w = allocate_string(w) end if + if sequence(l) then l = allocate_string(l) end if + return c_func(scintilla_send_message_, {hwnd, m, w, l}) +end function + +global function SSM(atom hwnd, atom m, object w=0, object l=0) + if sequence(w) then w = allocate_string(w) end if + if sequence(l) then l = allocate_string(l) end if + return c_func(scintilla_send_message_, {hwnd, m, w, l}) +end function + +-- To create the list of constants from the scintilla header files: +-- awk '/#define/ { sub(/^0x/,"#",$3); print " "$2" = "$3"," }' Scintilla.h + +-- Scintilla.h +global constant + INVALID_POSITION = -1, + SCI_START = 2000, + SCI_OPTIONAL_START = 3000, + SCI_LEXER_START = 4000, + SCI_ADDTEXT = 2001, + SCI_ADDSTYLEDTEXT = 2002, + SCI_INSERTTEXT = 2003, + SCI_CHANGEINSERTION = 2672, + SCI_CLEARALL = 2004, + SCI_DELETERANGE = 2645, + SCI_CLEARDOCUMENTSTYLE = 2005, + SCI_GETLENGTH = 2006, + SCI_GETCHARAT = 2007, + SCI_GETCURRENTPOS = 2008, + SCI_GETANCHOR = 2009, + SCI_GETSTYLEAT = 2010, + SCI_REDO = 2011, + SCI_SETUNDOCOLLECTION = 2012, + SCI_SELECTALL = 2013, + SCI_SETSAVEPOINT = 2014, + SCI_GETSTYLEDTEXT = 2015, + SCI_CANREDO = 2016, + SCI_MARKERLINEFROMHANDLE = 2017, + SCI_MARKERDELETEHANDLE = 2018, + SCI_GETUNDOCOLLECTION = 2019, + SCWS_INVISIBLE = 0, + SCWS_VISIBLEALWAYS = 1, + SCWS_VISIBLEAFTERINDENT = 2, + SCI_GETVIEWWS = 2020, + SCI_SETVIEWWS = 2021, + SCI_POSITIONFROMPOINT = 2022, + SCI_POSITIONFROMPOINTCLOSE = 2023, + SCI_GOTOLINE = 2024, + SCI_GOTOPOS = 2025, + SCI_SETANCHOR = 2026, + SCI_GETCURLINE = 2027, + SCI_GETENDSTYLED = 2028, + SC_EOL_CRLF = 0, + SC_EOL_CR = 1, + SC_EOL_LF = 2, + SCI_CONVERTEOLS = 2029, + SCI_GETEOLMODE = 2030, + SCI_SETEOLMODE = 2031, + SCI_STARTSTYLING = 2032, + SCI_SETSTYLING = 2033, + SCI_GETBUFFEREDDRAW = 2034, + SCI_SETBUFFEREDDRAW = 2035, + SCI_SETTABWIDTH = 2036, + SCI_GETTABWIDTH = 2121, + SCI_CLEARTABSTOPS = 2675, + SCI_ADDTABSTOP = 2676, + SCI_GETNEXTTABSTOP = 2677, + SC_CP_UTF8 = 65001, + SCI_SETCODEPAGE = 2037, + SC_IME_WINDOWED = 0, + SC_IME_INLINE = 1, + SCI_GETIMEINTERACTION = 2678, + SCI_SETIMEINTERACTION = 2679, + MARKER_MAX = 31, + SC_MARK_CIRCLE = 0, + SC_MARK_ROUNDRECT = 1, + SC_MARK_ARROW = 2, + SC_MARK_SMALLRECT = 3, + SC_MARK_SHORTARROW = 4, + SC_MARK_EMPTY = 5, + SC_MARK_ARROWDOWN = 6, + SC_MARK_MINUS = 7, + SC_MARK_PLUS = 8, + SC_MARK_VLINE = 9, + SC_MARK_LCORNER = 10, + SC_MARK_TCORNER = 11, + SC_MARK_BOXPLUS = 12, + SC_MARK_BOXPLUSCONNECTED = 13, + SC_MARK_BOXMINUS = 14, + SC_MARK_BOXMINUSCONNECTED = 15, + SC_MARK_LCORNERCURVE = 16, + SC_MARK_TCORNERCURVE = 17, + SC_MARK_CIRCLEPLUS = 18, + SC_MARK_CIRCLEPLUSCONNECTED = 19, + SC_MARK_CIRCLEMINUS = 20, + SC_MARK_CIRCLEMINUSCONNECTED = 21, + SC_MARK_BACKGROUND = 22, + SC_MARK_DOTDOTDOT = 23, + SC_MARK_ARROWS = 24, + SC_MARK_PIXMAP = 25, + SC_MARK_FULLRECT = 26, + SC_MARK_LEFTRECT = 27, + SC_MARK_AVAILABLE = 28, + SC_MARK_UNDERLINE = 29, + SC_MARK_RGBAIMAGE = 30, + SC_MARK_BOOKMARK = 31, + SC_MARK_CHARACTER = 10000, + SC_MARKNUM_FOLDEREND = 25, + SC_MARKNUM_FOLDEROPENMID = 26, + SC_MARKNUM_FOLDERMIDTAIL = 27, + SC_MARKNUM_FOLDERTAIL = 28, + SC_MARKNUM_FOLDERSUB = 29, + SC_MARKNUM_FOLDER = 30, + SC_MARKNUM_FOLDEROPEN = 31, + SC_MASK_FOLDERS = #FE000000, + SCI_MARKERDEFINE = 2040, + SCI_MARKERSETFORE = 2041, + SCI_MARKERSETBACK = 2042, + SCI_MARKERSETBACKSELECTED = 2292, + SCI_MARKERENABLEHIGHLIGHT = 2293, + SCI_MARKERADD = 2043, + SCI_MARKERDELETE = 2044, + SCI_MARKERDELETEALL = 2045, + SCI_MARKERGET = 2046, + SCI_MARKERNEXT = 2047, + SCI_MARKERPREVIOUS = 2048, + SCI_MARKERDEFINEPIXMAP = 2049, + SCI_MARKERADDSET = 2466, + SCI_MARKERSETALPHA = 2476, + SC_MAX_MARGIN = 4, + SC_MARGIN_SYMBOL = 0, + SC_MARGIN_NUMBER = 1, + SC_MARGIN_BACK = 2, + SC_MARGIN_FORE = 3, + SC_MARGIN_TEXT = 4, + SC_MARGIN_RTEXT = 5, + SCI_SETMARGINTYPEN = 2240, + SCI_GETMARGINTYPEN = 2241, + SCI_SETMARGINWIDTHN = 2242, + SCI_GETMARGINWIDTHN = 2243, + SCI_SETMARGINMASKN = 2244, + SCI_GETMARGINMASKN = 2245, + SCI_SETMARGINSENSITIVEN = 2246, + SCI_GETMARGINSENSITIVEN = 2247, + SCI_SETMARGINCURSORN = 2248, + SCI_GETMARGINCURSORN = 2249, + STYLE_DEFAULT = 32, + STYLE_LINENUMBER = 33, + STYLE_BRACELIGHT = 34, + STYLE_BRACEBAD = 35, + STYLE_CONTROLCHAR = 36, + STYLE_INDENTGUIDE = 37, + STYLE_CALLTIP = 38, + STYLE_LASTPREDEFINED = 39, + STYLE_MAX = 255, + SC_CHARSET_ANSI = 0, + SC_CHARSET_DEFAULT = 1, + SC_CHARSET_BALTIC = 186, + SC_CHARSET_CHINESEBIG5 = 136, + SC_CHARSET_EASTEUROPE = 238, + SC_CHARSET_GB2312 = 134, + SC_CHARSET_GREEK = 161, + SC_CHARSET_HANGUL = 129, + SC_CHARSET_MAC = 77, + SC_CHARSET_OEM = 255, + SC_CHARSET_RUSSIAN = 204, + SC_CHARSET_CYRILLIC = 1251, + SC_CHARSET_SHIFTJIS = 128, + SC_CHARSET_SYMBOL = 2, + SC_CHARSET_TURKISH = 162, + SC_CHARSET_JOHAB = 130, + SC_CHARSET_HEBREW = 177, + SC_CHARSET_ARABIC = 178, + SC_CHARSET_VIETNAMESE = 163, + SC_CHARSET_THAI = 222, + SC_CHARSET_8859_15 = 1000, + SCI_STYLECLEARALL = 2050, + SCI_STYLESETFORE = 2051, + SCI_STYLESETBACK = 2052, + SCI_STYLESETBOLD = 2053, + SCI_STYLESETITALIC = 2054, + SCI_STYLESETSIZE = 2055, + SCI_STYLESETFONT = 2056, + SCI_STYLESETEOLFILLED = 2057, + SCI_STYLERESETDEFAULT = 2058, + SCI_STYLESETUNDERLINE = 2059, + SC_CASE_MIXED = 0, + SC_CASE_UPPER = 1, + SC_CASE_LOWER = 2, + SCI_STYLEGETFORE = 2481, + SCI_STYLEGETBACK = 2482, + SCI_STYLEGETBOLD = 2483, + SCI_STYLEGETITALIC = 2484, + SCI_STYLEGETSIZE = 2485, + SCI_STYLEGETFONT = 2486, + SCI_STYLEGETEOLFILLED = 2487, + SCI_STYLEGETUNDERLINE = 2488, + SCI_STYLEGETCASE = 2489, + SCI_STYLEGETCHARACTERSET = 2490, + SCI_STYLEGETVISIBLE = 2491, + SCI_STYLEGETCHANGEABLE = 2492, + SCI_STYLEGETHOTSPOT = 2493, + SCI_STYLESETCASE = 2060, + SC_FONT_SIZE_MULTIPLIER = 100, + SCI_STYLESETSIZEFRACTIONAL = 2061, + SCI_STYLEGETSIZEFRACTIONAL = 2062, + SC_WEIGHT_NORMAL = 400, + SC_WEIGHT_SEMIBOLD = 600, + SC_WEIGHT_BOLD = 700, + SCI_STYLESETWEIGHT = 2063, + SCI_STYLEGETWEIGHT = 2064, + SCI_STYLESETCHARACTERSET = 2066, + SCI_STYLESETHOTSPOT = 2409, + SCI_SETSELFORE = 2067, + SCI_SETSELBACK = 2068, + SCI_GETSELALPHA = 2477, + SCI_SETSELALPHA = 2478, + SCI_GETSELEOLFILLED = 2479, + SCI_SETSELEOLFILLED = 2480, + SCI_SETCARETFORE = 2069, + SCI_ASSIGNCMDKEY = 2070, + SCI_CLEARCMDKEY = 2071, + SCI_CLEARALLCMDKEYS = 2072, + SCI_SETSTYLINGEX = 2073, + SCI_STYLESETVISIBLE = 2074, + SCI_GETCARETPERIOD = 2075, + SCI_SETCARETPERIOD = 2076, + SCI_SETWORDCHARS = 2077, + SCI_GETWORDCHARS = 2646, + SCI_BEGINUNDOACTION = 2078, + SCI_ENDUNDOACTION = 2079, + INDIC_PLAIN = 0, + INDIC_SQUIGGLE = 1, + INDIC_TT = 2, + INDIC_DIAGONAL = 3, + INDIC_STRIKE = 4, + INDIC_HIDDEN = 5, + INDIC_BOX = 6, + INDIC_ROUNDBOX = 7, + INDIC_STRAIGHTBOX = 8, + INDIC_DASH = 9, + INDIC_DOTS = 10, + INDIC_SQUIGGLELOW = 11, + INDIC_DOTBOX = 12, + INDIC_SQUIGGLEPIXMAP = 13, + INDIC_COMPOSITIONTHICK = 14, + INDIC_IME = 32, + INDIC_IME_MAX = 35, + INDIC_MAX = 35, + INDIC_CONTAINER = 8, + INDIC0_MASK = #20, + INDIC1_MASK = #40, + INDIC2_MASK = #80, + INDICS_MASK = #E0, + SCI_INDICSETSTYLE = 2080, + SCI_INDICGETSTYLE = 2081, + SCI_INDICSETFORE = 2082, + SCI_INDICGETFORE = 2083, + SCI_INDICSETUNDER = 2510, + SCI_INDICGETUNDER = 2511, + SCI_SETWHITESPACEFORE = 2084, + SCI_SETWHITESPACEBACK = 2085, + SCI_SETWHITESPACESIZE = 2086, + SCI_GETWHITESPACESIZE = 2087, + SCI_SETSTYLEBITS = 2090, + SCI_GETSTYLEBITS = 2091, + SCI_SETLINESTATE = 2092, + SCI_GETLINESTATE = 2093, + SCI_GETMAXLINESTATE = 2094, + SCI_GETCARETLINEVISIBLE = 2095, + SCI_SETCARETLINEVISIBLE = 2096, + SCI_GETCARETLINEBACK = 2097, + SCI_SETCARETLINEBACK = 2098, + SCI_STYLESETCHANGEABLE = 2099, + SCI_AUTOCSHOW = 2100, + SCI_AUTOCCANCEL = 2101, + SCI_AUTOCACTIVE = 2102, + SCI_AUTOCPOSSTART = 2103, + SCI_AUTOCCOMPLETE = 2104, + SCI_AUTOCSTOPS = 2105, + SCI_AUTOCSETSEPARATOR = 2106, + SCI_AUTOCGETSEPARATOR = 2107, + SCI_AUTOCSELECT = 2108, + SCI_AUTOCSETCANCELATSTART = 2110, + SCI_AUTOCGETCANCELATSTART = 2111, + SCI_AUTOCSETFILLUPS = 2112, + SCI_AUTOCSETCHOOSESINGLE = 2113, + SCI_AUTOCGETCHOOSESINGLE = 2114, + SCI_AUTOCSETIGNORECASE = 2115, + SCI_AUTOCGETIGNORECASE = 2116, + SCI_USERLISTSHOW = 2117, + SCI_AUTOCSETAUTOHIDE = 2118, + SCI_AUTOCGETAUTOHIDE = 2119, + SCI_AUTOCSETDROPRESTOFWORD = 2270, + SCI_AUTOCGETDROPRESTOFWORD = 2271, + SCI_REGISTERIMAGE = 2405, + SCI_CLEARREGISTEREDIMAGES = 2408, + SCI_AUTOCGETTYPESEPARATOR = 2285, + SCI_AUTOCSETTYPESEPARATOR = 2286, + SCI_AUTOCSETMAXWIDTH = 2208, + SCI_AUTOCGETMAXWIDTH = 2209, + SCI_AUTOCSETMAXHEIGHT = 2210, + SCI_AUTOCGETMAXHEIGHT = 2211, + SCI_SETINDENT = 2122, + SCI_GETINDENT = 2123, + SCI_SETUSETABS = 2124, + SCI_GETUSETABS = 2125, + SCI_SETLINEINDENTATION = 2126, + SCI_GETLINEINDENTATION = 2127, + SCI_GETLINEINDENTPOSITION = 2128, + SCI_GETCOLUMN = 2129, + SCI_COUNTCHARACTERS = 2633, + SCI_SETHSCROLLBAR = 2130, + SCI_GETHSCROLLBAR = 2131, + SC_IV_NONE = 0, + SC_IV_REAL = 1, + SC_IV_LOOKFORWARD = 2, + SC_IV_LOOKBOTH = 3, + SCI_SETINDENTATIONGUIDES = 2132, + SCI_GETINDENTATIONGUIDES = 2133, + SCI_SETHIGHLIGHTGUIDE = 2134, + SCI_GETHIGHLIGHTGUIDE = 2135, + SCI_GETLINEENDPOSITION = 2136, + SCI_GETCODEPAGE = 2137, + SCI_GETCARETFORE = 2138, + SCI_GETREADONLY = 2140, + SCI_SETCURRENTPOS = 2141, + SCI_SETSELECTIONSTART = 2142, + SCI_GETSELECTIONSTART = 2143, + SCI_SETSELECTIONEND = 2144, + SCI_GETSELECTIONEND = 2145, + SCI_SETEMPTYSELECTION = 2556, + SCI_SETPRINTMAGNIFICATION = 2146, + SCI_GETPRINTMAGNIFICATION = 2147, + SC_PRINT_NORMAL = 0, + SC_PRINT_INVERTLIGHT = 1, + SC_PRINT_BLACKONWHITE = 2, + SC_PRINT_COLOURONWHITE = 3, + SC_PRINT_COLOURONWHITEDEFAULTBG = 4, + SCI_SETPRINTCOLOURMODE = 2148, + SCI_GETPRINTCOLOURMODE = 2149, + SCFIND_WHOLEWORD = #2, + SCFIND_MATCHCASE = #4, + SCFIND_WORDSTART = #00100000, + SCFIND_REGEXP = #00200000, + SCFIND_POSIX = #00400000, + SCFIND_CXX11REGEX = #00800000, + SCI_FINDTEXT = 2150, + SCI_FORMATRANGE = 2151, + SCI_GETFIRSTVISIBLELINE = 2152, + SCI_GETLINE = 2153, + SCI_GETLINECOUNT = 2154, + SCI_SETMARGINLEFT = 2155, + SCI_GETMARGINLEFT = 2156, + SCI_SETMARGINRIGHT = 2157, + SCI_GETMARGINRIGHT = 2158, + SCI_GETMODIFY = 2159, + SCI_SETSEL = 2160, + SCI_GETSELTEXT = 2161, + SCI_GETTEXTRANGE = 2162, + SCI_HIDESELECTION = 2163, + SCI_POINTXFROMPOSITION = 2164, + SCI_POINTYFROMPOSITION = 2165, + SCI_LINEFROMPOSITION = 2166, + SCI_POSITIONFROMLINE = 2167, + SCI_LINESCROLL = 2168, + SCI_SCROLLCARET = 2169, + SCI_SCROLLRANGE = 2569, + SCI_REPLACESEL = 2170, + SCI_SETREADONLY = 2171, + SCI_NULL = 2172, + SCI_CANPASTE = 2173, + SCI_CANUNDO = 2174, + SCI_EMPTYUNDOBUFFER = 2175, + SCI_UNDO = 2176, + SCI_CUT = 2177, + SCI_COPY = 2178, + SCI_PASTE = 2179, + SCI_CLEAR = 2180, + SCI_SETTEXT = 2181, + SCI_GETTEXT = 2182, + SCI_GETTEXTLENGTH = 2183, + SCI_GETDIRECTFUNCTION = 2184, + SCI_GETDIRECTPOINTER = 2185, + SCI_SETOVERTYPE = 2186, + SCI_GETOVERTYPE = 2187, + SCI_SETCARETWIDTH = 2188, + SCI_GETCARETWIDTH = 2189, + SCI_SETTARGETSTART = 2190, + SCI_GETTARGETSTART = 2191, + SCI_SETTARGETEND = 2192, + SCI_GETTARGETEND = 2193, + SCI_REPLACETARGET = 2194, + SCI_REPLACETARGETRE = 2195, + SCI_SEARCHINTARGET = 2197, + SCI_SETSEARCHFLAGS = 2198, + SCI_GETSEARCHFLAGS = 2199, + SCI_CALLTIPSHOW = 2200, + SCI_CALLTIPCANCEL = 2201, + SCI_CALLTIPACTIVE = 2202, + SCI_CALLTIPPOSSTART = 2203, + SCI_CALLTIPSETPOSSTART = 2214, + SCI_CALLTIPSETHLT = 2204, + SCI_CALLTIPSETBACK = 2205, + SCI_CALLTIPSETFORE = 2206, + SCI_CALLTIPSETFOREHLT = 2207, + SCI_CALLTIPUSESTYLE = 2212, + SCI_CALLTIPSETPOSITION = 2213, + SCI_VISIBLEFROMDOCLINE = 2220, + SCI_DOCLINEFROMVISIBLE = 2221, + SCI_WRAPCOUNT = 2235, + SC_FOLDLEVELBASE = #400, + SC_FOLDLEVELWHITEFLAG = #1000, + SC_FOLDLEVELHEADERFLAG = #2000, + SC_FOLDLEVELNUMBERMASK = #0FFF, + SCI_SETFOLDLEVEL = 2222, + SCI_GETFOLDLEVEL = 2223, + SCI_GETLASTCHILD = 2224, + SCI_GETFOLDPARENT = 2225, + SCI_SHOWLINES = 2226, + SCI_HIDELINES = 2227, + SCI_GETLINEVISIBLE = 2228, + SCI_GETALLLINESVISIBLE = 2236, + SCI_SETFOLDEXPANDED = 2229, + SCI_GETFOLDEXPANDED = 2230, + SCI_TOGGLEFOLD = 2231, + SC_FOLDACTION_CONTRACT = 0, + SC_FOLDACTION_EXPAND = 1, + SC_FOLDACTION_TOGGLE = 2, + SCI_FOLDLINE = 2237, + SCI_FOLDCHILDREN = 2238, + SCI_EXPANDCHILDREN = 2239, + SCI_FOLDALL = 2662, + SCI_ENSUREVISIBLE = 2232, + SC_AUTOMATICFOLD_SHOW = #0001, + SC_AUTOMATICFOLD_CLICK = #0002, + SC_AUTOMATICFOLD_CHANGE = #0004, + SCI_SETAUTOMATICFOLD = 2663, + SCI_GETAUTOMATICFOLD = 2664, + SC_FOLDFLAG_LINEBEFORE_EXPANDED = #0002, + SC_FOLDFLAG_LINEBEFORE_CONTRACTED = #0004, + SC_FOLDFLAG_LINEAFTER_EXPANDED = #0008, + SC_FOLDFLAG_LINEAFTER_CONTRACTED = #0010, + SC_FOLDFLAG_LEVELNUMBERS = #0040, + SC_FOLDFLAG_LINESTATE = #0080, + SCI_SETFOLDFLAGS = 2233, + SCI_ENSUREVISIBLEENFORCEPOLICY = 2234, + SCI_SETTABINDENTS = 2260, + SCI_GETTABINDENTS = 2261, + SCI_SETBACKSPACEUNINDENTS = 2262, + SCI_GETBACKSPACEUNINDENTS = 2263, + SC_TIME_FOREVER = 10000000, + SCI_SETMOUSEDWELLTIME = 2264, + SCI_GETMOUSEDWELLTIME = 2265, + SCI_WORDSTARTPOSITION = 2266, + SCI_WORDENDPOSITION = 2267, + SC_WRAP_NONE = 0, + SC_WRAP_WORD = 1, + SC_WRAP_CHAR = 2, + SC_WRAP_WHITESPACE = 3, + SCI_SETWRAPMODE = 2268, + SCI_GETWRAPMODE = 2269, + SC_WRAPVISUALFLAG_NONE = #0000, + SC_WRAPVISUALFLAG_END = #0001, + SC_WRAPVISUALFLAG_START = #0002, + SC_WRAPVISUALFLAG_MARGIN = #0004, + SCI_SETWRAPVISUALFLAGS = 2460, + SCI_GETWRAPVISUALFLAGS = 2461, + SC_WRAPVISUALFLAGLOC_DEFAULT = #0000, + SC_WRAPVISUALFLAGLOC_END_BY_TEXT = #0001, + SC_WRAPVISUALFLAGLOC_START_BY_TEXT = #0002, + SCI_SETWRAPVISUALFLAGSLOCATION = 2462, + SCI_GETWRAPVISUALFLAGSLOCATION = 2463, + SCI_SETWRAPSTARTINDENT = 2464, + SCI_GETWRAPSTARTINDENT = 2465, + SC_WRAPINDENT_FIXED = 0, + SC_WRAPINDENT_SAME = 1, + SC_WRAPINDENT_INDENT = 2, + SCI_SETWRAPINDENTMODE = 2472, + SCI_GETWRAPINDENTMODE = 2473, + SC_CACHE_NONE = 0, + SC_CACHE_CARET = 1, + SC_CACHE_PAGE = 2, + SC_CACHE_DOCUMENT = 3, + SCI_SETLAYOUTCACHE = 2272, + SCI_GETLAYOUTCACHE = 2273, + SCI_SETSCROLLWIDTH = 2274, + SCI_GETSCROLLWIDTH = 2275, + SCI_SETSCROLLWIDTHTRACKING = 2516, + SCI_GETSCROLLWIDTHTRACKING = 2517, + SCI_TEXTWIDTH = 2276, + SCI_SETENDATLASTLINE = 2277, + SCI_GETENDATLASTLINE = 2278, + SCI_TEXTHEIGHT = 2279, + SCI_SETVSCROLLBAR = 2280, + SCI_GETVSCROLLBAR = 2281, + SCI_APPENDTEXT = 2282, + SCI_GETTWOPHASEDRAW = 2283, + SCI_SETTWOPHASEDRAW = 2284, + SC_PHASES_ONE = 0, + SC_PHASES_TWO = 1, + SC_PHASES_MULTIPLE = 2, + SCI_GETPHASESDRAW = 2673, + SCI_SETPHASESDRAW = 2674, + SC_EFF_QUALITY_MASK = #F, + SC_EFF_QUALITY_DEFAULT = 0, + SC_EFF_QUALITY_NON_ANTIALIASED = 1, + SC_EFF_QUALITY_ANTIALIASED = 2, + SC_EFF_QUALITY_LCD_OPTIMIZED = 3, + SCI_SETFONTQUALITY = 2611, + SCI_GETFONTQUALITY = 2612, + SCI_SETFIRSTVISIBLELINE = 2613, + SC_MULTIPASTE_ONCE = 0, + SC_MULTIPASTE_EACH = 1, + SCI_SETMULTIPASTE = 2614, + SCI_GETMULTIPASTE = 2615, + SCI_GETTAG = 2616, + SCI_TARGETFROMSELECTION = 2287, + SCI_LINESJOIN = 2288, + SCI_LINESSPLIT = 2289, + SCI_SETFOLDMARGINCOLOUR = 2290, + SCI_SETFOLDMARGINHICOLOUR = 2291, + SCI_LINEDOWN = 2300, + SCI_LINEDOWNEXTEND = 2301, + SCI_LINEUP = 2302, + SCI_LINEUPEXTEND = 2303, + SCI_CHARLEFT = 2304, + SCI_CHARLEFTEXTEND = 2305, + SCI_CHARRIGHT = 2306, + SCI_CHARRIGHTEXTEND = 2307, + SCI_WORDLEFT = 2308, + SCI_WORDLEFTEXTEND = 2309, + SCI_WORDRIGHT = 2310, + SCI_WORDRIGHTEXTEND = 2311, + SCI_HOME = 2312, + SCI_HOMEEXTEND = 2313, + SCI_LINEEND = 2314, + SCI_LINEENDEXTEND = 2315, + SCI_DOCUMENTSTART = 2316, + SCI_DOCUMENTSTARTEXTEND = 2317, + SCI_DOCUMENTEND = 2318, + SCI_DOCUMENTENDEXTEND = 2319, + SCI_PAGEUP = 2320, + SCI_PAGEUPEXTEND = 2321, + SCI_PAGEDOWN = 2322, + SCI_PAGEDOWNEXTEND = 2323, + SCI_EDITTOGGLEOVERTYPE = 2324, + SCI_CANCEL = 2325, + SCI_DELETEBACK = 2326, + SCI_TAB = 2327, + SCI_BACKTAB = 2328, + SCI_NEWLINE = 2329, + SCI_FORMFEED = 2330, + SCI_VCHOME = 2331, + SCI_VCHOMEEXTEND = 2332, + SCI_ZOOMIN = 2333, + SCI_ZOOMOUT = 2334, + SCI_DELWORDLEFT = 2335, + SCI_DELWORDRIGHT = 2336, + SCI_DELWORDRIGHTEND = 2518, + SCI_LINECUT = 2337, + SCI_LINEDELETE = 2338, + SCI_LINETRANSPOSE = 2339, + SCI_LINEDUPLICATE = 2404, + SCI_LOWERCASE = 2340, + SCI_UPPERCASE = 2341, + SCI_LINESCROLLDOWN = 2342, + SCI_LINESCROLLUP = 2343, + SCI_DELETEBACKNOTLINE = 2344, + SCI_HOMEDISPLAY = 2345, + SCI_HOMEDISPLAYEXTEND = 2346, + SCI_LINEENDDISPLAY = 2347, + SCI_LINEENDDISPLAYEXTEND = 2348, + SCI_HOMEWRAP = 2349, + SCI_HOMEWRAPEXTEND = 2450, + SCI_LINEENDWRAP = 2451, + SCI_LINEENDWRAPEXTEND = 2452, + SCI_VCHOMEWRAP = 2453, + SCI_VCHOMEWRAPEXTEND = 2454, + SCI_LINECOPY = 2455, + SCI_MOVECARETINSIDEVIEW = 2401, + SCI_LINELENGTH = 2350, + SCI_BRACEHIGHLIGHT = 2351, + SCI_BRACEHIGHLIGHTINDICATOR = 2498, + SCI_BRACEBADLIGHT = 2352, + SCI_BRACEBADLIGHTINDICATOR = 2499, + SCI_BRACEMATCH = 2353, + SCI_GETVIEWEOL = 2355, + SCI_SETVIEWEOL = 2356, + SCI_GETDOCPOINTER = 2357, + SCI_SETDOCPOINTER = 2358, + SCI_SETMODEVENTMASK = 2359, + EDGE_NONE = 0, + EDGE_LINE = 1, + EDGE_BACKGROUND = 2, + SCI_GETEDGECOLUMN = 2360, + SCI_SETEDGECOLUMN = 2361, + SCI_GETEDGEMODE = 2362, + SCI_SETEDGEMODE = 2363, + SCI_GETEDGECOLOUR = 2364, + SCI_SETEDGECOLOUR = 2365, + SCI_SEARCHANCHOR = 2366, + SCI_SEARCHNEXT = 2367, + SCI_SEARCHPREV = 2368, + SCI_LINESONSCREEN = 2370, + SCI_USEPOPUP = 2371, + SCI_SELECTIONISRECTANGLE = 2372, + SCI_SETZOOM = 2373, + SCI_GETZOOM = 2374, + SCI_CREATEDOCUMENT = 2375, + SCI_ADDREFDOCUMENT = 2376, + SCI_RELEASEDOCUMENT = 2377, + SCI_GETMODEVENTMASK = 2378, + SCI_SETFOCUS = 2380, + SCI_GETFOCUS = 2381, + SC_STATUS_OK = 0, + SC_STATUS_FAILURE = 1, + SC_STATUS_BADALLOC = 2, + SC_STATUS_WARN_START = 1000, + SC_STATUS_WARN_REGEX = 1001, + SCI_SETSTATUS = 2382, + SCI_GETSTATUS = 2383, + SCI_SETMOUSEDOWNCAPTURES = 2384, + SCI_GETMOUSEDOWNCAPTURES = 2385, + SC_CURSORNORMAL = -1, + SC_CURSORARROW = 2, + SC_CURSORWAIT = 4, + SC_CURSORREVERSEARROW = 7, + SCI_SETCURSOR = 2386, + SCI_GETCURSOR = 2387, + SCI_SETCONTROLCHARSYMBOL = 2388, + SCI_GETCONTROLCHARSYMBOL = 2389, + SCI_WORDPARTLEFT = 2390, + SCI_WORDPARTLEFTEXTEND = 2391, + SCI_WORDPARTRIGHT = 2392, + SCI_WORDPARTRIGHTEXTEND = 2393, + VISIBLE_SLOP = #01, + VISIBLE_STRICT = #04, + SCI_SETVISIBLEPOLICY = 2394, + SCI_DELLINELEFT = 2395, + SCI_DELLINERIGHT = 2396, + SCI_SETXOFFSET = 2397, + SCI_GETXOFFSET = 2398, + SCI_CHOOSECARETX = 2399, + SCI_GRABFOCUS = 2400, + CARET_SLOP = #01, + CARET_STRICT = #04, + CARET_JUMPS = #10, + CARET_EVEN = #08, + SCI_SETXCARETPOLICY = 2402, + SCI_SETYCARETPOLICY = 2403, + SCI_SETPRINTWRAPMODE = 2406, + SCI_GETPRINTWRAPMODE = 2407, + SCI_SETHOTSPOTACTIVEFORE = 2410, + SCI_GETHOTSPOTACTIVEFORE = 2494, + SCI_SETHOTSPOTACTIVEBACK = 2411, + SCI_GETHOTSPOTACTIVEBACK = 2495, + SCI_SETHOTSPOTACTIVEUNDERLINE = 2412, + SCI_GETHOTSPOTACTIVEUNDERLINE = 2496, + SCI_SETHOTSPOTSINGLELINE = 2421, + SCI_GETHOTSPOTSINGLELINE = 2497, + SCI_PARADOWN = 2413, + SCI_PARADOWNEXTEND = 2414, + SCI_PARAUP = 2415, + SCI_PARAUPEXTEND = 2416, + SCI_POSITIONBEFORE = 2417, + SCI_POSITIONAFTER = 2418, + SCI_POSITIONRELATIVE = 2670, + SCI_COPYRANGE = 2419, + SCI_COPYTEXT = 2420, + SC_SEL_STREAM = 0, + SC_SEL_RECTANGLE = 1, + SC_SEL_LINES = 2, + SC_SEL_THIN = 3, + SCI_SETSELECTIONMODE = 2422, + SCI_GETSELECTIONMODE = 2423, + SCI_GETLINESELSTARTPOSITION = 2424, + SCI_GETLINESELENDPOSITION = 2425, + SCI_LINEDOWNRECTEXTEND = 2426, + SCI_LINEUPRECTEXTEND = 2427, + SCI_CHARLEFTRECTEXTEND = 2428, + SCI_CHARRIGHTRECTEXTEND = 2429, + SCI_HOMERECTEXTEND = 2430, + SCI_VCHOMERECTEXTEND = 2431, + SCI_LINEENDRECTEXTEND = 2432, + SCI_PAGEUPRECTEXTEND = 2433, + SCI_PAGEDOWNRECTEXTEND = 2434, + SCI_STUTTEREDPAGEUP = 2435, + SCI_STUTTEREDPAGEUPEXTEND = 2436, + SCI_STUTTEREDPAGEDOWN = 2437, + SCI_STUTTEREDPAGEDOWNEXTEND = 2438, + SCI_WORDLEFTEND = 2439, + SCI_WORDLEFTENDEXTEND = 2440, + SCI_WORDRIGHTEND = 2441, + SCI_WORDRIGHTENDEXTEND = 2442, + SCI_SETWHITESPACECHARS = 2443, + SCI_GETWHITESPACECHARS = 2647, + SCI_SETPUNCTUATIONCHARS = 2648, + SCI_GETPUNCTUATIONCHARS = 2649, + SCI_SETCHARSDEFAULT = 2444, + SCI_AUTOCGETCURRENT = 2445, + SCI_AUTOCGETCURRENTTEXT = 2610, + SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE = 0, + SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE = 1, + SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR = 2634, + SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR = 2635, + SC_MULTIAUTOC_ONCE = 0, + SC_MULTIAUTOC_EACH = 1, + SCI_AUTOCSETMULTI = 2636, + SCI_AUTOCGETMULTI = 2637, + SC_ORDER_PRESORTED = 0, + SC_ORDER_PERFORMSORT = 1, + SC_ORDER_CUSTOM = 2, + SCI_AUTOCSETORDER = 2660, + SCI_AUTOCGETORDER = 2661, + SCI_ALLOCATE = 2446, + SCI_TARGETASUTF8 = 2447, + SCI_SETLENGTHFORENCODE = 2448, + SCI_ENCODEDFROMUTF8 = 2449, + SCI_FINDCOLUMN = 2456, + SCI_GETCARETSTICKY = 2457, + SCI_SETCARETSTICKY = 2458, + SC_CARETSTICKY_OFF = 0, + SC_CARETSTICKY_ON = 1, + SC_CARETSTICKY_WHITESPACE = 2, + SCI_TOGGLECARETSTICKY = 2459, + SCI_SETPASTECONVERTENDINGS = 2467, + SCI_GETPASTECONVERTENDINGS = 2468, + SCI_SELECTIONDUPLICATE = 2469, + SC_ALPHA_TRANSPARENT = 0, + SC_ALPHA_OPAQUE = 255, + SC_ALPHA_NOALPHA = 256, + SCI_SETCARETLINEBACKALPHA = 2470, + SCI_GETCARETLINEBACKALPHA = 2471, + CARETSTYLE_INVISIBLE = 0, + CARETSTYLE_LINE = 1, + CARETSTYLE_BLOCK = 2, + SCI_SETCARETSTYLE = 2512, + SCI_GETCARETSTYLE = 2513, + SCI_SETINDICATORCURRENT = 2500, + SCI_GETINDICATORCURRENT = 2501, + SCI_SETINDICATORVALUE = 2502, + SCI_GETINDICATORVALUE = 2503, + SCI_INDICATORFILLRANGE = 2504, + SCI_INDICATORCLEARRANGE = 2505, + SCI_INDICATORALLONFOR = 2506, + SCI_INDICATORVALUEAT = 2507, + SCI_INDICATORSTART = 2508, + SCI_INDICATOREND = 2509, + SCI_SETPOSITIONCACHE = 2514, + SCI_GETPOSITIONCACHE = 2515, + SCI_COPYALLOWLINE = 2519, + SCI_GETCHARACTERPOINTER = 2520, + SCI_GETRANGEPOINTER = 2643, + SCI_GETGAPPOSITION = 2644, + SCI_SETKEYSUNICODE = 2521, + SCI_GETKEYSUNICODE = 2522, + SCI_INDICSETALPHA = 2523, + SCI_INDICGETALPHA = 2524, + SCI_INDICSETOUTLINEALPHA = 2558, + SCI_INDICGETOUTLINEALPHA = 2559, + SCI_SETEXTRAASCENT = 2525, + SCI_GETEXTRAASCENT = 2526, + SCI_SETEXTRADESCENT = 2527, + SCI_GETEXTRADESCENT = 2528, + SCI_MARKERSYMBOLDEFINED = 2529, + SCI_MARGINSETTEXT = 2530, + SCI_MARGINGETTEXT = 2531, + SCI_MARGINSETSTYLE = 2532, + SCI_MARGINGETSTYLE = 2533, + SCI_MARGINSETSTYLES = 2534, + SCI_MARGINGETSTYLES = 2535, + SCI_MARGINTEXTCLEARALL = 2536, + SCI_MARGINSETSTYLEOFFSET = 2537, + SCI_MARGINGETSTYLEOFFSET = 2538, + SC_MARGINOPTION_NONE = 0, + SC_MARGINOPTION_SUBLINESELECT = 1, + SCI_SETMARGINOPTIONS = 2539, + SCI_GETMARGINOPTIONS = 2557, + SCI_ANNOTATIONSETTEXT = 2540, + SCI_ANNOTATIONGETTEXT = 2541, + SCI_ANNOTATIONSETSTYLE = 2542, + SCI_ANNOTATIONGETSTYLE = 2543, + SCI_ANNOTATIONSETSTYLES = 2544, + SCI_ANNOTATIONGETSTYLES = 2545, + SCI_ANNOTATIONGETLINES = 2546, + SCI_ANNOTATIONCLEARALL = 2547, + ANNOTATION_HIDDEN = 0, + ANNOTATION_STANDARD = 1, + ANNOTATION_BOXED = 2, + ANNOTATION_INDENTED = 3, + SCI_ANNOTATIONSETVISIBLE = 2548, + SCI_ANNOTATIONGETVISIBLE = 2549, + SCI_ANNOTATIONSETSTYLEOFFSET = 2550, + SCI_ANNOTATIONGETSTYLEOFFSET = 2551, + SCI_RELEASEALLEXTENDEDSTYLES = 2552, + SCI_ALLOCATEEXTENDEDSTYLES = 2553, + UNDO_MAY_COALESCE = 1, + SCI_ADDUNDOACTION = 2560, + SCI_CHARPOSITIONFROMPOINT = 2561, + SCI_CHARPOSITIONFROMPOINTCLOSE = 2562, + SCI_SETMOUSESELECTIONRECTANGULARSWITCH = 2668, + SCI_GETMOUSESELECTIONRECTANGULARSWITCH = 2669, + SCI_SETMULTIPLESELECTION = 2563, + SCI_GETMULTIPLESELECTION = 2564, + SCI_SETADDITIONALSELECTIONTYPING = 2565, + SCI_GETADDITIONALSELECTIONTYPING = 2566, + SCI_SETADDITIONALCARETSBLINK = 2567, + SCI_GETADDITIONALCARETSBLINK = 2568, + SCI_SETADDITIONALCARETSVISIBLE = 2608, + SCI_GETADDITIONALCARETSVISIBLE = 2609, + SCI_GETSELECTIONS = 2570, + SCI_GETSELECTIONEMPTY = 2650, + SCI_CLEARSELECTIONS = 2571, + SCI_SETSELECTION = 2572, + SCI_ADDSELECTION = 2573, + SCI_DROPSELECTIONN = 2671, + SCI_SETMAINSELECTION = 2574, + SCI_GETMAINSELECTION = 2575, + SCI_SETSELECTIONNCARET = 2576, + SCI_GETSELECTIONNCARET = 2577, + SCI_SETSELECTIONNANCHOR = 2578, + SCI_GETSELECTIONNANCHOR = 2579, + SCI_SETSELECTIONNCARETVIRTUALSPACE = 2580, + SCI_GETSELECTIONNCARETVIRTUALSPACE = 2581, + SCI_SETSELECTIONNANCHORVIRTUALSPACE = 2582, + SCI_GETSELECTIONNANCHORVIRTUALSPACE = 2583, + SCI_SETSELECTIONNSTART = 2584, + SCI_GETSELECTIONNSTART = 2585, + SCI_SETSELECTIONNEND = 2586, + SCI_GETSELECTIONNEND = 2587, + SCI_SETRECTANGULARSELECTIONCARET = 2588, + SCI_GETRECTANGULARSELECTIONCARET = 2589, + SCI_SETRECTANGULARSELECTIONANCHOR = 2590, + SCI_GETRECTANGULARSELECTIONANCHOR = 2591, + SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2592, + SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE = 2593, + SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2594, + SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE = 2595, + SCVS_NONE = 0, + SCVS_RECTANGULARSELECTION = 1, + SCVS_USERACCESSIBLE = 2, + SCI_SETVIRTUALSPACEOPTIONS = 2596, + SCI_GETVIRTUALSPACEOPTIONS = 2597, + SCI_SETRECTANGULARSELECTIONMODIFIER = 2598, + SCI_GETRECTANGULARSELECTIONMODIFIER = 2599, + SCI_SETADDITIONALSELFORE = 2600, + SCI_SETADDITIONALSELBACK = 2601, + SCI_SETADDITIONALSELALPHA = 2602, + SCI_GETADDITIONALSELALPHA = 2603, + SCI_SETADDITIONALCARETFORE = 2604, + SCI_GETADDITIONALCARETFORE = 2605, + SCI_ROTATESELECTION = 2606, + SCI_SWAPMAINANCHORCARET = 2607, + SCI_CHANGELEXERSTATE = 2617, + SCI_CONTRACTEDFOLDNEXT = 2618, + SCI_VERTICALCENTRECARET = 2619, + SCI_MOVESELECTEDLINESUP = 2620, + SCI_MOVESELECTEDLINESDOWN = 2621, + SCI_SETIDENTIFIER = 2622, + SCI_GETIDENTIFIER = 2623, + SCI_RGBAIMAGESETWIDTH = 2624, + SCI_RGBAIMAGESETHEIGHT = 2625, + SCI_RGBAIMAGESETSCALE = 2651, + SCI_MARKERDEFINERGBAIMAGE = 2626, + SCI_REGISTERRGBAIMAGE = 2627, + SCI_SCROLLTOSTART = 2628, + SCI_SCROLLTOEND = 2629, + SC_TECHNOLOGY_DEFAULT = 0, + SC_TECHNOLOGY_DIRECTWRITE = 1, + SC_TECHNOLOGY_DIRECTWRITERETAIN = 2, + SC_TECHNOLOGY_DIRECTWRITEDC = 3, + SCI_SETTECHNOLOGY = 2630, + SCI_GETTECHNOLOGY = 2631, + SCI_CREATELOADER = 2632, + SCI_FINDINDICATORSHOW = 2640, + SCI_FINDINDICATORFLASH = 2641, + SCI_FINDINDICATORHIDE = 2642, + SCI_VCHOMEDISPLAY = 2652, + SCI_VCHOMEDISPLAYEXTEND = 2653, + SCI_GETCARETLINEVISIBLEALWAYS = 2654, + SCI_SETCARETLINEVISIBLEALWAYS = 2655, + SC_LINE_END_TYPE_DEFAULT = 0, + SC_LINE_END_TYPE_UNICODE = 1, + SCI_SETLINEENDTYPESALLOWED = 2656, + SCI_GETLINEENDTYPESALLOWED = 2657, + SCI_GETLINEENDTYPESACTIVE = 2658, + SCI_SETREPRESENTATION = 2665, + SCI_GETREPRESENTATION = 2666, + SCI_CLEARREPRESENTATION = 2667, + SCI_STARTRECORD = 3001, + SCI_STOPRECORD = 3002, + SCI_SETLEXER = 4001, + SCI_GETLEXER = 4002, + SCI_COLOURISE = 4003, + SCI_SETPROPERTY = 4004, + KEYWORDSET_MAX = 8, + SCI_SETKEYWORDS = 4005, + SCI_SETLEXERLANGUAGE = 4006, + SCI_LOADLEXERLIBRARY = 4007, + SCI_GETPROPERTY = 4008, + SCI_GETPROPERTYEXPANDED = 4009, + SCI_GETPROPERTYINT = 4010, + SCI_GETSTYLEBITSNEEDED = 4011, + SCI_GETLEXERLANGUAGE = 4012, + SCI_PRIVATELEXERCALL = 4013, + SCI_PROPERTYNAMES = 4014, + SC_TYPE_BOOLEAN = 0, + SC_TYPE_INTEGER = 1, + SC_TYPE_STRING = 2, + SCI_PROPERTYTYPE = 4015, + SCI_DESCRIBEPROPERTY = 4016, + SCI_DESCRIBEKEYWORDSETS = 4017, + SCI_GETLINEENDTYPESSUPPORTED = 4018, + SCI_ALLOCATESUBSTYLES = 4020, + SCI_GETSUBSTYLESSTART = 4021, + SCI_GETSUBSTYLESLENGTH = 4022, + SCI_GETSTYLEFROMSUBSTYLE = 4027, + SCI_GETPRIMARYSTYLEFROMSTYLE = 4028, + SCI_FREESUBSTYLES = 4023, + SCI_SETIDENTIFIERS = 4024, + SCI_DISTANCETOSECONDARYSTYLES = 4025, + SCI_GETSUBSTYLEBASES = 4026, + SC_MOD_INSERTTEXT = #1, + SC_MOD_DELETETEXT = #2, + SC_MOD_CHANGESTYLE = #4, + SC_MOD_CHANGEFOLD = #8, + SC_PERFORMED_USER = #10, + SC_PERFORMED_UNDO = #20, + SC_PERFORMED_REDO = #40, + SC_MULTISTEPUNDOREDO = #80, + SC_LASTSTEPINUNDOREDO = #100, + SC_MOD_CHANGEMARKER = #200, + SC_MOD_BEFOREINSERT = #400, + SC_MOD_BEFOREDELETE = #800, + SC_MULTILINEUNDOREDO = #1000, + SC_STARTACTION = #2000, + SC_MOD_CHANGEINDICATOR = #4000, + SC_MOD_CHANGELINESTATE = #8000, + SC_MOD_CHANGEMARGIN = #10000, + SC_MOD_CHANGEANNOTATION = #20000, + SC_MOD_CONTAINER = #40000, + SC_MOD_LEXERSTATE = #80000, + SC_MOD_INSERTCHECK = #100000, + SC_MOD_CHANGETABSTOPS = #200000, + SC_MODEVENTMASKALL = #3FFFFF, + SC_UPDATE_CONTENT = #1, + SC_UPDATE_SELECTION = #2, + SC_UPDATE_V_SCROLL = #4, + SC_UPDATE_H_SCROLL = #8, + SCEN_CHANGE = 768, + SCEN_SETFOCUS = 512, + SCEN_KILLFOCUS = 256, + SCK_DOWN = 300, + SCK_UP = 301, + SCK_LEFT = 302, + SCK_RIGHT = 303, + SCK_HOME = 304, + SCK_END = 305, + SCK_PRIOR = 306, + SCK_NEXT = 307, + SCK_DELETE = 308, + SCK_INSERT = 309, + SCK_ESCAPE = 7, + SCK_BACK = 8, + SCK_TAB = 9, + SCK_RETURN = 13, + SCK_ADD = 310, + SCK_SUBTRACT = 311, + SCK_DIVIDE = 312, + SCK_WIN = 313, + SCK_RWIN = 314, + SCK_MENU = 315, + SCMOD_NORM = 0, + SCMOD_SHIFT = 1, + SCMOD_CTRL = 2, + SCMOD_ALT = 4, + SCMOD_SUPER = 8, + SCMOD_META = 16, + SCN_STYLENEEDED = 2000, + SCN_CHARADDED = 2001, + SCN_SAVEPOINTREACHED = 2002, + SCN_SAVEPOINTLEFT = 2003, + SCN_MODIFYATTEMPTRO = 2004, + SCN_KEY = 2005, + SCN_DOUBLECLICK = 2006, + SCN_UPDATEUI = 2007, + SCN_MODIFIED = 2008, + SCN_MACRORECORD = 2009, + SCN_MARGINCLICK = 2010, + SCN_NEEDSHOWN = 2011, + SCN_PAINTED = 2013, + SCN_USERLISTSELECTION = 2014, + SCN_URIDROPPED = 2015, + SCN_DWELLSTART = 2016, + SCN_DWELLEND = 2017, + SCN_ZOOM = 2018, + SCN_HOTSPOTCLICK = 2019, + SCN_HOTSPOTDOUBLECLICK = 2020, + SCN_CALLTIPCLICK = 2021, + SCN_AUTOCSELECTION = 2022, + SCN_INDICATORCLICK = 2023, + SCN_INDICATORRELEASE = 2024, + SCN_AUTOCCANCELLED = 2025, + SCN_AUTOCCHARDELETED = 2026, + SCN_HOTSPOTRELEASECLICK = 2027, + SCN_FOCUSIN = 2028, + SCN_FOCUSOUT = 2029, + SC_CP_DBCS = 1, + SCI_SETUSEPALETTE = 2039, + SCI_GETUSEPALETTE = 2139 + +-- SciLexer.h +global constant + SCLEX_CONTAINER = 0, + SCLEX_NULL = 1, + SCLEX_PYTHON = 2, + SCLEX_CPP = 3, + SCLEX_HTML = 4, + SCLEX_XML = 5, + SCLEX_PERL = 6, + SCLEX_SQL = 7, + SCLEX_VB = 8, + SCLEX_PROPERTIES = 9, + SCLEX_ERRORLIST = 10, + SCLEX_MAKEFILE = 11, + SCLEX_BATCH = 12, + SCLEX_XCODE = 13, + SCLEX_LATEX = 14, + SCLEX_LUA = 15, + SCLEX_DIFF = 16, + SCLEX_CONF = 17, + SCLEX_PASCAL = 18, + SCLEX_AVE = 19, + SCLEX_ADA = 20, + SCLEX_LISP = 21, + SCLEX_RUBY = 22, + SCLEX_EIFFEL = 23, + SCLEX_EIFFELKW = 24, + SCLEX_TCL = 25, + SCLEX_NNCRONTAB = 26, + SCLEX_BULLANT = 27, + SCLEX_VBSCRIPT = 28, + SCLEX_BAAN = 31, + SCLEX_MATLAB = 32, + SCLEX_SCRIPTOL = 33, + SCLEX_ASM = 34, + SCLEX_CPPNOCASE = 35, + SCLEX_FORTRAN = 36, + SCLEX_F77 = 37, + SCLEX_CSS = 38, + SCLEX_POV = 39, + SCLEX_LOUT = 40, + SCLEX_ESCRIPT = 41, + SCLEX_PS = 42, + SCLEX_NSIS = 43, + SCLEX_MMIXAL = 44, + SCLEX_CLW = 45, + SCLEX_CLWNOCASE = 46, + SCLEX_LOT = 47, + SCLEX_YAML = 48, + SCLEX_TEX = 49, + SCLEX_METAPOST = 50, + SCLEX_POWERBASIC = 51, + SCLEX_FORTH = 52, + SCLEX_ERLANG = 53, + SCLEX_OCTAVE = 54, + SCLEX_MSSQL = 55, + SCLEX_VERILOG = 56, + SCLEX_KIX = 57, + SCLEX_GUI4CLI = 58, + SCLEX_SPECMAN = 59, + SCLEX_AU3 = 60, + SCLEX_APDL = 61, + SCLEX_BASH = 62, + SCLEX_ASN1 = 63, + SCLEX_VHDL = 64, + SCLEX_CAML = 65, + SCLEX_BLITZBASIC = 66, + SCLEX_PUREBASIC = 67, + SCLEX_HASKELL = 68, + SCLEX_PHPSCRIPT = 69, + SCLEX_TADS3 = 70, + SCLEX_REBOL = 71, + SCLEX_SMALLTALK = 72, + SCLEX_FLAGSHIP = 73, + SCLEX_CSOUND = 74, + SCLEX_FREEBASIC = 75, + SCLEX_INNOSETUP = 76, + SCLEX_OPAL = 77, + SCLEX_SPICE = 78, + SCLEX_D = 79, + SCLEX_CMAKE = 80, + SCLEX_GAP = 81, + SCLEX_PLM = 82, + SCLEX_PROGRESS = 83, + SCLEX_ABAQUS = 84, + SCLEX_ASYMPTOTE = 85, + SCLEX_R = 86, + SCLEX_MAGIK = 87, + SCLEX_POWERSHELL = 88, + SCLEX_MYSQL = 89, + SCLEX_PO = 90, + SCLEX_TAL = 91, + SCLEX_COBOL = 92, + SCLEX_TACL = 93, + SCLEX_SORCUS = 94, + SCLEX_POWERPRO = 95, + SCLEX_NIMROD = 96, + SCLEX_SML = 97, + SCLEX_MARKDOWN = 98, + SCLEX_TXT2TAGS = 99, + SCLEX_A68K = 100, + SCLEX_MODULA = 101, + SCLEX_COFFEESCRIPT = 102, + SCLEX_TCMD = 103, + SCLEX_AVS = 104, + SCLEX_ECL = 105, + SCLEX_OSCRIPT = 106, + SCLEX_VISUALPROLOG = 107, + SCLEX_LITERATEHASKELL = 108, + SCLEX_STTXT = 109, + SCLEX_KVIRC = 110, + SCLEX_RUST = 111, + SCLEX_DMAP = 112, + SCLEX_AS = 113, + SCLEX_DMIS = 114, + SCLEX_REGISTRY = 115, + SCLEX_BIBTEX = 116, + SCLEX_AUTOMATIC = 1000, + SCE_P_DEFAULT = 0, + SCE_P_COMMENTLINE = 1, + SCE_P_NUMBER = 2, + SCE_P_STRING = 3, + SCE_P_CHARACTER = 4, + SCE_P_WORD = 5, + SCE_P_TRIPLE = 6, + SCE_P_TRIPLEDOUBLE = 7, + SCE_P_CLASSNAME = 8, + SCE_P_DEFNAME = 9, + SCE_P_OPERATOR = 10, + SCE_P_IDENTIFIER = 11, + SCE_P_COMMENTBLOCK = 12, + SCE_P_STRINGEOL = 13, + SCE_P_WORD2 = 14, + SCE_P_DECORATOR = 15, + SCE_C_DEFAULT = 0, + SCE_C_COMMENT = 1, + SCE_C_COMMENTLINE = 2, + SCE_C_COMMENTDOC = 3, + SCE_C_NUMBER = 4, + SCE_C_WORD = 5, + SCE_C_STRING = 6, + SCE_C_CHARACTER = 7, + SCE_C_UUID = 8, + SCE_C_PREPROCESSOR = 9, + SCE_C_OPERATOR = 10, + SCE_C_IDENTIFIER = 11, + SCE_C_STRINGEOL = 12, + SCE_C_VERBATIM = 13, + SCE_C_REGEX = 14, + SCE_C_COMMENTLINEDOC = 15, + SCE_C_WORD2 = 16, + SCE_C_COMMENTDOCKEYWORD = 17, + SCE_C_COMMENTDOCKEYWORDERROR = 18, + SCE_C_GLOBALCLASS = 19, + SCE_C_STRINGRAW = 20, + SCE_C_TRIPLEVERBATIM = 21, + SCE_C_HASHQUOTEDSTRING = 22, + SCE_C_PREPROCESSORCOMMENT = 23, + SCE_C_PREPROCESSORCOMMENTDOC = 24, + SCE_C_USERLITERAL = 25, + SCE_C_TASKMARKER = 26, + SCE_C_ESCAPESEQUENCE = 27, + SCE_D_DEFAULT = 0, + SCE_D_COMMENT = 1, + SCE_D_COMMENTLINE = 2, + SCE_D_COMMENTDOC = 3, + SCE_D_COMMENTNESTED = 4, + SCE_D_NUMBER = 5, + SCE_D_WORD = 6, + SCE_D_WORD2 = 7, + SCE_D_WORD3 = 8, + SCE_D_TYPEDEF = 9, + SCE_D_STRING = 10, + SCE_D_STRINGEOL = 11, + SCE_D_CHARACTER = 12, + SCE_D_OPERATOR = 13, + SCE_D_IDENTIFIER = 14, + SCE_D_COMMENTLINEDOC = 15, + SCE_D_COMMENTDOCKEYWORD = 16, + SCE_D_COMMENTDOCKEYWORDERROR = 17, + SCE_D_STRINGB = 18, + SCE_D_STRINGR = 19, + SCE_D_WORD5 = 20, + SCE_D_WORD6 = 21, + SCE_D_WORD7 = 22, + SCE_TCL_DEFAULT = 0, + SCE_TCL_COMMENT = 1, + SCE_TCL_COMMENTLINE = 2, + SCE_TCL_NUMBER = 3, + SCE_TCL_WORD_IN_QUOTE = 4, + SCE_TCL_IN_QUOTE = 5, + SCE_TCL_OPERATOR = 6, + SCE_TCL_IDENTIFIER = 7, + SCE_TCL_SUBSTITUTION = 8, + SCE_TCL_SUB_BRACE = 9, + SCE_TCL_MODIFIER = 10, + SCE_TCL_EXPAND = 11, + SCE_TCL_WORD = 12, + SCE_TCL_WORD2 = 13, + SCE_TCL_WORD3 = 14, + SCE_TCL_WORD4 = 15, + SCE_TCL_WORD5 = 16, + SCE_TCL_WORD6 = 17, + SCE_TCL_WORD7 = 18, + SCE_TCL_WORD8 = 19, + SCE_TCL_COMMENT_BOX = 20, + SCE_TCL_BLOCK_COMMENT = 21, + SCE_H_DEFAULT = 0, + SCE_H_TAG = 1, + SCE_H_TAGUNKNOWN = 2, + SCE_H_ATTRIBUTE = 3, + SCE_H_ATTRIBUTEUNKNOWN = 4, + SCE_H_NUMBER = 5, + SCE_H_DOUBLESTRING = 6, + SCE_H_SINGLESTRING = 7, + SCE_H_OTHER = 8, + SCE_H_COMMENT = 9, + SCE_H_ENTITY = 10, + SCE_H_TAGEND = 11, + SCE_H_XMLSTART = 12, + SCE_H_XMLEND = 13, + SCE_H_SCRIPT = 14, + SCE_H_ASP = 15, + SCE_H_ASPAT = 16, + SCE_H_CDATA = 17, + SCE_H_QUESTION = 18, + SCE_H_VALUE = 19, + SCE_H_XCCOMMENT = 20, + SCE_H_SGML_DEFAULT = 21, + SCE_H_SGML_COMMAND = 22, + SCE_H_SGML_1ST_PARAM = 23, + SCE_H_SGML_DOUBLESTRING = 24, + SCE_H_SGML_SIMPLESTRING = 25, + SCE_H_SGML_ERROR = 26, + SCE_H_SGML_SPECIAL = 27, + SCE_H_SGML_ENTITY = 28, + SCE_H_SGML_COMMENT = 29, + SCE_H_SGML_1ST_PARAM_COMMENT = 30, + SCE_H_SGML_BLOCK_DEFAULT = 31, + SCE_HJ_START = 40, + SCE_HJ_DEFAULT = 41, + SCE_HJ_COMMENT = 42, + SCE_HJ_COMMENTLINE = 43, + SCE_HJ_COMMENTDOC = 44, + SCE_HJ_NUMBER = 45, + SCE_HJ_WORD = 46, + SCE_HJ_KEYWORD = 47, + SCE_HJ_DOUBLESTRING = 48, + SCE_HJ_SINGLESTRING = 49, + SCE_HJ_SYMBOLS = 50, + SCE_HJ_STRINGEOL = 51, + SCE_HJ_REGEX = 52, + SCE_HJA_START = 55, + SCE_HJA_DEFAULT = 56, + SCE_HJA_COMMENT = 57, + SCE_HJA_COMMENTLINE = 58, + SCE_HJA_COMMENTDOC = 59, + SCE_HJA_NUMBER = 60, + SCE_HJA_WORD = 61, + SCE_HJA_KEYWORD = 62, + SCE_HJA_DOUBLESTRING = 63, + SCE_HJA_SINGLESTRING = 64, + SCE_HJA_SYMBOLS = 65, + SCE_HJA_STRINGEOL = 66, + SCE_HJA_REGEX = 67, + SCE_HB_START = 70, + SCE_HB_DEFAULT = 71, + SCE_HB_COMMENTLINE = 72, + SCE_HB_NUMBER = 73, + SCE_HB_WORD = 74, + SCE_HB_STRING = 75, + SCE_HB_IDENTIFIER = 76, + SCE_HB_STRINGEOL = 77, + SCE_HBA_START = 80, + SCE_HBA_DEFAULT = 81, + SCE_HBA_COMMENTLINE = 82, + SCE_HBA_NUMBER = 83, + SCE_HBA_WORD = 84, + SCE_HBA_STRING = 85, + SCE_HBA_IDENTIFIER = 86, + SCE_HBA_STRINGEOL = 87, + SCE_HP_START = 90, + SCE_HP_DEFAULT = 91, + SCE_HP_COMMENTLINE = 92, + SCE_HP_NUMBER = 93, + SCE_HP_STRING = 94, + SCE_HP_CHARACTER = 95, + SCE_HP_WORD = 96, + SCE_HP_TRIPLE = 97, + SCE_HP_TRIPLEDOUBLE = 98, + SCE_HP_CLASSNAME = 99, + SCE_HP_DEFNAME = 100, + SCE_HP_OPERATOR = 101, + SCE_HP_IDENTIFIER = 102, + SCE_HPHP_COMPLEX_VARIABLE = 104, + SCE_HPA_START = 105, + SCE_HPA_DEFAULT = 106, + SCE_HPA_COMMENTLINE = 107, + SCE_HPA_NUMBER = 108, + SCE_HPA_STRING = 109, + SCE_HPA_CHARACTER = 110, + SCE_HPA_WORD = 111, + SCE_HPA_TRIPLE = 112, + SCE_HPA_TRIPLEDOUBLE = 113, + SCE_HPA_CLASSNAME = 114, + SCE_HPA_DEFNAME = 115, + SCE_HPA_OPERATOR = 116, + SCE_HPA_IDENTIFIER = 117, + SCE_HPHP_DEFAULT = 118, + SCE_HPHP_HSTRING = 119, + SCE_HPHP_SIMPLESTRING = 120, + SCE_HPHP_WORD = 121, + SCE_HPHP_NUMBER = 122, + SCE_HPHP_VARIABLE = 123, + SCE_HPHP_COMMENT = 124, + SCE_HPHP_COMMENTLINE = 125, + SCE_HPHP_HSTRING_VARIABLE = 126, + SCE_HPHP_OPERATOR = 127, + SCE_PL_DEFAULT = 0, + SCE_PL_ERROR = 1, + SCE_PL_COMMENTLINE = 2, + SCE_PL_POD = 3, + SCE_PL_NUMBER = 4, + SCE_PL_WORD = 5, + SCE_PL_STRING = 6, + SCE_PL_CHARACTER = 7, + SCE_PL_PUNCTUATION = 8, + SCE_PL_PREPROCESSOR = 9, + SCE_PL_OPERATOR = 10, + SCE_PL_IDENTIFIER = 11, + SCE_PL_SCALAR = 12, + SCE_PL_ARRAY = 13, + SCE_PL_HASH = 14, + SCE_PL_SYMBOLTABLE = 15, + SCE_PL_VARIABLE_INDEXER = 16, + SCE_PL_REGEX = 17, + SCE_PL_REGSUBST = 18, + SCE_PL_LONGQUOTE = 19, + SCE_PL_BACKTICKS = 20, + SCE_PL_DATASECTION = 21, + SCE_PL_HERE_DELIM = 22, + SCE_PL_HERE_Q = 23, + SCE_PL_HERE_QQ = 24, + SCE_PL_HERE_QX = 25, + SCE_PL_STRING_Q = 26, + SCE_PL_STRING_QQ = 27, + SCE_PL_STRING_QX = 28, + SCE_PL_STRING_QR = 29, + SCE_PL_STRING_QW = 30, + SCE_PL_POD_VERB = 31, + SCE_PL_SUB_PROTOTYPE = 40, + SCE_PL_FORMAT_IDENT = 41, + SCE_PL_FORMAT = 42, + SCE_PL_STRING_VAR = 43, + SCE_PL_XLAT = 44, + SCE_PL_REGEX_VAR = 54, + SCE_PL_REGSUBST_VAR = 55, + SCE_PL_BACKTICKS_VAR = 57, + SCE_PL_HERE_QQ_VAR = 61, + SCE_PL_HERE_QX_VAR = 62, + SCE_PL_STRING_QQ_VAR = 64, + SCE_PL_STRING_QX_VAR = 65, + SCE_PL_STRING_QR_VAR = 66, + SCE_RB_DEFAULT = 0, + SCE_RB_ERROR = 1, + SCE_RB_COMMENTLINE = 2, + SCE_RB_POD = 3, + SCE_RB_NUMBER = 4, + SCE_RB_WORD = 5, + SCE_RB_STRING = 6, + SCE_RB_CHARACTER = 7, + SCE_RB_CLASSNAME = 8, + SCE_RB_DEFNAME = 9, + SCE_RB_OPERATOR = 10, + SCE_RB_IDENTIFIER = 11, + SCE_RB_REGEX = 12, + SCE_RB_GLOBAL = 13, + SCE_RB_SYMBOL = 14, + SCE_RB_MODULE_NAME = 15, + SCE_RB_INSTANCE_VAR = 16, + SCE_RB_CLASS_VAR = 17, + SCE_RB_BACKTICKS = 18, + SCE_RB_DATASECTION = 19, + SCE_RB_HERE_DELIM = 20, + SCE_RB_HERE_Q = 21, + SCE_RB_HERE_QQ = 22, + SCE_RB_HERE_QX = 23, + SCE_RB_STRING_Q = 24, + SCE_RB_STRING_QQ = 25, + SCE_RB_STRING_QX = 26, + SCE_RB_STRING_QR = 27, + SCE_RB_STRING_QW = 28, + SCE_RB_WORD_DEMOTED = 29, + SCE_RB_STDIN = 30, + SCE_RB_STDOUT = 31, + SCE_RB_STDERR = 40, + SCE_RB_UPPER_BOUND = 41, + SCE_B_DEFAULT = 0, + SCE_B_COMMENT = 1, + SCE_B_NUMBER = 2, + SCE_B_KEYWORD = 3, + SCE_B_STRING = 4, + SCE_B_PREPROCESSOR = 5, + SCE_B_OPERATOR = 6, + SCE_B_IDENTIFIER = 7, + SCE_B_DATE = 8, + SCE_B_STRINGEOL = 9, + SCE_B_KEYWORD2 = 10, + SCE_B_KEYWORD3 = 11, + SCE_B_KEYWORD4 = 12, + SCE_B_CONSTANT = 13, + SCE_B_ASM = 14, + SCE_B_LABEL = 15, + SCE_B_ERROR = 16, + SCE_B_HEXNUMBER = 17, + SCE_B_BINNUMBER = 18, + SCE_B_COMMENTBLOCK = 19, + SCE_B_DOCLINE = 20, + SCE_B_DOCBLOCK = 21, + SCE_B_DOCKEYWORD = 22, + SCE_PROPS_DEFAULT = 0, + SCE_PROPS_COMMENT = 1, + SCE_PROPS_SECTION = 2, + SCE_PROPS_ASSIGNMENT = 3, + SCE_PROPS_DEFVAL = 4, + SCE_PROPS_KEY = 5, + SCE_L_DEFAULT = 0, + SCE_L_COMMAND = 1, + SCE_L_TAG = 2, + SCE_L_MATH = 3, + SCE_L_COMMENT = 4, + SCE_L_TAG2 = 5, + SCE_L_MATH2 = 6, + SCE_L_COMMENT2 = 7, + SCE_L_VERBATIM = 8, + SCE_L_SHORTCMD = 9, + SCE_L_SPECIAL = 10, + SCE_L_CMDOPT = 11, + SCE_L_ERROR = 12, + SCE_LUA_DEFAULT = 0, + SCE_LUA_COMMENT = 1, + SCE_LUA_COMMENTLINE = 2, + SCE_LUA_COMMENTDOC = 3, + SCE_LUA_NUMBER = 4, + SCE_LUA_WORD = 5, + SCE_LUA_STRING = 6, + SCE_LUA_CHARACTER = 7, + SCE_LUA_LITERALSTRING = 8, + SCE_LUA_PREPROCESSOR = 9, + SCE_LUA_OPERATOR = 10, + SCE_LUA_IDENTIFIER = 11, + SCE_LUA_STRINGEOL = 12, + SCE_LUA_WORD2 = 13, + SCE_LUA_WORD3 = 14, + SCE_LUA_WORD4 = 15, + SCE_LUA_WORD5 = 16, + SCE_LUA_WORD6 = 17, + SCE_LUA_WORD7 = 18, + SCE_LUA_WORD8 = 19, + SCE_LUA_LABEL = 20, + SCE_ERR_DEFAULT = 0, + SCE_ERR_PYTHON = 1, + SCE_ERR_GCC = 2, + SCE_ERR_MS = 3, + SCE_ERR_CMD = 4, + SCE_ERR_BORLAND = 5, + SCE_ERR_PERL = 6, + SCE_ERR_NET = 7, + SCE_ERR_LUA = 8, + SCE_ERR_CTAG = 9, + SCE_ERR_DIFF_CHANGED = 10, + SCE_ERR_DIFF_ADDITION = 11, + SCE_ERR_DIFF_DELETION = 12, + SCE_ERR_DIFF_MESSAGE = 13, + SCE_ERR_PHP = 14, + SCE_ERR_ELF = 15, + SCE_ERR_IFC = 16, + SCE_ERR_IFORT = 17, + SCE_ERR_ABSF = 18, + SCE_ERR_TIDY = 19, + SCE_ERR_JAVA_STACK = 20, + SCE_ERR_VALUE = 21, + SCE_ERR_GCC_INCLUDED_FROM = 22, + SCE_BAT_DEFAULT = 0, + SCE_BAT_COMMENT = 1, + SCE_BAT_WORD = 2, + SCE_BAT_LABEL = 3, + SCE_BAT_HIDE = 4, + SCE_BAT_COMMAND = 5, + SCE_BAT_IDENTIFIER = 6, + SCE_BAT_OPERATOR = 7, + SCE_TCMD_DEFAULT = 0, + SCE_TCMD_COMMENT = 1, + SCE_TCMD_WORD = 2, + SCE_TCMD_LABEL = 3, + SCE_TCMD_HIDE = 4, + SCE_TCMD_COMMAND = 5, + SCE_TCMD_IDENTIFIER = 6, + SCE_TCMD_OPERATOR = 7, + SCE_TCMD_ENVIRONMENT = 8, + SCE_TCMD_EXPANSION = 9, + SCE_TCMD_CLABEL = 10, + SCE_MAKE_DEFAULT = 0, + SCE_MAKE_COMMENT = 1, + SCE_MAKE_PREPROCESSOR = 2, + SCE_MAKE_IDENTIFIER = 3, + SCE_MAKE_OPERATOR = 4, + SCE_MAKE_TARGET = 5, + SCE_MAKE_IDEOL = 9, + SCE_DIFF_DEFAULT = 0, + SCE_DIFF_COMMENT = 1, + SCE_DIFF_COMMAND = 2, + SCE_DIFF_HEADER = 3, + SCE_DIFF_POSITION = 4, + SCE_DIFF_DELETED = 5, + SCE_DIFF_ADDED = 6, + SCE_DIFF_CHANGED = 7, + SCE_CONF_DEFAULT = 0, + SCE_CONF_COMMENT = 1, + SCE_CONF_NUMBER = 2, + SCE_CONF_IDENTIFIER = 3, + SCE_CONF_EXTENSION = 4, + SCE_CONF_PARAMETER = 5, + SCE_CONF_STRING = 6, + SCE_CONF_OPERATOR = 7, + SCE_CONF_IP = 8, + SCE_CONF_DIRECTIVE = 9, + SCE_AVE_DEFAULT = 0, + SCE_AVE_COMMENT = 1, + SCE_AVE_NUMBER = 2, + SCE_AVE_WORD = 3, + SCE_AVE_STRING = 6, + SCE_AVE_ENUM = 7, + SCE_AVE_STRINGEOL = 8, + SCE_AVE_IDENTIFIER = 9, + SCE_AVE_OPERATOR = 10, + SCE_AVE_WORD1 = 11, + SCE_AVE_WORD2 = 12, + SCE_AVE_WORD3 = 13, + SCE_AVE_WORD4 = 14, + SCE_AVE_WORD5 = 15, + SCE_AVE_WORD6 = 16, + SCE_ADA_DEFAULT = 0, + SCE_ADA_WORD = 1, + SCE_ADA_IDENTIFIER = 2, + SCE_ADA_NUMBER = 3, + SCE_ADA_DELIMITER = 4, + SCE_ADA_CHARACTER = 5, + SCE_ADA_CHARACTEREOL = 6, + SCE_ADA_STRING = 7, + SCE_ADA_STRINGEOL = 8, + SCE_ADA_LABEL = 9, + SCE_ADA_COMMENTLINE = 10, + SCE_ADA_ILLEGAL = 11, + SCE_BAAN_DEFAULT = 0, + SCE_BAAN_COMMENT = 1, + SCE_BAAN_COMMENTDOC = 2, + SCE_BAAN_NUMBER = 3, + SCE_BAAN_WORD = 4, + SCE_BAAN_STRING = 5, + SCE_BAAN_PREPROCESSOR = 6, + SCE_BAAN_OPERATOR = 7, + SCE_BAAN_IDENTIFIER = 8, + SCE_BAAN_STRINGEOL = 9, + SCE_BAAN_WORD2 = 10, + SCE_LISP_DEFAULT = 0, + SCE_LISP_COMMENT = 1, + SCE_LISP_NUMBER = 2, + SCE_LISP_KEYWORD = 3, + SCE_LISP_KEYWORD_KW = 4, + SCE_LISP_SYMBOL = 5, + SCE_LISP_STRING = 6, + SCE_LISP_STRINGEOL = 8, + SCE_LISP_IDENTIFIER = 9, + SCE_LISP_OPERATOR = 10, + SCE_LISP_SPECIAL = 11, + SCE_LISP_MULTI_COMMENT = 12, + SCE_EIFFEL_DEFAULT = 0, + SCE_EIFFEL_COMMENTLINE = 1, + SCE_EIFFEL_NUMBER = 2, + SCE_EIFFEL_WORD = 3, + SCE_EIFFEL_STRING = 4, + SCE_EIFFEL_CHARACTER = 5, + SCE_EIFFEL_OPERATOR = 6, + SCE_EIFFEL_IDENTIFIER = 7, + SCE_EIFFEL_STRINGEOL = 8, + SCE_NNCRONTAB_DEFAULT = 0, + SCE_NNCRONTAB_COMMENT = 1, + SCE_NNCRONTAB_TASK = 2, + SCE_NNCRONTAB_SECTION = 3, + SCE_NNCRONTAB_KEYWORD = 4, + SCE_NNCRONTAB_MODIFIER = 5, + SCE_NNCRONTAB_ASTERISK = 6, + SCE_NNCRONTAB_NUMBER = 7, + SCE_NNCRONTAB_STRING = 8, + SCE_NNCRONTAB_ENVIRONMENT = 9, + SCE_NNCRONTAB_IDENTIFIER = 10, + SCE_FORTH_DEFAULT = 0, + SCE_FORTH_COMMENT = 1, + SCE_FORTH_COMMENT_ML = 2, + SCE_FORTH_IDENTIFIER = 3, + SCE_FORTH_CONTROL = 4, + SCE_FORTH_KEYWORD = 5, + SCE_FORTH_DEFWORD = 6, + SCE_FORTH_PREWORD1 = 7, + SCE_FORTH_PREWORD2 = 8, + SCE_FORTH_NUMBER = 9, + SCE_FORTH_STRING = 10, + SCE_FORTH_LOCALE = 11, + SCE_MATLAB_DEFAULT = 0, + SCE_MATLAB_COMMENT = 1, + SCE_MATLAB_COMMAND = 2, + SCE_MATLAB_NUMBER = 3, + SCE_MATLAB_KEYWORD = 4, + SCE_MATLAB_STRING = 5, + SCE_MATLAB_OPERATOR = 6, + SCE_MATLAB_IDENTIFIER = 7, + SCE_MATLAB_DOUBLEQUOTESTRING = 8, + SCE_SCRIPTOL_DEFAULT = 0, + SCE_SCRIPTOL_WHITE = 1, + SCE_SCRIPTOL_COMMENTLINE = 2, + SCE_SCRIPTOL_PERSISTENT = 3, + SCE_SCRIPTOL_CSTYLE = 4, + SCE_SCRIPTOL_COMMENTBLOCK = 5, + SCE_SCRIPTOL_NUMBER = 6, + SCE_SCRIPTOL_STRING = 7, + SCE_SCRIPTOL_CHARACTER = 8, + SCE_SCRIPTOL_STRINGEOL = 9, + SCE_SCRIPTOL_KEYWORD = 10, + SCE_SCRIPTOL_OPERATOR = 11, + SCE_SCRIPTOL_IDENTIFIER = 12, + SCE_SCRIPTOL_TRIPLE = 13, + SCE_SCRIPTOL_CLASSNAME = 14, + SCE_SCRIPTOL_PREPROCESSOR = 15, + SCE_ASM_DEFAULT = 0, + SCE_ASM_COMMENT = 1, + SCE_ASM_NUMBER = 2, + SCE_ASM_STRING = 3, + SCE_ASM_OPERATOR = 4, + SCE_ASM_IDENTIFIER = 5, + SCE_ASM_CPUINSTRUCTION = 6, + SCE_ASM_MATHINSTRUCTION = 7, + SCE_ASM_REGISTER = 8, + SCE_ASM_DIRECTIVE = 9, + SCE_ASM_DIRECTIVEOPERAND = 10, + SCE_ASM_COMMENTBLOCK = 11, + SCE_ASM_CHARACTER = 12, + SCE_ASM_STRINGEOL = 13, + SCE_ASM_EXTINSTRUCTION = 14, + SCE_ASM_COMMENTDIRECTIVE = 15, + SCE_F_DEFAULT = 0, + SCE_F_COMMENT = 1, + SCE_F_NUMBER = 2, + SCE_F_STRING1 = 3, + SCE_F_STRING2 = 4, + SCE_F_STRINGEOL = 5, + SCE_F_OPERATOR = 6, + SCE_F_IDENTIFIER = 7, + SCE_F_WORD = 8, + SCE_F_WORD2 = 9, + SCE_F_WORD3 = 10, + SCE_F_PREPROCESSOR = 11, + SCE_F_OPERATOR2 = 12, + SCE_F_LABEL = 13, + SCE_F_CONTINUATION = 14, + SCE_CSS_DEFAULT = 0, + SCE_CSS_TAG = 1, + SCE_CSS_CLASS = 2, + SCE_CSS_PSEUDOCLASS = 3, + SCE_CSS_UNKNOWN_PSEUDOCLASS = 4, + SCE_CSS_OPERATOR = 5, + SCE_CSS_IDENTIFIER = 6, + SCE_CSS_UNKNOWN_IDENTIFIER = 7, + SCE_CSS_VALUE = 8, + SCE_CSS_COMMENT = 9, + SCE_CSS_ID = 10, + SCE_CSS_IMPORTANT = 11, + SCE_CSS_DIRECTIVE = 12, + SCE_CSS_DOUBLESTRING = 13, + SCE_CSS_SINGLESTRING = 14, + SCE_CSS_IDENTIFIER2 = 15, + SCE_CSS_ATTRIBUTE = 16, + SCE_CSS_IDENTIFIER3 = 17, + SCE_CSS_PSEUDOELEMENT = 18, + SCE_CSS_EXTENDED_IDENTIFIER = 19, + SCE_CSS_EXTENDED_PSEUDOCLASS = 20, + SCE_CSS_EXTENDED_PSEUDOELEMENT = 21, + SCE_CSS_MEDIA = 22, + SCE_CSS_VARIABLE = 23, + SCE_POV_DEFAULT = 0, + SCE_POV_COMMENT = 1, + SCE_POV_COMMENTLINE = 2, + SCE_POV_NUMBER = 3, + SCE_POV_OPERATOR = 4, + SCE_POV_IDENTIFIER = 5, + SCE_POV_STRING = 6, + SCE_POV_STRINGEOL = 7, + SCE_POV_DIRECTIVE = 8, + SCE_POV_BADDIRECTIVE = 9, + SCE_POV_WORD2 = 10, + SCE_POV_WORD3 = 11, + SCE_POV_WORD4 = 12, + SCE_POV_WORD5 = 13, + SCE_POV_WORD6 = 14, + SCE_POV_WORD7 = 15, + SCE_POV_WORD8 = 16, + SCE_LOUT_DEFAULT = 0, + SCE_LOUT_COMMENT = 1, + SCE_LOUT_NUMBER = 2, + SCE_LOUT_WORD = 3, + SCE_LOUT_WORD2 = 4, + SCE_LOUT_WORD3 = 5, + SCE_LOUT_WORD4 = 6, + SCE_LOUT_STRING = 7, + SCE_LOUT_OPERATOR = 8, + SCE_LOUT_IDENTIFIER = 9, + SCE_LOUT_STRINGEOL = 10, + SCE_ESCRIPT_DEFAULT = 0, + SCE_ESCRIPT_COMMENT = 1, + SCE_ESCRIPT_COMMENTLINE = 2, + SCE_ESCRIPT_COMMENTDOC = 3, + SCE_ESCRIPT_NUMBER = 4, + SCE_ESCRIPT_WORD = 5, + SCE_ESCRIPT_STRING = 6, + SCE_ESCRIPT_OPERATOR = 7, + SCE_ESCRIPT_IDENTIFIER = 8, + SCE_ESCRIPT_BRACE = 9, + SCE_ESCRIPT_WORD2 = 10, + SCE_ESCRIPT_WORD3 = 11, + SCE_PS_DEFAULT = 0, + SCE_PS_COMMENT = 1, + SCE_PS_DSC_COMMENT = 2, + SCE_PS_DSC_VALUE = 3, + SCE_PS_NUMBER = 4, + SCE_PS_NAME = 5, + SCE_PS_KEYWORD = 6, + SCE_PS_LITERAL = 7, + SCE_PS_IMMEVAL = 8, + SCE_PS_PAREN_ARRAY = 9, + SCE_PS_PAREN_DICT = 10, + SCE_PS_PAREN_PROC = 11, + SCE_PS_TEXT = 12, + SCE_PS_HEXSTRING = 13, + SCE_PS_BASE85STRING = 14, + SCE_PS_BADSTRINGCHAR = 15, + SCE_NSIS_DEFAULT = 0, + SCE_NSIS_COMMENT = 1, + SCE_NSIS_STRINGDQ = 2, + SCE_NSIS_STRINGLQ = 3, + SCE_NSIS_STRINGRQ = 4, + SCE_NSIS_FUNCTION = 5, + SCE_NSIS_VARIABLE = 6, + SCE_NSIS_LABEL = 7, + SCE_NSIS_USERDEFINED = 8, + SCE_NSIS_SECTIONDEF = 9, + SCE_NSIS_SUBSECTIONDEF = 10, + SCE_NSIS_IFDEFINEDEF = 11, + SCE_NSIS_MACRODEF = 12, + SCE_NSIS_STRINGVAR = 13, + SCE_NSIS_NUMBER = 14, + SCE_NSIS_SECTIONGROUP = 15, + SCE_NSIS_PAGEEX = 16, + SCE_NSIS_FUNCTIONDEF = 17, + SCE_NSIS_COMMENTBOX = 18, + SCE_MMIXAL_LEADWS = 0, + SCE_MMIXAL_COMMENT = 1, + SCE_MMIXAL_LABEL = 2, + SCE_MMIXAL_OPCODE = 3, + SCE_MMIXAL_OPCODE_PRE = 4, + SCE_MMIXAL_OPCODE_VALID = 5, + SCE_MMIXAL_OPCODE_UNKNOWN = 6, + SCE_MMIXAL_OPCODE_POST = 7, + SCE_MMIXAL_OPERANDS = 8, + SCE_MMIXAL_NUMBER = 9, + SCE_MMIXAL_REF = 10, + SCE_MMIXAL_CHAR = 11, + SCE_MMIXAL_STRING = 12, + SCE_MMIXAL_REGISTER = 13, + SCE_MMIXAL_HEX = 14, + SCE_MMIXAL_OPERATOR = 15, + SCE_MMIXAL_SYMBOL = 16, + SCE_MMIXAL_INCLUDE = 17, + SCE_CLW_DEFAULT = 0, + SCE_CLW_LABEL = 1, + SCE_CLW_COMMENT = 2, + SCE_CLW_STRING = 3, + SCE_CLW_USER_IDENTIFIER = 4, + SCE_CLW_INTEGER_CONSTANT = 5, + SCE_CLW_REAL_CONSTANT = 6, + SCE_CLW_PICTURE_STRING = 7, + SCE_CLW_KEYWORD = 8, + SCE_CLW_COMPILER_DIRECTIVE = 9, + SCE_CLW_RUNTIME_EXPRESSIONS = 10, + SCE_CLW_BUILTIN_PROCEDURES_FUNCTION = 11, + SCE_CLW_STRUCTURE_DATA_TYPE = 12, + SCE_CLW_ATTRIBUTE = 13, + SCE_CLW_STANDARD_EQUATE = 14, + SCE_CLW_ERROR = 15, + SCE_CLW_DEPRECATED = 16, + SCE_LOT_DEFAULT = 0, + SCE_LOT_HEADER = 1, + SCE_LOT_BREAK = 2, + SCE_LOT_SET = 3, + SCE_LOT_PASS = 4, + SCE_LOT_FAIL = 5, + SCE_LOT_ABORT = 6, + SCE_YAML_DEFAULT = 0, + SCE_YAML_COMMENT = 1, + SCE_YAML_IDENTIFIER = 2, + SCE_YAML_KEYWORD = 3, + SCE_YAML_NUMBER = 4, + SCE_YAML_REFERENCE = 5, + SCE_YAML_DOCUMENT = 6, + SCE_YAML_TEXT = 7, + SCE_YAML_ERROR = 8, + SCE_YAML_OPERATOR = 9, + SCE_TEX_DEFAULT = 0, + SCE_TEX_SPECIAL = 1, + SCE_TEX_GROUP = 2, + SCE_TEX_SYMBOL = 3, + SCE_TEX_COMMAND = 4, + SCE_TEX_TEXT = 5, + SCE_METAPOST_DEFAULT = 0, + SCE_METAPOST_SPECIAL = 1, + SCE_METAPOST_GROUP = 2, + SCE_METAPOST_SYMBOL = 3, + SCE_METAPOST_COMMAND = 4, + SCE_METAPOST_TEXT = 5, + SCE_METAPOST_EXTRA = 6, + SCE_ERLANG_DEFAULT = 0, + SCE_ERLANG_COMMENT = 1, + SCE_ERLANG_VARIABLE = 2, + SCE_ERLANG_NUMBER = 3, + SCE_ERLANG_KEYWORD = 4, + SCE_ERLANG_STRING = 5, + SCE_ERLANG_OPERATOR = 6, + SCE_ERLANG_ATOM = 7, + SCE_ERLANG_FUNCTION_NAME = 8, + SCE_ERLANG_CHARACTER = 9, + SCE_ERLANG_MACRO = 10, + SCE_ERLANG_RECORD = 11, + SCE_ERLANG_PREPROC = 12, + SCE_ERLANG_NODE_NAME = 13, + SCE_ERLANG_COMMENT_FUNCTION = 14, + SCE_ERLANG_COMMENT_MODULE = 15, + SCE_ERLANG_COMMENT_DOC = 16, + SCE_ERLANG_COMMENT_DOC_MACRO = 17, + SCE_ERLANG_ATOM_QUOTED = 18, + SCE_ERLANG_MACRO_QUOTED = 19, + SCE_ERLANG_RECORD_QUOTED = 20, + SCE_ERLANG_NODE_NAME_QUOTED = 21, + SCE_ERLANG_BIFS = 22, + SCE_ERLANG_MODULES = 23, + SCE_ERLANG_MODULES_ATT = 24, + SCE_ERLANG_UNKNOWN = 31, + SCE_MSSQL_DEFAULT = 0, + SCE_MSSQL_COMMENT = 1, + SCE_MSSQL_LINE_COMMENT = 2, + SCE_MSSQL_NUMBER = 3, + SCE_MSSQL_STRING = 4, + SCE_MSSQL_OPERATOR = 5, + SCE_MSSQL_IDENTIFIER = 6, + SCE_MSSQL_VARIABLE = 7, + SCE_MSSQL_COLUMN_NAME = 8, + SCE_MSSQL_STATEMENT = 9, + SCE_MSSQL_DATATYPE = 10, + SCE_MSSQL_SYSTABLE = 11, + SCE_MSSQL_GLOBAL_VARIABLE = 12, + SCE_MSSQL_FUNCTION = 13, + SCE_MSSQL_STORED_PROCEDURE = 14, + SCE_MSSQL_DEFAULT_PREF_DATATYPE = 15, + SCE_MSSQL_COLUMN_NAME_2 = 16, + SCE_V_DEFAULT = 0, + SCE_V_COMMENT = 1, + SCE_V_COMMENTLINE = 2, + SCE_V_COMMENTLINEBANG = 3, + SCE_V_NUMBER = 4, + SCE_V_WORD = 5, + SCE_V_STRING = 6, + SCE_V_WORD2 = 7, + SCE_V_WORD3 = 8, + SCE_V_PREPROCESSOR = 9, + SCE_V_OPERATOR = 10, + SCE_V_IDENTIFIER = 11, + SCE_V_STRINGEOL = 12, + SCE_V_USER = 19, + SCE_KIX_DEFAULT = 0, + SCE_KIX_COMMENT = 1, + SCE_KIX_STRING1 = 2, + SCE_KIX_STRING2 = 3, + SCE_KIX_NUMBER = 4, + SCE_KIX_VAR = 5, + SCE_KIX_MACRO = 6, + SCE_KIX_KEYWORD = 7, + SCE_KIX_FUNCTIONS = 8, + SCE_KIX_OPERATOR = 9, + SCE_KIX_COMMENTSTREAM = 10, + SCE_KIX_IDENTIFIER = 31, + SCE_GC_DEFAULT = 0, + SCE_GC_COMMENTLINE = 1, + SCE_GC_COMMENTBLOCK = 2, + SCE_GC_GLOBAL = 3, + SCE_GC_EVENT = 4, + SCE_GC_ATTRIBUTE = 5, + SCE_GC_CONTROL = 6, + SCE_GC_COMMAND = 7, + SCE_GC_STRING = 8, + SCE_GC_OPERATOR = 9, + SCE_SN_DEFAULT = 0, + SCE_SN_CODE = 1, + SCE_SN_COMMENTLINE = 2, + SCE_SN_COMMENTLINEBANG = 3, + SCE_SN_NUMBER = 4, + SCE_SN_WORD = 5, + SCE_SN_STRING = 6, + SCE_SN_WORD2 = 7, + SCE_SN_WORD3 = 8, + SCE_SN_PREPROCESSOR = 9, + SCE_SN_OPERATOR = 10, + SCE_SN_IDENTIFIER = 11, + SCE_SN_STRINGEOL = 12, + SCE_SN_REGEXTAG = 13, + SCE_SN_SIGNAL = 14, + SCE_SN_USER = 19, + SCE_AU3_DEFAULT = 0, + SCE_AU3_COMMENT = 1, + SCE_AU3_COMMENTBLOCK = 2, + SCE_AU3_NUMBER = 3, + SCE_AU3_FUNCTION = 4, + SCE_AU3_KEYWORD = 5, + SCE_AU3_MACRO = 6, + SCE_AU3_STRING = 7, + SCE_AU3_OPERATOR = 8, + SCE_AU3_VARIABLE = 9, + SCE_AU3_SENT = 10, + SCE_AU3_PREPROCESSOR = 11, + SCE_AU3_SPECIAL = 12, + SCE_AU3_EXPAND = 13, + SCE_AU3_COMOBJ = 14, + SCE_AU3_UDF = 15, + SCE_APDL_DEFAULT = 0, + SCE_APDL_COMMENT = 1, + SCE_APDL_COMMENTBLOCK = 2, + SCE_APDL_NUMBER = 3, + SCE_APDL_STRING = 4, + SCE_APDL_OPERATOR = 5, + SCE_APDL_WORD = 6, + SCE_APDL_PROCESSOR = 7, + SCE_APDL_COMMAND = 8, + SCE_APDL_SLASHCOMMAND = 9, + SCE_APDL_STARCOMMAND = 10, + SCE_APDL_ARGUMENT = 11, + SCE_APDL_FUNCTION = 12, + SCE_SH_DEFAULT = 0, + SCE_SH_ERROR = 1, + SCE_SH_COMMENTLINE = 2, + SCE_SH_NUMBER = 3, + SCE_SH_WORD = 4, + SCE_SH_STRING = 5, + SCE_SH_CHARACTER = 6, + SCE_SH_OPERATOR = 7, + SCE_SH_IDENTIFIER = 8, + SCE_SH_SCALAR = 9, + SCE_SH_PARAM = 10, + SCE_SH_BACKTICKS = 11, + SCE_SH_HERE_DELIM = 12, + SCE_SH_HERE_Q = 13, + SCE_ASN1_DEFAULT = 0, + SCE_ASN1_COMMENT = 1, + SCE_ASN1_IDENTIFIER = 2, + SCE_ASN1_STRING = 3, + SCE_ASN1_OID = 4, + SCE_ASN1_SCALAR = 5, + SCE_ASN1_KEYWORD = 6, + SCE_ASN1_ATTRIBUTE = 7, + SCE_ASN1_DESCRIPTOR = 8, + SCE_ASN1_TYPE = 9, + SCE_ASN1_OPERATOR = 10, + SCE_VHDL_DEFAULT = 0, + SCE_VHDL_COMMENT = 1, + SCE_VHDL_COMMENTLINEBANG = 2, + SCE_VHDL_NUMBER = 3, + SCE_VHDL_STRING = 4, + SCE_VHDL_OPERATOR = 5, + SCE_VHDL_IDENTIFIER = 6, + SCE_VHDL_STRINGEOL = 7, + SCE_VHDL_KEYWORD = 8, + SCE_VHDL_STDOPERATOR = 9, + SCE_VHDL_ATTRIBUTE = 10, + SCE_VHDL_STDFUNCTION = 11, + SCE_VHDL_STDPACKAGE = 12, + SCE_VHDL_STDTYPE = 13, + SCE_VHDL_USERWORD = 14, + SCE_VHDL_BLOCK_COMMENT = 15, + SCE_CAML_DEFAULT = 0, + SCE_CAML_IDENTIFIER = 1, + SCE_CAML_TAGNAME = 2, + SCE_CAML_KEYWORD = 3, + SCE_CAML_KEYWORD2 = 4, + SCE_CAML_KEYWORD3 = 5, + SCE_CAML_LINENUM = 6, + SCE_CAML_OPERATOR = 7, + SCE_CAML_NUMBER = 8, + SCE_CAML_CHAR = 9, + SCE_CAML_WHITE = 10, + SCE_CAML_STRING = 11, + SCE_CAML_COMMENT = 12, + SCE_CAML_COMMENT1 = 13, + SCE_CAML_COMMENT2 = 14, + SCE_CAML_COMMENT3 = 15, + SCE_HA_DEFAULT = 0, + SCE_HA_IDENTIFIER = 1, + SCE_HA_KEYWORD = 2, + SCE_HA_NUMBER = 3, + SCE_HA_STRING = 4, + SCE_HA_CHARACTER = 5, + SCE_HA_CLASS = 6, + SCE_HA_MODULE = 7, + SCE_HA_CAPITAL = 8, + SCE_HA_DATA = 9, + SCE_HA_IMPORT = 10, + SCE_HA_OPERATOR = 11, + SCE_HA_INSTANCE = 12, + SCE_HA_COMMENTLINE = 13, + SCE_HA_COMMENTBLOCK = 14, + SCE_HA_COMMENTBLOCK2 = 15, + SCE_HA_COMMENTBLOCK3 = 16, + SCE_HA_PRAGMA = 17, + SCE_HA_PREPROCESSOR = 18, + SCE_HA_STRINGEOL = 19, + SCE_HA_RESERVED_OPERATOR = 20, + SCE_HA_LITERATE_COMMENT = 21, + SCE_HA_LITERATE_CODEDELIM = 22, + SCE_T3_DEFAULT = 0, + SCE_T3_X_DEFAULT = 1, + SCE_T3_PREPROCESSOR = 2, + SCE_T3_BLOCK_COMMENT = 3, + SCE_T3_LINE_COMMENT = 4, + SCE_T3_OPERATOR = 5, + SCE_T3_KEYWORD = 6, + SCE_T3_NUMBER = 7, + SCE_T3_IDENTIFIER = 8, + SCE_T3_S_STRING = 9, + SCE_T3_D_STRING = 10, + SCE_T3_X_STRING = 11, + SCE_T3_LIB_DIRECTIVE = 12, + SCE_T3_MSG_PARAM = 13, + SCE_T3_HTML_TAG = 14, + SCE_T3_HTML_DEFAULT = 15, + SCE_T3_HTML_STRING = 16, + SCE_T3_USER1 = 17, + SCE_T3_USER2 = 18, + SCE_T3_USER3 = 19, + SCE_T3_BRACE = 20, + SCE_REBOL_DEFAULT = 0, + SCE_REBOL_COMMENTLINE = 1, + SCE_REBOL_COMMENTBLOCK = 2, + SCE_REBOL_PREFACE = 3, + SCE_REBOL_OPERATOR = 4, + SCE_REBOL_CHARACTER = 5, + SCE_REBOL_QUOTEDSTRING = 6, + SCE_REBOL_BRACEDSTRING = 7, + SCE_REBOL_NUMBER = 8, + SCE_REBOL_PAIR = 9, + SCE_REBOL_TUPLE = 10, + SCE_REBOL_BINARY = 11, + SCE_REBOL_MONEY = 12, + SCE_REBOL_ISSUE = 13, + SCE_REBOL_TAG = 14, + SCE_REBOL_FILE = 15, + SCE_REBOL_EMAIL = 16, + SCE_REBOL_URL = 17, + SCE_REBOL_DATE = 18, + SCE_REBOL_TIME = 19, + SCE_REBOL_IDENTIFIER = 20, + SCE_REBOL_WORD = 21, + SCE_REBOL_WORD2 = 22, + SCE_REBOL_WORD3 = 23, + SCE_REBOL_WORD4 = 24, + SCE_REBOL_WORD5 = 25, + SCE_REBOL_WORD6 = 26, + SCE_REBOL_WORD7 = 27, + SCE_REBOL_WORD8 = 28, + SCE_SQL_DEFAULT = 0, + SCE_SQL_COMMENT = 1, + SCE_SQL_COMMENTLINE = 2, + SCE_SQL_COMMENTDOC = 3, + SCE_SQL_NUMBER = 4, + SCE_SQL_WORD = 5, + SCE_SQL_STRING = 6, + SCE_SQL_CHARACTER = 7, + SCE_SQL_SQLPLUS = 8, + SCE_SQL_SQLPLUS_PROMPT = 9, + SCE_SQL_OPERATOR = 10, + SCE_SQL_IDENTIFIER = 11, + SCE_SQL_SQLPLUS_COMMENT = 13, + SCE_SQL_COMMENTLINEDOC = 15, + SCE_SQL_WORD2 = 16, + SCE_SQL_COMMENTDOCKEYWORD = 17, + SCE_SQL_COMMENTDOCKEYWORDERROR = 18, + SCE_SQL_USER1 = 19, + SCE_SQL_USER2 = 20, + SCE_SQL_USER3 = 21, + SCE_SQL_USER4 = 22, + SCE_SQL_QUOTEDIDENTIFIER = 23, + SCE_SQL_QOPERATOR = 24, + SCE_ST_DEFAULT = 0, + SCE_ST_STRING = 1, + SCE_ST_NUMBER = 2, + SCE_ST_COMMENT = 3, + SCE_ST_SYMBOL = 4, + SCE_ST_BINARY = 5, + SCE_ST_BOOL = 6, + SCE_ST_SELF = 7, + SCE_ST_SUPER = 8, + SCE_ST_NIL = 9, + SCE_ST_GLOBAL = 10, + SCE_ST_RETURN = 11, + SCE_ST_SPECIAL = 12, + SCE_ST_KWSEND = 13, + SCE_ST_ASSIGN = 14, + SCE_ST_CHARACTER = 15, + SCE_ST_SPEC_SEL = 16, + SCE_FS_DEFAULT = 0, + SCE_FS_COMMENT = 1, + SCE_FS_COMMENTLINE = 2, + SCE_FS_COMMENTDOC = 3, + SCE_FS_COMMENTLINEDOC = 4, + SCE_FS_COMMENTDOCKEYWORD = 5, + SCE_FS_COMMENTDOCKEYWORDERROR = 6, + SCE_FS_KEYWORD = 7, + SCE_FS_KEYWORD2 = 8, + SCE_FS_KEYWORD3 = 9, + SCE_FS_KEYWORD4 = 10, + SCE_FS_NUMBER = 11, + SCE_FS_STRING = 12, + SCE_FS_PREPROCESSOR = 13, + SCE_FS_OPERATOR = 14, + SCE_FS_IDENTIFIER = 15, + SCE_FS_DATE = 16, + SCE_FS_STRINGEOL = 17, + SCE_FS_CONSTANT = 18, + SCE_FS_WORDOPERATOR = 19, + SCE_FS_DISABLEDCODE = 20, + SCE_FS_DEFAULT_C = 21, + SCE_FS_COMMENTDOC_C = 22, + SCE_FS_COMMENTLINEDOC_C = 23, + SCE_FS_KEYWORD_C = 24, + SCE_FS_KEYWORD2_C = 25, + SCE_FS_NUMBER_C = 26, + SCE_FS_STRING_C = 27, + SCE_FS_PREPROCESSOR_C = 28, + SCE_FS_OPERATOR_C = 29, + SCE_FS_IDENTIFIER_C = 30, + SCE_FS_STRINGEOL_C = 31, + SCE_CSOUND_DEFAULT = 0, + SCE_CSOUND_COMMENT = 1, + SCE_CSOUND_NUMBER = 2, + SCE_CSOUND_OPERATOR = 3, + SCE_CSOUND_INSTR = 4, + SCE_CSOUND_IDENTIFIER = 5, + SCE_CSOUND_OPCODE = 6, + SCE_CSOUND_HEADERSTMT = 7, + SCE_CSOUND_USERKEYWORD = 8, + SCE_CSOUND_COMMENTBLOCK = 9, + SCE_CSOUND_PARAM = 10, + SCE_CSOUND_ARATE_VAR = 11, + SCE_CSOUND_KRATE_VAR = 12, + SCE_CSOUND_IRATE_VAR = 13, + SCE_CSOUND_GLOBAL_VAR = 14, + SCE_CSOUND_STRINGEOL = 15, + SCE_INNO_DEFAULT = 0, + SCE_INNO_COMMENT = 1, + SCE_INNO_KEYWORD = 2, + SCE_INNO_PARAMETER = 3, + SCE_INNO_SECTION = 4, + SCE_INNO_PREPROC = 5, + SCE_INNO_INLINE_EXPANSION = 6, + SCE_INNO_COMMENT_PASCAL = 7, + SCE_INNO_KEYWORD_PASCAL = 8, + SCE_INNO_KEYWORD_USER = 9, + SCE_INNO_STRING_DOUBLE = 10, + SCE_INNO_STRING_SINGLE = 11, + SCE_INNO_IDENTIFIER = 12, + SCE_OPAL_SPACE = 0, + SCE_OPAL_COMMENT_BLOCK = 1, + SCE_OPAL_COMMENT_LINE = 2, + SCE_OPAL_INTEGER = 3, + SCE_OPAL_KEYWORD = 4, + SCE_OPAL_SORT = 5, + SCE_OPAL_STRING = 6, + SCE_OPAL_PAR = 7, + SCE_OPAL_BOOL_CONST = 8, + SCE_OPAL_DEFAULT = 32, + SCE_SPICE_DEFAULT = 0, + SCE_SPICE_IDENTIFIER = 1, + SCE_SPICE_KEYWORD = 2, + SCE_SPICE_KEYWORD2 = 3, + SCE_SPICE_KEYWORD3 = 4, + SCE_SPICE_NUMBER = 5, + SCE_SPICE_DELIMITER = 6, + SCE_SPICE_VALUE = 7, + SCE_SPICE_COMMENTLINE = 8, + SCE_CMAKE_DEFAULT = 0, + SCE_CMAKE_COMMENT = 1, + SCE_CMAKE_STRINGDQ = 2, + SCE_CMAKE_STRINGLQ = 3, + SCE_CMAKE_STRINGRQ = 4, + SCE_CMAKE_COMMANDS = 5, + SCE_CMAKE_PARAMETERS = 6, + SCE_CMAKE_VARIABLE = 7, + SCE_CMAKE_USERDEFINED = 8, + SCE_CMAKE_WHILEDEF = 9, + SCE_CMAKE_FOREACHDEF = 10, + SCE_CMAKE_IFDEFINEDEF = 11, + SCE_CMAKE_MACRODEF = 12, + SCE_CMAKE_STRINGVAR = 13, + SCE_CMAKE_NUMBER = 14, + SCE_GAP_DEFAULT = 0, + SCE_GAP_IDENTIFIER = 1, + SCE_GAP_KEYWORD = 2, + SCE_GAP_KEYWORD2 = 3, + SCE_GAP_KEYWORD3 = 4, + SCE_GAP_KEYWORD4 = 5, + SCE_GAP_STRING = 6, + SCE_GAP_CHAR = 7, + SCE_GAP_OPERATOR = 8, + SCE_GAP_COMMENT = 9, + SCE_GAP_NUMBER = 10, + SCE_GAP_STRINGEOL = 11, + SCE_PLM_DEFAULT = 0, + SCE_PLM_COMMENT = 1, + SCE_PLM_STRING = 2, + SCE_PLM_NUMBER = 3, + SCE_PLM_IDENTIFIER = 4, + SCE_PLM_OPERATOR = 5, + SCE_PLM_CONTROL = 6, + SCE_PLM_KEYWORD = 7, + SCE_4GL_DEFAULT = 0, + SCE_4GL_NUMBER = 1, + SCE_4GL_WORD = 2, + SCE_4GL_STRING = 3, + SCE_4GL_CHARACTER = 4, + SCE_4GL_PREPROCESSOR = 5, + SCE_4GL_OPERATOR = 6, + SCE_4GL_IDENTIFIER = 7, + SCE_4GL_BLOCK = 8, + SCE_4GL_END = 9, + SCE_4GL_COMMENT1 = 10, + SCE_4GL_COMMENT2 = 11, + SCE_4GL_COMMENT3 = 12, + SCE_4GL_COMMENT4 = 13, + SCE_4GL_COMMENT5 = 14, + SCE_4GL_COMMENT6 = 15, + SCE_4GL_DEFAULT_ = 16, + SCE_4GL_NUMBER_ = 17, + SCE_4GL_WORD_ = 18, + SCE_4GL_STRING_ = 19, + SCE_4GL_CHARACTER_ = 20, + SCE_4GL_PREPROCESSOR_ = 21, + SCE_4GL_OPERATOR_ = 22, + SCE_4GL_IDENTIFIER_ = 23, + SCE_4GL_BLOCK_ = 24, + SCE_4GL_END_ = 25, + SCE_4GL_COMMENT1_ = 26, + SCE_4GL_COMMENT2_ = 27, + SCE_4GL_COMMENT3_ = 28, + SCE_4GL_COMMENT4_ = 29, + SCE_4GL_COMMENT5_ = 30, + SCE_4GL_COMMENT6_ = 31, + SCE_ABAQUS_DEFAULT = 0, + SCE_ABAQUS_COMMENT = 1, + SCE_ABAQUS_COMMENTBLOCK = 2, + SCE_ABAQUS_NUMBER = 3, + SCE_ABAQUS_STRING = 4, + SCE_ABAQUS_OPERATOR = 5, + SCE_ABAQUS_WORD = 6, + SCE_ABAQUS_PROCESSOR = 7, + SCE_ABAQUS_COMMAND = 8, + SCE_ABAQUS_SLASHCOMMAND = 9, + SCE_ABAQUS_STARCOMMAND = 10, + SCE_ABAQUS_ARGUMENT = 11, + SCE_ABAQUS_FUNCTION = 12, + SCE_ASY_DEFAULT = 0, + SCE_ASY_COMMENT = 1, + SCE_ASY_COMMENTLINE = 2, + SCE_ASY_NUMBER = 3, + SCE_ASY_WORD = 4, + SCE_ASY_STRING = 5, + SCE_ASY_CHARACTER = 6, + SCE_ASY_OPERATOR = 7, + SCE_ASY_IDENTIFIER = 8, + SCE_ASY_STRINGEOL = 9, + SCE_ASY_COMMENTLINEDOC = 10, + SCE_ASY_WORD2 = 11, + SCE_R_DEFAULT = 0, + SCE_R_COMMENT = 1, + SCE_R_KWORD = 2, + SCE_R_BASEKWORD = 3, + SCE_R_OTHERKWORD = 4, + SCE_R_NUMBER = 5, + SCE_R_STRING = 6, + SCE_R_STRING2 = 7, + SCE_R_OPERATOR = 8, + SCE_R_IDENTIFIER = 9, + SCE_R_INFIX = 10, + SCE_R_INFIXEOL = 11, + SCE_MAGIK_DEFAULT = 0, + SCE_MAGIK_COMMENT = 1, + SCE_MAGIK_HYPER_COMMENT = 16, + SCE_MAGIK_STRING = 2, + SCE_MAGIK_CHARACTER = 3, + SCE_MAGIK_NUMBER = 4, + SCE_MAGIK_IDENTIFIER = 5, + SCE_MAGIK_OPERATOR = 6, + SCE_MAGIK_FLOW = 7, + SCE_MAGIK_CONTAINER = 8, + SCE_MAGIK_BRACKET_BLOCK = 9, + SCE_MAGIK_BRACE_BLOCK = 10, + SCE_MAGIK_SQBRACKET_BLOCK = 11, + SCE_MAGIK_UNKNOWN_KEYWORD = 12, + SCE_MAGIK_KEYWORD = 13, + SCE_MAGIK_PRAGMA = 14, + SCE_MAGIK_SYMBOL = 15, + SCE_POWERSHELL_DEFAULT = 0, + SCE_POWERSHELL_COMMENT = 1, + SCE_POWERSHELL_STRING = 2, + SCE_POWERSHELL_CHARACTER = 3, + SCE_POWERSHELL_NUMBER = 4, + SCE_POWERSHELL_VARIABLE = 5, + SCE_POWERSHELL_OPERATOR = 6, + SCE_POWERSHELL_IDENTIFIER = 7, + SCE_POWERSHELL_KEYWORD = 8, + SCE_POWERSHELL_CMDLET = 9, + SCE_POWERSHELL_ALIAS = 10, + SCE_POWERSHELL_FUNCTION = 11, + SCE_POWERSHELL_USER1 = 12, + SCE_POWERSHELL_COMMENTSTREAM = 13, + SCE_POWERSHELL_HERE_STRING = 14, + SCE_POWERSHELL_HERE_CHARACTER = 15, + SCE_POWERSHELL_COMMENTDOCKEYWORD = 16, + SCE_MYSQL_DEFAULT = 0, + SCE_MYSQL_COMMENT = 1, + SCE_MYSQL_COMMENTLINE = 2, + SCE_MYSQL_VARIABLE = 3, + SCE_MYSQL_SYSTEMVARIABLE = 4, + SCE_MYSQL_KNOWNSYSTEMVARIABLE = 5, + SCE_MYSQL_NUMBER = 6, + SCE_MYSQL_MAJORKEYWORD = 7, + SCE_MYSQL_KEYWORD = 8, + SCE_MYSQL_DATABASEOBJECT = 9, + SCE_MYSQL_PROCEDUREKEYWORD = 10, + SCE_MYSQL_STRING = 11, + SCE_MYSQL_SQSTRING = 12, + SCE_MYSQL_DQSTRING = 13, + SCE_MYSQL_OPERATOR = 14, + SCE_MYSQL_FUNCTION = 15, + SCE_MYSQL_IDENTIFIER = 16, + SCE_MYSQL_QUOTEDIDENTIFIER = 17, + SCE_MYSQL_USER1 = 18, + SCE_MYSQL_USER2 = 19, + SCE_MYSQL_USER3 = 20, + SCE_MYSQL_HIDDENCOMMAND = 21, + SCE_MYSQL_PLACEHOLDER = 22, + SCE_PO_DEFAULT = 0, + SCE_PO_COMMENT = 1, + SCE_PO_MSGID = 2, + SCE_PO_MSGID_TEXT = 3, + SCE_PO_MSGSTR = 4, + SCE_PO_MSGSTR_TEXT = 5, + SCE_PO_MSGCTXT = 6, + SCE_PO_MSGCTXT_TEXT = 7, + SCE_PO_FUZZY = 8, + SCE_PO_PROGRAMMER_COMMENT = 9, + SCE_PO_REFERENCE = 10, + SCE_PO_FLAGS = 11, + SCE_PO_MSGID_TEXT_EOL = 12, + SCE_PO_MSGSTR_TEXT_EOL = 13, + SCE_PO_MSGCTXT_TEXT_EOL = 14, + SCE_PO_ERROR = 15, + SCE_PAS_DEFAULT = 0, + SCE_PAS_IDENTIFIER = 1, + SCE_PAS_COMMENT = 2, + SCE_PAS_COMMENT2 = 3, + SCE_PAS_COMMENTLINE = 4, + SCE_PAS_PREPROCESSOR = 5, + SCE_PAS_PREPROCESSOR2 = 6, + SCE_PAS_NUMBER = 7, + SCE_PAS_HEXNUMBER = 8, + SCE_PAS_WORD = 9, + SCE_PAS_STRING = 10, + SCE_PAS_STRINGEOL = 11, + SCE_PAS_CHARACTER = 12, + SCE_PAS_OPERATOR = 13, + SCE_PAS_ASM = 14, + SCE_SORCUS_DEFAULT = 0, + SCE_SORCUS_COMMAND = 1, + SCE_SORCUS_PARAMETER = 2, + SCE_SORCUS_COMMENTLINE = 3, + SCE_SORCUS_STRING = 4, + SCE_SORCUS_STRINGEOL = 5, + SCE_SORCUS_IDENTIFIER = 6, + SCE_SORCUS_OPERATOR = 7, + SCE_SORCUS_NUMBER = 8, + SCE_SORCUS_CONSTANT = 9, + SCE_POWERPRO_DEFAULT = 0, + SCE_POWERPRO_COMMENTBLOCK = 1, + SCE_POWERPRO_COMMENTLINE = 2, + SCE_POWERPRO_NUMBER = 3, + SCE_POWERPRO_WORD = 4, + SCE_POWERPRO_WORD2 = 5, + SCE_POWERPRO_WORD3 = 6, + SCE_POWERPRO_WORD4 = 7, + SCE_POWERPRO_DOUBLEQUOTEDSTRING = 8, + SCE_POWERPRO_SINGLEQUOTEDSTRING = 9, + SCE_POWERPRO_LINECONTINUE = 10, + SCE_POWERPRO_OPERATOR = 11, + SCE_POWERPRO_IDENTIFIER = 12, + SCE_POWERPRO_STRINGEOL = 13, + SCE_POWERPRO_VERBATIM = 14, + SCE_POWERPRO_ALTQUOTE = 15, + SCE_POWERPRO_FUNCTION = 16, + SCE_SML_DEFAULT = 0, + SCE_SML_IDENTIFIER = 1, + SCE_SML_TAGNAME = 2, + SCE_SML_KEYWORD = 3, + SCE_SML_KEYWORD2 = 4, + SCE_SML_KEYWORD3 = 5, + SCE_SML_LINENUM = 6, + SCE_SML_OPERATOR = 7, + SCE_SML_NUMBER = 8, + SCE_SML_CHAR = 9, + SCE_SML_STRING = 11, + SCE_SML_COMMENT = 12, + SCE_SML_COMMENT1 = 13, + SCE_SML_COMMENT2 = 14, + SCE_SML_COMMENT3 = 15, + SCE_MARKDOWN_DEFAULT = 0, + SCE_MARKDOWN_LINE_BEGIN = 1, + SCE_MARKDOWN_STRONG1 = 2, + SCE_MARKDOWN_STRONG2 = 3, + SCE_MARKDOWN_EM1 = 4, + SCE_MARKDOWN_EM2 = 5, + SCE_MARKDOWN_HEADER1 = 6, + SCE_MARKDOWN_HEADER2 = 7, + SCE_MARKDOWN_HEADER3 = 8, + SCE_MARKDOWN_HEADER4 = 9, + SCE_MARKDOWN_HEADER5 = 10, + SCE_MARKDOWN_HEADER6 = 11, + SCE_MARKDOWN_PRECHAR = 12, + SCE_MARKDOWN_ULIST_ITEM = 13, + SCE_MARKDOWN_OLIST_ITEM = 14, + SCE_MARKDOWN_BLOCKQUOTE = 15, + SCE_MARKDOWN_STRIKEOUT = 16, + SCE_MARKDOWN_HRULE = 17, + SCE_MARKDOWN_LINK = 18, + SCE_MARKDOWN_CODE = 19, + SCE_MARKDOWN_CODE2 = 20, + SCE_MARKDOWN_CODEBK = 21, + SCE_TXT2TAGS_DEFAULT = 0, + SCE_TXT2TAGS_LINE_BEGIN = 1, + SCE_TXT2TAGS_STRONG1 = 2, + SCE_TXT2TAGS_STRONG2 = 3, + SCE_TXT2TAGS_EM1 = 4, + SCE_TXT2TAGS_EM2 = 5, + SCE_TXT2TAGS_HEADER1 = 6, + SCE_TXT2TAGS_HEADER2 = 7, + SCE_TXT2TAGS_HEADER3 = 8, + SCE_TXT2TAGS_HEADER4 = 9, + SCE_TXT2TAGS_HEADER5 = 10, + SCE_TXT2TAGS_HEADER6 = 11, + SCE_TXT2TAGS_PRECHAR = 12, + SCE_TXT2TAGS_ULIST_ITEM = 13, + SCE_TXT2TAGS_OLIST_ITEM = 14, + SCE_TXT2TAGS_BLOCKQUOTE = 15, + SCE_TXT2TAGS_STRIKEOUT = 16, + SCE_TXT2TAGS_HRULE = 17, + SCE_TXT2TAGS_LINK = 18, + SCE_TXT2TAGS_CODE = 19, + SCE_TXT2TAGS_CODE2 = 20, + SCE_TXT2TAGS_CODEBK = 21, + SCE_TXT2TAGS_COMMENT = 22, + SCE_TXT2TAGS_OPTION = 23, + SCE_TXT2TAGS_PREPROC = 24, + SCE_TXT2TAGS_POSTPROC = 25, + SCE_A68K_DEFAULT = 0, + SCE_A68K_COMMENT = 1, + SCE_A68K_NUMBER_DEC = 2, + SCE_A68K_NUMBER_BIN = 3, + SCE_A68K_NUMBER_HEX = 4, + SCE_A68K_STRING1 = 5, + SCE_A68K_OPERATOR = 6, + SCE_A68K_CPUINSTRUCTION = 7, + SCE_A68K_EXTINSTRUCTION = 8, + SCE_A68K_REGISTER = 9, + SCE_A68K_DIRECTIVE = 10, + SCE_A68K_MACRO_ARG = 11, + SCE_A68K_LABEL = 12, + SCE_A68K_STRING2 = 13, + SCE_A68K_IDENTIFIER = 14, + SCE_A68K_MACRO_DECLARATION = 15, + SCE_A68K_COMMENT_WORD = 16, + SCE_A68K_COMMENT_SPECIAL = 17, + SCE_A68K_COMMENT_DOXYGEN = 18, + SCE_MODULA_DEFAULT = 0, + SCE_MODULA_COMMENT = 1, + SCE_MODULA_DOXYCOMM = 2, + SCE_MODULA_DOXYKEY = 3, + SCE_MODULA_KEYWORD = 4, + SCE_MODULA_RESERVED = 5, + SCE_MODULA_NUMBER = 6, + SCE_MODULA_BASENUM = 7, + SCE_MODULA_FLOAT = 8, + SCE_MODULA_STRING = 9, + SCE_MODULA_STRSPEC = 10, + SCE_MODULA_CHAR = 11, + SCE_MODULA_CHARSPEC = 12, + SCE_MODULA_PROC = 13, + SCE_MODULA_PRAGMA = 14, + SCE_MODULA_PRGKEY = 15, + SCE_MODULA_OPERATOR = 16, + SCE_MODULA_BADSTR = 17, + SCE_COFFEESCRIPT_DEFAULT = 0, + SCE_COFFEESCRIPT_COMMENT = 1, + SCE_COFFEESCRIPT_COMMENTLINE = 2, + SCE_COFFEESCRIPT_COMMENTDOC = 3, + SCE_COFFEESCRIPT_NUMBER = 4, + SCE_COFFEESCRIPT_WORD = 5, + SCE_COFFEESCRIPT_STRING = 6, + SCE_COFFEESCRIPT_CHARACTER = 7, + SCE_COFFEESCRIPT_UUID = 8, + SCE_COFFEESCRIPT_PREPROCESSOR = 9, + SCE_COFFEESCRIPT_OPERATOR = 10, + SCE_COFFEESCRIPT_IDENTIFIER = 11, + SCE_COFFEESCRIPT_STRINGEOL = 12, + SCE_COFFEESCRIPT_VERBATIM = 13, + SCE_COFFEESCRIPT_REGEX = 14, + SCE_COFFEESCRIPT_COMMENTLINEDOC = 15, + SCE_COFFEESCRIPT_WORD2 = 16, + SCE_COFFEESCRIPT_COMMENTDOCKEYWORD = 17, + SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR = 18, + SCE_COFFEESCRIPT_GLOBALCLASS = 19, + SCE_COFFEESCRIPT_STRINGRAW = 20, + SCE_COFFEESCRIPT_TRIPLEVERBATIM = 21, + SCE_COFFEESCRIPT_COMMENTBLOCK = 22, + SCE_COFFEESCRIPT_VERBOSE_REGEX = 23, + SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT = 24, + SCE_AVS_DEFAULT = 0, + SCE_AVS_COMMENTBLOCK = 1, + SCE_AVS_COMMENTBLOCKN = 2, + SCE_AVS_COMMENTLINE = 3, + SCE_AVS_NUMBER = 4, + SCE_AVS_OPERATOR = 5, + SCE_AVS_IDENTIFIER = 6, + SCE_AVS_STRING = 7, + SCE_AVS_TRIPLESTRING = 8, + SCE_AVS_KEYWORD = 9, + SCE_AVS_FILTER = 10, + SCE_AVS_PLUGIN = 11, + SCE_AVS_FUNCTION = 12, + SCE_AVS_CLIPPROP = 13, + SCE_AVS_USERDFN = 14, + SCE_ECL_DEFAULT = 0, + SCE_ECL_COMMENT = 1, + SCE_ECL_COMMENTLINE = 2, + SCE_ECL_NUMBER = 3, + SCE_ECL_STRING = 4, + SCE_ECL_WORD0 = 5, + SCE_ECL_OPERATOR = 6, + SCE_ECL_CHARACTER = 7, + SCE_ECL_UUID = 8, + SCE_ECL_PREPROCESSOR = 9, + SCE_ECL_UNKNOWN = 10, + SCE_ECL_IDENTIFIER = 11, + SCE_ECL_STRINGEOL = 12, + SCE_ECL_VERBATIM = 13, + SCE_ECL_REGEX = 14, + SCE_ECL_COMMENTLINEDOC = 15, + SCE_ECL_WORD1 = 16, + SCE_ECL_COMMENTDOCKEYWORD = 17, + SCE_ECL_COMMENTDOCKEYWORDERROR = 18, + SCE_ECL_WORD2 = 19, + SCE_ECL_WORD3 = 20, + SCE_ECL_WORD4 = 21, + SCE_ECL_WORD5 = 22, + SCE_ECL_COMMENTDOC = 23, + SCE_ECL_ADDED = 24, + SCE_ECL_DELETED = 25, + SCE_ECL_CHANGED = 26, + SCE_ECL_MOVED = 27, + SCE_OSCRIPT_DEFAULT = 0, + SCE_OSCRIPT_LINE_COMMENT = 1, + SCE_OSCRIPT_BLOCK_COMMENT = 2, + SCE_OSCRIPT_DOC_COMMENT = 3, + SCE_OSCRIPT_PREPROCESSOR = 4, + SCE_OSCRIPT_NUMBER = 5, + SCE_OSCRIPT_SINGLEQUOTE_STRING = 6, + SCE_OSCRIPT_DOUBLEQUOTE_STRING = 7, + SCE_OSCRIPT_CONSTANT = 8, + SCE_OSCRIPT_IDENTIFIER = 9, + SCE_OSCRIPT_GLOBAL = 10, + SCE_OSCRIPT_KEYWORD = 11, + SCE_OSCRIPT_OPERATOR = 12, + SCE_OSCRIPT_LABEL = 13, + SCE_OSCRIPT_TYPE = 14, + SCE_OSCRIPT_FUNCTION = 15, + SCE_OSCRIPT_OBJECT = 16, + SCE_OSCRIPT_PROPERTY = 17, + SCE_OSCRIPT_METHOD = 18, + SCE_VISUALPROLOG_DEFAULT = 0, + SCE_VISUALPROLOG_KEY_MAJOR = 1, + SCE_VISUALPROLOG_KEY_MINOR = 2, + SCE_VISUALPROLOG_KEY_DIRECTIVE = 3, + SCE_VISUALPROLOG_COMMENT_BLOCK = 4, + SCE_VISUALPROLOG_COMMENT_LINE = 5, + SCE_VISUALPROLOG_COMMENT_KEY = 6, + SCE_VISUALPROLOG_COMMENT_KEY_ERROR = 7, + SCE_VISUALPROLOG_IDENTIFIER = 8, + SCE_VISUALPROLOG_VARIABLE = 9, + SCE_VISUALPROLOG_ANONYMOUS = 10, + SCE_VISUALPROLOG_NUMBER = 11, + SCE_VISUALPROLOG_OPERATOR = 12, + SCE_VISUALPROLOG_CHARACTER = 13, + SCE_VISUALPROLOG_CHARACTER_TOO_MANY = 14, + SCE_VISUALPROLOG_CHARACTER_ESCAPE_ERROR = 15, + SCE_VISUALPROLOG_STRING = 16, + SCE_VISUALPROLOG_STRING_ESCAPE = 17, + SCE_VISUALPROLOG_STRING_ESCAPE_ERROR = 18, + SCE_VISUALPROLOG_STRING_EOL_OPEN = 19, + SCE_VISUALPROLOG_STRING_VERBATIM = 20, + SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL = 21, + SCE_VISUALPROLOG_STRING_VERBATIM_EOL = 22, + SCE_STTXT_DEFAULT = 0, + SCE_STTXT_COMMENT = 1, + SCE_STTXT_COMMENTLINE = 2, + SCE_STTXT_KEYWORD = 3, + SCE_STTXT_TYPE = 4, + SCE_STTXT_FUNCTION = 5, + SCE_STTXT_FB = 6, + SCE_STTXT_NUMBER = 7, + SCE_STTXT_HEXNUMBER = 8, + SCE_STTXT_PRAGMA = 9, + SCE_STTXT_OPERATOR = 10, + SCE_STTXT_CHARACTER = 11, + SCE_STTXT_STRING1 = 12, + SCE_STTXT_STRING2 = 13, + SCE_STTXT_STRINGEOL = 14, + SCE_STTXT_IDENTIFIER = 15, + SCE_STTXT_DATETIME = 16, + SCE_STTXT_VARS = 17, + SCE_STTXT_PRAGMAS = 18, + SCE_KVIRC_DEFAULT = 0, + SCE_KVIRC_COMMENT = 1, + SCE_KVIRC_COMMENTBLOCK = 2, + SCE_KVIRC_STRING = 3, + SCE_KVIRC_WORD = 4, + SCE_KVIRC_KEYWORD = 5, + SCE_KVIRC_FUNCTION_KEYWORD = 6, + SCE_KVIRC_FUNCTION = 7, + SCE_KVIRC_VARIABLE = 8, + SCE_KVIRC_NUMBER = 9, + SCE_KVIRC_OPERATOR = 10, + SCE_KVIRC_STRING_FUNCTION = 11, + SCE_KVIRC_STRING_VARIABLE = 12, + SCE_RUST_DEFAULT = 0, + SCE_RUST_COMMENTBLOCK = 1, + SCE_RUST_COMMENTLINE = 2, + SCE_RUST_COMMENTBLOCKDOC = 3, + SCE_RUST_COMMENTLINEDOC = 4, + SCE_RUST_NUMBER = 5, + SCE_RUST_WORD = 6, + SCE_RUST_WORD2 = 7, + SCE_RUST_WORD3 = 8, + SCE_RUST_WORD4 = 9, + SCE_RUST_WORD5 = 10, + SCE_RUST_WORD6 = 11, + SCE_RUST_WORD7 = 12, + SCE_RUST_STRING = 13, + SCE_RUST_STRINGR = 14, + SCE_RUST_CHARACTER = 15, + SCE_RUST_OPERATOR = 16, + SCE_RUST_IDENTIFIER = 17, + SCE_RUST_LIFETIME = 18, + SCE_RUST_MACRO = 19, + SCE_RUST_LEXERROR = 20, + SCE_RUST_BYTESTRING = 21, + SCE_RUST_BYTESTRINGR = 22, + SCE_RUST_BYTECHARACTER = 23, + SCE_DMAP_DEFAULT = 0, + SCE_DMAP_COMMENT = 1, + SCE_DMAP_NUMBER = 2, + SCE_DMAP_STRING1 = 3, + SCE_DMAP_STRING2 = 4, + SCE_DMAP_STRINGEOL = 5, + SCE_DMAP_OPERATOR = 6, + SCE_DMAP_IDENTIFIER = 7, + SCE_DMAP_WORD = 8, + SCE_DMAP_WORD2 = 9, + SCE_DMAP_WORD3 = 10, + SCE_DMIS_DEFAULT = 0, + SCE_DMIS_COMMENT = 1, + SCE_DMIS_STRING = 2, + SCE_DMIS_NUMBER = 3, + SCE_DMIS_KEYWORD = 4, + SCE_DMIS_MAJORWORD = 5, + SCE_DMIS_MINORWORD = 6, + SCE_DMIS_UNSUPPORTED_MAJOR = 7, + SCE_DMIS_UNSUPPORTED_MINOR = 8, + SCE_DMIS_LABEL = 9, + SCE_REG_DEFAULT = 0, + SCE_REG_COMMENT = 1, + SCE_REG_VALUENAME = 2, + SCE_REG_STRING = 3, + SCE_REG_HEXDIGIT = 4, + SCE_REG_VALUETYPE = 5, + SCE_REG_ADDEDKEY = 6, + SCE_REG_DELETEDKEY = 7, + SCE_REG_ESCAPED = 8, + SCE_REG_KEYPATH_GUID = 9, + SCE_REG_STRING_GUID = 10, + SCE_REG_PARAMETER = 11, + SCE_REG_OPERATOR = 12, + SCE_BIBTEX_DEFAULT = 0, + SCE_BIBTEX_ENTRY = 1, + SCE_BIBTEX_UNKNOWN_ENTRY = 2, + SCE_BIBTEX_KEY = 3, + SCE_BIBTEX_PARAMETER = 4, + SCE_BIBTEX_VALUE = 5, + SCE_BIBTEX_COMMENT = 6 + diff --git a/tools/WEE/scintilla/License.txt b/tools/WEE/scintilla/License.txt new file mode 100644 index 0000000..cbe25b2 --- /dev/null +++ b/tools/WEE/scintilla/License.txt @@ -0,0 +1,20 @@ +License for Scintilla and SciTE + +Copyright 1998-2003 by Neil Hodgson + +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. + +NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/tools/WEE/scintilla/SciLexer.dll b/tools/WEE/scintilla/SciLexer.dll new file mode 100644 index 0000000000000000000000000000000000000000..d0ac86c5f1e26c896669255ee00b1ce38c59439a GIT binary patch literal 753152 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�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%0D1^THhjW5v?>HmdrE08h0ZeJxj@26L5@F) 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 FJ8?$v zMklXrUP33jL zre02R6R{=4qBUITf~P5(aWfxAoE}U~VELwYT_gxA)hq zL`3#*tKL+tdedS#P#)7rKEXtxHm5t)o5DLz=}>ufu&HmdH+i}@F)TN25>JzCP zh;V3FS`-rih5$!dd*#F#r5T{BNZzEIX(+QHmV3TPCSCgxLTVz#?zuQA#Xfh<|7TL{ zIaI1fy(&`dT2lR8)rlfcw-kGCk{Z(LwHv$lPf7Xm6;h^Y*>|=3l$3u;N>#lmbgJL? zNU2}miz7GtZO_zw9%6<|YGwUeNj-tCQmX7`iODAw;SyTJbJl>; z9l0L!d(X>HpsCVj_NqVnb*?8eb6kxoCS&4!{n?w(>5+<`>ugh9)|(K(ZvN1n6#rjI zBPm(wKjs1#kjOwbi)DZ23YLA%5tjXJY$5DUFOr4-VrC@Vjw)EIbyAI>Y;EMR%>1yJLR%wyjej3dxK{;(Tqp8?FuBRR}39B$E006WU5QPV&N&|7R*ACpO>*i``7 zlUk6oq=3C3-NJIOF&iQ{m!n?bON0kAw%;sk_3{VInmD4-GLhB{tTP`UT;lQUwws7w5Z14wn z$E*yu8ks5Gd0E}fw9Hil>`-J)sR|MixMW6RJ z8KrD4N5LQ<9cGzNQ7|}X@3&Xw6?OYtfaD%J276gMq#KAAlZs#*&_amdBT-onrs4z3wYWWskfoIM1<&Z1s_n33l}gUFYwKS%Oi$%yvk3A zo#f$RrQ1A3SXlanu<)u6^*c+{CNT7i{6((V00uD?EIDc4H-J3|yquT&pTJ=!f#XUrSFPR(e1!X(O@53jgV}IqW@E#s)SNHom zQNABRU3^7qxN{z%7PPkhB7 zOwCEQzLCmA?5gnjBR}7spe`&Mi*Pa0!7xRJaveu}n}&mvB67?B>Wz`b12&~&rw{wX z313S~`b4Xx@q=((bH|MDZ$hA++}Mk0g``Al-*0v> z-o9Y}au|#0FWyC%M?yzdZS1YN;jR^Lwx9_Cr5vvg8iNfKAjJ;A>x;}Iv$Ke4kzE;f1oD_CD z3WM=0th|P_h3;&zb%Q47k8ykNI|-A<706CYSSK;ygPhV5W)mDad(jsM&OCtksT?fd zb?s6E?0OOF5o@)r@0X}sUAZwje;8tE~PPZ`80 zVi-gj9l>B${9J2UYysi(tc8L2_}Hh?4c*y{Z*7c=rF&a*hVQi(`mp(<(woAqpuGSMy_X5J`f zzpoRmR?Lq1#q8K+<`rTsybgygCcPVC&JDzyOkUz6%?ktZ5oknWJbY>(zQmj)*22G! zJruDoK1uA04-)(06=Gj}ir5#Q%<5pB8Q5};z?MdVEu}qR%NQ%Cyu%2Ju!X4D>ww4! zG)%_K%pk%$jo=+RvBD~loVO4t-)S~AOj%U^Dd{`R8wmcm{4>dGUPbsytTkXiVTTy1 zIfsu9(Cw~9{ei6zN!m&0b<$4rJUeNpXvL4zNf?O`yA3-re6H;_?4|5j!@o@~S+Lkq;kZSXw;kX7vE_Kl7>@d!j9Mo3`H~R|^VUR7? z;p=ii;rU!m<{8HY>gKQ@19?*LZjp%W@O|wrd!zgvBPg>S=*(%l2|+sJb}<+i=)~T5 zi~bmjp`XshRvp_fyn{O3D%XbKne4IHwSg0Bt;|c&*(na3u&lfZ^9!s6mo{X?3IiwR zTh$V*y0jsOthJmYp?zYd4Eem+_b1H%8fSrYtjir6Mm`gO!`4J7pDzCvlD`103BIq* zf3n*V;p}p^%-3EE87i;uLo;N)?12;f8$mJXpB(zvJfjB+5Vv#xndFM0r~ruh{UHr~ zVuQ5E;~7lkR5Yu71;7E6F|pUAg>Yh-up@xIuc>D#*e$wuKQRWTLT0K19nE2WLrEHxmNbjmET$tU*m&j#S+nLZxA-t`|jz{ckxPv!zczu$KNKi7Tk0kR@-a5o>=DK+yh)~oMj^jMOt4= zNBISJ;qHit%x-u8dWn|{!C-z<@O1(cWVi)OIk@)rKw`Kmpmw%NS!X}=)otww?@+%7 zNnqpW;Yf#D2rc!@Kvr7JC#Q_1qt_*J%y1*YGK?f5gIkw_R-z-$BqE3W3)Cj6;h?qc zmm9YW{N^!t3U&JRG-q-3utI|B#2^P3xJ>acLFD=y{|?jPZ;!cy2e<^Y^!W(CZl4g5 zq^n`t)K+S7M0)3d%5~3zjl^xu|JE)pNbTZq7Do1%_+s6YJ%JO0tskO(9z$E?WVx@v z-xob;>8|97S8{TPm>+`JPej=M?w(Dt)931AAzcL5vAZZDYr2bWs%JymyY3*sRzS?& zz=`#1UPt93I*Wk=ljq3u$=3IY;e1gy3=-8$yW!Vq`KTOze9QymIy}6anjRot+q z-5fu6kvEWl6{B@16L_lFNTv9AFn@%1d9yx{C`54xTls-RKXLXumj_2N9jQ?J!KoK5 zif+=`ds!oB2@e=r(~mPfn`V1!2?X3nF&(jN^Uo{`b6GBMr1aWTi9t{db1muqY3J- zQ|!&o2xg@sw-O1D2<@-^n7Kxth@5(o!#ejKWT{I+Usz)yTNMwnh6OqYSwqk@#Xx59<${bPt)u$_*>FZ^(B$fFbJ(+6m!bog(iliUg!~K zGS#g@yRWla8Gyh`S%bT|NRX^}w^Lp!?zzK=xkX1^}4Ps7JOtus=>TBeL-|48KU-`8mmYmtp)Wzx-WG zyd#uM7Smf(tTPCUS-6tPjDg0}somS)sfslq?{rX$E}MDDp2bAdr&vv}qcd=NJz17% zsMUvcWaEorqGI(LG7d4Zbyqyt>aPbNb7zlQHnPE{L8rKnmggYd9>hMhZK++nI(UtZ zkF#-gPh3@ch<_%P$se!I=Oq_Fz=~s(AZ3)=QpZ8uSgOzNDUWP9-#oIj|BHF~ux_W< zB@fd*htRKmloa(tgw;}y)A7WFBbEGb{;QB4c&XM9Xsv$S2*%mgz=?>pM=jeNy zB7;3Tw%Pxz%Nky*ZcIjrU6=OQ>7smiMJf)@z0V6(zPIlTZ9goBrQhf@3~Z61OU$P}P&LuF-3a}G$qD-&raB{B{dn_VpV4E2dcQ5~Z^tWD z_{)5>q91jk!zRg3=;SP0D>_`)t{qgp<|>g&_9U#WHq#BgXj+iXMil(BlCZVK-bfeA zMzXfrdr7*&erm0IxV3JZIWQb*2D_GSS$%cs{LT%p3&Uf9TpuN}jb-bGeVbc-+sl0q z7`N=={DFFhBXTm(klyizP(3CP__l_$a1m6-Uu;UISAF#)M891bbJeBowuW@W^6h_{ z4^49!-dk{EhW@hL`miClsmv$PLKaOMYm+>Zl)^#}$OhkOq7~ih+lO*%#ClV`PJ&G! z-lXoMfyhM}k@?%mm##MA0U~@X;(JBC^z*NUno9N?$s%8p!=>s8C9FpQXcmIt67Ny- zh*NXu(aur~t8L#X9en=Po*jJp2y}YXskf=6k4rDH@9gyQ0_kN(nY`=LW=Z#2{jcoy z?VG`Zt8++OP?iv#{7)HNxcbq+j#O9Q-;wOXV1(Ayj)Q><;d$2dBEI{=p8^47d}uIV(kYuRhx?63Sl;8vTRn#s zZ~RMQ{ROZf@Aln0(x0O=+wkcu`*o;N9eUEh}rnh8u z%yh%pz5YE%OM2sD1!_zh)Jh>&W;X9ii`6vy?{%3Ok7dPX+WN^Y>dP1Pm@*#Ai=B(A z&KO?J)XV+eNS%nboqn*fqW7pe9yeZ`UhdrL|`MSn~6#)RoClQ!__Bk zLf(JBE+jme9lys_+jOpAbI^i2RFSl?%*w!?k+^+uH=T~=N?+12hoCzDOyXGcaK#Ao zJv5%{w0^rhZsD>G{%&U?fBwF7v4=B}2Z<2d8>hPen2NWLGV%eSaR1>a4-ptxw%vb_ zADpBxRwRBvhJuD+hAay+WHD3?aUaryaJKFAzwNPB)@nZ&T zl{m!>cKF%`Gr8xAy>Aif@uJ{&cFO9cmP&!r@&$^&Wa#$baSRTmWlCH_LW+$F_*b)C znp>Y1{WY}ge9f|paOn<>)Zvo`J{pLe#LKPL#tz>-B^|zSiTd-OxJ#>ptxt={bomJ* z(n|JNdYkXw$QpNx?@rkK9h7)tEiVQ2xGU*@+}EP`*f5r&5m5|#8e-<>VKw&?HpR2u*~ zBKHbU(UJ6jSxuk=n)IkSxtdhF*l>rx>Rh_KIEb7T!#-jB)3Qf!^P zhnX|v7nsjwmX|H;zjv9K;c8E#E72P%DBTyA=r;Z^4ZNJyS5KdNO7FMoClE!#dPLL7vtXJ)gXYdSG6OWaOBP;9>odVFcgNADIZv z`tMLQ~#vuHfvB#w358^r_h83 zb!VPsIL%y18CjAx-#sn9u-*dqpg$ZmHe#1Zj%C2V5otANH7}f#TFXD`caJAlh?NQq zSkZhDRfz!!Eq(CQmzY|SKG2sA=GqIiwr$e#pf;qgK@GO^d^zQvH;yge)ig2z*ySak zqfaVur@Yh3Y^@X5K_V!$pj%J~Qd!-xr{7+YE%!2Z)Oq>e4bi3*zM~KMu7T(nXK$!3 z(4rh7mUS_SXhj>5157-iHLxSCwYo@vOkXt3lPa-3rHpYhhe$W2jExLL9lQ|glMwIv zGI0d+%v`A~bca$rm~&he(iF5MisWpU_O0|>Urs2F&VF@HtN-NlVvc^0 z|KyO@CsvkXf>eWX(6GL`GWxjAXVk~%7X@~9 z$tdZcNKI+OhUnnan~fs+u8E|Pszl&K)0$piWQ07&^E_@d>09d?37%9!c&FM;Y0%ex zkqbB*O>6SL$hcbyr&&q%BYA$M^8j3T?u!+DBV&#wvX+6Jdtq$NE6p&rwD02e+caS) z%92f$L!rWTsE?Ukeh$gc%;NHyIoH3d&4$dZbb8j;=`zA94F#$n8%h}Asz7#Dhk96- zn;>rN(GFMl5mcM$(vn?H@lvOF8c$;wJ?Gd%!g8pnUUsN@3dBBAUqB+_66hDpCT^at zvr@gUBdvce(OgS`k{ga@04$PsXQ-LAhCcOa12-~d+Gb8@;S!x$S(ccE-vV9Zu(^@C z4Q(?kTV|Bg-B~I=_GDs1B0)j3fShW%-NrvJV?wUCreGwd8R*iCwB!aeJ>qMwQO}-W zL&XseP|r}7Y?w_T@J9j+Xn|Tw4WfS!QqnPhf17N=nZ@B=w&~Q1M?-3Pa^C_q z+s;-FuN6fx7<{V}@7AHM(4`(d*#yb*RyH9$`EY zXZPxiWThX-RU*9#M`V_kmc6<}{j@`#2|#WRy8mg7SY|hPqGGjy$5}R72+|o|bHQ(%lpJ_?d9fR* zpuV0rPK~+|6jPl|(KLx4K}Y+2{5h2e6%99I9?FdJV-KCgUwOoL9L4o!wW*EUjGsP2|#ph-#d_5JnDS829h@U10tRuoyI>b z^H$+G53##+vU%0j)Pl<~sn-aWkU`h|1??vbU;jZ=Rv%A$Rx!^UDKuW1=6OIaCCXmW zj~SGh_7!(Z9);j;BKoF|Dun_nW_P{HWtZ7Pndo-X956J(fma!3i5z$7NzG(Ysg3Oo ze6>W|1KvRHhJu(MK=uxVCqO_xbRz_?7-4L+Q&0aS+%tLadlTcx;Z+r~!OBTn#15aM@ zPd5xI^jdZ42)kFdDpEY(4`%^dV-315jd{4-4yXcxIKUx#c4=eyVlimHHhi%dsxKCz zB!8=F!n=~*o?FCQ&r>I{d!=5e*1nz1=wxtFHb@P40lASc3-6@nnV6k@%q{5V9j}10 z8o_e@2NWOu*%wvj%qsi>s0<_YZ*W`2y-?i|)#JuK4KZbja}Pv!B$GVPW9&f?Z*ATk z1-zj~@L3XL`*q1rpL3FbOB}N%$@lXKU9@5(+bGag&y3UIxDhed{8D$6x^XW zH=qfoa)*HhWR%ZZ8|?_{R0zgy?Oki$QjV(Qs2MkJ&6HGg|Dr)j;cljp=YuOc2UwTN zB#sBa*CPkLa7D-V%<*`sbU+p8OgJkeO{&reeHH;ay->Uc6sZIVseUaZ`(t5gZdP;~ z4a)eIVG_+OT~@0Oo|2^@ZD};(WWnk*bF)lMRJsyCT2}0RDLcd(z|XS5)@f{tRj!8I zrRC+8fE8MRv#4l&q$DN0gXn`OT6R)33A0A zm2!i%8?|{u%u)=8Uct~Lav1H>{0PfvC?Nad60&R8($a2yi`4nn`^h@rX3yZ{SFU#5 zt(<4|LR*t`=t{ej)+k-{0V%pg7nLvvXh8jp{=~H;s|&SJ-MI&_=w8o9{X$8+#z{0k zmd*{gSA7^7Uxex`gP(bqAu{W%HR_F?*z-IFjG(XwklZqYP#5^XSM^^RNo4hLTn8Gr zmC%4xF$_+I9<4Z#DT&-HCS$zRworzxUK|QA;`l}1lsa_#L#4$L+TnB&@}Mk{*M+WB zkr-IRIf8T``fEG4$ypK$7U3NuIjCC8_qR?xSEAryf6lw!2#In_WLlTK-&Oy!p?_8y zA-`n6hq)(O>y*N(th5fF^m1a7y|jHE(>We87uq?+%<2?Ao&KP%rF*~F%7Xp1D)y8N zWw1S!i?xCigsIcC_u_?vC5O3(|26u(Hj$ta5njkhW=3r5-*SY2OgOdL-U{?$zYkc| zAb|T&4)#KhuvkQ@2->euA-e{;R)NWM%?4}fy4D&(xq0fh$#U`t(`C?QQ(3x{)ksf^ z^DOb8ywG-KGEc3w3s}n}a)q|?y3l9!)0HiD(q@o0Z;UBikcA`dETiqsz5=8Br1{K2 z0>MIwwNg;*X^0s$Q++UmcOI7&2#8!8C2A+DK}rQ;dBcobo}hjmeVasYEZst%xf)<+ zOn8>wCvS+4KCl79K$_x)D58lBRl~e7LAp0N)jdd3|JkooruJkaw+Gwuf9coBRjO|k z2fetHMQX@c>UeeX;3c5a_8Q<-J{bb061W0jt%E8|j{aHJD4wHLip4BJmHOFX-D%ru zZ=kE%2<;+I^bVad%UZ|CX7D##WdH%R5@+a_r1kXNRDhEo=B(cKBk=^}CGL9dxk)xq zY*sRDxw@}M8t2m$8<|X7ru=r=8Em}DTuDQ)F5NoKcD^J$TiavPYDOO$f{`|vdXTDK zlEGXnr38T6nSMkjSfiDC3ssdP!A0Jo=B(6UG+qu4t%35nx+W`qfwnkYH5qbWc5DE7 z?HRhsUTg6ZQtkLrvT?8v*-G@^qt^4mL_283bxE{hhD7)DqxA2m>@Ac;C4|}7jY{kx zgs_IZsON^?)^;LfN3bz)W0MoEEYJ?WgcZw?-t9vMoZ5I=FUP;L;2Z_vujoyYIy9(9 zZvt;{DLmaw)-q8Ju5clz#TMyy{8b{Il%aCo8y5c%aWYKHixft@P+ML`jDIjlE%OKI zK-$HV9J|PZKB?25q@SpT7a3aGRgMrw{J_5CB@?m?Ig^=_HNMJ(X zfc^kYc!Q7V?<8~rdvF56%Rl#@U90l!BHRE-Iwt+Hz?hY;@C^GIC3)}?vX6EnW7_lBrjH<{h_;bjwI*zNM5G?u9LAWLy|P0UDR+B zGJ;$Lcso@5fUu^Fp!i(VhJVXn=RWDGFhU+;cu%7t%ZHx6>8w^%AY5D+*Oqe)UWztx-@Cpv?dKoO5Rq zwD14@y`R^QWX^rgzCY(#huR_)Shw3WCQGGD)}KqlGXw2XW_JSj(I1F4=sr!Glu4|b zN4iK=u&t|ekxt}%LZMt&1MMa$^kpeDNVdptagbxxi9r+h!7x~IjunBNQNiu|f@eBe z_e^b%{hvHyd+8$C7v_nv9~j4LrYtg^HS#i%)rAW@bC*o=!y(F|ifS^HEOs*$I%OPvMcZ6#aHr$UDObbrReoNl9>;jpsH zjI*_-Tx?RpjL%X%?;zm`7DZZBQaDI`h!x!}Z|g3S+L_&ye=Uw?4=^n3|J2BQA$y4b zkP7i1GJ$h7)48OoldiLw%Jk&jLqOJJo<8$SIyu6yH!r(S%($G7f3}{;6syOsm0MC@ z$tA^jh3%|MdYl4GLUG@kDc56(dgDXQ*-Qr2$kf&JCsnLqYZbI$Q~S|=fIFTqzj&?v zd}$tLbP=alxVnf~%KZ7|Q2t{YiU~2#p8rwHJHq4M+fJ#QfaCEKR#R@8rqIEF!l}m* z^s%O8Ypc)L%WNoBurIocu9lX9F>H1f+Swqs7msT#&C4DZmU_GSS^)@#^I0H} z0}DPuqobkn;A$V~pu@FjUBj>Y(p4;d1`Z=f4F#^OzB1}+F8U7R_ynq>RxU)a^Na^| zT-fAi5^4hf@gUS1O>~CAJxU&b5Ovd$&O}%`m+5kgL0KNAU^viuaG=kNmL3mAJ39lR zGcFelA6<@$|VQf&9JUYl4r zCR#Q{n7bGDhyA)$t<7cM?+;BJ8<#5|i$|{*scIOOha<@yvz_Xvv&|x#)Unpo@pm{4 z$JDO@#`KTIuY=!u32oh4HMS{wH4T3n&IZe`!M9s@ZN6<>jiI(GY+N_^kk;6@JuN}a zrvT~LcY0N`e53~wFx3sv)j7k;)t)09E%m<5QD-wxIqA@ire$xl93%tYNA2CgfXWK_ z4lIE}cmVR%Zgun-eH(PzF;VP4cp`|Fo|R&odZ#@F_n-%9#j{iFR2xi+zLX*FQUCld zoJus{Ur<_wl$Tg961&IL&uB?(I0_zOIEFC-u64~|^BjXMqI;YpbSE%_T;mE#IOPDFDzyi3>g1{4 zo+Fga>+>~n{<Crab*kS> ze1iWK!o;uX5MQAllsKb$O5CEe;_i~Tq?qHS>(7dtD{;ww8~fViD?BUi3W-bc?=Aa`W>yNj05ipe~@oD}iP5j}G@tY<7v!4>5?$4#~)V)dK7q)nU z6E<${l;yEUzb(JezCCt^))}3yB4mhOGF^Qxzdo+5md2t#>QtzV{*@&*c(N;Fn4~#+yxDD{lTeo_*m31 z*KU}*tbXo_hV?ZZDh=yv_1}8_)~^?Sb;J6#V6P49AJBi-@wa~cBRaeRys%;Yllt#7 z{HF{REZZ@pnrvL8bZ~gk+I=l}*f(`2r=)VW~TfhFW z4j)0Js$u<6{a5j~etk24L)&NLv?0{i_`1aJNRy7LJ&%L8zb*x-tvV=msU{ti=BVH4 zptM*$u7lDk^^guqzttKE-nmHC@*A2mf6TWizThNo=pF{O;m-LDcP?nS)8BY)*1Wml zuR+!277cFBkIAfwCZ+3FY8=EH?iuV1BO-M`eRh8b9m*xyqAgpxzFk{(4YREMO69bx z%HBl@9aLr2GiMd})9)8}`qB0Rz3m15HznDAZrQHd=Nh-{v(!FEeYb|)>X+2eQRnlo zYmLt5#2l?jkRorp7T$S8kKaEOmOCB?j^CyP&EH_grY7FPF zDyIyzTaq|Su{^>PCW|A!wR?5UOpJDqhMjkmK13caXL1PD7B}3uC>j|jsswm{CoZcf zQRMYbS2Qi+Fi@Ys6Xf0;g6uqU>7U%^ic0~amw8Ld_2}5_vt$u4NVf3tACPv7D|;??I_78zRic| z0B$YM)d3t`3Q2x?I7L1w@;sEv_$lTl=Lafpent{($FKD<` z_br$w@A(D5JyqSpukfi0L{P>AXCgDRpP=r}mswy;41TU!ARW73k|^lo@)~EDYCq&Q zk>CC9?`ld7s#JRsL-+#{kAL6kg1N6U)USJlmje)&AITdpjr7%yK{gII?m&_^1|pp{ zR^lVXPF%eOwBJ0tuafE*V8&Wxp>>NY<1P9#A=Yq@a2t)0KFqi3#7em2m>>4jB0>w2 zWau57PM-&%f|yap!EkpP8tw!Brrto*U5wtnOexwuuXvy{?s@%SMSQT3O!Z~ zO@AoS40TS5?7uQ)Jt~_;^A$>@R5C0G3%6DDD6H3}$Q!GSWK;uwZq;2)lwUFYlr<^O zt!m7-%1>p0iZy7;B9!zWiPMfsG)GBnp~X|&E2lu2`e}zmY=4g?#J4AsqoGW7(@k`t z_9RfGWw@>>V;P7yLas{)?qIrLo+6$&0LHLsn!k{HwM;!3i?-@&NsfeFVVDddPMQ@cB)0Gr|26HBpjha6rN>RFRQ zI|atf1)_YiCST~PiL)h6euy;&)eueFJDjOO(|Kl5m6#2t#S}-oo4^8v20)PBs8l7)QzgHli4`U0JZ`MwM?kt zC(yr4<-D&K3R-8d`GnjgM8YZwO9lqF-)E zP~C-Y^ur07yHb0couP?Fx#~8$9X=}G$&r7Htj9*tt=Ps2S7-dO0~z0CqO}leoXOvs zpClvs;V0Bky3wjV03T5+Rvb`i_i{SFI!990iPT_l;UikH;u)U6<|5|d_@;+d+Ys2) zP`RxxYTdVq(FvAricYnEf?#fg?-kLWIG}EzsMQBC_GENuLxESsAs)uYC2|6hP-qs{ zobo!0;$>$6`a$RuZ(vj4JPp)_*U+@6-CW%Xp~)>6W)-xAotliFqD%0nvT4QNLe3^s z589hY%kVx1DgY?v11)rL%PC~mwne%(IGduSuS~V-%9(=5j!@;cP~92`APv3^<9yGE zHMyH)i)Lcn@6UTaox;XVXcHd6?uhGbkB z1>eS+W$DmWcJc2W{=MgMt^uK$I6t^`j(1|ZJpUqv-oh0Kmu+ecJc$V3S{NN6-;)yA zJv1@BU}AFU>f|l0r~+*{9qAG(-82q2CP4-9KN*R9lnlJiGgh!WxmNq$oLujFUu1P@ zJA#Yq-E=lXU;~sg-z!M^yG^aHe6u0&3g}Z!;C*eA%eTSM%z6XpY93&1oT>P86BVoK>wsI!|ldMYYKME_%c&LCU) z{&=T9-U*y@+_pS`a+KQ^WD)myxK#9%q=GxN%7!j|CD@i=qdA%cfvc?>JdU>RP7y-? z7}yi9+)2d6y>dr=yCZoa-v)`xkvQy-b`v|K-BFVXY}Gccb_d%Mok_F=hqq#KbzI1K zQVWsGa=IuD!K#DunIxY>_!Ns~-Jv@oejdPnV8BVIccOmDps;pQJ@#}d+Ad{URcYN%XHxQW^SS;FZqK6|`~~bVA=Y zuWz??-=$nl(b8?Lo)Dpb9@C}!P5BOW%CD~$A9}@ zWK1ic6djhvKZ*ud!Ku(z>FTtgVB;<7q3LpT*#ivJtD&3A)D&I|DDBiI_s6-?^POic z-leBNTp!m-F&;70oT5V^XJbuux(9ccI>x_STPeF`KgYFDTspba9J$(!HcmgCuUb01fo8)Ab^PwTI zO^yb{IAji-P1fs``_Q5ZtZke+N8K&ePF;Wsn0E_}pqZil;gzx0j(5BHh#rO?2tF#q zFi7u~uI!dRGF5LQc+8;DC97^ITQ1y-{BF*A-cHzG);Zr6n{pyIa)+QbdVnj+RHj?1 zReJ+qDafk3hheO#PVv|yY62W;L)^l|ds>+~Bv_U-!;;xxEM;B&z|HGS)%i+vzAM~( z;)<+r`2mmtz#i2_MnQVanTdlmKtpQ0C6#|oZCLujgnH;Z!+~!Ww*{(S&TOQd8;@JkY*HNYu_jeQ9KDP|J zmvlKj20q^fKdHfAv2kT2?A|f3Pf~y6f*svZ_C@#&2(G4~FAA^9?A@8V#^1#f!)e*q z#RHV!!EsEU{Tha<7jrpyDtxfNq}(JC@*cOF&`Ex9<&Ep`m?)_Ivj)NhsFl3n}QVGmmYZT&&yo zUP8DHA(+s(hQiQKk{gymEJJ)h-TR)?+%S1TXzKjX|v;b-ub*+A?)P-7fpQ(B%1{ z?AC^Ep-HXD4VNcJ`ot3nKb}%qYbgzd4KtI2lNVsc!1um-bW@By_DINC<6=as{tX%; zl>A0Pc~P2N^RS5QiX!p%l_rHquJ#6??P|BO?-J5Vljq)RlqSnVcch1|OfL9p%b6rh zTMd~W+Wv6CJNsK3v$urK!M#^zAhYqR^x%8Zf_+I}N3ela_wC(>XE%UBxjKKLG=wb6 zMZ9uk2?k{DOh#KG>6l8)F|3}e30<2!F1e3Aupzlm zq>n&*0fi4cC3%+hi!Di83)Ah?`gCYoAYOATAz+54p`3U@!QZx=Oj>!8^RNHX&i*y8 z!x?z%A%^kt^n&eI$XxAPItT}^`~S@a5$#`a#@jk?iJ+v3N!z{eEJ+N#Q>Hitu@qgE z-Sq4gu)#f%ADD=A^?G{*SGgy0rHRN?>)RtzC1SLR$WnFf5#1!Bw~5GBx0;AF zDi;a`9k#hPjLg4?{6GC*yU2f>fH@3?(1Kr++*7u)c^yBz^IQ=lu_gZu5ZBN~We&{3 z4$|vm)zf&0eY*@xpA}VUFNruuuKE(`?}{;ps*?D|ga)}GJ2C+t^;cs22iZ$i$rtV- zZUaE^#K%v9YLdt!u}CCx-IzqRUSe8^nXYryx93Vyt0XS@I=4t$`|yzRl9itrirC0U z3Iv+m5R^e^0b{M;n=DxWBeBHxP{5=z60^cvmt)yWBwwAHowj{qFM)d+8zqN0pS_5y<6Fx;zqiie6aLT%y3i)7&&5w(pvLZ zP8=pf#smTO)tL#Jdb@1=`xKWRZj#uo)|wYhDj6CCEoHc++YF6W`v6g>h1|!FJ3T@Q z)`OE48ytii0@*NoM=1FH;yWN0`93J9zoT6;F^!jNxuP^=m46C|0nYbgS)U+NT&q{E zOovSIT7ZmpGBlT4f^DOm&f~7hzZDNxiIE$E_&pXH?5*cHBM{uVDu~nL2Djy~^!0hr!FUJqt!t)kKo ztJt;rbyi2Gn4XHPgzn`S-OFNKsjkKCQxvx=Vx1Dhqvx0=_i)Qk5ofu(O!30DlIu)t zqOWYuV#mkT<78!r>f{KkDA+P4THG+Bw!v3pU))ey-{@O2+*e<2G~t%;IIKslw9%fh z2Fn1iEpZuTBQ|?HQ)bntdIL3!|B6D@8heGbJXdn55909YF1+MYfxjJxdtG>$elk2AhYxb$BXl|U$Ke?+{HU(?&N%!S zr>wN6NT;6{haYm`*XVku#Nk_GaGics94=mDq@0-=-a8KexeK4K;Za7(^mn-n_iOkU zarjLx+}7~Daro6Pe1(R;9*2){;WZlmSRCHhg|E@@d*kpV7rsuzZ;!(x38wu|YIsE) z{udX%QNu5b!{2n_n>BoB9R7q0->uDEAOppI*4Sy&O7w(?SOV)HL|L!=v*<;{28vesLTuA$pewc<|8;9%L zP1cEqUlNDQDJbbDX?XuQT=tW|%QQUAh1<&nHebVzy=BJ0ULderHSCiZ41s|){$(2W zehgM5uzC%9Jq8;lum?2ki5M(fV2^0n{VvSu7R@kE$D}}NLsBF$niOi3Ci1q~$nVN` zgjJ9-Xt0-~3uNb^yD+ zD}aBc9D!G+i@+y_A$`Y^wu;;x?0B(HqLBD(@Z|_UKF5%`28&{KgYO`yK8M_1HT!ls zSu;$AxRfRmdwxMF8=QR_sdP3WR;kt@bS`g$hRP$}%H38_)Pi6b^8n2XIY(AkW=z&b zDE8J@S`Ao#`sY`sXy4HWX#Bpz6cG~>&~7YzhlSICzIcWZ5q*7e9ifFm`yvebwa2Rc zn86ALjwWz%1P&yK@uFt53j&7|gp}JC(?QYFW(gP`bEq=wYJ~Al@Lst9NlFpV>yFIf zRyD|c8Dxl5;_4+qr|T3;M|Z0d)Jf!jM7aRUZnK->3m4Sgq&R3kg+|cq*7dFn(kbxN z-mwhRnkPDz;ZYBCD5ECumB+qL`e0u}%f!w12{o5i(F!l^r1fR`OUx=|sYxbA4@9o+ z!G#6_i8D(LF)5{Oj8_sw@4(R{2kQJ0s0NWMxv#9c&C4$L`ZfhH4zo>=9TfXv(%2)3 z%OEbhJubnGV@W$lLZ$mcA2e1r>ndhRL2CE&u?M}<%`ZcClC^L!)FR@v$J&XlzUJyo ziK~v0Tr0C=5nL@dYA)89I_o7NUwI*4GsZoG3ze)-U0&(Icxk(YbW7SSOjTuFDSp^V zzq7%2L?^xcj1->jSzoZAFH!aC$TzPIaj>TnqI`{DTx4QT6ctp1KJ$!2M z2XjfZJvq%Y4|6ht%pf$ABtkRY#G-EZjsl439x=R&>s55l?5@0_(H>6`osA4|(yoyN z;dG~~6A-VAJqSC7H)tb7!G&u*(?c`U%R{3pLd%lH)&yIA8n1NBf~yM|0A^-g*>>MU z8EVCgf+`A`*mYgB4mpSQ?5CQ*xei2|!oFBsTG@-c%QLp5R&Gl)k}t zSg%7ea9$!AFJILoLNnA=Vm~5ZTLX;VXE|DnqMORUe9c<_gRrH7(8?oX@_n1 zS=7}POK>M@0w+9p5;>%W#a|ajZG+S7bq-s>n*~vt3~8}N^J0&#_VumzokBL96LhcI z*nA2~<0;Jd^ws8jI3qb4FOVLvA5Vn#mQSClo@32pG+Y-R^(krbm_HZJu&iIabDi51 zY3eE6RI%qXFyu6AJ{L7irH08-5tVPD5*d&1W@e}EP|TVO<{4omo?`Rxcb;uwx#m>4 zDqUeP^q#b03=-Kb6g5b1Qns-YBz5)5gFNF@`vt~=@J?Jy>zoo{fKff zoWBi`-UPV53^shC*nB5MkONM1*e53vL_#`>#Ryq}9hU@gh#R3J)Rmp;PV|^V>fL|p zsa`HqojNf*klGpW3G$TbJHhE0KEi4TfVqG#O=zgyP3A(SxcwC(LSf~J@VOL=E9^HY zFML>cu9I^CIlG7@6;xCrsU(WcCSH^>SoE-}lXhH+<0)L~1z>dYsA|s} zGU;T>n~Nh(@Kh2?Ns>x*C$zB~*5@r|%o#s^O& ziUpr|o{QYt6EPijDpgELVdtx3q1kR;>^tmLO;EVU9GWFp&?$B0Z(>)_5$2DzjjD>f zq}^S%>NiXp`9ph|X<1&`Q_G`z8>&YriOGy~1urQP8fPT{9#7gzu(1gyueA69Jinvs zFbo14RIRNGxRLvQ z^J=sY?d069YQS+gaBil0W$UnWL!<9B_f<2yW_NJ&8MO*9 z6kJJTZ)Bt*wH_7z}V4nuq$P*kFc>>ek3s6&1FC%rq2o8n~q@LDc(@I1E z4yXqW0BfLM2I=XilChi@Ei+hLJ;@+WB z+&hdA_YUL5y@OZWI~0g}hmqpm;XHBgFiPAz47PFaaGAJw7$8m$iUjw%RGc2H5EQLg zP_!X}qE*LHv~pycCl^+Ps>!_^qsMrcNUlo3_ImcrGW7z}U7_CNFK&liVj058p>nXX zRp>u z5=7ivy(lR!#FPf9@(Ew-d@JCk0`7~E=Wl`*R^ipne49kk|Ivx`nTvu!OI25OC6Q$R zA7U_yg$X}C4)PJIF04>5qFpOz1J#YR|AC7b`_o|beEYDOk7=+>ss`S`6jqO}8agZV z5k8(cUF@r^`}WiHU^Jt8R4{58MS0NqkVn|QSnK^9*59kpNuJ!hSD00psL?cR-_*bz6_I?s_#=~PEvz`+IfiDY*)jHciZ-n z|0IJTK7)Wi3QwG%zjd^{Am%XMa?sn3zzVfUN=XcMqhzU21MiUciBZ9=oV+B0W?l3Oi)oo42pj2oP)hg4D@Ak zAZ%B8pX=pKox(YcI`!&DKny|1SpR$Eu6CLbtCuln=?Y=l>ud`k*4bfxSVMB$vAseqax{i^1eG{dl9g|dDY4HH3I3IQ zuwK9QK&Fv)j>7I*BGyEzo8dFy zV=z#v2VshSOSm7{$az=B!n^-Vw@<+@5?l@Uflf9El$c0MtjbVxsX935Or&#FCv}~K zGZN@WgoUKl+~Y^eevK&U;~W;ghoix^IVT{Q1x37{jrw32szet_W1u-i!K<$tf!HF}=zFbatvD+>uykEp+N?T(mytV2M z4!uaf3KVe}v|gOuoxGgm>-i$}cz!tP#ghcXSCyphkyL}@&F>y-zLCA=G#rJ^uO%E0rBLTWywyxDmS!f1FjjTkat~(XnO?DWLWoqlfXvB&PAi#2zB3D^#XwK;629PJ(CDJb0*0~ z(>K|wJ46h0wygbX(AKhY-9Eu!XN9wAU_1hNz7i3<@P9~Op$dMh?*yw3?KzHwL5`Tp zz^%=Ua)=jy2*TqW0s!k=J*3Ed)gmuXY6-t3>4_QToL7$E|NX%zP9C&%Dzv}E-dvul zVFilOh%kaXls(k`AMY_oEG1>53m=SL>J*Nn00-1+u1>$>@Turj=eSlY$XC4>3zXxs zlHuE9T!b%5&uR^0MVyzTdcjB+kEF=HLAb7|)RY~`3Py)(mU*_PIvF!r*}CAP{^nyk^Jc=KW8BTtP+P=pINze@bq`RHC%lIiNnLAs73uSH zpT5(Y_Vl^T z-$m6AV}S9I!w`p-V>12B&irY~=SBXcUppfpl)8rkq;TxvACYDVi8Wh{h8)z4uex2; zT>u*by_ggU?Oge(JV6^uTktm3s<}@<@&wWf@qvq03|FuG!cz>sz2|!AM@FpRtktC% znkaD?5<3j5`cex5g>Z@*oTFX`D~w0kvy&SfUcj(WGNYwOd74OkK$gWG2(R_` z)w~bbW6p6Y8`CE)H>z3cq5Up1ic!c|T?(P|D`?}h@g0MKW8EpvDeMeeb(7dpXMW_XHoKNet=q=Ku$makaG?{U`QcUa80c)oL+qJoKN_|^OMbB85 zT5C#mo&`nl=3o9-B?H}U@$j?$5%9XU$ppT~FMJb_N z?S?s~-=jnQ#XL~U)tfOuFU_keSI@ct%**bLMv{0whIY&|grI!RMc8t%*u_*!RaCf{ zcrnXrSg-j`QQlOz#6s_ z)VlApov@WFyimh*iVD-IxhBvoOeZ+?N3iCgnNF20-b$EGQ-tX>F**^WMWITL!Q&md zPJ7h&KmS**6RtA6xV)V%+@3w^qR-g`vrOs2b)v`L<2upOcCHgVRLnx*xq!?EMf4u? zNP2O{_)fp%4Ck?>eFs2rWexLpu5g@ur_fWm(LBa`Q2+5UnDz#LxU5Wk9eBiI*rT#y$NlSbc4;-7f+7VVe< zf=un7=|s3UN#QqLNzvggx_g}*+*q~qjGhMwA_2eYaT9{yBs>+V6>if?ohQK&F5`f+ zSUyWh(K2RpafIhkk~8Le@#SW~G@q%(jj zR4DNc(@oM=%w#>?gc`1_Xieolj=x%w4~Y7NsRT}CmMgQVkK@DEs-4VSBuNkN;gab% zyP$|XU4$Vd80L}Oa~+vSJfc>(ay~KU(WYZ3<8nT6=244!ssp&4dGxVr6u1*-9(^KA z>jRn(3G?WnW*!|8e(w=;xx|@Au)BqMwB%|zbxxTK;5@;FI}P(_pJpB%-R}DmTK`ub zuXDf(u4B^#wcs^=b4jtKSahCA^+p`LxKea8#~36|j53?yea zjtcuCmXacjh@80gdj89U- zR8kdDXQwcgMt&@>%1rWhWGc0=>hx_in+|qhDqSPhfgGnhR|p46&iyjAHI}$@q3=s@ zAoxicjgYb5qE>iKlF-O5{E~#i{-1@P?RwvrHG<2)YC5V}O~*8=32GIrCdJ6@Rey)S z{C!r_$C}l|7{F>erdds=gw@1B?>pda(X1vJ^bKUz$o-SQbXiT4nWx2{Rv1>(9(8X- zi*gLDFs!CMYN-MAsxYjkJ!+u_bYwNrURX^>RmtCDtft+nNQdLBrhTfw0KUs=I)?rv z*iJBTP_vpoX_xmgtR}>onBjx%Qa|krQ)4}beSSo+9(I~$H67H;k4<`_N=DT)!eTITL_LEQTg$5vtW8q59aN$vONigKh-8M#J+6$qR#8ujAF9Cs&o0 z>&h24n1x}x90_FAv}K85xbDFtc||(W^fLMGhXB}?)^3!VD>=157%xU+}6T{K<8k2! zo-*d-4~3SJV_z*sZbqn&-q(3@@C6AOXE@n&5(%bgZ=5+vyih1`5HEOs@*FY2>mP&> z&}^OgQ8G7>1FBvxk1Zyx=Ld)w=Jc&frAg;_)N)doihfQgJXdbaPHG`x^2|VP@hVyv zmNzWToaxRrVa9qQ2%0psJA!u{uz!$WUveWD{zzeO~3}oci#l{CNbJH;0X0+ zg5h5g4^m>)UZ7it;oD(4kZslW*MXi^Z7%}4RTv7_txAy?$VO>SDum1KdUj?aj`BM& zpTLk=39=95<*;`|!JlVVIlMYeB6^rzdC|Of#n~BnO2r~_yor!U+Kem*M`4bh_E%sk@FD6r>>TZzg>x{E znP*(;e#p3^jWolm)#ORN#p%N&a2B>wo*ZH=#1FAWw`S&;U6(^$%LCsP!df=RYHLrY z8yh&+86s9RX=9HBtQ!fX)XvuPj~y){__s(RJ!5tiLfmvx-VoXZzBY1ky0oa8&phcc z_Kc`T4$H#E?CD!R%SzhM#4KvW?;P!%25qY%PuiiqE$E z?j%=bQ%3wW60gs4T$S!%cW~IzwVoc9)}n9*?#Hk;6|N(`=4`zZj- z*<8S$l!=)my^=Gyr{2z@Z9zA%LahUA=a+PV?feV@D!ATbkE85tlBL+A%o2E%#jB@$ z3q(_fmF)C2m_yShk!HRgkQs@;5mo<{ue9@Si8%^l{JKdc{lkvJ>=x zI-LpkObCk=ZWicFRKN-8)(J<7u@D`%X#%77jV1enZJq9v9WzJG*73A}`ElcsYO(I$ zD@&*L9sV*{R_&`gFbLvQYrcIcR)?(nwrJ3B>%J2@Fw&}fkpLC=gPZqNb(-bf*?04p zUB%oD4{W(I_-R{kOXq3fKS^4;x10v|mUT5uEByTda8;_>xlPl}hp8VB&~~#&sJ{^; zajyg|At)m-N9{)UnK|!jy(L}v$#H!GRkM5iphw!4Jzf5Bc$i#yDUms3@178u3px;< zZBM!KO1mT&?q?4pKnX2soXLM_M6X=a0fAbHUk9JzG#A7fQy@}9=HGxtzh7Fw_6{7hM$ zd#Nvu7-(p$Mw9{S2mAe=fqy1bS% z#I$yr;?>Z_{|uF`6BMj}R9&$d&w(0h1-F4FB%P?abi8wJO?ATfP@Q(RQo4>Mo)CUq zaEv64N>n8^iD@*D=>(@$e3Ur3t0yN>0c!#=j6bf_C^)M#A$$|Lpx*^s@4mCJO!XIB z0NIg|QoJ+NdJF%rUfnjQ2g5tZ$p)09hMDH3RV9W8k-z5BVtHz=t4eN6?yr9O_Nl1b z4=b2RGzxcgvQT}!TsmphewKoWzuVEz!w2}n{i4oqdR#^UIC~wn@{FvmB^So>|6b=8 zN3^=UGS&4SEUDIB^duW>@~kP?d~yrjE&~1AO@wE4oy05QL^1#u&`fU4g6&DI?)ZN8 z7H88RB@G4;htL?DT*8w^^!%Z4Z~4@5fg72GPdepaeoU?ZEUr1cDNhcmasZMv`fav574jS4J$;2Hp zS^^BGsLg-*NA|9cZw-&7S&em459H7qm0l|6jaAFmF#}OoqeG8*?7N!suYjxAC~4JA zi(7d_*|VF9t_N1SL0xA6S2ay?0hb%VxTb4dz-R*))-+Q9rkGp<%WfLcUUa&KiS7Ew za7hrpmy3S2PF>SB*s9H-4~z(yHoK6aXyo7$6kTrGLf=EkH0i)&=B91*Z74In^UtT& zGWD693EMJFS7`RHFqJ?*ZjSe3wE@hC_v0r9Fe%;-zX6PCTI6=D!T<)Ej#21j1L$UY z1>hnLaIj>s0o{$qJn9k~>rmTgCAEgn;T#{ctL|HS#OepS=;=N=*v_jtIl%6_`W^M6 z!TGWXeqe$rmwWdtK2WeHsV)2?dTJICp0mGY6(wz*EDI@XldNc2tg{=OwJ2^U&K>8h zS(;U|NpF=(I~y9un#C=#Z`?7FcCvQ55t^|kcrxMapQm1_NFMdNiY8daU8DFCU<`fgWRpWNfMYVsnhq|)@RJ7f=GkOxd+5|ga zURbN=%=xgObPY37#$@8JHeu<&SS5Wz0sN4gvphj9{R3Fhj>PcW)Jp^hL~?&()m-3H zM8ir}^qU&zvZoVKa0ajUq{6$nmn7yW<3i2nLe1lXO)f%CNiG*Tv*4T!v)|xaeYFZ1 zn#j{qtq9X3Na2zway840)3p6y8O*@BrwbllrFSyDx0ztT1aqVS{Slu)HogRAh5q`=;uRhNYJRuf-jLI=0RJQ?O5(EjuA&PNn>KiK8 za4CBc;fLGCjkJcl@edc#lFBvplP0Vc7Sa^;TL49!dHeIF9+8hOcyP=^8K3W^O%my( zqee~@i-$y=+Rz@@Q}q>%GuEOezSg5Y1UZtTE7x$uhz`219*)o&Z)MHmM%cjpB#Ww7W!WhEgJ1wFDnz<<&Sz1a!cwI0*4;%Wl z(2a4`zVL{)Te)-0W*8ct#=yUxd+xcLpLHx?;fEk;Ko~@oA|@A66Nre_L@f3NBAxAY;mcpRE0XvU!cl2hrVSh%CM3=y zkxm4Mi>APl+Fe#{C(4#*P#qW*7Bvru;>G)F{8%ZzMb#v08I^t-I2a&Wkx}1)`bp!W z+mpw6rl51#dGViw_0#Ay+u5sA8%rLmY3p-m;)uNZ)X6oMdYoo_7yE1V0bjYw93@um zPnl?e*K4@Xh1&svtx!M1uhJCZrJ+jbXZuUQ~ zVV}lea9NxEO&azm7bd0+k3@v~!N_!Wu0yRCV@jCYJL<_}LAFodINwpbt7xjkL3s&$ zl^$LBsi>@Ixe4#i0E~9{*oS4BS1vpn-OI`g>|X6VI3-%T&z;r4PHWYLV615KnN@Yq zwX&XgN+feEY`Rb{_I&sAck5^kG$}0)jdL8xqSk7d`&9=Ew>vYsZ?NKR_-?~xH=%^L# zQK^yp+^8lUbz>|_Ua(@*!j0XjV<)!9riZU1)(qm9%~g5DsIf5Alkkgfx;A=(^t_v! z!>TKm3-B%U;m&nX=9eIxG|6d~WOk^LGNF;b@X6XG2-k|+N zK(xO{tps=HMCBQiLixRlLzC_~9ivqH@p}uUNu6RqSi57zI*|1+VMI7R%+(7!s94%}lfjQf$hntm(!%+?+N8!|)JRh3Z?{MSe-U%S z6DweLi*vmUOF~2lKP0(;pY9&#JbwJQID`1PFWOiYYFn``xQkoxUSL1>3e)kABN z$Vd*5k;G*iJ#^=BHVLaz)KY%J@*)%37u@|yT-~Ds)el?Kb{~-t#K`S%kuNL~GU%m3 z1{G^Y36Tk+rUWP;pnT24V9u%~`#i}$M6!>R>;;m2zN8%`X;)wxL7XAxs)N6G`xm)T z^nm2d$P2dS*?s7M&uypOJ=`E`Th<9ik<8RTMn+~JM~x#u;%pw9u6Se)q*84}UA4W$ zAa!(g_Ux6+KjarVzeSdjGki({_SoOXvtQ8&^PnplZ`H11G@!Fo7Y(-WLMtlRcH;`n z{@zuc-Z<^;;K@FBULR~5ZC@K~yTHcS(}lJ#*fz#44z`W8y}`DN?2ChK7uy#E+b%&e zv#rn`8f+V955xvQKgc&Y=UEWwN&T7i$^Ecb(KzXn1XWD+k%zV?_d|AA+k5WH)e`Ac z&#kh3VuGg_IrNzH(7;73HPNfTIDtibDQfk?X>g^8?zzjXL#tNsH~%CSCk_bWz#0LT zY2X|eXy5LiqXAdP0CW9*4HzE-lvbtqZ{^`xuIkx6`h>B^0b8V#*>Tul|1u3ph-J*i zb&ss|a&>Ji5rz+4FA$;AVevg=Fg!1I+MeYCw7nFv*{-0VnQsXLyW1R|EbL0}S*J(}2Im0Nwm! zHDH?y&L7goqf=CN+(PNpRUbz4D|3$*((PboTs9dW; z!#GoKf-KhPdl;_qcHcUWdhvF>M!l~}X;$zOu0e!`Ymnk`YF1Z1BnV#!qcsnz!skS| z&M_tk^prC9&rbyWGh~Bn1hKwUNHj(zP{#2j@85X(cMwzzAq9>a|90$@NF6Quc~q zf_+m>;C}Awx0zfX*Xpl^aES@@dXCU;;I!%;0~#;IUt}zyzo`#R|$a8fT) z1W{kTyTBTBUPMkFRHqkeenx7vPAcR5%QTdD_42b;N#{a3ZO7$zmhefv5k7Gd*{xRy zBFlw|TC>(}?h4yP1{I~lDODcS4!1p{chA3|eooFs+Yr@+CFf4j33U9E#A~(0 zXO?Q&AJ_qsS;y7K;(kh_gWHlpLacZxym>cA`e9|iGs{gD4Qg6oF_~2f4U@MZ#}yh58L| zMY=kVzP7_h1p}wER}5F9Xc!TBRo&E?-{J-Jkna401W__XX)R2MgQ*k!{FtC|GbNJI zM_Yr<*MqGGagZd>3^}E+V`~`~jo>-pI(e#y0bmG?LzCdQXmg`u#59-9aYPFyM~$G+ z@IK&zELl#U7}}f-9F-l{yAK}{-y35t=suA#x2m`LoJBTkmcaXTfcH`F$Kg30;5q8$ zIJ{Q}crW!U4X2eQ!i1hr4P|OEFugpCq19aVDIIC5Ez;^YIqIc0Lry=+fhFAoJIbko zDRo8-{SAvV&#HZom{?y*$Sdkcp73)((NJ+N(v@`iZY3*7D1);CPJ*PwNfJffO)z|% z>4((fT&r{bg){K1=3ODptB*CWyW2cpdm-Zq#@f@w!l6CkAIYL@O?Ix)W#0YWGXG7o zreZERG>&i`#nWCm2w(A%cN_K(g0V6em@*^R3hVy{UEulOE$~q(a80a{x48vwXfN;= z9SZDW3WQ23Sa&U7;iZzYwWqPuud6_6=j?G9PdaexNgT8#q;8rNYku^EY5s*kWyaXU z$BH9jCU#BY(mOZY zPS|s+x*{r-{S+vV`#yh;xt7gc#dAAZ~!4@)J&!9>!PE8{fzP+I=YFTf-|r z3?lp?ePVNqkatr}tgZK%q-j+-VG%@VS`&+KViA3`Zco#?Sj3!IL~od)!riqdFyyww=O`FvZ||YY>8>?QRXRJMFKo?LFeaiAU21#CQXkNxziOHgQT3i zaMR?4n=UWhPV&O-EHB&)lyc?dTV`^TQ=6F1RbNmtLtBz*)mr-15FlxN~tvX==o5i2BQls> zbk}a96z-jRDeM4XW;W(meK`&Y^~E9^c8VAycwvK{YUDWR)zYJ}RUlD6C#s0mz1EbW zPwVN8lW?m16O*Y-1x)q!B6n23X5sMA#xy}!e3rwb!0O4nelQI+U7G2WJNQ~^!NRhxxAOyT4`~8*J(Rkf48Cfk7RyNzJ zTg+HN1Ij8`!MXKq1D+1Y9P*wBh{Tuf%jD@;+7ma3MU~DMF(4gGjjDA5on!BhLrGby zQ(ATMoQuIjAH!lK&M$GpoXHeFG8SiIrka?4#Gt|jr-DmN1$*1Ulrm7Kjof|~u!{g^ z3STm5lVxl$N;s*iyIw#eeyuT@uAyUk z3O6%3Od$=(1|QEZ*s7JV&GbHL;@s<|CmGvs`>kJz-~u~hM6B)Q!OcmkNGi>| zT=h03aB9rvCwz>RCKJB`adx-6I!h;$C9SGQSRTIZH}-t0&<9I<>O^(uQC)#Z+CJKT z5np7Ib}TqiZ8S;Ks*=OEbE~)CvT6S<^{QCvl>v@DIiF^2i z2Wd?)M`wb=6T&O9>nZ4~eT#<+EGW{`Jmq7^;sX#2gL71+zg>-uCv5l9E)3|e%T>Tq;VtX#Nzy_+QdnnC7Hyz zJ8q@)B7L@2{Dq^Bmke75g<}Daq@N&zrb&qPw6a{yT)?OHNGigE+9RouyMkx9BX8CL zJd%o!OTAP#->6gHxT1&te93&?Y~3e(D7W?`Y7ZCiE$HwKGP(nui}{&3(0!)VJwk%c zB%q9$>NZoxO;%kqJ)mznYJnv9m@iERwrc+*g~^JMe)7EW7?m#+)OwBCj954BRG%dY zt1PQ5{0#AeH}`Zi3u#Yh);5%atqZVd!%8r29`EeQB_hs3vy-g*grbL1LrKINZ0#a~ zznyK|Dvq#w36LG*403xok@iI_^TC?FMtjDjkdg%ue`QfeMtQe71*UD8SHcjn6qX`HMt{3}@o@RvmP z*kAyKES=HiYVb_GbezFK)Kc=KC$sH7B7<3`zIjhpx3;OqbF@cQY9zHP4L*jcsD&Ez zbg;i=9`#mCo1uvw$;^P@Gdb!uQW4{xbp7SU!+0|dt+m5@skA}Ou zdI-gwy{of^|y$*&FfTJPAUn5X@a5N(WM?((h<{UYQMG;u22V&jvxX64M zD=9t^L*S;a&We_%i@iMbdLT!kj}t`S{mp-$Nz0nv=xc$mn66rSpjv`u1ko-017UCA zxYf9cIysbsTM`>ebHqHeg*gMTI*5k2U{GrLgG_NC1EaB)re0z}Gy`0iyw0*v;Iu9r zJ1Zq+=%}mvC{+u^i>0GB+$qjD-FP_~`so9F>4Wx-n~}aEuMSH?`N4(FxG3>8)2tjd zi%i;r!#H1hpp!8oNMTW@HAG`)*TTUpTr0r|2W#2JgT1-T|O3%=? zQFBmv6^p(ivlQHxr3cZCMdLLVn-Yt4Z^%LA>M3^{WXlbS+SNR{x`xWt1sBY{bYr*W zZicP>wiGrphDnh$%+^=sOs-0y_i%_1l-sggE=l16!VL>9WT%|vZYM_-GR)!qTxw$u zp{Y=$rOS&`VgAW$D_h!Ah7p@813{WF`;hM4W7U@1c2TmeLWw!be^@e*gRRSL6R5su=ePw7d7=A_QJ$TOvOx)iP~6jip5`n* zBBNlBm>$U!nWay+$xJ(LN^R-&9aH1#{x>|>gGoz8~^yziFtMD%5@oA2!R(0T~0@0pgzp8vm}XGk4sp+Kwm)QV@JC3B2u7b|k&jyBAR>E$t- zyqF5R>9zl&Sp6S$O$TthV)bb?wgY_nA8NX5e+wtoxo3f!A!}f=_moNnECzhj`8p#y z*eG2KdkUKhnnTsH!>5Gt!&^H`tcI7AVKZDT;c!Hw$%@Xl+zO)9`zh9d8JZY(%e6wo z4I-`?KGx=K+9+r>qqii1qu#Ko@W`Nky4K_rQ#SYwJ}enr9vP#UVH^e@cF=vtVis(m z3~Xmucnah%GMN8?nz%t0cc59jRye3#D;#fktw2&^Rn`)>1lTb+p}Ls!vUmv2G#RACL6ciA&Tc1_nQe1b@~a+8i%6YVGI@tsRZctX!B_6NSa~_WeAV zzGsN{vMTbX>t-D_wE7 zhjbjSbcJME(Ub`V2|2-Jw=NOosc7=d)W9!)XBr^-R25C>2KbQ+d_)7EIY*~_*9D5g zW<`@Y^rXy4*W` zZ2-j;P0wS^fbsjW2G|@0XFPDPjWvMxRfPfP$^H|b@?~peC$*@DA#QMCbTCNG8E^vz zGaxZ2I|-`<=<0`#X`@EiI?&4hC*$l`@7B1LBiOGkhE3mr{R(m`SYbwY6tZr8B`8ph|om9?zH(bg13fBvNV5>@SIRdcBnYVu=&tl1KR`jTg081qoy(_ z@jEeC!`8rightEQ`+sDea7{UV1=&;2)Sl5Z{gObrYzKvZrQ=hrx)cIBO|4FY;Q@oA z-2+_XXe)%!k)!_FTVKV?1V>w>hMXfyN55Q)HI`LMa?L1`z;P|R`i`6&Z|lb@k_e9Gonb#0`i)GT!{1pYQ#k`A;B z4U+eF;-qXrPb2v_i*$tLQvymU`%lUNscecB@DK$UR4|hn)u`YE!w$&Sg&S0`f#fnz z?hAZz>;>-9=$GE8UK%8m42qT-DQ6vk;f-_#jsrV%E^5lZR?{4_)WXAYOfE4p1|hvs zf(Xi_g9vuPc_9Q1k={#=be9cx*_(Q%ER-Y@wMbsJ^3hz~@lRHFSbwWlagS>7lLB6o zf0Xu`C+LiU?Ks*0Ra|F;7T38YMPm;W^~W4OKodr4IT0K)L_sO}+X=(6AFtSF_~S0J zrSUzD;|boD^Ie~Lg<2mW(-f|i5wM7^PAA8)J;4&QiY$@f;OdtX={(#nSGM9fZ`)Z| z-T$hhC;ks{?*krXaV`FDl1p5gn^kn4E4ECkpe4MX`y5lZ!@q!+ z%;nL`NtA-`M3H$C_@R0YmySPQy`DvVY9;0TqcdW6fIa)`xZ<+h0k(FCOg@pzsK(R$ zt-0#-+=*)GY5toaLGZ6r^H1~N9`nCe6^egxT;pnb?o|kdifkz@&^m!r6mGF8CT2gz z(#s~xbQZbAxo8KEl_M7VN*q0<1&G!%{{$}-8Q&-o0p{{d=gF)=^PT%&8wrnm=k?qM zDHA!~fpi3mU-dFnlRyqHDU!v2FXxllogBRQbpuTYb>7g5sGje=t)8-cM)sfckYgXy zb0^8SD2OqI-p=i$lT;2fRDup;C>t9%W;e!&h-{=vUZp#5mVBL~j;xd~{~)fEB$81` z$A&Tc2tf;-b&}muLbU?!uuu&v;0qV(XsYs$7O+)-L488!wHFe}Y>$yUd-+v(8v zko>SO7scGe+v;#qY_1x;MUI0`s0KKrB5?A;WpBr_u3H1g2PP~5WK+4B!WsPOx4If4 zWQPletrGI_mJ;=;?LLu?@ma4wgOmB>xLKu?pZY<)F1=v`%4$2OrqZn0IJUvNgWNS0bL{PT#ceE zCb$Au!lP*;d{Z;$gjObjKHREdEI#7AKd)Hd!vx#xp@KylnN?vrD{OXk zGbPsLL#>PE-c~;XJMtHkI;Zq=`twT0hU--j0RJGq&KV5b!BbA@b90>N*K^C(;s_pU81angT7ed!nHbYFz43C@c z6$2;3FZXLK3MohB>lj=O!(l8EjF#)bDQN#txu0^vB2nem&JllU-ow;^hjhQlmapOJ z^-;R950(iS6;?=H;<8}B)tIjOr)Ymx*Lc?QY4{O7d008q!z@pAkJMq(JzVvpNhyX=-KiUD zQY??yP-Qh2hsi3EOtbPE@vI_Pe{jll*utqi-ed@>ku-OA( zvIO%fe?LraB9GJ3t?8`jhh+|cz0Q)zr>6A7#439{+|wv?`_x7Kumb~Ny*kd+e%PG@ zVD{T3To}e9b?>U5J^<#_us`<0#Nb9ez2{hk`qY2+!}4L&Z^+U#hEVQPkM{#d0E`E; zETr8ZgBjUz{~UeK!<{jIqzo8m2@j+uQ`gdsafB-fD9o*Toi6Fi`V(_QrO60WL}SVg zC-b#M7L2iU%6zKt=2%0Qv~?6#<2V@eHx``2-4(};b3F3(dK_=UDZJ-ney)ZeTY1&- zT7|T>ALa*U#z>nU{^tRhR;m0`9JBrwV0z4?N6ijnUX%lN)^3581<^TTBjNg$7B5GY z!7lbM=-R_94j|epqip`gnh{)K84{VTnSkMiqjFjD+v+Yt%T)7?xAlN>W$7llf`dih zZEO?5;6w;BGa1C|V~9V|h}IbfNy=l%i)MQMu*pS7Ut5L{H~c8%#*5arl z(84+WLxK#%u>pKh69>M)c2E_oQHs;mX**1BWYM@F0; z|K;)cMduFL!cuK)|0-7uUvnuOhI;fem!W{lEwaJ# zCiCR-OveZVEOlK$|F&BZ6wD?AqsYz#6phhVLM}U3-IJl`_r->~-P2o~D)KX<)2+6reU=~r=5jca~z#@OJ(+|bJLjSDk_Gc$vW z+>I9oEBo5hMiFPQvb$jPOK+sRjcePzUE(NMSZHKacYTx28LM@@J?K(*MaP$`2AnMY z5ebIu4T6WzvLM^Pn}POoh}>%D*leeI^UI!Sb@ghRXPZww1T))-PJ^7xw(N5HMUI$ZXuWNxOFb`o7>aI2~C)_BSSNsjTo`>_665u(ky~&vi1Kc{u|fi zXm>6v>)@KP`hOh%jcdkh_XMZ-PtyOB`EOh!+X~TO@T;#D=1#!%9MD=l(OYW8YL;o$(?{Co6&CzG%FdDte@tcE*Znc+|gZb?bBp3*A3fwLTz}T!WbR@u!pL~ zkTfC<72HRW#7^3z>0MKd-+H6-ZCzlWsI0* zWX$3;?Mu>%BEv&3NfW|6=}XdnA}OJz_5hl{QP0=L^x#|=Bd0leMm5gO%_(Q8nH_vQ zcQTmjX2fgUK9Q;3Ptzm7kaF7cL_A?wTCpKh9Rfn_xZydPq<$uJ2R=eJT&QE1=0fCE z{dSx-P{LhnNwRyBEb2}vqV8lDbti|YJEe=d)2UnDYHqmQb9~ix#+5Z=&Gw4C7GqSA zktH?_E3pz*5l};nxkdhKf+Hej!J(1c+S4wl4@GWnPh*i|i`-OmhZQIv=PpicFQj%=h%cWsvcO+#7J2DuR z9IUQgAt!I@PUIL}EK;S#<(+hGX;r)PdiBQTNRB3e**NOD8JHhvQ)%FH_F!?--iO(V z0pwV;u+8qUiR_Z)(F2sC+(vY<2)r)iT0w4AyEoALLt{yxcL|q)^)8dU?F_lw&hKAj z&M6e@SwH_k*NR-4b>My?uzc5AzSra1cFOlY%QqL_mrnWKY55Mt_kZErZe4q&brcTv zBH!3Hx4%i2Y}zx1Ch;&zWvANZF1$`}mkOU)yYxC3u&U7{2*r#HKKS+VXti|fnv`pH z;8{oUswKaoV4lnECLD*~m}J)202;Z5x($fz^4B_RR-ph8dRp5fq;34yw^)Pm0)?k1V|&<@HqXBY$F2 zHFuG#UZ&&pi@7RYFQi=!pW{)jK%w*Ya&TH!@ww_H*2Q=n!6UY;{(d1mNtV?k@t2HA zZ`T1#)<|k8(Q!pB+w-wtXad=>bcIwaCdkz)ZQ+|~+i{H5ZPM?{)bSKSV(S|ir866f zY~hReh|w$)Y!aEP=AqD2-yFUikpAu)s~fee{^Eq0h}d){{w}!!e@Uva8=o?*x667L1(;T zAHKfT7%Z{4>KB0hj}`c3^thDssk{rz^{K~_b$w_R!!+W9_Uu%@6;s0!%9V*&Hmy8I zts)l!xOEhhi9+YpUNby0L+tKl zGHsp9eP0wD67ruDgH{dBQNuu0$c>|s+X+!*%ni#HzE{^D%e4t#w{E9P`G}x#B4-p*Ba^s8617d)I?AkZM=r0q zm`~#?Q9=|Q4V3P>)gv3EHE5N)xeL&%a3aIc&?UH*)IGyYIw@hBt!^ zZhXv!ar`qrg#6E`+Abu?ujFWNtYBzsK5I?ybNxqlpZtRjE+u+zX7O`zeF$@J%L(TA zq2lK_vm2~@TJ0g4M(@x21F{0{4f-F)0+=fhp~fRAW^H2=2>!=sGs9?d zERIhPi7g;-H&|Baf3B_2Z-`xEydfzNb^1r4YcS08K3(8lCwIZDD-3#{j>Ikie!8x9 z0}2pWNGdAuKJNb~v-ath&)sHE#$iw8)BQ_7?{iWAlLMB1I>UJBrJwgniNmaXn#^$x zVZ#EJ%{sCyoxcpZsF(R8R_irBR_}t|$35P)u1C%l)*O;Twrt@%2y_eAm`FQS|Ns%R;+T7K{JTjbDV1I zza5vJn`++YKqB~8^V+(V#Wv$()`gx$b|aH1QfQh}C2K5yDpvC&>BJHwFe?-X6WfJB z#~nLZWpLr1xg;00m11G=4zt65U0Hc_x#-bnst=_&Mv^~2Iaa$PIK-a)H5f7exJa(Av*-jCEU8uDNUV$8F zB>YJfZ{+d~(d8UllTuyJ>9tbz*P(DOZ3`w-5UQEf^y8#O9;A5WLg2c|7jR^LhUcqg ze{Zs1FgYF0;)qmE9^)^K1xo1;loas_%4Notm>Ru&^7V4nMwA_W%;%)E)g%{*4$Tr+ zjn`e1&bhyL)qnC887D~EN@P@0*^GrVHpkypj{}tLbqro!ppq^ZafBhdGtOmyqkfCn zxbw6v8%>|{_JWeF{>nrF6x0HG3;eyyQDo|En~q5%A?aaP{r^KbOuoUo=L70#<;?cv zJPk=*PEz41Qjb3pKQZI@SS_#37v zGbBJBc3ZFXyTwcxMR4-6fkn_X>H=;|Jl`xn0?qE#JERqq=o-FlZ20%YP$?xcf z^@<3oO$QB$lNhuw497i(k7%9Mn?Dj^oVJKi7JOCPJkmGY!;>&Es#Vd}dHjv8z`s&C z9)JDvA8MtuC7;7*r;mPIKBlRKd}&j1(qc;F!!ji|BZ=?48g#P6l-voSaM@T6#Ye}7 zypMB(``R|5kc(W_skLO1f}aL$u1b zWtt%=3yaH%YxSE?^3SR%jj_h;ecY79--Qm`Ix&a)J(wO+Lx(Vly5RFsV~ z%}1p?X34Gg+@hrSFU?0|cA*xCP>9Xwn;+G>d!mw!_TI?A-ACkF0q#x6$4tNX2scix zAi1E|5xGcz-%`qL)!O3);n)6*QdLPi;$WX)_k6f&KWr>miwQlg6Fn0JKhKA*wY!;5 z>g(u6aMhA^3`PP7W>{3A0(U!Y;TLguDtE0M9H@07octx9L>77|2{A{o78SuhPi^li zIp6?U<*M^jp@PfFxaIDLrD`t?OyaytLL+t~w2dhoA?B5 zM*e%jdCr1)UEB=ob!d{ISnGg`rZ+rUWwek;!MuaUrCfPKht_JNX&}D#K?tsn<@3SccY#&+is;#+0jZF>*LiPF`mE%E_K`TloRyVeB@t zYF06N_6CbPJ=<3?CU@S7y+F^2l?CxKIB<}O2Db@{c{xw<-j!))ac7Y0+qfd@5~-aG z?*U&qx|TV&dQPl*%k=Kee@`+y3O?V{qN{IMEb#VP4BB-|_QK`tm5gKOAzwnT9$ zrpKBiv{h0Y4o_vT>(N`t3Ipqo*6=jMux6B@k-p$S`gAwn?P+ySq%)^kSSfNk0WuCz zID`&)5y=%FQ7=&))tR+O2B}r9R9{N~^#sz`odYAw){zP9TO+$mBJ-V!>`95N=*-C8 z2CF?yU;`r)iJ6?kKkBt)s=uWyM5fwLdS&(n?JK9oE-Q#C2-8K?DE6Eh~_@wyUyV@+g}r4AZ%ae40NWXY-h#3_*w^+u|szP zUdQ_&pX&_%p5@ubGiG;FTH_$>Z8y$LYMPNuw2d>918pgRb{+Z7{>VeKZ2h4<(M75Hf*h98WIKD4t9nCy$-Soc`#+;Pl5hy!)u) zt$26w?&96eyPNkB-bZ-%^6ur`$Gb0N50Q0SN_R?cyfmVc>1rN>r%~c&2DNBM>pIEt zK)03qm=83bRw5Kf95-ZK-4}Yepf6Sjxu@!2$Tx?7(MP&nlSn1nvyYN~8YgkZ>*SbK zCwWpQ-OvJtAg{CWm&-Go2SeUtb~nyU2^`X;_oXhq-wudcXp7;Ts;fiEfiHC}G!DRA zHvo?uki%G=9ZCs&DK+bQM0TVGgdpx`q2YO+mv}buH1lld*~Rk-4`n@yvgX+7quIQ( zc_UqVER#1F|MdW0g@K@!1Qgd!Dg8@iK;PN?<@; z=x=g6pdKt7%kQ+h(;R_*RqSZDJty5aJy>LKLl>};NwYcC&deuu(~AIFEnWk&FE@`F zR|-c`E6+#vvNWko^-YvzWN;?v#xNl4j5guLjG}F(BWd9xtHZ+%>Q*{zMmj41RVn)` zfhxPLZHB|f9ofRk$OAay*`6lE2q-#UJwmY$`G}?)1D-eg&&e=G&eQBvf@|Oc*U7h)~GX>lf`sTr$*^WEDk1Y>i?8Km9T|y zHvZJ@p^g*qCp-T11>0ncKh^WOE|b4Pp2a-!5`? z5#)8x;@-y7#S`Z#3Hg&?|M&QljyE1xe=q(v{uGP5kR*zDd_41c?&PWFS;`aOp>F;! z@Fz*kj6Ti(b38BeY!{#S*zteNpGrii!0|bE!+yV5xfR)5S>S|ynLo6=4>R6BWT8uH zP3}OmJD3o(H;D=I?J!jrg8MkeF>2G=){YjE}9>WhrEQse&J$dD#C5e>V3n14v& zjH%e^{W2e$bS!u`avM*2UQ6U_i{Wrildc?4%)wvHL`dVR|C#k#V!bZ1UQZ2YzNfQN zT9b2o_!_28=6KK5hT+;c-nH?(yu-%u{QX=z|FhPRF*1syArBPS#-&NFjTK1=z)lOC z3^+Lf_;1X82%Q2r1+Z&C2QGRND$LVE2eb7=?TDnY(PNAV8DYDfIBR32H=dd z&>heI+Uy+$0 zrhpYw7T~M|;Kdf0dub|0Bmj%CP3Slm@VRH9<6=!mw&&h#O-DAU*$HAg0p}p5^8hF6 zP6sUT`GC()5PGu(9tn8lS?CbfWG)@$xp$ONLqelK9d!mOh6`5!8VzXlKY|tjx&Y7x z{|K52=t4jjo&mD@s{i7YttoHi9rqk}1=`pENNG=bHxRwh^&^qxL~}R$OJT`vVG)0r zzJs2UgU0t<8^3mKEIF9>HC_Kb;VWB1#yRj6|DQ?eQ$U~oBj|NNp8@*pA3^H@eGcgJ zGe9x=9x;8&Q=$yNm8=45_-V8z6baVz+WT)UtobFfFlV>z*HA& zYtz@|Dd~!n(Ul;gKY>L$e-=j>lyt|*=uQyP z94n%)i0G>X;HxaKRN>bNz-|kC81Uh5UghZ-R(!v?4l2M8^_<<^Fo8JP!DH0&tQA zJ^}c|S;+V+B16;H=PBtkeqgoHzJZu?=^F3(uO$s;1SQ}6BM82*lxaiB$$`o1P=?*y z8Ubw0FVI49am!7!>t`*Y>FHX-h-DUfMt6jN%J#46`@~c7NxURJ85o)Fovwz75K3AH zNlQBKnZ0O)1&(*%Gr>JD2SO+6#PLyo4=ASZb5F_VaWbS&pBWJ+Q6(Y;8HqYGr)C9w zw$8lN0>?Y^Kn@fqqgay>@svd3WJte0lZ?x(h`JynQD=5o;Inn+FuS5q8Sl)A$Y=w_ z^nK|m`7%z1^y@Rpc-D%j8!{4g=G7MXY@PX^EO5LtCnDoUO~zqQ$>BH|(yz}X<2)-O z`f^F4zI>dmaI$;0zP#T8$NO?3GB$x?`g%MiJ(_9Iua`={K9i0gTQT)QN21QW%mSaS zGnZQ6cxO&T$9PT02~Ww1cyUO-K9h{WRz%F)OQbWO367u%O9tW{`b_Xn3mos%iO6_C zqs$_f!f0L#rYGop13GtjtY#`7drCfzllgH1I_|O(`UEl)b@=HP_-q~i5(^yf@QKJw z2F3J!<|+9sPKFHNXXf_+%Ci(ld=Nhqyx9Vut;7Gj1&(+4L}WY!is}2pQ}RWej6?(Z zJS(F3Kz=3}*IMASb@+2FaJ<7OBI5|^-=^=7r{qwaj6?(ZJ77^7@qzqIGJa!$&(`7B zS>SkwPejHKG#OueO1_Shk!T>FX+;zt$j>BWtOY(>hflY_@eZGejL%T$Hho7uB}a9S zrt>dNG?2dm8twCJ9sXGhOov~ZsKc+ez;yVfGI}SXW1*(wxToZJyf_jKa{@0R`@n=I?G-PN$4 zDRsD4k5wOeN_r5^yFRH(21aF@g&%aGVh&qNDFCq2uqKlE24`BhiHZ1F)bl zJ_$IJj8`pid_sRF_(=;KANUiI;n!pw^OPKmlaXjbf2$Qyd=7ACI^!+y+4#UP3moSI ziO4wAJ&+f;>a+f#Yu6{s=)E<3mvk!3si7sZ5n0=aysf%NF@xV4n$EJI+12oomJLh= zT9%Xmyww6Di7QJ^0N!AMk;KhOky(UjQw*F%1o%FK0LjrQ0{n|z8~YPK12hW|3C~H6 zJooK!@cdr0G#r1>am4%ibUza%B6W&`r@hT0=LTTqOVB=>If(&&Xv>Y3xyRSe7m7aFUTnd0k~; z`ad=If#?5j;FA<%_$f3nt_wtx{C}fV+;=Qo)N1W?86)D6xayxI=Ggw%7gi*O1ti$f zJLJf_V^M4H+(5fs()^jOJTom;eddTjTdV>PAch}Tf7H03hmJ<|QR>7T^=}KF8_8b% zF}J+fa1F(UH!eH6CK79Yv&8G<+CK6nY50$l30K1kY5y^*wFtj5{Nj0(NwlOrX&ak~ zYA;_E)~=;!IeY?sd?Rru?$fj!=tzN<^pZexx=+203Q5o2ijmC~h5cF(fi4upWIr{T z{Zw?#43~U7pKX17wxjiE>e^8m?xZ*B_}{XV5wKI zYrI*yDPI4!@oxPNqa@aLBN=`L``xbO*+Z&71mAmcN!Z^X2uQ7?;r#KW|ZPyt42*fL9t`dm=ws z*x#B7C(YS<^~p=ulwAEW(f4D{1x6>1M=2!wL3H9c-sWDkMx!5?-JZj)M^=-xc{1-r zXr`URL(BZ7>O-mCy?j@A_AW2lWJ4nsN3z+^K4!G6hFd1py;9*7 zTx2&OyhcVKn_81Se_?CjQYvU+YmKvd9SS+>Dt4^ZGo&utW71^Aaw8|$4$>NMMOC`w z(tA+d0%EIr7)+~(1ou@CyzV6WkmQooGA^f3 zt)#Gmr*+Qau~2C?RcS?~?M9)Dfay;+);}fBauH-}jk~&AlK6_wM!)xV%Gpg#uE*=H z9gc2+`3~7g@jKBA#a2}0({^tsy9;u{QkSYuq?gdBN(X8?ZCr~YMnn(B64?)uRm_#) z7FiUW(rjp(;Y35-f0z2?3b@b=hgq~FIMghv4$iTgLp?(rYOvcl#~jl9>0oz5(Ng~) z^)F+=6Kw`h>h^;GM{r#B6x^Y{%8_{FMD5YSrO8}5TeLKpM3N$du{t``EaZSHx0{~Q zw}R6^rLco4ih@J3flV)xv!syT_WJRTCC*_ zGK+fy-(C6*YLr?5ZHhtTLBmRB3`2T9$12RL_Nf}Z67_H?`IRJBQ6ZBDt*{oSqLZ>3 zK*eyOf-|TDI6TfG!F?JDfldqyo}B|_Ww!p_WvUJyG~EuY65lCw@|P=M!^|PK)~Nd z!x>FL(Bo8`r3rM%4ExMNa0m(Abdp4c;P^HI&TImXc=Bgy0&;=LKO|4{bf|mJl00V! z{`)NuW5ZSlI7{*$3WGS6d#erx#k%2_mnZCo0{%7{&Zq-Hk5h4$I;coQg_tdra`;|i zDg^vLphD393o70h`Sz)@u)0HzknkC7Fi}g$`8ER1YzaB>-`RHNOW0rH<>vJk zdZtW>jkLqRCgQ;s-WSX*t@$kf_BbcZDdpU$7_h1c)gBC1b{_t9L8a55rEV%bt&rF4L(`p;E}ba(9)!cKLPz^132~9`ychsKXm;O^ z-ezZGc0}Wqsv%^ANk$vfr5N`n)~E8f=538J=aQ0rhsw%3Dtoucq`9p6Ms!lt+^G`E z^=k1@vv*VXDw}Q0_A1YIe|3k~QBu+|Dp!SXM60Eu!nnD}C@8|W+_>mK>a*y>GvahC z$aUZaT1{4sL$%)^l{qR>q(jzZsqbnJcZ35uDpF{(fxE9Wav5J8)>mXCr$sK23^G(h zE~c~5vTxSFUW_y@jE_TI*`+A$F}^9aM&#X-UKy!a*Xk`eLfmyF!ckT>K$q_wjZ1>C{wJwM2 ze=p#a1nu>bI%<7N-GwMpyY@}atupPoRe{b`Re|1Bp~bll%t8?$Vms_w338QdY?kdO z>2BWJd3vi{%Xdwva;jjx+`)5y)lOGS)R=EzpHAR%3R%KMV zKA=~2NJpu1eJA=*?rWl}L}S9xfYaO)*eX^B96a`5X0G}Jtv;~LtjGa+PTZsH5GQ+z%)Q9er#9 zldXFm?d$>(;a75aMH*UyW|my4#v*`7)Xb8tX0|Kd%zl-inLUf&f7#6L)xDG05;e19 z6aHJxtlGv(G2YbvQrO?rtlRFswW-A!Ngy^2v|8HFVlAyR&UUxPTACW+m2;Ygqh^H4 z##wPRwGQ?FWMf!OQZ;MR!kQGd;u;~qiR&aM+^k~@$fDK@B1Zkk%yaha96&x z>2JLQ+V6M&r|ozA8SU41w)VU9%=T;0ex-rM+OIUS1nsx$TiWl58^5jnrdi$N602+I z_FD)IU%TcHY`-0;b$IGFd?$`HX}f|(6F;r(!Un21>(!iG)v&|=_dKs-cQ5Nd-Kkrt3b23FaKzMbBecj_&XccAxj7jd7OXNpF85r!Wuv2Om<98!2J%%*C+YE zGq@Q=%kL)nFByE$7%i*#smcEH@EmsicT@asq;ALr1|RglXChK;T{p6McW0nEskLV- zT?i|5P00w#h~{&|c?3GpBiDS{jOVIM022Q@__j&>Zxa7zE~lZq zdz$V|BHnps50K2JK}h(n-)fwT$YqF@t?rXibekKIc8#Ojy%LeY zUk3}fbuzU2A5@oOzJVXDs%qR6+(0}u(T*A`IWS<^+*Q^=U9hV#AQX%V^= zmI>wqEZ>p1MBY_5+#%oh=cqU4Ysa~WRBmP96G>7=H1$cs=xY$wY~Ya{`B7{Q+)*$^ z{8z4y4v}}Twy$7{J14{KPgO}!Sy1ctyVNM~)s-Zo{*A=r@(CegAWJgos(%yGMa+XSZ!TF$_J3!6BP>h?i}JG4=q|8Ds^hBv33&LZ zX{0AnFeeJcyfVkhoi+!#V$9E6$)8isaZ4M1xuQV7D zT``0?RhJBhl@v^DMv((!E-SBbRBTyGmP56jSoQUC;f-?U+e;2|_J(>WpR;QWtW{UB|V$Yb;~UhE1b|XTL1}Sue@|=ojUG;`8!9L27 zBD7wB8(ybM+f!fSKizI?Zclv~mvDG}N;%lDmmupOXZQ{_9KadP8Yf-JMo1cDCtaq3 zzM3^2&*~Q`k!aQgoPjBVVDme`d0lX-CGKd}Bw!3&lX>lE#mrQo(ba-I27=Pw}u-x$a?jyk`z$<2_|L{4E?`_465OYNE+|YgY&?@^Z|6y~xEG^UJG~JAuv-~~tIXcz)8e0aoyj^*3 zm6%)O2qPNL)d(%>v?z-FhbzJv6lTrfXx3N?V}l%v6zRHfTxL#X<&ec4C(eebf4J&k z^-(ioVQ{=!jmvC{o!8yuXmq9(BJ)qV)qj{E!?<-q{YpYzToL3% zYNRc`CrI=h&~OA!bgsCktUNH~*~_Gwvem70_nHgTQ!u4!Srn;1!EunG??)xFHIf1g z5SBbq(4$$oP;B;+&ZRZZg$1e4;b{yhRT07ouY4ggNL@kV&^t!I2Opn$l&^|lnhXcdYM-#Gcj0L@ zL)8bj0}!qxqTxAqD)_4PdoRpzzqW@z&3%kv1rGl>xd-58j41^u{|Y(c_MkZQ`LUSf zc(4?}7GiBRcSYVL>YrB-b*yseO9zNBMtF3heDn+CWk)EwOZJ9RDY8m#dyL_gmFFK7 z5y^wF6SKF1vb(GxwUeOtUC2H{HaQEe5wlSq%QJ=H)a(v$m)2YQbexs8M4|^qiRmG_ z6_GfXS62-4#A-|3jB?5Ka7jNt!G%3A&*HW3#KX)ZWuoHSx||94~D zJRrsZErMCb$CvfbG8%AFENp@dY$ll$U960&w`u<4)(ywVs(zVIn9UyRJC$J3UGZvz z%I&)T@yv39v9rdZ9%r1cV3whNTW-~NnYvnx+I5%dOK!^4{g)tWQ47-K|4B-%Og)Ws zpiFh(6WEp=J02->nEd7loDEY&LurS}(cSDRi9L-jy)iGc^(nc(Oy?lP78LjP`ySjc%I!uj%eB*&tMySm{{q zG6xY2`$BA!dQL9;Dllczjr8zE3yqQ0;!?jQR!PZO!}Z+4xy4tSX-!V`Qt3@%TZJcL_01>&16dBs^3e$*dVi;Ca?SFPTtyFLBq3nTYGrch8~-D?BVT#cT`(jdU*7T z8H36L!P>onFYUNJCzjo!_HcH;V36@QK5mF!C&5$;Uco`p_v3ql=H7S|1(gT z#!!i;l1av19V>T)M1GB6Z8BxBy7piZujLr?VN)ws5Z;6K$Y<;g&DIE=z8FI1DTGdq zVC@>^kQr`-!xX$e$=j z`^(KVv5~{vMRFZ_2!nbj8TsbeQ{K&YPEvhuz`N!+*~PNHyX4!;mKK7fhVux*lqob% z1xx$PJGiw<1&g}^Cr%oRLbGfk`yJ-&HQd^|22R{9`;EQyi%j#+YA%y-5=EAGf8nZ` zSduaKlB)k5F;&Chn|3-055!0)(n{<_hLJjdQB4LV4fZu8vyXY^Vi` zoM%$?3AHB$6Q}BZ`6ioOAoyq9MqWD^jYbPfovwPh`7jpk+iE?LhR?%CS4Vy`WP6-% z-uW}k=MF9m^p03|NRJ=(Hy7g-<6Nt|`Y7qR1sQK2yXc&p7HGJEs)R|GfPNzHS@ zRlfv8L^C1j@gjz-mn{Z79=2Ej*LF{NUgmnP`a_i3>XUu^yXvn6sru<>VLO>L(>Jo| z=H==$##R|>n5%69s~Tfawkg#lhDBXiy@Uu#%hdmlhZEfm zpZwI4i-cole;JJyLe=E^t|(I(e1z;?8K=$ddGFMu>^@e#m6TvY|5W*UydDbf*^snSq`B;X4*2+Y@5c|zswha1N| z7{MJ9S8<2vgy1S6vCxOf} zWUpVZde;eKR_y+$66Q^2;r+DV5qh6}SA>Oc;eZv5n%)Ik5;OHy#VynzKWy>A@XL~I zNA*h*7x(2xqZ6n1uNuE4zFIJMR!@Ea-7!mFLPE7(`5d)iT#Tv{W?iw)>MYXNrfjmy ztZCCZ`X9TexQFR^6t!b^S0_=N*czTOs@$h8|4cO1T(537TY@X?!Ih5SN@vSQ?u?eu zO82jS{p;U93qzvPK+b#T4GGwknbhbmyw%?mS~HqYy=Bmp>A-J}zh_Zw>|Na@Hn9hE zkMdB1V#CVEL@%1vw=UiNhDd;AB`SrV-`rTADvZC-)4uFTQ^O%p+Zx0p2Pw(;&@*4+ zfmKA;#uU%?6(jOm3Vor+hX}kT=QdTv01Syu(~<(M$%tP*U_8Cg8EWVw5b60yTTt1= zUCsf~1%`v$-JUw$>}j9BoN5hStqa z8|`jdn<~*ph8=B5HnPMkN4$urac!CuSY%M+)7l|puxg3TIM-ZJjab2fQq3pq1F_wu zia>6y8KTl}6{aPV`4!bc|3S}0tygg^Qh@X6ZAYj_dXj7PNogfw27Dt5#1-oWDLAv* z)Yt?AwHMU5#D$h&i#%%j50b#U#Ux;LHMT2CsTonX=;=UEF}jEr9yoc@e?fbyI4K6^ zN!>&=sj|=T#*``|lLIHe@t-pgH}_mlpAtiRSw| z#v=p_{b#3ClK)^N4+AH3vddi?Z*XmFMv2AS*;Ka^pkum+L$@=MW_o(>`$Ehvw8C3!ClG);`Sv&_cv?+ba2lot-J#$fBD%fGyt*nl9ziE^ z^qc)(nTOS%K?=W2r>vWuGTL6~X}RyHM86Wdcn#wz^w6{met(kK>Ku;3S^i_@G`r$v zktneSOC6DvAX6oaXIZT3Az@XKUlmN0cH(N7OT@Briw^{EZPXnhv$|V4!e#711&TYP zYAwqJnY$iPB3v;SRWpREd+EGlT51{>wv@1H&BnRF!wg>ch%3p^Y@L=Mwc*8 z9R5XMjF?<=sFw+dQ5SEgjLuR)rvE_nzUuy7GR&M&J;mxLte(-Ot_UuyE;Xk}&xro{ z=!~Ukj($O~qp8w6lUxlQe9%MI+!F7C)9f4OlRtBsW5WXdc5b+nw`gS@RG!e>@mK*a8R#u7zP`3x{cJ-2REcK8xyJ+fVjz z-JAOf{}XeBir{GJ;ib_($9ptIWQ&Z4Sli9gov}~Gk~wGf2`js$>Sq#4>)u(L^bziG z?qq(~sXjziyfrXof~=1G=hS?o%BZ`F_EhnJDncM zhfIe0KVBaA(R}J7w1|y=2X$^+{ZQ{V%GgLZQ(~b4522(om}VCLZk7AM{Y1S7{8WjO zgqYvPrhh_)+?5poAfyQ={Qr$C))egszVv)W&qK{MuR~Y<{&Msm?wPW*i>y|gYox^R zSjhbjx0`FE$oM*!ui-v*l0Ap$MhT_zSP3B9UL$!vh0t*dL8i+{v^Pq8>djOBui=z{ z%~rta#9U~u*~ZtE(v`6d34*z1C+;`u_{(eesWsYbSM2M49a%G9>IXR4Z7|nJ`A^v{ zwKcNfNuf!|{Z$D=!A1e8=^%35*2@06U1innFmn*pXF$Xt40a1r!JWK7kKq zTsuIZz!056_!+M(*{jD(-hT(bs~+{7$fZRt1fy-AvEWJMD`MIfbJ4+-nZcDy+tzHS zN~g80kvn*%wa=&){sC7BNRIS8Tlnd~sRX((Y?Y{g5(GAVSTP1?EMZFGST6;IJ9^&| z#bu7Ll$cO4OB&7hAg7gNp@Zmefl%a4PIZ%ZpkT~!EK*KuTgU8G+o;j#E?r!6;+sHU zMQF|4h=Pt9*Pm?z2=j_%s#lsrYzIj8e}ZX|^fI+pHs|t>lG0wvY>|{S39D5kq|lE`1ggW~%8^jK|}E34@r=aYs0iD1;?_~q(91UX*j ztox*vUYCIQ312r?E+H(IDCIu43eOa+%$vD7s{4>LaHCB&#jY4waTgG(OwE&c)eDEB zQEAS)`qoa9>Jzt9)md&!lgHY}yG4sIFN?KnbD}i-=m+F+czoARH`fnjzs#|aK9gWC zPsaEAsmA`co?gRvkR@G2_-^^YrY!>bbk(NkiHo=eWugc^tLM}986c`>%X`CO=|&$^ z7wQk)`#z|iq(Afy;s=2#f?+c!N(vjK)3MH+B8WCF?U*7+HiNOspSxbNvq2#1rSG+; zO2D3ggPkkE(qXOczaiF7UG*)Lq}Aye(`3r2Ir$T`h3G^HZcdyljsF7+Cq``4iq9g} zVgws3Vs#qo?x}hRzRR5All*RKV4LrIGye4613Hy6QhLr7 zssGb@4vTDdHDrp(ZaMqo*3P)77r8}^?Ty{UTIt~W(J3;yS>Zw%$kGWGRkeseq1xGZ zN7H^p78}TRq%*5*Bq+Sy>yHS2Bj9_!aN%M^7p&XAOd>IXCTnk1jv$D}8)Er;rG zPx2n=S9?SDoauVi+c(C`-Ktt0u2}1uvF509ec4=6YPRToH~%VgYvAKmEou2sc=?mPw5hU}HdXf0rY;Qy>!`{i|1Nf^t~0l`AO&!tLNUt*G$}O8 zUBvO6k6l>&-I~9@<%?vj-JTbkWxv_qi|tM$t?|66MgHS=%x^XK_UsR|y7S)8Z@$fZ zA7xBnNmFn3A8(0B7-F*D;_tmZJWqI&lz0ikE@zp#1_2hf!_67aisv8kpQ|<_G;X)C z!n6hEICGeQhp(a%o-Z_psGn=l#egE8u*iEp$ruq_Xn&rC(~s~o=QskLCxb(|9E!*S zonHpFC*uZ#Gbk^J{a61uLx!6xlRCc`>_+ICV`SDOmzI{OOxDU{wlZmv!SE7N zZ7Oy&IwB(&XRuq0C32GcGm|S>%3;vAw$Dh9l~Y7auWKd9MR%Ytbabk-&`1kBz+PN# zbe8@840BjxaulVq=7r6_E+z_}7ak|sCay%(DaW2Hk&2o=ZpHU8q+z>_U;l?ZcF7xe|Zq#QF1a;M)gbSx) zY&SS4t}?p1tBz^LKdzMXo0$;H$&pa#IaxowvP=FqAC&(FSr`Qyy7m8d{jc=@PW}J7 z{@=#GN_vOC`-jk|8Xo7Hxk;Y-9-lGAUMJ4F%`X9wsd~eUIAjqo?d-Y?)=e{@XiywOz=7{Y&mAt zb0~(j^=M&kovYzq3M+qyXP>KH4tF*U4~7mvK`^ve|8L^I@rf__uYb=~|L9=mFNh7E zX~v`A6+v{ZeE`qUO`VhHuW-4xY;|p^>xARO0c4u!+5%VpMY_9YP)o19BG@4Jjd)sI zKguBt_FTt2iT%Nl6dPqL7J`DW=yH2Sm**?GBwx`b{EC!hI7}xbjeyEAZkF4dt_>)M zaS0bO$z4uZsRJAc3BDt|rQdB2|F++q6#gad)fz|oQ25{aLCIkgcir(TI91nfw<_6O z)fe0>w0KUsLQDEl?LE(kXZUt}%m#6Ozj?50%Uhx8j$J|h9ljAz@D(Lk6JpU`dU~`1 zlW4PawDJ`Vr|SsCJupHY%ORwlb;oBJ^XiUQ8`JBKFX5in<11VZqF-X=N0ey8?Skf6 z;vX?B=IMqGU0vZ90a>Nv4nN!P&Ivz`yD4Szwf+n09!i?v&qml73rh*b!Y&18a=ym6 z#=`i86mxVHRc6ILM=%y6Mv(XST=h4|`yS-|^7eCGki74A)n6*_`L6m4cn4pR_HdD| z+fak_FrRDVR+d2{G~a7#kakyLTx^DR;RxyWrZzH2Hl<9nl9h{yUJ@b4K#a%12yYo= zHI?4QuE#dQG+p)c>EeOjQrBazQSrv?fSPK!X*#()j-n!0!>^Iw)osmbZ)hYjLfEW! zA1)(YkM8GkUmsTo0UA)^kMVg5>>qpzWa^d;zxAggv5c;w{w+ketb5_^OcX9`Z; zW-N)-4Dm$n3^W{sEW4>+=F&cOSERt6 z#7bOqltL>tc$>}C9+-l!6WTi|J#Kd>w+GrCVJ8Hf7Ao|N)W;?p{=sLYw1N%K@?W6Y zN3FBHK^TC@cOo_ZVRgs<*?*VirR%A@K!aDN1@(LNWjNP672GT4e(fl(Mj%kC28L_bzj@@Cy!ntp1!5u_2+?gmPLi7F{W`>KJZCMcroU`Ty+Crb7%s zxbqZ(=Su&uSbdT^xPg>gX}E=dD-TlT!H|s6kt+gfxvTz%unD?J{e0#adbIe1REq8| z?RqRn|0CXZta^lXQg_#Y-=q=jC2b9Rh;V#k!=H3IGComhw(wAJEVKWvhD?dS-F~zs z$H=w{6=D1n zjcbtkPF=xxqdclPfT{o6lExQCZk$zx{~(0s=$;?W(@bu6Z)B|Iey8|=#r-0KX4OsN zy3j(cr>=3WlmeTDSHX`rNj>WBCS^L2dcea-x9aN3$oaB|75mDIIA!~4m<5B?OASiV zS)+KK&O)B{wff-E7N`Fbvlk`L0RzlSIk&3u*cS?H7UmFT!5UrlVN@5bx%qLt%xCm? zr5g)uRlli)Un$ zWZmY+Fi9T595>I+k2>5x;aSh~InTN4#BenWKo$`j?nhG4uM9Dk@#M5+fulTdB5DjO zRo<(aqXd2-8n3pR*`bDmI1rww|7@4i5pPSkHPkR3nq_UI^;@mMGd9P5VlSZJGs08i zOABd`RcoK<)vr*Oe(A|()ml9bs9O7rX6^YO()yo%OpkS@*B&ai2SZ2jYS-zB`mHq} zn6vtVAsOpf`Y{$m7iu*4Xac+Vw={0KtEtygvt?R-1;AH-9AZKS> zlY@dJu1sqUNX@WFvHx)_(*$Gq)WESTmwgo~`di@GuoXjVhRmnJ?0*~wtgr?UVBSXz+f!5Vk*fzpQkp1@DKwpsR{IeZIZj>t=4)EDUETK7k^8 zGF~WiHP^o#_YtHYYa|T4SV#`M9@SosxEDLj+;?GX7BdKf)$)3-fGcRHR&=iKr| zxDj_IKc8cyk#_ogRF-}(Dz{@=jEPfh%+HLAr^x)zaB`_3w}v?aj+Dqnyg738(aFG$ zJ0w)cd@fyLZYF||QiQA+nb2zZ6xPwH zT%eK?xb!3rhd55)u#2MyN3uA+tgq0J56vV*SNZ$%T3?I8B8{txj0=j4j3WQo)kCFR zBROW;B~g|&L!?xhjk@I<1BXMTup@^q8et}(10Lucl!v91B4bdI|NM(aL`IltW3~>F zlH@)-?WA;rX$6%z#-M#uefutqq;^d8bzFFAZz#|u$Hq&`^7o@2{Mm)mg8n|LKC`~k zZMaI+D(1TtfzNuv|H7C_>lks=>$V&28oR!d2*`=>{Xpuu?EQbqWXkJyxaw)RqT#47 zG4i@A;_YOv)lROn+R6E}lYiQG2p)Cdybn7&QrC$LYFp|7BNYK_V5kjyNx&2vO1KsO(zZVq>iUw_APe9jc~wNCyW&4j&lO$$95U z>Aph;D!U|(sa#k3zRdGX@7G900^8Zi_I|x71t#m+UVCv~OMPXRk%mx+)OY`&tG=?^ z;KHablC9hQgYF`KCqhsTPIp0nWf$*`3nO51ND38Ex03UOvW4^w_Yh!t$ZZUx)N_ms zbY6CA&}ZC5&~S7icbfIq<(52jX1;+clFs! znb3$19#YY9Fy@L5Z?DMl>~B6zdXb;T1FByVL^e1Efz;v6AyE8)_>?=pL}$}Kmc>N} z=e)YIIh*d@cgQ-S?&O3z!8loR6#>zPqFDZb+E6Us%yyd;k18T|0$bKhO3ec$C4qz8 zsD92fzi&sK)^2toR0Q$V>>;{5Cp0bF$8D2p9hGloVoc!f=9510N38@H+9f$)AcC*+ zsSwGsWRei~=z-N9h>@Ph{Q5E??3k8)I{DMwLjH26Pu;6Slep!i5-Nz(_j1l30|2QfX-6%cm=|-ApNtk-?@5Y0R+jni ztwyG5>t5v_Trkh!&(_BhEU&2Lm0FWb6R9$bhi>X!#X{8Vt{U^sLa`elH`^Z6b_C?> zoF1<;8XbgamWXIz_Q>}B;|*d9;LyJ2jxXR1`{nOWIu3 zMgE}+xqLT$ldRpV(!E1Ty~OJL2dwE$dUf7V4*OtOj3HE5!WU9% z($M2`$&#OT)b_dF@b<+Du7uD19}o2S={~*D%g8aN*x9qIYK*t9Dx-z#K-r7f_XFoZ z)DlGSvaA`r|H|iKar-MBKRw#wFx)@=u+#FP-hRr5%tpX@865FB+G01-DMvi=h$rfKaNf98Rh6g=O8~`J*fkYB+;hW{Wjbr21jY{RL?c%WwW_cR_=L!<%M#k z>07fVWuw09d7FKx9T}%S+x|bK+iR(iCdt*itt1 zvRzL!i&Vq@Cf$(TR)4N_exciQLZ33d4eyoHYC7}Zo8QyJ8O>$ag{I%=(4*yw;p*dJ zn$3hGI9%Id6`5zKCZ5ceFmX0SAPS8W=FloYiL5 z_ObdT>vW8+bNN8)O-=5Y8V!<8<)6s4-xSbNw zCa{E&Bnl_PV9aJs8O zWRvaQz3?tx2S%YG0XynQlEVvrSV(6_QmA-uN2Mz1Nb9KV)<@A?4eybbdJ?m<)-)o# zm2X1ld|PM|p>^4;NW$xMh}0rB0X-Fqo8n?CToj~R`-BRjl9mt8zB>m=z-G{V&_*)r%KbGm-?D=@evtnvjo zSB&VN;*i`%{so85e-KBfkWq)@bsS;CO8jMUGZ~Q#KPT=5mV2ilON86S!3p65+i+Ob z=XW1q$~xk-Qq&dMT|z~Wd7G|Ee}>wP29Y(x>F{=UT)@O?-S3~rW-HIzJbQRLc)~nO zc>c~)%rl)QiTn)a8P3yx@Ko%`#C07@u*tYZCLt(B>|}&ccIGz>qcM|0dt)Yr^iV4^ zf_dsGmN=rqu<}Y6;mY&nO!*iBlxmck40WZbyl!(x3=VC-ii)?6EK(&X2NKvF%HYE5 zsp{<_X?MNMVVF8PDq=JJ2Zs{JavcZ8gd!IoZO!rj4V+R~!~oMp8O*tzI@MAAwsjaw zHq_HqH#ExMTKQYY->H$t95Ufo>F%-uA9@VtSKmMCOyPp`W+%5^cYS|{Go{$Ud}Dd4 zfY~w?D~u9{)#2sb+_N$;&w|M#aKJiL?OuJtHe=N-MwZ!HlU%_?A}k{e2M=!lG?6;minj=f>*X&pFS=rZ`M!0#aA>K+OpBD5n3Z)I*926WaZ!S?AchztqOBZ2weSs4WV{qU^21oEu*!?5TTki}O?+MPl6Mz2==Bu~Zrq2wXKma+(Q$lR z<95=xuhOaN#(nC*AlkRnbF(uzE-m&!W7`2!rgk1!^-9 z9`T?2@GkyySG}drdK4clZMvX5v@$7f1MJ+8_x~mDUErgtuKn?u%p{p)CY%w11_=;N zuxO-)4rsz87#pDEdp z35F01Rl_oBmaO1Nk6s?gz_le3IHq0|IG+X9%$H2pg4(r>@wr>Xq}=5^%RyP`c;}`> zqCDW1CZf3H=B4bp%cZ!+)mDlX+y-Nbez?~B4+2ang zHmUAIa?T0EqMLpd057ob&}N$)Nt46vUVrk&O98hd$9G}F3@O&@AJ}vmp6%QgH65q$ zWjh^G8n-;PK?Fj>rL9m)F9^Sd57eVd=>_V3BdE8&Z6}uKPOFrMBfpqX2QP?VZZ;>N zr8s_FTj_aSaLrq#jkTg46H$Y?YEp^OOBG^xE!BDDo};$ zm?8)zpn~HF)B00j&@9>cNz>K5QpIkFGz;EFNV1M*EfoH4(1j=PQZLH?t=e5M|+CmB18Kk7K|% z+`5u%9U%ali&)NY01?3XP;HJXYuBA6@!hDSh@S*>q^CyW=MeF^p->I}D#4ZXH&leb zt-%cZU4_0Vd$TBaFI`G1d+)?wZ$I2IXl!^1J%l7}5%mJp;#B`8(r~_=o^VC?1v+bUt~5OhsL><71=?uqdRfq8rKqBfd}+JVG`uTbCh5S0wQLVwv~_yhY-jI8mph|QznuUIU+imj*P zd1Ii@MYJR+zr^QG7lL;nmAx1XcsUZ-mV&9Mq9I7()f8@dqXY|idJWH~YvhJt1^;_H z|4Zue4Z-j8zjxqoOYq0|YgK|X@Z;%2%hUKQFa5Ov_Ea@URq4E1==+2gr9gX#vLe3+ z7Ru+B3J()+4h;|fc$K(bK3^cz@8nN6h;I4(5=k85twhL1ym6T|FbFlC(Bhat_H5~5 zowp1|;FWAts=ShmzuH}aK@WT*QjzaLGC82F3=FOj%L9Y|EZ!U#yj%1K2DgZXfx+d{ zByIjskh-Sj$miFIGvxDkLiz6eX7S>oAoW$dJha#v$i7qjxdFpakb14ThCm^5LBd`&O9@)=3s?6F&%oiYFR+(BhJH{!ep+~I@FIeFDiNJ6 zycs=rp%iZka;N_QhBGfJ4__xxmZh8jXYoFbVTQP-(Yv*5))tJUb%*T7M6teQv0D-GVqr@ z1(`9YjY9qV=*JiU2Jp@RfUnq+e>c`$qslFw)xaA-Th-ENX$aDKn#p z3H3)QZ}iMjvj&((1C6|j{|eY1E>Z;{7wWSB?6(esF~W@@nhkRpT(-YE3_lyG`CU@u z8x89@yc;zPOAxM{=zOER_ZHMoSOi*aOypWZHEPu-1aCm@*T-QF&*Rf?x2^rV5Yh3< zoR~#lhiLUMMDoB)u+#=Z*=;kwUL)IwGm%-#5b$~g;jS4An&h~QPnmYfn6CHX^Jv$< z1?B$t$NH)fn5qHOm@`L(MMFrM+QzHZDe;<}ww6 zvmwznAk>4iQ8*N`<8Lt(Avkfe+n|xkX>cLbok${SoPS_Pbif_y$GU~$id*MH)5=Lb zCJ?oA0=E?;j5ZAG7~s^QuYo6f4e;BSc61EQ0Rl11z`3W?5vdR_HTqXa2> z{XUwplL!>Fg+18&y(Wp#L5YV##9<6~j^`XS$GQvG;!2VW_Hd6kmuKPwAbe4nK8ONz$Fh>74^bV2S+=^i*-ysL3sV6alG zDwun8qoaXun3|*EG1@pAkIv=48?SEUXm!QIkhO4Qbutj9hMGh1j;>}f~J z;u|GqOpEX;uLLUnAIATu_1H(zBJS@U(_rn~*4V*cjrrR6vN0~VQV5bXi`c8l=(F<5 zBEVs6gOPtCE*eLj?;6{Sl!VO?+ElcyTXA?EP34?8V8S(zxr1d1!A7E0qf10^ueqY|Z1hs8x<+}~74&2ro+ZDJsz5z&a2FuaP_sF|ZB=TJpG*=Dr&&F~t zVau~=sZ?jJh>$muF^%7e#?5-8Fu?lgH?(QS7`wZ*c1$~4sGS!4X^1N@SdqvUunUVL z8}Qd`do+i6`Z{VGI^Ff}j9wsL01pk)!TE%4Jeuo8bgLmEBA%uy#Tq$;7iy3b6|}n- zPbLRB%o9i$c;Yy%8U!W((3EV!X+GLnc`q@dSfsfanJ8lx96kg&n`J^-TE6oH>)1<&BCC13O?NG#bh3 zc_l_2k;^bs-+(5wuBE98?4{9!5@;%QfeXsjAo0p-h&t8ZDIc};pHz63!m}c6=(ss{ z=4ZiQ50B0k@tWueUcq~N`!5apcaM>Mw*)CycJ1xqPi)%sJM=^ik+yK`3!9~GDhYpL zXFJaQ%@~+{57kWT_?A9D!ap+meD^o^IS(^2+-EVSAIf*M?h3#Y?%-_5$o|I>gtMtq zwt>0^H84>Kns~;T#Hm3VD1;Z$+=0DByt;wA(#o>@8 zSr?C)GLky0ogmMPjV>6)z0DLM9RqX(zFcS52+Y zPFAtMK-?eIS2()_9+_W;V6_dVkk$FsX)p)6aTi*yfKFT(vSgg!1<;GoBcvYm44ulA zIS%~w?%#N=+!QMpp4Y2d^L0z2QfNbBnkBI%|1vyy8Vavb=TLdMDL+(nzOIET@V>j@ z?UM4U9RC@iejHIzAA`+KJ&Bgo6gsE*F4&s)aZM!L7Jg6@qkfPxg_^6qiaU zLbcIE&A)1KDsRlA2TyI?Kpwro#OUHmGIT1(=rtzL&A1=;;gSVu(g4{Q2H+M_TmTc{ zc`z?FVe@bkIb|L>E(HKIseP^ETnZb+qRBoWmm_ zfH$RNzznUA48Pyx{Uzsp*BTRnX}B!3-X(9PC??R?Jb)~miBtvHhcsj z*c%YCz{n2n1nhM>-R9K124_gJ>DeNdrR;@kEOicfJcdLH0@@V9M$($f%@eJQ%h;`t z01-lBoV76yK8!xCwl6McAqcwQrm{lG>z(F=f~k1OsG&sjl(B2@L1129MQFKIyqp3w ztR}G-7u1Q@m%(M%wUFNM6N$7KP}#m9?=5XQ2Z1FKxYG$53!rX|odJk}w-D%5tN`5l z9BPn#LN!dMBoCaBnuxs9d{wbHx6+=t5#M4x!#KT8%sjHQojo=c)0pA*MZ|ZZ{ zl?hk|fq9opbhGcf@Y3bbuqr^7maE5;#ul8n#w<`uU5!(TgcY#q@MTZSVS*k{R*10l z^Sc`3bf2riT7U-7T>UBBzd)QSJr_8iCPKcPApHt8*;^Lq(51LwK{ti^2*3cx29>Pb z1SzgS`(ml~F@Mp47hKUH0rEi(pj)?kPA&AbYcU1$1M^mjg9PmrSR8N>MzL$)`wHTl z%OM2n(ULq(o>S-sI)OeMjeyA;e*Bdq(GUD2_&ZswJ^0W)WL~9*cTf7=7T5j6)`R zvT6m!%qFKjoGG(0w{WQZv)7@V#XZJ74gqjkNyC&Uxf|I7SO(k4C$}=k z4p(wekRbcf>=elctwxBpNvE%*BvjkW60wfRb9$LMA5az)Ze@+%mn2q0_ay5^%8OqAaGMmee4&)b=lp*3vF9OJc=C+90 zMa)KWMDz$xSC!$$1TOofUX;@RfE@^qQZF#eb5ugQP@+$4!eEe4J;6+m1fAP+wkFZN zkN%W@ql-`O`mAhEFO{M{-&(5Lvd)5g3@9~BTn@;2+|tLw&yY`FHH?*KIQLzNSMqf3 z7dWbMeLF}9`G$b44Q(+?S3)|jhRbuHNsU|5&})wXwc%6jv$`-(g*V#q3OA*|jCi%k z5j@8AX1=5a@Kr2y)o+FCji&raH_w1Tw-X8AV2QfwR%Pj}FjA8T9YTeiL= znj8mgU7*KF_1F9viaT4^3L~hDEfRKJXWZJ_(J>&T3mys90k_hu_82bT>30`@reJMw{DrjY>-G40 zJa8W`#qV2&nl*Ru3yR#AbP<#`5fjPTqi{!{{qHJss1+W4NSG;U|GpkJH zNRT9b_V1}$xSBx|+zn0>UC{5uawLy0wcVhkQwYIv(Ng{*Y!Rli?bwwJAB^vl1QcFu z9HH49;GC)OfZeLyRh_~-Bo)LGJP()tHy)u28VIAQLq*kzY&nt@@EVXaRm$XJ0rtUQ zQlv}D*(K;u1)Dhhky6>MIl+g+*T@Bue?_mqAq50C*Ujbw)@IatCCHt5B}KPNA){yT z`$Nu%(&;5giKF@=_6$)H+>1@@K%Zd*D`Q!s`wuYQwpL7Y;0GnA#*x!)T0F>Bmk z9Z(Qdbd53{K#NVI!D-}K$k>`kGSFS%7GJfg}! zwp*mPxZ5{)31j20hISfl$n=nb2W{7yhatEC0XUEXa@&k*?fvuZ5WZQ+I?N(^&>rF} zIy`Ocv47TK>a#9IU+>b_yAkV#%|k~)`zv`F+)OJmdvJcYG?$_phkB)cPpW=Tihj=w zHqk5y7cHe_?;j5AF>6~cM~NsJX0wTP#Vmstk2kR2IT2$ z>%|1uvBwXmtyMWz(YSz~pKA-(Wf%FNj{2GB*lSLpZdFcUity-u6>-@{)nR-OHN(PO zTbr!kb%Br>zM;1R2`ohj{WancdH@cghrK_;Gc{{*X=yY99A# zv<9!>1d#5CzCsraw?S|zwC)yq@eEa>|AC(K`E%~@a|VCTk3K(Bh!pzmUgt7u#5d0@ zLf&@zgIHjOg*9}|7w05VS@C+5(C1JR)_Cw&4m`XX4E78HMw}G#pDwPZu&u@L&Z8ek zR$QMCL244}{BDaS&7yg>6D(dI6R$)?cz-!Le>zLwZYQYd4MG^x8-&(8%U|kqcz-Al zs<8M!qUUt+m$-<A zef8Zcd9DSjAp2vMNxkURCz(fu-PS6_o(S)mRcITLC14-|VzD0|u$!nxGq%L94P-BM zz?pb50#}@ZMdC5Zom1+P#+#^2hX)`$zMjC`!@#@@140C|cpqPIIAXL8PUE6aC*Ypw zJQSl5;o_VD%s3O6?*JI>a`jy1=g_fVx6#IQO5VfG|ajXd6&zZt<5REm$F-ZDIbJO)QBjo%;DcQZSL z-43|GBv+#d*)=j=CuqDTkF=t_5hX6c_AOK8!I-V^_+yijw?B(Bab+|AQId=Y_Ay#B zwfyc!63nE@N){K7EGK^2;(G0=qxITTNA%j$NUuGa>$ST_^x9KNuN~YBopH8p&8^dW zpggpB_GoSPWT*gsU7LOP6QIXqwApEaim!+4*CR$q2`hS#lVZ~NCf#h(X-7*yA&S4u zLt*L@*JD}ZoK(Wx9T-lo{(Tli&rtt<^tNGC9#Q|UydRSzWpMRxD3p&@{MPucocc`) z+%%DNZn+)&0)_f`7_jS`9P9!9>tfsZubXY=zsc-w{+q&nK)=_rTlr%eTh4zoSP}o7 z!3z2B)hwU?X0dGkJDX+k-&8h(|7No^{+r8E@GBq4*Ei*}B%Za1#q!@m_SgSK5G`R} z^4}u%Xa0K&`xF0N&fe$0E7?2z_g3~c|6Rj=&wtmkz5Mr1_6q-9&wj&yMYey^QA!r^ zQ}P;~e3p_KJh_vSlX#Lub!;3@Hc`^XlLsg{@CyQ`jgo)n$+sx^5t1C_4thGlU+ke| zJ5SQ7k?rHj)0BLPC%Y)QlP9|=`4mqwO8%55&rDu(nZYPMB5ub^tP&h&~C(zL9ukXsBEHW z>=7t9!SITTEhM3c^}UG^(2l4rxG7NW{F(q42N3v&7G>E3X@8|VgHkX>FqunUX9?io z|633m`H;@T#(?Q`;4(l;Wlx|Uh%H$Fza|XL>hZ{SU{bJY3y_j7MK)Z@Hk##@50_)- z_u+c#D5+k=hH|;LHg1d!7*u#zTQbWoe`pn3ir92gRp*M$@qGZ!Dq`a@&6Vgd^9R0f zVIMrLly+&8SRbl2AYnsD0yqQYsBnPJeX8%YTH3`fLzgHH61$CS!}Ht2Ciq9?FpN^xA63oYAW03koSCT&fnQL^auTU>NO@YBglEep7@ubGt zTIDTpfitnOXm&$sZ-f6!`POV0caf(T?IvMgxQM;j4x|PC&Q(LyX67NAAJXT1Z<}!c z4pfY?!9~c&-N~#;BqTv>OWb$=)DF){ItN6XjEfedP!UTSRpy5%Lo2^JHstTcxg!*! zib(s3#>D*EFuXHFxOw=X+7jZuErJlSw@3|Ar&J4u&In{eBc6z2Pey@-8^cCR|@43 z4ySk}9FY_${5@MXrf@2UgZgJc19Fwa+Y{~^1Tsb(c(0CYoM1rNaEmZo9j7c3vLl}X zn>_7=n%RV!+wmCKOE?4HRs^UJBo4^Hv>ZQh>#r!G9`f{MazqFP3sK1HcW=C+al*p+ z%2PCHfv*w~ZW1_Qi0<%?+GBi@*+b(!1En#CypnI8#)Z@zFK6Xr z;cXEf^ip1PCMO79;QM`dqT7+_!=T3qL7LD}K$9)Kyn~Pdup5vQ$`b6W2>6AZBD_N{Y(6Woxm%LRA=ls}#4brEV`}3{lVa{O|VcpRsPf-m}{% zZ*P5gM8u8`Z5rvs+&EF^=rJ$6Gnp+YVFL;Le6R^{w66 z34*qv$wyrb@H?^T24GS_9qR=LpVeV$HNDUX2t)ti+=F05!ejwEU++0O`R?&@? zqEP)D`uLlsR&?23p@QBIwjI)3#s+DiHgZ;~e0dvFY^+;8(M}A9c0FLBFR{(K^;c+E z^x4_bg%680jxF*I!d_58S`%aIm-!xIk?xfD@-pJg>ey8|do#-@+J zu6X9cOp>!nQ>*P|${c#ft{(Fuw))cLtC}HErFym4?NpvbDd99kAg>!FZy+_FRu8R0 zi5`?Fhs)_<<`0hVI3uFk<4M)Sf!kI{Ii(n77Cv84H(2y%e0+E{+;%s!zDq!!^C)s5 z`5V|j5$kUbwZ%58fYZG01jEYv=k3{WIc}fO_U22~!`B{E1@T$!%6JRY zcPUa-E=c$PP~(cAGQEM^VgYPiuV5dbdZ2ZQ{Aighq(gpJaY;Fxr-l5<#U)B5Zle%F zjPCsLVRBBTO9*m-A%gZD689=r?KOi6%L6|Wf+SS;ej(Ivq~G(x{deG(y5cdq5?O&~ zKB(kkVAPr5UqBY%Q|;>qJTmW0hI!`<+<0*V&SCRT2h2Nr)MglPB6gnILcg}7+G1|* z>BfDXi!RN+!Q2xrr}4%;Z0_lTxu*bgPsgT&rI~m!`Id}i_`5;|Qm+2@plkV_MLnn< zS5Hzqt6&ToH5&(BU`|Qy&311!8aUd7`8raRbFA)Vtd9e4@z zuPxBPYl-2`7~a4OlzPiR#aIRpT4S&pjx{=Qlb~$Cr%`3XgoP<_rw36EfhA#~~sXaLz+l zUuEohpk97anXSK!r4{qnrV~H<(7{M&de~)!kwu>WhO_umhFlhNhM=p~dvK12-IwG|H9U33E>Hznlw9Ger^b@b`wT61}}KSi9X zmL@~*%I^|>)dVJf?o6U11GYnIm|aV#Uz;pnKU4ieife&I%SJ1A5kIkUsTBmFVcdw> zQ9(nTrzzWq8@48!&t>buu)S+vMH6)3lr7;w8*wzx~ zQy05vYOg`;ox*$L`a4?+tngE?rpEb;>NTtTbxT1EZWsm<={b=<+tmG*0()QV8W29~ zYB3q^Q6-_;7MgEG@c2E;cpGEJ1jpx3Fs@Pcv`3&#VBFQoXRjW83db#-DkYQevg(Uh zAktiSamat7mVaw&AvbdN(%d5_(9n1yNo;F2=+C}?u2V3jAZQz8p_Nt zw0HW1Um-yig_c^2i^!UvUShoYD_g6rt(ZMLo@%FCuGp4%i*_kZy6*%<5y8buE7q-> zeaes9DZ^Ju$u|zm-wAa_MD2uGQ#mrGm^+tzHlqw4V1P%bTYYDBoRU1m+hh@me*T9f zV@R&GDYePiHK25o&L*H^#%8elH-uh{TZVTVG4Udk@javxn>w)*$W6|cI16SHnDsu& z0<+o>`-(yg^kP0Ce2FB#PR^W4(huTJ`JfPlz7Ci>7&Q<%X^6U!99k7q zR8r0|cn4q-E>5EM(TH(uBhzwhBaz4G90c#h_LjJr1#)c)N@QVBhuSi_>{}WNtkr8l zvC7!%P(>y6S)sm^4o4`5X&Gt{eApETuWxX)dFsMMHh;%+%o&z4S_)#a@JfxZ`w(YIi`-&EZmd#zmK=$k zB^Op&Jj%?%3$+E>jfm2hjIi)-O@OBbRWWI5LW5&eC5nGwv%|Yzxc_BAvYl{E%Mw%R;kkCWu!RLJY#!l{}EMDaMA_!UOVM7woi;_6jew z*~1Zgf$mSPBHcsG5Zb7Hkw4TFe{+@Z0WYiM0mr6U5E?c*0)tf~GAaN;uw)f#e}OKA zm`vF@QhcC!ZbOQeFcd~m3)@gW+(iLWTqY$~XTcjNXctyKF3>=a;D{Jr`amU8EdMb( zI?C$-B)RrxKR}b7Q_~4)(vN5Q&X!b6KDtHNhPYfC5AtE_A`u1&G+l(6SPBQQ3gEb13p3=w9;_$cOO5VzVW^8m_F7~~Nn z(l~XSorsZs?-l)jr1s$ouGUop3gIGsh-P*v&dBA}StZQ5{+oy`=kZKlbS!;^#t6~Y zRb^voYd?(9qqOzs*hj$+&LhELi*_e&tKD>0&9)i&R~Y#vV1>P%Vv<2>)n-m?LA!~} zs{T&f;ZcOv)>_1_!4ZEHeFZC*!s%;SiF$-B#omCI!w1&a7Y$R^uWt~%B6D0N=nT5j>1jf|DNg=Fxmgs_!0v=%ab_EU0jWbY-m@gVdjH}*gsr@LWWsP$F6@76x@J74jn_lpePGPxG3{vI z=Nm#QXRp>F;w>r6SmAFJF~9iWgR2k|q2^mw#&-Q1BtvvfQXGQjSte{S1zUJ>yE9x7 zxe-)lI5$3;%WYG6<(+N#>yi@iZ14XNJatL`humw61B`sK zjr_Mb`aiTCANIWhG{J>74sh)NCF=hN$p}}3DRAwSh5FBc89Vb4Yk_`aVEn+t3q|O@ z6bCy*8ZsgqAr{kwEMeJ^nd=g?5VDSs}Dt${L>HCmC zz?=J|V(_3;lFr;9!@n}pLt+MEk^dAAIJcIW@)LF+o)O=sf}$A3SFAQe7&YeGGw#d1 zPl~6*bQ(f-Y)v6o8q!2utsT6cMS6P5%o(!KG+{Ln0+si`1TvfgeYZs&Qfh zoEF9-Lwl(q1r_K8b{>(6W=w77CMenyUpt87ygM-mzJJ}>Qz_;!9cc~C7l=E+tYc-; zsqC_~oDk!rEloAgy~3;GpdVwLpAGgN*Adzw(iP^Xwcmr8=hi{BM8O+gp!pxPZk-Mp zc1@b+7?ksb$M)Zh%I#(_OT z3y)bbcE*{0G%zHr^Wrr*WkgHlMFt+Dd#bHtTN8qFQAm4z_#_>r2k#h!cbH2>K6fH` z3HBy1cz653iZ|<`!x|9X+4f`Kb#2 zsBjZUG=A)f-Owg2rR%J9j($X>1D$zv4m|jhlFOd}*4Oo4zlW8ctQKDIK>u|f*MD`Z zMKf+zi!yFzI3HjsI{rrem6UoHWw=X=pcv>zBWrZD5WW37P!s}9S@R6#pwtY~P<7D#jCnrQb2`Bjko3{Amt^79`B-;9P9@EH4@N@~DlV9voZ+7JrJET~y+S^=G{JZs^L9FLA6GZWpn;gnQyK;xC zw76(_MPVuYF2oY=sI>ILf4Vx?;HfOQQ>Snu3e4W z)obP4ED$3(ZznXVaOIeJNOa#II&P3AlvMX>j*{vxHCst_pFS}_mw)lHD-QUjO=MfQ z6AF@ynB9-0LIzUCVm3n#(1mddtHwJy&BB%q7e~1{xW34mo56$L-yVl`Wq`W*w9pV!w@YhXr>ccPGz?^h1VUGm~!!UXi+w|sG~uFGG+@TGtID}t977} z=Q>7a1KO-@MwGG}*Q zMIipamBz09M<5rc&}%4nA0n_ZHr2M(N^O@nk3`P3x2XMGu$+^+3qjoNyWmJkhPEZE z2bg>tvr!y%J-KEEFNP9^u=M~yaNAw_UQO>9R`eE1E6RI1nZ&d zZ=x}6NDk0*wJq==T*%{cT*`lrw1vbRY`idj$b=5|)~m~l5L@?Cd{xA*`h-Y|3zzZ& zzQZOW$X$QME&$6Cif?#GUyToG+f(9Jjd-FmSp#hALH!w^<(MSo|-yYA-McS}M@$J&-JRMJED6Vctk{bOLa;qjL=eNZq0hS`ut% zi!l>t-bPC_CDW*0Q^y7L83zUj&OPn==PyDdrvIe;nYGd9`YWDVt=aLU@C`Tatru1g zpSfm?2z2H{`vF~(|=Tr&)L(s*}BHBq=N(xTczOzV|74e9I@_`wB zzOyzd6Q1a#i?S;jNfoJb~sDn zjt@aaoCr+iP)~-nX|`j|khp$dktLfpewA>_-Fu0m4y zRY)f|juceF{bC-~j-KS6FHgbqC9Y0TDix&{p^2#H%VhH^#BE%Kq~HQ1m0yMMOA-IQ z@qcq0vP_ERRjyi%Q`}pD!TgOA1A}QBY?RW+)8OTmf2+X3~C@YrUAbO*F(&9EmWS!Hs^~PhnHKaZ4J<* z`;n0=O=8D>&cWP+AM-%G0!i&!b^lSO;3N{>U{ieHz};*EB+}%)q_PKspQ-GA{smpZ zvxj(+HX7<4=~Pu)X$pvM&-w$t5|l;bW`NCCZW(vAD%cM9&9@h-&Ek(5Z-CS?QQW`} z5qIi-cc6C2(%@7Dgo1AM_0r{H%c60yiDHo|G%gu8oeKMS;p-uk74nTQs3?xURCIbG zLXJ_IP_l6>(OQ(J~Ac5(C~uDK_A+Yqmhzd9|_!l3iP~Qt5^` z7h)oKTA^y)jn>>th5Fy(AvZ~MHQ1oE1Y_`@&`V!$p|@>g3T{gR+0bButp;AT*b))` z8t19Ibe|hA`&bbvh(V`iG}KaJRK-)m=s@gwy$Y4dIC~-PU~2V5@wFCPk{aLW*Bh3^ z#cI>Nl|51%fAKWtNw0=wfP*!>!znh;wxj$)07UA1_Z0x`w25lG(f54nB;3O`S^+$? zYZww0)M8GjM35^p} zq2ZQs(-)FIiRjZ63o|>l@%^2@sJ7mWb?#sR5AS+pNMSys+ZvYuUU93Y-=Lv z{gR8bv=-omvr7K^NI_l~aMvR2cF2Q3i<1~Dc`!-5s7i5?%3f0pW-ynJOrN> zQ$vL@RdP|^)1K)}zD>#;vMzLfD?ivOX#s7qY zUzK7bOc@|dp~N5()7AKvMR8XoYF82F#2bZ!9CaY&bTI#MKEOtPf>89|zu+CBfJ@4uQxdhAyub~nb0-+`uiIyB9} zp3nVcL)_etH^;=BncIp~Gg2*cyFhUwR_UmxeQuYS@EW?MZ;0tXsfJgq0uRqsWNk&& zwsq)J{<>aV8|xDv#JYKg4yeu1V=8pn;VC8_2h&IJ&e*4E3nh6X#IDKg=AR7jGG9KT z>&{kf5u|srm|ez%&&kos0Q>o6;0xJ9r|E>%nnt`d6q6UOiD@cV<$yvnWet?0i zO2xsm%4H$hAr}I)(ezuOj!6Rt{+=5zJq9@xrlu3knfu$1k)#t{5(y5W3`SMp?CHXX z&1LM`Q|4@yv0MxSJWzB;4@uZ@E!qiGTgGH6MJUIp%?ELLWTM;z_CwxMRA+8Gz8QsT z%=rp#=14T zytW%>Irw{@#J)rexS2()zfPpg1@H|DbZ&IOz^Y}`mN9ek+3eBWFZ3>4ivKNPcVS|Q zdJ=c70kBT~HnlKLff__%jIi5M_c8J3b((%X_lHof_o2OORiq!~Ro8t&_1+u1Og_@Jm;lKFNGIsFhuzl~47k9`$hg5ribbdxWSv?UXtdk1Cxwen$6oA;bav$#m8n zS9_{s!e?Sa{(Rb)y%BW|0lXBBcSa_wEIL`f4ih2_ zcjiH3Sb+^_H#ot#8TmWYRHe3zo~AR#G%b}6cNI_vJ;yQ+N2h64DEDIT&<4BrE1H8& zngb;VcaPdMOxIL%sy0{=g6DJ0)R1+fjoezyQjZkg`+@2|!Kddk$Ur&>Lu!*SQzP@E zCOv`7b><6kN5w9;jWJHoLU|!K@SbMyi@7{o$%mu=yDWe>ij);3aDWN;!z0l ze*j>0%Hsgg#=!(r7Y?_MK_$4J@R0_ z1jiC@sinP2g;5#OfeNcPm)z6~jWC{~-kRSpfh4H-h>!`b-3s`u_ha zf=U4Yf104~L$fAJLO6I{U1$GcL6{f2Xlm=Qr`bmf=a{s4FvTCWdDN%_2slt z1hr-ihw5oB!zGKa0lI7jkSRYBss$tXpdvl4_+M81I~D)4ivMZF|D@vIrT8Ds@n_(a z`DXp_!Qh{e1XG#|3na+?l+qU(W8enR1vh|>+(a1FB}ujgnpW~sR%6TpdC)05kP0pg zk9tjLOHphWoxDgI5{26LORDp1=749-)E3|e<G`i$N6|xno0}VI=5N;UG75R zp=(fCu5WAN)oXIC!ULD#sX9(mZmf1{^#*Xl{j0IZeyuK{{x)RJZ8mi6)zTLtWN?p$ zwM%nzwn2dQ@}!N4y6@$ynj7L5Yq;avh0f1yuKnn5>RE?+0MkQ&sWCzd`}meBQlw|4 zD-g@jZ+t2CX(_1r9bU6DT66SmZMXKjtD5miZi4Ut}uFFCz+3?M|E{9#IfYnIhj+r!3F$y}Sw1%Kq3I z+mNq+8OBBNy-Yn8?tdR8w2JD)iW_Cvxdx9w?MvH-#^I`R5_+C?M|+~MuP3x*RtL;$ zpq;QS!5Gqywb<8+@eBmjoVhu|!?{ z*D1p8g^6m9M>_l(9Us$=ribg!(6{`yC**P~(j&s|_A2im1UU`0S9x0n`4S}F{Ogp!jH|E13gyT{{DEUyJp{C2-uejzkF24@btw}%cUFQYyj z)3HQ0Ul46oaGUCTHb%bd=@{Mrq+I)?W!vu%7fbg&uKRZq_HBElE*#SYK!fdDuTyJJ z2lXwPssvT<6GzvcfY&MYU0a{CC;aI&_>pn$uM6|5Ega;0r}4$M!}P~*r%$bI zaQYssQiLjHaiZ#bRM{M(l*bKga5^FQY;T4L?wN@R?l18#|KbGqJ^1%3{{032VlGK= zufV?o{A(iEUrSi#E zUkBY2w)##OKb>#Ab^dznD+IC_*Rn8Xre??AG^onr^1cdQrmn*{1&`o0d3tK4o;ATO z_S2BdLTL;t`$_h+hJ`UztqX0|tQJJLCl9EIX6z()3VSOt4&^KA9v*7`ZCSjT4?-JhZjMBjVQ=s8hO6jMHbVjNDNbx^zkh9>a zdxbqj5M_2Nm3bUC2=y{hLiRm=i+U)0-iD|YLj4br!{c2(u7(x=8+@*+avU2jf^Bx~ zfgL+QvOxh`6yF=3cE!I3QZtf|`3Fd%rXKZ_e!7oK&px6#R!VoOrJtt1n|?Sn`yydC z99r%O)r2WhHxy1H6u#CZf{XioQ2Q{5 zU^fv#NPRgG{50|cN}*b5!s7mXg9s+%thY<{oGkI>%cK`V5)2)hIN9^Rpq4h-+Lh8> zAbX{uB}rWrk=c*s`Y5(Y++|=Tfb6Md2(H&AuYJ}MvL|}?gY1Qg>^)1^DAzt~Q3^QO zi<5nifb2aAvbRgF-379z`rd#kf$n=j_czJ4O_pt;x>keo>07=1WNl#yNHcM{0G-35 zYkSlVTT?hP%?U!$3llR?KwA?CpmDeF8>kBE+YZtnzmbI`s9!5lzb4y2pRb2gzddAI zCiUVRfAp?_@Q2fm{>6C?)f4rLI1d&o66UD~)X%qvQ@@^J>emD6=kFo&5>UUvDE0fC zQ@_vA&puB5`YaHrV|;V`UvcX9)nZQlz9Q<^N7V0glllz^_x(HiXHvkOkUet>*!49E z$jG^}5UeF4=4auE`*o7Inspo$?)w#xL9Kib%$4UD<_V?|FjPTQMYZ%j&&l+*^p3iZ z3CTjU6O~HrQrIEe1bGQZtPVjYrw4ls#Oe_qm_ttnV)bmkiMG~mI3JAUP-)foxwCdB zsBjmiL-Bot@mG9js+8JKxppeL(N~ot?F20zMTg;^Fmf9p2jXG9PbrAvToBQxxJL&38_wSKw_gJ>Q z$+zKQWc+zui-C-Nv<*Y`4BPNGq2lmP+(I)CDLD2d+J^gph&&5PAYzMwh&@q6+(n33 zI|>m$a}JJ1#M&q#8r$&yZA2{i7DVhB-iDw3RwU%x@aInH*}p{q=~H7HCR;7Kju