#!/usr/bin/newlisp
#
# See if we can get newLisp running with a GTK IDE :-)
#
# The coolest thing is, that this IDE is programmed in 100% newLISP.
# Ongoing project, have mercy. Enjoy, Peter.
#
# First beta release at January 20, 2006 - PvE.
# Updated for added Glade functionality in GTK-server 2.0.10 at March 5, 2006 - PvE.
#
#---------------------------------------------------------------------------------------------
(context 'GTK)
(if (= (last (sys-info)) 6)
(import "gtk-server.dll" "gtk")
(import "libgtk-server.so" "gtk")
)
(define-macro (GTK:GTK)
(set 'str (append (first (args)) " "))
(dolist (x (rest (args)))(set 'str (append str (string (eval x)) " ")))
(get-string (gtk str))
)
#--------------------------------------------------------------------------------------- UTF
(context 'UTF)
# Only replace extended ASCII characters by 2-byte UTF-8 sequence
(define (UTF:UTF str, t x b1 b2)
(set 't 0)
(while (< t (length str))
(begin
(set 'x (nth t str))
(if (> (char x) 127)
(begin
(set 'b1 (+ (/ (& (char x) 192) 64) 192))
(set 'b2 (+ (& (char x) 63) 128))
(set-nth t str (append (char b1)(char b2)))
(inc 't)
)
)
(inc 't)
)
)
str)
#---------------------------------------------------------------------------------------------
(context 'GUI)
(constant 'UserInterface [text]
True
newLISP-GTK 1.0 beta 2
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
False
600
500
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
0
False
False
True
GTK_ORIENTATION_HORIZONTAL
GTK_TOOLBAR_ICONS
True
True
True
Load source
gtk-open
True
True
False
False
True
True
Reload last source
gtk-refresh
True
True
False
False
True
True
Save workspace
gtk-save
True
True
False
False
True
True
True
True
True
False
False
True
Browser / Editor
gtk-edit
True
True
False
False
True
True
Debugger
True
gtk-sort-descending
True
True
False
False
True
True
True
True
True
False
False
True
Copy selection
True
gtk-copy
True
True
False
False
True
True
Cut selection
gtk-cut
True
True
False
False
True
True
Paste selection
True
gtk-paste
True
True
False
False
True
True
True
True
True
False
False
True
Clear console
True
gtk-file
True
True
False
False
True
True
True
True
True
False
False
True
newLISP Reference
True
gtk-help
True
True
False
False
True
True
newLISP GTK intro
True
gtk-dialog-question
True
True
False
False
True
0
False
False
True
True
GTK_POLICY_AUTOMATIC
GTK_POLICY_ALWAYS
GTK_SHADOW_IN
GTK_CORNER_TOP_LEFT
True
True
True
False
True
GTK_JUSTIFY_LEFT
GTK_WRAP_NONE
True
0
0
0
0
0
0
0
True
True
1
True
True
0
False
False
Select Font
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
True
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
5
True
abcdefghijk ABCDEFGHIJK
0
True
True
5
True
False
0
100
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
0
False
False
100
True
True
gtk-ok
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
100
True
True
gtk-apply
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
0
False
False
Select Color
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
True
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
5
True
True
False
0
True
True
True
0
False
False
5
True
False
0
100
True
True
gtk-quit
True
GTK_RELIEF_NORMAL
True
0
False
False
100
True
True
_Background
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
100
True
True
_Foreground
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
0
True
True
Load a newLISP source file
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
True
550
400
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
5
True
False
0
0
True
True
True
0
False
True
5
True
False
0
100
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
0
False
False
100
True
True
gtk-open
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
0
False
True
Save all as ...
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
True
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
5
True
False
0
0
True
True
True
0
False
True
5
True
False
0
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
0
False
False
True
True
gtk-save-as
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
0
False
True
False
newLISP-GTK
Written by Peter van Eerten.
GTK IDE for newLISP
Peter van Eerten
translator-credits
About newLISP-GTK
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER_ON_PARENT
True
404
300
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
True
True
False
0
True
GTK_BUTTONBOX_DEFAULT_STYLE
True
True
True
gtk-close
True
GTK_RELIEF_NORMAL
True
-7
0
False
True
GTK_PACK_END
5
True
True
GTK_POLICY_AUTOMATIC
GTK_POLICY_ALWAYS
GTK_SHADOW_IN
GTK_CORNER_TOP_LEFT
True
True
False
False
True
GTK_JUSTIFY_LEFT
GTK_WRAP_WORD
False
0
0
4
0
0
0
An IDE for newLISP using GTK.
The IDE itself is implemented in 100% newLISP. The user interface was designed with Glade.
--------------------------
Requirements:
- newLISP 8.7.0 or higher
- GTK-server 2.0.10 or higher
- libglade 2.5.0 or higher
--------------------------
To be implemented:
1) Debugger
2) Editor
3) Documentation
--------------------------
Please report bugs to peter@gtk-server.org
0
True
True
Select Color for newLISP syntax
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_CENTER
True
True
False
True
True
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
True
False
0
5
True
True
False
0
True
True
True
0
False
False
5
True
False
0
100
True
True
gtk-quit
True
GTK_RELIEF_NORMAL
True
0
False
False
80
True
True
Statements
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
80
True
True
Strings
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
80
True
True
Parenthesis
True
GTK_RELIEF_NORMAL
True
0
False
False
GTK_PACK_END
0
True
True
[/text]
)
(define (setup)
# Optionally set location of configfile
#(GTK "log cfg=gtk-server.cfg") # Linux
#(GTK "log cfg=d:\\GTK-server\\gtk-server.cfg") # Win32
# Get IDE definition
(GTK "gtk_server_glade_string" UserInterface )
# Main window properties
(set 'MainWindow (GTK "gtk_server_glade_widget MainWindow"))
(set 'TextConsole (GTK "gtk_server_glade_widget TextConsole"))
(GTK "gtk_server_connect" TextConsole "key-press-event TextConsole 1")
(set 'TextBuffer (GTK "gtk_text_view_get_buffer" TextConsole))
# Assign name to textwidget to modify fontstyle later
(GTK "gtk_widget_set_name" TextConsole "TextConsole")
# Initialize mark
(set 'TextMark 0)
# Allocate memory for iters using random widget
(set 'mystartiter (GTK "gtk_frame_new" "NULL"))
(set 'myenditer (GTK "gtk_frame_new" "NULL"))
# Create tag for bold letters
(GTK "gtk_text_buffer_create_tag" TextBuffer "weight weight 900 NULL")
# Menu's
(set 'MenuReopen (GTK "gtk_server_glade_widget MenuReopen"))
(GTK "gtk_server_connect" MenuReopen "activate MenuReopen")
(set 'MenuSettings (GTK "gtk_server_glade_widget MenuSettings"))
(GTK "gtk_server_connect" MenuSettings "activate MenuSettings")
(set 'MenuWrap (GTK "gtk_server_glade_widget MenuWrap"))
(GTK "gtk_server_connect" MenuWrap "activate MenuWrap")
(set 'MenuAlive (GTK "gtk_server_glade_widget MenuAlive"))
(GTK "gtk_server_connect" MenuAlive "activate MenuAlive")
(set 'MenuClear (GTK "gtk_server_glade_widget MenuClear"))
(GTK "gtk_server_connect" MenuClear "button-press-event MenuClear")
(set 'MenuManual (GTK "gtk_server_glade_widget MenuManual"))
(GTK "gtk_server_connect" MenuManual "button-press-event MenuManual")
# Disable the Edit and Debug menu for now
(set 'MenuEdit (GTK "gtk_server_glade_widget MenuEdit"))
(set 'MenuDebug (GTK "gtk_server_glade_widget MenuDebug"))
(GTK "gtk_widget_set_sensitive" MenuEdit 0)
(GTK "gtk_widget_set_sensitive" MenuDebug 0)
# Toolbar
(set 'ToolReopen (GTK "gtk_server_glade_widget ToolReopen"))
(GTK "gtk_server_connect" ToolReopen "clicked ToolReopen")
(set 'ToolClear (GTK "gtk_server_glade_widget ToolClear"))
(GTK "gtk_server_connect" ToolClear "clicked ToolClear")
(set 'ToolCopy (GTK "gtk_server_glade_widget ToolCopy"))
(GTK "gtk_server_connect" ToolCopy "clicked ToolCopy")
(set 'ToolCut (GTK "gtk_server_glade_widget ToolCut"))
(GTK "gtk_server_connect" ToolCut "clicked ToolCut")
(set 'ToolPaste (GTK "gtk_server_glade_widget ToolPaste"))
(GTK "gtk_server_connect" ToolPaste "clicked ToolPaste")
(set 'ToolManual (GTK "gtk_server_glade_widget ToolManual"))
(GTK "gtk_server_connect" ToolManual "clicked ToolManual")
# Get context ID of statusbar
(set 'StatusBar (GTK "gtk_server_glade_widget StatusBar"))
(set 'CID (GTK "gtk_statusbar_get_context_id" StatusBar MainWindow))
(set 'version (GTK "gtk_server_version"))
(if (= (last (sys-info)) 6)
(GTK "gtk_statusbar_push" StatusBar CID (append "\"" version " on Win32\""))
(GTK "gtk_statusbar_push" StatusBar CID (append "\"" version " on " (first (exec "uname -sr")) "\""))
)
# Get Font dialog properties
(set 'FontDialog (GTK "gtk_server_glade_widget FontDialog"))
(set 'FontSelection (GTK "gtk_server_glade_widget FontSelection"))
(set 'FontApply (GTK "gtk_server_glade_widget FontApply"))
(GTK "gtk_server_connect" FontApply "clicked FontApply")
(set 'FontOk (GTK "gtk_server_glade_widget FontOk"))
(GTK "gtk_server_connect" FontOk "clicked FontOk")
# Get Color dialog properties
(set 'ColorSelection (GTK "gtk_server_glade_widget ColorSelection"))
(GTK "gtk_color_selection_set_has_opacity_control" ColorSelection 0)
(set 'ColorBack (GTK "gtk_server_glade_widget ColorBack"))
(GTK "gtk_server_connect" ColorBack "clicked ColorBack")
(set 'ColorFore (GTK "gtk_server_glade_widget ColorFore"))
(GTK "gtk_server_connect" ColorFore "clicked ColorFore")
# Allocate memory with random widget
(set 'color (GTK "gtk_frame_new" "NULL"))
# Get Syntax dialog properties
(set 'SyntaxSelection (GTK "gtk_server_glade_widget SyntaxSelection"))
(GTK "gtk_color_selection_set_has_opacity_control" SyntaxSelection 0)
(set 'SyntaxStatement (GTK "gtk_server_glade_widget SyntaxStatement"))
(GTK "gtk_server_connect" SyntaxStatement "clicked SyntaxStatement")
(set 'SyntaxStrings (GTK "gtk_server_glade_widget SyntaxStrings"))
(GTK "gtk_server_connect" SyntaxStrings "clicked SyntaxStrings")
(set 'SyntaxParenthesis (GTK "gtk_server_glade_widget SyntaxParenthesis"))
(GTK "gtk_server_connect" SyntaxParenthesis "clicked SyntaxParenthesis")
# Get File dialog properties
(set 'FileDialog (GTK "gtk_server_glade_widget FileDialog"))
# Create fileselector with filters
(set 'FileSelector (GTK "gtk_file_chooser_widget_new" 0))
(set 'FileFilter1 (GTK "gtk_file_filter_new"))
(GTK "gtk_file_filter_set_name" FileFilter1 "\"newLISP source files *.lsp\"")
(GTK "gtk_file_filter_add_pattern" FileFilter1 "*.lsp")
(set 'FileFilter2 (GTK "gtk_file_filter_new"))
(GTK "gtk_file_filter_set_name" FileFilter2 "\"all files *.*\"")
(GTK "gtk_file_filter_add_pattern" FileFilter2 "*.*")
(GTK "gtk_file_chooser_add_filter" FileSelector FileFilter1)
(GTK "gtk_file_chooser_add_filter" FileSelector FileFilter2)
(set 'hbox4 (GTK "gtk_server_glade_widget hbox4"))
(GTK "gtk_box_pack_start" hbox4 FileSelector 1 1 1)
(GTK "gtk_widget_show" FileSelector)
(set 'FileOpen (GTK "gtk_server_glade_widget FileOpen"))
(GTK "gtk_server_connect" FileOpen "clicked FileOpen")
# Get Save dialog properties
(set 'SaveDialog (GTK "gtk_server_glade_widget SaveDialog"))
# Create selector with filters
(set 'SaveSelector (GTK "gtk_file_chooser_widget_new" 1))
(GTK "gtk_file_chooser_add_filter" SaveSelector FileFilter1)
(GTK "gtk_file_chooser_add_filter" SaveSelector FileFilter2)
(set 'hbox5 (GTK "gtk_server_glade_widget hbox5"))
(GTK "gtk_box_pack_start" hbox5 SaveSelector 1 1 1)
(GTK "gtk_widget_show" SaveSelector)
(set 'SaveAs (GTK "gtk_server_glade_widget SaveAs"))
(GTK "gtk_server_connect" SaveAs "clicked SaveAs")
# Get Info dialog properties
(set 'InfoDialog (GTK "gtk_server_glade_widget InfoDialog"))
(GTK "gtk_server_connect" InfoDialog "delete-event InfoDialog")
(GTK "gtk_about_dialog_set_version" InfoDialog "\"1.0 beta\"")
# Keep track of settings
(set 'gtksettings (GTK "gtk_settings_get_default"))
# Focus to TextConsole
(GTK "gtk_widget_grab_focus" TextConsole)
)
# See if data is ready on socket and put into console
(define (update_console, buffer)
# Wait for incoming data, this is the central timeout of the mainloop
(if (net-select MAIN:socket "read" MAIN:TcpTimeout)
(begin
(do-until (= (net-peek MAIN:socket) 0)
# Receive data
(if (!= (net-receive MAIN:socket 'buffer MAIN:newLISPbuffersize) nil)
(begin
# Replace existing backslashes and doublequotes
(replace "\\" buffer "\\\\")
(replace "\"" buffer "\\\"")
# Insert entry into TextWidget
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_insert" TextBuffer myenditer (append (char 34)(UTF buffer)(char 34)) -1)
(replace "\"" buffer " ")
(set 'PromptLength (+ (length (last (parse buffer))) 1))
)
(begin
(if (= (GTK "gtk_check_menu_item_get_active" MenuAlive) "1")
(begin
# Connection broke - respawn
(net-close MAIN:socket)
(MAIN:connect)
)
(exit)
)
)
)
)
# Put cursor position at end and mark that position
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_place_cursor" TextBuffer myenditer)
(GTK "gtk_text_buffer_delete_mark" TextBuffer TextMark)
(set 'GUI:TextMark (GTK "gtk_text_buffer_create_mark" TextBuffer "cur" myenditer 1))
(GTK "gtk_text_view_scroll_to_mark " TextConsole TextMark 0 1 0.0 1.0)
)
)
)
# Update statusbar
(define (update_status message)
(GTK "gtk_statusbar_pop" StatusBar CID)
# Replace existing backslashes and doublequotes
(replace "\\" message "\\\\")
(replace "\"" message "\\\"")
(GTK "gtk_statusbar_push" StatusBar CID (append "\"" message "\""))
)
# Apply selected font
(define (apply_font)
(set 'MyFontname (GTK "gtk_font_selection_get_font_name" FontSelection))
# Parse fontname
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { font_name = \\\"" MyFontname "\\\" }\""))
(GTK "gtk_rc_parse_string" "\"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(GTK "gtk_rc_reset_styles" gtksettings)
)
# Clear the textview
(define (clear)
(GTK "gtk_text_buffer_get_bounds" TextBuffer mystartiter myenditer)
(GTK "gtk_text_buffer_delete" TextBuffer mystartiter myenditer)
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_insert" TextBuffer myenditer (append (char 34)(UTF "\n> ")(char 34)) -1)
# Put cursor position at end and mark current position
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_delete_mark" TextBuffer TextMark)
(set 'GUI:TextMark (GTK "gtk_text_buffer_create_mark" TextBuffer "cur" myenditer 1))
(GTK "gtk_text_buffer_place_cursor" TextBuffer myenditer)
(GTK "gtk_widget_grab_focus" TextConsole)
)
# Open file
(define (open_file reopen, filename)
(set 'filename (GTK "gtk_file_chooser_get_filename" FileSelector))
(if (= filename "") (set 'filename "."))
(GTK "gtk_widget_hide" FileDialog)
(if (= reopen 0)
(update_status (append "Loaded file " filename))
(update_status (append "Reloaded file " filename))
)
# For windows replace backslashes
(replace "\\" filename "\\\\")
(net-send MAIN:socket (append "(silent (load \"" filename "\"))\n"))
)
# Save file
(define (save_file, savename)
(set 'savename (GTK "gtk_file_chooser_get_filename" SaveSelector))
(if (!= savename "")
(begin
(GTK "gtk_widget_hide" SaveDialog)
(update_status (append "Saved all as " savename))
# For windows replace backslashes
(replace "\\" savename "\\\\")
(net-send MAIN:socket (append "(silent (save \"" savename "\"))\n"))
)
)
)
# Copy
(define (copy, board)
(GTK "gtk_text_buffer_get_selection_bounds" TextBuffer mystartiter myenditer)
(set 'board (GTK "gtk_clipboard_get 0"))
(GTK "gtk_text_buffer_copy_clipboard" TextBuffer board)
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_place_cursor" TextBuffer myenditer)
(GTK "gtk_text_view_scroll_to_mark " TextConsole TextMark 0 1 0.0 1.0)
)
# Cut
(define (cut, board)
(GTK "gtk_text_buffer_get_selection_bounds" TextBuffer mystartiter myenditer)
(set 'board (GTK "gtk_clipboard_get 0"))
(GTK "gtk_text_buffer_cut_clipboard" TextBuffer board 1)
(GTK "gtk_text_buffer_get_end_iter" TextBuffer myenditer)
(GTK "gtk_text_buffer_place_cursor" TextBuffer myenditer)
(GTK "gtk_text_view_scroll_to_mark " TextConsole TextMark 0 1 0.0 1.0)
)
# Paste
(define (paste, board)
(set 'board (GTK "gtk_clipboard_get 0"))
(GTK "gtk_text_buffer_paste_clipboard" TextBuffer board "NULL" 1)
)
# Set background color
(define (background, r g b)
(GTK "gtk_color_selection_get_current_color" ColorSelection color)
# Get components
(set 'r (string (first (unpack "u" (+ (integer color) 4) ))))
(set 'g (string (first (unpack "u" (+ (integer color) 6) ))))
(set 'b (string (first (unpack "u" (+ (integer color) 8) ))))
# Memorize colors for storage later
(set 'BackColors (list))
(push r BackColors)
(push g BackColors)
(push b BackColors)
# Parse colors for backgroundcolor
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { base[NORMAL] = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string \"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(GTK "gtk_rc_reset_styles" gtksettings)
)
# Set foreground color
(define (foreground, r g b)
(GTK "gtk_color_selection_get_current_color" ColorSelection color)
# Get components
(set 'r (string (first (unpack "u" (+ (integer color) 4) ))))
(set 'g (string (first (unpack "u" (+ (integer color) 6) ))))
(set 'b (string (first (unpack "u" (+ (integer color) 8) ))))
# Memorize colors for storage later
(set 'ForeColors (list))
(push r ForeColors)
(push g ForeColors)
(push b ForeColors)
# Parse colors for foregroundcolor
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { text[NORMAL] = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { GtkWidget::cursor_color = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string \"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(GTK "gtk_rc_reset_styles" gtksettings)
)
# Set linewrap on or off
(define (wrap, tmp)
(set 'tmp (GTK "gtk_check_menu_item_get_active" MenuWrap))
(if (> (integer tmp) 0)
(GTK "gtk_text_view_set_wrap_mode" TextConsole 2)
(GTK "gtk_text_view_set_wrap_mode" TextConsole 0)
)
)
# Set syntax color
(define (syntax, pixel r g b)
(GTK "gtk_color_selection_get_current_color" SyntaxSelection color)
# Get components
(set 'pixel (string (first (unpack "lu" (integer color) ))))
(set 'r (string (first (unpack "u" (+ (integer color) 4) ))))
(set 'g (string (first (unpack "u" (+ (integer color) 6) ))))
(set 'b (string (first (unpack "u" (+ (integer color) 8) ))))
# Memorize colors for storage later
(set 'SyntaxColors (list))
(push pixel SyntaxColors)
(push r SyntaxColors)
(push g SyntaxColors)
(push b SyntaxColors)
# Create random tagname for syntax color
(set 'SyntaxName (append "highlight" (string (date-value)) (string (rand 1000000))))
(GTK "gtk_text_buffer_create_tag" TextBuffer SyntaxName "foreground-gdk" color "NULL")
(ACTION:syntax_highlight)
)
# Set textstring color
(define (text, pixel r g b)
(GTK "gtk_color_selection_get_current_color" SyntaxSelection color)
# Get components
(set 'pixel (string (first (unpack "lu" (integer color) ))))
(set 'r (string (first (unpack "u" (+ (integer color) 4) ))))
(set 'g (string (first (unpack "u" (+ (integer color) 6) ))))
(set 'b (string (first (unpack "u" (+ (integer color) 8) ))))
# Memorize colors for storage later
(set 'TextColors (list))
(push pixel TextColors)
(push r TextColors)
(push g TextColors)
(push b TextColors)
# Create random tagname for syntax color
(set 'TextName (append "text" (string (date-value)) (string (rand 1000000))))
(GTK "gtk_text_buffer_create_tag" TextBuffer TextName "foreground-gdk" color "NULL")
(ACTION:syntax_highlight)
)
# Set parenthesis color
(define (parenthesis, pixel r g b)
(GTK "gtk_color_selection_get_current_color" SyntaxSelection color)
# Get components
(set 'pixel (string (first (unpack "lu" (integer color) ))))
(set 'r (string (first (unpack "u" (+ (integer color) 4) ))))
(set 'g (string (first (unpack "u" (+ (integer color) 6) ))))
(set 'b (string (first (unpack "u" (+ (integer color) 8) ))))
# Memorize colors for storage later
(set 'ParenColors (list))
(push pixel ParenColors)
(push r ParenColors)
(push g ParenColors)
(push b ParenColors)
# Create random tagname for syntax color
(set 'ParenName (append "parenthesis" (string (date-value)) (string (rand 1000000))))
(GTK "gtk_text_buffer_create_tag" TextBuffer ParenName "foreground-gdk" color "NULL")
(ACTION:syntax_highlight)
)
# Save settings
(define (settings, dir file)
(set 'dir (env "HOME"))
(if (= dir nil) (set 'dir "."))
(set 'file (open (append dir "/.newlisp-gtk.cfg") "write"))
(if (= file nil)
(update_status "ERROR: could not save settings!")
(begin
(if (= MyFontname nil) (set 'MyFontname (GTK "gtk_font_selection_get_font_name" FontSelection)))
(write-line (append "Font: " MyFontname) file)
(write-line (append "WrapText: " (GTK "gtk_check_menu_item_get_active" MenuWrap)) file)
(write-line (append "KeepAlive: " (GTK "gtk_check_menu_item_get_active" MenuAlive)) file)
(write-line (append "BackgroundRed: " (string (nth 2 BackColors))) file)
(write-line (append "BackgroundGreen: " (string (nth 1 BackColors))) file)
(write-line (append "BackgroundBlue: " (string (nth 0 BackColors))) file)
(write-line (append "ForegroundRed: " (string (nth 2 ForeColors))) file)
(write-line (append "ForegroundGreen: " (string (nth 1 ForeColors))) file)
(write-line (append "ForegroundBlue: " (string (nth 0 ForeColors))) file)
(write-line (append "SyntaxPixel: " (string (nth 3 SyntaxColors))) file)
(write-line (append "SyntaxRed: " (string (nth 2 SyntaxColors))) file)
(write-line (append "SyntaxGreen: " (string (nth 1 SyntaxColors))) file)
(write-line (append "SyntaxBlue: " (string (nth 0 SyntaxColors))) file)
(write-line (append "TextPixel: " (string (nth 3 TextColors))) file)
(write-line (append "TextRed: " (string (nth 2 TextColors))) file)
(write-line (append "TextGreen: " (string (nth 1 TextColors))) file)
(write-line (append "TextBlue: " (string (nth 0 TextColors))) file)
(write-line (append "ParenthesisgPixel: " (string (nth 3 ParenColors))) file)
(write-line (append "ParenthesisgRed: " (string (nth 2 ParenColors))) file)
(write-line (append "ParenthesisgGreen: " (string (nth 1 ParenColors))) file)
(write-line (append "ParenthesisgBlue: " (string (nth 0 ParenColors))) file)
(close file)
(update_status (append "Saved settings in " dir "/.newlisp-gtk.cfg"))
)
)
)
# Show newLISP manual
(define (manual)
(if (= (last (sys-info)) 6)
(process (append "c:\\progra~1\\intern~1\\iexplore.exe " MAIN:newLISPmanual ))
(if (> (integer (first (exec "ps -ef | grep mozilla | wc -l"))) 4)
(process (append "mozilla -remote \"openurl(" MAIN:newLISPmanual ", new-tab)\" " ))
(process (append "mozilla \"" MAIN:newLISPmanual "\" " ))
)
)
)
# Read settings
(define (read, dir file wrap alive r g b p gdkcolor)
(set 'dir (env "HOME"))
(if (= dir nil) (set 'dir "."))
(set 'file (open (append dir "/.newlisp-gtk.cfg") "read"))
(if (= file nil)
(begin
(set 'ForeColors (list 0 0 0))
(set 'BackColors (list 65535 65535 65535))
(set 'SyntaxColors (list 0 65535 0 0))
(set 'TextColors (list 65535 0 0 0))
(set 'ParenColors (list 0 0 65535 0))
(GTK "gtk_text_buffer_create_tag" TextBuffer "highlight foreground green NULL")
(GTK "gtk_text_buffer_create_tag" TextBuffer "text foreground blue NULL")
(GTK "gtk_text_buffer_create_tag" TextBuffer "parenthesis foreground red NULL")
)
(begin
(set 'MyFontname (trim (last (parse (read-line file) ":"))))
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { font_name = \\\"" MyFontname "\\\" }\""))
(GTK "gtk_rc_parse_string" "\"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(GTK "gtk_font_selection_set_font_name" FontSelection (append "\"" MyFontname "\""))
(set 'wrap (trim (last (parse (read-line file) ":"))))
(GTK "gtk_check_menu_item_set_active" MenuWrap wrap)
(set 'alive (trim (last (parse (read-line file) ":"))))
(GTK "gtk_check_menu_item_set_active" MenuAlive alive)
(set 'r (trim (last (parse (read-line file) ":"))))
(set 'g (trim (last (parse (read-line file) ":"))))
(set 'b (trim (last (parse (read-line file) ":"))))
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { base[NORMAL] = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string \"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(set 'BackColors (list b g r))
(set 'r (trim (last (parse (read-line file) ":"))))
(set 'g (trim (last (parse (read-line file) ":"))))
(set 'b (trim (last (parse (read-line file) ":"))))
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { text[NORMAL] = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string" (append "\"style \\\"mystyle\\\" { GtkWidget::cursor_color = {" r ", " g ", " b "} }\""))
(GTK "gtk_rc_parse_string \"widget \\\"*.*.TextConsole\\\" style \\\"mystyle\\\"\"")
(GTK "gtk_rc_reset_styles" gtksettings)
(set 'ForeColors (list b g r))
(set 'p (int (trim (last (parse (read-line file) ":")))))
(set 'r (int (trim (last (parse (read-line file) ":")))))
(set 'g (int (trim (last (parse (read-line file) ":")))))
(set 'b (int (trim (last (parse (read-line file) ":")))))
(set 'gdkcolor (pack "lu u u u" p r g b))
(GTK "gtk_text_buffer_create_tag" TextBuffer "highlight foreground-gdk" (address gdkcolor) "NULL")
(set 'SyntaxColors (list b g r p))
(set 'p (int (trim (last (parse (read-line file) ":")))))
(set 'r (int (trim (last (parse (read-line file) ":")))))
(set 'g (int (trim (last (parse (read-line file) ":")))))
(set 'b (int (trim (last (parse (read-line file) ":")))))
(set 'gdkcolor (pack "lu u u u" p r g b))
(GTK "gtk_text_buffer_create_tag" TextBuffer "text foreground-gdk" (address gdkcolor) "NULL")
(set 'TextColors (list b g r p))
(set 'p (int (trim (last (parse (read-line file) ":")))))
(set 'r (int (trim (last (parse (read-line file) ":")))))
(set 'g (int (trim (last (parse (read-line file) ":")))))
(set 'b (int (trim (last (parse (read-line file) ":")))))
(set 'gdkcolor (pack "lu u u u" p r g b))
(GTK "gtk_text_buffer_create_tag" TextBuffer "parenthesis foreground-gdk" (address gdkcolor) "NULL")
(set 'ParenColors (list b g r p))
(close file)
)
)
(set 'SyntaxName "highlight")
(set 'TextName "text")
(set 'ParenName "parenthesis")
)
#---------------------------------------------------------------------------------------------
(context 'ACTION)
(set 'ReadLine (list))
(set 'ReadLineIndex -1)
(define (syntax_highlight, buffer x y z ready)
# Preparation for syntax highlighting
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_buffer_remove_all_tags" GUI:TextBuffer GUI:mystartiter GUI:myenditer)
(set 'buffer (GTK "gtk_text_iter_get_text" GUI:mystartiter GUI:myenditer))
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:myenditer GUI:TextMark)
# Replace escaped escape signs
(replace "\\\\" buffer " ")
# Highlight strings
(for (x 0 (- (length buffer) 1))
(if (and (= (nth x buffer) "\"") (!= (nth (- x 1) buffer) "\\") )
(begin
(GTK "gtk_text_iter_set_line_index" GUI:mystartiter (+ x GUI:PromptLength))
(nth-set x buffer " ")
(set 'ready nil)
(while (and (!= (find "\"" buffer) nil) (not ready))
(if (!= (nth (- (find "\"" buffer) 1) buffer) "\\")
(begin
(GTK "gtk_text_iter_set_line_index" GUI:myenditer (+ (find "\"" buffer) GUI:PromptLength 1))
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer GUI:TextName GUI:mystartiter GUI:myenditer)
# Remove string from buffer to prevent syntax highlighting on accidental keywords later
(for (y x (find "\"" buffer)) (nth-set y buffer " " ))
(set 'ready true)
)
(nth-set (find "\"" buffer) buffer " ")
)
)
)
)
)
# Replace left doublequotes
(replace "\"" buffer " ")
# Highlight keywords
(dolist (x (parse buffer))
(if (find (sym x MAIN) MAIN:newLISPsymbols)
(begin
(set 'z (find x buffer))
(if (!= z nil) # this should not be happening, sometimes newLISP returns a '!' here.
(begin
(GTK "gtk_text_iter_set_line_index" GUI:mystartiter (+ z GUI:PromptLength))
(GTK "gtk_text_iter_set_line_index" GUI:myenditer (+ z (length x) GUI:PromptLength))
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer GUI:SyntaxName GUI:mystartiter GUI:myenditer)
# Remove keyword from buffer
(for (y 0 (- (length x) 1))(nth-set (+ z y) buffer " "))
)
)
)
)
)
# Highlight numbers
(for (x 0 (- (length buffer) 1))
(if (and (>= (char (nth x buffer)) 48) (<= (char (nth x buffer)) 57))
(begin
(GTK "gtk_text_iter_set_line_index" GUI:mystartiter (+ x GUI:PromptLength))
(GTK "gtk_text_iter_set_line_index" GUI:myenditer (+ x GUI:PromptLength 1))
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer GUI:TextName GUI:mystartiter GUI:myenditer)
# Remove number from buffer
(nth-set x buffer " ")
)
)
)
# Highlight parenthesis
(set 'x 0)
(set 'y (- (length buffer) 1))
(while (< x (length buffer))
(if (= (nth x buffer) "(")
(begin
(nth-set x buffer " ")
(while (and (!= (nth y buffer) ")") (>= y 0) ) (dec 'y))
(if (= (nth y buffer) ")")
(begin
(nth-set y buffer " ")
(GTK "gtk_text_iter_set_line_index" GUI:mystartiter (+ x GUI:PromptLength))
(GTK "gtk_text_iter_set_line_index" GUI:myenditer (+ x GUI:PromptLength 1))
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer GUI:ParenName GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer "weight" GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_iter_set_line_index" GUI:mystartiter (+ y GUI:PromptLength))
(GTK "gtk_text_iter_set_line_index" GUI:myenditer (+ y GUI:PromptLength 1))
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer GUI:ParenName GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_buffer_apply_tag_by_name" GUI:TextBuffer "weight" GUI:mystartiter GUI:myenditer)
)
)
)
)
(inc 'x)
)
)
(define (processkey, key buffer)
# This is a dangerous hack only working on 32 bit platforms
(set 'key (first (unpack "u" (+ (integer (GTK "gtk_server_callback_value 1")) 20))))
(case key
(65293 #RETURN key
# Get latest mark
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
# Grab text from console
(set 'buffer (GTK "gtk_text_iter_get_text" GUI:mystartiter GUI:myenditer))
# Remove all newlines
(replace "\n" buffer "")
# Repair line, put to screen
(GTK "gtk_text_buffer_delete" GUI:TextBuffer GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(set 'repair (append buffer "\n"))
(replace "\\" repair "\\\\")
(replace "\"" repair "\\\"")
(GTK "gtk_text_buffer_insert" GUI:TextBuffer GUI:mystartiter (append (char 34)(UTF repair)(char 34)) -1)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_buffer_place_cursor" GUI:TextBuffer GUI:myenditer)
# Push to ReadLine buffer
(if (> (length buffer) 0)
(begin
(push buffer ReadLine)
(if (> (length ReadLine) MAIN:ReadLineBufferSize)(set 'ReadLine (chop ReadLine)))
)
)
(set 'ReadLineIndex -1)
# Send command to newLisp
(net-send MAIN:socket (append buffer "\n"))
)
(65362 # Key up
(if (and (<= ReadLineIndex MAIN:ReadLineBufferSize)(< ReadLineIndex (- (length ReadLine) 1)))(inc 'ReadLineIndex))
(set 'buffer (nth ReadLineIndex ReadLine))
(if (= buffer nil) (set 'buffer ""))
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_buffer_delete" GUI:TextBuffer GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
# Replace existing backslashes and doublequotes
(replace "\\" buffer "\\\\")
(replace "\"" buffer "\\\"")
(GTK "gtk_text_buffer_insert" GUI:TextBuffer GUI:mystartiter (append (char 34)(UTF buffer)(char 34)) -1)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_view_scroll_to_mark " GUI:TextConsole GUI:TextMark 0 1 0.0 1.0)
(GTK "gtk_text_buffer_place_cursor" GUI:TextBuffer GUI:myenditer)
)
(65364 # Key down
(if (> ReadLineIndex 0)
(begin
(dec 'ReadLineIndex)
(set 'buffer (nth ReadLineIndex ReadLine)))
(begin
(set 'ReadLineIndex -1)
(set 'buffer ""))
)
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_buffer_delete" GUI:TextBuffer GUI:mystartiter GUI:myenditer)
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
# Replace existing backslashes and doublequotes
(replace "\\" buffer "\\\\")
(replace "\"" buffer "\\\"")
(GTK "gtk_text_buffer_insert" GUI:TextBuffer GUI:mystartiter (append (char 34)(UTF buffer)(char 34)) -1)
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(GTK "gtk_text_view_scroll_to_mark " GUI:TextConsole GUI:TextMark 0 1 0.0 1.0)
(GTK "gtk_text_buffer_place_cursor" GUI:TextBuffer GUI:myenditer)
)
(65360 # key HOME
(GTK "gtk_text_buffer_get_iter_at_mark" GUI:TextBuffer GUI:mystartiter GUI:TextMark)
(GTK "gtk_text_buffer_place_cursor" GUI:TextBuffer GUI:mystartiter)
)
)
(syntax_highlight)
)
#---------------------------------------------------------------------------------------------
(context 'MAIN)
(constant 'newLISPsymbols (symbols))
(constant 'newLISPport 63001)
(constant 'newLISPhost "127.0.0.1")
(constant 'newLISPbuffersize 1024)
(constant 'TcpTimeout 30)
(constant 'ReadLineBufferSize 128)
(constant 'newLISPmanual "www.newlisp.org/downloads/manual_frame.html")
(seed (date-value))
# Execute newLISP
(define (connect)
(if (= (last (sys-info)) 6)
(process (append "newlisp -p " (string newLISPport)) 0 0 0)
(process (append "newlisp -p " (string newLISPport) " > /dev/null 2>&1"))
)
# Connect locally - ripped from TCL version ;-)
(set 'counter 0)
(do-until (or (!= socket nil)(= counter 5))
(set 'socket (net-connect newLISPhost newLISPport))
(inc 'counter)
(sleep 100)
)
# Check if we can connect
(if (= counter 10)
(begin
(println "Cannot start newLISP GTK!")
(exit)))
)
# Spawn newLisp process
(connect)
# Create user interface
(GUI:setup)
# Apply settings
(GUI:read)
(GUI:wrap)
# Get an initial mark
(GTK "gtk_text_buffer_get_end_iter" GUI:TextBuffer GUI:myenditer)
(set 'GUI:TextMark (GTK "gtk_text_buffer_create_mark" GUI:TextBuffer "cur" GUI:myenditer 1))
# Mainloop - EXIT signals have been setup in the Glade XML definition!
(while true
# Check newLisp results, put data in console if available
(GUI:update_console)
# Get event asynchronuously
(set 'event (GTK "gtk_server_callback update"))
(case event
# Look for keys
("TextConsole" (ACTION:processkey))
# Menu actions
("MenuReopen" (GUI:open_file 1))
("MenuClear" (GUI:clear))
("MenuWrap" (GUI:wrap))
("MenuSettings" (GUI:settings))
("MenuManual" (GUI:manual))
# Font dialog actions
("FontApply" (GUI:apply_font))
("FontOk" (GUI:apply_font)(GTK "gtk_widget_hide" GUI:FontDialog))
# Color dialog actions
("ColorBack" (GUI:background))
("ColorFore" (GUI:foreground))
# Syntax dialog actions
("SyntaxStatement" (GUI:syntax))
("SyntaxStrings" (GUI:text))
("SyntaxParenthesis" (GUI:parenthesis))
# File dialog actions
("FileOpen" (GUI:open_file 0))
# Save dialog actions
("SaveAs" (GUI:save_file))
# Toolbar actions
("ToolReopen" (GUI:open_file 1))
("ToolClear" (GUI:clear))
("ToolCopy" (GUI:copy))
("ToolCut" (GUI:cut))
("ToolPaste" (GUI:paste))
("ToolManual" (GUI:manual))
# All HIDE and SHOW events have been setup in the Glade XML definition!
)
)
(exit)