<br><br><div><span class="gmail_quote">2007/8/29, Tomas Hajny <<a href="mailto:XHajT03@mbox.vol.cz">XHajT03@mbox.vol.cz</a>>:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I think that I know the way to<br>> not<br>> implement sdlcrt and use the current crt unit.<br>> But it needs thread and pipe, I never used them, but it won't be<br>> complicated.<br><br>I guess that it might be useful to discuss your idea regarding cooperation
<br>with Crt unit little bit more here (at least I'm interested what your<br>plans are).</blockquote><div><br><br>The problem with input is caused  by SDL thread. And the same problem we may find in C programmes, see C example (I took it from SDL tutorial, it's huge because they decide to show some sdlutils things):
<br><br>#include <stdio.h><br>#include <stdlib.h> <br>#include "SDL.h" <br><br><br>void Slock(SDL_Surface *screen);<br>void Sulock(SDL_Surface *screen);<br>void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B);
<br>void DrawScene(SDL_Surface *screen);<br><br>/* ------------------------------------------- */<br>int main(int argc, char *argv[]){ <br> <br> if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ){ <br>   printf("Unable to init SDL: %s\n", SDL_GetError()); 
<br>   exit(1); <br> } <br> <br> atexit(SDL_Quit); <br><br> SDL_WM_SetCaption("SDL Gfx Example #1","ex1");<br> SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"), NULL);<br> <br> SDL_Surface *screen; <br>
 screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF); <br> if ( screen == NULL ){ <br>   printf("Unable to set 640x480 video: %s\n", SDL_GetError()); <br>   exit(1); <br> } <br> <br> int done=0; <br>
 /*while(done == 0){ <br>   <br>   SDL_Event event; <br>   <br>   while ( SDL_PollEvent(&event) ){ <br>     if ( event.type == SDL_QUIT ){ <br>      done = 1; <br>     } <br>     if ( event.type == SDL_KEYDOWN ){<br>       if ( 
event.key.keysym.sym == SDLK_ESCAPE ){ <br>         done = 1; <br>       } <br>     } <br>   } <br>   <br>   DrawScene(screen);<br> } */<br>// New code to show input problems<br>DrawScene(screen);<br><br>printf("Enter any number to finish the programme");
<br>scanf("%d",&done);<br><br>}<br><br><br>/* ------------------------------------------------------ */<br>void Slock(SDL_Surface *screen){ <br><br> if ( SDL_MUSTLOCK(screen) ){ <br>   if ( SDL_LockSurface(screen) < 0 ){ 
<br>     return; <br>   } <br> } <br><br>} <br><br>/* ------------------------------------------------------ */<br>void Sulock(SDL_Surface *screen){<br><br> if ( SDL_MUSTLOCK(screen) ){ <br>   SDL_UnlockSurface(screen); <br>
 } <br><br>} <br><br>/* ------------------------------------------------------ */<br>void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B){ <br><br> Uint32 color = SDL_MapRGB(screen->format, R, G, B); 
<br> switch (screen->format->BytesPerPixel){ <br>   case 1:  // Assuming 8-bpp <br>   { <br>     Uint8 *bufp; <br>     bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; *bufp = color; <br>   } break; <br>   case 2: // Probably 15-bpp or 16-bpp 
<br>   { <br>     Uint16 *bufp; <br>     bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x; *bufp = color; <br>   } break; <br>   case 3: // Slow 24-bpp mode, usually not used <br>   { <br>     Uint8 *bufp; <br>
     bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3; <br>     if(SDL_BYTEORDER == SDL_LIL_ENDIAN){ <br>       bufp[0] = color; <br>       bufp[1] = color >> 8; <br>       bufp[2] = color >> 16; 
<br>     }else{ <br>       bufp[2] = color; <br>       bufp[1] = color >> 8; <br>       bufp[0] = color >> 16; <br>     } <br>   } break; <br>   case 4: // Probably 32-bpp <br>   { <br>     Uint32 *bufp; <br>     bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x; 
<br>     *bufp = color; <br>   } break; <br> } <br><br>} <br><br>/* ------------------------------------------------------ */<br>void DrawScene(SDL_Surface *screen){ <br><br> Slock(screen);<br> <br> for(int x=0;x<640;x++){ 
<br>   for(int y=0;y<480;y++){ <br>     DrawPixel(screen, x,y,y/2,y/2,x/3); <br>   } <br> } <br> Sulock(screen); <br> SDL_Flip(screen);<br>}<br><br>/* ------------------------------------------- */<br><br></div><br></div>
The same as in the sdlgraph (or fpc programmes with JEDI-SDL and readln/crt routines).<br>SDL creates it's own thread. I don't know how (maybe forks), but it's details.<br>So, I decide that we need to catch input in the separate thread with SDL routines, like
<br><br>while(done == 0){ <br>
   <br>
   SDL_Event event; <br>
   <br>
   while ( SDL_PollEvent(&event) ){ <br>
     if ( event.type == SDL_QUIT ){ <br>
      done = 1; <br>
     } <br>
     if ( event.type == SDL_KEYDOWN ){<br>
       if ( event.key.keysym.sym == SDLK_ESCAPE ){ <br>
         done = 1; <br>
       } <br>
     } <br>
   } <br><br clear="all">And then put (pipe) it to the standart input (to the fpc input). We may create this thread in the initMode routine and kill in the closeGraph.<br>All code may be written in Pascal, it's just an example.
<br>My friends helped me with this idea and also advised to use<br><span style="cursor: pointer; color: blue;" onclick="window.open('http://wiki.vingrad.ru/index.php/CPP:'+this.innerHTML.replace(/^ *| *$/g,'').replace(/^\s*|\s*$/g,''))">
int </span>mkfifo(<span style="cursor: pointer; color: blue;" onclick="window.open('http://wiki.vingrad.ru/index.php/CPP:'+this.innerHTML.replace(/^ *| *$/g,'').replace(/^\s*|\s*$/g,''))">const </span>
<span style="cursor: pointer; color: blue;" onclick="window.open('http://wiki.vingrad.ru/index.php/CPP:'+this.innerHTML.replace(/^ *| *$/g,'').replace(/^\s*|\s*$/g,''))">char </span>* pathname, mode_t mode);
<br>or its pascal prototype.<br>-- <br>E.I.