#!/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 True True _File True True gtk-open True True gtk-refresh True True gtk-save-as True True True gtk-quit True True _Edit True True _Clear True True _Debug True True _Options True True gtk-select-font True True gtk-select-color True True _Syntax True True gtk-bold 1 0.5 0.5 0 0 True Wrap text True False True Keep IDE alive True False True True gtk-save True True _Help True True _Manual & Reference True True _newLISP-GTK True True True In_fo True 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)