The way I do it is that I first set fov_x to the cvar value. Then I calculate a new fov_y using that value, but as if the screen were a fixed-size 4:3 resolution (I actually subtract 48 for the default sb_lines from height here), although you could set this up to mimic DOS Quake's default 320x200 if you wanted. Finally I feed the actual screen resolution (again subtracting 48 for the default sb_lines) and this new fov_y into a calculation of the final real fov_x. These values of fov_x and fov_y are then used to build the projection matrix directly ( is helpful, although it needs some tweaking for OpenGL) rather than using any helper functions like glFrustum or gluPerspective (what's neat about this is that you can then twiddle with elements in the matrix to produce a good-looking underwater warp effect for free).
Much of it is based on a GameDev post at:
http://www.gamedev.net/topic/431111-per ... -vertical/ and it also gives results consistent with an online FOV calculator at
http://www.emsai.net/projects/widescreen/fovcalc/