#!/usr/bin/newlisp # # MUI chat program - in progress. # # Scarce docs are here: http://www.opengl.org/resources/code/samples/mjktips/mui/mui.html # # This is ugly code. But it shows some elementary principles and limitations of MUI. # Oct 24, 2005 - PvE. # Adjusted for newLisp 8.9.0 at september 28, 2006. #------------------------------------------------------------------------------------------ (load "freeglut.lsp") (constant 'MAX_TXT 10) (constant 'MAX_LEN 64) (constant 'MAX_LINES 25) (constant 'SHOW_LINES 18) (constant 'EMPTY (dup " " MAX_LEN)) # Size of window (constant 'xsize 530) (constant 'ysize 460) # Put grabbed text into textlist (define (grab, alias txt) # Scroll the data in memory (cpymem REF:txt2 REF:txt1 MAX_LEN) (cpymem REF:txt3 REF:txt2 MAX_LEN) (cpymem REF:txt4 REF:txt3 MAX_LEN) (cpymem REF:txt5 REF:txt4 MAX_LEN) (cpymem REF:txt6 REF:txt5 MAX_LEN) (cpymem REF:txt7 REF:txt6 MAX_LEN) (cpymem REF:txt8 REF:txt7 MAX_LEN) (cpymem REF:txt9 REF:txt8 MAX_LEN) (cpymem REF:txt10 REF:txt9 MAX_LEN) (cpymem REF:txt11 REF:txt10 MAX_LEN) (cpymem REF:txt12 REF:txt11 MAX_LEN) (cpymem REF:txt13 REF:txt12 MAX_LEN) (cpymem REF:txt14 REF:txt13 MAX_LEN) (cpymem REF:txt15 REF:txt14 MAX_LEN) (cpymem REF:txt16 REF:txt15 MAX_LEN) (cpymem REF:txt17 REF:txt16 MAX_LEN) (cpymem REF:txt18 REF:txt17 MAX_LEN) (cpymem REF:txt19 REF:txt18 MAX_LEN) (cpymem REF:txt20 REF:txt19 MAX_LEN) (cpymem REF:txt21 REF:txt20 MAX_LEN) (cpymem REF:txt22 REF:txt21 MAX_LEN) (cpymem REF:txt23 REF:txt22 MAX_LEN) (cpymem REF:txt24 REF:txt23 MAX_LEN) (cpymem REF:txt25 REF:txt24 MAX_LEN) (cpymem EMPTY REF:txt25 MAX_LEN) # Get alias & chat and put into textlist (set 'alias (get-string (GLUT:muiGetTBString cfg2))) (cpymem alias REF:txt25 (length alias)) # Insert separation (set 'txt "-> ") (cpymem txt (+ (address REF:txt25)(length alias)) (length txt)) # Insert the actual chat (set 'txt (get-string (GLUT:muiGetTBString textbox))) (if (<= (length txt) (- MAX_LEN (+ (length alias) 3) )) (cpymem txt (+ (address REF:txt25)(+ (length alias) 3)) (length txt)) (cpymem txt (+ (address REF:txt25)(+ (length alias) 3)) (- MAX_LEN (+ (length alias) 3)) ) ) # Finalize and redisplay GUI (GLUT:muiClearTBString textbox) (GLUT:glutPostRedisplay) ) # Scroll text when scrolbar is moved (define (scroll obj value, sliderval) # Only 7 lines can be scrolled; 7 is result of (- MAX_LINES SHOW_LINES) (set 'sliderval (int (mul (- MAX_LINES SHOW_LINES) (first (unpack "f" (pack "ld" (GLUT:muiGetVSVal obj))))))) # Scrolling the other way around (- 7 nr) (GLUT:muiSetTLTopInt mylist (- (- MAX_LINES SHOW_LINES) sliderval)) (GLUT:glutPostRedisplay) ) # Exit program when exit button pressed (define (myexit) (exit) ) (define (myconnect) (println "Connect not implemented yet.") ) # GUI definition starts here (define (gui argc argv) (GLUT:glutInitWindowSize xsize ysize) (GLUT:glutInit (address argc) (address argv)) (GLUT:glutInitDisplayMode (| GLUT:GLUT_RGB GLUT:GLUT_DOUBLE)) (GLUT:glutCreateWindow "MUI OpenGL chat with newLisp") (GLUT:muiNewUIList 1) (set 'connectbutton (GLUT:muiNewButton (- xsize 110) (- xsize 10) (- ysize 40) (- ysize 10))) (GLUT:muiLoadButton connectbutton "Connect here") (GLUT:muiSetCallback connectbutton 'myconnect) (set 'exitbutton (GLUT:muiNewButton (- xsize 110) (- xsize 10) (- ysize 100) (- ysize 70))) (GLUT:muiLoadButton exitbutton "Exit here") (GLUT:muiSetCallback exitbutton 'myexit) (GLUT:muiNewBoldLabel 10 (- ysize 30) "IP Address:") (set 'cfg1 (GLUT:muiNewTextbox 100 250 (- ysize 40))) (GLUT:muiSetTBString cfg1 "127.0.0.1") (GLUT:muiNewBoldLabel 10 (- ysize 60) "Alias:") (set 'cfg2 (GLUT:muiNewTextbox 100 250 (- ysize 70))) (GLUT:muiSetTBString cfg2 "newLisp") (GLUT:muiNewBoldLabel 10 (- ysize 90) "Encryption:") (set 'cfg3 (GLUT:muiNewTextbox 100 250 (- ysize 100))) (GLUT:muiSetTBString cfg3 "a1b2C3") # Entry for chat (set 'textbox (GLUT:muiNewTextbox 10 (- xsize 10) 10)) (GLUT:muiSetCallback textbox 'grab) # Check buttons (set 'check1 (GLUT:muiNewTinyRadioButton 275 (- ysize 65))) (GLUT:muiNewLabel 300 (- ysize 60) "Use sound") (set 'check2 (GLUT:muiNewTinyRadioButton 275 (- ysize 95))) (GLUT:muiNewLabel 300 (- ysize 90) "Use time") # Setup lines for texfield (set 'REF:txt1 (dup " " MAX_LEN)) (set 'REF:txt2 (dup " " MAX_LEN)) (set 'REF:txt3 (dup " " MAX_LEN)) (set 'REF:txt4 (dup " " MAX_LEN)) (set 'REF:txt5 (dup " " MAX_LEN)) (set 'REF:txt6 (dup " " MAX_LEN)) (set 'REF:txt7 (dup " " MAX_LEN)) (set 'REF:txt8 (dup " " MAX_LEN)) (set 'REF:txt9 (dup " " MAX_LEN)) (set 'REF:txt10 (dup " " MAX_LEN)) (set 'REF:txt11 (dup " " MAX_LEN)) (set 'REF:txt12 (dup " " MAX_LEN)) (set 'REF:txt13 (dup " " MAX_LEN)) (set 'REF:txt14 (dup " " MAX_LEN)) (set 'REF:txt15 (dup " " MAX_LEN)) (set 'REF:txt16 (dup " " MAX_LEN)) (set 'REF:txt17 (dup " " MAX_LEN)) (set 'REF:txt18 (dup " " MAX_LEN)) (set 'REF:txt19 (dup " " MAX_LEN)) (set 'REF:txt20 (dup " " MAX_LEN)) (set 'REF:txt21 (dup " " MAX_LEN)) (set 'REF:txt22 (dup " " MAX_LEN)) (set 'REF:txt23 (dup " " MAX_LEN)) (set 'REF:txt24 (dup " " MAX_LEN)) (set 'REF:txt25 (dup " " MAX_LEN)) (set 'pointer (pack "ldldldldldldldldldldldldldldldldldldldldldldldldld" (address REF:txt1)(address REF:txt2)(address REF:txt3)(address REF:txt4)(address REF:txt5) (address REF:txt6)(address REF:txt7)(address REF:txt8)(address REF:txt9)(address REF:txt10) (address REF:txt11)(address REF:txt12)(address REF:txt13)(address REF:txt14)(address REF:txt15) (address REF:txt16)(address REF:txt17)(address REF:txt18)(address REF:txt19)(address REF:txt20) (address REF:txt21)(address REF:txt22)(address REF:txt23)(address REF:txt24)(address REF:txt25) )) # Create textfield (set 'mylist (GLUT:muiNewTextList 10 40 (- xsize 35) SHOW_LINES)) (GLUT:muiSetTLStrings mylist (address pointer)) (GLUT:muiSetTLTopInt mylist 7) # Create slider (set 'xmin " ") (set 'ymin " ") (set 'xmax " ") (set 'ymax " ") (GLUT:muiGetObjectSize mylist (address xmin) (address ymin) (address xmax) (address ymax)) (set 'vs (GLUT:muiNewVSlider (get-int xmax) (+ (get-int ymin) 2) (get-int ymax) 0 20)) (GLUT:muiSetVSValue vs (flt 0.0)) (GLUT:muiSetCallback vs 'scroll) # Initiate MUI (GLUT:muiInit) (GLUT:glutMainLoop) ) # This is the main routine (gui 0 0) (exit)