A Scripting Language for Web, Linux and Windows

A Scripting Language for Web, Linux and Windows

Example: X11 Window

Demonstrates how to create a simple GUI window with libX11 native function calling on X-Server.

<?v1
/* 
  Draw overlayed sinus curves on X11 Window
*/

error_reporting (0);

const 
WINDOW_WIDTH  800;
const 
WINDOW_HEIGHT 600;
const 
WINDOW_TITLE  'V1 Script - Simple X11 Window';

hDLLX11 dl ('libX11'true);
if (!
hDLLX11) {
  
// Search for X11 library
  
libList explode ("\n"system ('/usr/bin/find /usr/lib'.(version(3)=='64' '').' -name "libX11*.so*"'));
  if (!empty (
libList[0])) {
    
hDLLX11 dl (libList[0], true);
    if (
hDLLX11) {
       print (
"Please replace for faster starting: dl ('".libList[0]."', true);");
    }
  }
}

if (!
hDLLX11) {
  print (
"libX11.so was not found on this system.\r\nTry: sudo apt-get install libx11-dev");
  exit (
1);
}

const 
PI  3.14159265359;
const 
PI2 2*PI;

function 
drawWindow () 
{
  global 
hDLLX11screendisplaywindow,  windowWidthwindowHeightcolors;
  
gc call (hDLLX11'XDefaultGC''pi:p'displayscreen);

  
// Sinus frequencies to overlay
  
freqList = [134.5];

  
// Clear window
  
call (hDLLX11'XClearWindow''pp:i'displaywindow);   
  
// call (hDLLX11, 'XSetForeground', 'ppi:i', display, gc, binparse (colors['white'])); 
  // call (hDLLX11, 'XFillRectangle', 'pppiiii:i', display, window, gc, 0, 0, windowWidth, windowHeight);

  // Draw legend
  
call (hDLLX11'XSetForeground''ppi:i'displaygcbinparse (colors['red']));  
  
call (hDLLX11'XFillRectangle''pppiiii:i'displaywindowgc20201010);   

  
msg '';
  foreach (
freqList as freq) {
    if (!empty (
msg))
      
msg.=' + ';
    if (
freq!=1)
      
msg.= 'sin('.freq.'x)';
    else
      
msg.='sin(x)';    
  }
  if (
count (freqList))
    
msg '('.msg.') / '.count (freqList);

  
call (hDLLX11'XSetForeground''ppi:i'displaygcbinparse (colors['blue']));
  
call (hDLLX11'XDrawString''pppiisi:i'displaywindowgc4030msgstrlen (msg));

  
// Draw axes 
  
call (hDLLX11'XSetForeground''ppi:i'displaygcbinparse (colors['black']));  

  
offs 50;  
  
offs;
  
offs;  

  
// Y axis
  
call (hDLLX11'XDrawLine''pppiiii:i'displaywindowgcxyxwindowHeight-offs); 

  
windowHalf = (windowHeight-offs*2)/2;
  for (
y2=-1;y2<=1;y2+=0.25) {
    
msg y2;
    
= (windowHeight/2)-y2 windowHalf;
    
call (hDLLX11'XDrawLine''pppiiii:i'displaywindowgcx-5yx+5y);
    
call (hDLLX11'XDrawString''pppiisi:i'displaywindowgcx-40ymsgstrlen (msg));
  }

  
// X axis
  
offs;
  
= (windowHeight/2);
  
call (hDLLX11'XDrawLine''pppiiii:i'displaywindowgcxywindowWidth-offsy); 

  for (
x2=0.25;x2<=1;x2+=0.25
  {    
    
msg x2;
    if (
x2==0.25)
      
msg 'pi/2';
    else
    if (
x2==0.5)
      
msg 'pi';
    else
    if (
x2==0.75)
      
msg '3pi/2';
    else
    if (
x2==1)
      
msg '2pi';

    
offs + (windowWidth- (offs*2)) * x2;
    
call (hDLLX11'XDrawLine''pppiiii:i'displaywindowgcxy-5xy+5);
    
call (hDLLX11'XDrawString''pppiisi:i'displaywindowgcxy+20msgstrlen (msg));
  }

  
// Plot overlayed frequencies
  
call (hDLLX11'XSetForeground''ppi:i'displaygcbinparse (colors['red']));  

  
Fs = (windowWidth-offs*2)/4;
  
Fs;
  
Fs;
  
0;
  
offs;
  
xOld yOld 0;

  for (
i=0;i<=L;i++) {
    
0;
    foreach (
freqList as freq)
      
v+=sin(PI2*freq*t);
    
v/=count(freqList);

    
= (windowHeight/2) -  * ((windowHeight-offs*2)/2);
    if (
i>0)
      
call (hDLLX11'XDrawLine''pppiiii:i'displaywindowgcxOldyOldxy);
    
xOld x;
    
yOld y;            
    
t+=T;
    
x+=4;
  }
  
call (hDLLX11'XFlush''p:i'display);

}

// Open default display
display call (hDLLX11'XOpenDisplay''p:p'null);
if (!
display) {
  print (
'Cannot open default display.');
}

screen call (hDLLX11'XDefaultScreen'"p:i"display);
displayWidth call (hDLLX11'XDisplayWidth''pi:i'displayscreen);
displayHeight call (hDLLX11'XDisplayHeight''pi:i'displayscreen);
rootWindow call (hDLLX11'XDefaultRootWindow''pi:p'displayscreen);
blackPixel call (hDLLX11'XBlackPixel''pi:p'displayscreen);
whitePixel call (hDLLX11'XWhitePixel''pi:p'displayscreen);

// Create simple window
window call (hDLLX11'XCreateSimpleWindow''ppiiiiiii:p'
  
display
  
rootWindow
  (
displayWidth-WINDOW_WIDTH)/2
  (
displayHeight-WINDOW_HEIGHT)/2
  
WINDOW_WIDTH
  
WINDOW_HEIGHT
  
1
  
blackPixel
  
whitePixel);

// Set window title
call (hDLLX11'XStoreName''pps:i'displaywindowWINDOW_TITLE);

// Set window position and center to display
// This is old stuff, you can use XResizeWindow and XMoveWindow after XMapWindow (see below)
size 
  
binformat (1<<2|1<<3).
  
binformat ((displayWidth-WINDOW_WIDTH)/2). // x
  
binformat ((displayHeight-WINDOW_HEIGHT)/2). // y
  
binformat (WINDOW_WIDTH). // width
  
binformat (WINDOW_HEIGHT); // height
call (hDLLX11'XSetNormalHints''ppr:i'displaywindowsize);

// Select kind of events we are interested in
call (hDLLX11'XSelectInput''ppi:i'displaywindow1<<15|1|1<<17); // 1<<15 = ExposureMask | 1 = KeyPressMask | 1<<17 = StructureNotifyMask
wm_delete_window call (hDLLX11'XInternAtom''psi:p'display'WM_DELETE_WINDOW'false);
wm_delete_window binformat (wm_delete_window);
call (hDLLX11'XSetWMProtocols''ppri:i'displaywindowwm_delete_window1);

// Map (show) the window 
call (hDLLX11'XMapWindow''pp:i'displaywindow);

// Center the window
// call (hDLLX11, 'XResizeWindow', 'ppii:i', display, window, WINDOW_WIDTH, WINDOW_HEIGHT);
// call (hDLLX11, 'XMoveResizeWindow', 'ppiiii:i', display, window, (displayWidth-WINDOW_WIDTH)/2, (displayHeight-WINDOW_HEIGHT)/2, WINDOW_WIDTH, WINDOW_HEIGHT);
// call (hDLLX11, 'XMoveWindow', 'ppii:i', display, window, (displayWidth-WINDOW_WIDTH)/2, (displayHeight-WINDOW_HEIGHT)/2);

// Create colors
colormap call (hDLLX11'XDefaultColormap''pp:i',displayscreen);
colors = array ();
colorNames = array ('red''green''blue''brown''black''yellow''white');
foreach (
colorNames as colorName) {
  
colors[colorName] = '';
  
ret resize (colors[colorName], 16); // 16 bytes is enough buffer size for XColor struct
  
call (hDLLX11'XAllocNamedColor''ppsrr:i'displaycolormapcolorNamecolors[colorName], colors[colorName]);
}

// Event loop
event null;
resize (event256); // 256 bytes is enough buffer size for XEvent struct

fClose false;
while (!
fClose)
{
  
call (hDLLX11'XNextEvent''pr:i'displayevent);  

  
msgId binparse (event,3);
  switch (
msgId
  {
     case 
12:  // 12 = Expose
      // Draw or redraw the window
      
drawWindow ();
      break;

    case 
33// 33 = ClientMessage  
      // Window messages
      
if (binparse (event,3,_ALIGN==28 56)==binparse (wm_delete_window)) {
        
fClose true;
      }
      break;

    case 
22// 22 = ConfigureNotify    
      // Get window size
      
windowWidth binparse (event,3,_ALIGN==32 56); 
      
windowHeight binparse (event,3,_ALIGN==36 60);
      break;

    case 
2// 2 = KeyPress
      
break;
  }
}

// Close connection to server
call (hDLLX11'XCloseDisplay''p:i'display);

?>

back to Home