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>.