Man Linux: Main Page and Category List

NAME

       vga_runinbackground  -  enable running of the program while there is no
       VGA access

SYNOPSIS

       #include <vga.h>

       void vga_runinbackground(int stat);

DESCRIPTION

       Enable/disable background running of a graphics program.

       stat = 1
              enables

       stat = 0
              disables

       Normally, the program is suspended while not  in  the  current  virtual
       console.  A program can only safely run in the background if it doesn’t
       do any video access during this time.

       As  of  version  1.2.11  this  was  changed  by  Pekka   T.   Alaruikka
       <alaruik@cc.hut.fi>  &  Michael  Friman <no email> The support for this
       must be enabled in Makefile.cfg of svgalib (which it  is  by  default).
       Several ways to support this may exist internally.  As of now, only one
       using  proc-fs  works.   Using  vga_runinbackground(VGA_GOTOBACK,  void
       (*goto)())      and      vga_runinbackground(VGA_COMEFROMBACK,     void
       (*comefrom)()) with function pointers to functions void goto(void)  and
       void  comefrom(void)  you  can  setup  function  to be called when your
       program goes to background mode and when it comes back  to  foreground.
       These can be changed at any time, and passing NULL as function disables
       the feature.

       Both these new features require a vga_runinbackground_version(3)  of  1
       or  higher.  You  should  check and not call it when the svgalib in use
       returns 0.  Also, when writing applications, check with

       #ifdef VGA_GOTOBACK
           /* code using vga_runinbackground(VGA_GOTOBACK, goto) */
       #else
           /* code using no goto or comefrom function */
       #endif

       if you are compiling with an svgalib that supports  this  feature,  and
       try to rearrange your source to work without it when an svgalib version
       prior to 1.2.11 is used.

       The function should be called right after vga_init(3).  The  bg_test(6)
       demos shows the principle operation.

       Please  note  that  background  capabilities  are in VERY early stages.
       Please do not expect that EVERYTHING works flawlessly  when  background
       abilities are enabled in your program.

EXAMPLE

       vga_init();
       vga_setmode(G320x200x256);
       if (vga_runinbackground_version() == 1)
            vga_runinbackground(1);

NOTES

       Before  a program is left background capable, it should be tested well.
       Most programs will work just well.

       When the program is in  background,  it  can  read  IO-devices  (except
       keyboard).   This  can cause harm, if the programmer does not take this
       int account. I.e. in games using a joystick  or/and  mouse  device  the
       game  continues  reading  joystick  or/and  mouse  as  it  would  be on
       foreground.

       The mouse can be made working correctly also in  background,  but  this
       means that svgalib must be configured to use gpm mouse driver.

       More  information about gpm-linux can be founded from latest gpm packet
       (by Alessandro Rubini).

       The  goto  and  comefrom  routines  provide  a  way  to  overcome  this
       restriction.

       There  are  so  far  two  different methods for background running. The
       first method  use  mmap  function  with  FIXED  option,  which  is  not
       recommended  by  mmap’s man page.  It has some probability to fail. But
       it allows programs to think that graphics memory is always present.

       The second method is just let the functions to write directly  graphics
       memory’s  save-buffer.  This  means that the memory area where graphics
       information is changes for the program. The program  must  always  know
       where  to  write.  This  type of action needs much more work and leaves
       probably always room for race conditions.

       Hopefully the first method proves to be good enough and  second  method
       can be left away.

       Neither  method  allows  the  use  of  the graphics card’s registers in
       background.  When registers are used, vc switching is disabled, but the
       request are queued.  Vc switching is done as soon as possible.

       Generally,  accelerated  functions will probably cause problems, except
       when they are implemented carefully to check for  availability  of  the
       cards registers.

       User programs should generally not use the graphics registers directly.
       But if program needs to use the registers, it has to check if it is  in
       background  or  not.  In  the  background  state  it  can  not  use the
       registers. For testing  the  vga_oktowrite(3)  function  can  be  used.
       During  register  access the virtual console must be locked. A possible
       code fragment might look like:

       vga_lockvc();
       if (vga_oktowrite()) {
          /* Register operations. */
       } else {
          /* Registers can not be used. Alternative action. */
       }
       vga_unlockvc();

ADVANCED NOTES

   Installation
       Background capability is enabled in svgalib by setting BACKGROUND=y and
       disabled  by  commenting #BACKGROUND=y in Makefile.cfg before compiling
       svgalib. Background capable svgalib is more stable with  all  programs.
       Programs  do  not  have  to use background abilities even when they are
       available. As of this writing, all  precompiled  svgalib  binaries  are
       background  capable  by  default.   NOTICE: proc-fs must be mounted for
       background capability.

   Status of the background feature
       Background capability in svgalib is in an early stagei of  development.
       There  has  been  done  lot of work for it, but probably not everything
       will work perfectly. This  applies  only  to  programs  which  actually
       enabled background running with vga_runinbackground(3).

       The      vga_drawline(3),      vga_drawpixel(3),     vga_getclolors(3),
       vga_getpixel(3), vga_screenoff(3), vga_screenon(3), vga_setegacolor(3),
       vga_setrgbcolor(3),  vga_setcolor(3),  vga_setpage(3)  and vga_clear(3)
       functions appear to work and calling vga_setmode(3)  is  safe  too  but
       cannot  change  modes  while  in  background. The remaining svgalib and
       vgagl function should work too but are not well tested.

       Calling accelerated functions will most probably cause harm though this
       is worked on.

       Please report problems to Pekka (see AUTHOR section).

   Programming within svgalib
       When  coding  within  svgalib,  there  are same restrictions as in user
       programs.  SVGA registers can not be  used  while  in  background.  The
       svgalibrary  has  internal  functions for locking and unlocking virtual
       console       switching       __svgalib_dont_switch_vt_yet()        and
       __svgalib_is_vt_switching_needed().   These  functions are not meant to
       be called from  user  program.   vga_unlockvc(3)  can  not  release  vc
       switching if internal svgalib locking is used. This is for safety.  The
       procedure for registers are similar to the procedure for user programs:

       void vga_super_new_function(void) {
           __svgalib_dont_switch_vt_yet();
           if (vga_oktowrite()) {
               /* Register operations. */
           } else {
               /* Registers can not be used. Alternative action. */
           }
           __svgalib_is_vt_switching_needed();
       }

SEE ALSO

       svgalib(7),   vgagl(7),   libvga.config(5),  bg_test(6),  vga_accel(3),
       vga_bitblt(3),  vga_blitwait(3),  vga_fillblt(3),  vga_hlinelistblt(3),
       vga_imageblt(3),    vga_init(3),    vga_lockvc(3),    vga_oktowrite(3),
       vga_runinbackground_version(3), vga_safety_fork(3),  vga_setchipset(3),
       vga_setpage(3),         vga_setreadpage(3),        vga_setwritepage(3),
       vga_unlockvc(3)

AUTHOR

       This manual page was edited  by  Michael  Weller  <eowmob@exp-math.uni-
       essen.de>.  The  function  was  implemented  and documented by Pekka T.
       Alaruikka <alaruik@cc.hut.fi> & Michael Friman <no email>.