REM ************************************************************************************* REM REM Module to reach the GTK-server for Scriptbasic. REM REM ************************************************************************************* MODULE gtk DECLARE SUB ::gtk ALIAS "_gtk" LIB "gtk-server" REM ************************************************************************************* REM REM Example functions to wrap GTK into Scriptbasic. REM REM Only implementing the widgets which can be found on HTML forms to get started with REM GUI programming. Implement more if you like. REM REM -windows REM -normal buttons REM -check buttons REM -radio buttons REM -text entries REM -password entries REM -labels REM -drop down lists REM -multiline text edits REM -horizontal lines REM -fieldsets REM -lists REM REM Version 1.0 REM - Initial release REM REM February 5, 2006 - Peter van Eerten REM REM ************************************************************************************* GLOBAL GTK_INIT GLOBAL GTK_CONTAINER GLOBAL GTK_TYPE GLOBAL GTK_START_ITER GLOBAL GTK_END_ITER GLOBAL GTK_TEXT_VIEW GLOBAL GTK_COMBO_BOUND GLOBAL GTK_LIST_STORE GLOBAL GTK_LIST_ITER GLOBAL GTK_LIST_SELECT GLOBAL GTK_LIST_ARRAY REM ************************************************************** Concat arguments to GTK FUNCTION GUI(g0, g1, g2, g3, g4, g5, g6) LOCAL result$ IF GTK_INIT = undef THEN IF LEN(gtk("gtk_check_version 2 6 0")) > 0 THEN PRINT "Your GTK installation is too old!\n" PRINT "GTK version 2.6.0 or higher is required. Exiting...\n" END END IF gtk("gtk_init NULL NULL") GTK_INIT = "done" END IF result$ = STR(g0) & " " & STR(g1) & " " & STR(g2) & " " & STR(g3) & " " & STR(g4) & " " & STR(g5) & " " & STR(g6) GUI = gtk(result$) END FUNCTION REM ************************************************************** UTF-8 conversion for high ASCII FUNCTION UTF8(st$) LOCAL t, x, b1, b2 t = 1 WHILE t <= LEN(st$) x = ASC(MID(st$, t, 1)) IF x > 127 THEN b1 = CHR((x AND 192) / 64 + 192) b2 = CHR((x AND 63) + 128) st$ = LEFT(st$, t - 1) & b1 & b2 & RIGHT(st$, LEN(st$) - t - 1) t+=1 END IF t+=1 WEND UTF8 = st$ END FUNCTION REM ************************************************************** Window creation starts here FUNCTION window(title, xsize, ysize) LOCAL win$, fix$ win$ = GUI("gtk_window_new 0") GUI("gtk_window_set_title", win$, "\"" & title & "\"") GUI("gtk_widget_set_size_request", win$, xsize, ysize) GUI("gtk_window_set_resizable", win$, 0) GUI("gtk_widget_set_name", win$, win$) GUI("gtk_widget_show", win$) fix$ = GUI("gtk_fixed_new") GUI("gtk_container_add", win$, fix$) GUI("gtk_widget_show", fix$) GTK_CONTAINER{win$} = fix$ GTK_TYPE{win$} = "window" window = win$ END FUNCTION REM ************************************************************** Parentize FUNCTION attach(widget, parent, x, y) LOCAL fix$ fix$ = GTK_CONTAINER{parent} GUI("gtk_fixed_put", fix$, widget, x, y) END FUNCTION REM ************************************************************** Button creation starts here FUNCTION button(text, xsize, ysize) LOCAL but$ but$ = GUI("gtk_button_new_with_label \"" & text & "\"") GUI("gtk_widget_set_size_request", but$, xsize, ysize) GUI("gtk_widget_set_name", but$, but$) GUI("gtk_widget_show", but$) GTK_TYPE{but$} = "button" button = but$ END FUNCTION REM ************************************************************** Check Button creation starts here FUNCTION check(text, xsize, ysize) LOCAL chk$ chk$ = GUI("gtk_check_button_new_with_label \"" & text & "\"") GUI("gtk_widget_set_size_request", chk$, xsize, ysize) GUI("gtk_widget_set_name", chk$, chk$) GUI("gtk_widget_show", chk$) GTK_TYPE{chk$} = "check" check = chk$ END FUNCTION REM ************************************************************** Radio Button creation starts here FUNCTION radio(text, xsize, ysize, group) LOCAL rad$ rad$ = GUI("gtk_radio_button_new_with_label_from_widget", "\"" & STR(group) & "\"", "\"" & text & "\"") GUI("gtk_widget_set_size_request", rad$, xsize, ysize) GUI("gtk_widget_set_name", rad$, rad$) GUI("gtk_widget_show", rad$) GTK_TYPE{rad$} = "radio" radio = rad$ END FUNCTION REM ************************************************************** Entry creation starts here FUNCTION entry(xsize, ysize) LOCAL ent$ ent$ = GUI("gtk_entry_new") GUI("gtk_widget_set_size_request", ent$, xsize, ysize) GUI("gtk_widget_set_name", ent$, ent$) GUI("gtk_widget_show", ent$) GTK_TYPE{ent$} = "entry" entry = ent$ END FUNCTION REM ************************************************************** Password creation starts here FUNCTION password(xsize, ysize) LOCAL pwd$ pwd$ = GUI("gtk_entry_new") GUI("gtk_widget_set_size_request", pwd$, xsize, ysize) GUI("gtk_entry_set_visibility", pwd$, 0) GUI("gtk_widget_set_name", pwd$, pwd$) GUI("gtk_widget_show", pwd$) GTK_TYPE{pwd$} = "password" password = pwd$ END FUNCTION REM ************************************************************** Label creation starts here FUNCTION label(text, xsize, ysize) LOCAL lab$ lab$ = GUI("gtk_label_new \"" & text & "\"") GUI("gtk_widget_set_size_request", lab$, xsize, ysize) GUI("gtk_widget_set_name", lab$, lab$) GUI("gtk_widget_show", lab$) GTK_TYPE{lab$} = "label" label = lab$ END FUNCTION REM ************************************************************** DropList creation starts here FUNCTION droplist(text, xsize, ysize) LOCAL drop$, i drop$ = GUI("gtk_combo_box_new_text") IF LBOUND(text) = undef THEN PRINT "WARNING: Pass an array to create a droplist!\n" GTK_COMBO_BOUND{drop$} = undef ELSE FOR i = LBOUND(text) TO UBOUND(text) GUI("gtk_combo_box_append_text", drop$, "\"" & text[i] & "\"") NEXT i GTK_COMBO_BOUND{drop$} = UBOUND(text) - LBOUND(text) END IF GUI("gtk_combo_box_set_active", drop$, 0) GUI("gtk_widget_set_size_request", drop$, xsize, ysize) GUI("gtk_widget_set_name", drop$, drop$) GUI("gtk_widget_show", drop$) GTK_TYPE{drop$} = "droplist" droplist = drop$ END FUNCTION REM ************************************************************** Multiline text starts here FUNCTION text(xsize, ysize) LOCAL buf$, vw$, sw$ buf$ = GUI("gtk_text_buffer_new NULL") vw$ = GUI("gtk_text_view_new_with_buffer", buf$) GUI("gtk_text_view_set_wrap_mode", vw$, 1) GUI("gtk_widget_set_name", vw$, vw$) GUI("gtk_widget_show", vw$) sw$ = GUI("gtk_scrolled_window_new NULL NULL") GUI("gtk_scrolled_window_set_policy", sw$, 1, 1) GUI("gtk_scrolled_window_set_shadow_type", sw$, 1) GUI("gtk_container_add", sw$, vw$) GUI("gtk_text_view_set_editable", vw$, 1) GUI("gtk_text_view_set_wrap_mode", vw$, 2) GUI("gtk_widget_set_size_request", sw$, xsize, ysize) GUI("gtk_widget_show", sw$) GTK_START_ITER{sw$} = GUI("gtk_frame_new NULL") GTK_END_ITER{sw$} = GUI("gtk_frame_new NULL") GTK_TEXT_VIEW{sw$} = vw$ GTK_CONTAINER{sw$} = buf$ GTK_TYPE{sw$} = "text" text = sw$ END FUNCTION REM ************************************************************** Separator creation starts here FUNCTION separator(xsize) LOCAL sep$ sep$ = GUI("gtk_hseparator_new") GUI("gtk_widget_set_size_request", sep$, xsize, 0) GUI("gtk_widget_set_name", sep$, sep$) GUI("gtk_widget_show", sep$) GTK_TYPE{sep$} = "separator" separator = sep$ END FUNCTION REM ************************************************************** Fieldset (frame) creation starts here FUNCTION frame(text, xsize, ysize) LOCAL frm$ frm$ = GUI("gtk_frame_new NULL") GUI("gtk_frame_set_label", frm$, "\"" & text & "\"") GUI("gtk_widget_set_size_request", frm$, xsize, ysize) GUI("gtk_widget_set_name", frm$, frm$) GUI("gtk_widget_show", frm$) GTK_TYPE{frm$} = "frame" frame = frm$ END FUNCTION REM ************************************************************** List widget FUNCTION list(text, xsize, ysize) LOCAL lst$, iter$, tree$, column$, sel$, sw$, i iter$ = GUI("gtk_frame_new NULL") lst$ = GUI("gtk_list_store_new 1 64") tree$ = GUI("gtk_tree_view_new_with_model", lst$) GUI("gtk_tree_view_set_headers_visible", tree$, 0) GUI("gtk_widget_set_name", tree$, tree$) GUI("gtk_server_connect", tree$, "button-press-event", tree$, 1) sel$ = GUI("gtk_tree_view_get_selection", tree$) GUI("gtk_tree_selection_set_mode", sel$, 1) column$ = GUI("gtk_tree_view_column_new_with_attributes", "dummy", GUI("gtk_cell_renderer_text_new"), "text", 0, "NULL") GUI("gtk_tree_view_append_column", tree$, column$) sw$ = GUI("gtk_scrolled_window_new NULL NULL") GUI("gtk_scrolled_window_set_policy", sw$, 1, 1) GUI("gtk_scrolled_window_set_shadow_type", sw$, 1) GUI("gtk_container_add", sw$, tree$) GUI("gtk_widget_set_size_request", sw$, xsize, ysize) GUI("gtk_widget_show_all", sw$) IF LBOUND(text) = undef THEN PRINT "WARNING: Pass an array to create a list!\n" ELSE FOR i = LBOUND(text) TO UBOUND(text) GUI("gtk_list_store_append", lst$, iter$) GUI("gtk_list_store_set", lst$, iter$, 0, "\"" & text[i] & "\"", -1) NEXT i GTK_LIST_ARRAY{sw$} = text END IF GTK_LIST_STORE{sw$} = lst$ GTK_LIST_ITER{sw$} = iter$ GTK_LIST_SELECT{sw$} = sel$ GTK_CONTAINER{sw$} = tree$ GTK_TYPE{sw$} = "list" list = sw$ END FUNCTION REM ************************************************************** Get text from widget FUNCTION get_text(widget) LOCAL arr IF GTK_TYPE{widget} = "window" THEN get_text = GUI("gtk_window_get_title", widget) IF GTK_TYPE{widget} = "button" THEN get_text = GUI("gtk_button_get_label", widget) IF GTK_TYPE{widget} = "check" THEN get_text = GUI("gtk_button_get_label", widget) IF GTK_TYPE{widget} = "radio" THEN get_text = GUI("gtk_button_get_label", widget) IF GTK_TYPE{widget} = "entry" THEN get_text = GUI("gtk_entry_get_text", widget) IF GTK_TYPE{widget} = "password" THEN get_text = GUI("gtk_entry_get_text", widget) IF GTK_TYPE{widget} = "label" THEN get_text = GUI("gtk_label_get_text", widget) IF GTK_TYPE{widget} = "droplist" THEN get_text = GUI("gtk_combo_box_get_active_text", widget) IF GTK_TYPE{widget} = "text" THEN GUI("gtk_text_buffer_get_start_iter", GTK_CONTAINER{widget}, GTK_START_ITER{widget}) GUI("gtk_text_buffer_get_end_iter", GTK_CONTAINER{widget}, GTK_END_ITER{widget}) get_text = GUI("gtk_text_buffer_get_text", GTK_CONTAINER{widget}, GTK_START_ITER{widget}, GTK_END_ITER{widget}, 1) END IF IF GTK_TYPE{widget} = "separator" THEN PRINT "WARNING: Cannot get text of " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "frame" THEN get_text = GUI("gtk_frame_get_label", widget) IF GTK_TYPE{widget} = "list" THEN IF VAL(GUI("gtk_tree_selection_get_selected", GTK_LIST_SELECT{widget}, "NULL", GTK_LIST_ITER{widget})) THEN IF GTK_LIST_ARRAY{widget} <> undef THEN arr = GTK_LIST_ARRAY{widget} get_text = arr[LBOUND(arr) + VAL(GUI("gtk_tree_model_get_string_from_iter", GTK_LIST_STORE{widget}, GTK_LIST_ITER{widget}))] END IF END IF END IF END FUNCTION REM ************************************************************** Set text in widget FUNCTION set_text(widget, text) LOCAL mark$, i IF GTK_TYPE{widget} = "window" THEN GUI("gtk_window_set_title", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "button" THEN GUI("gtk_button_set_label", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "check" THEN GUI("gtk_button_set_label", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_button_set_label", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "entry" THEN GUI("gtk_entry_set_text", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "password" THEN GUI("gtk_entry_set_text", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "label" THEN GUI("gtk_label_set_text", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "droplist" THEN IF GTK_COMBO_BOUND{widget} <> undef THEN FOR i = 0 TO GTK_COMBO_BOUND{widget} GUI("gtk_combo_box_remove_text", widget, 0) NEXT i END IF IF LBOUND(text) = undef THEN PRINT "WARNING: Pass an array to recreate a droplist!\n" GTK_COMBO_BOUND{drop$} = undef ELSE FOR i = LBOUND(text) TO UBOUND(text) GUI("gtk_combo_box_append_text", widget, "\"" & text[i] & "\"") NEXT i GTK_COMBO_BOUND{drop$} = UBOUND(text) - LBOUND(text) END IF GUI("gtk_combo_box_set_active", widget, 0) END IF IF GTK_TYPE{widget} = "text" THEN GUI("gtk_text_buffer_set_text", GTK_CONTAINER{widget}, "\"" & text & "\"", -1) GUI("gtk_text_buffer_get_end_iter", GTK_CONTAINER{widget}, GTK_END_ITER{widget}) mark$ = GUI("gtk_text_buffer_create_mark", GTK_CONTAINER{widget}, "mymark", GTK_END_ITER{widget}, 0) GUI("gtk_text_view_scroll_to_mark", GTK_TEXT_VIEW{widget}, mark$, 0, 1, 0.0, 1.0) GUI("gtk_text_buffer_delete_mark", GTK_CONTAINER{widget}, mark$) END IF IF GTK_TYPE{widget} = "separator" THEN PRINT "WARNING: Cannot set text of " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "frame" THEN GUI("gtk_frame_set_label", widget, "\"" & text & "\"") IF GTK_TYPE{widget} = "list" THEN GUI("gtk_list_store_clear", GTK_LIST_STORE{widget}) IF LBOUND(text) = undef THEN PRINT "WARNING: Pass an array to create a list!\n" GTK_LIST_ARRAY = undef ELSE FOR i = LBOUND(text) TO UBOUND(text) GUI("gtk_list_store_append", GTK_LIST_STORE{widget}, GTK_LIST_ITER{widget}) GUI("gtk_list_store_set", GTK_LIST_STORE{widget}, GTK_LIST_ITER{widget}, 0, "\"" & text[i] & "\"", -1) NEXT i GTK_LIST_ARRAY{widget} = text END IF END IF END FUNCTION REM ************************************************************** Find selection of chek/option button FUNCTION get_value(widget) IF GTK_TYPE{widget} = "check" THEN get_value = VAL(GUI("gtk_toggle_button_get_active", widget)) ELSE IF GTK_TYPE{widget} = "radio" THEN get_value = VAL(GUI("gtk_toggle_button_get_active", widget)) ELSE IF GTK_TYPE{widget} = "droplist" THEN get_value = VAL(GUI("gtk_combo_box_get_active", widget)) ELSE IF GTK_TYPE{widget} = "text" THEN get_value = VAL(GUI("gtk_text_buffer_get_line_count", GTK_CONTAINER{widget})) ELSE IF GTK_TYPE{widget} = "list" THEN IF VAL(GUI("gtk_tree_selection_get_selected", GTK_LIST_SELECT{widget}, "NULL", GTK_LIST_ITER{widget})) THEN get_value = VAL(GUI("gtk_tree_model_get_string_from_iter", GTK_LIST_STORE{widget}, GTK_LIST_ITER{widget})) END IF ELSE PRINT "WARNING: Cannot get status of " & GTK_TYPE{widget} & " widget!\n" END IF END FUNCTION REM ************************************************************** Set selection of check/option button FUNCTION set_value(widget, n) LOCAL path, mark$ IF GTK_TYPE{widget} = "check" THEN GUI("gtk_toggle_button_set_active", widget, 1) ELSE IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_toggle_button_set_active", widget, 1) ELSE IF GTK_TYPE{widget} = "droplist" THEN GUI("gtk_combo_box_set_active", widget, n) ELSE IF GTK_TYPE{widget} = "text" THEN GUI("gtk_text_buffer_get_iter_at_line", GTK_CONTAINER{widget}, GTK_END_ITER{widget}, n) mark$ = GUI("gtk_text_buffer_create_mark", GTK_CONTAINER{widget}, "mymark", GTK_END_ITER{widget}, 0) GUI("gtk_text_view_scroll_to_mark", GTK_TEXT_VIEW{widget}, mark$, 0, 1, 0.0, 1.0) GUI("gtk_text_buffer_delete_mark", GTK_CONTAINER{widget}, mark$) ELSE IF GTK_TYPE{widget} = "list" THEN path = GUI("gtk_tree_path_new_from_string", n) GUI("gtk_tree_selection_select_path", GTK_LIST_SELECT{widget}, path) GUI("gtk_tree_path_free", path) ELSE PRINT "WARNING: Cannot activate " & GTK_TYPE{widget} & " widget!\n" END IF END FUNCTION REM ************************************************************** Focus to widget FUNCTION focus(widget) GUI("gtk_widget_grab_focus", widget) END FUNCTION REM ************************************************************** Foreground colors FUNCTION fg_color(widget, r, g, b) LOCAL tmp$, gtksettings$ gtksettings$ = GUI("gtk_settings_get_default") IF GTK_TYPE{widget} = "window" THEN PRINT "WARNING: Cannot set foreground color of window widget!\n" IF GTK_TYPE{widget} = "button" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "check" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "entry" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { GtkWidget::cursor_color = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "password" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { GtkWidget::cursor_color = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "label" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "droplist" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "text" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { GtkWidget::cursor_color = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & GTK_TEXT_VIEW{widget} & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "separator" THEN PRINT "WARNING: Cannot set foreground color of separator widget!\n" IF GTK_TYPE{widget} = "frame" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { fg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "list" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { text[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & GTK_CONTAINER{widget} & "\\\" style \\\"" & widget & "\\\"\"") END IF GUI("gtk_rc_reset_styles", gtksettings$) END FUNCTION REM ************************************************************** Background colors FUNCTION bg_color(widget, r, g, b) LOCAL tmp$, gtksettings$ gtksettings$ = GUI("gtk_settings_get_default") IF GTK_TYPE{widget} = "window" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"" & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "button" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") IF r < 60415 THEN r = r + 5120 IF g < 60415 THEN g = g + 5120 IF b < 60415 THEN b = b + 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") IF r > 5120 THEN r = r - 5120 IF g > 5120 THEN g = g - 5120 IF b > 5120 THEN b = b - 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "check" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") IF r < 60415 THEN r = r + 5120 IF g < 60415 THEN g = g + 5120 IF b < 60415 THEN b = b + 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") IF r > 5120 THEN r = r - 5120 IF g > 5120 THEN g = g - 5120 IF b > 5120 THEN b = b - 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") IF r < 60415 THEN r = r + 5120 IF g < 60415 THEN g = g + 5120 IF b < 60415 THEN b = b + 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") IF r > 5120 THEN r = r - 5120 IF g > 5120 THEN g = g - 5120 IF b > 5120 THEN b = b - 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[ACTIVE] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "entry" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { base[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "password" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { base[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "text" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { base[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & GTK_TEXT_VIEW{widget} & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "droplist" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") IF r < 60415 THEN r = r + 5120 IF g < 60415 THEN g = g + 5120 IF b < 60415 THEN b = b + 5120 GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[PRELIGHT] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "*\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "label" THEN PRINT "WARNING: Cannot set background color of label widget!\n" IF GTK_TYPE{widget} = "separator" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "frame" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { bg[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & widget & "\\\" style \\\"" & widget & "\\\"\"") END IF IF GTK_TYPE{widget} = "list" THEN GUI("gtk_rc_parse_string", "\"style \\\"" & widget & "\\\" { base[NORMAL] = {" & r & ", " & g & ", " & b & "} }\"") GUI("gtk_rc_parse_string \"widget \\\"*.*." & GTK_CONTAINER{widget} & "\\\" style \\\"" & widget & "\\\"\"") END IF GUI("gtk_rc_reset_styles", gtksettings$) END FUNCTION REM ************************************************************** Disable widget FUNCTION disable(widget) IF GTK_TYPE{widget} = "window" THEN PRINT "WARNING: Cannot disable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "button" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "check" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "entry" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "password" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "label" THEN PRINT "WARNING: Cannot disable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "droplist" THEN GUI("gtk_widget_set_sensitive", widget, 0) IF GTK_TYPE{widget} = "text" THEN GUI("gtk_text_view_set_editable", GTK_TEXT_VIEW{widget}, 0) IF GTK_TYPE{widget} = "separator" THEN PRINT "WARNING: Cannot disable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "frame" THEN PRINT "WARNING: Cannot disable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "list" THEN GUI("gtk_widget_set_sensitive", widget, 0) END FUNCTION REM ************************************************************** Enable widget FUNCTION enable(widget) IF GTK_TYPE{widget} = "window" THEN PRINT "WARNING: Cannot enable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "button" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "check" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "radio" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "entry" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "password" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "label" THEN PRINT "WARNING: Cannot enable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "droplist" THEN GUI("gtk_widget_set_sensitive", widget, 1) IF GTK_TYPE{widget} = "text" THEN GUI("gtk_text_view_set_editable", GTK_TEXT_VIEW{widget}, 1) IF GTK_TYPE{widget} = "separator" THEN PRINT "WARNING: Cannot enable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "frame" THEN PRINT "WARNING: Cannot enable " & GTK_TYPE{widget} & " widget!\n" IF GTK_TYPE{widget} = "list" THEN GUI("gtk_widget_set_sensitive", widget, 1) END FUNCTION REM ************************************************************** Hide widget FUNCTION hide(widget) GUI("gtk_widget_hide", widget) END FUNCTION REM ************************************************************** Show widget FUNCTION show(widget) GUI("gtk_widget_show", widget) END FUNCTION REM ************************************************************** Synchronous mainloop here FUNCTION event event = GUI("gtk_server_callback wait") END FUNCTION REM ************************************************************** Asynchronous mainloop here FUNCTION async async = GUI("gtk_server_callback update") END FUNCTION REM ************************************************************** Get version FUNCTION version version = GUI("gtk_server_version") END FUNCTION REM ************************************************************** Get/set logging FUNCTION logging(arg) GUI("gtk_server_logging", arg) END FUNCTION END MODULE