REM REM H.U.G. - Highlevel Universal GUI implementation for BaCon based on GTK REM (c) Peter van Eerten - August 2009 / February 2011, GPL. REM REM REM MacOSX notes: the previous installer for GTK in Quartz puts the libraries in REM REM - /Library/Frameworks/Gtk.framework/Libraries/ REM - /Library/Frameworks/Glib.framework/Libraries/ REM REM HUG expects the above generic directories also. The new GTK builder from REM http://gtk-osx.sourceforge.net/ puts the libraries in some local directory. REM REM Please create the above directories as symlinks to this local directory if using this builder. REM REM REM Version 0.1 - Initial release REM Version 0.2 - Fixed crash in OpenSolaris REM Version 0.3 - Better library naming REM Version 0.4 - GRAB functions returning text should contain '$' REM Version 0.5 - Added spinbox and fileselector REM Version 0.6 - Empty string clears widgets in TEXT method, added SYNC REM Version 0.7 - Better casting to INT, changed DIALOG implementation REM Version 0.8 - Simplified API even more, renamed TEXT to MARK REM Version 0.9 - HUGOPTIONS to define HUG behaviour, TOGGLE button REM Version 0.10 - Many requested the Notebook widget, here it is. REM Version 0.11 - Re-implemented IMAGE() function, no API changes. REM Version 0.12 - Minor bugfixes REM Version 0.13 - IMAGE to define ImageWidget, PICTURE to load background pics into canvas REM Version 0.14 - OpenBSD reveals wrong typecasting of some functions REM Version 0.15 - Fixed issue with window placement REM Version 0.16 - Password widget SET/GET methods to hide/show characters, bug in GET method for LIST fixed REM Version 0.17 - Texts in labels selectable REM Version 0.18 - CLIPBOARD object REM Version 0.19 - SET/GET for label to set/get selectable, FILEDIALOG has CANCEL button (James Fuller) REM Version 0.20 - Callback functions should have void* prototype (James Fuller) REM Version 0.21 - Callback signal for EDIT was missing REM Version 0.22 - Modifications to allow compilation as shared object REM Version 0.23 - CALLBACKX to allow passing values to callbacks (James Fuller) REM Version 0.24 - SET/GET for windows to set/get fullscreen, SCREENSIZE for fullscreen apps REM Version 0.25 - fix FILEDIALOG crash REM Version 0.26 - added PROGRESSBAR widget REM Version 0.27 - changed 'HUG message' to 'Message' and 'HUG selector' to 'Selector' REM Version 0.28 - implemented font size and DPI settings for GUI scaling REM Version 0.29 - HUGOPTIONS scaling/noscaling when working with canvas REM Version 0.30 - fixed bug with MSGDIALOG and FILEDIALOG sizing, implemented TEXT, GRAB$ for MSGDIALOG, lib lookup functions REM Version 0.31 - fixed illegal IF construct in MSGDIALOG_GRAB$ REM Version 0.32 - compatibility with MacOSX REM Version 0.33 - no need to set the language to "C" REM Version 0.34 - added HUGOPTION for the default 'show' behavior of widgets REM Version 0.35 - small changes to allow include separate functions instead of whole file REM Version 0.36 - MSGDIALOG and FILEDIALOG should obey HUG_XFT_SIZE_FACTOR when resizing them, added MacOSX GTK port for X11 REM Version 0.37 - added HUGOPTION for global font setting REM Version 0.38 - show error messages when illegal HUGOPTION is given REM Version 0.39 - adjusted global font setting for X environment without Xsettings Manager REM Version 0.39a - fixed typo in setting font REM Version 0.40 - PROPERTY to set any additional property of a widget REM Version 0.41 - re-implemented PROPERTY to allow import from HUG as shared object REM Version 0.42 - reorganized structure of importing libraries, HUGLIB$ to find used library REM REM -------------------------------------------------------------------------------------------------- ' When used as an include file, always call Init CALL INIT REM -------------------------------------------------------------------------------------------------- FUNCTION hug_Get_Gtk$ : REM INCLUDE LOCAL lib$ LOCAL seq, retry TRAP LOCAL CATCH GOTO handle_error IF INSTR(OS$, "Darwin") THEN lib$ = "/opt/local/lib/libgtk-x11-2.0.0.dylib" IF NOT(FILEEXISTS(lib$)) THEN lib$ = "/Library/Frameworks/Gtk.framework/Libraries/libgtk-quartz-2.0.0.dylib" END IF ELSE lib$ = "libgtk-x11-2.0.so" END IF seq = -1 LABEL import_retry INCR seq retry = FALSE IMPORT "gtk_init(int*,void*)" FROM lib$ TYPE void IF retry THEN GOTO import_retry GOTO continue_lookup LABEL handle_error ERROR = 0 IF seq IS 0 THEN lib$ = "libgtk-x11-2.0.so.0" ELSE lib$ = CONCAT$(LEFT$(lib$, INSTRREV(lib$, ".")), STR$(seq)) IF seq < 50 THEN retry = TRUE ELSE PRINT "Gtk library not found!" END END IF RESUME LABEL continue_lookup CATCH RESET TRAP SYSTEM RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION hug_Get_Gdk$ : REM INCLUDE LOCAL lib$ LOCAL seq, retry TRAP LOCAL CATCH GOTO handle_error IF INSTR(OS$, "Darwin") THEN lib$ = "/opt/local/lib/libgdk-x11-2.0.0.dylib" IF NOT(FILEEXISTS(lib$)) THEN lib$ = "/Library/Frameworks/Gtk.framework/Libraries/libgdk-quartz-2.0.0.dylib" END IF ELSE lib$ = "libgdk-x11-2.0.so" END IF seq = -1 LABEL import_retry INCR seq retry = FALSE IMPORT "gdk_atom_intern(char*,int)" FROM lib$ TYPE long IF retry THEN GOTO import_retry GOTO continue_lookup LABEL handle_error ERROR = 0 IF seq IS 0 THEN lib$ = "libgdk-x11-2.0.so.0" ELSE lib$ = CONCAT$(LEFT$(lib$, INSTRREV(lib$, ".")), STR$(seq)) IF seq < 50 THEN retry = TRUE ELSE PRINT "Gdk library not found!" END END IF RESUME LABEL continue_lookup CATCH RESET TRAP SYSTEM RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION hug_Get_Glib$ : REM INCLUDE LOCAL lib$ LOCAL seq, retry TRAP LOCAL CATCH GOTO handle_error IF INSTR(OS$, "Darwin") THEN lib$ = "/opt/local/lib/libglib-2.0.0.dylib" IF NOT(FILEEXISTS(lib$)) THEN lib$ = "/Library/Frameworks/Glib.framework/Libraries/libglib-2.0.0.dylib" END IF ELSE lib$ = "libglib-2.0.so" END IF seq = -1 LABEL import_retry INCR seq retry = FALSE IMPORT "g_timeout_add(int,void*,long)" FROM lib$ TYPE int IF retry THEN GOTO import_retry GOTO continue_lookup LABEL handle_error ERROR = 0 IF seq IS 0 THEN lib$ = "libglib-2.0.so.0" ELSE lib$ = CONCAT$(LEFT$(lib$, INSTRREV(lib$, ".")), STR$(seq)) IF seq < 50 THEN retry = TRUE ELSE PRINT "Glib library not found!" END END IF RESUME LABEL continue_lookup CATCH RESET TRAP SYSTEM RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION hug_Get_Gobject$ : REM INCLUDE LOCAL lib$ LOCAL seq, retry TRAP LOCAL CATCH GOTO handle_error IF INSTR(OS$, "Darwin") THEN lib$ = "/opt/local/lib/libgobject-2.0.0.dylib" IF NOT(FILEEXISTS(lib$)) THEN lib$ = "/Library/Frameworks/Glib.framework/Libraries/libgobject-2.0.0.dylib" END IF ELSE lib$ = "libgobject-2.0.so" END IF seq = -1 LABEL import_retry INCR seq retry = FALSE IMPORT "g_object_unref(long)" FROM lib$ TYPE void IF retry THEN GOTO import_retry GOTO continue_lookup LABEL handle_error ERROR = 0 IF seq IS 0 THEN lib$ = "libgobject-2.0.so.0" ELSE lib$ = CONCAT$(LEFT$(lib$, INSTRREV(lib$, ".")), STR$(seq)) IF seq < 50 THEN retry = TRUE ELSE PRINT "Gobject library not found!" END END IF RESUME LABEL continue_lookup CATCH RESET TRAP SYSTEM RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION hug_Get_Pango$ : REM INCLUDE LOCAL lib$ LOCAL seq, retry TRAP LOCAL CATCH GOTO handle_error IF INSTR(OS$, "Darwin") THEN lib$ = "/opt/local/lib/libpango-1.0.0.dylib" IF NOT(FILEEXISTS(lib$)) THEN lib$ = "/Library/Frameworks/Gtk.framework/Libraries/libpango-1.0.0.dylib" END IF ELSE lib$ = "libpango-1.0.so" END IF seq = -1 LABEL import_retry INCR seq retry = FALSE IMPORT "pango_font_description_from_string(char*)" FROM lib$ TYPE long IF retry THEN GOTO import_retry GOTO continue_lookup LABEL handle_error ERROR = 0 IF seq IS 0 THEN lib$ = "libpango-1.0.so.0" ELSE lib$ = CONCAT$(LEFT$(lib$, INSTRREV(lib$, ".")), STR$(seq)) IF seq < 50 THEN retry = TRUE ELSE PRINT "Pango library not found!" END END IF RESUME LABEL continue_lookup CATCH RESET TRAP SYSTEM RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB INIT LOCAL hug_Gtk$, hug_Gdk$, hug_Glib$, hug_Gobject$, hug_Pango$ hug_Gtk$ = hug_Get_Gtk$() hug_Gdk$ = hug_Get_Gdk$() hug_Glib$ = hug_Get_Glib$() hug_Gobject$ = hug_Get_Gobject$() hug_Pango$ = hug_Get_Pango$() TRAP LOCAL CATCH GOTO lookup_error IMPORT "gtk_bin_get_child(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_button_get_label(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_button_new_from_stock(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_button_new_with_mnemonic(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_button_set_label(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_cell_renderer_text_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_check_button_new_with_label(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_clipboard_get(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_clipboard_set_text(long,char*,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_clipboard_wait_for_text (long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_combo_box_append_text(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_combo_box_get_active(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_combo_box_get_active_text(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_combo_box_new_text" FROM hug_Gtk$ TYPE long IMPORT "gtk_combo_box_set_active(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_container_add(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_entry_get_text(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_entry_get_visibility(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_entry_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_entry_set_text(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_entry_set_visibility(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_event_box_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_events_pending" FROM hug_Gtk$ TYPE int IMPORT "gtk_exit(int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_file_chooser_dialog_new(char*,long,int,char*,...)" FROM hug_Gtk$ TYPE long IMPORT "gtk_file_chooser_get_filename(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_file_chooser_set_filename(long,char*)" FROM hug_Gtk$ TYPE int IMPORT "gtk_fixed_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_fixed_put(long,long,int,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_frame_get_label(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_frame_get_label_widget(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_frame_new(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_frame_set_label(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_hseparator_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_image_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_image_new_from_file(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_image_set_from_pixmap(long,long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_label_get_text(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_label_new(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_label_get_selectable(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_label_set_selectable(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_label_set_text(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_list_store_append(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_list_store_clear(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_list_store_new(int,...)" FROM hug_Gtk$ TYPE long IMPORT "gtk_list_store_set(long,long,...)" FROM hug_Gtk$ TYPE void IMPORT "gtk_main" FROM hug_Gtk$ TYPE void IMPORT "gtk_main_iteration_do(int)" FROM hug_Gtk$ TYPE int IMPORT "gtk_message_dialog_new(long,int,int,int,char*,...)" FROM hug_Gtk$ TYPE long IMPORT "gtk_notebook_append_page(long,long,long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_notebook_get_tab_label_text(long,long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_notebook_get_current_page(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_notebook_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_notebook_set_current_page(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_progress_bar_get_fraction(long)" FROM hug_Gtk$ TYPE double IMPORT "gtk_progress_bar_get_text(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_progress_bar_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_progress_bar_set_fraction(long,double)" FROM hug_Gtk$ TYPE void IMPORT "gtk_progress_bar_set_text(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_radio_button_new_with_label_from_widget(long,char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_rc_parse_string(char*)" FROM hug_Gtk$ TYPE void IMPORT "gtk_rc_reset_styles(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_scrolled_window_new(long,long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_scrolled_window_set_policy(long,int,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_scrolled_window_set_shadow_type(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_settings_get_default" FROM hug_Gtk$ TYPE long IMPORT "gtk_spin_button_get_value_as_int(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_spin_button_new_with_range(double,double,double)" FROM hug_Gtk$ TYPE long IMPORT "gtk_spin_button_set_value(long,double)" FROM hug_Gtk$ TYPE void IMPORT "gtk_table_new(int,int,int)" FROM hug_Gtk$ TYPE long IMPORT "gtk_table_attach_defaults(long,long,int,int,int,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_create_mark(long,char*,long,int)" FROM hug_Gtk$ TYPE long IMPORT "gtk_text_buffer_delete_mark(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_get_end_iter(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_get_iter_at_line(long,long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_get_line_count(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_text_buffer_get_start_iter(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_get_text(long,long,long,int)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_text_buffer_insert_at_cursor(long,char*,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_buffer_new(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_text_buffer_set_text(long,char*,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_view_new_with_buffer(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_text_view_scroll_to_mark(long,long,double,int,double,double)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_view_set_editable(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_text_view_set_wrap_mode(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_toggle_button_get_active(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_toggle_button_new_with_mnemonic(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_toggle_button_set_active(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_tree_model_get(long,long,...)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_tree_model_get_string_from_iter(long,long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_tree_path_free(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_tree_path_new_from_string(char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_tree_selection_get_selected(long,long,long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_tree_selection_select_path(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_tree_selection_set_mode(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_tree_view_append_column(long,long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_tree_view_column_new_with_attributes(char*,long,...)" FROM hug_Gtk$ TYPE long IMPORT "gtk_tree_view_get_selection(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_tree_view_new_with_model(long)" FROM hug_Gtk$ TYPE long IMPORT "gtk_tree_view_set_headers_visible(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_vseparator_new" FROM hug_Gtk$ TYPE long IMPORT "gtk_widget_create_pango_layout(long,char*)" FROM hug_Gtk$ TYPE long IMPORT "gtk_widget_grab_focus(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_hide(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_hide_on_delete(long)" FROM hug_Gtk$ TYPE int IMPORT "gtk_widget_modify_font(long,long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_queue_draw(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_realize(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_set_events(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_set_sensitive(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_set_size_request(long,int,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_show_all(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_widget_show(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_fullscreen(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_unfullscreen(long)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_get_title(long)" FROM hug_Gtk$ TYPE char* IMPORT "gtk_window_new(int)" FROM hug_Gtk$ TYPE long IMPORT "gtk_window_set_default_size(long,int,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_set_position(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_set_resizable(long,int)" FROM hug_Gtk$ TYPE void IMPORT "gtk_window_set_title(long,char*)" FROM hug_Gtk$ TYPE void IMPORT "gdk_color_copy(long)" FROM hug_Gdk$ TYPE long IMPORT "gdk_color_free(long)" FROM hug_Gdk$ TYPE void IMPORT "gdk_color_parse(char*,long)" FROM hug_Gdk$ TYPE int IMPORT "gdk_draw_arc(long,long,int,int,int,int,int,int,int)" FROM hug_Gdk$ TYPE void IMPORT "gdk_draw_layout_with_colors(long,long,int,int,long,long,long)" FROM hug_Gdk$ TYPE void IMPORT "gdk_draw_line(long,long,int,int,int,int)" FROM hug_Gdk$ TYPE void IMPORT "gdk_draw_pixbuf(long,long,long,int,int,int,int,int,int,int,int,int)" FROM hug_Gdk$ TYPE void IMPORT "gdk_draw_point(long,long,int,int)" FROM hug_Gdk$ TYPE void IMPORT "gdk_draw_rectangle(long,long,int,int,int,int,int)" FROM hug_Gdk$ TYPE void IMPORT "gdk_gc_new(long)" FROM hug_Gdk$ TYPE long IMPORT "gdk_gc_set_rgb_bg_color(long,long)" FROM hug_Gdk$ TYPE void IMPORT "gdk_gc_set_rgb_fg_color(long,long)" FROM hug_Gdk$ TYPE void IMPORT "gdk_get_default_root_window" FROM hug_Gdk$ TYPE long IMPORT "gdk_keymap_get_default" FROM hug_Gdk$ TYPE long IMPORT "gdk_pixmap_new(long,int,int,int)" FROM hug_Gdk$ TYPE long IMPORT "gdk_pixbuf_new_from_file(char*,void**)" FROM hug_Gdk$ TYPE long IMPORT "gdk_screen_get_default" FROM hug_Gdk$ TYPE long IMPORT "gdk_screen_get_width(long)" FROM hug_Gdk$ TYPE int IMPORT "gdk_screen_height(long)" FROM hug_Gdk$ TYPE int IMPORT "gdk_window_at_pointer(long,long)" FROM hug_Gdk$ TYPE long IMPORT "gdk_window_get_pointer(long,long,long,long)" FROM hug_Gdk$ TYPE long IMPORT "g_object_get(long,char*,...)" FROM hug_Gobject$ TYPE void IMPORT "g_object_set(long,char*,...)" FROM hug_Gobject$ TYPE void IMPORT "g_signal_connect_data(long,char*,void*,long,long,int)" FROM hug_Gobject$ TYPE void IMPORT "g_main_context_iteration(long, int)" FROM hug_Glib$ TYPE int IMPORT "g_source_remove(int)" FROM hug_Glib$ TYPE int IMPORT "pango_font_description_free(long)" FROM hug_Pango$ TYPE void IMPORT "pango_font_description_get_size(long)" FROM hug_Pango$ TYPE int IMPORT "pango_font_description_set_size(long,int)" FROM hug_Pango$ TYPE void GOTO Continue_Sub LABEL lookup_error PRINT ERR$(ERROR) END LABEL Continue_Sub CATCH RESET TRAP SYSTEM REM -------------------------------------------------------------------------------------------------- REM Some global constants CONST G_CONNECT_AFTER = 1 << 0 CONST GDK_BUTTON_RELEASE_MASK = 1 << 9 CONST GDK_KEY_PRESS_MASK = 1 << 10 CONST GDK_POINTER_MOTION_MASK = 1 << 2 CONST GDK_SCROLL_MASK = 1 << 21 CONST GTK_POLICY_AUTOMATIC = 1 CONST GTK_SELECTION_SINGLE = 1 CONST GTK_SHADOW_ETCHED_IN = 3 CONST GTK_WINDOW_TOPLEVEL = 0 CONST GTK_WIN_POS_CENTER = 1 CONST GTK_WIN_POS_CENTER_ON_PARENT = 4 CONST GTK_WRAP_WORD = 2 CONST G_TYPE_STRING = 64 CONST GTK_FILE_CHOOSER_ACTION_OPEN = 0 CONST GTK_FILE_CHOOSER_ACTION_SAVE = 1 CONST GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER = 2 CONST GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER = 3 CONST GTK_RESPONSE_ACCEPT = -3 CONST GTK_RESPONSE_DELETE_EVENT = -4 CONST GTK_RESPONSE_OK = -5 CONST GTK_RESPONSE_CANCEL = -6 CONST GTK_RESPONSE_CLOSE = -7 CONST GTK_RESPONSE_YES = -8 CONST GTK_RESPONSE_NO = -9 CONST GTK_RESPONSE_APPLY = -10 CONST GTK_RESPONSE_HELP = -11 GLOBAL NUL TYPE STRING LOCAL settings$ REM Some HUG limitations CONST HUG_DEFAULT_WIDGET_SIZE = 64 CONST HUG_MAX_WIDGETS = 4096 REM Global properties of the HUG GUI GLOBAL RECORD hug_gui_properties LOCAL last_key_pressed, timeout_id, canvas LOCAL mousex, mousey, scroll, button TYPE int LOCAL options$ TYPE STRING END RECORD REM Properties of the widgets GLOBAL RECORD hug_widget_properties[HUG_MAX_WIDGETS] LOCAL widget, font, focus, attach, signal, s_widget, xsize, ysize REM only for canvas LOCAL pix, image, color REM Name string LOCAL name$ REM Function pointers for methods LOCAL (*grab)(long) TYPE STRING LOCAL (*text)(long,char*) TYPE void LOCAL (*get)(long) TYPE int LOCAL (*set)(long,int) TYPE void REM only for Notebook, max 64 pages per notebook LOCAL page[64] TYPE int END RECORD DECLARE hug_winstate ASSOC long GLOBAL hug_pointer hug_gui_properties.timeout_id = -1 hug_pointer = 0 ' Some variables for resizing CONST HUG_DEFAULT_FONT_SIZE = 10 GLOBAL HUG_DEFAULT_XFT_SIZE TYPE FLOATING GLOBAL HUG_FONT_SIZE_FACTOR TYPE FLOATING GLOBAL HUG_XFT_SIZE_FACTOR TYPE FLOATING GLOBAL HUG_WIDGET_SHOW = 1 ' Default Xft size HUG_DEFAULT_XFT_SIZE = 96.0 HUG_XFT_SIZE_FACTOR = 1 ' Always initiate GTK gtk_init(0, 0) ' Now calculate a global sizing factor using fontsize 10 as a base g_object_get(gtk_settings_get_default(), "gtk-font-name", ADDRESS(settings$), NUL) HUG_FONT_SIZE_FACTOR = (FLOATING)(pango_font_description_get_size(pango_font_description_from_string(settings$))/1024) / HUG_DEFAULT_FONT_SIZE PROTO PROPERTY DEF FN PROPERTY(widget, name, ...) = g_object_set(widget, name, __VA_ARGS__, NUL) END SUB REM -------------------------------------------------------------------------------------------------- FUNCTION HUGLIB$(STRING name$) LOCAL lib$ SELECT name$ CASE "gtk" lib$ = hug_Get_Gtk$() CASE "gdk" lib$ = hug_Get_Gdk$() CASE "glib" lib$ = hug_Get_Glib$() CASE "gobject" lib$ = hug_Get_Gobject$() CASE "pango" lib$ = hug_Get_Pango$() DEFAULT lib$ = "Unknown" END SELECT RETURN lib$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION hug_key_press(NUMBER widget, void *data1, NUMBER data2) : REM INCLUDE REM should work for GTK 1.x and 2.x USEC typedef struct { int type; void *window; signed char send_event; unsigned int time; unsigned int state; unsigned int keyval; } GdkEventKey; GdkEventKey *keypress; keypress = (GdkEventKey*)data1; hug_gui_properties.last_key_pressed = keypress->keyval; END USEC RETURN FALSE END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB hug_mouse_event (NUMBER widget, NUMBER data, long user) : REM INCLUDE LOCAL gdk, x, y REM Works for GTK 2.x USEC typedef struct { int type; void *window; signed char send_event; unsigned int time; double x; double y; unsigned int state; int direction; } GdkEventScroll; GdkEventScroll *mousescroll; mousescroll = (GdkEventScroll*)data; if(user == 10) hug_gui_properties.scroll = mousescroll->direction; else hug_gui_properties.scroll = -1; typedef struct { int type; void *window; signed char send_event; unsigned int time; double x; double y; double *axes; unsigned int state; unsigned int button; } GdkEventButton; GdkEventButton *mousebutton; mousebutton = (GdkEventButton*)data; if(user == 20) hug_gui_properties.button = mousebutton->button; else hug_gui_properties.button = -1; END USEC REM always get position gdk = gdk_window_at_pointer(ADDRESS(x), ADDRESS(y)) gdk_window_get_pointer(gdk, ADDRESS(hug_gui_properties.mousex), ADDRESS(hug_gui_properties.mousey), 0) END SUB REM -------------------------------------------------------------------------------------------------- SUB hug_NOTEBOOK_hack(NUMBER widget, NUMBER page, int pnr) LOCAL i REM Get notebook widget properties FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN BREAK END IF NEXT hug_widget_properties[i].attach = hug_widget_properties[i].page[pnr] END SUB REM -------------------------------------------------------------------------------------------------- SUB HUGOPTIONS (STRING arg$) LOCAL dpi, gtksettings LOCAL settings$ ' Store TABLE definition IF LEFT$(arg$, 5) = "TABLE" THEN hug_gui_properties.options$ = arg$ ' Determine Xft base DPI for scaling ELIF LEFT$(arg$, 10) = "BASEXFTDPI" THEN HUG_DEFAULT_XFT_SIZE = VAL(MID$(arg$, INSTR(arg$, " ")+1)) g_object_get(gtk_settings_get_default(), "gtk-xft-dpi", ADDRESS(dpi), NUL) HUG_XFT_SIZE_FACTOR = (FLOATING)(dpi/1024) / HUG_DEFAULT_XFT_SIZE ELIF LEFT$(arg$, 9) = "NOSCALING" THEN HUG_FONT_SIZE_FACTOR = 1 ELIF LEFT$(arg$, 7) = "SCALING" THEN g_object_get(gtk_settings_get_default(), "gtk-font-name", ADDRESS(settings$), NUL) HUG_FONT_SIZE_FACTOR = (FLOATING)(pango_font_description_get_size(pango_font_description_from_string(settings$))/1024) / HUG_DEFAULT_FONT_SIZE ELIF LEFT$(arg$, 11) = "WIDGET_SHOW" THEN HUG_WIDGET_SHOW = VAL(MID$(arg$, INSTR(arg$, " ")+1)) ELIF LEFT$(arg$, 4) = "FONT" THEN gtksettings = gtk_settings_get_default() gtk_rc_parse_string(CONCAT$("style \"hugstyle\" { font_name = \"", CHOP$(MID$(arg$, 5)), "\" }")) gtk_rc_parse_string(CONCAT$("widget \"*\" style \"hugstyle\"")) gtk_rc_reset_styles(gtksettings) ELSE PRINT "HUGOPTION '", arg$, "' not recognized!" END IF END SUB REM -------------------------------------------------------------------------------------------------- SUB QUIT END END SUB REM -------------------------------------------------------------------------------------------------- SUB DRAW (NUMBER widget) LOCAL i FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN hug_gui_properties.canvas = hug_widget_properties[i].pix BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- SUB HIDE (NUMBER widget) gtk_widget_hide(widget) END SUB REM -------------------------------------------------------------------------------------------------- SUB SHOW (NUMBER widget) gtk_widget_show_all(widget) END SUB REM -------------------------------------------------------------------------------------------------- FUNCTION DUMMY_GRAB$ (NUMBER widget) : REM INCLUDE RETURN "" END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION WINDOW_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_window_get_title(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION NOTEBOOK_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING LOCAL i REM Get notebook widget properties FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN BREAK END IF NEXT text$ = gtk_notebook_get_tab_label_text(widget, hug_widget_properties[i].attach) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION BUTTON_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_button_get_label(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION ENTRY_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_entry_get_text(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION MARK_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_label_get_text(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION COMBO_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_combo_box_get_active_text(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION FRAME_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_frame_get_label(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION EDIT_GRAB$ (NUMBER widget) LOCAL buffer, i, iter1, iter2 LOCAL text$ REM Get buffer FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN buffer = hug_widget_properties[i].font BREAK END IF NEXT iter1 = MEMORY(HUG_DEFAULT_WIDGET_SIZE) iter2 = MEMORY(HUG_DEFAULT_WIDGET_SIZE) gtk_text_buffer_get_start_iter(buffer, iter1) gtk_text_buffer_get_end_iter(buffer, iter2) text$ = gtk_text_buffer_get_text(buffer, iter1, iter2, 1) FREE iter1 FREE iter2 RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION LIST_GRAB$ (NUMBER widget) LOCAL sel, i, result, lst LOCAL get$ TYPE STRING REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN sel = hug_widget_properties[i].attach lst = hug_widget_properties[i].focus BREAK END IF NEXT RECORD iter LOCAL stamp TYPE int LOCAL user_data TYPE void* LOCAL user_data2 TYPE void* LOCAL user_data3 TYPE void* END RECORD result = gtk_tree_selection_get_selected(sel, 0, ADDRESS(iter)) IF ISTRUE(result) THEN gtk_tree_model_get(lst, ADDRESS(iter), 0, ADDRESS(get$), -1) ELSE get$ = "" END IF RETURN get$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION MSGDIALOG_GRAB$(NUMBER widget) LOCAL ptr TYPE STRING LOCAL txt$ g_object_get(widget, "text", ADDRESS(ptr), NUL) IF ptr EQ 0 THEN RETURN "" END IF txt$ = ptr RETURN txt$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION FILEDIALOG_GRAB$(NUMBER widget) LOCAL txt TYPE STRING txt = gtk_file_chooser_get_filename(widget) IF txt EQ 0 THEN RETURN "" END IF RETURN txt END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION CLIPBOARD_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_clipboard_wait_for_text(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION PROGRESSBAR_GRAB$ (NUMBER widget) LOCAL text$ TYPE STRING text$ = gtk_progress_bar_get_text(widget) RETURN text$ END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION GRAB$(NUMBER widget) LOCAL i LOCAL txt$ txt$ = "" REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN txt$ = hug_widget_properties[i].grab(widget) BREAK END IF NEXT RETURN txt$ END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB DUMMY_TEXT (NUMBER widget, STRING text$) : REM INCLUDE ' We do nothing here END SUB REM -------------------------------------------------------------------------------------------------- SUB WINDOW_TEXT (NUMBER widget, STRING text$) gtk_window_set_title(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB NOTEBOOK_TEXT(NUMBER widget, STRING text$) LOCAL lab, dim, i, layer, which IF INSTR(hug_gui_properties.options$, "TABLE") THEN SPLIT hug_gui_properties.options$ BY " " TO opt$ SIZE dim FOR i = 0 TO dim - 1 IF INSTR(opt$[i], "TABLE") AND i+2 < dim THEN layer = gtk_table_new(VAL(opt$[i+2]), VAL(opt$[i+1]), 1) BREAK END IF NEXT ELSE layer = gtk_fixed_new() END IF gtk_widget_show(layer) lab = gtk_label_new(text$) which = gtk_notebook_append_page(widget, layer, lab) gtk_notebook_set_current_page(widget, which) REM Get notebook widget properties FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN BREAK END IF NEXT WITH hug_widget_properties[i] .attach = layer .page[which] = layer END WITH END SUB REM -------------------------------------------------------------------------------------------------- SUB BUTTON_TEXT (NUMBER widget, STRING text$) gtk_button_set_label(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB ENTRY_TEXT (NUMBER widget, STRING text$) gtk_entry_set_text(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB MARK_TEXT (NUMBER widget, STRING text$) gtk_label_set_text(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB COMBO_TEXT (NUMBER widget, STRING text$) gtk_combo_box_append_text(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB FRAME_TEXT (NUMBER widget, STRING text$) LOCAL i gtk_frame_set_label(widget, text$) REM Get label of frame FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN hug_widget_properties[i].font = gtk_frame_get_label_widget(widget) BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- SUB EDIT_TEXT (NUMBER widget, STRING text$) LOCAL buffer, i REM Get buffer FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN buffer = hug_widget_properties[i].font BREAK END IF NEXT REM Delete contents when text$ is empty IF LEN(text$) EQ 0 THEN gtk_text_buffer_set_text(buffer, "", 0) ELSE gtk_text_buffer_insert_at_cursor(buffer, text$, -1) END IF END SUB REM -------------------------------------------------------------------------------------------------- SUB LIST_TEXT (NUMBER widget, STRING text$) LOCAL lst, i REM Get list FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN lst = hug_widget_properties[i].focus BREAK END IF NEXT RECORD iter LOCAL stamp TYPE int LOCAL user_data TYPE void* LOCAL user_data2 TYPE void* LOCAL user_data3 TYPE void* END RECORD REM Delete contents when text$ is empty IF LEN(text$) EQ 0 THEN gtk_list_store_clear(lst) ELSE gtk_list_store_append(lst, ADDRESS(iter)) gtk_list_store_set(lst, ADDRESS(iter), 0, text$, -1) END IF END SUB REM -------------------------------------------------------------------------------------------------- SUB MSGDIALOG_TEXT (NUMBER widget, STRING txt$) g_object_set(widget, "text", txt$, NUL) END SUB REM -------------------------------------------------------------------------------------------------- SUB FILEDIALOG_TEXT (NUMBER widget, STRING txt$) gtk_file_chooser_set_filename (widget, txt$) END SUB REM -------------------------------------------------------------------------------------------------- SUB CLIPBOARD_TEXT(NUMBER widget, STRING text$) gtk_clipboard_set_text(widget, text$, -1) END SUB REM -------------------------------------------------------------------------------------------------- SUB PROGRESSBAR_TEXT (NUMBER widget, STRING text$) gtk_progress_bar_set_text(widget, text$) END SUB REM -------------------------------------------------------------------------------------------------- SUB TEXT(NUMBER widget, STRING txt) LOCAL i REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN USEC hug_widget_properties[i].text(widget, txt); ENDUSEC BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- FUNCTION DUMMY_GET (NUMBER widget) : REM INCLUDE LOCAL dum TYPE int dum = 0 RETURN dum END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION WINDOW_GET (NUMBER widget) LOCAL get TYPE int get = hug_winstate(STR$(widget)) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION NOTEBOOK_GET (NUMBER widget) LOCAL get TYPE int get = gtk_notebook_get_current_page(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION BUTTON_GET (NUMBER widget) LOCAL get TYPE int get = gtk_toggle_button_get_active(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION PASSWORD_GET (NUMBER widget) LOCAL get TYPE int get = gtk_entry_get_visibility(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION MARK_GET (NUMBER widget) LOCAL get TYPE int get = gtk_label_get_selectable(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION COMBO_GET (NUMBER widget) LOCAL get TYPE int get = gtk_combo_box_get_active(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION EDIT_GET (NUMBER widget) LOCAL i LOCAL get TYPE int REM Get buffer FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN get = gtk_text_buffer_get_line_count(hug_widget_properties[i].font) BREAK END IF NEXT RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION LIST_GET (NUMBER widget) LOCAL sel, lst LOCAL get TYPE int REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN sel = hug_widget_properties[i].attach lst = hug_widget_properties[i].focus BREAK END IF NEXT RECORD iter LOCAL stamp TYPE int LOCAL user_data TYPE void* LOCAL user_data2 TYPE void* LOCAL user_data3 TYPE void* END RECORD IF ISTRUE(gtk_tree_selection_get_selected(sel, 0, ADDRESS(iter))) THEN get = VAL(gtk_tree_model_get_string_from_iter(lst, ADDRESS(iter))) ELSE get = -1 END IF RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION SPIN_GET (NUMBER widget) LOCAL get TYPE int get = gtk_spin_button_get_value_as_int(widget) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION PROGRESSBAR_GET (NUMBER widget) LOCAL get TYPE int LOCAL value TYPE double value = gtk_progress_bar_get_fraction(widget) get = INT(value*100) RETURN get END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION GET (NUMBER widget) LOCAL i, j REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN j = hug_widget_properties[i].get(widget) BREAK END IF NEXT RETURN j END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB DUMMY_SET (NUMBER widget, int value) : REM INCLUDE ' We do nothing here END SUB REM -------------------------------------------------------------------------------------------------- SUB WINDOW_SET (NUMBER widget, int value) IF value IS 0 THEN gtk_window_unfullscreen(widget) hug_winstate(STR$(widget)) = 0 gtk_window_set_resizable(widget, 0) ELSE gtk_window_set_resizable(widget, 1) gtk_window_fullscreen(widget) hug_winstate(STR$(widget)) = 1 END IF END SUB REM -------------------------------------------------------------------------------------------------- SUB NOTEBOOK_SET (NUMBER widget, int value) gtk_notebook_set_current_page(widget, value) END SUB REM -------------------------------------------------------------------------------------------------- SUB BUTTON_SET (NUMBER widget, int value) gtk_toggle_button_set_active(widget, value) END SUB REM -------------------------------------------------------------------------------------------------- SUB PASSWORD_SET (NUMBER widget, int value) gtk_entry_set_visibility(widget, value) END SUB REM -------------------------------------------------------------------------------------------------- SUB MARK_SET (NUMBER widget, int value) gtk_label_set_selectable(widget, value) END SUB REM -------------------------------------------------------------------------------------------------- SUB COMBO_SET (NUMBER widget, int value) gtk_combo_box_set_active(widget, value) END SUB REM -------------------------------------------------------------------------------------------------- SUB EDIT_SET (NUMBER widget, int value) LOCAL buffer, view, iter, i, mark REM Get buffer FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN buffer = hug_widget_properties[i].font view = hug_widget_properties[i].focus BREAK END IF NEXT iter = MEMORY(HUG_DEFAULT_WIDGET_SIZE) gtk_text_buffer_get_iter_at_line(buffer, iter, value) mark = gtk_text_buffer_create_mark(buffer, "mark", iter, 0) gtk_text_view_scroll_to_mark(view, mark, 0, 1, 0.0, 1.0) gtk_text_buffer_delete_mark(buffer, mark) FREE iter END SUB REM -------------------------------------------------------------------------------------------------- SUB LIST_SET (NUMBER widget, int value) LOCAL path, i, sel REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN sel = hug_widget_properties[i].attach BREAK END IF NEXT path = gtk_tree_path_new_from_string(STR$(value)) gtk_tree_selection_select_path(sel, path) gtk_tree_path_free(path) END SUB REM -------------------------------------------------------------------------------------------------- SUB SPIN_SET (NUMBER widget, int value) LOCAL d TYPE FLOATING d = (double)value gtk_spin_button_set_value(widget, d) END SUB REM -------------------------------------------------------------------------------------------------- SUB PROGRESSBAR_SET (NUMBER widget, int value) LOCAL nr TYPE double nr = (double)value/100 gtk_progress_bar_set_fraction(widget, nr) END SUB REM -------------------------------------------------------------------------------------------------- SUB SET(NUMBER widget, int value) LOCAL i REM Get widgets from LIST FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN USEC hug_widget_properties[i].set(widget, value); ENDUSEC BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- REM The widgets FUNCTION WINDOW (STRING title$, int xsize, int ysize) LOCAL win, layer, dim, i win = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_title(win, title$) gtk_window_set_position(win, GTK_WIN_POS_CENTER) g_signal_connect_data(win, "delete-event", exit, 0, 0, 0) g_signal_connect_data(win, "key-press-event", hug_key_press, 0, 0, 0) IF INSTR(hug_gui_properties.options$, "TABLE") THEN SPLIT hug_gui_properties.options$ BY " " TO opt$ SIZE dim FOR i = 0 TO dim - 1 IF INSTR(opt$[i], "TABLE") AND i+2 < dim THEN layer = gtk_table_new(VAL(opt$[i+2]), VAL(opt$[i+1]), 1) BREAK END IF NEXT ELSE gtk_window_set_resizable(win, 0) layer = gtk_fixed_new() END IF gtk_container_add(win, layer) gtk_widget_set_size_request(win, INT(xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(win) hug_winstate(STR$(win)) = 0 WITH hug_widget_properties[hug_pointer] .widget = win .font = win .focus = win .attach = layer .signal = 1 .s_widget = win .xsize = xsize .ysize = ysize .grab = WINDOW_GRAB$ .text = WINDOW_TEXT .get = WINDOW_GET .set = WINDOW_SET END WITH hug_pointer = hug_pointer + 1 RETURN win END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION NOTEBOOK(STRING title$, int xsize, int ysize) LOCAL notebook, layer, dim, i, lab, which notebook = gtk_notebook_new() IF INSTR(hug_gui_properties.options$, "TABLE") THEN SPLIT hug_gui_properties.options$ BY " " TO opt$ SIZE dim FOR i = 0 TO dim - 1 IF INSTR(opt$[i], "TABLE") AND i+2 < dim THEN layer = gtk_table_new(VAL(opt$[i+2]), VAL(opt$[i+1]), 1) BREAK END IF NEXT ELSE layer = gtk_fixed_new() END IF gtk_widget_show(layer) lab = gtk_label_new(title$) which = gtk_notebook_append_page(notebook, layer, lab) IF HUG_WIDGET_SHOW THEN gtk_widget_show(notebook) g_signal_connect_data(notebook, "switch-page", hug_NOTEBOOK_hack, 0, 0, 0) WITH hug_widget_properties[hug_pointer] .widget = notebook .font = lab .focus = notebook .attach = layer .signal = 0 .s_widget = notebook .xsize = xsize .ysize = ysize .grab = NOTEBOOK_GRAB$ .text = NOTEBOOK_TEXT .get = NOTEBOOK_GET .set = NOTEBOOK_SET .page[which] = layer END WITH hug_pointer = hug_pointer + 1 RETURN notebook END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION BUTTON (STRING text$, int xsize, int ysize) LOCAL but but = gtk_button_new_with_mnemonic(text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = gtk_bin_get_child(but) .focus = but .attach = but .signal = 2 .s_widget = but .xsize = xsize .ysize = ysize .grab = BUTTON_GRAB$ .text = BUTTON_TEXT .get = BUTTON_GET .set = BUTTON_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION STOCK (STRING text$, int xsize, int ysize) LOCAL but but = gtk_button_new_from_stock(text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = gtk_bin_get_child(but) .focus = but .attach = but .signal = 2 .s_widget = but .xsize = xsize .ysize = ysize .grab = BUTTON_GRAB$ .text = BUTTON_TEXT .get = BUTTON_GET .set = BUTTON_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION TOGGLE (STRING text$, int xsize, int ysize) LOCAL but but = gtk_toggle_button_new_with_mnemonic(text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = gtk_bin_get_child(but) .focus = but .attach = but .signal = 2 .s_widget = but .xsize = xsize .ysize = ysize .grab = BUTTON_GRAB$ .text = BUTTON_TEXT .get = BUTTON_GET .set = BUTTON_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION CHECK (STRING text$, int xsize, int ysize) LOCAL but but = gtk_check_button_new_with_label(text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = gtk_bin_get_child(but) .focus = but .attach = but .signal = 2 .s_widget = but .xsize = xsize .ysize = ysize .grab = BUTTON_GRAB$ .text = BUTTON_TEXT .get = BUTTON_GET .set = BUTTON_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION RADIO (STRING text$, int xsize, int ysize, NUMBER group) LOCAL but but = gtk_radio_button_new_with_label_from_widget(group, text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = gtk_bin_get_child(but) .focus = but .attach = but .signal = 2 .s_widget = but .xsize = xsize .ysize = ysize .grab = BUTTON_GRAB$ .text = BUTTON_TEXT .get = BUTTON_GET .set = BUTTON_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION ENTRY (STRING text$, int xsize, int ysize) LOCAL ent ent = gtk_entry_new() gtk_entry_set_text(ent, text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(ent) WITH hug_widget_properties[hug_pointer] .widget = ent .font = ent .focus = ent .attach = 0 .signal = 3 .s_widget = ent .xsize = xsize .ysize = ysize .grab = ENTRY_GRAB$ .text = ENTRY_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN ent END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION PASSWORD (int xsize, int ysize) LOCAL passwd passwd = gtk_entry_new() gtk_entry_set_visibility(passwd, 0) IF HUG_WIDGET_SHOW THEN gtk_widget_show(passwd) WITH hug_widget_properties[hug_pointer] .widget = passwd .font = passwd .focus = passwd .attach = 0 .signal = 3 .s_widget = passwd .xsize = xsize .ysize = ysize .grab = ENTRY_GRAB$ .text = ENTRY_TEXT .get = PASSWORD_GET .set = PASSWORD_SET END WITH hug_pointer = hug_pointer + 1 RETURN passwd END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION MARK (STRING text$, int xsize, int ysize) LOCAL label label = gtk_label_new(text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(label) WITH hug_widget_properties[hug_pointer] .widget = label .font = label .focus = 0 .attach = 0 .signal = 0 .s_widget = label .xsize = xsize .ysize = ysize .grab = MARK_GRAB$ .text = MARK_TEXT .get = MARK_GET .set = MARK_SET END WITH hug_pointer = hug_pointer + 1 RETURN label END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION COMBO (STRING text$, int xsize, int ysize) LOCAL combo, but combo = gtk_combo_box_new_text() gtk_combo_box_append_text(combo, text$) gtk_combo_box_set_active(combo, 0) IF HUG_WIDGET_SHOW THEN gtk_widget_show(combo) but = gtk_bin_get_child(combo) WITH hug_widget_properties[hug_pointer] .widget = combo .font = but .focus = but .attach = 0 .signal = 8 .s_widget = combo .xsize = xsize .ysize = ysize .grab = COMBO_GRAB$ .text = COMBO_TEXT .get = COMBO_GET .set = COMBO_SET END WITH hug_pointer = hug_pointer + 1 RETURN combo END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION HSEPARATOR (int xsize) LOCAL separator separator = gtk_hseparator_new() IF HUG_WIDGET_SHOW THEN gtk_widget_show(separator) WITH hug_widget_properties[hug_pointer] .widget = separator .font = 0 .focus = 0 .attach = 0 .signal = 0 .s_widget = separator .xsize = xsize .ysize = 0 .grab = DUMMY_GRAB$ .text = DUMMY_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN separator END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION VSEPARATOR (int ysize) LOCAL separator separator = gtk_vseparator_new() IF HUG_WIDGET_SHOW THEN gtk_widget_show(separator) WITH hug_widget_properties[hug_pointer] .widget = separator .font = 0 .focus = 0 .attach = 0 .signal = 0 .s_widget = separator .xsize = 0 .ysize = ysize .grab = DUMMY_GRAB$ .text = DUMMY_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN separator END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION FRAME (int xsize, int ysize) LOCAL myframe myframe = gtk_frame_new(0) IF HUG_WIDGET_SHOW THEN gtk_widget_show(myframe) WITH hug_widget_properties[hug_pointer] .widget = myframe .font = 0 .focus = 0 .attach = 0 .signal = 0 .s_widget = myframe .xsize = xsize .ysize = ysize .grab = FRAME_GRAB$ .text = FRAME_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN myframe END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION EDIT (int xsize, int ysize) LOCAL buffer, view, scrolled buffer = gtk_text_buffer_new(0) view = gtk_text_view_new_with_buffer(buffer) scrolled = gtk_scrolled_window_new(0, 0) gtk_scrolled_window_set_policy(scrolled, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC) gtk_scrolled_window_set_shadow_type(scrolled, GTK_SHADOW_ETCHED_IN) gtk_container_add(scrolled, view) gtk_text_view_set_editable(view, 1) gtk_text_view_set_wrap_mode(view, GTK_WRAP_WORD) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(scrolled) WITH hug_widget_properties[hug_pointer] .widget = scrolled .font = buffer .focus = view .attach = 0 .signal = 5 .s_widget = buffer .xsize = xsize .ysize = ysize .grab = EDIT_GRAB$ .text = EDIT_TEXT .get = EDIT_GET .set = EDIT_SET END WITH hug_pointer = hug_pointer + 1 RETURN scrolled END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION LIST (int xsize, int ysize) LOCAL lst, tree, sel, cell, tc, win lst = gtk_list_store_new(1, G_TYPE_STRING) tree = gtk_tree_view_new_with_model(lst) gtk_tree_view_set_headers_visible(tree, 0) sel = gtk_tree_view_get_selection(tree) gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE) cell = gtk_cell_renderer_text_new() tc = gtk_tree_view_column_new_with_attributes("dummy", cell, "text", 0, 0) gtk_tree_view_append_column(tree, tc) win = gtk_scrolled_window_new(0, 0) gtk_scrolled_window_set_policy(win, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC) gtk_scrolled_window_set_shadow_type(win, GTK_SHADOW_ETCHED_IN) gtk_container_add(win, tree) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(win) WITH hug_widget_properties[hug_pointer] .widget = win .font = tree .focus = lst .attach = sel .signal = 5 .s_widget = sel .xsize = xsize .ysize = ysize .grab = LIST_GRAB$ .text = LIST_TEXT .get = LIST_GET .set = LIST_SET END WITH hug_pointer = hug_pointer + 1 RETURN win END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION MSGDIALOG (STRING text$, int xsize, int ysize, int type, int buttons) LOCAL win, table, lbl, but LOCAL dialog IF type > 4 THEN type = 4 IF type < 0 THEN type = 0 text$ = CONCAT$(NL$, text$) dialog = gtk_message_dialog_new(0, 2, type, buttons, text$, 0) gtk_window_set_title(dialog, "Message") gtk_window_set_position(dialog, GTK_WIN_POS_CENTER) gtk_widget_set_size_request(dialog, INT(xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) WITH hug_widget_properties[hug_pointer] .widget = dialog .font = dialog .focus = 0 .attach = 0 .signal = 7 .s_widget = dialog .xsize = xsize .ysize = ysize .grab = MSGDIALOG_GRAB$ .text = MSGDIALOG_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 g_signal_connect_data(dialog, "delete-event", gtk_widget_hide_on_delete, 0, 0, 0) RETURN dialog END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION FILEDIALOG (STRING title$, STRING text$, int xsize, int ysize, int type) LOCAL dialog LOCAL terminator TYPE STRING IF type > 3 THEN type = 3 IF type < 0 THEN type = 0 ' Improved by James Fuller dialog = gtk_file_chooser_dialog_new(title$, 0, type, "gtk-cancel", GTK_RESPONSE_CANCEL, text$, GTK_RESPONSE_ACCEPT, terminator) gtk_window_set_title(dialog, "Selector") gtk_widget_set_size_request(dialog, INT(xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) gtk_window_set_position(dialog, GTK_WIN_POS_CENTER) gtk_widget_realize(dialog) WITH hug_widget_properties[hug_pointer] .widget = dialog .font = dialog .focus = 0 .attach = 0 .signal = 7 .s_widget = dialog .xsize = xsize .ysize = ysize .grab = FILEDIALOG_GRAB$ .text = FILEDIALOG_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 g_signal_connect_data(dialog, "delete-event", gtk_widget_hide_on_delete, 0, 0, 0) RETURN dialog END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION SPIN (int xsize, int ysize, FLOATING start, FLOATING end, FLOATING step) LOCAL but, lbl but = gtk_spin_button_new_with_range(start, end, step) IF HUG_WIDGET_SHOW THEN gtk_widget_show(but) WITH hug_widget_properties[hug_pointer] .widget = but .font = but .focus = but .attach = but .signal = 6 .s_widget = but .xsize = xsize .ysize = ysize .grab = DUMMY_GRAB$ .text = DUMMY_TEXT .get = SPIN_GET .set = SPIN_SET END WITH hug_pointer = hug_pointer + 1 RETURN but END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION IMAGE(STRING file$, int xsize, int ysize) LOCAL image, ebox image = gtk_image_new_from_file(file$) ebox = gtk_event_box_new() gtk_container_add(ebox, image) gtk_widget_queue_draw(image) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(ebox) WITH hug_widget_properties[hug_pointer] .widget = ebox .font = image .focus = image .attach = 0 .signal = 4 .s_widget = ebox .xsize = xsize .ysize = ysize .grab = DUMMY_GRAB$ .text = DUMMY_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN ebox END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION CANVAS (int xsize, int ysize) LOCAL image, ebox, gdkwin, pix, context, gdkcol REM Setup the image image = gtk_image_new() ebox = gtk_event_box_new() gtk_widget_set_events (ebox, GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_SCROLL_MASK) g_signal_connect_data(ebox, "button-press-event", hug_mouse_event, 20, 0, 0) g_signal_connect_data(ebox, "button-release-event", hug_mouse_event, 20, 0, 0) g_signal_connect_data(ebox, "motion-notify-event", hug_mouse_event, 0, 0, 0) g_signal_connect_data(ebox, "scroll-event", hug_mouse_event, 10, 0, G_CONNECT_AFTER) gtk_container_add(ebox, image) gdkwin = gdk_get_default_root_window() pix = gdk_pixmap_new(gdkwin, xsize, ysize, -1) context = gdk_gc_new(pix) gtk_image_set_from_pixmap(image, pix, 0) REM Determine colors gdkcol = MEMORY(HUG_DEFAULT_WIDGET_SIZE) gdk_color_parse("#FFFFFF", gdkcol) gdk_gc_set_rgb_bg_color(context, gdkcol) gdk_gc_set_rgb_fg_color(context, gdkcol) gdk_draw_rectangle(pix, context, 1, 0, 0, xsize, ysize) gtk_widget_queue_draw(image) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(ebox) WITH hug_widget_properties[hug_pointer] .widget = ebox .font = 0 .focus = 0 .pix = pix .image = image .color = gdkcol .attach = 0 .signal = 4 .s_widget = ebox .xsize = xsize .ysize = ysize .grab = DUMMY_GRAB$ .text = DUMMY_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 REM Define this as default drawing canvas DRAW(ebox) RETURN ebox END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION CLIPBOARD () LOCAL clip, atom atom = gdk_atom_intern("CLIPBOARD", 0) clip = gtk_clipboard_get(atom) WITH hug_widget_properties[hug_pointer] .widget = clip .font = 0 .focus = 0 .attach = 0 .signal = 0 .s_widget = 0 .xsize = 0 .ysize = 0 .grab = CLIPBOARD_GRAB$ .text = CLIPBOARD_TEXT .get = DUMMY_GET .set = DUMMY_SET END WITH hug_pointer = hug_pointer + 1 RETURN clip END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION PROGRESSBAR (STRING text$, int xsize, int ysize) LOCAL bar bar = gtk_progress_bar_new() gtk_progress_bar_set_text(bar, text$) IF HUG_WIDGET_SHOW THEN gtk_widget_show(bar) WITH hug_widget_properties[hug_pointer] .widget = bar .font = 0 .focus = bar .attach = bar .signal = 1 .s_widget = bar .xsize = xsize .ysize = ysize .grab = PROGRESSBAR_GRAB$ .text = PROGRESSBAR_TEXT .get = PROGRESSBAR_GET .set = PROGRESSBAR_SET END WITH hug_pointer = hug_pointer + 1 RETURN bar END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB CALLBACK (NUMBER widget, void* addr) LOCAL i FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN SELECT hug_widget_properties[i].signal CASE 1 g_signal_connect_data(hug_widget_properties[i].s_widget, "show", addr, 0, 0, 0) CASE 2 g_signal_connect_data(hug_widget_properties[i].s_widget, "clicked", addr, 0, 0, 0) CASE 3 g_signal_connect_data(hug_widget_properties[i].s_widget, "activate", addr, 0, 0, 0) CASE 4 g_signal_connect_data(hug_widget_properties[i].s_widget, "button-press-event", addr, 0, 0, 0) CASE 5 g_signal_connect_data(hug_widget_properties[i].s_widget, "changed", addr, 0, 0, 0) CASE 6 g_signal_connect_data(hug_widget_properties[i].s_widget, "value-changed", addr, 0, 0, 0) CASE 7 g_signal_connect_data(hug_widget_properties[i].s_widget, "response", addr, 0, 0, 0) CASE 8 g_signal_connect_data(hug_widget_properties[i].s_widget, "set-focus-child", addr, 0, 0, 0) DEFAULT PRINT "WARNING: Cannot setup callback for widget!" END END SELECT BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- SUB CALLBACKX (NUMBER widget, void* addr, NUMBER userdata) LOCAL i FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN SELECT hug_widget_properties[i].signal CASE 1 g_signal_connect_data(hug_widget_properties[i].s_widget, "show", addr, userdata, 0, 0) CASE 2 g_signal_connect_data(hug_widget_properties[i].s_widget, "clicked", addr, userdata, 0, 0) CASE 3 g_signal_connect_data(hug_widget_properties[i].s_widget, "activate", addr, userdata, 0, 0) CASE 4 g_signal_connect_data(hug_widget_properties[i].s_widget, "button-press-event", addr, userdata, 0, 0) CASE 5 g_signal_connect_data(hug_widget_properties[i].s_widget, "changed", addr, userdata, 0, 0) CASE 6 g_signal_connect_data(hug_widget_properties[i].s_widget, "value-changed", addr, userdata, 0, 0) CASE 7 g_signal_connect_data(hug_widget_properties[i].s_widget, "response", addr, userdata, 0, 0) DEFAULT PRINT "WARNING: Cannot setup callback for widget!" END END SELECT BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- FUNCTION MOUSE (NUMBER arg) SELECT arg CASE 0 RETURN hug_gui_properties.mousex CASE 1 RETURN hug_gui_properties.mousey CASE 2 RETURN hug_gui_properties.button CASE 3 RETURN hug_gui_properties.scroll DEFAULT RETURN 0 END SELECT END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB CIRCLE (STRING color$, int x, int y, int xsize, int ysize, NUMBER fill) LOCAL pix, context, i REM Get the associated canvas pix = hug_gui_properties.canvas REM Get the internal widgetID FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_color_parse(color$, hug_widget_properties[i].color) context = gdk_gc_new(pix) gdk_gc_set_rgb_fg_color(context, hug_widget_properties[i].color) gdk_draw_arc(pix, context, fill, x, y, xsize, ysize, 0, 23040) REM Refresh image gtk_widget_queue_draw(hug_widget_properties[i].image) g_main_context_iteration(0, TRUE) g_object_unref(context) END SUB REM -------------------------------------------------------------------------------------------------- SUB PIXEL (STRING color$, int x, int y) LOCAL pix, context, i REM Get the associated canvas pix = hug_gui_properties.canvas REM Get the internal widgetID FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_color_parse(color$, hug_widget_properties[i].color) context = gdk_gc_new(pix) gdk_gc_set_rgb_fg_color(context, hug_widget_properties[i].color) gdk_draw_point(pix, context, x, y) REM Refresh image gtk_widget_queue_draw(hug_widget_properties[i].image) g_main_context_iteration(0, TRUE) g_object_unref(context) END SUB REM -------------------------------------------------------------------------------------------------- SUB LINE (STRING color$, int xstart, int ystart, int xend, int yend) LOCAL pix, context, i REM Get the associated canvas pix = hug_gui_properties.canvas REM Get the internal widgetID FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_color_parse(color$, hug_widget_properties[i].color) context = gdk_gc_new(pix) gdk_gc_set_rgb_fg_color(context, hug_widget_properties[i].color) gdk_draw_line(pix, context, xstart, ystart, xend, yend) REM Refresh image gtk_widget_queue_draw(hug_widget_properties[i].image) g_main_context_iteration(0, TRUE) g_object_unref(context) END SUB REM -------------------------------------------------------------------------------------------------- SUB SQUARE (STRING color$, int x, int y, int xsize, int ysize, int fill) LOCAL pix, context, i REM Get the associated canvas pix = hug_gui_properties.canvas REM Get the internal widgetID FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_color_parse(color$, hug_widget_properties[i].color) context = gdk_gc_new(pix) gdk_gc_set_rgb_fg_color(context, hug_widget_properties[i].color) gdk_draw_rectangle(pix, context, fill, x, y, xsize, ysize) REM Refresh image gtk_widget_queue_draw(hug_widget_properties[i].image) g_main_context_iteration(0, TRUE) g_object_unref(context) END SUB REM -------------------------------------------------------------------------------------------------- SUB OUT (STRING text$, STRING fcolor$, STRING bcolor$, int x, int y) LOCAL image, pix, context, layout, gdkcol, i REM Get the associated canvas pix = hug_gui_properties.canvas REM Get the internal widgetID FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_color_parse(fcolor$, hug_widget_properties[i].color) context = gdk_gc_new(pix) gdk_gc_set_rgb_fg_color(context, hug_widget_properties[i].color) image = hug_widget_properties[i].image layout = gtk_widget_create_pango_layout(image, text$) gdkcol = gdk_color_copy(hug_widget_properties[i].color) IF LEN(bcolor$) NE 0 THEN gdk_color_parse(bcolor$, gdkcol) gdk_draw_layout_with_colors(pix, context, x, y, layout, hug_widget_properties[i].color, gdkcol) ELSE gdk_draw_layout_with_colors(pix, context, x, y, layout, hug_widget_properties[i].color, 0) END IF REM Refresh image gtk_widget_queue_draw(image) g_main_context_iteration(0, TRUE) REM Free memory gdk_color_free(gdkcol) g_object_unref(layout) g_object_unref(context) END SUB REM -------------------------------------------------------------------------------------------------- SUB PICTURE (STRING file$, int xpos, int ypos, int xsize, int ysize) LOCAL pix, context, buf LOCAL xs, ys TYPE int REM Get the associated canvas pix = hug_gui_properties.canvas context = gdk_gc_new(pix) buf = gdk_pixbuf_new_from_file(file$, 0) REM Get canvas properties FOR i = 0 TO hug_pointer IF hug_widget_properties[i].pix EQ pix THEN BREAK END IF NEXT gdk_draw_pixbuf(pix, context, buf, 0, 0, xpos, ypos, xsize, ysize, 0, 0, 0) gtk_widget_queue_draw(hug_widget_properties[i].image) g_main_context_iteration(0, TRUE) g_object_unref(context) g_object_unref(buf) END SUB REM -------------------------------------------------------------------------------------------------- SUB ATTACH (NUMBER widget, NUMBER child, NUMBER xpos, NUMBER ypos) LOCAL i, layer, dim FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN layer = hug_widget_properties[i].attach BREAK END IF NEXT FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ child THEN BREAK END IF NEXT IF INSTR(hug_gui_properties.options$, "TABLE") THEN gtk_table_attach_defaults(layer, child, xpos, xpos+hug_widget_properties[i].xsize, ypos, ypos+hug_widget_properties[i].ysize) ELSE gtk_widget_set_size_request(child, INT(hug_widget_properties[i].xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(hug_widget_properties[i].ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) gtk_fixed_put(layer, child, INT(xpos*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(ypos*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) END IF END SUB REM -------------------------------------------------------------------------------------------------- SUB TIMEOUT(int mseconds, void* addr) IF hug_gui_properties.timeout_id NE -1 THEN g_source_remove(hug_gui_properties.timeout_id) END IF hug_gui_properties.timeout_id = g_timeout_add(mseconds, addr, 0) REM Return TRUE in callbacked function if it needs to be called again END SUB REM -------------------------------------------------------------------------------------------------- SUB FONT (NUMBER widget, STRING which$) LOCAL desc, i, gtksettings desc = pango_font_description_from_string(which$) REM Get widget and focus FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN gtk_widget_modify_font(hug_widget_properties[i].font, desc) BREAK END IF NEXT pango_font_description_free(desc) END SUB REM -------------------------------------------------------------------------------------------------- SUB DISABLE (NUMBER widget) gtk_widget_set_sensitive(widget, 0) END SUB REM -------------------------------------------------------------------------------------------------- SUB ENABLE (NUMBER widget) gtk_widget_set_sensitive(widget, 1) END SUB REM -------------------------------------------------------------------------------------------------- SUB FOCUS (NUMBER widget) LOCAL i REM Get widget and focus FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN g_object_set(hug_widget_properties[i].focus, "can-focus", 1, NUL) gtk_widget_grab_focus(hug_widget_properties[i].focus) BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- SUB UNFOCUS (NUMBER widget) LOCAL i REM Get widget and focus FOR i = 0 TO hug_pointer IF hug_widget_properties[i].widget EQ widget THEN g_object_set(hug_widget_properties[i].focus, "can-focus", 0, NUL) BREAK END IF NEXT END SUB REM -------------------------------------------------------------------------------------------------- FUNCTION SCREENSIZE(int type) SELECT type CASE 0 RETURN gdk_screen_get_width(gdk_screen_get_default()) CASE 1 RETURN gdk_screen_height(gdk_screen_get_default()) END SELECT END FUNCTION REM -------------------------------------------------------------------------------------------------- FUNCTION KEY RETURN hug_gui_properties.last_key_pressed END FUNCTION REM -------------------------------------------------------------------------------------------------- SUB SYNC WHILE gtk_events_pending() DO gtk_main_iteration_do(FALSE) WEND END SUB REM -------------------------------------------------------------------------------------------------- SUB DISPLAY gtk_main END SUB REM --------------------------------------------------------------------------------------------------