Drop unused glut subdirectories
This commit is contained in:
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#include <dpmi.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h> /* for mode definitions */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "pc_hw.h"
|
||||
|
||||
|
||||
/*
|
||||
* atexit
|
||||
*/
|
||||
#define MAX_ATEXIT 32
|
||||
|
||||
static volatile int atexitcnt;
|
||||
static VFUNC atexittbl[MAX_ATEXIT];
|
||||
|
||||
|
||||
static void __attribute__((destructor))
|
||||
doexit (void)
|
||||
{
|
||||
while (atexitcnt) atexittbl[--atexitcnt]();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_clexit (VFUNC f)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < atexitcnt; i++) {
|
||||
if (atexittbl[i] == f) {
|
||||
for (atexitcnt--; i < atexitcnt; i++) atexittbl[i] = atexittbl[i+1];
|
||||
atexittbl[i] = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_atexit (VFUNC f)
|
||||
{
|
||||
pc_clexit(f);
|
||||
if (atexitcnt < MAX_ATEXIT) {
|
||||
atexittbl[atexitcnt++] = f;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* locked memory allocation
|
||||
*/
|
||||
void *
|
||||
pc_malloc (size_t size)
|
||||
{
|
||||
void *p = malloc(size);
|
||||
|
||||
if (p) {
|
||||
if (_go32_dpmi_lock_data(p, size)) {
|
||||
free(p);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* standard redirection
|
||||
*/
|
||||
static char outname[L_tmpnam];
|
||||
static int h_out, h_outbak;
|
||||
static char errname[L_tmpnam];
|
||||
static int h_err, h_errbak;
|
||||
|
||||
|
||||
int
|
||||
pc_open_stdout (void)
|
||||
{
|
||||
tmpnam(outname);
|
||||
|
||||
if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
|
||||
h_outbak = dup(STDOUT_FILENO);
|
||||
fflush(stdout);
|
||||
dup2(h_out, STDOUT_FILENO);
|
||||
}
|
||||
|
||||
return h_out;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_close_stdout (void)
|
||||
{
|
||||
FILE *f;
|
||||
char *line = alloca(512);
|
||||
|
||||
if (h_out > 0) {
|
||||
dup2(h_outbak, STDOUT_FILENO);
|
||||
close(h_out);
|
||||
close(h_outbak);
|
||||
|
||||
f = fopen(outname, "rt");
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stdout);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
remove(outname);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_open_stderr (void)
|
||||
{
|
||||
tmpnam(errname);
|
||||
|
||||
if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
|
||||
h_errbak = dup(STDERR_FILENO);
|
||||
fflush(stderr);
|
||||
dup2(h_err, STDERR_FILENO);
|
||||
}
|
||||
|
||||
return h_err;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_close_stderr (void)
|
||||
{
|
||||
FILE *f;
|
||||
char *line = alloca(512);
|
||||
|
||||
if (h_err > 0) {
|
||||
dup2(h_errbak, STDERR_FILENO);
|
||||
close(h_err);
|
||||
close(h_errbak);
|
||||
|
||||
f = fopen(errname, "rt");
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stderr);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
remove(errname);
|
||||
}
|
||||
}
|
||||
@@ -1,229 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.4 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PC_HW_H_included
|
||||
#define PC_HW_H_included
|
||||
|
||||
#include <dpmi.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* misc C definitions
|
||||
*/
|
||||
#define FALSE 0
|
||||
#define TRUE !FALSE
|
||||
|
||||
#define SQR(x) ((x) * (x))
|
||||
|
||||
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
|
||||
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
|
||||
#define MID(x,y,z) MAX((x), MIN((y), (z)))
|
||||
|
||||
typedef void (*VFUNC) (void);
|
||||
typedef void (*PFUNC) (void *);
|
||||
typedef void (*MFUNC) (int x, int y, int z, int b);
|
||||
|
||||
/*
|
||||
* atexit
|
||||
*/
|
||||
int pc_atexit (VFUNC f);
|
||||
int pc_clexit (VFUNC f);
|
||||
|
||||
/*
|
||||
* locked memory
|
||||
*/
|
||||
#define ENDOFUNC(x) static void x##_end() { }
|
||||
#define LOCKFUNC(x) _go32_dpmi_lock_code((void *)x, (long)x##_end - (long)x)
|
||||
#define LOCKDATA(x) _go32_dpmi_lock_data((void *)&x, sizeof(x))
|
||||
#define LOCKBUFF(x, l) _go32_dpmi_lock_data((void *)x, l)
|
||||
|
||||
void *pc_malloc (size_t size);
|
||||
|
||||
/*
|
||||
* IRQ
|
||||
*/
|
||||
#define ENABLE() __asm __volatile ("sti")
|
||||
#define DISABLE() __asm __volatile ("cli")
|
||||
|
||||
extern int pc_install_irq (int i, int (*handler) ());
|
||||
extern int pc_remove_irq (int i);
|
||||
|
||||
/*
|
||||
* keyboard
|
||||
*/
|
||||
#define KB_SHIFT_FLAG 0x0001
|
||||
#define KB_CTRL_FLAG 0x0002
|
||||
#define KB_ALT_FLAG 0x0004
|
||||
#define KB_LWIN_FLAG 0x0008
|
||||
#define KB_RWIN_FLAG 0x0010
|
||||
#define KB_MENU_FLAG 0x0020
|
||||
#define KB_SCROLOCK_FLAG 0x0100
|
||||
#define KB_NUMLOCK_FLAG 0x0200
|
||||
#define KB_CAPSLOCK_FLAG 0x0400
|
||||
#define KB_INALTSEQ_FLAG 0x0800
|
||||
#define KB_ACCENT1_FLAG 0x1000
|
||||
#define KB_ACCENT2_FLAG 0x2000
|
||||
#define KB_ACCENT3_FLAG 0x4000
|
||||
#define KB_ACCENT4_FLAG 0x8000
|
||||
|
||||
#define KEY_A 1
|
||||
#define KEY_B 2
|
||||
#define KEY_C 3
|
||||
#define KEY_D 4
|
||||
#define KEY_E 5
|
||||
#define KEY_F 6
|
||||
#define KEY_G 7
|
||||
#define KEY_H 8
|
||||
#define KEY_I 9
|
||||
#define KEY_J 10
|
||||
#define KEY_K 11
|
||||
#define KEY_L 12
|
||||
#define KEY_M 13
|
||||
#define KEY_N 14
|
||||
#define KEY_O 15
|
||||
#define KEY_P 16
|
||||
#define KEY_Q 17
|
||||
#define KEY_R 18
|
||||
#define KEY_S 19
|
||||
#define KEY_T 20
|
||||
#define KEY_U 21
|
||||
#define KEY_V 22
|
||||
#define KEY_W 23
|
||||
#define KEY_X 24
|
||||
#define KEY_Y 25
|
||||
#define KEY_Z 26
|
||||
#define KEY_0 27
|
||||
#define KEY_1 28
|
||||
#define KEY_2 29
|
||||
#define KEY_3 30
|
||||
#define KEY_4 31
|
||||
#define KEY_5 32
|
||||
#define KEY_6 33
|
||||
#define KEY_7 34
|
||||
#define KEY_8 35
|
||||
#define KEY_9 36
|
||||
#define KEY_0_PAD 37
|
||||
#define KEY_1_PAD 38
|
||||
#define KEY_2_PAD 39
|
||||
#define KEY_3_PAD 40
|
||||
#define KEY_4_PAD 41
|
||||
#define KEY_5_PAD 42
|
||||
#define KEY_6_PAD 43
|
||||
#define KEY_7_PAD 44
|
||||
#define KEY_8_PAD 45
|
||||
#define KEY_9_PAD 46
|
||||
#define KEY_F1 47
|
||||
#define KEY_F2 48
|
||||
#define KEY_F3 49
|
||||
#define KEY_F4 50
|
||||
#define KEY_F5 51
|
||||
#define KEY_F6 52
|
||||
#define KEY_F7 53
|
||||
#define KEY_F8 54
|
||||
#define KEY_F9 55
|
||||
#define KEY_F10 56
|
||||
#define KEY_F11 57
|
||||
#define KEY_F12 58
|
||||
#define KEY_ESC 59
|
||||
#define KEY_TILDE 60
|
||||
#define KEY_MINUS 61
|
||||
#define KEY_EQUALS 62
|
||||
#define KEY_BACKSPACE 63
|
||||
#define KEY_TAB 64
|
||||
#define KEY_OPENBRACE 65
|
||||
#define KEY_CLOSEBRACE 66
|
||||
#define KEY_ENTER 67
|
||||
#define KEY_COLON 68
|
||||
#define KEY_QUOTE 69
|
||||
#define KEY_BACKSLASH 70
|
||||
#define KEY_BACKSLASH2 71
|
||||
#define KEY_COMMA 72
|
||||
#define KEY_STOP 73
|
||||
#define KEY_SLASH 74
|
||||
#define KEY_SPACE 75
|
||||
#define KEY_INSERT 76
|
||||
#define KEY_DEL 77
|
||||
#define KEY_HOME 78
|
||||
#define KEY_END 79
|
||||
#define KEY_PGUP 80
|
||||
#define KEY_PGDN 81
|
||||
#define KEY_LEFT 82
|
||||
#define KEY_RIGHT 83
|
||||
#define KEY_UP 84
|
||||
#define KEY_DOWN 85
|
||||
#define KEY_SLASH_PAD 86
|
||||
#define KEY_ASTERISK 87
|
||||
#define KEY_MINUS_PAD 88
|
||||
#define KEY_PLUS_PAD 89
|
||||
#define KEY_DEL_PAD 90
|
||||
#define KEY_ENTER_PAD 91
|
||||
#define KEY_PRTSCR 92
|
||||
#define KEY_PAUSE 93
|
||||
#define KEY_ABNT_C1 94
|
||||
#define KEY_YEN 95
|
||||
#define KEY_KANA 96
|
||||
#define KEY_CONVERT 97
|
||||
#define KEY_NOCONVERT 98
|
||||
#define KEY_AT 99
|
||||
#define KEY_CIRCUMFLEX 100
|
||||
#define KEY_COLON2 101
|
||||
#define KEY_KANJI 102
|
||||
|
||||
#define KEY_MODIFIERS 103
|
||||
|
||||
#define KEY_LSHIFT 103
|
||||
#define KEY_RSHIFT 104
|
||||
#define KEY_LCONTROL 105
|
||||
#define KEY_RCONTROL 106
|
||||
#define KEY_ALT 107
|
||||
#define KEY_ALTGR 108
|
||||
#define KEY_LWIN 109
|
||||
#define KEY_RWIN 110
|
||||
#define KEY_MENU 111
|
||||
#define KEY_SCRLOCK 112
|
||||
#define KEY_NUMLOCK 113
|
||||
#define KEY_CAPSLOCK 114
|
||||
|
||||
#define KEY_MAX 115
|
||||
|
||||
int pc_install_keyb (void);
|
||||
void pc_remove_keyb (void);
|
||||
int pc_keypressed (void);
|
||||
int pc_readkey (void);
|
||||
int pc_keydown (int code);
|
||||
int pc_keyshifts (void);
|
||||
|
||||
/*
|
||||
* timer
|
||||
*/
|
||||
int pc_install_int (PFUNC func, void *parm, unsigned int freq);
|
||||
int pc_remove_int (int fid);
|
||||
int pc_adjust_int (int fid, unsigned int freq);
|
||||
void pc_remove_timer (void);
|
||||
|
||||
/*
|
||||
* mouse
|
||||
*/
|
||||
int pc_install_mouse (void);
|
||||
void pc_remove_mouse (void);
|
||||
MFUNC pc_install_mouse_handler (MFUNC handler);
|
||||
void pc_mouse_area (int x1, int y1, int x2, int y2);
|
||||
void pc_mouse_speed (int xspeed, int yspeed);
|
||||
int pc_query_mouse (int *x, int *y, int *z);
|
||||
void pc_warp_mouse (int x, int y);
|
||||
|
||||
/*
|
||||
* standard redirection
|
||||
*/
|
||||
int pc_open_stdout (void);
|
||||
int pc_open_stderr (void);
|
||||
void pc_close_stdout (void);
|
||||
void pc_close_stderr (void);
|
||||
|
||||
#endif
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
.file "pc_irq.S"
|
||||
|
||||
.text
|
||||
|
||||
#define IRQ_STACK_SIZE 16384
|
||||
|
||||
#define IRQ_WRAPPER_LEN (__irq_wrapper_1-__irq_wrapper_0)
|
||||
#define IRQ_OLD (__irq_old_0-__irq_wrapper_0)
|
||||
#define IRQ_HOOK (__irq_hook_0-__irq_wrapper_0)
|
||||
#define IRQ_STACK (__irq_stack_0-__irq_wrapper_0)
|
||||
|
||||
.balign 4
|
||||
common:
|
||||
movw $0x0400, %ax
|
||||
int $0x31
|
||||
|
||||
movl %ss:8(%ebp), %ebx
|
||||
cmpl $15, %ebx
|
||||
jbe 0f
|
||||
fail:
|
||||
orl $-1, %eax
|
||||
popl %edi
|
||||
popl %ebx
|
||||
leave
|
||||
ret
|
||||
|
||||
0:
|
||||
movl %ebx, %edi
|
||||
imull $IRQ_WRAPPER_LEN, %edi
|
||||
addl $__irq_wrapper_0, %edi
|
||||
|
||||
cmpb $7, %bl
|
||||
jbe 1f
|
||||
movb %dl, %dh
|
||||
subb $8, %dh
|
||||
1:
|
||||
addb %dh, %bl
|
||||
ret
|
||||
|
||||
.balign 4
|
||||
.global _pc_install_irq
|
||||
_pc_install_irq:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
pushl %ebx
|
||||
pushl %edi
|
||||
|
||||
call common
|
||||
|
||||
cmpl $0, IRQ_HOOK(%edi)
|
||||
jne fail
|
||||
|
||||
pushl $IRQ_WRAPPER_LEN
|
||||
pushl %edi
|
||||
call __go32_dpmi_lock_code
|
||||
addl $8, %esp
|
||||
testl %eax, %eax
|
||||
jnz fail
|
||||
|
||||
pushl $IRQ_STACK_SIZE
|
||||
call _pc_malloc
|
||||
popl %edx
|
||||
testl %eax, %eax
|
||||
jz fail
|
||||
addl %edx, %eax
|
||||
movl %eax, IRQ_STACK(%edi)
|
||||
|
||||
movl ___djgpp_ds_alias, %eax
|
||||
movl %eax, IRQ_STACK+4(%edi)
|
||||
|
||||
movl %ss:12(%ebp), %eax
|
||||
movl %eax, IRQ_HOOK(%edi)
|
||||
|
||||
movw $0x0204, %ax
|
||||
int $0x31
|
||||
movl %edx, IRQ_OLD(%edi)
|
||||
movw %cx, IRQ_OLD+4(%edi)
|
||||
movw $0x0205, %ax
|
||||
movl %edi, %edx
|
||||
movl %cs, %ecx
|
||||
int $0x31
|
||||
|
||||
done:
|
||||
xorl %eax, %eax
|
||||
popl %edi
|
||||
popl %ebx
|
||||
leave
|
||||
ret
|
||||
|
||||
.balign 4
|
||||
.global _pc_remove_irq
|
||||
_pc_remove_irq:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
pushl %ebx
|
||||
pushl %edi
|
||||
|
||||
call common
|
||||
|
||||
cmpl $0, IRQ_HOOK(%edi)
|
||||
je fail
|
||||
|
||||
movl $0, IRQ_HOOK(%edi)
|
||||
|
||||
movw $0x0205, %ax
|
||||
movl IRQ_OLD(%edi), %edx
|
||||
movl IRQ_OLD+4(%edi), %ecx
|
||||
int $0x31
|
||||
|
||||
movl IRQ_STACK(%edi), %eax
|
||||
subl $IRQ_STACK_SIZE, %eax
|
||||
pushl %eax
|
||||
call _free
|
||||
popl %eax
|
||||
|
||||
jmp done
|
||||
|
||||
#define WRAPPER(x) ; \
|
||||
.balign 4 ; \
|
||||
__irq_wrapper_##x: ; \
|
||||
pushal ; \
|
||||
pushl %ds ; \
|
||||
pushl %es ; \
|
||||
pushl %fs ; \
|
||||
pushl %gs ; \
|
||||
movl %ss, %ebx ; \
|
||||
movl %esp, %esi ; \
|
||||
lss %cs:__irq_stack_##x, %esp ; \
|
||||
pushl %ss ; \
|
||||
pushl %ss ; \
|
||||
popl %es ; \
|
||||
popl %ds ; \
|
||||
movl ___djgpp_dos_sel, %fs ; \
|
||||
pushl %fs ; \
|
||||
popl %gs ; \
|
||||
call *__irq_hook_##x ; \
|
||||
movl %ebx, %ss ; \
|
||||
movl %esi, %esp ; \
|
||||
testl %eax, %eax ; \
|
||||
popl %gs ; \
|
||||
popl %fs ; \
|
||||
popl %es ; \
|
||||
popl %ds ; \
|
||||
popal ; \
|
||||
jz __irq_ignore_##x ; \
|
||||
__irq_bypass_##x: ; \
|
||||
ljmp *%cs:__irq_old_##x ; \
|
||||
__irq_ignore_##x: ; \
|
||||
iret ; \
|
||||
.balign 4 ; \
|
||||
__irq_old_##x: ; \
|
||||
.long 0, 0 ; \
|
||||
__irq_hook_##x: ; \
|
||||
.long 0 ; \
|
||||
__irq_stack_##x: ; \
|
||||
.long 0, 0
|
||||
|
||||
WRAPPER(0);
|
||||
WRAPPER(1);
|
||||
WRAPPER(2);
|
||||
WRAPPER(3);
|
||||
WRAPPER(4);
|
||||
WRAPPER(5);
|
||||
WRAPPER(6);
|
||||
WRAPPER(7);
|
||||
WRAPPER(8);
|
||||
WRAPPER(9);
|
||||
WRAPPER(10);
|
||||
WRAPPER(11);
|
||||
WRAPPER(12);
|
||||
WRAPPER(13);
|
||||
WRAPPER(14);
|
||||
WRAPPER(15);
|
||||
@@ -1,540 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#include <pc.h>
|
||||
#include <sys/exceptn.h>
|
||||
#include <sys/farptr.h>
|
||||
|
||||
#include "pc_hw.h"
|
||||
|
||||
|
||||
#define KEYB_IRQ 1
|
||||
|
||||
#define KEY_BUFFER_SIZE 64
|
||||
|
||||
#define KB_MODIFIERS (KB_SHIFT_FLAG | KB_CTRL_FLAG | KB_ALT_FLAG | KB_LWIN_FLAG | KB_RWIN_FLAG | KB_MENU_FLAG)
|
||||
#define KB_LED_FLAGS (KB_SCROLOCK_FLAG | KB_NUMLOCK_FLAG | KB_CAPSLOCK_FLAG)
|
||||
|
||||
static int keyboard_installed;
|
||||
|
||||
static volatile struct {
|
||||
volatile int start, end;
|
||||
volatile int key[KEY_BUFFER_SIZE];
|
||||
} key_buffer;
|
||||
|
||||
static volatile int key_enhanced, key_pause_loop, key_shifts;
|
||||
static int leds_ok = TRUE;
|
||||
static int in_a_terrupt = FALSE;
|
||||
static volatile char pc_key[KEY_MAX];
|
||||
|
||||
|
||||
/* convert Allegro format scancodes into key_shifts flag bits */
|
||||
static unsigned short modifier_table[KEY_MAX - KEY_MODIFIERS] = {
|
||||
KB_SHIFT_FLAG, KB_SHIFT_FLAG, KB_CTRL_FLAG,
|
||||
KB_CTRL_FLAG, KB_ALT_FLAG, KB_ALT_FLAG,
|
||||
KB_LWIN_FLAG, KB_RWIN_FLAG, KB_MENU_FLAG,
|
||||
KB_SCROLOCK_FLAG, KB_NUMLOCK_FLAG, KB_CAPSLOCK_FLAG
|
||||
};
|
||||
|
||||
|
||||
/* lookup table for converting hardware scancodes into Allegro format */
|
||||
static unsigned char hw_to_mycode[128] = {
|
||||
/* 0x00 */ 0, KEY_ESC, KEY_1, KEY_2,
|
||||
/* 0x04 */ KEY_3, KEY_4, KEY_5, KEY_6,
|
||||
/* 0x08 */ KEY_7, KEY_8, KEY_9, KEY_0,
|
||||
/* 0x0C */ KEY_MINUS, KEY_EQUALS, KEY_BACKSPACE, KEY_TAB,
|
||||
/* 0x10 */ KEY_Q, KEY_W, KEY_E, KEY_R,
|
||||
/* 0x14 */ KEY_T, KEY_Y, KEY_U, KEY_I,
|
||||
/* 0x18 */ KEY_O, KEY_P, KEY_OPENBRACE, KEY_CLOSEBRACE,
|
||||
/* 0x1C */ KEY_ENTER, KEY_LCONTROL, KEY_A, KEY_S,
|
||||
/* 0x20 */ KEY_D, KEY_F, KEY_G, KEY_H,
|
||||
/* 0x24 */ KEY_J, KEY_K, KEY_L, KEY_COLON,
|
||||
/* 0x28 */ KEY_QUOTE, KEY_TILDE, KEY_LSHIFT, KEY_BACKSLASH,
|
||||
/* 0x2C */ KEY_Z, KEY_X, KEY_C, KEY_V,
|
||||
/* 0x30 */ KEY_B, KEY_N, KEY_M, KEY_COMMA,
|
||||
/* 0x34 */ KEY_STOP, KEY_SLASH, KEY_RSHIFT, KEY_ASTERISK,
|
||||
/* 0x38 */ KEY_ALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1,
|
||||
/* 0x3C */ KEY_F2, KEY_F3, KEY_F4, KEY_F5,
|
||||
/* 0x40 */ KEY_F6, KEY_F7, KEY_F8, KEY_F9,
|
||||
/* 0x44 */ KEY_F10, KEY_NUMLOCK, KEY_SCRLOCK, KEY_7_PAD,
|
||||
/* 0x48 */ KEY_8_PAD, KEY_9_PAD, KEY_MINUS_PAD, KEY_4_PAD,
|
||||
/* 0x4C */ KEY_5_PAD, KEY_6_PAD, KEY_PLUS_PAD, KEY_1_PAD,
|
||||
/* 0x50 */ KEY_2_PAD, KEY_3_PAD, KEY_0_PAD, KEY_DEL_PAD,
|
||||
/* 0x54 */ KEY_PRTSCR, 0, KEY_BACKSLASH2, KEY_F11,
|
||||
/* 0x58 */ KEY_F12, 0, 0, KEY_LWIN,
|
||||
/* 0x5C */ KEY_RWIN, KEY_MENU, 0, 0,
|
||||
/* 0x60 */ 0, 0, 0, 0,
|
||||
/* 0x64 */ 0, 0, 0, 0,
|
||||
/* 0x68 */ 0, 0, 0, 0,
|
||||
/* 0x6C */ 0, 0, 0, 0,
|
||||
/* 0x70 */ KEY_KANA, 0, 0, KEY_ABNT_C1,
|
||||
/* 0x74 */ 0, 0, 0, 0,
|
||||
/* 0x78 */ 0, KEY_CONVERT, 0, KEY_NOCONVERT,
|
||||
/* 0x7C */ 0, KEY_YEN, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* lookup table for converting extended hardware codes into Allegro format */
|
||||
static unsigned char hw_to_mycode_ex[128] = {
|
||||
/* 0x00 */ 0, KEY_ESC, KEY_1, KEY_2,
|
||||
/* 0x04 */ KEY_3, KEY_4, KEY_5, KEY_6,
|
||||
/* 0x08 */ KEY_7, KEY_8, KEY_9, KEY_0,
|
||||
/* 0x0C */ KEY_MINUS, KEY_EQUALS, KEY_BACKSPACE, KEY_TAB,
|
||||
/* 0x10 */ KEY_CIRCUMFLEX, KEY_AT, KEY_COLON2, KEY_R,
|
||||
/* 0x14 */ KEY_KANJI, KEY_Y, KEY_U, KEY_I,
|
||||
/* 0x18 */ KEY_O, KEY_P, KEY_OPENBRACE, KEY_CLOSEBRACE,
|
||||
/* 0x1C */ KEY_ENTER_PAD, KEY_RCONTROL, KEY_A, KEY_S,
|
||||
/* 0x20 */ KEY_D, KEY_F, KEY_G, KEY_H,
|
||||
/* 0x24 */ KEY_J, KEY_K, KEY_L, KEY_COLON,
|
||||
/* 0x28 */ KEY_QUOTE, KEY_TILDE, 0, KEY_BACKSLASH,
|
||||
/* 0x2C */ KEY_Z, KEY_X, KEY_C, KEY_V,
|
||||
/* 0x30 */ KEY_B, KEY_N, KEY_M, KEY_COMMA,
|
||||
/* 0x34 */ KEY_STOP, KEY_SLASH_PAD, 0, KEY_PRTSCR,
|
||||
/* 0x38 */ KEY_ALTGR, KEY_SPACE, KEY_CAPSLOCK, KEY_F1,
|
||||
/* 0x3C */ KEY_F2, KEY_F3, KEY_F4, KEY_F5,
|
||||
/* 0x40 */ KEY_F6, KEY_F7, KEY_F8, KEY_F9,
|
||||
/* 0x44 */ KEY_F10, KEY_NUMLOCK, KEY_PAUSE, KEY_HOME,
|
||||
/* 0x48 */ KEY_UP, KEY_PGUP, KEY_MINUS_PAD, KEY_LEFT,
|
||||
/* 0x4C */ KEY_5_PAD, KEY_RIGHT, KEY_PLUS_PAD, KEY_END,
|
||||
/* 0x50 */ KEY_DOWN, KEY_PGDN, KEY_INSERT, KEY_DEL,
|
||||
/* 0x54 */ KEY_PRTSCR, 0, KEY_BACKSLASH2, KEY_F11,
|
||||
/* 0x58 */ KEY_F12, 0, 0, KEY_LWIN,
|
||||
/* 0x5C */ KEY_RWIN, KEY_MENU, 0, 0,
|
||||
/* 0x60 */ 0, 0, 0, 0,
|
||||
/* 0x64 */ 0, 0, 0, 0,
|
||||
/* 0x68 */ 0, 0, 0, 0,
|
||||
/* 0x6C */ 0, 0, 0, 0,
|
||||
/* 0x70 */ 0, 0, 0, 0,
|
||||
/* 0x74 */ 0, 0, 0, 0,
|
||||
/* 0x78 */ 0, 0, 0, 0,
|
||||
/* 0x7C */ 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* default mapping table for the US keyboard layout */
|
||||
static unsigned short standard_key_ascii_table[KEY_MAX] = {
|
||||
/* start */ 0,
|
||||
/* alphabet */ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
/* numbers */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* numpad */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* func keys */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* misc chars */ 27, '`', '-', '=', 8, 9, '[', ']', 13, ';', '\'', '\\', '\\', ',', '.', '/', ' ',
|
||||
/* controls */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* numpad */ '/', '*', '-', '+', '.', 13,
|
||||
/* modifiers */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* capslock mapping table for the US keyboard layout */
|
||||
static unsigned short standard_key_capslock_table[KEY_MAX] = {
|
||||
/* start */ 0,
|
||||
/* alphabet */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
/* numbers */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* numpad */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* func keys */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* misc chars */ 27, '`', '-', '=', 8, 9, '[', ']', 13, ';', '\'', '\\', '\\', ',', '.', '/', ' ',
|
||||
/* controls */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* numpad */ '/', '*', '-', '+', '.', 13,
|
||||
/* modifiers */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* shifted mapping table for the US keyboard layout */
|
||||
static unsigned short standard_key_shift_table[KEY_MAX] = {
|
||||
/* start */ 0,
|
||||
/* alphabet */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
/* numbers */ ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',
|
||||
/* numpad */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* func keys */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* misc chars */ 27, '~', '_', '+', 8, 9, '{', '}', 13, ':', '"', '|', '|', '<', '>', '?', ' ',
|
||||
/* controls */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* numpad */ '/', '*', '-', '+', '.', 13,
|
||||
/* modifiers */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* ctrl+key mapping table for the US keyboard layout */
|
||||
static unsigned short standard_key_control_table[KEY_MAX] = {
|
||||
/* start */ 0,
|
||||
/* alphabet */ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||
/* numbers */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
/* numpad */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
/* func keys */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* misc chars */ 27, 2, 2, 2, 127, 127, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
/* controls */ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
|
||||
/* numpad */ 2, 2, 2, 2, 2, 10,
|
||||
/* modifiers */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
|
||||
/* convert numeric pad scancodes into arrow codes */
|
||||
static unsigned char numlock_table[10] = {
|
||||
KEY_INSERT, KEY_END, KEY_DOWN, KEY_PGDN, KEY_LEFT,
|
||||
KEY_5_PAD, KEY_RIGHT, KEY_HOME, KEY_UP, KEY_PGUP
|
||||
};
|
||||
|
||||
|
||||
/* kb_wait_for_write_ready:
|
||||
* Wait for the keyboard controller to set the ready-for-write bit.
|
||||
*/
|
||||
static __inline int
|
||||
kb_wait_for_write_ready (void)
|
||||
{
|
||||
int timeout = 4096;
|
||||
|
||||
while ((timeout > 0) && (inportb(0x64) & 2)) timeout--;
|
||||
|
||||
return (timeout > 0);
|
||||
}
|
||||
|
||||
|
||||
/* kb_wait_for_read_ready:
|
||||
* Wait for the keyboard controller to set the ready-for-read bit.
|
||||
*/
|
||||
static __inline int
|
||||
kb_wait_for_read_ready (void)
|
||||
{
|
||||
int timeout = 16384;
|
||||
|
||||
while ((timeout > 0) && (!(inportb(0x64) & 1))) timeout--;
|
||||
|
||||
return (timeout > 0);
|
||||
}
|
||||
|
||||
|
||||
/* kb_send_data:
|
||||
* Sends a byte to the keyboard controller. Returns 1 if all OK.
|
||||
*/
|
||||
static __inline int
|
||||
kb_send_data (unsigned char data)
|
||||
{
|
||||
int resends = 4;
|
||||
int timeout, temp;
|
||||
|
||||
do {
|
||||
if (!kb_wait_for_write_ready())
|
||||
return 0;
|
||||
|
||||
outportb(0x60, data);
|
||||
timeout = 4096;
|
||||
|
||||
while (--timeout > 0) {
|
||||
if (!kb_wait_for_read_ready())
|
||||
return 0;
|
||||
|
||||
temp = inportb(0x60);
|
||||
|
||||
if (temp == 0xFA)
|
||||
return 1;
|
||||
|
||||
if (temp == 0xFE)
|
||||
break;
|
||||
}
|
||||
} while ((resends-- > 0) && (timeout > 0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
update_leds (int leds)
|
||||
{
|
||||
if (leds_ok) {
|
||||
if (!in_a_terrupt)
|
||||
DISABLE();
|
||||
|
||||
if (!kb_send_data(0xED)) {
|
||||
kb_send_data(0xF4);
|
||||
leds_ok = FALSE;
|
||||
} else if (!kb_send_data((leds >> 8) & 7)) {
|
||||
kb_send_data(0xF4);
|
||||
leds_ok = FALSE;
|
||||
}
|
||||
|
||||
if (!in_a_terrupt)
|
||||
ENABLE();
|
||||
}
|
||||
} ENDOFUNC(update_leds)
|
||||
|
||||
|
||||
static void
|
||||
inject_key (int scancode)
|
||||
{
|
||||
unsigned short *table;
|
||||
|
||||
if ((scancode >= KEY_0_PAD) && (scancode <= KEY_9_PAD)) {
|
||||
if (((key_shifts & KB_NUMLOCK_FLAG) != 0) == ((key_shifts & KB_SHIFT_FLAG) != 0)) {
|
||||
scancode = numlock_table[scancode - KEY_0_PAD];
|
||||
}
|
||||
table = standard_key_ascii_table;
|
||||
} else if (key_shifts & KB_CTRL_FLAG) {
|
||||
table = standard_key_control_table;
|
||||
} else if (key_shifts & KB_SHIFT_FLAG) {
|
||||
if (key_shifts & KB_CAPSLOCK_FLAG) {
|
||||
if (standard_key_ascii_table[scancode] == standard_key_capslock_table[scancode]) {
|
||||
table = standard_key_shift_table;
|
||||
} else {
|
||||
table = standard_key_ascii_table;
|
||||
}
|
||||
} else {
|
||||
table = standard_key_shift_table;
|
||||
}
|
||||
} else if (key_shifts & KB_CAPSLOCK_FLAG) {
|
||||
table = standard_key_capslock_table;
|
||||
} else {
|
||||
table = standard_key_ascii_table;
|
||||
}
|
||||
|
||||
key_buffer.key[key_buffer.end++] = (scancode << 16) | table[scancode];
|
||||
|
||||
if (key_buffer.end >= KEY_BUFFER_SIZE)
|
||||
key_buffer.end = 0;
|
||||
if (key_buffer.end == key_buffer.start) {
|
||||
key_buffer.start++;
|
||||
if (key_buffer.start >= KEY_BUFFER_SIZE)
|
||||
key_buffer.start = 0;
|
||||
}
|
||||
} ENDOFUNC(inject_key)
|
||||
|
||||
|
||||
static void
|
||||
handle_code (int scancode, int keycode)
|
||||
{
|
||||
in_a_terrupt++;
|
||||
|
||||
if (keycode == 0) { /* pause */
|
||||
inject_key(scancode);
|
||||
pc_key[KEY_PAUSE] ^= TRUE;
|
||||
} else if (scancode) {
|
||||
int flag;
|
||||
|
||||
if (scancode >= KEY_MODIFIERS) {
|
||||
flag = modifier_table[scancode - KEY_MODIFIERS];
|
||||
} else {
|
||||
flag = 0;
|
||||
}
|
||||
if ((char)keycode < 0) { /* release */
|
||||
pc_key[scancode] = FALSE;
|
||||
if (flag & KB_MODIFIERS) {
|
||||
key_shifts &= ~flag;
|
||||
}
|
||||
} else { /* keypress */
|
||||
pc_key[scancode] = TRUE;
|
||||
if (flag & KB_MODIFIERS) {
|
||||
key_shifts |= flag;
|
||||
}
|
||||
if (flag & KB_LED_FLAGS) {
|
||||
key_shifts ^= flag;
|
||||
update_leds(key_shifts);
|
||||
}
|
||||
if (scancode < KEY_MODIFIERS) {
|
||||
inject_key(scancode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
in_a_terrupt--;
|
||||
} ENDOFUNC(handle_code)
|
||||
|
||||
|
||||
static int
|
||||
keyboard ()
|
||||
{
|
||||
unsigned char temp, scancode;
|
||||
|
||||
temp = inportb(0x60);
|
||||
|
||||
if (temp <= 0xe1) {
|
||||
if (key_pause_loop) {
|
||||
if (!--key_pause_loop) handle_code(KEY_PAUSE, 0);
|
||||
} else
|
||||
switch (temp) {
|
||||
case 0xe0:
|
||||
key_enhanced = TRUE;
|
||||
break;
|
||||
case 0xe1:
|
||||
key_pause_loop = 5;
|
||||
break;
|
||||
default:
|
||||
if (key_enhanced) {
|
||||
key_enhanced = FALSE;
|
||||
scancode = hw_to_mycode_ex[temp & 0x7f];
|
||||
} else {
|
||||
scancode = hw_to_mycode[temp & 0x7f];
|
||||
}
|
||||
handle_code(scancode, temp);
|
||||
}
|
||||
}
|
||||
|
||||
if (((temp==0x4F)||(temp==0x53))&&(key_shifts&KB_CTRL_FLAG)&&(key_shifts&KB_ALT_FLAG)) {
|
||||
/* Hack alert:
|
||||
* only SIGINT (but not Ctrl-Break)
|
||||
* calls the destructors and will safely clean up
|
||||
*/
|
||||
__asm("\n\
|
||||
movb $0x79, %%al \n\
|
||||
call ___djgpp_hw_exception \n\
|
||||
":::"%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
|
||||
}
|
||||
|
||||
__asm("\n\
|
||||
inb $0x61, %%al \n\
|
||||
movb %%al, %%ah \n\
|
||||
orb $0x80, %%al \n\
|
||||
outb %%al, $0x61 \n\
|
||||
xchgb %%al, %%ah \n\
|
||||
outb %%al, $0x61 \n\
|
||||
movb $0x20, %%al \n\
|
||||
outb %%al, $0x20 \n\
|
||||
":::"%eax");
|
||||
return 0;
|
||||
} ENDOFUNC(keyboard)
|
||||
|
||||
|
||||
int
|
||||
pc_keypressed (void)
|
||||
{
|
||||
return (key_buffer.start!=key_buffer.end);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_readkey (void)
|
||||
{
|
||||
if (keyboard_installed) {
|
||||
int key;
|
||||
|
||||
while (key_buffer.start == key_buffer.end) {
|
||||
__dpmi_yield();
|
||||
}
|
||||
|
||||
DISABLE();
|
||||
key = key_buffer.key[key_buffer.start++];
|
||||
if (key_buffer.start >= KEY_BUFFER_SIZE)
|
||||
key_buffer.start = 0;
|
||||
ENABLE();
|
||||
|
||||
return key;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_keydown (int code)
|
||||
{
|
||||
return pc_key[code];
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_keyshifts (void)
|
||||
{
|
||||
return key_shifts;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_remove_keyb (void)
|
||||
{
|
||||
if (keyboard_installed) {
|
||||
int s1, s2, s3;
|
||||
|
||||
keyboard_installed = FALSE;
|
||||
pc_clexit(pc_remove_keyb);
|
||||
|
||||
DISABLE();
|
||||
_farsetsel(__djgpp_dos_sel);
|
||||
_farnspokew(0x41c, _farnspeekw(0x41a));
|
||||
|
||||
s1 = _farnspeekb(0x417) & 0x80;
|
||||
s2 = _farnspeekb(0x418) & 0xFC;
|
||||
s3 = _farnspeekb(0x496) & 0xF3;
|
||||
|
||||
if (pc_key[KEY_RSHIFT]) { s1 |= 1; }
|
||||
if (pc_key[KEY_LSHIFT]) { s1 |= 2; }
|
||||
if (pc_key[KEY_LCONTROL]) { s2 |= 1; s1 |= 4; }
|
||||
if (pc_key[KEY_ALT]) { s1 |= 8; s2 |= 2; }
|
||||
if (pc_key[KEY_RCONTROL]) { s1 |= 4; s3 |= 4; }
|
||||
if (pc_key[KEY_ALTGR]) { s1 |= 8; s3 |= 8; }
|
||||
|
||||
if (key_shifts & KB_SCROLOCK_FLAG) s1 |= 16;
|
||||
if (key_shifts & KB_NUMLOCK_FLAG) s1 |= 32;
|
||||
if (key_shifts & KB_CAPSLOCK_FLAG) s1 |= 64;
|
||||
|
||||
_farnspokeb(0x417, s1);
|
||||
_farnspokeb(0x418, s2);
|
||||
_farnspokeb(0x496, s3);
|
||||
update_leds(key_shifts);
|
||||
|
||||
ENABLE();
|
||||
pc_remove_irq(KEYB_IRQ);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_install_keyb (void)
|
||||
{
|
||||
if (keyboard_installed || pc_install_irq(KEYB_IRQ, keyboard)) {
|
||||
return -1;
|
||||
} else {
|
||||
int s1, s2, s3;
|
||||
|
||||
LOCKDATA(key_buffer);
|
||||
LOCKDATA(key_enhanced);
|
||||
LOCKDATA(key_pause_loop);
|
||||
LOCKDATA(key_shifts);
|
||||
LOCKDATA(leds_ok);
|
||||
LOCKDATA(in_a_terrupt);
|
||||
LOCKDATA(pc_key);
|
||||
LOCKDATA(modifier_table);
|
||||
LOCKDATA(hw_to_mycode);
|
||||
LOCKDATA(hw_to_mycode_ex);
|
||||
LOCKDATA(standard_key_ascii_table);
|
||||
LOCKDATA(standard_key_capslock_table);
|
||||
LOCKDATA(standard_key_shift_table);
|
||||
LOCKDATA(standard_key_control_table);
|
||||
LOCKDATA(numlock_table);
|
||||
LOCKFUNC(update_leds);
|
||||
LOCKFUNC(inject_key);
|
||||
LOCKFUNC(handle_code);
|
||||
LOCKFUNC(keyboard);
|
||||
|
||||
DISABLE();
|
||||
_farsetsel(__djgpp_dos_sel);
|
||||
_farnspokew(0x41c, _farnspeekw(0x41a));
|
||||
|
||||
key_shifts = 0;
|
||||
s1 = _farnspeekb(0x417);
|
||||
s2 = _farnspeekb(0x418);
|
||||
s3 = _farnspeekb(0x496);
|
||||
|
||||
if (s1 & 1) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_RSHIFT] = TRUE; }
|
||||
if (s1 & 2) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_LSHIFT] = TRUE; }
|
||||
if (s2 & 1) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_LCONTROL] = TRUE; }
|
||||
if (s2 & 2) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALT] = TRUE; }
|
||||
if (s3 & 4) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_RCONTROL] = TRUE; }
|
||||
if (s3 & 8) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALTGR] = TRUE; }
|
||||
|
||||
if (s1 & 16) key_shifts |= KB_SCROLOCK_FLAG;
|
||||
if (s1 & 32) key_shifts |= KB_NUMLOCK_FLAG;
|
||||
if (s1 & 64) key_shifts |= KB_CAPSLOCK_FLAG;
|
||||
update_leds(key_shifts);
|
||||
|
||||
key_enhanced = key_pause_loop = 0;
|
||||
key_buffer.start = key_buffer.end = 0;
|
||||
ENABLE();
|
||||
|
||||
pc_atexit(pc_remove_keyb);
|
||||
keyboard_installed = TRUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,293 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#include <dpmi.h>
|
||||
#include <sys/exceptn.h>
|
||||
#include <sys/segments.h>
|
||||
|
||||
#include "pc_hw.h"
|
||||
|
||||
|
||||
#define PC_CUTE_WHEEL 1 /* CuteMouse WheelAPI */
|
||||
|
||||
#define MOUSE_STACK_SIZE 16384
|
||||
|
||||
#define CLEAR_MICKEYS() \
|
||||
do { \
|
||||
__asm __volatile ("movw $0xb, %%ax; int $0x33":::"%eax", "%ecx", "%edx"); \
|
||||
ox = oy = 0; \
|
||||
} while (0)
|
||||
|
||||
extern void mouse_wrap (void);
|
||||
extern int mouse_wrap_end[];
|
||||
|
||||
static MFUNC mouse_func;
|
||||
static long mouse_callback;
|
||||
static __dpmi_regs mouse_regs;
|
||||
|
||||
static volatile struct {
|
||||
volatile int x, y, z, b;
|
||||
} pc_mouse;
|
||||
|
||||
static int minx = 0;
|
||||
static int maxx = 319;
|
||||
static int miny = 0;
|
||||
static int maxy = 199;
|
||||
static int minz = 0;
|
||||
static int maxz = 255;
|
||||
|
||||
static int sx = 2;
|
||||
static int sy = 2;
|
||||
|
||||
static int emulat3 = FALSE;
|
||||
|
||||
static int ox, oy;
|
||||
|
||||
|
||||
static void
|
||||
mouse (__dpmi_regs *r)
|
||||
{
|
||||
int nx = (signed short)r->x.si / sx;
|
||||
int ny = (signed short)r->x.di / sy;
|
||||
int dx = nx - ox;
|
||||
int dy = ny - oy;
|
||||
#if PC_CUTE_WHEEL
|
||||
int dz = (signed char)r->h.bh;
|
||||
#endif
|
||||
ox = nx;
|
||||
oy = ny;
|
||||
|
||||
pc_mouse.b = r->h.bl;
|
||||
pc_mouse.x = MID(minx, pc_mouse.x + dx, maxx);
|
||||
pc_mouse.y = MID(miny, pc_mouse.y + dy, maxy);
|
||||
#if PC_CUTE_WHEEL
|
||||
pc_mouse.z = MID(minz, pc_mouse.z + dz, maxz);
|
||||
#endif
|
||||
|
||||
if (emulat3) {
|
||||
if ((pc_mouse.b & 3) == 3) {
|
||||
pc_mouse.b = 4;
|
||||
}
|
||||
}
|
||||
|
||||
if (mouse_func) {
|
||||
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
|
||||
}
|
||||
} ENDOFUNC(mouse)
|
||||
|
||||
|
||||
void
|
||||
pc_remove_mouse (void)
|
||||
{
|
||||
if (mouse_callback) {
|
||||
pc_clexit(pc_remove_mouse);
|
||||
__asm("\n\
|
||||
movl %%edx, %%ecx \n\
|
||||
shrl $16, %%ecx \n\
|
||||
movw $0x0304, %%ax \n\
|
||||
int $0x31 \n\
|
||||
movw $0x000c, %%ax \n\
|
||||
xorl %%ecx, %%ecx \n\
|
||||
int $0x33 \n\
|
||||
"::"d"(mouse_callback):"%eax", "%ecx");
|
||||
|
||||
mouse_callback = 0;
|
||||
|
||||
free((void *)(mouse_wrap_end[0] - MOUSE_STACK_SIZE));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_install_mouse (void)
|
||||
{
|
||||
int buttons;
|
||||
|
||||
/* fail if already call-backed */
|
||||
if (mouse_callback) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* reset mouse and get status */
|
||||
__asm("\n\
|
||||
xorl %%eax, %%eax \n\
|
||||
int $0x33 \n\
|
||||
andl %%ebx, %%eax \n\
|
||||
movl %%eax, %0 \n\
|
||||
":"=g" (buttons)::"%eax", "%ebx");
|
||||
if (!buttons) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* lock wrapper */
|
||||
LOCKDATA(mouse_func);
|
||||
LOCKDATA(mouse_callback);
|
||||
LOCKDATA(mouse_regs);
|
||||
LOCKDATA(pc_mouse);
|
||||
LOCKDATA(minx);
|
||||
LOCKDATA(maxx);
|
||||
LOCKDATA(miny);
|
||||
LOCKDATA(maxy);
|
||||
LOCKDATA(minz);
|
||||
LOCKDATA(maxz);
|
||||
LOCKDATA(sx);
|
||||
LOCKDATA(sy);
|
||||
LOCKDATA(emulat3);
|
||||
LOCKDATA(ox);
|
||||
LOCKDATA(oy);
|
||||
LOCKFUNC(mouse);
|
||||
LOCKFUNC(mouse_wrap);
|
||||
|
||||
mouse_wrap_end[1] = __djgpp_ds_alias;
|
||||
/* grab a locked stack */
|
||||
if ((mouse_wrap_end[0] = (int)pc_malloc(MOUSE_STACK_SIZE)) == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* try to hook a call-back */
|
||||
__asm("\n\
|
||||
pushl %%ds \n\
|
||||
pushl %%es \n\
|
||||
movw $0x0303, %%ax \n\
|
||||
pushl %%ds \n\
|
||||
pushl %%cs \n\
|
||||
popl %%ds \n\
|
||||
popl %%es \n\
|
||||
int $0x31 \n\
|
||||
popl %%es \n\
|
||||
popl %%ds \n\
|
||||
jc 0f \n\
|
||||
shll $16, %%ecx \n\
|
||||
movw %%dx, %%cx \n\
|
||||
movl %%ecx, %0 \n\
|
||||
0: \n\
|
||||
":"=g"(mouse_callback)
|
||||
:"S" (mouse_wrap), "D"(&mouse_regs)
|
||||
:"%eax", "%ecx", "%edx");
|
||||
if (!mouse_callback) {
|
||||
free((void *)mouse_wrap_end[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* adjust stack */
|
||||
mouse_wrap_end[0] += MOUSE_STACK_SIZE;
|
||||
|
||||
/* install the handler */
|
||||
mouse_regs.x.ax = 0x000c;
|
||||
#if PC_CUTE_WHEEL
|
||||
mouse_regs.x.cx = 0x7f | 0x80;
|
||||
#else
|
||||
mouse_regs.x.cx = 0x7f;
|
||||
#endif
|
||||
mouse_regs.x.dx = mouse_callback & 0xffff;
|
||||
mouse_regs.x.es = mouse_callback >> 16;
|
||||
__dpmi_int(0x33, &mouse_regs);
|
||||
|
||||
CLEAR_MICKEYS();
|
||||
|
||||
emulat3 = (buttons < 3);
|
||||
pc_atexit(pc_remove_mouse);
|
||||
return buttons;
|
||||
}
|
||||
|
||||
|
||||
MFUNC
|
||||
pc_install_mouse_handler (MFUNC handler)
|
||||
{
|
||||
MFUNC old;
|
||||
|
||||
if (!mouse_callback && !pc_install_mouse()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
old = mouse_func;
|
||||
mouse_func = handler;
|
||||
return old;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_mouse_area (int x1, int y1, int x2, int y2)
|
||||
{
|
||||
minx = x1;
|
||||
maxx = x2;
|
||||
miny = y1;
|
||||
maxy = y2;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_mouse_speed (int xspeed, int yspeed)
|
||||
{
|
||||
DISABLE();
|
||||
|
||||
sx = MAX(1, xspeed);
|
||||
sy = MAX(1, yspeed);
|
||||
|
||||
ENABLE();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pc_query_mouse (int *x, int *y, int *z)
|
||||
{
|
||||
*x = pc_mouse.x;
|
||||
*y = pc_mouse.y;
|
||||
*z = pc_mouse.z;
|
||||
return pc_mouse.b;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pc_warp_mouse (int x, int y)
|
||||
{
|
||||
CLEAR_MICKEYS();
|
||||
|
||||
pc_mouse.x = MID(minx, x, maxx);
|
||||
pc_mouse.y = MID(miny, y, maxy);
|
||||
|
||||
if (mouse_func) {
|
||||
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Hack alert:
|
||||
* `mouse_wrap_end' actually holds the
|
||||
* address of stack in a safe data selector.
|
||||
*/
|
||||
__asm("\n\
|
||||
.text \n\
|
||||
.p2align 5,,31 \n\
|
||||
.global _mouse_wrap \n\
|
||||
_mouse_wrap: \n\
|
||||
cld \n\
|
||||
lodsl \n\
|
||||
movl %eax, %es:42(%edi) \n\
|
||||
addw $4, %es:46(%edi) \n\
|
||||
pushl %es \n\
|
||||
movl %ss, %ebx \n\
|
||||
movl %esp, %esi \n\
|
||||
lss %cs:_mouse_wrap_end, %esp\n\
|
||||
pushl %ss \n\
|
||||
pushl %ss \n\
|
||||
popl %es \n\
|
||||
popl %ds \n\
|
||||
movl ___djgpp_dos_sel, %fs \n\
|
||||
pushl %fs \n\
|
||||
popl %gs \n\
|
||||
pushl %edi \n\
|
||||
call _mouse \n\
|
||||
popl %edi \n\
|
||||
movl %ebx, %ss \n\
|
||||
movl %esi, %esp \n\
|
||||
popl %es \n\
|
||||
iret \n\
|
||||
.global _mouse_wrap_end \n\
|
||||
_mouse_wrap_end:.long 0, 0");
|
||||
@@ -1,327 +0,0 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.5 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#include <pc.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "pc_hw.h"
|
||||
|
||||
#define TIMER_IRQ 0
|
||||
|
||||
#define MAX_TIMERS 8
|
||||
|
||||
#define PIT_FREQ 0x1234DD
|
||||
|
||||
#define ADJUST(timer, basefreq) timer.counter = PIT_FREQ * timer.freq / SQR(basefreq)
|
||||
|
||||
#define unvolatile(__v, __t) __extension__ ({union { volatile __t __cp; __t __p; } __q; __q.__cp = __v; __q.__p;})
|
||||
|
||||
static int timer_installed;
|
||||
|
||||
typedef struct {
|
||||
volatile unsigned int counter, clock_ticks, freq;
|
||||
volatile PFUNC func;
|
||||
volatile void *parm;
|
||||
} TIMER;
|
||||
|
||||
static TIMER timer_main, timer_func[MAX_TIMERS];
|
||||
|
||||
|
||||
/* Desc: main timer callback
|
||||
*
|
||||
* In : -
|
||||
* Out : 0 to bypass BIOS, 1 to chain to BIOS
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int
|
||||
timer ()
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
t->clock_ticks += t->counter;
|
||||
if (t->clock_ticks >= timer_main.counter) {
|
||||
t->clock_ticks -= timer_main.counter;
|
||||
t->func(unvolatile(t->parm, void *));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
timer_main.clock_ticks += timer_main.counter;
|
||||
if (timer_main.clock_ticks >= 0x10000) {
|
||||
timer_main.clock_ticks -= 0x10000;
|
||||
return 1;
|
||||
} else {
|
||||
outportb(0x20, 0x20);
|
||||
return 0;
|
||||
}
|
||||
} ENDOFUNC(timer)
|
||||
|
||||
|
||||
/* Desc: uninstall timer engine
|
||||
*
|
||||
* In : -
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
void
|
||||
pc_remove_timer (void)
|
||||
{
|
||||
if (timer_installed) {
|
||||
timer_installed = FALSE;
|
||||
pc_clexit(pc_remove_timer);
|
||||
|
||||
DISABLE();
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, 0);
|
||||
outportb(0x40, 0);
|
||||
ENABLE();
|
||||
|
||||
pc_remove_irq(TIMER_IRQ);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Desc: remove timerfunc
|
||||
*
|
||||
* In : timerfunc id
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: tries to relax the main timer whenever possible
|
||||
*/
|
||||
int
|
||||
pc_remove_int (int fid)
|
||||
{
|
||||
int i;
|
||||
unsigned int freq = 0;
|
||||
|
||||
/* are we installed? */
|
||||
if (!timer_installed) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
timer_func[fid].func = NULL;
|
||||
|
||||
/* scan for maximum frequency */
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
if (freq < t->freq) {
|
||||
freq = t->freq;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if there are no callbacks left, cleanup */
|
||||
if (!freq) {
|
||||
pc_remove_timer();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if we just lowered the maximum frequency, try to relax the timer engine */
|
||||
if (freq < timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
DISABLE();
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
|
||||
ENABLE();
|
||||
}
|
||||
|
||||
return 0;
|
||||
} ENDOFUNC(pc_remove_int)
|
||||
|
||||
|
||||
/* Desc: adjust timerfunc
|
||||
*
|
||||
* In : timerfunc id, new frequency (Hz)
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: might change the main timer frequency
|
||||
*/
|
||||
int
|
||||
pc_adjust_int (int fid, unsigned int freq)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* are we installed? */
|
||||
if (!timer_installed) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
timer_func[fid].freq = freq;
|
||||
|
||||
/* scan for maximum frequency */
|
||||
freq = 0;
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
if (freq < t->freq) {
|
||||
freq = t->freq;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* update main timer / sons to match highest frequency */
|
||||
DISABLE();
|
||||
|
||||
/* using '>' is correct still (and avoids updating
|
||||
* the HW timer too often), but doesn't relax the timer!
|
||||
*/
|
||||
if (freq != timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
} else {
|
||||
ADJUST(timer_func[fid], timer_main.freq);
|
||||
}
|
||||
|
||||
ENABLE();
|
||||
|
||||
return 0;
|
||||
} ENDOFUNC(pc_adjust_int)
|
||||
|
||||
|
||||
/* Desc: install timer engine
|
||||
*
|
||||
* In : -
|
||||
* Out : 0 for success
|
||||
*
|
||||
* Note: initial frequency is 18.2 Hz
|
||||
*/
|
||||
static int
|
||||
install_timer (void)
|
||||
{
|
||||
if (timer_installed || pc_install_irq(TIMER_IRQ, timer)) {
|
||||
return -1;
|
||||
} else {
|
||||
memset(timer_func, 0, sizeof(timer_func));
|
||||
|
||||
LOCKDATA(timer_func);
|
||||
LOCKDATA(timer_main);
|
||||
LOCKFUNC(timer);
|
||||
LOCKFUNC(pc_adjust_int);
|
||||
LOCKFUNC(pc_remove_int);
|
||||
|
||||
timer_main.counter = 0x10000;
|
||||
|
||||
DISABLE();
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, 0);
|
||||
outportb(0x40, 0);
|
||||
timer_main.clock_ticks = 0;
|
||||
ENABLE();
|
||||
|
||||
pc_atexit(pc_remove_timer);
|
||||
timer_installed = TRUE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Desc: install timerfunc
|
||||
*
|
||||
* In : callback function, opaque pointer to be passed to callee, freq (Hz)
|
||||
* Out : timerfunc id (0 .. MAX_TIMERS-1)
|
||||
*
|
||||
* Note: returns -1 if error
|
||||
*/
|
||||
int
|
||||
pc_install_int (PFUNC func, void *parm, unsigned int freq)
|
||||
{
|
||||
int i;
|
||||
TIMER *t = NULL;
|
||||
|
||||
/* ensure the timer engine is set up */
|
||||
if (!timer_installed) {
|
||||
if (install_timer()) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* find an empty slot */
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (!timer_func[i].func) {
|
||||
t = &timer_func[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (t == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
DISABLE();
|
||||
|
||||
t->func = func;
|
||||
t->parm = parm;
|
||||
t->freq = freq;
|
||||
t->clock_ticks = 0;
|
||||
|
||||
/* update main timer / sons to match highest frequency */
|
||||
if (freq > timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
} else {
|
||||
/* t == &timer_func[i] */
|
||||
ADJUST(timer_func[i], timer_main.freq);
|
||||
}
|
||||
|
||||
i = t - timer_func;
|
||||
|
||||
ENABLE();
|
||||
|
||||
return i;
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutBitmapCharacter (void *font, int c)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
|
||||
if (c >= bfp->num || !(bcp = bfp->table[c]))
|
||||
return;
|
||||
|
||||
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
|
||||
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glBitmap(bcp->width, bcp->height, bcp->xorig, bcp->yorig,
|
||||
bcp->xmove, 0, bcp->bitmap);
|
||||
|
||||
glPopClientAttrib();
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutBitmapString (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
unsigned char c;
|
||||
|
||||
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
|
||||
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < bfp->num && (bcp = bfp->table[c]))
|
||||
glBitmap(bcp->width, bcp->height, bcp->xorig,
|
||||
bcp->yorig, bcp->xmove, 0, bcp->bitmap);
|
||||
}
|
||||
|
||||
glPopClientAttrib();
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapWidth (void *font, int c)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
|
||||
if (c >= bfp->num || !(bcp = bfp->table[c]))
|
||||
return 0;
|
||||
|
||||
return bcp->xmove;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapLength (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
unsigned char c;
|
||||
int length = 0;
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < bfp->num && (bcp = bfp->table[c]))
|
||||
length += bcp->xmove;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapHeight (void *font)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
|
||||
return bfp->height;
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
GLUTSShotCB _glut_timer_cb[MAX_TIMER_CB];
|
||||
|
||||
GLUTidleCB _glut_idle_func = NULL;
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDisplayFunc (GLUTdisplayCB func)
|
||||
{
|
||||
_glut_current->display = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutReshapeFunc (GLUTreshapeCB func)
|
||||
{
|
||||
_glut_current->reshape = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutKeyboardFunc (GLUTkeyboardCB func)
|
||||
{
|
||||
_glut_current->keyboard = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMouseFunc (GLUTmouseCB func)
|
||||
{
|
||||
_glut_current->mouse = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMotionFunc (GLUTmotionCB func)
|
||||
{
|
||||
_glut_current->motion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPassiveMotionFunc (GLUTpassiveCB func)
|
||||
{
|
||||
_glut_current->passive = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutEntryFunc (GLUTentryCB func)
|
||||
{
|
||||
_glut_current->entry = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutVisibilityFunc (GLUTvisibilityCB func)
|
||||
{
|
||||
_glut_current->visibility = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutWindowStatusFunc (GLUTwindowStatusCB func)
|
||||
{
|
||||
_glut_current->windowStatus = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutIdleFunc (GLUTidleCB func)
|
||||
{
|
||||
_glut_idle_func = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutTimerFunc (unsigned int millis, GLUTtimerCB func, int value)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (millis > 0) {
|
||||
for (i = 0; i < MAX_TIMER_CB; i++) {
|
||||
GLUTSShotCB *cb = &_glut_timer_cb[i];
|
||||
if (cb->func == NULL) {
|
||||
cb->value = value;
|
||||
cb->func = func;
|
||||
cb->time = glutGet(GLUT_ELAPSED_TIME) + millis;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpecialFunc (GLUTspecialCB func)
|
||||
{
|
||||
_glut_current->special = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballMotionFunc (GLUTspaceMotionCB func)
|
||||
{
|
||||
_glut_current->spaceMotion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballRotateFunc (GLUTspaceRotateCB func)
|
||||
{
|
||||
_glut_current->spaceRotate = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballButtonFunc (GLUTspaceButtonCB func)
|
||||
{
|
||||
_glut_current->spaceButton = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDialsFunc (GLUTdialsCB func)
|
||||
{
|
||||
_glut_current->dials = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutButtonBoxFunc (GLUTbuttonBoxCB func)
|
||||
{
|
||||
_glut_current->buttonBox = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutTabletMotionFunc (GLUTtabletMotionCB func)
|
||||
{
|
||||
_glut_current->tabletMotion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutTabletButtonFunc (GLUTtabletButtonCB func)
|
||||
{
|
||||
_glut_current->tabletButton = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutJoystickFunc (GLUTjoystickCB func, int interval)
|
||||
{
|
||||
_glut_current->joystick = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutKeyboardUpFunc (GLUTkeyboardCB func)
|
||||
{
|
||||
_glut_current->keyboardUp = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpecialUpFunc (GLUTspecialCB func)
|
||||
{
|
||||
_glut_current->specialUp = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMouseWheelFunc (GLUTmouseWheelCB func)
|
||||
{
|
||||
_glut_current->mouseWheel = func;
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
#define CLAMP(i) ((i) > 1.0F ? 1.0F : ((i) < 0.0F ? 0.0F : (i)))
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
|
||||
{
|
||||
if (_glut_default.mode & GLUT_INDEX) {
|
||||
if ((ndx >= 0) && (ndx < (256 - RESERVED_COLORS))) {
|
||||
DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GLfloat APIENTRY
|
||||
glutGetColor (int ndx, int component)
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutCopyColormap (int win)
|
||||
{
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutExtensionSupported (const char *extension)
|
||||
{
|
||||
static const GLubyte *extensions = NULL;
|
||||
const GLubyte *last, *where;
|
||||
|
||||
/* Extension names should not have spaces. */
|
||||
if (strchr(extension, ' ') || *extension == '\0') {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Not my problem if you don't have a valid OpenGL context */
|
||||
if (!extensions) {
|
||||
extensions = glGetString(GL_EXTENSIONS);
|
||||
}
|
||||
if (!extensions) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Take care of sub-strings etc. */
|
||||
for (last = extensions;;) {
|
||||
if ((where = (GLubyte *)strstr((const char *)last, extension)) == NULL) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
last = where + strlen(extension);
|
||||
if (where == extensions || *(where - 1) == ' ') {
|
||||
if (*last == ' ' || *last == '\0') {
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GLUTproc APIENTRY
|
||||
glutGetProcAddress (const char *procName)
|
||||
{
|
||||
/* TODO - handle glut namespace */
|
||||
return (GLUTproc)DMesaGetProcAddress(procName);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,223 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
char *__glutProgramName = NULL;
|
||||
|
||||
GLUTvisual _glut_visual = {
|
||||
16, 8, 16, 8, 16, /* bpp, alpha, depth, stencil, accum */
|
||||
|
||||
{ 0, 0 }, 0, /* geometry */
|
||||
|
||||
0 /* flags */
|
||||
};
|
||||
|
||||
GLUTdefault _glut_default = {
|
||||
0, 0, /* glutInitWindowPosition */
|
||||
300, 300, /* glutInitWindowSize */
|
||||
0 /* glutInitDisplayMode */
|
||||
};
|
||||
|
||||
GLuint _glut_fps = 0;
|
||||
|
||||
static char *init_string;
|
||||
|
||||
|
||||
void
|
||||
_glut_fatal (char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
fprintf(stderr, "GLUT: Fatal Error in %s: ",
|
||||
__glutProgramName ? __glutProgramName : "(unamed)");
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
putc('\n', stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* strdup is actually not a standard ANSI C or POSIX routine
|
||||
* so implement a private one for GLUT.
|
||||
*/
|
||||
static char *
|
||||
_glut_strdup (const char *string)
|
||||
{
|
||||
if (string != NULL) {
|
||||
int len = strlen(string) + 1;
|
||||
char *p = malloc(len);
|
||||
if (p != NULL) {
|
||||
return strcpy(p, string);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutInit (int *argc, char **argv)
|
||||
{
|
||||
char *str;
|
||||
const char *env;
|
||||
|
||||
if ((env = getenv("DMESA_GLUT_BPP")) != NULL) {
|
||||
_glut_visual.bpp = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_ALPHA")) != NULL) {
|
||||
_glut_visual.alpha = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_DEPTH")) != NULL) {
|
||||
_glut_visual.depth = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_STENCIL")) != NULL) {
|
||||
_glut_visual.stencil = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_ACCUM")) != NULL) {
|
||||
_glut_visual.accum = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_REFRESH")) != NULL) {
|
||||
_glut_visual.refresh = atoi(env);
|
||||
}
|
||||
|
||||
/* Determine program name. */
|
||||
str = strrchr(argv[0], '/');
|
||||
if (str == NULL) {
|
||||
str = argv[0];
|
||||
} else {
|
||||
str++;
|
||||
}
|
||||
__glutProgramName = _glut_strdup(str);
|
||||
|
||||
/* check if GLUT_FPS env var is set */
|
||||
if ((env = getenv("GLUT_FPS")) != NULL) {
|
||||
if ((_glut_fps = atoi(env)) <= 0) {
|
||||
_glut_fps = 5000; /* 5000 milliseconds */
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize timer */
|
||||
glutGet(GLUT_ELAPSED_TIME);
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutInitDisplayMode (unsigned int mode)
|
||||
{
|
||||
_glut_default.mode = mode;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutInitWindowPosition (int x, int y)
|
||||
{
|
||||
_glut_default.x = x;
|
||||
_glut_default.y = y;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutInitWindowSize (int width, int height)
|
||||
{
|
||||
_glut_default.width = width;
|
||||
_glut_default.height = height;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutInitDisplayString (const char *string)
|
||||
{
|
||||
init_string = _glut_strdup(string);
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetOption (GLenum pname, int value)
|
||||
{
|
||||
switch (pname) {
|
||||
case GLUT_INIT_WINDOW_X:
|
||||
_glut_default.x = value;
|
||||
break;
|
||||
case GLUT_INIT_WINDOW_Y:
|
||||
_glut_default.y = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutForceJoystickFunc (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutIgnoreKeyRepeat (int ignore)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetKeyRepeat (int repeatMode)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutVideoPan (int x, int y, int w, int h)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutVideoResizeGet( GLenum eWhat )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetupVideoResizing (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutStopVideoResizing (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutVideoResize (int x, int y, int w, int h)
|
||||
{
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef INTERNAL_H_included
|
||||
#define INTERNAL_H_included
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "GL/dmesa.h"
|
||||
|
||||
|
||||
#define MAX_WINDOWS 2
|
||||
#define MAX_TIMER_CB 8
|
||||
#define RESERVED_COLORS 0
|
||||
|
||||
|
||||
/* GLUT function types */
|
||||
typedef void (GLUTCALLBACK *GLUTdisplayCB) (void);
|
||||
typedef void (GLUTCALLBACK *GLUTreshapeCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTkeyboardCB) (unsigned char, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTmouseCB) (int, int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTmotionCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTpassiveCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTentryCB) (int);
|
||||
typedef void (GLUTCALLBACK *GLUTvisibilityCB) (int);
|
||||
typedef void (GLUTCALLBACK *GLUTwindowStatusCB) (int);
|
||||
typedef void (GLUTCALLBACK *GLUTidleCB) (void);
|
||||
typedef void (GLUTCALLBACK *GLUTtimerCB) (int);
|
||||
typedef void (GLUTCALLBACK *GLUTmenuStateCB) (int); /* DEPRECATED. */
|
||||
typedef void (GLUTCALLBACK *GLUTmenuStatusCB) (int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTselectCB) (int);
|
||||
typedef void (GLUTCALLBACK *GLUTspecialCB) (int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTspaceMotionCB) (int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTspaceRotateCB) (int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTspaceButtonCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTdialsCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTbuttonBoxCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTtabletMotionCB) (int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTtabletButtonCB) (int, int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTjoystickCB) (unsigned int, int, int, int);
|
||||
|
||||
typedef void (GLUTCALLBACK *GLUTdestroyCB) (void);
|
||||
typedef void (GLUTCALLBACK *GLUTmouseWheelCB) (int, int, int, int);
|
||||
typedef void (GLUTCALLBACK *GLUTmenuDestroyCB) (void);
|
||||
|
||||
|
||||
typedef struct {
|
||||
GLuint bpp, alpha;
|
||||
GLuint depth, stencil;
|
||||
GLuint accum;
|
||||
|
||||
GLint geometry[2];
|
||||
GLuint refresh;
|
||||
|
||||
GLint flags;
|
||||
} GLUTvisual;
|
||||
|
||||
typedef struct {
|
||||
GLint x, y;
|
||||
GLint width, height;
|
||||
GLuint mode;
|
||||
} GLUTdefault;
|
||||
|
||||
typedef struct {
|
||||
void (*func) (int);
|
||||
int value;
|
||||
int time;
|
||||
} GLUTSShotCB;
|
||||
|
||||
typedef struct GLUTwindow {
|
||||
int num; /* window id */
|
||||
|
||||
DMesaContext context;
|
||||
DMesaBuffer buffer;
|
||||
|
||||
int show_mouse;
|
||||
GLboolean redisplay;
|
||||
|
||||
/* GLUT settable or visible window state. */
|
||||
int xpos;
|
||||
int ypos;
|
||||
int width; /* window width in pixels */
|
||||
int height; /* window height in pixels */
|
||||
|
||||
/* Per-window callbacks. */
|
||||
GLUTdisplayCB display; /* redraw */
|
||||
GLUTreshapeCB reshape; /* resize (width,height) */
|
||||
GLUTmouseCB mouse; /* mouse (button,state,x,y) */
|
||||
GLUTmotionCB motion; /* motion (x,y) */
|
||||
GLUTpassiveCB passive; /* passive motion (x,y) */
|
||||
GLUTentryCB entry; /* window entry/exit (state) */
|
||||
GLUTkeyboardCB keyboard; /* keyboard (ASCII,x,y) */
|
||||
GLUTkeyboardCB keyboardUp; /* keyboard up (ASCII,x,y) */
|
||||
GLUTwindowStatusCB windowStatus; /* window status */
|
||||
GLUTvisibilityCB visibility; /* visibility */
|
||||
GLUTspecialCB special; /* special key */
|
||||
GLUTspecialCB specialUp; /* special up key */
|
||||
GLUTbuttonBoxCB buttonBox; /* button box */
|
||||
GLUTdialsCB dials; /* dials */
|
||||
GLUTspaceMotionCB spaceMotion; /* Spaceball motion */
|
||||
GLUTspaceRotateCB spaceRotate; /* Spaceball rotate */
|
||||
GLUTspaceButtonCB spaceButton; /* Spaceball button */
|
||||
GLUTtabletMotionCB tabletMotion; /* tablet motion */
|
||||
GLUTtabletButtonCB tabletButton; /* tablet button */
|
||||
GLUTjoystickCB joystick; /* joystick */
|
||||
|
||||
GLUTdestroyCB destroy; /* destroy */
|
||||
GLUTmouseWheelCB mouseWheel; /* mouse wheel */
|
||||
|
||||
/* specific data */
|
||||
void *data;
|
||||
} GLUTwindow;
|
||||
|
||||
typedef struct {
|
||||
int width, height;
|
||||
int xorig, yorig;
|
||||
int xmove;
|
||||
const unsigned char *bitmap;
|
||||
} GLUTBitmapChar;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
int height;
|
||||
int num;
|
||||
const GLUTBitmapChar *const *table;
|
||||
} GLUTBitmapFont;
|
||||
|
||||
typedef struct {
|
||||
const GLfloat x, y;
|
||||
} GLUTStrokeVertex;
|
||||
|
||||
typedef struct {
|
||||
const unsigned num;
|
||||
const GLUTStrokeVertex *vertex;
|
||||
} GLUTStrokeStrip;
|
||||
|
||||
typedef struct {
|
||||
const GLfloat right;
|
||||
const unsigned num;
|
||||
const GLUTStrokeStrip *strip;
|
||||
} GLUTStrokeChar;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const unsigned num;
|
||||
const GLUTStrokeChar *const *table;
|
||||
const GLfloat height;
|
||||
const GLfloat descent;
|
||||
} GLUTStrokeFont;
|
||||
|
||||
|
||||
extern char *__glutProgramName;
|
||||
|
||||
extern GLUTvisual _glut_visual;
|
||||
extern GLUTdefault _glut_default;
|
||||
|
||||
extern GLuint _glut_fps;
|
||||
extern GLUTidleCB _glut_idle_func;
|
||||
extern GLUTmenuStatusCB _glut_menu_status_func;
|
||||
extern GLUTSShotCB _glut_timer_cb[];
|
||||
|
||||
extern GLUTwindow *_glut_current, *_glut_windows[];
|
||||
|
||||
extern int _glut_mouse; /* number of buttons, if mouse installed */
|
||||
extern int _glut_mouse_x, _glut_mouse_y; /* mouse coords, relative to current win */
|
||||
|
||||
|
||||
extern void _glut_mouse_init (void);
|
||||
extern void _glut_fatal(char *format,...);
|
||||
extern void *_glut_font (void *font);
|
||||
|
||||
|
||||
#include "pc_hw/pc_hw.h"
|
||||
|
||||
#endif
|
||||
@@ -1,245 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
#include "GL/dmesa.h"
|
||||
|
||||
#include "PC_HW/pc_hw.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
static int looping = 0;
|
||||
|
||||
|
||||
#define DO_REDISPLAY(w, ccin, ccout) \
|
||||
do { \
|
||||
if (w->redisplay && w->display) { \
|
||||
int rv = GL_TRUE; \
|
||||
\
|
||||
idle = GL_FALSE; \
|
||||
w->redisplay = GL_FALSE; \
|
||||
\
|
||||
/* test IN condition (whether we need to `MakeCurrent') */\
|
||||
if (ccin) { \
|
||||
rv = DMesaMakeCurrent(w->context, w->buffer); \
|
||||
} \
|
||||
\
|
||||
/* do the display only if `MakeCurrent' didn't failed */ \
|
||||
if (rv) { \
|
||||
if (w->show_mouse && !(_glut_default.mode & GLUT_DOUBLE)) {\
|
||||
/* XXX scare mouse */ \
|
||||
w->display(); \
|
||||
/* XXX unscare mouse */ \
|
||||
} else { \
|
||||
w->display(); \
|
||||
} \
|
||||
\
|
||||
/* update OUT condition */ \
|
||||
ccout; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMainLoopEvent (void)
|
||||
{
|
||||
int i, n;
|
||||
GLUTwindow *w;
|
||||
GLboolean idle;
|
||||
static int old_mouse_x = 0;
|
||||
static int old_mouse_y = 0;
|
||||
static int old_mouse_b = 0;
|
||||
|
||||
static GLboolean virgin = GL_TRUE;
|
||||
if (virgin) {
|
||||
pc_install_keyb();
|
||||
_glut_mouse_init();
|
||||
|
||||
for (i = 0; i < MAX_WINDOWS; i++) {
|
||||
w = _glut_windows[i];
|
||||
if (w != NULL) {
|
||||
glutSetWindow(w->num);
|
||||
glutPostRedisplay();
|
||||
if (w->reshape) {
|
||||
w->reshape(w->width, w->height);
|
||||
}
|
||||
if (w->visibility) {
|
||||
w->visibility(GLUT_VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
virgin = GL_FALSE;
|
||||
}
|
||||
|
||||
idle = GL_TRUE;
|
||||
|
||||
n = 0;
|
||||
for (i = 0; i < MAX_WINDOWS; i++) {
|
||||
w = _glut_windows[i];
|
||||
if ((w != NULL) && (w != _glut_current)) {
|
||||
/* 1) redisplay `w'
|
||||
* 2) `MakeCurrent' always
|
||||
* 3) update number of non-default windows
|
||||
*/
|
||||
DO_REDISPLAY(w, GL_TRUE, n++);
|
||||
}
|
||||
}
|
||||
/* 1) redisplay `_glut_current'
|
||||
* 2) `MakeCurrent' only if we previously did non-default windows
|
||||
* 3) don't update anything
|
||||
*/
|
||||
DO_REDISPLAY(_glut_current, n, n);
|
||||
|
||||
if (_glut_mouse) {
|
||||
int mouse_x;
|
||||
int mouse_y;
|
||||
int mouse_z;
|
||||
int mouse_b;
|
||||
|
||||
/* query mouse */
|
||||
mouse_b = pc_query_mouse(&mouse_x, &mouse_y, &mouse_z);
|
||||
|
||||
/* relative to window coordinates */
|
||||
_glut_mouse_x = mouse_x - _glut_current->xpos;
|
||||
_glut_mouse_y = mouse_y - _glut_current->ypos;
|
||||
|
||||
/* mouse was moved? */
|
||||
if ((mouse_x != old_mouse_x) || (mouse_y != old_mouse_y)) {
|
||||
idle = GL_FALSE;
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
|
||||
if (mouse_b) {
|
||||
/* any button pressed */
|
||||
if (_glut_current->motion) {
|
||||
_glut_current->motion(_glut_mouse_x, _glut_mouse_y);
|
||||
}
|
||||
} else {
|
||||
/* no button pressed */
|
||||
if (_glut_current->passive) {
|
||||
_glut_current->passive(_glut_mouse_x, _glut_mouse_y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* button state changed? */
|
||||
if (mouse_b != old_mouse_b) {
|
||||
GLUTmouseCB mouse_func;
|
||||
|
||||
if ((mouse_func = _glut_current->mouse)) {
|
||||
if ((old_mouse_b & 1) && !(mouse_b & 1))
|
||||
mouse_func(GLUT_LEFT_BUTTON, GLUT_UP, _glut_mouse_x, _glut_mouse_y);
|
||||
else if (!(old_mouse_b & 1) && (mouse_b & 1))
|
||||
mouse_func(GLUT_LEFT_BUTTON, GLUT_DOWN, _glut_mouse_x, _glut_mouse_y);
|
||||
|
||||
if ((old_mouse_b & 2) && !(mouse_b & 2))
|
||||
mouse_func(GLUT_RIGHT_BUTTON, GLUT_UP, _glut_mouse_x, _glut_mouse_y);
|
||||
else if (!(old_mouse_b & 2) && (mouse_b & 2))
|
||||
mouse_func(GLUT_RIGHT_BUTTON, GLUT_DOWN, _glut_mouse_x, _glut_mouse_y);
|
||||
|
||||
if ((old_mouse_b & 4) && !(mouse_b & 4))
|
||||
mouse_func(GLUT_MIDDLE_BUTTON, GLUT_UP, _glut_mouse_x, _glut_mouse_y);
|
||||
else if (!(old_mouse_b & 3) && (mouse_b & 4))
|
||||
mouse_func(GLUT_MIDDLE_BUTTON, GLUT_DOWN, _glut_mouse_x, _glut_mouse_y);
|
||||
}
|
||||
|
||||
idle = GL_FALSE;
|
||||
old_mouse_b = mouse_b;
|
||||
}
|
||||
}
|
||||
|
||||
if (pc_keypressed()) {
|
||||
int key;
|
||||
int glut_key;
|
||||
|
||||
idle = GL_FALSE;
|
||||
key = pc_readkey();
|
||||
|
||||
switch (key>>16) {
|
||||
case KEY_F1: glut_key = GLUT_KEY_F1; goto special;
|
||||
case KEY_F2: glut_key = GLUT_KEY_F2; goto special;
|
||||
case KEY_F3: glut_key = GLUT_KEY_F3; goto special;
|
||||
case KEY_F4: glut_key = GLUT_KEY_F4; goto special;
|
||||
case KEY_F5: glut_key = GLUT_KEY_F5; goto special;
|
||||
case KEY_F6: glut_key = GLUT_KEY_F6; goto special;
|
||||
case KEY_F7: glut_key = GLUT_KEY_F7; goto special;
|
||||
case KEY_F8: glut_key = GLUT_KEY_F8; goto special;
|
||||
case KEY_F9: glut_key = GLUT_KEY_F9; goto special;
|
||||
case KEY_F10: glut_key = GLUT_KEY_F10; goto special;
|
||||
case KEY_F11: glut_key = GLUT_KEY_F11; goto special;
|
||||
case KEY_F12: glut_key = GLUT_KEY_F12; goto special;
|
||||
case KEY_LEFT: glut_key = GLUT_KEY_LEFT; goto special;
|
||||
case KEY_UP: glut_key = GLUT_KEY_UP; goto special;
|
||||
case KEY_RIGHT: glut_key = GLUT_KEY_RIGHT; goto special;
|
||||
case KEY_DOWN: glut_key = GLUT_KEY_DOWN; goto special;
|
||||
case KEY_PGUP: glut_key = GLUT_KEY_PAGE_UP; goto special;
|
||||
case KEY_PGDN: glut_key = GLUT_KEY_PAGE_DOWN; goto special;
|
||||
case KEY_HOME: glut_key = GLUT_KEY_HOME; goto special;
|
||||
case KEY_END: glut_key = GLUT_KEY_END; goto special;
|
||||
case KEY_INSERT: glut_key = GLUT_KEY_INSERT; goto special;
|
||||
special:
|
||||
if (_glut_current->special) {
|
||||
_glut_current->special(glut_key, _glut_mouse_x, _glut_mouse_y);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (_glut_current->keyboard) {
|
||||
_glut_current->keyboard(key & 0xFF, _glut_mouse_x, _glut_mouse_y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (idle && _glut_idle_func)
|
||||
_glut_idle_func();
|
||||
|
||||
for (i = 0; i < MAX_TIMER_CB; i++) {
|
||||
int time = glutGet(GLUT_ELAPSED_TIME);
|
||||
GLUTSShotCB *cb = &_glut_timer_cb[i];
|
||||
if (cb->func && (time >= cb->time)) {
|
||||
cb->func(cb->value);
|
||||
cb->func = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMainLoop (void)
|
||||
{
|
||||
looping++;
|
||||
while (looping) {
|
||||
glutMainLoopEvent();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutLeaveMainLoop (void)
|
||||
{
|
||||
looping--;
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
GLUTmenuStatusCB _glut_menu_status_func = NULL;
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMenuStateFunc (GLUTmenuStateCB func)
|
||||
{
|
||||
_glut_menu_status_func = (GLUTmenuStatusCB)func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMenuStatusFunc (GLUTmenuStatusCB func)
|
||||
{
|
||||
_glut_menu_status_func = func;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutCreateMenu (GLUTselectCB func)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDestroyMenu (int menu)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutGetMenu (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetMenu (int menu)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutAddMenuEntry (const char *label, int value)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutAddSubMenu (const char *label, int submenu)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutChangeToMenuEntry (int item, const char *label, int value)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutChangeToSubMenu (int item, const char *label, int submenu)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutRemoveMenuItem (int item)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutAttachMenu (int button)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDetachMenu (int button)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMenuDestroyFunc ( void (* callback)( void ) )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void * APIENTRY
|
||||
glutGetMenuData (void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetMenuData (void *data)
|
||||
{
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
int _glut_mouse;
|
||||
int _glut_mouse_x = 0, _glut_mouse_y = 0;
|
||||
|
||||
|
||||
void
|
||||
_glut_mouse_init (void)
|
||||
{
|
||||
if ((_glut_mouse = pc_install_mouse())) {
|
||||
pc_mouse_area(_glut_current->xpos, _glut_current->ypos, _glut_current->xpos + _glut_current->width - 1, _glut_current->ypos + _glut_current->height - 1);
|
||||
|
||||
_glut_current->show_mouse = (_glut_current->mouse || _glut_current->motion || _glut_current->passive);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetCursor (int cursor)
|
||||
{
|
||||
/* XXX completely futile until full mouse support (maybe never) */
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutWarpPointer (int x, int y)
|
||||
{
|
||||
pc_warp_mouse(x, y);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutLayerGet (GLenum info)
|
||||
{
|
||||
switch (info) {
|
||||
case GLUT_OVERLAY_POSSIBLE:
|
||||
case GLUT_HAS_OVERLAY:
|
||||
return GL_FALSE;
|
||||
case GLUT_LAYER_IN_USE:
|
||||
return GLUT_NORMAL;
|
||||
case GLUT_NORMAL_DAMAGED:
|
||||
return GL_FALSE;
|
||||
case GLUT_OVERLAY_DAMAGED:
|
||||
case GLUT_TRANSPARENT_INDEX:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutOverlayDisplayFunc (GLUTdisplayCB func)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutEstablishOverlay (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutRemoveOverlay (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutUseLayer (GLenum layer)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPostOverlayRedisplay (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutShowOverlay (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutHideOverlay (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPostWindowOverlayRedisplay (int win)
|
||||
{
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,238 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
#define FREQUENCY 100 /* set this to zero to use the default timer */
|
||||
|
||||
|
||||
static int timer_installed;
|
||||
#if FREQUENCY
|
||||
static volatile int ticks;
|
||||
|
||||
|
||||
static void
|
||||
ticks_timer (void *p)
|
||||
{
|
||||
(void)p;
|
||||
ticks++;
|
||||
} ENDOFUNC(ticks_timer)
|
||||
#else
|
||||
#include <time.h>
|
||||
|
||||
static struct timeval then;
|
||||
#endif
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutGet (GLenum type)
|
||||
{
|
||||
switch (type) {
|
||||
case GLUT_WINDOW_X:
|
||||
return _glut_current->xpos;
|
||||
case GLUT_WINDOW_Y:
|
||||
return _glut_current->ypos;
|
||||
case GLUT_WINDOW_WIDTH:
|
||||
return _glut_current->width;
|
||||
case GLUT_WINDOW_HEIGHT:
|
||||
return _glut_current->height;
|
||||
case GLUT_WINDOW_STENCIL_SIZE:
|
||||
return _glut_visual.stencil;
|
||||
case GLUT_WINDOW_DEPTH_SIZE:
|
||||
return _glut_visual.depth;
|
||||
case GLUT_WINDOW_RGBA:
|
||||
return !(_glut_default.mode & GLUT_INDEX);
|
||||
case GLUT_WINDOW_COLORMAP_SIZE:
|
||||
return (_glut_default.mode & GLUT_INDEX) ? (256 - RESERVED_COLORS) : 0;
|
||||
case GLUT_SCREEN_WIDTH:
|
||||
return _glut_visual.geometry[0];
|
||||
case GLUT_SCREEN_HEIGHT:
|
||||
return _glut_visual.geometry[1];
|
||||
case GLUT_INIT_WINDOW_X:
|
||||
return _glut_default.x;
|
||||
case GLUT_INIT_WINDOW_Y:
|
||||
return _glut_default.y;
|
||||
case GLUT_INIT_WINDOW_WIDTH:
|
||||
return _glut_default.width;
|
||||
case GLUT_INIT_WINDOW_HEIGHT:
|
||||
return _glut_default.height;
|
||||
case GLUT_INIT_DISPLAY_MODE:
|
||||
return _glut_default.mode;
|
||||
case GLUT_ELAPSED_TIME:
|
||||
#if FREQUENCY
|
||||
if (!timer_installed) {
|
||||
timer_installed = GL_TRUE;
|
||||
LOCKDATA(ticks);
|
||||
LOCKFUNC(ticks_timer);
|
||||
pc_install_int(ticks_timer, NULL, FREQUENCY);
|
||||
}
|
||||
return ticks * 1000 / FREQUENCY;
|
||||
#else
|
||||
if (!timer_installed) {
|
||||
timer_installed = GL_TRUE;
|
||||
gettimeofday(&then, NULL);
|
||||
return 0;
|
||||
} else {
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
return (now.tv_usec - then.tv_usec) / 1000 +
|
||||
(now.tv_sec - then.tv_sec) * 1000;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutDeviceGet (GLenum type)
|
||||
{
|
||||
switch (type) {
|
||||
case GLUT_HAS_KEYBOARD:
|
||||
return GL_TRUE;
|
||||
case GLUT_HAS_MOUSE:
|
||||
return (_glut_mouse != 0);
|
||||
case GLUT_NUM_MOUSE_BUTTONS:
|
||||
return _glut_mouse;
|
||||
case GLUT_HAS_SPACEBALL:
|
||||
case GLUT_HAS_DIAL_AND_BUTTON_BOX:
|
||||
case GLUT_HAS_TABLET:
|
||||
return GL_FALSE;
|
||||
case GLUT_NUM_SPACEBALL_BUTTONS:
|
||||
case GLUT_NUM_BUTTON_BOX_BUTTONS:
|
||||
case GLUT_NUM_DIALS:
|
||||
case GLUT_NUM_TABLET_BUTTONS:
|
||||
return 0;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutGetModifiers (void)
|
||||
{
|
||||
int mod = 0;
|
||||
int shifts = pc_keyshifts();
|
||||
|
||||
if (shifts & (KB_SHIFT_FLAG | KB_CAPSLOCK_FLAG)) {
|
||||
mod |= GLUT_ACTIVE_SHIFT;
|
||||
}
|
||||
|
||||
if (shifts & KB_ALT_FLAG) {
|
||||
mod |= GLUT_ACTIVE_ALT;
|
||||
}
|
||||
|
||||
if (shifts & KB_CTRL_FLAG) {
|
||||
mod |= GLUT_ACTIVE_CTRL;
|
||||
}
|
||||
|
||||
return mod;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutReportErrors (void)
|
||||
{
|
||||
/* reports all the OpenGL errors that happened till now */
|
||||
}
|
||||
|
||||
|
||||
/* GAME MODE
|
||||
* Hack alert: incomplete... what is GameMode, anyway?
|
||||
*/
|
||||
static GLint game;
|
||||
static GLboolean game_possible;
|
||||
static GLboolean game_active;
|
||||
static GLuint game_width;
|
||||
static GLuint game_height;
|
||||
static GLuint game_bpp;
|
||||
static GLuint game_refresh;
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutGameModeString (const char *string)
|
||||
{
|
||||
if (sscanf(string, "%ux%u:%u@%u", &game_width, &game_height, &game_bpp, &game_refresh) == 4) {
|
||||
game_possible = GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutGameModeGet (GLenum mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case GLUT_GAME_MODE_ACTIVE:
|
||||
return game_active;
|
||||
case GLUT_GAME_MODE_POSSIBLE:
|
||||
return game_possible && !_glut_current;
|
||||
case GLUT_GAME_MODE_WIDTH:
|
||||
return game_active ? (int)game_width : -1;
|
||||
case GLUT_GAME_MODE_HEIGHT:
|
||||
return game_active ? (int)game_height : -1;
|
||||
case GLUT_GAME_MODE_PIXEL_DEPTH:
|
||||
return game_active ? (int)game_bpp : -1;
|
||||
case GLUT_GAME_MODE_REFRESH_RATE:
|
||||
return game_active ? (int)game_refresh : -1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutEnterGameMode (void)
|
||||
{
|
||||
if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {
|
||||
_glut_visual.bpp = game_bpp;
|
||||
_glut_visual.refresh = game_refresh;
|
||||
|
||||
glutInitWindowSize(game_width, game_height);
|
||||
|
||||
if ((game = glutCreateWindow("<game>")) > 0) {
|
||||
game_active = GL_TRUE;
|
||||
}
|
||||
|
||||
return game;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutLeaveGameMode (void)
|
||||
{
|
||||
if (glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) {
|
||||
game_active = GL_FALSE;
|
||||
|
||||
glutDestroyWindow(game);
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
* FxGLUT version 0.12 - GLUT for Voodoo 1 and 2 under Linux
|
||||
* Copyright (C) 1999 Christopher John Purnell
|
||||
* cjp@lost.org.uk
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
void
|
||||
glutStrokeCharacter (void *font, int c)
|
||||
{
|
||||
const GLUTStrokeFont *sfp = _glut_font(font);
|
||||
const GLUTStrokeChar *scp;
|
||||
const GLUTStrokeStrip *ssp;
|
||||
const GLUTStrokeVertex *svp;
|
||||
unsigned i, j;
|
||||
|
||||
if (((unsigned)c) >= sfp->num || !(scp = sfp->table[c]))
|
||||
return;
|
||||
|
||||
ssp = scp->strip;
|
||||
|
||||
for (i = 0; i < scp->num; i++, ssp++) {
|
||||
svp = ssp->vertex;
|
||||
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (j = 0; j < ssp->num; j++, svp++) {
|
||||
glVertex2f(svp->x, svp->y);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
glTranslatef(scp->right, 0.0, 0.0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
glutStrokeString (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTStrokeFont *sfp = _glut_font(font);
|
||||
const GLUTStrokeChar *scp;
|
||||
const GLUTStrokeStrip *ssp;
|
||||
const GLUTStrokeVertex *svp;
|
||||
unsigned char c;
|
||||
unsigned i, j;
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < sfp->num && (scp = sfp->table[c])) {
|
||||
ssp = scp->strip;
|
||||
|
||||
for (i = 0; i < scp->num; i++, ssp++) {
|
||||
svp = ssp->vertex;
|
||||
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (j = 0; j < ssp->num; j++, svp++) {
|
||||
glVertex2f(svp->x, svp->y);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
glTranslatef(scp->right, 0.0, 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
glutStrokeWidth (void *font, int c)
|
||||
{
|
||||
const GLUTStrokeFont *sfp = _glut_font(font);
|
||||
const GLUTStrokeChar *scp;
|
||||
|
||||
if (((unsigned)c) >= sfp->num || !(scp = sfp->table[c]))
|
||||
return 0;
|
||||
|
||||
return scp->right;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
glutStrokeLength (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTStrokeFont *sfp = _glut_font(font);
|
||||
const GLUTStrokeChar *scp;
|
||||
unsigned char c;
|
||||
int length = 0;
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < sfp->num && (scp = sfp->table[c]))
|
||||
length += scp->right;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
GLfloat
|
||||
glutStrokeHeight (void *font)
|
||||
{
|
||||
const GLUTStrokeFont *sfp = _glut_font(font);
|
||||
|
||||
return sfp->height;
|
||||
}
|
||||
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* (c) Copyright 1993, Silicon Graphics, Inc.
|
||||
*
|
||||
* ALL RIGHTS RESERVED
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software
|
||||
* for any purpose and without fee is hereby granted, provided
|
||||
* that the above copyright notice appear in all copies and that
|
||||
* both the copyright notice and this permission notice appear in
|
||||
* supporting documentation, and that the name of Silicon
|
||||
* Graphics, Inc. not be used in advertising or publicity
|
||||
* pertaining to distribution of the software without specific,
|
||||
* written prior permission.
|
||||
*
|
||||
* THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
|
||||
* "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
|
||||
* OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
|
||||
* EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
|
||||
* ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
|
||||
* INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
|
||||
* SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
|
||||
* NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* US Government Users Restricted Rights
|
||||
*
|
||||
* Use, duplication, or disclosure by the Government is subject to
|
||||
* restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
||||
* (c)(1)(ii) of the Rights in Technical Data and Computer
|
||||
* Software clause at DFARS 252.227-7013 and/or in similar or
|
||||
* successor clauses in the FAR or the DOD or NASA FAR
|
||||
* Supplement. Unpublished-- rights reserved under the copyright
|
||||
* laws of the United States. Contractor/manufacturer is Silicon
|
||||
* Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
|
||||
* 94039-7311.
|
||||
*
|
||||
* OpenGL(TM) is a trademark of Silicon Graphics, Inc.
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
/*
|
||||
* Rim, body, lid, and bottom data must be reflected in x and y;
|
||||
* handle and spout data across the y axis only.
|
||||
*/
|
||||
static int patchdata[][16] =
|
||||
{
|
||||
{ 102, 103, 104, 105, 4, 5, 6, 7,
|
||||
8, 9, 10, 11, 12, 13, 14, 15 }, /* rim */
|
||||
{ 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20, 21, 22, 23, 24, 25, 26, 27 }, /* body */
|
||||
{ 24, 25, 26, 27, 29, 30, 31, 32,
|
||||
33, 34, 35, 36, 37, 38, 39, 40 },
|
||||
{ 96, 96, 96, 96, 97, 98, 99, 100,
|
||||
101, 101, 101, 101, 0, 1, 2, 3 }, /* lid */
|
||||
{ 0, 1, 2, 3, 106, 107, 108, 109,
|
||||
110, 111, 112, 113, 114, 115, 116, 117 },
|
||||
{ 118, 118, 118, 118, 124, 122, 119, 121,
|
||||
123, 126, 125, 120, 40, 39, 38, 37 }, /* bottom */
|
||||
{ 41, 42, 43, 44, 45, 46, 47, 48,
|
||||
49, 50, 51, 52, 53, 54, 55, 56 }, /* handle */
|
||||
{ 53, 54, 55, 56, 57, 58, 59, 60,
|
||||
61, 62, 63, 64, 28, 65, 66, 67 },
|
||||
{ 68, 69, 70, 71, 72, 73, 74, 75,
|
||||
76, 77, 78, 79, 80, 81, 82, 83 }, /* spout */
|
||||
{ 80, 81, 82, 83, 84, 85, 86, 87,
|
||||
88, 89, 90, 91, 92, 93, 94, 95 }
|
||||
};
|
||||
|
||||
static float cpdata[][3] =
|
||||
{
|
||||
{0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7},
|
||||
{0,-0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
|
||||
{0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125},
|
||||
{1.4375, 0, 2.53125}, {1.4375, -0.805, 2.53125},
|
||||
{0.805, -1.4375, 2.53125}, {0, -1.4375, 2.53125},
|
||||
{1.5, 0, 2.4}, {1.5, -0.84, 2.4}, {0.84, -1.5, 2.4},
|
||||
{0, -1.5, 2.4}, {1.75, 0, 1.875}, {1.75, -0.98, 1.875},
|
||||
{0.98, -1.75, 1.875}, {0, -1.75, 1.875}, {2, 0, 1.35},
|
||||
{2, -1.12, 1.35}, {1.12, -2, 1.35}, {0, -2, 1.35}, {2, 0, 0.9},
|
||||
{2, -1.12, 0.9}, {1.12, -2, 0.9}, {0, -2, 0.9}, {-2, 0, 0.9},
|
||||
{2, 0, 0.45}, {2, -1.12, 0.45}, {1.12, -2, 0.45}, {0, -2, 0.45},
|
||||
{1.5, 0, 0.225}, {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225},
|
||||
{0, -1.5, 0.225}, {1.5, 0, 0.15}, {1.5, -0.84, 0.15},
|
||||
{0.84, -1.5, 0.15}, {0, -1.5, 0.15}, {-1.6, 0, 2.025},
|
||||
{-1.6, -0.3, 2.025}, {-1.5, -0.3, 2.25}, {-1.5, 0, 2.25},
|
||||
{-2.3, 0, 2.025}, {-2.3, -0.3, 2.025}, {-2.5, -0.3, 2.25},
|
||||
{-2.5, 0, 2.25}, {-2.7, 0, 2.025}, {-2.7, -0.3, 2.025},
|
||||
{-3, -0.3, 2.25}, {-3, 0, 2.25}, {-2.7, 0, 1.8},
|
||||
{-2.7, -0.3, 1.8}, {-3, -0.3, 1.8}, {-3, 0, 1.8},
|
||||
{-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3, -0.3, 1.35},
|
||||
{-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3, 1.125},
|
||||
{-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2, -0.3, 0.9},
|
||||
{-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0, 1.425},
|
||||
{1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0, 0.6},
|
||||
{2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66, 0.825},
|
||||
{3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
|
||||
{2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4},
|
||||
{2.7, -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4},
|
||||
{2.8, 0, 2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
|
||||
{3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
|
||||
{3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
|
||||
{2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4},
|
||||
{0, 0, 3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15},
|
||||
{0.45, -0.8, 3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4},
|
||||
{1.4, -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4},
|
||||
{0.4, 0, 2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55},
|
||||
{0, -0.4, 2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55},
|
||||
{0.728, -1.3, 2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4},
|
||||
{1.3, -0.728, 2.4}, {0.728, -1.3, 2.4}, {0, -1.3, 2.4},
|
||||
{0, 0, 0}, {1.425, -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0},
|
||||
{0.798, -1.425, 0}, {0, -1.5, 0.075}, {0, -1.425, 0},
|
||||
{1.5, -0.84, 0.075}, {0.84, -1.5, 0.075}
|
||||
};
|
||||
|
||||
static float tex[2][2][2] =
|
||||
{
|
||||
{ {0, 0}, {1, 0} },
|
||||
{ {0, 1}, {1, 1} }
|
||||
};
|
||||
|
||||
static void teapot( GLint grid, GLdouble scale, GLenum type )
|
||||
{
|
||||
float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
|
||||
long i, j, k, l;
|
||||
|
||||
glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT );
|
||||
glEnable( GL_AUTO_NORMAL );
|
||||
glEnable( GL_NORMALIZE );
|
||||
glEnable( GL_MAP2_VERTEX_3 );
|
||||
glEnable( GL_MAP2_TEXTURE_COORD_2 );
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(270.0, 1.0, 0.0, 0.0);
|
||||
glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
|
||||
glTranslatef(0.0, 0.0, -1.5);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
for (k = 0; k < 4; k++)
|
||||
{
|
||||
for (l = 0; l < 3; l++)
|
||||
{
|
||||
p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||
q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||
if (l == 1)
|
||||
q[j][k][l] *= -1.0;
|
||||
if (i < 6)
|
||||
{
|
||||
r[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||
if (l == 0)
|
||||
r[j][k][l] *= -1.0;
|
||||
s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||
if (l == 0)
|
||||
s[j][k][l] *= -1.0;
|
||||
if (l == 1)
|
||||
s[j][k][l] *= -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
|
||||
&tex[0][0][0]);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&p[0][0][0]);
|
||||
glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&q[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
if (i < 6)
|
||||
{
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&r[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&s[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
}
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
void glutWireTeapot(GLdouble size)
|
||||
{
|
||||
teapot(10, size, GL_LINE);
|
||||
}
|
||||
|
||||
void glutSolidTeapot(GLdouble size)
|
||||
{
|
||||
teapot(7, size, GL_FILL);
|
||||
}
|
||||
-1018
File diff suppressed because it is too large
Load Diff
-1301
File diff suppressed because it is too large
Load Diff
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
extern GLUTStrokeFont glutStrokeRoman, glutStrokeMonoRoman;
|
||||
extern GLUTBitmapFont glutBitmap8By13, glutBitmap9By15, glutBitmapTimesRoman10, glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12, glutBitmapHelvetica18;
|
||||
|
||||
/* To get around the fact that DJGPP DXEs only allow functions
|
||||
to be exported and no data addresses (as Unix DSOs support), the
|
||||
GLUT API constants such as GLUT_STROKE_ROMAN have to get passed
|
||||
through a case statement to get mapped to the actual data structure
|
||||
address. */
|
||||
void *
|
||||
_glut_font (void *font)
|
||||
{
|
||||
switch ((int)font) {
|
||||
case (int)GLUT_STROKE_ROMAN:
|
||||
return &glutStrokeRoman;
|
||||
case (int)GLUT_STROKE_MONO_ROMAN:
|
||||
return &glutStrokeMonoRoman;
|
||||
case (int)GLUT_BITMAP_9_BY_15:
|
||||
return &glutBitmap9By15;
|
||||
case (int)GLUT_BITMAP_8_BY_13:
|
||||
return &glutBitmap8By13;
|
||||
case (int)GLUT_BITMAP_TIMES_ROMAN_10:
|
||||
return &glutBitmapTimesRoman10;
|
||||
case (int)GLUT_BITMAP_TIMES_ROMAN_24:
|
||||
return &glutBitmapTimesRoman24;
|
||||
case (int)GLUT_BITMAP_HELVETICA_10:
|
||||
return &glutBitmapHelvetica10;
|
||||
case (int)GLUT_BITMAP_HELVETICA_12:
|
||||
return &glutBitmapHelvetica12;
|
||||
case (int)GLUT_BITMAP_HELVETICA_18:
|
||||
return &glutBitmapHelvetica18;
|
||||
default:
|
||||
if ((font == &glutStrokeRoman) ||
|
||||
(font == &glutStrokeMonoRoman) ||
|
||||
(font == &glutBitmap9By15) ||
|
||||
(font == &glutBitmap8By13) ||
|
||||
(font == &glutBitmapTimesRoman10) ||
|
||||
(font == &glutBitmapTimesRoman24) ||
|
||||
(font == &glutBitmapHelvetica10) ||
|
||||
(font == &glutBitmapHelvetica12) ||
|
||||
(font == &glutBitmapHelvetica18)) {
|
||||
return font;
|
||||
}
|
||||
_glut_fatal("bad font!");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -1,329 +0,0 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
static GLuint swaptime, swapcount;
|
||||
|
||||
static DMesaVisual visual = NULL;
|
||||
|
||||
GLUTwindow *_glut_current, *_glut_windows[MAX_WINDOWS];
|
||||
|
||||
|
||||
static void
|
||||
clean (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=1; i<=MAX_WINDOWS; i++) {
|
||||
glutDestroyWindow(i);
|
||||
}
|
||||
if (visual) DMesaDestroyVisual(visual);
|
||||
|
||||
pc_close_stdout();
|
||||
pc_close_stderr();
|
||||
}
|
||||
|
||||
|
||||
static GLUTwindow *
|
||||
_glut_window (int win)
|
||||
{
|
||||
if (win > 0 && --win < MAX_WINDOWS) {
|
||||
return _glut_windows[win];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutCreateWindow (const char *title)
|
||||
{
|
||||
int i;
|
||||
int m8width = (_glut_default.width + 7) & ~7;
|
||||
|
||||
if (!(_glut_default.mode & GLUT_DOUBLE)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We set the Visual once. This will be our desktop (graphic mode).
|
||||
* We should do this in the `glutInit' code, but we don't have any idea
|
||||
* about its geometry. Supposedly, when we are about to create one
|
||||
* window, we have a slight idea about resolution.
|
||||
*/
|
||||
if (!visual) {
|
||||
if ((visual=DMesaCreateVisual(_glut_default.x + m8width, _glut_default.y + _glut_default.height, _glut_visual.bpp, _glut_visual.refresh,
|
||||
GLUT_SINGLE,
|
||||
!(_glut_default.mode & GLUT_INDEX),
|
||||
(_glut_default.mode & GLUT_ALPHA ) ? _glut_visual.alpha : 0,
|
||||
(_glut_default.mode & GLUT_DEPTH ) ? _glut_visual.depth : 0,
|
||||
(_glut_default.mode & GLUT_STENCIL) ? _glut_visual.stencil : 0,
|
||||
(_glut_default.mode & GLUT_ACCUM ) ? _glut_visual.accum : 0))==NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
DMesaGetIntegerv(DMESA_GET_SCREEN_SIZE, _glut_visual.geometry);
|
||||
DMesaGetIntegerv(DMESA_GET_DRIVER_CAPS, &_glut_visual.flags);
|
||||
|
||||
/* Also hook stdio/stderr once */
|
||||
pc_open_stdout();
|
||||
pc_open_stderr();
|
||||
pc_atexit(clean);
|
||||
}
|
||||
|
||||
/* Search for an empty slot.
|
||||
* Each window has its own rendering Context and its own Buffer.
|
||||
*/
|
||||
for (i=0; i<MAX_WINDOWS; i++) {
|
||||
if (_glut_windows[i] == NULL) {
|
||||
DMesaContext c;
|
||||
DMesaBuffer b;
|
||||
GLUTwindow *w;
|
||||
|
||||
if ((w = (GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Allocate the rendering Context. */
|
||||
if ((c = DMesaCreateContext(visual, NULL)) == NULL) {
|
||||
free(w);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Allocate the Buffer (displayable area).
|
||||
* We have to specify buffer size and position (inside the desktop).
|
||||
*/
|
||||
if ((b = DMesaCreateBuffer(visual, _glut_default.x, _glut_default.y, m8width, _glut_default.height)) == NULL) {
|
||||
DMesaDestroyContext(c);
|
||||
free(w);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Bind Buffer to Context and make the Context the current one. */
|
||||
if (!DMesaMakeCurrent(c, b)) {
|
||||
DMesaDestroyBuffer(b);
|
||||
DMesaDestroyContext(c);
|
||||
free(w);
|
||||
return 0;
|
||||
}
|
||||
|
||||
_glut_current = _glut_windows[i] = w;
|
||||
|
||||
w->num = ++i;
|
||||
w->xpos = _glut_default.x;
|
||||
w->ypos = _glut_default.y;
|
||||
w->width = m8width;
|
||||
w->height = _glut_default.height;
|
||||
w->context = c;
|
||||
w->buffer = b;
|
||||
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutCreateSubWindow (int win, int x, int y, int width, int height)
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDestroyWindow (int win)
|
||||
{
|
||||
GLUTwindow *w = _glut_window(win);
|
||||
if (w != NULL) {
|
||||
if (w->destroy) {
|
||||
w->destroy();
|
||||
}
|
||||
DMesaMakeCurrent(NULL, NULL);
|
||||
DMesaDestroyBuffer(w->buffer);
|
||||
DMesaDestroyContext(w->context);
|
||||
free(w);
|
||||
_glut_windows[win - 1] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPostRedisplay (void)
|
||||
{
|
||||
_glut_current->redisplay = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSwapBuffers (void)
|
||||
{
|
||||
if (_glut_current->show_mouse) {
|
||||
/* XXX scare mouse */
|
||||
DMesaSwapBuffers(_glut_current->buffer);
|
||||
/* XXX unscare mouse */
|
||||
} else {
|
||||
DMesaSwapBuffers(_glut_current->buffer);
|
||||
}
|
||||
|
||||
if (_glut_fps) {
|
||||
GLint t = glutGet(GLUT_ELAPSED_TIME);
|
||||
swapcount++;
|
||||
if (swaptime == 0)
|
||||
swaptime = t;
|
||||
else if (t - swaptime > _glut_fps) {
|
||||
double time = 0.001 * (t - swaptime);
|
||||
double fps = (double)swapcount / time;
|
||||
fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", swapcount, time, fps);
|
||||
swaptime = t;
|
||||
swapcount = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutGetWindow (void)
|
||||
{
|
||||
return _glut_current->num;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetWindow (int win)
|
||||
{
|
||||
GLUTwindow *w = _glut_window(win);
|
||||
if (w != NULL) {
|
||||
_glut_current = w;
|
||||
DMesaMakeCurrent(_glut_current->context, _glut_current->buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetWindowTitle (const char *title)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetIconTitle (const char *title)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPositionWindow (int x, int y)
|
||||
{
|
||||
if (DMesaMoveBuffer(x, y)) {
|
||||
_glut_current->xpos = x;
|
||||
_glut_current->ypos = y;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutReshapeWindow (int width, int height)
|
||||
{
|
||||
if (DMesaResizeBuffer(width, height)) {
|
||||
_glut_current->width = width;
|
||||
_glut_current->height = height;
|
||||
if (_glut_current->reshape) {
|
||||
_glut_current->reshape(width, height);
|
||||
} else {
|
||||
glViewport(0, 0, width, height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutFullScreen (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPopWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPushWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutIconifyWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutShowWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutHideWindow (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutCloseFunc (GLUTdestroyCB destroy)
|
||||
{
|
||||
_glut_current->destroy = destroy;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPostWindowRedisplay (int win)
|
||||
{
|
||||
GLUTwindow *w = _glut_window(win);
|
||||
if (w != NULL) {
|
||||
w->redisplay = GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void * APIENTRY
|
||||
glutGetWindowData (void)
|
||||
{
|
||||
return _glut_current->data;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSetWindowData (void *data)
|
||||
{
|
||||
_glut_current->data = data;
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
# subset glut
|
||||
|
||||
TOP = ../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
GLX_SHARED = $(TOP)/src/glut/glx
|
||||
MINI_SHARED = $(TOP)/src/glut/mini
|
||||
|
||||
GLUT_MAJOR = 3
|
||||
GLUT_MINOR = 7
|
||||
GLUT_TINY = 1
|
||||
|
||||
INCLUDES = -I$(TOP)/include -I$(GLX_SHARED)
|
||||
|
||||
CORE_SOURCES = \
|
||||
fbdev.c \
|
||||
colormap.c \
|
||||
cursor.c \
|
||||
menu.c \
|
||||
overlay.c \
|
||||
ext.c \
|
||||
state.c \
|
||||
input.c \
|
||||
callback.c \
|
||||
gamemode.c \
|
||||
vidresize.c \
|
||||
bitmap.c \
|
||||
stroke.c
|
||||
|
||||
GLX_SHARED_SOURCES = \
|
||||
$(GLX_SHARED)/glut_8x13.c \
|
||||
$(GLX_SHARED)/glut_9x15.c \
|
||||
$(GLX_SHARED)/glut_hel10.c \
|
||||
$(GLX_SHARED)/glut_hel12.c \
|
||||
$(GLX_SHARED)/glut_hel18.c \
|
||||
$(GLX_SHARED)/glut_tr10.c \
|
||||
$(GLX_SHARED)/glut_tr24.c \
|
||||
$(GLX_SHARED)/glut_mroman.c \
|
||||
$(GLX_SHARED)/glut_roman.c \
|
||||
|
||||
MINI_SHARED_SOURCES = \
|
||||
$(MINI_SHARED)/models.c \
|
||||
$(MINI_SHARED)/teapot.c
|
||||
|
||||
SOURCES = $(CORE_SOURCES) $(GLX_SHARED_SOURCES) $(MINI_SHARED_SOURCES)
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME)
|
||||
|
||||
|
||||
# Make the library
|
||||
$(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS)
|
||||
$(MKLIB) -o $(GLUT_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \
|
||||
-major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \
|
||||
$(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \
|
||||
$(MKLIB_OPTIONS) $(OBJECTS)
|
||||
|
||||
install:
|
||||
$(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL
|
||||
$(INSTALL) -d $(DESTDIR)$(INSTALL_LIB_DIR)
|
||||
$(INSTALL) -m 644 $(TOP)/include/GL/glut.h $(DESTDIR)$(INSTALL_INC_DIR)/GL
|
||||
$(MINSTALL) $(TOP)/$(LIB_DIR)/libglut* $(DESTDIR)$(INSTALL_LIB_DIR)
|
||||
|
||||
# Run 'make -f Makefile.solo dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(SOURCES)
|
||||
rm -f depend
|
||||
touch depend
|
||||
$(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) > /dev/null
|
||||
|
||||
# Emacs tags
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find ../include`
|
||||
|
||||
|
||||
# Remove .o and backup files
|
||||
clean: depend
|
||||
-rm -f depend depend.bak
|
||||
-rm -f *.o *~ *.o *~ *.so libglut.so.3.7
|
||||
|
||||
include depend
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*
|
||||
* To improve on this library, maybe support subwindows or overlays,
|
||||
* I (sean at depagnier dot com) will do my best to help.
|
||||
*/
|
||||
|
||||
|
||||
#include "glutbitmap.h"
|
||||
|
||||
void glutBitmapCharacter(GLUTbitmapFont font, int c)
|
||||
{
|
||||
const BitmapCharRec *ch;
|
||||
BitmapFontPtr fi = (BitmapFontPtr) font;
|
||||
|
||||
if (c < fi->first ||
|
||||
c >= fi->first + fi->num_chars)
|
||||
return;
|
||||
ch = fi->ch[c - fi->first];
|
||||
if (!ch)
|
||||
return;
|
||||
|
||||
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
|
||||
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
|
||||
ch->advance, 0, ch->bitmap);
|
||||
glPopClientAttrib();
|
||||
}
|
||||
|
||||
int glutBitmapWidth (GLUTbitmapFont font, int c)
|
||||
{
|
||||
const BitmapCharRec *ch;
|
||||
BitmapFontPtr fi = (BitmapFontPtr) font;
|
||||
|
||||
if (c < fi->first || c >= fi->first + fi->num_chars)
|
||||
return 0;
|
||||
ch = fi->ch[c - fi->first];
|
||||
if (ch)
|
||||
return ch->advance;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int glutBitmapLength(GLUTbitmapFont font, const unsigned char *string)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
for (; *string; string++)
|
||||
length += glutBitmapWidth(font, *string);
|
||||
return length;
|
||||
}
|
||||
@@ -1,171 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
void (*DisplayFunc)(void) = NULL;
|
||||
void (*ReshapeFunc)(int width, int height) = NULL;
|
||||
void (*KeyboardFunc)(unsigned char key, int x, int y) = NULL;
|
||||
void (*KeyboardUpFunc)(unsigned char key, int x, int y) = NULL;
|
||||
void (*MouseFunc)(int key, int state, int x, int y) = NULL;
|
||||
void (*MotionFunc)(int x, int y) = NULL;
|
||||
void (*PassiveMotionFunc)(int x, int y) = NULL;
|
||||
void (*VisibilityFunc)(int state) = NULL;
|
||||
void (*SpecialFunc)(int key, int x, int y) = NULL;
|
||||
void (*SpecialUpFunc)(int key, int x, int y) = NULL;
|
||||
void (*IdleFunc)(void) = NULL;
|
||||
void (*MenuStatusFunc)(int state, int x, int y) = NULL;
|
||||
void (*MenuStateFunc)(int state) = NULL;
|
||||
|
||||
void glutDisplayFunc(void (*func)(void))
|
||||
{
|
||||
DisplayFunc = func;
|
||||
}
|
||||
|
||||
void glutOverlayDisplayFunc(void (*func)(void))
|
||||
{
|
||||
}
|
||||
|
||||
void glutWindowStatusFunc(void (*func)(int state))
|
||||
{
|
||||
}
|
||||
|
||||
void glutReshapeFunc(void (*func)(int width, int height))
|
||||
{
|
||||
ReshapeFunc = func;
|
||||
}
|
||||
|
||||
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))
|
||||
{
|
||||
KeyboardFunc = func;
|
||||
}
|
||||
|
||||
void glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y))
|
||||
{
|
||||
KeyboardUpFunc = func;
|
||||
}
|
||||
|
||||
void glutMouseFunc(void (*func)(int button, int state, int x, int y))
|
||||
{
|
||||
MouseFunc = func;
|
||||
}
|
||||
|
||||
void glutMotionFunc(void (*func)(int x, int y))
|
||||
{
|
||||
MotionFunc = func;
|
||||
}
|
||||
|
||||
void glutPassiveMotionFunc(void (*func)(int x, int y))
|
||||
{
|
||||
PassiveMotionFunc = func;
|
||||
}
|
||||
|
||||
void glutJoystickFunc(void (*func)(unsigned int buttonMask,
|
||||
int x, int y, int z), int pollInterval)
|
||||
{
|
||||
}
|
||||
|
||||
void glutVisibilityFunc(void (*func)(int state))
|
||||
{
|
||||
VisibilityFunc = func;
|
||||
}
|
||||
|
||||
void glutEntryFunc(void (*func)(int state))
|
||||
{
|
||||
}
|
||||
|
||||
void glutSpecialFunc(void (*func)(int key, int x, int y))
|
||||
{
|
||||
SpecialFunc = func;
|
||||
}
|
||||
|
||||
void glutSpecialUpFunc(void (*func)(int key, int x, int y))
|
||||
{
|
||||
SpecialUpFunc = func;
|
||||
}
|
||||
|
||||
void glutSpaceballMotionFunc(void (*func)(int x, int y, int z))
|
||||
{
|
||||
}
|
||||
|
||||
void glutSpaceballRotateFunc(void (*func)(int x, int y, int z))
|
||||
{
|
||||
}
|
||||
|
||||
void glutSpaceballButtonFunc(void (*func)(int button, int state))
|
||||
{
|
||||
}
|
||||
|
||||
void glutButtonBoxFunc(void (*func)(int button, int state))
|
||||
{
|
||||
}
|
||||
|
||||
void glutDialsFunc(void (*func)(int dial, int value))
|
||||
{
|
||||
}
|
||||
|
||||
void glutTabletMotionFunc(void (*func)(int x, int y))
|
||||
{
|
||||
}
|
||||
|
||||
void glutTabletButtonFunc(void (*func)(int button, int state,
|
||||
int x, int y))
|
||||
{
|
||||
}
|
||||
|
||||
void glutMenuStatusFunc(void (*func)(int status, int x, int y))
|
||||
{
|
||||
MenuStatusFunc = func;
|
||||
}
|
||||
|
||||
void glutMenuStateFunc(void (*func)(int status))
|
||||
{
|
||||
MenuStateFunc = func;
|
||||
}
|
||||
|
||||
void glutIdleFunc(void (*func)(void))
|
||||
{
|
||||
IdleFunc = func;
|
||||
}
|
||||
|
||||
void glutTimerFunc(unsigned int msecs,
|
||||
void (*func)(int value), int value)
|
||||
{
|
||||
struct GlutTimer **head = &GlutTimers, *timer = malloc(sizeof *timer);
|
||||
timer->time = glutGet(GLUT_ELAPSED_TIME) + msecs;
|
||||
timer->func = func;
|
||||
timer->value = value;
|
||||
|
||||
while(*head && (*head)->time < timer->time)
|
||||
head = &(*head)->next;
|
||||
|
||||
timer->next = *head;
|
||||
*head = timer;
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define TOCMAP(x)(unsigned short)((x<0?0:x>1?1:x)*(GLfloat) ((1<<16) - 1))
|
||||
#define TORMAP(x)(unsigned short)((x<0?0:x>1?1:x)*(GLfloat)(REVERSECMAPSIZE-1))
|
||||
#define FROMCMAP(x) (GLfloat)x / (GLfloat)((1<<16) - 1)
|
||||
|
||||
static struct fb_cmap ColorMap, OriginalColorMap;
|
||||
|
||||
unsigned short RedColorMap[256], GreenColorMap[256], BlueColorMap[256];
|
||||
|
||||
unsigned char ReverseColorMap[REVERSECMAPSIZE]
|
||||
[REVERSECMAPSIZE]
|
||||
[REVERSECMAPSIZE];
|
||||
|
||||
static void FindReverseMap(int r, int g, int b)
|
||||
{
|
||||
static int count;
|
||||
int i, shift = 16 - REVERSECMAPSIZELOG;
|
||||
unsigned int minv = -1, mini = 0;
|
||||
for(i=0; i<256; i++) {
|
||||
int val = 0;
|
||||
val += abs(r-(RedColorMap[i]>>shift));
|
||||
val += abs(g-(GreenColorMap[i]>>shift));
|
||||
val += abs(b-(BlueColorMap[i]>>shift));
|
||||
if(val < minv) {
|
||||
minv = val;
|
||||
mini = i;
|
||||
}
|
||||
}
|
||||
ReverseColorMap[r][g][b] = mini;
|
||||
}
|
||||
|
||||
static void FillItemReverseColorMap(int r, int g, int b)
|
||||
{
|
||||
FindReverseMap(r, g, b);
|
||||
if(r > 0)
|
||||
FindReverseMap(r-1, g, b);
|
||||
if(r < REVERSECMAPSIZE - 1)
|
||||
FindReverseMap(r+1, g, b);
|
||||
if(g > 0)
|
||||
FindReverseMap(r, g-1, b);
|
||||
if(g < REVERSECMAPSIZE - 1)
|
||||
FindReverseMap(r, g+1, b);
|
||||
if(b > 0)
|
||||
FindReverseMap(r, g, b-1);
|
||||
if(b < REVERSECMAPSIZE - 1)
|
||||
FindReverseMap(r, g, b+1);
|
||||
}
|
||||
|
||||
static void FillReverseColorMap(void)
|
||||
{
|
||||
int r, g, b;
|
||||
for(r = 0; r < REVERSECMAPSIZE; r++)
|
||||
for(g = 0; g < REVERSECMAPSIZE; g++)
|
||||
for(b = 0; b < REVERSECMAPSIZE; b++)
|
||||
FindReverseMap(r, g, b);
|
||||
}
|
||||
|
||||
void RestoreColorMap(void)
|
||||
{
|
||||
if(FixedInfo.visual == FB_VISUAL_TRUECOLOR)
|
||||
return;
|
||||
|
||||
if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &ColorMap) < 0)
|
||||
sprintf(exiterror, "ioctl(FBIOPUTCMAP) failed!\n");
|
||||
}
|
||||
|
||||
void LoadColorMap(void)
|
||||
{
|
||||
if(FixedInfo.visual == FB_VISUAL_TRUECOLOR)
|
||||
return;
|
||||
|
||||
ColorMap.start = 0;
|
||||
ColorMap.red = RedColorMap;
|
||||
ColorMap.green = GreenColorMap;
|
||||
ColorMap.blue = BlueColorMap;
|
||||
ColorMap.transp = NULL;
|
||||
|
||||
if(DisplayMode & GLUT_INDEX) {
|
||||
ColorMap.len = 256;
|
||||
|
||||
if (ioctl(FrameBufferFD, FBIOGETCMAP, (void *) &ColorMap) < 0)
|
||||
sprintf(exiterror, "ioctl(FBIOGETCMAP) failed!\n");
|
||||
|
||||
FillReverseColorMap();
|
||||
} else {
|
||||
int rcols = 1 << VarInfo.red.length;
|
||||
int gcols = 1 << VarInfo.green.length;
|
||||
int bcols = 1 << VarInfo.blue.length;
|
||||
|
||||
int i;
|
||||
|
||||
ColorMap.len = gcols;
|
||||
|
||||
for (i = 0; i < rcols ; i++)
|
||||
RedColorMap[i] = (65536/(rcols-1)) * i;
|
||||
|
||||
for (i = 0; i < gcols ; i++)
|
||||
GreenColorMap[i] = (65536/(gcols-1)) * i;
|
||||
|
||||
for (i = 0; i < bcols ; i++)
|
||||
BlueColorMap[i] = (65536/(bcols-1)) * i;
|
||||
|
||||
RestoreColorMap();
|
||||
}
|
||||
}
|
||||
|
||||
void glutSetColor(int cell, GLfloat red, GLfloat green, GLfloat blue)
|
||||
{
|
||||
if(cell < 0 || cell >= 256)
|
||||
return;
|
||||
|
||||
RedColorMap[cell] = TOCMAP(red);
|
||||
GreenColorMap[cell] = TOCMAP(green);
|
||||
BlueColorMap[cell] = TOCMAP(blue);
|
||||
|
||||
RestoreColorMap();
|
||||
|
||||
FillItemReverseColorMap(TORMAP(red), TORMAP(green), TORMAP(blue));
|
||||
}
|
||||
|
||||
GLfloat glutGetColor(int cell, int component)
|
||||
{
|
||||
if(!(DisplayMode & GLUT_INDEX))
|
||||
return -1.0;
|
||||
|
||||
if(cell < 0 || cell > 256)
|
||||
return -1.0;
|
||||
|
||||
switch(component) {
|
||||
case GLUT_RED:
|
||||
return FROMCMAP(RedColorMap[cell]);
|
||||
case GLUT_GREEN:
|
||||
return FROMCMAP(GreenColorMap[cell]);
|
||||
case GLUT_BLUE:
|
||||
return FROMCMAP(BlueColorMap[cell]);
|
||||
}
|
||||
return -1.0;
|
||||
}
|
||||
|
||||
void glutCopyColormap(int win)
|
||||
{
|
||||
}
|
||||
@@ -1,272 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
/* these routines are written to access graphics memory directly, not using mesa
|
||||
to render the cursor, this is faster, it would be good to use a hardware
|
||||
cursor if it exists instead */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "cursors.h"
|
||||
|
||||
int CurrentCursor = GLUT_CURSOR_LEFT_ARROW;
|
||||
|
||||
static int LastMouseX, LastMouseY;
|
||||
static unsigned char *MouseBuffer;
|
||||
|
||||
void InitializeCursor(void)
|
||||
{
|
||||
if(!MouseBuffer && (MouseBuffer = malloc(CURSOR_WIDTH * CURSOR_HEIGHT
|
||||
* VarInfo.bits_per_pixel / 8)) == NULL) {
|
||||
sprintf(exiterror, "malloc failure\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
MouseX = VarInfo.xres / 2;
|
||||
MouseY = VarInfo.yres / 2;
|
||||
}
|
||||
|
||||
void EraseCursor(void)
|
||||
{
|
||||
int off = LastMouseY * FixedInfo.line_length
|
||||
+ LastMouseX * VarInfo.bits_per_pixel / 8;
|
||||
int stride = CURSOR_WIDTH * VarInfo.bits_per_pixel / 8;
|
||||
int i;
|
||||
|
||||
unsigned char *src = MouseBuffer;
|
||||
|
||||
if(!MouseVisible || CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
|
||||
return;
|
||||
|
||||
for(i = 0; i<CURSOR_HEIGHT; i++) {
|
||||
memcpy(BackBuffer + off, src, stride);
|
||||
src += stride;
|
||||
off += FixedInfo.line_length;
|
||||
}
|
||||
}
|
||||
|
||||
static void SaveCursor(int x, int y)
|
||||
{
|
||||
int bypp, off, stride, i;
|
||||
unsigned char *src = MouseBuffer;
|
||||
|
||||
if(x < 0)
|
||||
LastMouseX = 0;
|
||||
else
|
||||
if(x > (int)VarInfo.xres - CURSOR_WIDTH)
|
||||
LastMouseX = VarInfo.xres - CURSOR_WIDTH;
|
||||
else
|
||||
LastMouseX = x;
|
||||
|
||||
if(y < 0)
|
||||
LastMouseY = 0;
|
||||
else
|
||||
if(y > (int)VarInfo.yres - CURSOR_HEIGHT)
|
||||
LastMouseY = VarInfo.yres - CURSOR_HEIGHT;
|
||||
else
|
||||
LastMouseY = y;
|
||||
|
||||
bypp = VarInfo.bits_per_pixel / 8;
|
||||
off = LastMouseY * FixedInfo.line_length + LastMouseX * bypp;
|
||||
stride = CURSOR_WIDTH * bypp;
|
||||
for(i = 0; i<CURSOR_HEIGHT; i++) {
|
||||
memcpy(src, BackBuffer + off, stride);
|
||||
src += stride;
|
||||
off += FixedInfo.line_length;
|
||||
}
|
||||
}
|
||||
|
||||
void DrawCursor(void)
|
||||
{
|
||||
int i, j, px, py, xoff, xlen, yoff, ylen, bypp, cstride, dstride;
|
||||
unsigned char *c;
|
||||
const unsigned char *d;
|
||||
|
||||
if(!MouseVisible || CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
|
||||
return;
|
||||
|
||||
px = MouseX - CursorsXOffset[CurrentCursor];
|
||||
py = MouseY - CursorsYOffset[CurrentCursor];
|
||||
|
||||
SaveCursor(px, py);
|
||||
|
||||
xoff = 0;
|
||||
if(px < 0)
|
||||
xoff = -px;
|
||||
|
||||
xlen = CURSOR_WIDTH;
|
||||
if(px + CURSOR_WIDTH > VarInfo.xres)
|
||||
xlen = VarInfo.xres - px;
|
||||
|
||||
yoff = 0;
|
||||
if(py < 0)
|
||||
yoff = -py;
|
||||
|
||||
ylen = CURSOR_HEIGHT;
|
||||
if(py + CURSOR_HEIGHT > VarInfo.yres)
|
||||
ylen = VarInfo.yres - py;
|
||||
|
||||
bypp = VarInfo.bits_per_pixel / 8;
|
||||
|
||||
c = BackBuffer + FixedInfo.line_length * (py + yoff) + (px + xoff) * bypp;
|
||||
cstride = FixedInfo.line_length - bypp * (xlen - xoff);
|
||||
|
||||
d = Cursors[CurrentCursor] + (CURSOR_WIDTH * yoff + xoff)*4;
|
||||
dstride = (CURSOR_WIDTH - xlen + xoff) * 4;
|
||||
|
||||
switch(bypp) {
|
||||
case 1:
|
||||
{
|
||||
const int shift = 8 - REVERSECMAPSIZELOG;
|
||||
for(i = yoff; i < ylen; i++) {
|
||||
for(j = xoff; j < xlen; j++) {
|
||||
if(d[3] < 220)
|
||||
*c = ReverseColorMap
|
||||
[(d[0]+(((int)(RedColorMap[c[0]]>>8)*d[3])>>8))>>shift]
|
||||
[(d[1]+(((int)(GreenColorMap[c[0]]>>8)*d[3])>>8))>>shift]
|
||||
[(d[2]+(((int)(BlueColorMap[c[0]]>>8)*d[3])>>8))>>shift];
|
||||
c++;
|
||||
d+=4;
|
||||
}
|
||||
d += dstride;
|
||||
c += cstride;
|
||||
}
|
||||
} break;
|
||||
case 2:
|
||||
{
|
||||
uint16_t *e = (void*)c;
|
||||
cstride /= 2;
|
||||
for(i = yoff; i < ylen; i++) {
|
||||
for(j = xoff; j < xlen; j++) {
|
||||
if(d[3] < 220)
|
||||
e[0] = ((((d[0] + (((int)(((e[0] >> 8) & 0xf8)
|
||||
| ((c[0] >> 11) & 0x7)) * d[3]) >> 8)) & 0xf8) << 8)
|
||||
| (((d[1] + (((int)(((e[0] >> 3) & 0xfc)
|
||||
| ((e[0] >> 5) & 0x3)) * d[3]) >> 8)) & 0xfc) << 3)
|
||||
| ((d[2] + (((int)(((e[0] << 3) & 0xf8)
|
||||
| (e[0] & 0x7)) * d[3]) >> 8)) >> 3));
|
||||
|
||||
e++;
|
||||
d+=4;
|
||||
}
|
||||
d += dstride;
|
||||
e += cstride;
|
||||
}
|
||||
} break;
|
||||
case 3:
|
||||
case 4:
|
||||
for(i = yoff; i < ylen; i++) {
|
||||
for(j = xoff; j < xlen; j++) {
|
||||
if(d[3] < 220) {
|
||||
c[0] = d[0] + (((int)c[0] * d[3]) >> 8);
|
||||
c[1] = d[1] + (((int)c[1] * d[3]) >> 8);
|
||||
c[2] = d[2] + (((int)c[2] * d[3]) >> 8);
|
||||
}
|
||||
|
||||
c+=bypp;
|
||||
d+=4;
|
||||
}
|
||||
d += dstride;
|
||||
c += cstride;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
#define MIN(x, y) x < y ? x : y
|
||||
void SwapCursor(void)
|
||||
{
|
||||
int px = MouseX - CursorsXOffset[CurrentCursor];
|
||||
int py = MouseY - CursorsYOffset[CurrentCursor];
|
||||
|
||||
int minx = MIN(px, LastMouseX);
|
||||
int sizex = abs(px - LastMouseX);
|
||||
|
||||
int miny = MIN(py, LastMouseY);
|
||||
int sizey = abs(py - LastMouseY);
|
||||
|
||||
if(MouseVisible)
|
||||
DrawCursor();
|
||||
|
||||
/* now update the portion of the screen that has changed, this is also
|
||||
used to hide the mouse if MouseVisible is 0 */
|
||||
if(DisplayMode & GLUT_DOUBLE && ((sizex || sizey) || !MouseVisible)) {
|
||||
int off, stride, i;
|
||||
if(minx < 0)
|
||||
minx = 0;
|
||||
if(miny < 0)
|
||||
miny = 0;
|
||||
|
||||
if(minx + sizex > VarInfo.xres - CURSOR_WIDTH)
|
||||
sizex = VarInfo.xres - CURSOR_WIDTH - minx;
|
||||
if(miny + sizey > VarInfo.yres - CURSOR_HEIGHT)
|
||||
sizey = VarInfo.yres - CURSOR_HEIGHT - miny;
|
||||
off = FixedInfo.line_length * miny
|
||||
+ minx * VarInfo.bits_per_pixel / 8;
|
||||
stride = (sizex + CURSOR_WIDTH) * VarInfo.bits_per_pixel / 8;
|
||||
|
||||
for(i = 0; i < sizey + CURSOR_HEIGHT; i++) {
|
||||
memcpy(FrameBuffer+off, BackBuffer+off, stride);
|
||||
off += FixedInfo.line_length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void glutWarpPointer(int x, int y)
|
||||
{
|
||||
if(x < 0)
|
||||
x = 0;
|
||||
if(x >= VarInfo.xres)
|
||||
x = VarInfo.xres - 1;
|
||||
MouseX = x;
|
||||
|
||||
if(y < 0)
|
||||
y = 0;
|
||||
if(y >= VarInfo.yres)
|
||||
y = VarInfo.yres - 1;
|
||||
MouseY = y;
|
||||
|
||||
EraseCursor();
|
||||
SwapCursor();
|
||||
}
|
||||
|
||||
void glutSetCursor(int cursor)
|
||||
{
|
||||
if(cursor == GLUT_CURSOR_FULL_CROSSHAIR)
|
||||
cursor = GLUT_CURSOR_CROSSHAIR;
|
||||
|
||||
EraseCursor();
|
||||
MouseVisible = 1;
|
||||
CurrentCursor = cursor;
|
||||
SwapCursor();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,154 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
void glutReportErrors(void)
|
||||
{
|
||||
GLenum error;
|
||||
|
||||
while ((error = glGetError()) != GL_NO_ERROR)
|
||||
sprintf(exiterror, "GL error: %s", gluErrorString(error));
|
||||
}
|
||||
|
||||
static struct {
|
||||
const char *name;
|
||||
const GLUTproc address;
|
||||
} glut_functions[] = {
|
||||
{ "glutInit", (const GLUTproc) glutInit },
|
||||
{ "glutInitDisplayMode", (const GLUTproc) glutInitDisplayMode },
|
||||
{ "glutInitWindowPosition", (const GLUTproc) glutInitWindowPosition },
|
||||
{ "glutInitWindowSize", (const GLUTproc) glutInitWindowSize },
|
||||
{ "glutMainLoop", (const GLUTproc) glutMainLoop },
|
||||
{ "glutCreateWindow", (const GLUTproc) glutCreateWindow },
|
||||
{ "glutCreateSubWindow", (const GLUTproc) glutCreateSubWindow },
|
||||
{ "glutDestroyWindow", (const GLUTproc) glutDestroyWindow },
|
||||
{ "glutPostRedisplay", (const GLUTproc) glutPostRedisplay },
|
||||
{ "glutSwapBuffers", (const GLUTproc) glutSwapBuffers },
|
||||
{ "glutGetWindow", (const GLUTproc) glutGetWindow },
|
||||
{ "glutSetWindow", (const GLUTproc) glutSetWindow },
|
||||
{ "glutSetWindowTitle", (const GLUTproc) glutSetWindowTitle },
|
||||
{ "glutSetIconTitle", (const GLUTproc) glutSetIconTitle },
|
||||
{ "glutPositionWindow", (const GLUTproc) glutPositionWindow },
|
||||
{ "glutReshapeWindow", (const GLUTproc) glutReshapeWindow },
|
||||
{ "glutPopWindow", (const GLUTproc) glutPopWindow },
|
||||
{ "glutPushWindow", (const GLUTproc) glutPushWindow },
|
||||
{ "glutIconifyWindow", (const GLUTproc) glutIconifyWindow },
|
||||
{ "glutShowWindow", (const GLUTproc) glutShowWindow },
|
||||
{ "glutHideWindow", (const GLUTproc) glutHideWindow },
|
||||
{ "glutFullScreen", (const GLUTproc) glutFullScreen },
|
||||
{ "glutSetCursor", (const GLUTproc) glutSetCursor },
|
||||
{ "glutWarpPointer", (const GLUTproc) glutWarpPointer },
|
||||
{ "glutEstablishOverlay", (const GLUTproc) glutEstablishOverlay },
|
||||
{ "glutRemoveOverlay", (const GLUTproc) glutRemoveOverlay },
|
||||
{ "glutUseLayer", (const GLUTproc) glutUseLayer },
|
||||
{ "glutPostOverlayRedisplay", (const GLUTproc) glutPostOverlayRedisplay },
|
||||
{ "glutShowOverlay", (const GLUTproc) glutShowOverlay },
|
||||
{ "glutHideOverlay", (const GLUTproc) glutHideOverlay },
|
||||
{ "glutCreateMenu", (const GLUTproc) glutCreateMenu },
|
||||
{ "glutDestroyMenu", (const GLUTproc) glutDestroyMenu },
|
||||
{ "glutGetMenu", (const GLUTproc) glutGetMenu },
|
||||
{ "glutSetMenu", (const GLUTproc) glutSetMenu },
|
||||
{ "glutAddMenuEntry", (const GLUTproc) glutAddMenuEntry },
|
||||
{ "glutAddSubMenu", (const GLUTproc) glutAddSubMenu },
|
||||
{ "glutChangeToMenuEntry", (const GLUTproc) glutChangeToMenuEntry },
|
||||
{ "glutChangeToSubMenu", (const GLUTproc) glutChangeToSubMenu },
|
||||
{ "glutRemoveMenuItem", (const GLUTproc) glutRemoveMenuItem },
|
||||
{ "glutAttachMenu", (const GLUTproc) glutAttachMenu },
|
||||
{ "glutDetachMenu", (const GLUTproc) glutDetachMenu },
|
||||
{ "glutDisplayFunc", (const GLUTproc) glutDisplayFunc },
|
||||
{ "glutReshapeFunc", (const GLUTproc) glutReshapeFunc },
|
||||
{ "glutKeyboardFunc", (const GLUTproc) glutKeyboardFunc },
|
||||
{ "glutMouseFunc", (const GLUTproc) glutMouseFunc },
|
||||
{ "glutMotionFunc", (const GLUTproc) glutMotionFunc },
|
||||
{ "glutPassiveMotionFunc", (const GLUTproc) glutPassiveMotionFunc },
|
||||
{ "glutEntryFunc", (const GLUTproc) glutEntryFunc },
|
||||
{ "glutVisibilityFunc", (const GLUTproc) glutVisibilityFunc },
|
||||
{ "glutIdleFunc", (const GLUTproc) glutIdleFunc },
|
||||
{ "glutTimerFunc", (const GLUTproc) glutTimerFunc },
|
||||
{ "glutMenuStateFunc", (const GLUTproc) glutMenuStateFunc },
|
||||
{ "glutSpecialFunc", (const GLUTproc) glutSpecialFunc },
|
||||
{ "glutSpaceballRotateFunc", (const GLUTproc) glutSpaceballRotateFunc },
|
||||
{ "glutButtonBoxFunc", (const GLUTproc) glutButtonBoxFunc },
|
||||
{ "glutDialsFunc", (const GLUTproc) glutDialsFunc },
|
||||
{ "glutTabletMotionFunc", (const GLUTproc) glutTabletMotionFunc },
|
||||
{ "glutTabletButtonFunc", (const GLUTproc) glutTabletButtonFunc },
|
||||
{ "glutMenuStatusFunc", (const GLUTproc) glutMenuStatusFunc },
|
||||
{ "glutOverlayDisplayFunc", (const GLUTproc) glutOverlayDisplayFunc },
|
||||
{ "glutSetColor", (const GLUTproc) glutSetColor },
|
||||
{ "glutGetColor", (const GLUTproc) glutGetColor },
|
||||
{ "glutCopyColormap", (const GLUTproc) glutCopyColormap },
|
||||
{ "glutGet", (const GLUTproc) glutGet },
|
||||
{ "glutDeviceGet", (const GLUTproc) glutDeviceGet },
|
||||
{ "glutExtensionSupported", (const GLUTproc) glutExtensionSupported },
|
||||
{ "glutGetModifiers", (const GLUTproc) glutGetModifiers },
|
||||
{ "glutLayerGet", (const GLUTproc) glutLayerGet },
|
||||
{ "glutGetProcAddress", (const GLUTproc) glutGetProcAddress },
|
||||
{ "glutBitmapCharacter", (const GLUTproc) glutBitmapCharacter },
|
||||
{ "glutBitmapWidth", (const GLUTproc) glutBitmapWidth },
|
||||
{ "glutStrokeCharacter", (const GLUTproc) glutStrokeCharacter },
|
||||
{ "glutStrokeWidth", (const GLUTproc) glutStrokeWidth },
|
||||
{ "glutBitmapLength", (const GLUTproc) glutBitmapLength },
|
||||
{ "glutStrokeLength", (const GLUTproc) glutStrokeLength },
|
||||
{ "glutWireSphere", (const GLUTproc) glutWireSphere },
|
||||
{ "glutSolidSphere", (const GLUTproc) glutSolidSphere },
|
||||
{ "glutWireCone", (const GLUTproc) glutWireCone },
|
||||
{ "glutSolidCone", (const GLUTproc) glutSolidCone },
|
||||
{ "glutWireCube", (const GLUTproc) glutWireCube },
|
||||
{ "glutSolidCube", (const GLUTproc) glutSolidCube },
|
||||
{ "glutWireTorus", (const GLUTproc) glutWireTorus },
|
||||
{ "glutSolidTorus", (const GLUTproc) glutSolidTorus },
|
||||
{ "glutWireDodecahedron", (const GLUTproc) glutWireDodecahedron },
|
||||
{ "glutSolidDodecahedron", (const GLUTproc) glutSolidDodecahedron },
|
||||
{ "glutWireTeapot", (const GLUTproc) glutWireTeapot },
|
||||
{ "glutSolidTeapot", (const GLUTproc) glutSolidTeapot },
|
||||
{ "glutWireOctahedron", (const GLUTproc) glutWireOctahedron },
|
||||
{ "glutSolidOctahedron", (const GLUTproc) glutSolidOctahedron },
|
||||
{ "glutWireTetrahedron", (const GLUTproc) glutWireTetrahedron },
|
||||
{ "glutSolidTetrahedron", (const GLUTproc) glutSolidTetrahedron },
|
||||
{ "glutWireIcosahedron", (const GLUTproc) glutWireIcosahedron },
|
||||
{ "glutSolidIcosahedron", (const GLUTproc) glutSolidIcosahedron },
|
||||
{ "glutReportErrors", (const GLUTproc) glutReportErrors },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
GLUTproc glutGetProcAddress(const char *procName)
|
||||
{
|
||||
/* Try GLUT functions first */
|
||||
int i;
|
||||
for (i = 0; glut_functions[i].name; i++) {
|
||||
if (strcmp(glut_functions[i].name, procName) == 0)
|
||||
return glut_functions[i].address;
|
||||
}
|
||||
|
||||
/* Try core GL functions */
|
||||
return (GLUTproc) glFBDevGetProcAddress(procName);
|
||||
}
|
||||
@@ -1,940 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*
|
||||
* To improve on this library, maybe support subwindows or overlays,
|
||||
* I (sean at depagnier dot com) will do my best to help.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/kd.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
#include <linux/vt.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define FBMODES "/etc/fb.modes"
|
||||
|
||||
struct fb_fix_screeninfo FixedInfo;
|
||||
struct fb_var_screeninfo VarInfo;
|
||||
static struct fb_var_screeninfo OrigVarInfo;
|
||||
|
||||
static int DesiredDepth = 0;
|
||||
|
||||
int FrameBufferFD = -1;
|
||||
unsigned char *FrameBuffer;
|
||||
unsigned char *BackBuffer = NULL;
|
||||
int DisplayMode;
|
||||
|
||||
struct GlutTimer *GlutTimers = NULL;
|
||||
|
||||
struct timeval StartTime;
|
||||
|
||||
/* per window data */
|
||||
GLFBDevContextPtr Context;
|
||||
GLFBDevBufferPtr Buffer;
|
||||
GLFBDevVisualPtr Visual;
|
||||
|
||||
int Redisplay;
|
||||
int Visible;
|
||||
int VisibleSwitch;
|
||||
int Active;
|
||||
static int Resized;
|
||||
/* we have to poll to see if we are visible
|
||||
on a framebuffer that is not active */
|
||||
int VisiblePoll;
|
||||
int Swapping, VTSwitch;
|
||||
static int FramebufferIndex;
|
||||
|
||||
static int Initialized;
|
||||
|
||||
char exiterror[256];
|
||||
|
||||
/* test if the active console is attached to the same framebuffer */
|
||||
void TestVisible(void) {
|
||||
struct fb_con2fbmap confb;
|
||||
struct vt_stat st;
|
||||
int ret;
|
||||
ioctl(ConsoleFD, VT_GETSTATE, &st);
|
||||
confb.console = st.v_active;
|
||||
|
||||
ret = ioctl(FrameBufferFD, FBIOGET_CON2FBMAP, &confb);
|
||||
|
||||
if(ret == -1 || confb.framebuffer == FramebufferIndex) {
|
||||
VisibleSwitch = 1;
|
||||
Visible = 0;
|
||||
VisiblePoll = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void Cleanup(void)
|
||||
{
|
||||
/* do not handle this signal when cleaning up */
|
||||
signal(SIGWINCH, SIG_IGN);
|
||||
|
||||
if(GameMode)
|
||||
glutLeaveGameMode();
|
||||
|
||||
if(ConsoleFD != -1)
|
||||
RestoreVT();
|
||||
|
||||
/* close mouse */
|
||||
CloseMouse();
|
||||
|
||||
if(Visual)
|
||||
glutDestroyWindow(1);
|
||||
|
||||
/* restore original variable screen info */
|
||||
if(FrameBufferFD != -1) {
|
||||
OrigVarInfo.xoffset = 0;
|
||||
OrigVarInfo.yoffset = 0;
|
||||
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo))
|
||||
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||
strerror(errno));
|
||||
|
||||
if(FrameBuffer)
|
||||
munmap(FrameBuffer, FixedInfo.smem_len);
|
||||
close(FrameBufferFD);
|
||||
|
||||
}
|
||||
|
||||
/* free allocated back buffer */
|
||||
if(DisplayMode & GLUT_DOUBLE)
|
||||
free(BackBuffer);
|
||||
|
||||
/* free menu items */
|
||||
FreeMenus();
|
||||
|
||||
if(exiterror[0])
|
||||
fprintf(stderr, "[glfbdev glut] %s", exiterror);
|
||||
}
|
||||
|
||||
static void CrashHandler(int sig)
|
||||
{
|
||||
sprintf(exiterror, "Caught signal %d, cleaning up\n", sig);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void removeArgs(int *argcp, char **argv, int num)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; argv[i+num]; i++)
|
||||
argv[i] = argv[i+num];
|
||||
|
||||
argv[i] = NULL;
|
||||
*argcp -= num;
|
||||
}
|
||||
|
||||
#define REQPARAM(PARAM) \
|
||||
if (i >= *argcp - 1) { \
|
||||
fprintf(stderr, PARAM" requires a parameter\n"); \
|
||||
exit(0); \
|
||||
}
|
||||
|
||||
void glutInit (int *argcp, char **argv)
|
||||
{
|
||||
int i, nomouse = 0, nokeyboard = 0, usestdin = 0;
|
||||
int RequiredWidth = 0, RequiredHeight;
|
||||
char *fbdev;
|
||||
|
||||
stack_t stack;
|
||||
struct sigaction sa;
|
||||
|
||||
/* parse out args */
|
||||
for (i = 1; i < *argcp;) {
|
||||
if (!strcmp(argv[i], "-geometry")) {
|
||||
REQPARAM("geometry");
|
||||
if(sscanf(argv[i+1], "%dx%d", &RequiredWidth,
|
||||
&RequiredHeight) != 2) {
|
||||
fprintf(stderr,"Please specify geometry as widthxheight\n");
|
||||
exit(0);
|
||||
}
|
||||
removeArgs(argcp, &argv[i], 2);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-bpp")) {
|
||||
REQPARAM("bpp");
|
||||
if(sscanf(argv[i+1], "%d", &DesiredDepth) != 1) {
|
||||
fprintf(stderr, "Please specify a parameter for bpp\n");
|
||||
exit(0);
|
||||
}
|
||||
removeArgs(argcp, &argv[i], 2);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-vt")) {
|
||||
REQPARAM("vt");
|
||||
if(sscanf(argv[i+1], "%d", &CurrentVT) != 1) {
|
||||
fprintf(stderr, "Please specify a parameter for vt\n");
|
||||
exit(0);
|
||||
}
|
||||
removeArgs(argcp, &argv[i], 2);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-mousespeed")) {
|
||||
REQPARAM("mousespeed");
|
||||
if(sscanf(argv[i+1], "%lf", &MouseSpeed) != 1) {
|
||||
fprintf(stderr, "Please specify a mouse speed, eg: 2.5\n");
|
||||
exit(0);
|
||||
}
|
||||
removeArgs(argcp, &argv[i], 2);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-nomouse")) {
|
||||
nomouse = 1;
|
||||
removeArgs(argcp, &argv[i], 1);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-nokeyboard")) {
|
||||
nokeyboard = 1;
|
||||
removeArgs(argcp, &argv[i], 1);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-stdin")) {
|
||||
usestdin = 1;
|
||||
removeArgs(argcp, &argv[i], 1);
|
||||
} else
|
||||
if (!strcmp(argv[i], "-gpmmouse")) {
|
||||
#ifdef HAVE_GPM
|
||||
GpmMouse = 1;
|
||||
#else
|
||||
fprintf(stderr, "gpm support not compiled\n");
|
||||
exit(0);
|
||||
#endif
|
||||
removeArgs(argcp, &argv[i], 1);
|
||||
} else
|
||||
if (!strcmp(argv[i], "--")) {
|
||||
removeArgs(argcp, &argv[i], 1);
|
||||
break;
|
||||
} else
|
||||
i++;
|
||||
}
|
||||
|
||||
gettimeofday(&StartTime, 0);
|
||||
atexit(Cleanup);
|
||||
|
||||
/* set up SIGSEGV to use alternate stack */
|
||||
stack.ss_flags = 0;
|
||||
stack.ss_size = SIGSTKSZ;
|
||||
if(!(stack.ss_sp = malloc(SIGSTKSZ)))
|
||||
sprintf(exiterror, "Failed to allocate alternate stack for SIGSEGV!\n");
|
||||
|
||||
sigaltstack(&stack, NULL);
|
||||
|
||||
sa.sa_handler = CrashHandler;
|
||||
sa.sa_flags = SA_ONSTACK;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sigaction(SIGSEGV, &sa, NULL);
|
||||
|
||||
signal(SIGINT, CrashHandler);
|
||||
signal(SIGTERM, CrashHandler);
|
||||
signal(SIGABRT, CrashHandler);
|
||||
|
||||
if(nomouse == 0)
|
||||
InitializeMouse();
|
||||
if(nokeyboard == 0)
|
||||
InitializeVT(usestdin);
|
||||
|
||||
fbdev = getenv("FRAMEBUFFER");
|
||||
if(fbdev) {
|
||||
#ifdef MULTIHEAD
|
||||
if(!sscanf(fbdev, "/dev/fb%d", &FramebufferIndex))
|
||||
if(!sscanf(fbdev, "/dev/fb/%d", &FramebufferIndex))
|
||||
sprintf(exiterror, "Could not determine Framebuffer index!\n");
|
||||
#endif
|
||||
} else {
|
||||
static char fb[128];
|
||||
struct fb_con2fbmap confb;
|
||||
int fd = open("/dev/fb0", O_RDWR);
|
||||
|
||||
FramebufferIndex = 0;
|
||||
|
||||
confb.console = CurrentVT;
|
||||
if(ioctl(fd, FBIOGET_CON2FBMAP, &confb) != -1)
|
||||
FramebufferIndex = confb.framebuffer;
|
||||
sprintf(fb, "/dev/fb%d", FramebufferIndex);
|
||||
fbdev = fb;
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/* open the framebuffer device */
|
||||
FrameBufferFD = open(fbdev, O_RDWR);
|
||||
if (FrameBufferFD < 0) {
|
||||
sprintf(exiterror, "Error opening %s: %s\n", fbdev, strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* get the fixed screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
|
||||
sprintf(exiterror, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* get the variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) {
|
||||
sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* operate on a copy */
|
||||
VarInfo = OrigVarInfo;
|
||||
|
||||
/* set the depth, resolution, etc */
|
||||
if(RequiredWidth)
|
||||
if(!ParseFBModes(RequiredWidth, RequiredWidth, RequiredHeight,
|
||||
RequiredHeight, 0, MAX_VSYNC)) {
|
||||
sprintf(exiterror, "No mode (%dx%d) found in "FBMODES"\n",
|
||||
RequiredWidth, RequiredHeight);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
Initialized = 1;
|
||||
}
|
||||
|
||||
void glutInitDisplayMode (unsigned int mode)
|
||||
{
|
||||
DisplayMode = mode;
|
||||
}
|
||||
|
||||
static const char *GetStrVal(const char *p, int *set, int min, int max)
|
||||
{
|
||||
char *endptr;
|
||||
int comp = *p, val;
|
||||
|
||||
if(p[1] == '=')
|
||||
p++;
|
||||
|
||||
if(*p == '\0')
|
||||
return p;
|
||||
|
||||
val = strtol(p+1, &endptr, 10);
|
||||
|
||||
if(endptr == p+1)
|
||||
return p;
|
||||
|
||||
switch(comp) {
|
||||
case '!':
|
||||
if(val == min)
|
||||
val = max;
|
||||
else
|
||||
val = min;
|
||||
break;
|
||||
case '<':
|
||||
val = min;
|
||||
break;
|
||||
case '>':
|
||||
val = max;
|
||||
break;
|
||||
}
|
||||
|
||||
if(val < min || val > max) {
|
||||
sprintf(exiterror, "display string value out of range\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
*set = val;
|
||||
|
||||
return endptr;
|
||||
}
|
||||
|
||||
static void SetAttrib(int val, int attr)
|
||||
{
|
||||
if(val)
|
||||
DisplayMode |= attr;
|
||||
else
|
||||
DisplayMode &= ~attr;
|
||||
}
|
||||
|
||||
void glutInitDisplayString(const char *string)
|
||||
{
|
||||
const char *p = string;
|
||||
int val;
|
||||
while(*p) {
|
||||
if(*p == ' ')
|
||||
p++;
|
||||
else
|
||||
if(memcmp(p, "acca", 4) == 0) {
|
||||
p = GetStrVal(p+4, &AccumSize, 1, 32);
|
||||
SetAttrib(AccumSize, GLUT_ACCUM);
|
||||
} else
|
||||
if(memcmp(p, "acc", 3) == 0) {
|
||||
p = GetStrVal(p+3, &AccumSize, 1, 32);
|
||||
SetAttrib(AccumSize, GLUT_ACCUM);
|
||||
} else
|
||||
if(memcmp(p, "depth", 5) == 0) {
|
||||
p = GetStrVal(p+5, &DepthSize, 12, 32);
|
||||
SetAttrib(DepthSize, GLUT_DEPTH);
|
||||
} else
|
||||
if(memcmp(p, "double", 6) == 0) {
|
||||
val = 1;
|
||||
p = GetStrVal(p+6, &val, 0, 1);
|
||||
SetAttrib(val, GLUT_DOUBLE);
|
||||
} else
|
||||
if(memcmp(p, "index", 5) == 0) {
|
||||
val = 1;
|
||||
p = GetStrVal(p+5, &val, 0, 1);
|
||||
SetAttrib(val, GLUT_INDEX);
|
||||
} else
|
||||
if(memcmp(p, "stencil", 7) == 0) {
|
||||
p = GetStrVal(p+7, &StencilSize, 0, 1);
|
||||
SetAttrib(StencilSize, GLUT_STENCIL);
|
||||
} else
|
||||
if(memcmp(p, "samples", 7) == 0) {
|
||||
NumSamples = 1;
|
||||
p = GetStrVal(p+7, &NumSamples, 0, 16);
|
||||
SetAttrib(NumSamples, GLUT_MULTISAMPLE);
|
||||
} else
|
||||
if(p = strchr(p, ' '))
|
||||
p++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void glutInitWindowPosition (int x, int y)
|
||||
{
|
||||
}
|
||||
|
||||
void glutInitWindowSize (int width, int height)
|
||||
{
|
||||
}
|
||||
|
||||
static void ProcessTimers(void)
|
||||
{
|
||||
while(GlutTimers && GlutTimers->time <= glutGet(GLUT_ELAPSED_TIME)) {
|
||||
struct GlutTimer *timer = GlutTimers;
|
||||
GlutTimers = timer->next;
|
||||
timer->func(timer->value);
|
||||
free(timer);
|
||||
}
|
||||
}
|
||||
|
||||
void glutMainLoop(void)
|
||||
{
|
||||
int idleiters;
|
||||
|
||||
if(ReshapeFunc)
|
||||
ReshapeFunc(VarInfo.xres, VarInfo.yres);
|
||||
|
||||
if(!DisplayFunc) {
|
||||
sprintf(exiterror, "Fatal Error: No Display Function registered\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
ProcessTimers();
|
||||
|
||||
if(Active)
|
||||
ReceiveInput();
|
||||
else
|
||||
if(VisiblePoll)
|
||||
TestVisible();
|
||||
|
||||
if(IdleFunc)
|
||||
IdleFunc();
|
||||
|
||||
if(VisibleSwitch) {
|
||||
VisibleSwitch = 0;
|
||||
if(VisibilityFunc)
|
||||
VisibilityFunc(Visible ? GLUT_VISIBLE : GLUT_NOT_VISIBLE);
|
||||
}
|
||||
|
||||
if(Resized) {
|
||||
SetVideoMode();
|
||||
CreateBuffer();
|
||||
|
||||
if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
|
||||
sprintf(exiterror, "Failure to Make Current\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
InitializeMenus();
|
||||
|
||||
if(ReshapeFunc)
|
||||
ReshapeFunc(VarInfo.xres, VarInfo.yres);
|
||||
|
||||
Redisplay = 1;
|
||||
Resized = 0;
|
||||
}
|
||||
|
||||
if(Visible && Redisplay) {
|
||||
Redisplay = 0;
|
||||
EraseCursor();
|
||||
DisplayFunc();
|
||||
if(!(DisplayMode & GLUT_DOUBLE)) {
|
||||
if(ActiveMenu)
|
||||
DrawMenus();
|
||||
DrawCursor();
|
||||
}
|
||||
idleiters = 0;
|
||||
} else {
|
||||
/* we sleep if not receiving redisplays, and
|
||||
the main loop is running faster than 2khz */
|
||||
|
||||
static int lasttime;
|
||||
int time = glutGet(GLUT_ELAPSED_TIME);
|
||||
if(time > lasttime) {
|
||||
if(idleiters >= 2)
|
||||
usleep(100);
|
||||
|
||||
idleiters = 0;
|
||||
lasttime = time;
|
||||
}
|
||||
idleiters++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ParseFBModes(int minw, int maxw, int minh, int maxh, int minf, int maxf)
|
||||
{
|
||||
char buf[1024];
|
||||
struct fb_var_screeninfo vi = VarInfo;
|
||||
|
||||
FILE *fbmodes = fopen(FBMODES, "r");
|
||||
|
||||
if(!fbmodes) {
|
||||
sprintf(exiterror, "Warning: could not open "FBMODES"\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
while(fgets(buf, sizeof buf, fbmodes)) {
|
||||
char *c;
|
||||
int v, bpp, freq;
|
||||
|
||||
if(!(c = strstr(buf, "geometry")))
|
||||
continue;
|
||||
v = sscanf(c, "geometry %d %d %d %d %d", &vi.xres, &vi.yres,
|
||||
&vi.xres_virtual, &vi.yres_virtual, &bpp);
|
||||
if(v != 5)
|
||||
continue;
|
||||
|
||||
if(maxw < minw) {
|
||||
if(maxw < vi.xres && minw > vi.xres)
|
||||
continue;
|
||||
} else
|
||||
if(maxw < vi.xres || minw > vi.xres)
|
||||
continue;
|
||||
|
||||
if(maxh < minh) {
|
||||
if(maxh < vi.yres && minh > vi.yres)
|
||||
continue;
|
||||
} else
|
||||
if(maxh < vi.yres || minh > vi.yres)
|
||||
continue;
|
||||
|
||||
fgets(buf, sizeof buf, fbmodes);
|
||||
if(!(c = strstr(buf, "timings")))
|
||||
continue;
|
||||
|
||||
v = sscanf(c, "timings %d %d %d %d %d %d %d", &vi.pixclock,
|
||||
&vi.left_margin, &vi.right_margin, &vi.upper_margin,
|
||||
&vi.lower_margin, &vi.hsync_len, &vi.vsync_len);
|
||||
|
||||
if(v != 7)
|
||||
continue;
|
||||
|
||||
freq = 1E12/vi.pixclock
|
||||
/(vi.left_margin + vi.xres + vi.right_margin + vi.hsync_len)
|
||||
/(vi.upper_margin + vi.yres + vi.lower_margin + vi.vsync_len);
|
||||
|
||||
if(maxf < minf) {
|
||||
if(maxf < freq && minf > freq)
|
||||
continue;
|
||||
} else
|
||||
if(maxf < freq || minf > freq)
|
||||
continue;
|
||||
|
||||
VarInfo = vi;
|
||||
fclose(fbmodes);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fclose(fbmodes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetVideoMode(void)
|
||||
{
|
||||
/* set new variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
|
||||
sprintf(exiterror, "FBIOPUT_VSCREENINFO failed: %s\n", strerror(errno));
|
||||
strcat(exiterror, "Perhaps the device does not support the selected mode\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* reload the screen info to update rgb bits */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &VarInfo)) {
|
||||
sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* reload the fixed info to update color mode */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
|
||||
sprintf(exiterror, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (DesiredDepth && DesiredDepth != VarInfo.bits_per_pixel) {
|
||||
sprintf(exiterror, "error: Could not set set %d bpp\n", DesiredDepth);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(DisplayMode & GLUT_INDEX && FixedInfo.visual == FB_VISUAL_DIRECTCOLOR) {
|
||||
sprintf(exiterror, "error: Could not set 8 bit color mode\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* initialize colormap */
|
||||
LoadColorMap();
|
||||
}
|
||||
|
||||
void CreateBuffer(void)
|
||||
{
|
||||
int size = VarInfo.xres_virtual * VarInfo.yres_virtual
|
||||
* VarInfo.bits_per_pixel / 8;
|
||||
|
||||
/* mmap the framebuffer into our address space */
|
||||
if(FrameBuffer)
|
||||
munmap(FrameBuffer, FixedInfo.smem_len);
|
||||
FrameBuffer = mmap(0, FixedInfo.smem_len, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, FrameBufferFD, 0);
|
||||
if (FrameBuffer == MAP_FAILED) {
|
||||
sprintf(exiterror, "error: unable to mmap framebuffer: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(DisplayMode & GLUT_DOUBLE) {
|
||||
free(BackBuffer);
|
||||
if(!(BackBuffer = malloc(size))) {
|
||||
sprintf(exiterror, "Failed to allocate double buffer\n");
|
||||
exit(0);
|
||||
}
|
||||
} else
|
||||
BackBuffer = FrameBuffer;
|
||||
|
||||
if(Buffer)
|
||||
glFBDevDestroyBuffer(Buffer);
|
||||
|
||||
if(!(Buffer = glFBDevCreateBuffer( &FixedInfo, &VarInfo, Visual,
|
||||
FrameBuffer, BackBuffer, size))) {
|
||||
sprintf(exiterror, "Failure to create Buffer\n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
void CreateVisual(void)
|
||||
{
|
||||
int i, mask = DisplayMode;
|
||||
int attribs[20];
|
||||
for(i=0; i<sizeof(attribs)/sizeof(*attribs) && mask; i++) {
|
||||
if(mask & GLUT_DOUBLE) {
|
||||
attribs[i] = GLFBDEV_DOUBLE_BUFFER;
|
||||
mask &= ~GLUT_DOUBLE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_INDEX) {
|
||||
attribs[i] = GLFBDEV_COLOR_INDEX;
|
||||
mask &= ~GLUT_INDEX;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_DEPTH) {
|
||||
attribs[i] = GLFBDEV_DEPTH_SIZE;
|
||||
attribs[++i] = DepthSize;
|
||||
mask &= ~GLUT_DEPTH;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_STENCIL) {
|
||||
attribs[i] = GLFBDEV_STENCIL_SIZE;
|
||||
attribs[++i] = StencilSize;
|
||||
mask &= ~GLUT_STENCIL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_ACCUM) {
|
||||
attribs[i] = GLFBDEV_ACCUM_SIZE;
|
||||
attribs[++i] = AccumSize;
|
||||
mask &= ~GLUT_ACCUM;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_ALPHA)
|
||||
if(!(DisplayMode & GLUT_INDEX)) {
|
||||
mask &= ~GLUT_ALPHA;
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mask & GLUT_MULTISAMPLE) {
|
||||
attribs[i] = GLFBDEV_MULTISAMPLE;
|
||||
attribs[++i] = NumSamples;
|
||||
mask &= ~GLUT_MULTISAMPLE;
|
||||
continue;
|
||||
}
|
||||
|
||||
sprintf(exiterror, "Invalid mode from glutInitDisplayMode\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
attribs[i] = GLFBDEV_NONE;
|
||||
|
||||
if(!(Visual = glFBDevCreateVisual( &FixedInfo, &VarInfo, attribs ))) {
|
||||
sprintf(exiterror, "Failure to create Visual\n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
static void SignalWinch(int arg)
|
||||
{
|
||||
/* we can't change bitdepth without destroying the visual */
|
||||
int bits_per_pixel = VarInfo.bits_per_pixel;
|
||||
struct fb_bitfield red = VarInfo.red, green = VarInfo.green,
|
||||
blue = VarInfo.blue, transp = VarInfo.transp;
|
||||
|
||||
/* get the variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &VarInfo)) {
|
||||
sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* restore bitdepth and color masks only */
|
||||
VarInfo.bits_per_pixel = bits_per_pixel;
|
||||
VarInfo.red = red;
|
||||
VarInfo.green = green;
|
||||
VarInfo.blue = blue;
|
||||
VarInfo.transp = transp;
|
||||
|
||||
Resized = 1;
|
||||
}
|
||||
|
||||
int glutCreateWindow (const char *title)
|
||||
{
|
||||
if(Initialized == 0) {
|
||||
int argc = 0;
|
||||
char *argv[] = {NULL};
|
||||
glutInit(&argc, argv);
|
||||
}
|
||||
|
||||
if(Context)
|
||||
return 0;
|
||||
|
||||
if(DisplayMode & GLUT_INDEX)
|
||||
VarInfo.bits_per_pixel = 8;
|
||||
else
|
||||
if(VarInfo.bits_per_pixel == 8)
|
||||
VarInfo.bits_per_pixel = 32;
|
||||
|
||||
if (DesiredDepth)
|
||||
VarInfo.bits_per_pixel = DesiredDepth;
|
||||
|
||||
VarInfo.xoffset = 0;
|
||||
VarInfo.yoffset = 0;
|
||||
VarInfo.nonstd = 0;
|
||||
VarInfo.vmode &= ~FB_VMODE_YWRAP; /* turn off scrolling */
|
||||
|
||||
SetVideoMode();
|
||||
CreateVisual();
|
||||
CreateBuffer();
|
||||
|
||||
if(!(Context = glFBDevCreateContext(Visual, NULL))) {
|
||||
sprintf(exiterror, "Failure to create Context\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
|
||||
sprintf(exiterror, "Failure to Make Current\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
InitializeCursor();
|
||||
InitializeMenus();
|
||||
|
||||
glutSetWindowTitle(title);
|
||||
|
||||
signal(SIGWINCH, SignalWinch);
|
||||
|
||||
Visible = 1;
|
||||
VisibleSwitch = 1;
|
||||
Redisplay = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int glutCreateSubWindow(int win, int x, int y, int width, int height)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void glutSetWindow(int win)
|
||||
{
|
||||
}
|
||||
|
||||
int glutGetWindow(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void glutDestroyWindow(int win)
|
||||
{
|
||||
glFBDevMakeCurrent( NULL, NULL, NULL);
|
||||
glFBDevDestroyContext(Context);
|
||||
glFBDevDestroyBuffer(Buffer);
|
||||
glFBDevDestroyVisual(Visual);
|
||||
|
||||
Visual = NULL;
|
||||
}
|
||||
|
||||
void glutPostRedisplay(void)
|
||||
{
|
||||
Redisplay = 1;
|
||||
}
|
||||
|
||||
void glutPostWindowRedisplay(int win)
|
||||
{
|
||||
Redisplay = 1;
|
||||
}
|
||||
|
||||
void glutSwapBuffers(void)
|
||||
{
|
||||
glFlush();
|
||||
|
||||
if(!(DisplayMode & GLUT_DOUBLE))
|
||||
return;
|
||||
|
||||
if(ActiveMenu)
|
||||
DrawMenus();
|
||||
DrawCursor();
|
||||
|
||||
if(Visible) {
|
||||
Swapping = 1;
|
||||
glFBDevSwapBuffers(Buffer);
|
||||
Swapping = 0;
|
||||
}
|
||||
|
||||
/* if there was a vt switch while swapping, switch now */
|
||||
if(VTSwitch) {
|
||||
if(ioctl(ConsoleFD, VT_ACTIVATE, VTSwitch) < 0)
|
||||
sprintf(exiterror, "Error switching console\n");
|
||||
VTSwitch = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void glutPositionWindow(int x, int y)
|
||||
{
|
||||
}
|
||||
|
||||
void glutReshapeWindow(int width, int height)
|
||||
{
|
||||
if(GameMode)
|
||||
return;
|
||||
|
||||
if(!ParseFBModes(width, width, height, height, 0, MAX_VSYNC))
|
||||
return;
|
||||
|
||||
signal(SIGWINCH, SIG_IGN);
|
||||
|
||||
SetVideoMode();
|
||||
signal(SIGWINCH, SignalWinch);
|
||||
Resized = 1;
|
||||
}
|
||||
|
||||
void glutFullScreen(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutPopWindow(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutPushWindow(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutShowWindow(void)
|
||||
{
|
||||
Visible = 1;
|
||||
}
|
||||
|
||||
void glutHideWindow(void)
|
||||
{
|
||||
Visible = 0;
|
||||
}
|
||||
|
||||
static void UnIconifyWindow(int sig)
|
||||
{
|
||||
if(ConsoleFD == 0)
|
||||
InitializeVT(1);
|
||||
else
|
||||
if(ConsoleFD > 0)
|
||||
InitializeVT(0);
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
|
||||
sprintf(exiterror, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||
strerror(errno));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
RestoreColorMap();
|
||||
|
||||
Redisplay = 1;
|
||||
VisibleSwitch = 1;
|
||||
Visible = 1;
|
||||
}
|
||||
|
||||
void glutIconifyWindow(void)
|
||||
{
|
||||
RestoreVT();
|
||||
signal(SIGCONT, UnIconifyWindow);
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo))
|
||||
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||
strerror(errno));
|
||||
|
||||
raise(SIGSTOP);
|
||||
}
|
||||
|
||||
void glutSetWindowTitle(const char *name)
|
||||
{
|
||||
/* escape code to set title in screen */
|
||||
if(getenv("TERM") && memcmp(getenv("TERM"), "screen", 6) == 0)
|
||||
printf("\033k%s\033\\", name);
|
||||
}
|
||||
|
||||
void glutSetIconTitle(const char *name)
|
||||
{
|
||||
}
|
||||
@@ -1,306 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
int GameMode;
|
||||
|
||||
static int ModePossible, DispChanged;
|
||||
static struct fb_var_screeninfo NormVarInfo, GameVarInfo;
|
||||
|
||||
static GLFBDevContextPtr GameContext;
|
||||
static GLFBDevVisualPtr NormVisual;
|
||||
|
||||
/* storage for non-gamemode callbacks */
|
||||
void (*KeyFuncs[2])(unsigned char key, int x, int y);
|
||||
static void (*NormFuncs[8])();
|
||||
|
||||
static const char*SetOpers(const char *p, unsigned int *min, unsigned int *max)
|
||||
{
|
||||
char *endptr;
|
||||
int comp = *p, val, neq = 0;
|
||||
|
||||
if(p[1] == '=') {
|
||||
neq = 0;
|
||||
p++;
|
||||
}
|
||||
|
||||
val = strtol(p+1, &endptr, 10);
|
||||
if(endptr == p+1)
|
||||
return p;
|
||||
|
||||
switch(comp) {
|
||||
case '=':
|
||||
*min = *max = val;
|
||||
break;
|
||||
case '!':
|
||||
*min = val + 1;
|
||||
*max = val - 1;
|
||||
break;
|
||||
case '<':
|
||||
*max = val - neq;
|
||||
break;
|
||||
case '>':
|
||||
*min = val + neq;
|
||||
break;
|
||||
}
|
||||
return endptr;
|
||||
}
|
||||
|
||||
void glutGameModeString(const char *string)
|
||||
{
|
||||
const char *p = string;
|
||||
unsigned int minb = 15, maxb = 32;
|
||||
unsigned int minw = 0, maxw = -1;
|
||||
unsigned int minh, maxh = -1;
|
||||
unsigned int minf = 0, maxf = MAX_VSYNC;
|
||||
char *endptr;
|
||||
int count = -1, val;
|
||||
|
||||
ModePossible = 0;
|
||||
|
||||
if(DisplayMode & GLUT_INDEX)
|
||||
minb = maxb = 8;
|
||||
|
||||
again:
|
||||
count++;
|
||||
if((val = strtol(p, &endptr, 10)) && *endptr=='x') {
|
||||
maxw = minw = val;
|
||||
p = endptr + 1;
|
||||
maxh = minh = strtol(p, &endptr, 10);
|
||||
p = endptr;
|
||||
goto again;
|
||||
}
|
||||
|
||||
if(*p == ':') {
|
||||
minb = strtol(p+1, &endptr, 10);
|
||||
p = endptr;
|
||||
if(DisplayMode & GLUT_INDEX) {
|
||||
if(minb != 8)
|
||||
return;
|
||||
} else
|
||||
if(minb != 15 && minb != 16 && minb != 24 && minb != 32)
|
||||
return;
|
||||
maxb = minb;
|
||||
goto again;
|
||||
}
|
||||
|
||||
if(*p == '@') {
|
||||
minf = strtol(p+1, &endptr, 10) - 5;
|
||||
maxf = minf + 10;
|
||||
p = endptr;
|
||||
goto again;
|
||||
}
|
||||
|
||||
if(count == 0)
|
||||
while(*p) {
|
||||
if(*p == ' ')
|
||||
p++;
|
||||
else
|
||||
if(memcmp(p, "bpp", 3) == 0)
|
||||
p = SetOpers(p+3, &minb, &maxb);
|
||||
else
|
||||
if(memcmp(p, "height", 6) == 0)
|
||||
p = SetOpers(p+6, &minh, &maxh);
|
||||
else
|
||||
if(memcmp(p, "hertz", 5) == 0)
|
||||
p = SetOpers(p+5, &minf, &maxf);
|
||||
else
|
||||
if(memcmp(p, "width", 5) == 0)
|
||||
p = SetOpers(p+5, &minw, &maxw);
|
||||
else
|
||||
if(p = strchr(p, ' '))
|
||||
p++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
NormVarInfo = VarInfo;
|
||||
if(!ParseFBModes(minw, maxw, minh, maxh, minf, maxf))
|
||||
return;
|
||||
|
||||
GameVarInfo = VarInfo;
|
||||
VarInfo = NormVarInfo;
|
||||
|
||||
/* determine optimal bitdepth, make sure we have enough video memory */
|
||||
if(VarInfo.bits_per_pixel && VarInfo.bits_per_pixel <= maxb)
|
||||
GameVarInfo.bits_per_pixel = VarInfo.bits_per_pixel;
|
||||
else
|
||||
GameVarInfo.bits_per_pixel = maxb;
|
||||
|
||||
while(FixedInfo.smem_len < GameVarInfo.xres * GameVarInfo.yres
|
||||
* GameVarInfo.bits_per_pixel / 8) {
|
||||
if(GameVarInfo.bits_per_pixel < minb)
|
||||
return;
|
||||
GameVarInfo.bits_per_pixel = ((GameVarInfo.bits_per_pixel+1)/8)*8-8;
|
||||
}
|
||||
|
||||
ModePossible = 1;
|
||||
}
|
||||
|
||||
int glutEnterGameMode(void)
|
||||
{
|
||||
if(ActiveMenu)
|
||||
return 0;
|
||||
|
||||
if(!ModePossible)
|
||||
return 0;
|
||||
|
||||
if(GameMode) {
|
||||
if(!memcmp(&GameVarInfo, &VarInfo, sizeof VarInfo)) {
|
||||
DispChanged = 0;
|
||||
return 1;
|
||||
}
|
||||
glutLeaveGameMode();
|
||||
}
|
||||
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &GameVarInfo))
|
||||
return 0;
|
||||
|
||||
NormVarInfo = VarInfo;
|
||||
VarInfo = GameVarInfo;
|
||||
|
||||
NormVisual = Visual;
|
||||
SetVideoMode();
|
||||
CreateVisual();
|
||||
CreateBuffer();
|
||||
|
||||
if(!(GameContext = glFBDevCreateContext(Visual, NULL))) {
|
||||
sprintf(exiterror, "Failure to create Context\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(!glFBDevMakeCurrent( GameContext, Buffer, Buffer )) {
|
||||
sprintf(exiterror, "Failure to Make Game Current\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
InitializeCursor();
|
||||
|
||||
KeyFuncs[0] = KeyboardFunc;
|
||||
KeyFuncs[1] = KeyboardUpFunc;
|
||||
|
||||
NormFuncs[0] = DisplayFunc;
|
||||
NormFuncs[1] = ReshapeFunc;
|
||||
NormFuncs[2] = MouseFunc;
|
||||
NormFuncs[3] = MotionFunc;
|
||||
NormFuncs[4] = PassiveMotionFunc;
|
||||
NormFuncs[5] = VisibilityFunc;
|
||||
NormFuncs[6] = SpecialFunc;
|
||||
NormFuncs[7] = SpecialUpFunc;
|
||||
|
||||
DisplayFunc = NULL;
|
||||
ReshapeFunc = NULL;
|
||||
KeyboardFunc = NULL;
|
||||
KeyboardUpFunc = NULL;
|
||||
MouseFunc = NULL;
|
||||
MotionFunc = NULL;
|
||||
PassiveMotionFunc = NULL;
|
||||
VisibilityFunc = NULL;
|
||||
SpecialFunc = SpecialUpFunc = NULL;
|
||||
|
||||
DispChanged = 1;
|
||||
GameMode = 1;
|
||||
Visible = 1;
|
||||
VisibleSwitch = 1;
|
||||
Redisplay = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void glutLeaveGameMode(void)
|
||||
{
|
||||
if(!GameMode)
|
||||
return;
|
||||
|
||||
glFBDevDestroyContext(GameContext);
|
||||
glFBDevDestroyVisual(Visual);
|
||||
|
||||
VarInfo = NormVarInfo;
|
||||
Visual = NormVisual;
|
||||
|
||||
if(Visual) {
|
||||
SetVideoMode();
|
||||
CreateBuffer();
|
||||
|
||||
if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
|
||||
sprintf(exiterror, "Failure to Make Current\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
Redisplay = 1;
|
||||
}
|
||||
|
||||
KeyboardFunc = KeyFuncs[0];
|
||||
KeyboardUpFunc = KeyFuncs[1];
|
||||
|
||||
DisplayFunc = NormFuncs[0];
|
||||
ReshapeFunc = NormFuncs[1];
|
||||
MouseFunc = NormFuncs[2];
|
||||
MotionFunc = NormFuncs[3];
|
||||
PassiveMotionFunc = NormFuncs[4];
|
||||
VisibilityFunc = NormFuncs[5];
|
||||
SpecialFunc = NormFuncs[6];
|
||||
SpecialUpFunc = NormFuncs[7];
|
||||
|
||||
GameMode = 0;
|
||||
}
|
||||
|
||||
int glutGameModeGet(GLenum mode) {
|
||||
switch(mode) {
|
||||
case GLUT_GAME_MODE_ACTIVE:
|
||||
return GameMode;
|
||||
case GLUT_GAME_MODE_POSSIBLE:
|
||||
return ModePossible;
|
||||
case GLUT_GAME_MODE_DISPLAY_CHANGED:
|
||||
return DispChanged;
|
||||
}
|
||||
|
||||
if(!ModePossible)
|
||||
return -1;
|
||||
|
||||
switch(mode) {
|
||||
case GLUT_GAME_MODE_WIDTH:
|
||||
return GameVarInfo.xres;
|
||||
case GLUT_GAME_MODE_HEIGHT:
|
||||
return GameVarInfo.yres;
|
||||
case GLUT_GAME_MODE_PIXEL_DEPTH:
|
||||
return GameVarInfo.bits_per_pixel;
|
||||
case GLUT_GAME_MODE_REFRESH_RATE:
|
||||
return 1E12/GameVarInfo.pixclock
|
||||
/ (GameVarInfo.left_margin + GameVarInfo.xres
|
||||
+ GameVarInfo.right_margin + GameVarInfo.hsync_len)
|
||||
/ (GameVarInfo.upper_margin + GameVarInfo.yres
|
||||
+ GameVarInfo.lower_margin + GameVarInfo.vsync_len);
|
||||
}
|
||||
}
|
||||
@@ -1,828 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <termios.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/kd.h>
|
||||
|
||||
#include <linux/keyboard.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/vt.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define MOUSEDEV "/dev/gpmdata"
|
||||
|
||||
#ifdef HAVE_GPM
|
||||
#include <gpm.h>
|
||||
int GpmMouse;
|
||||
#endif
|
||||
|
||||
int CurrentVT = 0;
|
||||
int ConsoleFD = -1;
|
||||
|
||||
int KeyboardModifiers;
|
||||
|
||||
int MouseX, MouseY;
|
||||
int NumMouseButtons;
|
||||
|
||||
double MouseSpeed = 0;
|
||||
|
||||
int KeyRepeatMode = GLUT_KEY_REPEAT_DEFAULT;
|
||||
|
||||
int MouseVisible = 0;
|
||||
int LastMouseTime = 0;
|
||||
|
||||
static int OldKDMode = -1;
|
||||
static int OldMode = KD_TEXT;
|
||||
static struct vt_mode OldVTMode;
|
||||
static struct termios OldTermios;
|
||||
|
||||
static int KeyboardLedState;
|
||||
|
||||
static int MouseFD;
|
||||
|
||||
static int kbdpipe[2];
|
||||
|
||||
static int LastStdinKeyTime, LastStdinSpecialKey = -1, LastStdinCode = -1;
|
||||
|
||||
#define MODIFIER(mod) \
|
||||
KeyboardModifiers = release ? KeyboardModifiers & ~mod \
|
||||
: KeyboardModifiers | mod;
|
||||
|
||||
/* signal handler attached to SIGIO on keyboard input, vt
|
||||
switching and modifiers is handled in the signal handler
|
||||
other keypresses read from a pipe that leaves the handler
|
||||
if a program locks up the glut loop, you can still switch
|
||||
vts and kill it without Alt-SysRq hack */
|
||||
static void KeyboardHandler(int sig)
|
||||
{
|
||||
unsigned char code;
|
||||
|
||||
while(read(ConsoleFD, &code, 1) == 1) {
|
||||
int release, labelval;
|
||||
struct kbentry entry;
|
||||
static int lalt; /* only left alt does vt switch */
|
||||
|
||||
release = code & 0x80;
|
||||
|
||||
entry.kb_index = code & 0x7F;
|
||||
entry.kb_table = 0;
|
||||
|
||||
if (ioctl(ConsoleFD, KDGKBENT, &entry) < 0) {
|
||||
sprintf(exiterror, "ioctl(KDGKBENT) failed.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
labelval = entry.kb_value;
|
||||
|
||||
switch(labelval) {
|
||||
case K_SHIFT:
|
||||
case K_SHIFTL:
|
||||
MODIFIER(GLUT_ACTIVE_SHIFT);
|
||||
continue;
|
||||
case K_CTRL:
|
||||
MODIFIER(GLUT_ACTIVE_CTRL);
|
||||
continue;
|
||||
case K_ALT:
|
||||
lalt = !release;
|
||||
case K_ALTGR:
|
||||
MODIFIER(GLUT_ACTIVE_ALT);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(lalt && !release) {
|
||||
/* VT switch, we must do it */
|
||||
int vt = -1;
|
||||
struct vt_stat st;
|
||||
if(labelval >= K_F1 && labelval <= K_F12)
|
||||
vt = labelval - K_F1 + 1;
|
||||
|
||||
if(labelval == K_LEFT)
|
||||
if(ioctl(ConsoleFD, VT_GETSTATE, &st) >= 0)
|
||||
vt = st.v_active - 1;
|
||||
|
||||
if(labelval == K_RIGHT)
|
||||
if(ioctl(ConsoleFD, VT_GETSTATE, &st) >= 0)
|
||||
vt = st.v_active + 1;
|
||||
|
||||
if(vt != -1) {
|
||||
if(Swapping)
|
||||
VTSwitch = vt;
|
||||
else
|
||||
if(ioctl(ConsoleFD, VT_ACTIVATE, vt) < 0)
|
||||
sprintf(exiterror, "Error switching console\n");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
write(kbdpipe[1], &code, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void LedModifier(int led, int release)
|
||||
{
|
||||
static int releaseflag = K_CAPS | K_NUM | K_HOLD;
|
||||
if(release)
|
||||
releaseflag |= led;
|
||||
else
|
||||
if(releaseflag & led) {
|
||||
KeyboardLedState ^= led;
|
||||
releaseflag &= ~led;
|
||||
}
|
||||
|
||||
ioctl(ConsoleFD, KDSKBLED, KeyboardLedState);
|
||||
ioctl(ConsoleFD, KDSETLED, 0x80);
|
||||
}
|
||||
|
||||
static void HandleKeyPress(unsigned char key, int up)
|
||||
{
|
||||
if(up) {
|
||||
if(KeyboardUpFunc)
|
||||
KeyboardUpFunc(key, MouseX, MouseY);
|
||||
} else
|
||||
if(KeyboardFunc)
|
||||
KeyboardFunc(key, MouseX, MouseY);
|
||||
else
|
||||
if(key == 27)
|
||||
exit(0); /* no handler, to provide a way to exit */
|
||||
}
|
||||
|
||||
static void HandleSpecialPress(int key, int up)
|
||||
{
|
||||
if(up) {
|
||||
if(SpecialUpFunc)
|
||||
SpecialUpFunc(key, MouseX, MouseY);
|
||||
} else
|
||||
if(SpecialFunc)
|
||||
SpecialFunc(key, MouseX, MouseY);
|
||||
}
|
||||
|
||||
static void ReleaseStdinKey(void)
|
||||
{
|
||||
if(LastStdinSpecialKey != -1) {
|
||||
HandleSpecialPress(LastStdinSpecialKey, 1);
|
||||
LastStdinSpecialKey = -1;
|
||||
}
|
||||
if(LastStdinCode != -1) {
|
||||
HandleKeyPress(LastStdinCode, 1);
|
||||
LastStdinCode = -1;
|
||||
}
|
||||
}
|
||||
|
||||
#define READKEY read(kbdpipe[0], &code, 1)
|
||||
static int ReadKey(void)
|
||||
{
|
||||
int release, labelval, labelvalnoshift;
|
||||
unsigned char code;
|
||||
int specialkey = 0;
|
||||
struct kbentry entry;
|
||||
|
||||
if(READKEY != 1) {
|
||||
/* if we are reading from stdin, we detect key releases when the key
|
||||
does not repeat after a given timeout */
|
||||
if(ConsoleFD == 0 && LastStdinKeyTime + 100 < glutGet(GLUT_ELAPSED_TIME))
|
||||
ReleaseStdinKey();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(code == 0)
|
||||
return 0;
|
||||
|
||||
/* stdin input escape code based */
|
||||
if(ConsoleFD == 0) {
|
||||
KeyboardModifiers = 0;
|
||||
altset:
|
||||
if(code == 27 && READKEY == 1) {
|
||||
if(code != 91) {
|
||||
KeyboardModifiers |= GLUT_ACTIVE_ALT;
|
||||
goto altset;
|
||||
}
|
||||
READKEY;
|
||||
switch(code) {
|
||||
case 68:
|
||||
specialkey = GLUT_KEY_LEFT; break;
|
||||
case 65:
|
||||
specialkey = GLUT_KEY_UP; break;
|
||||
case 67:
|
||||
specialkey = GLUT_KEY_RIGHT; break;
|
||||
case 66:
|
||||
specialkey = GLUT_KEY_DOWN; break;
|
||||
case 52:
|
||||
specialkey = GLUT_KEY_END; READKEY; break;
|
||||
case 53:
|
||||
specialkey = GLUT_KEY_PAGE_UP; READKEY; break;
|
||||
case 54:
|
||||
specialkey = GLUT_KEY_PAGE_DOWN; READKEY; break;
|
||||
case 49:
|
||||
READKEY;
|
||||
if(code == 126)
|
||||
specialkey = GLUT_KEY_HOME;
|
||||
else {
|
||||
specialkey = GLUT_KEY_F1 + code - 50;
|
||||
READKEY;
|
||||
}
|
||||
break;
|
||||
case 50:
|
||||
READKEY;
|
||||
if(code == 126)
|
||||
specialkey = GLUT_KEY_INSERT;
|
||||
else {
|
||||
if(code > '1')
|
||||
code--;
|
||||
if(code > '6')
|
||||
code--;
|
||||
if(code > '3') {
|
||||
KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
|
||||
code -= 12;
|
||||
}
|
||||
specialkey = GLUT_KEY_F1 + code - 40;
|
||||
READKEY;
|
||||
}
|
||||
break;
|
||||
case 51:
|
||||
READKEY;
|
||||
if(code == 126) {
|
||||
code = '\b';
|
||||
goto stdkey;
|
||||
}
|
||||
KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
|
||||
specialkey = GLUT_KEY_F1 + code - 45;
|
||||
READKEY;
|
||||
break;
|
||||
case 91:
|
||||
READKEY;
|
||||
specialkey = GLUT_KEY_F1 + code - 65;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(specialkey) {
|
||||
LastStdinKeyTime = glutGet(GLUT_ELAPSED_TIME);
|
||||
|
||||
if(LastStdinSpecialKey != specialkey) {
|
||||
ReleaseStdinKey();
|
||||
HandleSpecialPress(specialkey, 0);
|
||||
LastStdinSpecialKey = specialkey;
|
||||
LastStdinKeyTime += 200; /* initial repeat */
|
||||
} else
|
||||
if(KeyRepeatMode != GLUT_KEY_REPEAT_OFF)
|
||||
HandleSpecialPress(specialkey, 0);
|
||||
} else {
|
||||
if(code >= 1 && code <= 26 && code != '\r') {
|
||||
KeyboardModifiers |= GLUT_ACTIVE_CTRL;
|
||||
code += 'a' - 1;
|
||||
}
|
||||
if((code >= 43 && code <= 34) || (code == 60)
|
||||
|| (code >= 62 && code <= 90) || (code == 94)
|
||||
|| (code == 95) || (code >= 123 && code <= 126))
|
||||
KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
|
||||
|
||||
stdkey:
|
||||
LastStdinKeyTime = glutGet(GLUT_ELAPSED_TIME);
|
||||
if(LastStdinCode != code) {
|
||||
ReleaseStdinKey();
|
||||
HandleKeyPress(code, 0);
|
||||
LastStdinCode = code;
|
||||
LastStdinKeyTime += 200; /* initial repeat */
|
||||
} else
|
||||
if(KeyRepeatMode != GLUT_KEY_REPEAT_OFF)
|
||||
HandleSpecialPress(code, 0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* linux kbd reading */
|
||||
release = code & 0x80;
|
||||
code &= 0x7F;
|
||||
|
||||
if(KeyRepeatMode == GLUT_KEY_REPEAT_OFF) {
|
||||
static char keystates[128];
|
||||
if(release)
|
||||
keystates[code] = 0;
|
||||
else {
|
||||
if(keystates[code])
|
||||
return 1;
|
||||
keystates[code] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
entry.kb_index = code;
|
||||
entry.kb_table = 0;
|
||||
|
||||
if (ioctl(ConsoleFD, KDGKBENT, &entry) < 0) {
|
||||
sprintf(exiterror, "ioctl(KDGKBENT) failed.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
labelvalnoshift = entry.kb_value;
|
||||
|
||||
if(KeyboardModifiers & GLUT_ACTIVE_SHIFT)
|
||||
entry.kb_table |= K_SHIFTTAB;
|
||||
|
||||
if (ioctl(ConsoleFD, KDGKBENT, &entry) < 0) {
|
||||
sprintf(exiterror, "ioctl(KDGKBENT) failed.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
labelval = entry.kb_value;
|
||||
|
||||
switch(labelvalnoshift) {
|
||||
case K_CAPS:
|
||||
LedModifier(LED_CAP, release);
|
||||
return 0;
|
||||
case K_NUM:
|
||||
LedModifier(LED_NUM, release);
|
||||
return 0;
|
||||
case K_HOLD: /* scroll lock suspends glut */
|
||||
LedModifier(LED_SCR, release);
|
||||
while(KeyboardLedState & LED_SCR) {
|
||||
usleep(10000);
|
||||
ReadKey();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* we could queue keypresses here */
|
||||
if(KeyboardLedState & LED_SCR)
|
||||
return 0;
|
||||
|
||||
if(labelvalnoshift >= K_F1 && labelvalnoshift <= K_F12)
|
||||
specialkey = GLUT_KEY_F1 + labelvalnoshift - K_F1;
|
||||
else
|
||||
switch(labelvalnoshift) {
|
||||
case K_LEFT:
|
||||
specialkey = GLUT_KEY_LEFT; break;
|
||||
case K_UP:
|
||||
specialkey = GLUT_KEY_UP; break;
|
||||
case K_RIGHT:
|
||||
specialkey = GLUT_KEY_RIGHT; break;
|
||||
case K_DOWN:
|
||||
specialkey = GLUT_KEY_DOWN; break;
|
||||
case K_PGUP:
|
||||
specialkey = GLUT_KEY_PAGE_UP; break;
|
||||
case K_PGDN:
|
||||
specialkey = GLUT_KEY_PAGE_DOWN; break;
|
||||
case K_FIND:
|
||||
specialkey = GLUT_KEY_HOME; break;
|
||||
case K_SELECT:
|
||||
specialkey = GLUT_KEY_END; break;
|
||||
case K_INSERT:
|
||||
specialkey = GLUT_KEY_INSERT; break;
|
||||
case K_REMOVE:
|
||||
labelval = '\b';
|
||||
break;
|
||||
case K_ENTER:
|
||||
labelval = '\r'; break;
|
||||
}
|
||||
|
||||
/* likely a keypad input, but depends on keyboard mapping, ignore */
|
||||
if(labelval == 512)
|
||||
return 1;
|
||||
|
||||
/* dispatch callback */
|
||||
if(specialkey)
|
||||
HandleSpecialPress(specialkey, release);
|
||||
else {
|
||||
char c = labelval;
|
||||
|
||||
if(KeyboardLedState & LED_CAP) {
|
||||
if(c >= 'A' && c <= 'Z')
|
||||
c += 'a' - 'A';
|
||||
else
|
||||
if(c >= 'a' && c <= 'z')
|
||||
c += 'A' - 'a';
|
||||
}
|
||||
HandleKeyPress(c, release);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void glutIgnoreKeyRepeat(int ignore)
|
||||
{
|
||||
KeyRepeatMode = ignore ? GLUT_KEY_REPEAT_OFF : GLUT_KEY_REPEAT_ON;
|
||||
}
|
||||
|
||||
void glutSetKeyRepeat(int repeatMode)
|
||||
{
|
||||
KeyRepeatMode = repeatMode;
|
||||
}
|
||||
|
||||
void glutForceJoystickFunc(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void HandleMousePress(int button, int pressed)
|
||||
{
|
||||
if(TryMenu(button, pressed))
|
||||
return;
|
||||
|
||||
if(MouseFunc)
|
||||
MouseFunc(button, pressed ? GLUT_DOWN : GLUT_UP, MouseX, MouseY);
|
||||
}
|
||||
|
||||
static int ReadMouse(void)
|
||||
{
|
||||
int l, r, m;
|
||||
static int ll, lm, lr;
|
||||
signed char dx, dy;
|
||||
|
||||
#ifdef HAVE_GPM
|
||||
if(GpmMouse) {
|
||||
Gpm_Event event;
|
||||
struct pollfd pfd;
|
||||
pfd.fd = gpm_fd;
|
||||
pfd.events = POLLIN;
|
||||
if(poll(&pfd, 1, 1) != 1)
|
||||
return 0;
|
||||
|
||||
if(Gpm_GetEvent(&event) != 1)
|
||||
return 0;
|
||||
|
||||
l = event.buttons & GPM_B_LEFT;
|
||||
m = event.buttons & GPM_B_MIDDLE;
|
||||
r = event.buttons & GPM_B_RIGHT;
|
||||
|
||||
/* gpm is weird in that it gives a button number when the button
|
||||
is released, with type set to GPM_UP, this is only a problem
|
||||
if it is the last button released */
|
||||
|
||||
if(event.type & GPM_UP)
|
||||
if(event.buttons == GPM_B_LEFT || event.buttons == GPM_B_MIDDLE ||
|
||||
event.buttons == GPM_B_RIGHT || event.buttons == GPM_B_FOURTH)
|
||||
l = m = r = 0;
|
||||
|
||||
dx = event.dx;
|
||||
dy = event.dy;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
char data[4];
|
||||
|
||||
if(MouseFD == -1)
|
||||
return 0;
|
||||
|
||||
if(read(MouseFD, data, 4) != 4)
|
||||
return 0;
|
||||
|
||||
l = ((data[0] & 0x20) >> 3);
|
||||
m = ((data[3] & 0x10) >> 3);
|
||||
r = ((data[0] & 0x10) >> 4);
|
||||
|
||||
dx = (((data[0] & 0x03) << 6) | (data[1] & 0x3F));
|
||||
dy = (((data[0] & 0x0C) << 4) | (data[2] & 0x3F));
|
||||
}
|
||||
|
||||
MouseX += dx * MouseSpeed;
|
||||
if(MouseX < 0)
|
||||
MouseX = 0;
|
||||
else
|
||||
if(MouseX >= VarInfo.xres)
|
||||
MouseX = VarInfo.xres - 1;
|
||||
|
||||
MouseY += dy * MouseSpeed;
|
||||
if(MouseY < 0)
|
||||
MouseY = 0;
|
||||
else
|
||||
if(MouseY >= VarInfo.yres)
|
||||
MouseY = VarInfo.yres - 1;
|
||||
|
||||
if(l != ll)
|
||||
HandleMousePress(GLUT_LEFT_BUTTON, l);
|
||||
if(m != lm)
|
||||
HandleMousePress(GLUT_MIDDLE_BUTTON, m);
|
||||
if(r != lr)
|
||||
HandleMousePress(GLUT_RIGHT_BUTTON, r);
|
||||
|
||||
ll = l, lm = m, lr = r;
|
||||
|
||||
if(dx || dy || !MouseVisible) {
|
||||
if(l || m || r) {
|
||||
if(MotionFunc)
|
||||
MotionFunc(MouseX, MouseY);
|
||||
} else
|
||||
if(PassiveMotionFunc)
|
||||
PassiveMotionFunc(MouseX, MouseY);
|
||||
|
||||
EraseCursor();
|
||||
|
||||
MouseVisible = 1;
|
||||
|
||||
if(ActiveMenu)
|
||||
Redisplay = 1;
|
||||
else
|
||||
SwapCursor();
|
||||
}
|
||||
|
||||
LastMouseTime = glutGet(GLUT_ELAPSED_TIME);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ReceiveInput(void)
|
||||
{
|
||||
if(ConsoleFD != -1)
|
||||
while(ReadKey());
|
||||
|
||||
while(ReadMouse());
|
||||
|
||||
/* implement a 2 second timeout on the mouse */
|
||||
if(MouseVisible && glutGet(GLUT_ELAPSED_TIME) - LastMouseTime > 2000) {
|
||||
EraseCursor();
|
||||
MouseVisible = 0;
|
||||
SwapCursor();
|
||||
}
|
||||
}
|
||||
|
||||
static void VTSwitchHandler(int sig)
|
||||
{
|
||||
struct vt_stat st;
|
||||
switch(sig) {
|
||||
case SIGUSR1:
|
||||
ioctl(ConsoleFD, VT_RELDISP, 1);
|
||||
Active = 0;
|
||||
#ifdef MULTIHEAD
|
||||
VisiblePoll = 1;
|
||||
TestVisible();
|
||||
#else
|
||||
VisibleSwitch = 1;
|
||||
Visible = 0;
|
||||
#endif
|
||||
break;
|
||||
case SIGUSR2:
|
||||
ioctl(ConsoleFD, VT_GETSTATE, &st);
|
||||
if(st.v_active)
|
||||
ioctl(ConsoleFD, VT_RELDISP, VT_ACKACQ);
|
||||
|
||||
RestoreColorMap();
|
||||
|
||||
Active = 1;
|
||||
Visible = 1;
|
||||
VisibleSwitch = 1;
|
||||
|
||||
Redisplay = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeVT(int usestdin)
|
||||
{
|
||||
struct termios tio;
|
||||
struct vt_mode vt;
|
||||
char console[128];
|
||||
|
||||
signal(SIGIO, SIG_IGN);
|
||||
|
||||
Active = 1;
|
||||
|
||||
if(usestdin) {
|
||||
ConsoleFD = 0;
|
||||
goto setattribs;
|
||||
}
|
||||
|
||||
/* detect the current vt if it was not specified */
|
||||
if(CurrentVT == 0) {
|
||||
int fd = open("/dev/tty", O_RDWR | O_NDELAY, 0);
|
||||
struct vt_stat st;
|
||||
if(fd == -1) {
|
||||
sprintf(exiterror, "Failed to open /dev/tty\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(ioctl(fd, VT_GETSTATE, &st) == -1) {
|
||||
fprintf(stderr, "Could not detect current vt, specify with -vt\n");
|
||||
fprintf(stderr, "Defaulting to stdin input\n");
|
||||
ConsoleFD = 0;
|
||||
close(fd);
|
||||
goto setattribs;
|
||||
}
|
||||
|
||||
CurrentVT = st.v_active;
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/* if we close with the modifier set in glutIconifyWindow, we won't
|
||||
get the signal when they are released, so set to zero here */
|
||||
KeyboardModifiers = 0;
|
||||
|
||||
/* open the console tty */
|
||||
sprintf(console, "/dev/tty%d", CurrentVT);
|
||||
ConsoleFD = open(console, O_RDWR | O_NDELAY, 0);
|
||||
if (ConsoleFD < 0) {
|
||||
sprintf(exiterror, "error couldn't open %s,"
|
||||
" defaulting to stdin \n", console);
|
||||
ConsoleFD = 0;
|
||||
goto setattribs;
|
||||
}
|
||||
|
||||
signal(SIGUSR1, VTSwitchHandler);
|
||||
signal(SIGUSR2, VTSwitchHandler);
|
||||
|
||||
if (ioctl(ConsoleFD, VT_GETMODE, &OldVTMode) < 0) {
|
||||
sprintf(exiterror,"Failed to grab %s, defaulting to stdin\n", console);
|
||||
close(ConsoleFD);
|
||||
ConsoleFD = 0;
|
||||
goto setattribs;
|
||||
}
|
||||
|
||||
vt = OldVTMode;
|
||||
|
||||
vt.mode = VT_PROCESS;
|
||||
vt.waitv = 0;
|
||||
vt.relsig = SIGUSR1;
|
||||
vt.acqsig = SIGUSR2;
|
||||
if (ioctl(ConsoleFD, VT_SETMODE, &vt) < 0) {
|
||||
sprintf(exiterror, "error: ioctl(VT_SETMODE) failed: %s\n",
|
||||
strerror(errno));
|
||||
close(ConsoleFD);
|
||||
ConsoleFD = 0;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ioctl(ConsoleFD, KDGKBMODE, &OldKDMode) < 0) {
|
||||
sprintf(exiterror, "Warning: ioctl KDGKBMODE failed!\n");
|
||||
OldKDMode = K_XLATE;
|
||||
}
|
||||
|
||||
/* use SIGIO so VT switching can work if the program is locked */
|
||||
signal(SIGIO, KeyboardHandler);
|
||||
|
||||
pipe(kbdpipe);
|
||||
|
||||
if(fcntl(kbdpipe[0], F_SETFL, O_NONBLOCK | O_ASYNC) < 0) {
|
||||
sprintf(exiterror, "Failed to set keyboard to non-blocking\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fcntl(ConsoleFD, F_SETOWN, getpid());
|
||||
|
||||
if(ioctl(ConsoleFD, KDGETMODE, &OldMode) < 0)
|
||||
sprintf(exiterror, "Warning: Failed to get terminal mode\n");
|
||||
|
||||
#ifdef HAVE_GPM
|
||||
if(!GpmMouse)
|
||||
#endif
|
||||
if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0)
|
||||
sprintf(exiterror,"Warning: Failed to set terminal to graphics\n");
|
||||
|
||||
if(ioctl(ConsoleFD, KDSKBMODE, K_MEDIUMRAW) < 0) {
|
||||
sprintf(exiterror, "ioctl KDSKBMODE failed!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(ioctl(ConsoleFD, KDGKBLED, &KeyboardLedState) < 0) {
|
||||
sprintf(exiterror, "ioctl KDGKBLED failed!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
setattribs:
|
||||
/* enable async input input */
|
||||
if(fcntl(ConsoleFD, F_SETFL, O_ASYNC) < 0) {
|
||||
sprintf(exiterror, "Failed to set O_ASYNC mode on fd %d\n", ConsoleFD);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* save old terminos settings */
|
||||
if (tcgetattr(ConsoleFD, &OldTermios) < 0) {
|
||||
sprintf(exiterror, "tcgetattr failed\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
tio = OldTermios;
|
||||
|
||||
/* terminos settings for straight-through mode */
|
||||
tio.c_lflag &= ~(ICANON | ECHO | ISIG);
|
||||
tio.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
|
||||
tio.c_iflag |= IGNBRK;
|
||||
|
||||
tio.c_cc[VMIN] = 0;
|
||||
tio.c_cc[VTIME] = 0;
|
||||
|
||||
if (tcsetattr(ConsoleFD, TCSANOW, &tio) < 0) {
|
||||
sprintf(exiterror, "tcsetattr failed\n");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
void RestoreVT(void)
|
||||
{
|
||||
if(ConsoleFD < 0)
|
||||
return;
|
||||
|
||||
if (tcsetattr(ConsoleFD, TCSANOW, &OldTermios) < 0)
|
||||
sprintf(exiterror, "tcsetattr failed\n");
|
||||
|
||||
/* setting the mode to text from graphics restores the colormap */
|
||||
if(
|
||||
#ifdef HAVE_GPM
|
||||
!GpmMouse ||
|
||||
#endif
|
||||
ConsoleFD == 0)
|
||||
if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0)
|
||||
goto skipioctl; /* no need to fail twice */
|
||||
|
||||
if(ioctl(ConsoleFD, KDSETMODE, OldMode) < 0)
|
||||
fprintf(stderr, "ioctl KDSETMODE failed!\n");
|
||||
|
||||
skipioctl:
|
||||
|
||||
if(ConsoleFD == 0)
|
||||
return;
|
||||
|
||||
/* restore keyboard state */
|
||||
if (ioctl(ConsoleFD, VT_SETMODE, &OldVTMode) < 0)
|
||||
fprintf(stderr, "Failed to set vtmode\n");
|
||||
|
||||
if (ioctl(ConsoleFD, KDSKBMODE, OldKDMode) < 0)
|
||||
fprintf(stderr, "ioctl KDSKBMODE failed!\n");
|
||||
|
||||
close(ConsoleFD);
|
||||
|
||||
close(kbdpipe[0]);
|
||||
close(kbdpipe[1]);
|
||||
}
|
||||
|
||||
void InitializeMouse(void)
|
||||
{
|
||||
#ifdef HAVE_GPM
|
||||
if(!GpmMouse)
|
||||
#endif
|
||||
{
|
||||
const char *mousedev = getenv("MOUSE");
|
||||
if(!mousedev)
|
||||
mousedev = MOUSEDEV;
|
||||
if((MouseFD = open(mousedev, O_RDONLY | O_NONBLOCK)) >= 0) {
|
||||
if(!MouseSpeed)
|
||||
MouseSpeed = 1;
|
||||
NumMouseButtons = 3;
|
||||
return;
|
||||
}
|
||||
}
|
||||
#ifdef HAVE_GPM
|
||||
{
|
||||
Gpm_Connect conn;
|
||||
int c;
|
||||
conn.eventMask = ~0; /* Want to know about all the events */
|
||||
conn.defaultMask = 0; /* don't handle anything by default */
|
||||
conn.minMod = 0; /* want everything */
|
||||
conn.maxMod = ~0; /* all modifiers included */
|
||||
if(Gpm_Open(&conn, 0) != -1) {
|
||||
if(!MouseSpeed)
|
||||
MouseSpeed = 8;
|
||||
NumMouseButtons = 3;
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "Cannot open gpmctl.\n");
|
||||
}
|
||||
#endif
|
||||
fprintf(stderr,"Cannot open %s.\n"
|
||||
"Continuing without Mouse\n", MOUSEDEV);
|
||||
}
|
||||
|
||||
void CloseMouse(void)
|
||||
{
|
||||
#ifdef HAVE_GPM
|
||||
if(GpmMouse) {
|
||||
if(NumMouseButtons)
|
||||
Gpm_Close();
|
||||
} else
|
||||
#endif
|
||||
if(MouseFD >= 0)
|
||||
close(MouseFD);
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <linux/fb.h>
|
||||
#include <GL/glfbdev.h>
|
||||
|
||||
#define MULTIHEAD /* enable multihead hacks,
|
||||
it allows the program to continue drawing
|
||||
without reading input when a second fbdev
|
||||
has keyboard focus it can cause
|
||||
screen corruption that requires C-l to fix */
|
||||
#define HAVE_GPM
|
||||
|
||||
#define MAX_VSYNC 200
|
||||
|
||||
/* this causes these symbols to not be exported */
|
||||
#pragma GCC visibility push(hidden)
|
||||
|
||||
|
||||
/* --------- fbdev ------------ */
|
||||
extern int Redisplay;
|
||||
extern int Visible;
|
||||
extern int VisibleSwitch;
|
||||
extern int Active;
|
||||
extern int VisiblePoll;
|
||||
extern int Swapping, VTSwitch;
|
||||
|
||||
void TestVisible(void);
|
||||
int ParseFBModes(int, int, int, int, int, int);
|
||||
void SetVideoMode(void);
|
||||
void CreateBuffer(void);
|
||||
void CreateVisual(void);
|
||||
|
||||
extern int FrameBufferFD;
|
||||
extern unsigned char *FrameBuffer;
|
||||
extern unsigned char *BackBuffer;
|
||||
extern int DisplayMode;
|
||||
|
||||
extern char exiterror[256];
|
||||
|
||||
extern struct fb_fix_screeninfo FixedInfo;
|
||||
extern struct fb_var_screeninfo VarInfo;
|
||||
|
||||
extern GLFBDevContextPtr Context;
|
||||
extern GLFBDevBufferPtr Buffer;
|
||||
extern GLFBDevVisualPtr Visual;
|
||||
|
||||
/* --- colormap --- */
|
||||
#define REVERSECMAPSIZELOG 3
|
||||
#define REVERSECMAPSIZE (1<<REVERSECMAPSIZELOG)
|
||||
|
||||
extern unsigned short RedColorMap[256],
|
||||
GreenColorMap[256],
|
||||
BlueColorMap[256];
|
||||
extern unsigned char ReverseColorMap[REVERSECMAPSIZE]
|
||||
[REVERSECMAPSIZE]
|
||||
[REVERSECMAPSIZE];
|
||||
|
||||
void LoadColorMap(void);
|
||||
void RestoreColorMap(void);
|
||||
|
||||
/* --- mouse --- */
|
||||
extern int MouseX, MouseY;
|
||||
extern int CurrentCursor;
|
||||
extern int MouseVisible;
|
||||
extern int LastMouseTime;
|
||||
extern int NumMouseButtons;
|
||||
|
||||
void InitializeCursor(void);
|
||||
void EraseCursor(void);
|
||||
void DrawCursor(void);
|
||||
void SwapCursor(void);
|
||||
|
||||
/* --- menus --- */
|
||||
struct GlutMenu {
|
||||
int NumItems;
|
||||
int x, y;
|
||||
int width;
|
||||
int selected;
|
||||
struct {
|
||||
int value;
|
||||
int submenu;
|
||||
char *name;
|
||||
} *Items;
|
||||
void (*func)(int);
|
||||
};
|
||||
|
||||
extern struct GlutMenu *Menus;
|
||||
|
||||
extern int ActiveMenu;
|
||||
extern int CurrentMenu;
|
||||
|
||||
void InitializeMenus(void);
|
||||
void FreeMenus(void);
|
||||
void DrawMenus(void);
|
||||
|
||||
int TryMenu(int, int);
|
||||
void OpenMenu(void);
|
||||
void CloseMenu(void);
|
||||
|
||||
/* --- state --- */
|
||||
extern int AccumSize, DepthSize, StencilSize, NumSamples;
|
||||
extern struct timeval StartTime;
|
||||
extern int KeyboardModifiers;
|
||||
|
||||
/* --- input --- */
|
||||
#ifdef HAVE_GPM
|
||||
extern int GpmMouse;
|
||||
#endif
|
||||
|
||||
extern int CurrentVT;
|
||||
extern int ConsoleFD;
|
||||
|
||||
extern double MouseSpeed;
|
||||
|
||||
extern int KeyRepeatMode;
|
||||
|
||||
void InitializeVT(int);
|
||||
void RestoreVT(void);
|
||||
void CloseMouse(void);
|
||||
void InitializeMouse(void);
|
||||
|
||||
void ReceiveInput(void);
|
||||
|
||||
/* --- callback --- */
|
||||
extern void (*DisplayFunc)(void);
|
||||
extern void (*ReshapeFunc)(int width, int height);
|
||||
extern void (*KeyboardFunc)(unsigned char key, int x, int y);
|
||||
extern void (*KeyboardUpFunc)(unsigned char key, int x, int y);
|
||||
extern void (*MouseFunc)(int key, int state, int x, int y);
|
||||
extern void (*MotionFunc)(int x, int y);
|
||||
extern void (*PassiveMotionFunc)(int x, int y);
|
||||
extern void (*VisibilityFunc)(int state);
|
||||
extern void (*SpecialFunc)(int key, int x, int y);
|
||||
extern void (*SpecialUpFunc)(int key, int x, int y);
|
||||
extern void (*IdleFunc)(void);
|
||||
extern void (*MenuStatusFunc)(int state, int x, int y);
|
||||
extern void (*MenuStateFunc)(int state);
|
||||
|
||||
/* --- timers --- */
|
||||
struct GlutTimer {
|
||||
int time;
|
||||
void (*func)(int);
|
||||
int value;
|
||||
struct GlutTimer *next;
|
||||
};
|
||||
|
||||
extern struct GlutTimer *GlutTimers;
|
||||
|
||||
/* ------- Game Mode -------- */
|
||||
extern int GameMode;
|
||||
|
||||
#pragma GCC visibility pop
|
||||
@@ -1,309 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define MENU_FONT_WIDTH 9
|
||||
#define MENU_FONT_HEIGHT 15
|
||||
#define MENU_FONT GLUT_BITMAP_9_BY_15
|
||||
#define SUBMENU_OFFSET 20
|
||||
|
||||
struct GlutMenu *Menus;
|
||||
int ActiveMenu;
|
||||
int CurrentMenu;
|
||||
|
||||
static double MenuProjection[16];
|
||||
|
||||
static int AttachedMenus[3];
|
||||
static int NumMenus = 1;
|
||||
static int SelectedMenu;
|
||||
|
||||
void InitializeMenus(void)
|
||||
{
|
||||
glPushAttrib(GL_TRANSFORM_BIT);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
gluOrtho2D(0.0, VarInfo.xres, VarInfo.yres, 0.0);
|
||||
glGetDoublev(GL_PROJECTION_MATRIX, MenuProjection);
|
||||
|
||||
glPopMatrix();
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
void FreeMenus(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for(i = 1; i<NumMenus; i++) {
|
||||
for(j = 0; j<Menus[i].NumItems; j++)
|
||||
free(Menus[i].Items[j].name);
|
||||
free(Menus[i].Items);
|
||||
}
|
||||
|
||||
free(Menus);
|
||||
}
|
||||
|
||||
int TryMenu(int button, int pressed)
|
||||
{
|
||||
if(ActiveMenu && !pressed) {
|
||||
ActiveMenu = 0;
|
||||
CloseMenu();
|
||||
Redisplay = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(AttachedMenus[button] && pressed) {
|
||||
ActiveMenu = AttachedMenus[button];
|
||||
OpenMenu();
|
||||
Redisplay = 1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int DrawMenu(int menu, int x, int *y)
|
||||
{
|
||||
int i;
|
||||
int ret = 1;
|
||||
|
||||
for(i=0; i < Menus[menu].NumItems; i++) {
|
||||
char *s = Menus[menu].Items[i].name;
|
||||
int a = 0;
|
||||
if(MouseY >= *y && MouseY < *y + MENU_FONT_HEIGHT &&
|
||||
MouseX >= x && MouseX < x + Menus[menu].width) {
|
||||
a = 1;
|
||||
SelectedMenu = menu;
|
||||
ret = 0;
|
||||
Menus[menu].selected = i;
|
||||
glColor3f(1,0,0);
|
||||
} else
|
||||
glColor3f(1,1,1);
|
||||
|
||||
*y += MENU_FONT_HEIGHT;
|
||||
glRasterPos2i(x, *y);
|
||||
for(; *s; s++)
|
||||
glutBitmapCharacter(MENU_FONT, *s);
|
||||
|
||||
if(Menus[menu].selected == i)
|
||||
if(Menus[menu].Items[i].submenu)
|
||||
if(DrawMenu(Menus[menu].Items[i].submenu, x
|
||||
+ SUBMENU_OFFSET, y)) {
|
||||
if(!a)
|
||||
Menus[menu].selected = -1;
|
||||
} else
|
||||
ret = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void DrawMenus(void)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
if(GameMode)
|
||||
return;
|
||||
|
||||
x = Menus[ActiveMenu].x;
|
||||
y = Menus[ActiveMenu].y;
|
||||
|
||||
/* save old settings */
|
||||
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT
|
||||
| GL_ENABLE_BIT | GL_VIEWPORT_BIT);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadMatrixd(MenuProjection);
|
||||
glViewport(0, 0, VarInfo.xres, VarInfo.yres);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_FOG);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glEnable(GL_COLOR_LOGIC_OP);
|
||||
glLogicOp(GL_AND_REVERSE);
|
||||
|
||||
if(DrawMenu(ActiveMenu, x, &y))
|
||||
Menus[ActiveMenu].selected = -1;
|
||||
|
||||
/* restore settings */
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
void OpenMenu(void)
|
||||
{
|
||||
if(MenuStatusFunc)
|
||||
MenuStatusFunc(GLUT_MENU_IN_USE, MouseX, MouseY);
|
||||
if(MenuStateFunc)
|
||||
MenuStateFunc(GLUT_MENU_IN_USE);
|
||||
Menus[ActiveMenu].x = MouseX-Menus[ActiveMenu].width/2;
|
||||
|
||||
if(Menus[ActiveMenu].x < 0)
|
||||
Menus[ActiveMenu].x = 0;
|
||||
if(Menus[ActiveMenu].x + Menus[ActiveMenu].width >= VarInfo.xres)
|
||||
Menus[ActiveMenu].x = VarInfo.xres - Menus[ActiveMenu].width - 1;
|
||||
|
||||
Menus[ActiveMenu].y = MouseY-Menus[ActiveMenu].NumItems*MENU_FONT_HEIGHT/2;
|
||||
Menus[ActiveMenu].selected = -1;
|
||||
}
|
||||
|
||||
void CloseMenu(void)
|
||||
{
|
||||
if(MenuStatusFunc)
|
||||
MenuStatusFunc(GLUT_MENU_NOT_IN_USE, MouseX, MouseY);
|
||||
if(MenuStateFunc)
|
||||
MenuStateFunc(GLUT_MENU_NOT_IN_USE);
|
||||
if(SelectedMenu > 0) {
|
||||
int selected = Menus[SelectedMenu].selected;
|
||||
if(selected >= 0)
|
||||
if(Menus[SelectedMenu].Items[selected].submenu == 0)
|
||||
Menus[SelectedMenu].func(Menus[SelectedMenu].Items
|
||||
[selected].value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* glut menu functions */
|
||||
|
||||
int glutCreateMenu(void (*func)(int value))
|
||||
{
|
||||
CurrentMenu = NumMenus;
|
||||
NumMenus++;
|
||||
Menus = realloc(Menus, sizeof(*Menus) * NumMenus);
|
||||
Menus[CurrentMenu].NumItems = 0;
|
||||
Menus[CurrentMenu].Items = NULL;
|
||||
Menus[CurrentMenu].func = func;
|
||||
Menus[CurrentMenu].width = 0;
|
||||
return CurrentMenu;
|
||||
}
|
||||
|
||||
void glutSetMenu(int menu)
|
||||
{
|
||||
CurrentMenu = menu;
|
||||
}
|
||||
|
||||
int glutGetMenu(void)
|
||||
{
|
||||
return CurrentMenu;
|
||||
}
|
||||
|
||||
void glutDestroyMenu(int menu)
|
||||
{
|
||||
if(menu == CurrentMenu)
|
||||
CurrentMenu = 0;
|
||||
}
|
||||
|
||||
static void NameMenuEntry(int entry, const char *name)
|
||||
{
|
||||
int cm = CurrentMenu;
|
||||
if(!(Menus[cm].Items[entry-1].name = realloc(Menus[cm].Items[entry-1].name,
|
||||
strlen(name) + 1))) {
|
||||
sprintf(exiterror, "realloc failed in NameMenuEntry\n");
|
||||
exit(0);
|
||||
}
|
||||
strcpy(Menus[cm].Items[entry-1].name, name);
|
||||
if(strlen(name) * MENU_FONT_WIDTH > Menus[cm].width)
|
||||
Menus[cm].width = strlen(name) * MENU_FONT_WIDTH;
|
||||
}
|
||||
|
||||
static int AddMenuItem(const char *name)
|
||||
{
|
||||
int cm = CurrentMenu;
|
||||
int item = Menus[cm].NumItems++;
|
||||
if(!(Menus[cm].Items = realloc(Menus[cm].Items,
|
||||
Menus[cm].NumItems * sizeof(*Menus[0].Items)))) {
|
||||
sprintf(exiterror, "realloc failed in AddMenuItem\n");
|
||||
exit(0);
|
||||
}
|
||||
Menus[cm].Items[item].name = NULL;
|
||||
NameMenuEntry(item+1, name);
|
||||
return item;
|
||||
}
|
||||
|
||||
void glutAddMenuEntry(const char *name, int value)
|
||||
{
|
||||
int item = AddMenuItem(name);
|
||||
Menus[CurrentMenu].Items[item].value = value;
|
||||
Menus[CurrentMenu].Items[item].submenu = 0;
|
||||
}
|
||||
|
||||
void glutAddSubMenu(const char *name, int menu)
|
||||
{
|
||||
int item = AddMenuItem(name);
|
||||
if(menu == CurrentMenu) {
|
||||
sprintf(exiterror, "Recursive menus not supported\n");
|
||||
exit(0);
|
||||
}
|
||||
Menus[CurrentMenu].Items[item].submenu = menu;
|
||||
}
|
||||
|
||||
void glutChangeToMenuEntry(int entry, const char *name, int value)
|
||||
{
|
||||
NameMenuEntry(entry, name);
|
||||
Menus[CurrentMenu].Items[entry-1].value = value;
|
||||
Menus[CurrentMenu].Items[entry-1].submenu = 0;
|
||||
}
|
||||
|
||||
void glutChangeToSubMenu(int entry, const char *name, int menu)
|
||||
{
|
||||
NameMenuEntry(entry, name);
|
||||
Menus[CurrentMenu].Items[entry-1].submenu = menu;
|
||||
}
|
||||
|
||||
void glutRemoveMenuItem(int entry)
|
||||
{
|
||||
memmove(Menus[CurrentMenu].Items + entry - 1,
|
||||
Menus[CurrentMenu].Items + entry,
|
||||
sizeof(*Menus[0].Items) * (Menus[CurrentMenu].NumItems - entry));
|
||||
Menus[CurrentMenu].NumItems--;
|
||||
}
|
||||
|
||||
void glutAttachMenu(int button)
|
||||
{
|
||||
AttachedMenus[button] = CurrentMenu;
|
||||
}
|
||||
|
||||
void glutDetachMenu(int button)
|
||||
{
|
||||
AttachedMenus[button] = 0;
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <GL/gl.h>
|
||||
|
||||
void glutEstablishOverlay(void)
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void glutUseLayer(GLenum layer)
|
||||
{
|
||||
}
|
||||
|
||||
void glutRemoveOverlay(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutPostOverlayRedisplay(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutPostWindowOverlayRedisplay(int win)
|
||||
{
|
||||
}
|
||||
|
||||
void glutShowOverlay(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutHideOverlay(void)
|
||||
{
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "../../mesa/main/config.h"
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
int AccumSize = 16; /* per channel size of accumulation buffer */
|
||||
int DepthSize = DEFAULT_SOFTWARE_DEPTH_BITS;
|
||||
int StencilSize = STENCIL_BITS;
|
||||
int NumSamples = 4;
|
||||
|
||||
int glutGet(GLenum state)
|
||||
{
|
||||
switch(state) {
|
||||
case GLUT_WINDOW_X:
|
||||
return 0;
|
||||
case GLUT_WINDOW_Y:
|
||||
return 0;
|
||||
case GLUT_INIT_WINDOW_WIDTH:
|
||||
case GLUT_WINDOW_WIDTH:
|
||||
case GLUT_SCREEN_WIDTH:
|
||||
return VarInfo.xres;
|
||||
case GLUT_INIT_WINDOW_HEIGHT:
|
||||
case GLUT_WINDOW_HEIGHT:
|
||||
case GLUT_SCREEN_HEIGHT:
|
||||
return VarInfo.yres;
|
||||
case GLUT_WINDOW_BUFFER_SIZE:
|
||||
return VarInfo.bits_per_pixel;
|
||||
case GLUT_WINDOW_STENCIL_SIZE:
|
||||
return StencilSize;
|
||||
case GLUT_WINDOW_DEPTH_SIZE:
|
||||
return DepthSize;
|
||||
case GLUT_WINDOW_RED_SIZE:
|
||||
return VarInfo.red.length;
|
||||
case GLUT_WINDOW_GREEN_SIZE:
|
||||
return VarInfo.green.length;
|
||||
case GLUT_WINDOW_BLUE_SIZE:
|
||||
return VarInfo.green.length;
|
||||
case GLUT_WINDOW_ALPHA_SIZE:
|
||||
return VarInfo.transp.length;
|
||||
case GLUT_WINDOW_ACCUM_RED_SIZE:
|
||||
case GLUT_WINDOW_ACCUM_GREEN_SIZE:
|
||||
case GLUT_WINDOW_ACCUM_BLUE_SIZE:
|
||||
case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
|
||||
return AccumSize;
|
||||
case GLUT_WINDOW_DOUBLEBUFFER:
|
||||
if(DisplayMode & GLUT_DOUBLE)
|
||||
return 1;
|
||||
return 0;
|
||||
case GLUT_WINDOW_RGBA:
|
||||
if(DisplayMode & GLUT_INDEX)
|
||||
return 0;
|
||||
return 1;
|
||||
case GLUT_WINDOW_PARENT:
|
||||
return 0;
|
||||
case GLUT_WINDOW_NUM_CHILDREN:
|
||||
return 0;
|
||||
case GLUT_WINDOW_COLORMAP_SIZE:
|
||||
if(DisplayMode & GLUT_INDEX)
|
||||
return 256;
|
||||
return 0;
|
||||
case GLUT_WINDOW_NUM_SAMPLES:
|
||||
return NumSamples;
|
||||
case GLUT_WINDOW_STEREO:
|
||||
return 0;
|
||||
case GLUT_WINDOW_CURSOR:
|
||||
return CurrentCursor;
|
||||
case GLUT_SCREEN_WIDTH_MM:
|
||||
return VarInfo.width;
|
||||
case GLUT_SCREEN_HEIGHT_MM:
|
||||
return VarInfo.height;
|
||||
case GLUT_MENU_NUM_ITEMS:
|
||||
if(CurrentMenu)
|
||||
return Menus[CurrentMenu].NumItems;
|
||||
return 0;
|
||||
case GLUT_DISPLAY_MODE_POSSIBLE:
|
||||
if((DisplayMode & GLUT_MULTISAMPLE)
|
||||
|| (DisplayMode & GLUT_STEREO)
|
||||
|| (DisplayMode & GLUT_LUMINANCE)
|
||||
|| (DisplayMode & GLUT_ALPHA) && (DisplayMode & GLUT_INDEX))
|
||||
return 0;
|
||||
return 1;
|
||||
case GLUT_INIT_DISPLAY_MODE:
|
||||
return DisplayMode;
|
||||
case GLUT_INIT_WINDOW_X:
|
||||
case GLUT_INIT_WINDOW_Y:
|
||||
return 0;
|
||||
case GLUT_ELAPSED_TIME:
|
||||
{
|
||||
static struct timeval tv;
|
||||
gettimeofday(&tv, 0);
|
||||
return 1000 * (tv.tv_sec - StartTime.tv_sec)
|
||||
+ (tv.tv_usec - StartTime.tv_usec) / 1000;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int glutLayerGet(GLenum info)
|
||||
{
|
||||
switch(info) {
|
||||
case GLUT_OVERLAY_POSSIBLE:
|
||||
return 0;
|
||||
case GLUT_LAYER_IN_USE:
|
||||
return GLUT_NORMAL;
|
||||
case GLUT_HAS_OVERLAY:
|
||||
return 0;
|
||||
case GLUT_TRANSPARENT_INDEX:
|
||||
return -1;
|
||||
case GLUT_NORMAL_DAMAGED:
|
||||
return Redisplay;
|
||||
case GLUT_OVERLAY_DAMAGED:
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int glutDeviceGet(GLenum info)
|
||||
{
|
||||
switch(info) {
|
||||
case GLUT_HAS_KEYBOARD:
|
||||
return ConsoleFD != -1 ? 1 : 0;
|
||||
case GLUT_HAS_MOUSE:
|
||||
case GLUT_NUM_MOUSE_BUTTONS:
|
||||
return NumMouseButtons;
|
||||
case GLUT_HAS_SPACEBALL:
|
||||
case GLUT_HAS_DIAL_AND_BUTTON_BOX:
|
||||
case GLUT_HAS_TABLET:
|
||||
return 0;
|
||||
case GLUT_NUM_SPACEBALL_BUTTONS:
|
||||
case GLUT_NUM_BUTTON_BOX_BUTTONS:
|
||||
case GLUT_NUM_DIALS:
|
||||
case GLUT_NUM_TABLET_BUTTONS:
|
||||
return 0;
|
||||
case GLUT_DEVICE_IGNORE_KEY_REPEAT:
|
||||
return KeyRepeatMode == GLUT_KEY_REPEAT_OFF;
|
||||
case GLUT_DEVICE_KEY_REPEAT:
|
||||
return KeyRepeatMode;
|
||||
case GLUT_JOYSTICK_POLL_RATE:
|
||||
case GLUT_HAS_JOYSTICK:
|
||||
case GLUT_JOYSTICK_BUTTONS:
|
||||
case GLUT_JOYSTICK_AXES:
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int glutGetModifiers(void){
|
||||
return KeyboardModifiers;
|
||||
}
|
||||
|
||||
int glutExtensionSupported(const char *extension)
|
||||
{
|
||||
const char *exts = (const char *) glGetString(GL_EXTENSIONS);
|
||||
const char *start = exts;
|
||||
int len = strlen(extension);
|
||||
for(;;) {
|
||||
const char *p = strstr(exts, extension);
|
||||
if(!p)
|
||||
break;
|
||||
if((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))
|
||||
return 1;
|
||||
exts = p + len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*
|
||||
* To improve on this library, maybe support subwindows or overlays,
|
||||
* I (sean at depagnier dot com) will do my best to help.
|
||||
*/
|
||||
|
||||
#include <GL/glut.h>
|
||||
#include "glutstroke.h"
|
||||
|
||||
void glutStrokeCharacter(GLUTstrokeFont font, int c)
|
||||
{
|
||||
const StrokeCharRec *ch;
|
||||
const StrokeRec *stroke;
|
||||
const CoordRec *coord;
|
||||
StrokeFontPtr fontinfo = (StrokeFontPtr) font;
|
||||
int i, j;
|
||||
|
||||
if (c < 0 || c >= fontinfo->num_chars)
|
||||
return;
|
||||
ch = &(fontinfo->ch[c]);
|
||||
if (ch) {
|
||||
for (i = ch->num_strokes, stroke = ch->stroke;
|
||||
i > 0; i--, stroke++) {
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (j = stroke->num_coords, coord = stroke->coord;
|
||||
j > 0; j--, coord++) {
|
||||
glVertex2f(coord->x, coord->y);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
glTranslatef(ch->right, 0.0, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
int glutStrokeWidth(GLUTstrokeFont font, int c)
|
||||
{
|
||||
StrokeFontPtr fontinfo;
|
||||
const StrokeCharRec *ch;
|
||||
|
||||
fontinfo = (StrokeFontPtr) font;
|
||||
|
||||
if (c < 0 || c >= fontinfo->num_chars)
|
||||
return 0;
|
||||
ch = &(fontinfo->ch[c]);
|
||||
if (ch)
|
||||
return ch->right;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
for (; *string; string++)
|
||||
length += glutStrokeWidth(font, *string);
|
||||
return length;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Copyright (C) 1995-2006 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Library for glut using mesa fbdev driver
|
||||
*
|
||||
* Written by Sean D'Epagnier (c) 2006
|
||||
*/
|
||||
|
||||
/* Notice, if you know how to implement these functions correctly
|
||||
please proceed */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
int glutVideoResizeGet(GLenum param)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void glutSetupVideoResizing(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutStopVideoResizing(void)
|
||||
{
|
||||
}
|
||||
|
||||
void glutVideoResize(int x, int y, int width, int height)
|
||||
{
|
||||
}
|
||||
|
||||
void glutVideoPan(int x, int y, int width, int height)
|
||||
{
|
||||
}
|
||||
@@ -1,420 +0,0 @@
|
||||
# Makefile
|
||||
# Created by IBM WorkFrame/2 MakeMake at 12:46:25 on 3 June 2003
|
||||
#
|
||||
# The actions included in this make file are:
|
||||
# Compile::C++ Compiler
|
||||
# Link::Linker
|
||||
# Lib::Import Lib
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.SUFFIXES: \
|
||||
.LIB .cpp .dll .obj
|
||||
|
||||
.cpp.obj:
|
||||
@echo " Compile::C++ Compiler "
|
||||
icc.exe /I..\ /I..\X86 /I..\GL /I..\swrast /I..\swrast_setup /Ss /Wcmpcndcnscnvcpydclenuextgeninilanobsordparporppcprorearettrdtruund /Tx /O /Gm /Ge- /G5 /Gf /Gi /Oi /C %s
|
||||
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm}.cpp.obj:
|
||||
@echo " Compile::C++ Compiler "
|
||||
icc.exe /I..\ /I..\X86 /I..\GL /I..\swrast /I..\swrast_setup /Ss /Wcmpcndcnscnvcpydclenuextgeninilanobsordparporppcprorearettrdtruund /Tx /O /Gm /Ge- /G5 /Gf /Gi /Oi /C %s
|
||||
|
||||
.dll.LIB:
|
||||
@echo " Lib::Import Lib "
|
||||
implib.exe %|dpfF.LIB %s
|
||||
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm}.dll.LIB:
|
||||
@echo " Lib::Import Lib "
|
||||
implib.exe %|dpfF.LIB %s
|
||||
|
||||
all: \
|
||||
.\libGlut.LIB
|
||||
|
||||
.\libGlut.dll: \
|
||||
.\os2_winproc.obj \
|
||||
.\WarpWin.obj \
|
||||
.\glutOverlay.obj \
|
||||
.\glut_8x13.obj \
|
||||
.\glut_9x15.obj \
|
||||
.\glut_bitmap.obj \
|
||||
.\glut_cindex.obj \
|
||||
.\glut_cmap.obj \
|
||||
.\glut_cursor.obj \
|
||||
.\glut_event.obj \
|
||||
.\glut_ext.obj \
|
||||
.\glut_fullscrn.obj \
|
||||
.\glut_gamemode.obj \
|
||||
.\glut_get.obj \
|
||||
.\glut_hel10.obj \
|
||||
.\glut_hel12.obj \
|
||||
.\glut_hel18.obj \
|
||||
.\glut_init.obj \
|
||||
.\glut_input.obj \
|
||||
.\glut_key.obj \
|
||||
.\glut_keyctrl.obj \
|
||||
.\glut_keyup.obj \
|
||||
.\glut_mesa.obj \
|
||||
.\glut_modifier.obj \
|
||||
.\glut_roman.obj \
|
||||
.\glut_shapes.obj \
|
||||
.\glut_stroke.obj \
|
||||
.\glut_swap.obj \
|
||||
.\glut_teapot.obj \
|
||||
.\glut_tr24.obj \
|
||||
.\glut_util.obj \
|
||||
.\glut_vidresize.obj \
|
||||
.\glut_warp.obj \
|
||||
.\glut_win.obj \
|
||||
.\glut_winmisc.obj \
|
||||
.\os2_glx.obj \
|
||||
.\os2_menu.obj \
|
||||
..\si-glu\libGLU.lib \
|
||||
..\MesaDll\MesaGL2.lib \
|
||||
..\drv\DrvLoad\MesaDrvLoad.lib \
|
||||
{$(LIB)}libGlut.DEF
|
||||
@echo " Link::Linker "
|
||||
icc.exe @<<
|
||||
/B" /dbgpack /exepack:2 /st:200000 /packd /optfunc"
|
||||
/FelibGlut.dll
|
||||
..\si-glu\libGLU.lib
|
||||
..\MesaDll\MesaGL2.lib
|
||||
..\drv\DrvLoad\MesaDrvLoad.lib
|
||||
libGlut.DEF
|
||||
.\os2_winproc.obj
|
||||
.\WarpWin.obj
|
||||
.\glutOverlay.obj
|
||||
.\glut_8x13.obj
|
||||
.\glut_9x15.obj
|
||||
.\glut_bitmap.obj
|
||||
.\glut_cindex.obj
|
||||
.\glut_cmap.obj
|
||||
.\glut_cursor.obj
|
||||
.\glut_event.obj
|
||||
.\glut_ext.obj
|
||||
.\glut_fullscrn.obj
|
||||
.\glut_gamemode.obj
|
||||
.\glut_get.obj
|
||||
.\glut_hel10.obj
|
||||
.\glut_hel12.obj
|
||||
.\glut_hel18.obj
|
||||
.\glut_init.obj
|
||||
.\glut_input.obj
|
||||
.\glut_key.obj
|
||||
.\glut_keyctrl.obj
|
||||
.\glut_keyup.obj
|
||||
.\glut_mesa.obj
|
||||
.\glut_modifier.obj
|
||||
.\glut_roman.obj
|
||||
.\glut_shapes.obj
|
||||
.\glut_stroke.obj
|
||||
.\glut_swap.obj
|
||||
.\glut_teapot.obj
|
||||
.\glut_tr24.obj
|
||||
.\glut_util.obj
|
||||
.\glut_vidresize.obj
|
||||
.\glut_warp.obj
|
||||
.\glut_win.obj
|
||||
.\glut_winmisc.obj
|
||||
.\os2_glx.obj
|
||||
.\os2_menu.obj
|
||||
<<
|
||||
|
||||
.\os2_winproc.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\os2_winproc.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
|
||||
gl\os2mesa.h \
|
||||
gl\gl.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2mesadef.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}context.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glapi.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}mtypes.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glheader.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}config.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glapitable.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glthread.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}math/m_matrix.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}Trace/tr_context.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}dd.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}conf.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_config.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/glext.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}Xthreads.h
|
||||
|
||||
.\os2_menu.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\os2_menu.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\os2_glx.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\os2_glx.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
gl\os2mesa.h \
|
||||
gl\gl.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h
|
||||
|
||||
.\glut_winmisc.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_winmisc.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_win.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_win.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutos2.h \
|
||||
gl\os2mesa.h \
|
||||
gl\gl.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h
|
||||
|
||||
.\glut_warp.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_warp.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_vidresize.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_vidresize.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_util.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_util.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_tr24.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_tr24.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glut_teapot.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_teapot.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_swap.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_swap.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_stroke.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_stroke.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_shapes.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_shapes.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_roman.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_roman.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h
|
||||
|
||||
.\glut_modifier.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_modifier.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_mesa.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_mesa.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_keyup.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_keyup.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_keyctrl.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_keyctrl.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_key.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_key.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_input.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_input.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_init.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_init.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_hel18.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_hel18.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glut_hel12.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_hel12.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glut_hel10.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_hel10.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glut_get.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_get.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_gamemode.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_gamemode.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_fullscrn.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_fullscrn.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_ext.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_ext.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_event.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_event.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_cursor.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_cursor.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_cmap.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_cmap.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}layerutil.h
|
||||
|
||||
.\glut_cindex.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_cindex.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_bitmap.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_bitmap.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\glut_9x15.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_9x15.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glut_8x13.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glut_8x13.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
|
||||
|
||||
.\glutOverlay.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\glutOverlay.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
|
||||
|
||||
.\WarpWin.obj: \
|
||||
G:\EVGEN\MESA5\src-glut.os2pm\WarpWin.cpp \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpWin.h \
|
||||
{G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h
|
||||
|
||||
.\libGlut.LIB: \
|
||||
.\libGlut.dll
|
||||
@@ -1,419 +0,0 @@
|
||||
/* WarpWin.c */
|
||||
/* glut for Warp */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WarpWin.h"
|
||||
#include "WarpGL.h"
|
||||
|
||||
#define POKA 0
|
||||
|
||||
/* global variables that must be set for some functions to operate
|
||||
correctly. */
|
||||
HDC XHDC;
|
||||
HWND XHWND;
|
||||
|
||||
|
||||
void
|
||||
XStoreColor(Display* display, Colormap colormap, XColor* color)
|
||||
{
|
||||
/* KLUDGE: set XHDC to 0 if the palette should NOT be realized after
|
||||
setting the color. set XHDC to the correct HDC if it should. */
|
||||
|
||||
LONG pe;
|
||||
ULONG cclr;
|
||||
int r,g,b;
|
||||
/* X11 stores color from 0-65535, Win32 expects them to be 0-256, so
|
||||
twiddle the bits ( / 256). */
|
||||
r = color->red / 256;
|
||||
g = color->green / 256;
|
||||
b = color->blue / 256;
|
||||
pe = LONGFromRGB(r,g,b);
|
||||
/* make sure we use this flag, otherwise the colors might get mapped
|
||||
to another place in the colormap, and when we glIndex() that
|
||||
color, it may have moved (argh!!) */
|
||||
pe |= (PC_NOCOLLAPSE<<24);
|
||||
/* This function changes the entries in a palette. */
|
||||
#if POKA
|
||||
OS2:
|
||||
rc = GpiSetPaletteEntries(colormap,LCOLF_CONSECRGB, color->pixel, 1, &pe);
|
||||
GpiSelectPalette(hps,colormap);
|
||||
WinRealizePalette(hwnd,hps,&cclr);
|
||||
source Win:
|
||||
if (XHDC) {
|
||||
UnrealizeObject(colormap);
|
||||
SelectPalette(XHDC, colormap, FALSE);
|
||||
RealizePalette(XHDC);
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
XSetWindowColormap(Display* display, Window window, Colormap colormap)
|
||||
{
|
||||
#if POKA
|
||||
HDC hdc = GetDC(window);
|
||||
|
||||
/* if the third parameter is FALSE, the logical colormap is copied
|
||||
into the device palette when the application is in the
|
||||
foreground, if it is TRUE, the colors are mapped into the current
|
||||
palette in the best possible way. */
|
||||
SelectPalette(hdc, colormap, FALSE);
|
||||
RealizePalette(hdc);
|
||||
|
||||
/* note that we don't have to release the DC, since our window class
|
||||
uses the WC_OWNDC flag! */
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* display, root and visual - don't used at all */
|
||||
Colormap
|
||||
XCreateColormap(Display* display, Window root, Visual* visual, int alloc)
|
||||
{
|
||||
/* KLUDGE: this function needs XHDC to be set to the HDC currently
|
||||
being operated on before it is invoked! */
|
||||
|
||||
HPAL palette;
|
||||
int n;
|
||||
#if POKA
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
LOGPALETTE *logical;
|
||||
|
||||
/* grab the pixel format */
|
||||
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
|
||||
DescribePixelFormat(XHDC, GetPixelFormat(XHDC),
|
||||
sizeof(PIXELFORMATDESCRIPTOR), &pfd);
|
||||
|
||||
if (!(pfd.dwFlags & PFD_NEED_PALETTE ||
|
||||
pfd.iPixelType == PFD_TYPE_COLORINDEX))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
n = 1 << pfd.cColorBits;
|
||||
|
||||
/* allocate a bunch of memory for the logical palette (assume 256
|
||||
colors in a Win32 palette */
|
||||
logical = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +
|
||||
sizeof(PALETTEENTRY) * n);
|
||||
memset(logical, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n);
|
||||
|
||||
/* set the entries in the logical palette */
|
||||
logical->palVersion = 0x300;
|
||||
logical->palNumEntries = n;
|
||||
|
||||
/* start with a copy of the current system palette */
|
||||
GetSystemPaletteEntries(XHDC, 0, 256, &logical->palPalEntry[0]);
|
||||
|
||||
if (pfd.iPixelType == PFD_TYPE_RGBA) {
|
||||
int redMask = (1 << pfd.cRedBits) - 1;
|
||||
int greenMask = (1 << pfd.cGreenBits) - 1;
|
||||
int blueMask = (1 << pfd.cBlueBits) - 1;
|
||||
int i;
|
||||
|
||||
/* fill in an RGBA color palette */
|
||||
for (i = 0; i < n; ++i) {
|
||||
logical->palPalEntry[i].peRed =
|
||||
(((i >> pfd.cRedShift) & redMask) * 255) / redMask;
|
||||
logical->palPalEntry[i].peGreen =
|
||||
(((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask;
|
||||
logical->palPalEntry[i].peBlue =
|
||||
(((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask;
|
||||
logical->palPalEntry[i].peFlags = 0;
|
||||
}
|
||||
}
|
||||
|
||||
palette = CreatePalette(logical);
|
||||
free(logical);
|
||||
|
||||
SelectPalette(XHDC, palette, FALSE);
|
||||
RealizePalette(XHDC);
|
||||
#endif /* POKA */
|
||||
|
||||
return palette;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int GetSystemMetrics( int mode)
|
||||
{ RECTL rect;
|
||||
|
||||
switch(mode)
|
||||
{ case SM_CXSCREEN:
|
||||
WinQueryWindowRect(HWND_DESKTOP,&rect);
|
||||
return (rect.xRight-rect.xLeft);
|
||||
break;
|
||||
case SM_CYSCREEN:
|
||||
WinQueryWindowRect(HWND_DESKTOP,&rect);
|
||||
return (rect.yTop-rect.yBottom);
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* XParseGeometry parses strings of the form
|
||||
* "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
|
||||
* width, height, xoffset, and yoffset are unsigned integers.
|
||||
* Example: "=80x24+300-49"
|
||||
* The equal sign is optional.
|
||||
* It returns a bitmask that indicates which of the four values
|
||||
* were actually found in the string. For each value found,
|
||||
* the corresponding argument is updated; for each value
|
||||
* not found, the corresponding argument is left unchanged.
|
||||
*/
|
||||
|
||||
static int
|
||||
ReadInteger(char *string, char **NextString)
|
||||
{
|
||||
register int Result = 0;
|
||||
int Sign = 1;
|
||||
|
||||
if (*string == '+')
|
||||
string++;
|
||||
else if (*string == '-')
|
||||
{
|
||||
string++;
|
||||
Sign = -1;
|
||||
}
|
||||
for (; (*string >= '0') && (*string <= '9'); string++)
|
||||
{
|
||||
Result = (Result * 10) + (*string - '0');
|
||||
}
|
||||
*NextString = string;
|
||||
if (Sign >= 0)
|
||||
return (Result);
|
||||
else
|
||||
return (-Result);
|
||||
}
|
||||
|
||||
int XParseGeometry(char *string, int *x, int *y, unsigned int *width, unsigned int *height)
|
||||
{
|
||||
int mask = NoValue;
|
||||
register char *strind;
|
||||
unsigned int tempWidth, tempHeight;
|
||||
int tempX, tempY;
|
||||
char *nextCharacter;
|
||||
|
||||
if ( (string == NULL) || (*string == '\0')) return(mask);
|
||||
if (*string == '=')
|
||||
string++; /* ignore possible '=' at beg of geometry spec */
|
||||
|
||||
strind = (char *)string;
|
||||
if (*strind != '+' && *strind != '-' && *strind != 'x') {
|
||||
tempWidth = ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return (0);
|
||||
strind = nextCharacter;
|
||||
mask |= WidthValue;
|
||||
}
|
||||
|
||||
if (*strind == 'x' || *strind == 'X') {
|
||||
strind++;
|
||||
tempHeight = ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return (0);
|
||||
strind = nextCharacter;
|
||||
mask |= HeightValue;
|
||||
}
|
||||
|
||||
if ((*strind == '+') || (*strind == '-')) {
|
||||
if (*strind == '-') {
|
||||
strind++;
|
||||
tempX = -ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return (0);
|
||||
strind = nextCharacter;
|
||||
mask |= XNegative;
|
||||
|
||||
}
|
||||
else
|
||||
{ strind++;
|
||||
tempX = ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return(0);
|
||||
strind = nextCharacter;
|
||||
}
|
||||
mask |= XValue;
|
||||
if ((*strind == '+') || (*strind == '-')) {
|
||||
if (*strind == '-') {
|
||||
strind++;
|
||||
tempY = -ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return(0);
|
||||
strind = nextCharacter;
|
||||
mask |= YNegative;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
strind++;
|
||||
tempY = ReadInteger(strind, &nextCharacter);
|
||||
if (strind == nextCharacter)
|
||||
return(0);
|
||||
strind = nextCharacter;
|
||||
}
|
||||
mask |= YValue;
|
||||
}
|
||||
}
|
||||
|
||||
/* If strind isn't at the end of the string the it's an invalid
|
||||
geometry specification. */
|
||||
|
||||
if (*strind != '\0') return (0);
|
||||
|
||||
if (mask & XValue)
|
||||
*x = tempX;
|
||||
if (mask & YValue)
|
||||
*y = tempY;
|
||||
if (mask & WidthValue)
|
||||
*width = tempWidth;
|
||||
if (mask & HeightValue)
|
||||
*height = tempHeight;
|
||||
return (mask);
|
||||
}
|
||||
|
||||
int gettimeofday(struct timeval* tp, void* tzp)
|
||||
{
|
||||
DATETIME DateTime;
|
||||
APIRET ulrc; /* Return Code. */
|
||||
|
||||
ulrc = DosGetDateTime(&DateTime);
|
||||
tp->tv_sec = 60 * (60*DateTime.hours + DateTime.minutes) + DateTime.seconds;
|
||||
tp->tv_usec = DateTime.hundredths * 10000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
XPending(Display* display)
|
||||
{
|
||||
/* similar functionality...I don't think that it is exact, but this
|
||||
will have to do. */
|
||||
QMSG msg;
|
||||
extern HAB hab; /* PM anchor block handle */
|
||||
|
||||
//?? WinPeekMsg(hab
|
||||
return WinPeekMsg(hab, &msg, NULLHANDLE, 0, 0, PM_NOREMOVE);
|
||||
}
|
||||
|
||||
void
|
||||
__glutAdjustCoords(Window parent, int* x, int* y, int* width, int* height)
|
||||
{
|
||||
RECTL rect;
|
||||
|
||||
/* adjust the window rectangle because Win32 thinks that the x, y,
|
||||
width & height are the WHOLE window (including decorations),
|
||||
whereas GLUT treats the x, y, width & height as only the CLIENT
|
||||
area of the window. */
|
||||
rect.xLeft = *x; rect.yTop = *y;
|
||||
rect.xRight = *x + *width; rect.yBottom = *y + *height;
|
||||
|
||||
/* must adjust the coordinates according to the correct style
|
||||
because depending on the style, there may or may not be
|
||||
borders. */
|
||||
//?? AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
|
||||
//?? (parent ? WS_CHILD : WS_OVERLAPPEDWINDOW),
|
||||
//?? FALSE);
|
||||
/* FALSE in the third parameter = window has no menu bar */
|
||||
|
||||
/* readjust if the x and y are offscreen */
|
||||
if(rect.xLeft < 0) {
|
||||
*x = 0;
|
||||
} else {
|
||||
*x = rect.xLeft;
|
||||
}
|
||||
|
||||
if(rect.yTop < 0) {
|
||||
*y = 0;
|
||||
} else {
|
||||
*y = rect.yTop;
|
||||
}
|
||||
|
||||
*width = rect.xRight - rect.xLeft; /* adjusted width */
|
||||
*height = -(rect.yBottom - rect.yTop); /* adjusted height */
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glutGetTransparentPixel(Display * dpy, XVisualInfo * vinfo)
|
||||
{
|
||||
/* the transparent pixel on Win32 is always index number 0. So if
|
||||
we put this routine in this file, we can avoid compiling the
|
||||
whole of layerutil.c which is where this routine normally comes
|
||||
from. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Translate point coordinates src_x and src_y from src to dst */
|
||||
|
||||
Bool
|
||||
XTranslateCoordinates(Display *display, Window src, Window dst,
|
||||
int src_x, int src_y,
|
||||
int* dest_x_return, int* dest_y_return,
|
||||
Window* child_return)
|
||||
{
|
||||
SWP swp_src,swp_dst;
|
||||
|
||||
WinQueryWindowPos(src,&swp_src);
|
||||
WinQueryWindowPos(dst,&swp_dst);
|
||||
|
||||
*dest_x_return = src_x + swp_src.x - swp_dst.x;
|
||||
*dest_y_return = src_y + swp_src.y - swp_dst.y;
|
||||
|
||||
/* just to make compilers happy...we don't use the return value. */
|
||||
return True;
|
||||
}
|
||||
|
||||
Status
|
||||
XGetGeometry(Display* display, Window window, Window* root_return,
|
||||
int* x_return, int* y_return,
|
||||
unsigned int* width_return, unsigned int* height_return,
|
||||
unsigned int *border_width_return, unsigned int* depth_return)
|
||||
{
|
||||
/* KLUDGE: doesn't return the border_width or depth or root, x & y
|
||||
are in screen coordinates. */
|
||||
SWP swp_src;
|
||||
WinQueryWindowPos(window,&swp_src);
|
||||
|
||||
*x_return = swp_src.x;
|
||||
*y_return = swp_src.y;
|
||||
*width_return = swp_src.cx;
|
||||
*height_return = swp_src.cy;
|
||||
|
||||
/* just to make compilers happy...we don't use the return value. */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Get Display Width in millimeters */
|
||||
int
|
||||
DisplayWidthMM(Display* display, int screen)
|
||||
{
|
||||
int width;
|
||||
LONG *pVC_Caps;
|
||||
pVC_Caps = GetVideoConfig(NULLHANDLE);
|
||||
width = (int)( 0.001 * pVC_Caps[CAPS_WIDTH] / pVC_Caps[CAPS_HORIZONTAL_RESOLUTION]);/* mm */
|
||||
return width;
|
||||
}
|
||||
|
||||
/* Get Display Height in millimeters */
|
||||
int
|
||||
DisplayHeightMM(Display* display, int screen)
|
||||
{
|
||||
int height;
|
||||
LONG *pVC_Caps;
|
||||
pVC_Caps = GetVideoConfig(NULLHANDLE);
|
||||
height = (int)( 0.001 * pVC_Caps[CAPS_HEIGHT] / pVC_Caps[CAPS_VERTICAL_RESOLUTION]); /* mm */
|
||||
return height;
|
||||
}
|
||||
|
||||
void ScreenToClient( HWND hwnd, POINTL *point)
|
||||
{
|
||||
SWP swp_src;
|
||||
WinQueryWindowPos(hwnd,&swp_src);
|
||||
point->x -= swp_src.x;
|
||||
point->y -= swp_src.y;
|
||||
}
|
||||
|
||||
@@ -1,133 +0,0 @@
|
||||
/***********************************************************
|
||||
* Copyright (C) 1997, Be Inc. All rights reserved.
|
||||
*
|
||||
* FILE: glutOverlay.cpp
|
||||
*
|
||||
* DESCRIPTION: we don't support overlays, so this code is
|
||||
* really simple
|
||||
***********************************************************/
|
||||
|
||||
/***********************************************************
|
||||
* Headers
|
||||
***********************************************************/
|
||||
#include <GL/glut.h>
|
||||
#include "glutint.h"
|
||||
#include "glutbitmap.h"
|
||||
#include "glutstroke.h"
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutEstablishOverlay(void)
|
||||
{
|
||||
__glutFatalError("OS2PM lacks overlay support.");
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutUseLayer(GLenum layer) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutRemoveOverlay(void) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutPostOverlayRedisplay(void) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutShowOverlay(void) {
|
||||
// ignore
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY glutHideOverlay(void)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutLayerGet(GLenum param)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
/***********************************************************
|
||||
* Unsupported callbacks
|
||||
***********************************************************/
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutOverlayDisplayFunc(GLUTdisplayCB displayFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutSpaceballMotionFunc(GLUTspaceMotionCB spaceMotionFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutSpaceballRotateFunc(GLUTspaceRotateCB spaceRotateFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutSpaceballButtonFunc(GLUTspaceButtonCB spaceButtonFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutButtonBoxFunc(GLUTbuttonBoxCB buttonBoxFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutDialsFunc(GLUTdialsCB dialsFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutTabletMotionFunc(GLUTtabletMotionCB tabletMotionFunc)
|
||||
{
|
||||
}
|
||||
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutTabletButtonFunc(GLUTtabletButtonCB tabletButtonFunc)
|
||||
{
|
||||
}
|
||||
GLUTAPI void GLUTAPIENTRY
|
||||
glutPostWindowOverlayRedisplay(int win)
|
||||
{ //
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutInitDisplayString(const char *string)
|
||||
{ //
|
||||
}
|
||||
void GLUTAPIENTRY
|
||||
glutJoystickFunc(GLUTjoystickCB joystickFunc, int pollInterval)
|
||||
{ //
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutForceJoystickFunc(void)
|
||||
{ //
|
||||
}
|
||||
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutBitmapWidth(GLUTbitmapFont font, int c)
|
||||
{ return 0;
|
||||
}
|
||||
int GLUTAPIENTRY
|
||||
glutBitmapLength(GLUTbitmapFont font, const unsigned char *string)
|
||||
{ //
|
||||
return 0;
|
||||
}
|
||||
int GLUTAPIENTRY
|
||||
glutStrokeWidth(GLUTstrokeFont font, int c)
|
||||
{ return 0;
|
||||
}
|
||||
int GLUTAPIENTRY
|
||||
glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
|
||||
{ return 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,57 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include "glutint.h"
|
||||
#include "glutbitmap.h"
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutBitmapCharacter(GLUTbitmapFont font, int c)
|
||||
{
|
||||
const BitmapCharRec *ch;
|
||||
BitmapFontPtr fontinfo;
|
||||
GLint swapbytes, lsbfirst, rowlength;
|
||||
GLint skiprows, skippixels, alignment;
|
||||
|
||||
#if defined(_WIN32)
|
||||
fontinfo = (BitmapFontPtr) __glutFont(font);
|
||||
#else
|
||||
fontinfo = (BitmapFontPtr) font;
|
||||
#endif
|
||||
|
||||
if (c < fontinfo->first ||
|
||||
c >= fontinfo->first + fontinfo->num_chars)
|
||||
return;
|
||||
ch = fontinfo->ch[c - fontinfo->first];
|
||||
if (ch) {
|
||||
/* Save current modes. */
|
||||
glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
|
||||
glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
|
||||
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
|
||||
glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
|
||||
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
|
||||
glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
|
||||
/* Little endian machines (DEC Alpha for example) could
|
||||
benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
|
||||
instead of GL_FALSE, but this would require changing the
|
||||
generated bitmaps too. */
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
|
||||
ch->advance, 0, ch->bitmap);
|
||||
/* Restore saved modes. */
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
|
||||
}
|
||||
}
|
||||
@@ -1,258 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "glutint.h"
|
||||
|
||||
#if defined(__OS2PM__)
|
||||
#define IsWindowVisible WinIsWindowVisible
|
||||
#endif
|
||||
|
||||
#define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutSetColor(int ndx, GLfloat red, GLfloat green, GLfloat blue)
|
||||
{
|
||||
GLUTcolormap *cmap, *newcmap;
|
||||
XVisualInfo *vis;
|
||||
XColor color;
|
||||
int i;
|
||||
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
cmap = __glutCurrentWindow->colormap;
|
||||
vis = __glutCurrentWindow->vis;
|
||||
} else {
|
||||
cmap = __glutCurrentWindow->overlay->colormap;
|
||||
vis = __glutCurrentWindow->overlay->vis;
|
||||
if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
|
||||
__glutWarning(
|
||||
"glutSetColor: cannot set color of overlay transparent index %d\n",
|
||||
ndx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cmap) {
|
||||
__glutWarning("glutSetColor: current window is RGBA");
|
||||
return;
|
||||
}
|
||||
#if defined(_WIN32) || defined(__OS2PM__)
|
||||
if (ndx >= 256 || /* always assume 256 colors on Win32 */
|
||||
#else
|
||||
if (ndx >= vis->visual->map_entries ||
|
||||
#endif
|
||||
ndx < 0) {
|
||||
__glutWarning("glutSetColor: index %d out of range", ndx);
|
||||
return;
|
||||
}
|
||||
if (cmap->refcnt > 1) {
|
||||
newcmap = __glutAssociateNewColormap(vis);
|
||||
cmap->refcnt--;
|
||||
/* Wouldn't it be nice if XCopyColormapAndFree could be
|
||||
told not to free the old colormap's entries! */
|
||||
for (i = cmap->size - 1; i >= 0; i--) {
|
||||
if (i == ndx) {
|
||||
/* We are going to set this cell shortly! */
|
||||
continue;
|
||||
}
|
||||
if (cmap->cells[i].component[GLUT_RED] >= 0.0) {
|
||||
color.pixel = i;
|
||||
newcmap->cells[i].component[GLUT_RED] =
|
||||
cmap->cells[i].component[GLUT_RED];
|
||||
color.red = (GLfloat) 0xffff *
|
||||
cmap->cells[i].component[GLUT_RED];
|
||||
newcmap->cells[i].component[GLUT_GREEN] =
|
||||
cmap->cells[i].component[GLUT_GREEN];
|
||||
color.green = (GLfloat) 0xffff *
|
||||
cmap->cells[i].component[GLUT_GREEN];
|
||||
newcmap->cells[i].component[GLUT_BLUE] =
|
||||
cmap->cells[i].component[GLUT_BLUE];
|
||||
color.blue = (GLfloat) 0xffff *
|
||||
cmap->cells[i].component[GLUT_BLUE];
|
||||
color.flags = DoRed | DoGreen | DoBlue;
|
||||
#if defined(_WIN32) || defined(__OS2PM__)
|
||||
if (IsWindowVisible(__glutCurrentWindow->win)) {
|
||||
XHDC = __glutCurrentWindow->hdc;
|
||||
} else {
|
||||
XHDC = 0;
|
||||
}
|
||||
#endif
|
||||
XStoreColor(__glutDisplay, newcmap->cmap, &color);
|
||||
} else {
|
||||
/* Leave unallocated entries unallocated. */
|
||||
}
|
||||
}
|
||||
cmap = newcmap;
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
__glutCurrentWindow->colormap = cmap;
|
||||
__glutCurrentWindow->cmap = cmap->cmap;
|
||||
} else {
|
||||
__glutCurrentWindow->overlay->colormap = cmap;
|
||||
__glutCurrentWindow->overlay->cmap = cmap->cmap;
|
||||
}
|
||||
XSetWindowColormap(__glutDisplay,
|
||||
__glutCurrentWindow->renderWin, cmap->cmap);
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
{
|
||||
GLUTwindow *toplevel;
|
||||
|
||||
toplevel = __glutToplevelOf(__glutCurrentWindow);
|
||||
if (toplevel->cmap != cmap->cmap) {
|
||||
__glutPutOnWorkList(toplevel, GLUT_COLORMAP_WORK);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
color.pixel = ndx;
|
||||
red = CLAMP(red);
|
||||
cmap->cells[ndx].component[GLUT_RED] = red;
|
||||
color.red = (GLfloat) 0xffff *red;
|
||||
green = CLAMP(green);
|
||||
cmap->cells[ndx].component[GLUT_GREEN] = green;
|
||||
color.green = (GLfloat) 0xffff *green;
|
||||
blue = CLAMP(blue);
|
||||
cmap->cells[ndx].component[GLUT_BLUE] = blue;
|
||||
color.blue = (GLfloat) 0xffff *blue;
|
||||
color.flags = DoRed | DoGreen | DoBlue;
|
||||
#if defined(_WIN32) || defined(__OS2PM__)
|
||||
if (IsWindowVisible(__glutCurrentWindow->win)) {
|
||||
XHDC = __glutCurrentWindow->hdc;
|
||||
} else {
|
||||
XHDC = 0;
|
||||
}
|
||||
#endif
|
||||
XStoreColor(__glutDisplay, cmap->cmap, &color);
|
||||
}
|
||||
|
||||
GLfloat GLUTAPIENTRY
|
||||
glutGetColor(int ndx, int comp)
|
||||
{
|
||||
GLUTcolormap *colormap;
|
||||
XVisualInfo *vis;
|
||||
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
colormap = __glutCurrentWindow->colormap;
|
||||
vis = __glutCurrentWindow->vis;
|
||||
} else {
|
||||
colormap = __glutCurrentWindow->overlay->colormap;
|
||||
vis = __glutCurrentWindow->overlay->vis;
|
||||
if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
|
||||
__glutWarning("glutGetColor: requesting overlay transparent index %d\n",
|
||||
ndx);
|
||||
return -1.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!colormap) {
|
||||
__glutWarning("glutGetColor: current window is RGBA");
|
||||
return -1.0;
|
||||
}
|
||||
#if defined(_WIN32) || defined(__OS2PM__)
|
||||
#define OUT_OF_RANGE_NDX(ndx) (ndx >= 256 || ndx < 0)
|
||||
#else
|
||||
#define OUT_OF_RANGE_NDX(ndx) (ndx >= vis->visual->map_entries || ndx < 0)
|
||||
#endif
|
||||
if (OUT_OF_RANGE_NDX(ndx)) {
|
||||
__glutWarning("glutGetColor: index %d out of range", ndx);
|
||||
return -1.0;
|
||||
}
|
||||
return colormap->cells[ndx].component[comp];
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutCopyColormap(int winnum)
|
||||
{
|
||||
GLUTwindow *window = __glutWindowList[winnum - 1];
|
||||
GLUTcolormap *oldcmap, *newcmap;
|
||||
XVisualInfo *dstvis;
|
||||
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
oldcmap = __glutCurrentWindow->colormap;
|
||||
dstvis = __glutCurrentWindow->vis;
|
||||
newcmap = window->colormap;
|
||||
} else {
|
||||
oldcmap = __glutCurrentWindow->overlay->colormap;
|
||||
dstvis = __glutCurrentWindow->overlay->vis;
|
||||
if (!window->overlay) {
|
||||
__glutWarning("glutCopyColormap: window %d has no overlay", winnum);
|
||||
return;
|
||||
}
|
||||
newcmap = window->overlay->colormap;
|
||||
}
|
||||
|
||||
if (!oldcmap) {
|
||||
__glutWarning("glutCopyColormap: destination colormap must be color index");
|
||||
return;
|
||||
}
|
||||
if (!newcmap) {
|
||||
__glutWarning(
|
||||
"glutCopyColormap: source colormap of window %d must be color index",
|
||||
winnum);
|
||||
return;
|
||||
}
|
||||
if (newcmap == oldcmap) {
|
||||
/* Source and destination are the same; now copy needed. */
|
||||
return;
|
||||
}
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
/* Play safe: compare visual IDs, not Visual*'s. */
|
||||
if (newcmap->visual->visualid == oldcmap->visual->visualid) {
|
||||
#endif
|
||||
/* Visuals match! "Copy" by reference... */
|
||||
__glutFreeColormap(oldcmap);
|
||||
newcmap->refcnt++;
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
__glutCurrentWindow->colormap = newcmap;
|
||||
__glutCurrentWindow->cmap = newcmap->cmap;
|
||||
} else {
|
||||
__glutCurrentWindow->overlay->colormap = newcmap;
|
||||
__glutCurrentWindow->overlay->cmap = newcmap->cmap;
|
||||
}
|
||||
XSetWindowColormap(__glutDisplay, __glutCurrentWindow->renderWin,
|
||||
newcmap->cmap);
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
__glutPutOnWorkList(__glutToplevelOf(window), GLUT_COLORMAP_WORK);
|
||||
bla bla bla
|
||||
|
||||
} else {
|
||||
GLUTcolormap *copycmap;
|
||||
XColor color;
|
||||
int i, last;
|
||||
|
||||
/* Visuals different - need a distinct X colormap! */
|
||||
copycmap = __glutAssociateNewColormap(dstvis);
|
||||
/* Wouldn't it be nice if XCopyColormapAndFree could be
|
||||
told not to free the old colormap's entries! */
|
||||
last = newcmap->size;
|
||||
if (last > copycmap->size) {
|
||||
last = copycmap->size;
|
||||
}
|
||||
for (i = last - 1; i >= 0; i--) {
|
||||
if (newcmap->cells[i].component[GLUT_RED] >= 0.0) {
|
||||
color.pixel = i;
|
||||
copycmap->cells[i].component[GLUT_RED] =
|
||||
newcmap->cells[i].component[GLUT_RED];
|
||||
color.red = (GLfloat) 0xffff *
|
||||
newcmap->cells[i].component[GLUT_RED];
|
||||
copycmap->cells[i].component[GLUT_GREEN] =
|
||||
newcmap->cells[i].component[GLUT_GREEN];
|
||||
color.green = (GLfloat) 0xffff *
|
||||
newcmap->cells[i].component[GLUT_GREEN];
|
||||
copycmap->cells[i].component[GLUT_BLUE] =
|
||||
newcmap->cells[i].component[GLUT_BLUE];
|
||||
color.blue = (GLfloat) 0xffff *
|
||||
newcmap->cells[i].component[GLUT_BLUE];
|
||||
color.flags = DoRed | DoGreen | DoBlue;
|
||||
XStoreColor(__glutDisplay, copycmap->cmap, &color);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
@@ -1,399 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#ifdef __VMS
|
||||
//EK#include <GL/vms_x_fix.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h> /* SunOS multithreaded assert() needs <stdio.h>. Lame. */
|
||||
#include <assert.h>
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xatom.h> /* for XA_RGB_DEFAULT_MAP atom */
|
||||
#if defined(__vms)
|
||||
#include <Xmu/StdCmap.h> /* for XmuLookupStandardColormap */
|
||||
#else
|
||||
#include <X11/Xmu/StdCmap.h> /* for XmuLookupStandardColormap */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SGI optimization introduced in IRIX 6.3 to avoid X server
|
||||
round trips for interning common X atoms. */
|
||||
#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
|
||||
#include <X11/SGIFastAtom.h>
|
||||
#else
|
||||
#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
|
||||
#endif
|
||||
|
||||
#include "glutint.h"
|
||||
#include "layerutil.h"
|
||||
|
||||
GLUTcolormap *__glutColormapList = NULL;
|
||||
|
||||
GLUTcolormap *
|
||||
__glutAssociateNewColormap(XVisualInfo * vis)
|
||||
{
|
||||
GLUTcolormap *cmap;
|
||||
int transparentPixel, i;
|
||||
unsigned long pixels[255];
|
||||
|
||||
cmap = (GLUTcolormap *) malloc(sizeof(GLUTcolormap));
|
||||
if (!cmap)
|
||||
__glutFatalError("out of memory.");
|
||||
#if defined(_WIN32) || defined(__OS2__)
|
||||
pixels[0] = 0; /* avoid compilation warnings on win32 */
|
||||
cmap->visual = 0;
|
||||
cmap->size = 256; /* always assume 256 on Win32 */
|
||||
#else
|
||||
cmap->visual = vis->visual;
|
||||
cmap->size = vis->visual->map_entries;
|
||||
#endif
|
||||
cmap->refcnt = 1;
|
||||
cmap->cells = (GLUTcolorcell *)
|
||||
malloc(sizeof(GLUTcolorcell) * cmap->size);
|
||||
if (!cmap->cells)
|
||||
__glutFatalError("out of memory.");
|
||||
/* make all color cell entries be invalid */
|
||||
for (i = cmap->size - 1; i >= 0; i--) {
|
||||
cmap->cells[i].component[GLUT_RED] = -1.0;
|
||||
cmap->cells[i].component[GLUT_GREEN] = -1.0;
|
||||
cmap->cells[i].component[GLUT_BLUE] = -1.0;
|
||||
}
|
||||
transparentPixel = __glutGetTransparentPixel(__glutDisplay, vis);
|
||||
if (transparentPixel == -1 || transparentPixel >= cmap->size) {
|
||||
|
||||
/* If there is no transparent pixel or if the transparent
|
||||
pixel is outside the range of valid colormap cells (HP
|
||||
can implement their overlays this smart way since their
|
||||
transparent pixel is 255), we can AllocAll the colormap.
|
||||
See note below. */
|
||||
|
||||
cmap->cmap = XCreateColormap(__glutDisplay,
|
||||
__glutRoot, cmap->visual, AllocAll);
|
||||
} else {
|
||||
|
||||
/* On machines where zero (or some other value in the range
|
||||
of 0 through map_entries-1), BadAlloc may be generated
|
||||
when an AllocAll overlay colormap is allocated since the
|
||||
transparent pixel precludes all the cells in the colormap
|
||||
being allocated (the transparent pixel is pre-allocated).
|
||||
So in this case, use XAllocColorCells to allocate
|
||||
map_entries-1 pixels (that is, all but the transparent
|
||||
pixel. */
|
||||
|
||||
#if defined(_WIN32) || defined(__OS2__)
|
||||
cmap->cmap = XCreateColormap(__glutDisplay,
|
||||
__glutRoot, 0, AllocNone);
|
||||
#else
|
||||
cmap->cmap = XCreateColormap(__glutDisplay,
|
||||
__glutRoot, vis->visual, AllocNone);
|
||||
XAllocColorCells(__glutDisplay, cmap->cmap, False, 0, 0,
|
||||
pixels, cmap->size - 1);
|
||||
#endif
|
||||
}
|
||||
cmap->next = __glutColormapList;
|
||||
__glutColormapList = cmap;
|
||||
return cmap;
|
||||
}
|
||||
|
||||
static GLUTcolormap *
|
||||
associateColormap(XVisualInfo * vis)
|
||||
{
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
GLUTcolormap *cmap = __glutColormapList;
|
||||
|
||||
while (cmap != NULL) {
|
||||
/* Play safe: compare visual IDs, not Visual*'s. */
|
||||
if (cmap->visual->visualid == vis->visual->visualid) {
|
||||
/* Already have created colormap for the visual. */
|
||||
cmap->refcnt++;
|
||||
return cmap;
|
||||
}
|
||||
cmap = cmap->next;
|
||||
}
|
||||
#endif
|
||||
return __glutAssociateNewColormap(vis);
|
||||
}
|
||||
|
||||
void
|
||||
__glutSetupColormap(XVisualInfo * vi, GLUTcolormap ** colormap, Colormap * cmap)
|
||||
{
|
||||
#if defined(_WIN32) || defined(__OS2__)
|
||||
if (vi->dwFlags & PFD_NEED_PALETTE || vi->iPixelType == PFD_TYPE_COLORINDEX) {
|
||||
*colormap = associateColormap(vi);
|
||||
*cmap = (*colormap)->cmap;
|
||||
} else {
|
||||
*colormap = NULL;
|
||||
*cmap = 0;
|
||||
}
|
||||
#else
|
||||
Status status;
|
||||
XStandardColormap *standardCmaps;
|
||||
int i, numCmaps;
|
||||
static Atom hpColorRecoveryAtom = -1;
|
||||
int isRGB, visualClass, rc;
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
visualClass = vi->c_class;
|
||||
#else
|
||||
visualClass = vi->class;
|
||||
#endif
|
||||
switch (visualClass) {
|
||||
case PseudoColor:
|
||||
/* Mesa might return a PseudoColor visual for RGB mode. */
|
||||
rc = glXGetConfig(__glutDisplay, vi, GLX_RGBA, &isRGB);
|
||||
if (rc == 0 && isRGB) {
|
||||
/* Must be Mesa. */
|
||||
*colormap = NULL;
|
||||
if (MaxCmapsOfScreen(DefaultScreenOfDisplay(__glutDisplay)) == 1
|
||||
&& vi->visual == DefaultVisual(__glutDisplay, __glutScreen)) {
|
||||
char *privateCmap = getenv("MESA_PRIVATE_CMAP");
|
||||
|
||||
if (privateCmap) {
|
||||
/* User doesn't want to share colormaps. */
|
||||
*cmap = XCreateColormap(__glutDisplay, __glutRoot,
|
||||
vi->visual, AllocNone);
|
||||
} else {
|
||||
/* Share the root colormap. */
|
||||
*cmap = DefaultColormap(__glutDisplay, __glutScreen);
|
||||
}
|
||||
} else {
|
||||
/* Get our own PseudoColor colormap. */
|
||||
*cmap = XCreateColormap(__glutDisplay, __glutRoot,
|
||||
vi->visual, AllocNone);
|
||||
}
|
||||
} else {
|
||||
/* CI mode, real GLX never returns a PseudoColor visual
|
||||
for RGB mode. */
|
||||
*colormap = associateColormap(vi);
|
||||
*cmap = (*colormap)->cmap;
|
||||
}
|
||||
break;
|
||||
case TrueColor:
|
||||
case DirectColor:
|
||||
*colormap = NULL; /* NULL if RGBA */
|
||||
|
||||
/* Hewlett-Packard supports a feature called "HP Color
|
||||
Recovery". Mesa has code to use HP Color Recovery. For
|
||||
Mesa to use this feature, the atom
|
||||
_HP_RGB_SMOOTH_MAP_LIST must be defined on the root
|
||||
window AND the colormap obtainable by XGetRGBColormaps
|
||||
for that atom must be set on the window. If that
|
||||
colormap is not set, the output will look stripy. */
|
||||
|
||||
if (hpColorRecoveryAtom == -1) {
|
||||
char *xvendor;
|
||||
|
||||
#define VENDOR_HP "Hewlett-Packard"
|
||||
|
||||
/* Only makes sense to make XInternAtom round-trip if we
|
||||
know that we are connected to an HP X server. */
|
||||
xvendor = ServerVendor(__glutDisplay);
|
||||
if (!strncmp(xvendor, VENDOR_HP, sizeof(VENDOR_HP) - 1)) {
|
||||
hpColorRecoveryAtom = XInternAtom(__glutDisplay, "_HP_RGB_SMOOTH_MAP_LIST", True);
|
||||
} else {
|
||||
hpColorRecoveryAtom = None;
|
||||
}
|
||||
}
|
||||
if (hpColorRecoveryAtom != None) {
|
||||
status = XGetRGBColormaps(__glutDisplay, __glutRoot,
|
||||
&standardCmaps, &numCmaps, hpColorRecoveryAtom);
|
||||
if (status == 1) {
|
||||
for (i = 0; i < numCmaps; i++) {
|
||||
if (standardCmaps[i].visualid == vi->visualid) {
|
||||
*cmap = standardCmaps[i].colormap;
|
||||
XFree(standardCmaps);
|
||||
return;
|
||||
}
|
||||
}
|
||||
XFree(standardCmaps);
|
||||
}
|
||||
}
|
||||
#ifndef SOLARIS_2_4_BUG
|
||||
/* Solaris 2.4 and 2.5 have a bug in their
|
||||
XmuLookupStandardColormap implementations. Please
|
||||
compile your Solaris 2.4 or 2.5 version of GLUT with
|
||||
-DSOLARIS_2_4_BUG to work around this bug. The symptom
|
||||
of the bug is that programs will get a BadMatch error
|
||||
from X_CreateWindow when creating a GLUT window because
|
||||
Solaris 2.4 and 2.5 create a corrupted RGB_DEFAULT_MAP
|
||||
property. Note that this workaround prevents Colormap
|
||||
sharing between applications, perhaps leading
|
||||
unnecessary colormap installations or colormap flashing.
|
||||
Sun fixed this bug in Solaris 2.6. */
|
||||
status = XmuLookupStandardColormap(__glutDisplay,
|
||||
vi->screen, vi->visualid, vi->depth, XA_RGB_DEFAULT_MAP,
|
||||
/* replace */ False, /* retain */ True);
|
||||
if (status == 1) {
|
||||
status = XGetRGBColormaps(__glutDisplay, __glutRoot,
|
||||
&standardCmaps, &numCmaps, XA_RGB_DEFAULT_MAP);
|
||||
if (status == 1) {
|
||||
for (i = 0; i < numCmaps; i++) {
|
||||
if (standardCmaps[i].visualid == vi->visualid) {
|
||||
*cmap = standardCmaps[i].colormap;
|
||||
XFree(standardCmaps);
|
||||
return;
|
||||
}
|
||||
}
|
||||
XFree(standardCmaps);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* If no standard colormap but TrueColor, just make a
|
||||
private one. */
|
||||
/* XXX Should do a better job of internal sharing for
|
||||
privately allocated TrueColor colormaps. */
|
||||
/* XXX DirectColor probably needs ramps hand initialized! */
|
||||
*cmap = XCreateColormap(__glutDisplay, __glutRoot,
|
||||
vi->visual, AllocNone);
|
||||
break;
|
||||
case StaticColor:
|
||||
case StaticGray:
|
||||
case GrayScale:
|
||||
/* Mesa supports these visuals */
|
||||
*colormap = NULL;
|
||||
*cmap = XCreateColormap(__glutDisplay, __glutRoot,
|
||||
vi->visual, AllocNone);
|
||||
break;
|
||||
default:
|
||||
__glutFatalError(
|
||||
"could not allocate colormap for visual type: %d.",
|
||||
visualClass);
|
||||
}
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
static int
|
||||
findColormaps(GLUTwindow * window,
|
||||
Window * winlist, Colormap * cmaplist, int num, int max)
|
||||
{
|
||||
GLUTwindow *child;
|
||||
int i;
|
||||
|
||||
/* Do not allow more entries that maximum number of
|
||||
colormaps! */
|
||||
if (num >= max)
|
||||
return num;
|
||||
/* Is cmap for this window already on the list? */
|
||||
for (i = 0; i < num; i++) {
|
||||
if (cmaplist[i] == window->cmap)
|
||||
goto normalColormapAlreadyListed;
|
||||
}
|
||||
/* Not found on the list; add colormap and window. */
|
||||
winlist[num] = window->win;
|
||||
cmaplist[num] = window->cmap;
|
||||
num++;
|
||||
|
||||
normalColormapAlreadyListed:
|
||||
|
||||
/* Repeat above but for the overlay colormap if there one. */
|
||||
if (window->overlay) {
|
||||
if (num >= max)
|
||||
return num;
|
||||
for (i = 0; i < num; i++) {
|
||||
if (cmaplist[i] == window->overlay->cmap)
|
||||
goto overlayColormapAlreadyListed;
|
||||
}
|
||||
winlist[num] = window->overlay->win;
|
||||
cmaplist[num] = window->overlay->cmap;
|
||||
num++;
|
||||
}
|
||||
overlayColormapAlreadyListed:
|
||||
|
||||
/* Recursively search children. */
|
||||
child = window->children;
|
||||
while (child) {
|
||||
num = findColormaps(child, winlist, cmaplist, num, max);
|
||||
child = child->siblings;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
void
|
||||
__glutEstablishColormapsProperty(GLUTwindow * window)
|
||||
{
|
||||
/* this routine is strictly X. Win32 doesn't need to do
|
||||
anything of this sort (but has to do other wacky stuff
|
||||
later). */
|
||||
static Atom wmColormapWindows = None;
|
||||
Window *winlist;
|
||||
Colormap *cmaplist;
|
||||
Status status;
|
||||
int maxcmaps, num;
|
||||
|
||||
assert(!window->parent);
|
||||
maxcmaps = MaxCmapsOfScreen(ScreenOfDisplay(__glutDisplay,
|
||||
__glutScreen));
|
||||
/* For portability reasons we don't use alloca for winlist
|
||||
and cmaplist, but we could. */
|
||||
winlist = (Window *) malloc(maxcmaps * sizeof(Window));
|
||||
cmaplist = (Colormap *) malloc(maxcmaps * sizeof(Colormap));
|
||||
num = findColormaps(window, winlist, cmaplist, 0, maxcmaps);
|
||||
if (num < 2) {
|
||||
/* Property no longer needed; remove it. */
|
||||
wmColormapWindows = XSGIFastInternAtom(__glutDisplay,
|
||||
"WM_COLORMAP_WINDOWS", SGI_XA_WM_COLORMAP_WINDOWS, False);
|
||||
if (wmColormapWindows == None) {
|
||||
__glutWarning("Could not intern X atom for WM_COLORMAP_WINDOWS.");
|
||||
return;
|
||||
}
|
||||
XDeleteProperty(__glutDisplay, window->win, wmColormapWindows);
|
||||
} else {
|
||||
status = XSetWMColormapWindows(__glutDisplay, window->win,
|
||||
winlist, num);
|
||||
/* XSetWMColormapWindows should always work unless the
|
||||
WM_COLORMAP_WINDOWS property cannot be intern'ed. We
|
||||
check to be safe. */
|
||||
if (status == False)
|
||||
__glutFatalError("XSetWMColormapWindows returned False.");
|
||||
}
|
||||
/* For portability reasons we don't use alloca for winlist
|
||||
and cmaplist, but we could. */
|
||||
free(winlist);
|
||||
free(cmaplist);
|
||||
}
|
||||
|
||||
GLUTwindow *
|
||||
__glutToplevelOf(GLUTwindow * window)
|
||||
{
|
||||
while (window->parent) {
|
||||
window = window->parent;
|
||||
}
|
||||
return window;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
__glutFreeColormap(GLUTcolormap * cmap)
|
||||
{
|
||||
GLUTcolormap *cur, **prev;
|
||||
|
||||
cmap->refcnt--;
|
||||
if (cmap->refcnt == 0) {
|
||||
/* remove from colormap list */
|
||||
cur = __glutColormapList;
|
||||
prev = &__glutColormapList;
|
||||
while (cur) {
|
||||
if (cur == cmap) {
|
||||
*prev = cmap->next;
|
||||
break;
|
||||
}
|
||||
prev = &(cur->next);
|
||||
cur = cur->next;
|
||||
}
|
||||
/* actually free colormap */
|
||||
XFreeColormap(__glutDisplay, cmap->cmap);
|
||||
free(cmap->cells);
|
||||
free(cmap);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,210 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1995, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
#include <X11/Xatom.h> /* For XA_CURSOR */
|
||||
#include <X11/cursorfont.h>
|
||||
#endif
|
||||
|
||||
typedef struct _CursorTable {
|
||||
#if defined(_WIN32)
|
||||
char* glyph;
|
||||
#else
|
||||
int glyph;
|
||||
#endif
|
||||
Cursor cursor;
|
||||
} CursorTable;
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
static CursorTable cursorTable[] = {
|
||||
{XC_arrow, None}, /* GLUT_CURSOR_RIGHT_ARROW */
|
||||
{XC_top_left_arrow, None}, /* GLUT_CURSOR_LEFT_ARROW */
|
||||
{XC_hand1, None}, /* GLUT_CURSOR_INFO */
|
||||
{XC_pirate, None}, /* GLUT_CURSOR_DESTROY */
|
||||
{XC_question_arrow, None}, /* GLUT_CURSOR_HELP */
|
||||
{XC_exchange, None}, /* GLUT_CURSOR_CYCLE */
|
||||
{XC_spraycan, None}, /* GLUT_CURSOR_SPRAY */
|
||||
{XC_watch, None}, /* GLUT_CURSOR_WAIT */
|
||||
{XC_xterm, None}, /* GLUT_CURSOR_TEXT */
|
||||
{XC_crosshair, None}, /* GLUT_CURSOR_CROSSHAIR */
|
||||
{XC_sb_v_double_arrow, None}, /* GLUT_CURSOR_UP_DOWN */
|
||||
{XC_sb_h_double_arrow, None}, /* GLUT_CURSOR_LEFT_RIGHT */
|
||||
{XC_top_side, None}, /* GLUT_CURSOR_TOP_SIDE */
|
||||
{XC_bottom_side, None}, /* GLUT_CURSOR_BOTTOM_SIDE */
|
||||
{XC_left_side, None}, /* GLUT_CURSOR_LEFT_SIDE */
|
||||
{XC_right_side, None}, /* GLUT_CURSOR_RIGHT_SIDE */
|
||||
{XC_top_left_corner, None}, /* GLUT_CURSOR_TOP_LEFT_CORNER */
|
||||
{XC_top_right_corner, None}, /* GLUT_CURSOR_TOP_RIGHT_CORNER */
|
||||
{XC_bottom_right_corner, None}, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
|
||||
{XC_bottom_left_corner, None}, /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
|
||||
};
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
static Cursor blankCursor = None;
|
||||
static Cursor fullCrosshairCusor = None;
|
||||
|
||||
/* SGI X server's support a special property called the
|
||||
_SGI_CROSSHAIR_CURSOR that when installed as a window's
|
||||
cursor, becomes a full screen crosshair cursor. SGI
|
||||
has special cursor generation hardware for this case. */
|
||||
static Cursor
|
||||
getFullCrosshairCursor(void)
|
||||
{
|
||||
Cursor cursor;
|
||||
Atom crosshairAtom, actualType;
|
||||
int rc, actualFormat;
|
||||
unsigned long n, left;
|
||||
unsigned long *value;
|
||||
|
||||
if (fullCrosshairCusor == None) {
|
||||
crosshairAtom = XInternAtom(__glutDisplay,
|
||||
"_SGI_CROSSHAIR_CURSOR", True);
|
||||
if (crosshairAtom != None) {
|
||||
value = 0; /* Make compiler happy. */
|
||||
rc = XGetWindowProperty(__glutDisplay, __glutRoot,
|
||||
crosshairAtom, 0, 1, False, XA_CURSOR, &actualType,
|
||||
&actualFormat, &n, &left, (unsigned char **) &value);
|
||||
if (rc == Success && actualFormat == 32 && n >= 1) {
|
||||
cursor = value[0];
|
||||
XFree(value);
|
||||
return cursor;
|
||||
}
|
||||
}
|
||||
}
|
||||
return XCreateFontCursor(__glutDisplay, XC_crosshair);
|
||||
}
|
||||
|
||||
/* X11 forces you to create a blank cursor if you want
|
||||
to disable the cursor. */
|
||||
static Cursor
|
||||
makeBlankCursor(void)
|
||||
{
|
||||
static char data[1] =
|
||||
{0};
|
||||
Cursor cursor;
|
||||
Pixmap blank;
|
||||
XColor dummy;
|
||||
|
||||
blank = XCreateBitmapFromData(__glutDisplay, __glutRoot,
|
||||
data, 1, 1);
|
||||
if (blank == None)
|
||||
__glutFatalError("out of memory.");
|
||||
cursor = XCreatePixmapCursor(__glutDisplay, blank, blank,
|
||||
&dummy, &dummy, 0, 0);
|
||||
XFreePixmap(__glutDisplay, blank);
|
||||
|
||||
return cursor;
|
||||
}
|
||||
#endif /* !_WIN32 && !__OS2PM__*/
|
||||
|
||||
/* Win32 and X11 use this same function to accomplish
|
||||
fairly different tasks. X11 lets you just define the
|
||||
cursor for a window and the window system takes care
|
||||
of making sure that the window's cursor is installed
|
||||
when the mouse is in the window. Win32 requires the
|
||||
application to handle a WM_SETCURSOR message to install
|
||||
the right cursor when windows are entered. Think of
|
||||
the Win32 __glutSetCursor (called from __glutWindowProc)
|
||||
as "install cursor". Think of the X11 __glutSetCursor
|
||||
(called from glutSetCursor) as "define cursor". */
|
||||
void
|
||||
__glutSetCursor(GLUTwindow *window)
|
||||
{
|
||||
int cursor = window->cursor;
|
||||
Cursor xcursor = 0;
|
||||
|
||||
if (cursor >= 0 &&
|
||||
cursor < sizeof(cursorTable) / sizeof(cursorTable[0])) {
|
||||
if (cursorTable[cursor].cursor == None) {
|
||||
cursorTable[cursor].cursor = XCreateFontCursor(__glutDisplay,
|
||||
cursorTable[cursor].glyph);
|
||||
}
|
||||
xcursor = cursorTable[cursor].cursor;
|
||||
} else {
|
||||
/* Special cases. */
|
||||
switch (cursor) {
|
||||
case GLUT_CURSOR_INHERIT:
|
||||
#if defined(_WIN32)
|
||||
while (window->parent) {
|
||||
window = window->parent;
|
||||
if (window->cursor != GLUT_CURSOR_INHERIT) {
|
||||
__glutSetCursor(window);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* XXX Default to an arrow cursor. Is this
|
||||
right or should we be letting the default
|
||||
window proc be installing some system cursor? */
|
||||
xcursor = cursorTable[0].cursor;
|
||||
if (xcursor == NULL) {
|
||||
xcursor =
|
||||
cursorTable[0].cursor =
|
||||
LoadCursor(NULL, cursorTable[0].glyph);
|
||||
}
|
||||
|
||||
#elif defined(__OS2PM__)
|
||||
//todo
|
||||
xcursor = None;
|
||||
|
||||
#else
|
||||
xcursor = None;
|
||||
#endif
|
||||
break;
|
||||
case GLUT_CURSOR_NONE:
|
||||
#if defined(_WIN32) || defined(__OS2PM__)
|
||||
xcursor = NULL;
|
||||
#else
|
||||
if (blankCursor == None) {
|
||||
blankCursor = makeBlankCursor();
|
||||
}
|
||||
xcursor = blankCursor;
|
||||
#endif
|
||||
break;
|
||||
case GLUT_CURSOR_FULL_CROSSHAIR:
|
||||
#if defined(_WIN32)
|
||||
xcursor = (HICON) IDC_CROSS;
|
||||
#elif defined(__OS2PM__)
|
||||
//todo
|
||||
#else
|
||||
if (fullCrosshairCusor == None) {
|
||||
fullCrosshairCusor = getFullCrosshairCursor();
|
||||
}
|
||||
xcursor = fullCrosshairCusor;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
XDefineCursor(__glutDisplay,
|
||||
window->win, xcursor);
|
||||
XFlush(__glutDisplay);
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutSetCursor(int cursor)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
POINT point;
|
||||
|
||||
__glutCurrentWindow->cursor = cursor;
|
||||
/* Are we in the window right now? If so,
|
||||
install the cursor. */
|
||||
GetCursorPos(&point);
|
||||
if (__glutCurrentWindow->win == WindowFromPoint(point)) {
|
||||
__glutSetCursor(__glutCurrentWindow);
|
||||
}
|
||||
#elif defined(__OS2PM__)
|
||||
//todo
|
||||
#else
|
||||
__glutCurrentWindow->cursor = cursor;
|
||||
__glutSetCursor(__glutCurrentWindow);
|
||||
#endif
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,204 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
int GLUTAPIENTRY
|
||||
glutExtensionSupported(const char *extension)
|
||||
{
|
||||
static const GLubyte *extensions = NULL;
|
||||
const GLubyte *start;
|
||||
GLubyte *where, *terminator;
|
||||
|
||||
/* Extension names should not have spaces. */
|
||||
where = (GLubyte *) strchr(extension, ' ');
|
||||
if (where || *extension == '\0')
|
||||
return 0;
|
||||
|
||||
if (!extensions) {
|
||||
extensions = glGetString(GL_EXTENSIONS);
|
||||
}
|
||||
/* It takes a bit of care to be fool-proof about parsing the
|
||||
OpenGL extensions string. Don't be fooled by sub-strings,
|
||||
etc. */
|
||||
start = extensions;
|
||||
for (;;) {
|
||||
/* If your application crashes in the strstr routine below,
|
||||
you are probably calling glutExtensionSupported without
|
||||
having a current window. Calling glGetString without
|
||||
a current OpenGL context has unpredictable results.
|
||||
Please fix your program. */
|
||||
where = (GLubyte *) strstr((const char *) start, extension);
|
||||
if (!where)
|
||||
break;
|
||||
terminator = where + strlen(extension);
|
||||
if (where == start || *(where - 1) == ' ') {
|
||||
if (*terminator == ' ' || *terminator == '\0') {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
start = terminator;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct name_address_pair {
|
||||
const char *name;
|
||||
const void *address;
|
||||
};
|
||||
|
||||
static struct name_address_pair glut_functions[] = {
|
||||
{ "glutInit", (const void *) glutInit },
|
||||
{ "glutInitDisplayMode", (const void *) glutInitDisplayMode },
|
||||
{ "glutInitDisplayString", (const void *) glutInitDisplayString },
|
||||
{ "glutInitWindowPosition", (const void *) glutInitWindowPosition },
|
||||
{ "glutInitWindowSize", (const void *) glutInitWindowSize },
|
||||
{ "glutMainLoop", (const void *) glutMainLoop },
|
||||
{ "glutCreateWindow", (const void *) glutCreateWindow },
|
||||
{ "glutCreateSubWindow", (const void *) glutCreateSubWindow },
|
||||
{ "glutDestroyWindow", (const void *) glutDestroyWindow },
|
||||
{ "glutPostRedisplay", (const void *) glutPostRedisplay },
|
||||
{ "glutPostWindowRedisplay", (const void *) glutPostWindowRedisplay },
|
||||
{ "glutSwapBuffers", (const void *) glutSwapBuffers },
|
||||
{ "glutGetWindow", (const void *) glutGetWindow },
|
||||
{ "glutSetWindow", (const void *) glutSetWindow },
|
||||
{ "glutSetWindowTitle", (const void *) glutSetWindowTitle },
|
||||
{ "glutSetIconTitle", (const void *) glutSetIconTitle },
|
||||
{ "glutPositionWindow", (const void *) glutPositionWindow },
|
||||
{ "glutReshapeWindow", (const void *) glutReshapeWindow },
|
||||
{ "glutPopWindow", (const void *) glutPopWindow },
|
||||
{ "glutPushWindow", (const void *) glutPushWindow },
|
||||
{ "glutIconifyWindow", (const void *) glutIconifyWindow },
|
||||
{ "glutShowWindow", (const void *) glutShowWindow },
|
||||
{ "glutHideWindow", (const void *) glutHideWindow },
|
||||
{ "glutFullScreen", (const void *) glutFullScreen },
|
||||
{ "glutSetCursor", (const void *) glutSetCursor },
|
||||
{ "glutWarpPointer", (const void *) glutWarpPointer },
|
||||
{ "glutEstablishOverlay", (const void *) glutEstablishOverlay },
|
||||
{ "glutRemoveOverlay", (const void *) glutRemoveOverlay },
|
||||
{ "glutUseLayer", (const void *) glutUseLayer },
|
||||
{ "glutPostOverlayRedisplay", (const void *) glutPostOverlayRedisplay },
|
||||
{ "glutPostWindowOverlayRedisplay", (const void *) glutPostWindowOverlayRedisplay },
|
||||
{ "glutShowOverlay", (const void *) glutShowOverlay },
|
||||
{ "glutHideOverlay", (const void *) glutHideOverlay },
|
||||
{ "glutCreateMenu", (const void *) glutCreateMenu },
|
||||
{ "glutDestroyMenu", (const void *) glutDestroyMenu },
|
||||
{ "glutGetMenu", (const void *) glutGetMenu },
|
||||
{ "glutSetMenu", (const void *) glutSetMenu },
|
||||
{ "glutAddMenuEntry", (const void *) glutAddMenuEntry },
|
||||
{ "glutAddSubMenu", (const void *) glutAddSubMenu },
|
||||
{ "glutChangeToMenuEntry", (const void *) glutChangeToMenuEntry },
|
||||
{ "glutChangeToSubMenu", (const void *) glutChangeToSubMenu },
|
||||
{ "glutRemoveMenuItem", (const void *) glutRemoveMenuItem },
|
||||
{ "glutAttachMenu", (const void *) glutAttachMenu },
|
||||
{ "glutDetachMenu", (const void *) glutDetachMenu },
|
||||
{ "glutDisplayFunc", (const void *) glutDisplayFunc },
|
||||
{ "glutReshapeFunc", (const void *) glutReshapeFunc },
|
||||
{ "glutKeyboardFunc", (const void *) glutKeyboardFunc },
|
||||
{ "glutMouseFunc", (const void *) glutMouseFunc },
|
||||
{ "glutMotionFunc", (const void *) glutMotionFunc },
|
||||
{ "glutPassiveMotionFunc", (const void *) glutPassiveMotionFunc },
|
||||
{ "glutEntryFunc", (const void *) glutEntryFunc },
|
||||
{ "glutVisibilityFunc", (const void *) glutVisibilityFunc },
|
||||
{ "glutIdleFunc", (const void *) glutIdleFunc },
|
||||
{ "glutTimerFunc", (const void *) glutTimerFunc },
|
||||
{ "glutMenuStateFunc", (const void *) glutMenuStateFunc },
|
||||
{ "glutSpecialFunc", (const void *) glutSpecialFunc },
|
||||
{ "glutSpaceballMotionFunc", (const void *) glutSpaceballMotionFunc },
|
||||
{ "glutSpaceballRotateFunc", (const void *) glutSpaceballRotateFunc },
|
||||
{ "glutSpaceballButtonFunc", (const void *) glutSpaceballButtonFunc },
|
||||
{ "glutButtonBoxFunc", (const void *) glutButtonBoxFunc },
|
||||
{ "glutDialsFunc", (const void *) glutDialsFunc },
|
||||
{ "glutTabletMotionFunc", (const void *) glutTabletMotionFunc },
|
||||
{ "glutTabletButtonFunc", (const void *) glutTabletButtonFunc },
|
||||
{ "glutMenuStatusFunc", (const void *) glutMenuStatusFunc },
|
||||
{ "glutOverlayDisplayFunc", (const void *) glutOverlayDisplayFunc },
|
||||
{ "glutWindowStatusFunc", (const void *) glutWindowStatusFunc },
|
||||
{ "glutKeyboardUpFunc", (const void *) glutKeyboardUpFunc },
|
||||
{ "glutSpecialUpFunc", (const void *) glutSpecialUpFunc },
|
||||
{ "glutJoystickFunc", (const void *) glutJoystickFunc },
|
||||
{ "glutSetColor", (const void *) glutSetColor },
|
||||
{ "glutGetColor", (const void *) glutGetColor },
|
||||
{ "glutCopyColormap", (const void *) glutCopyColormap },
|
||||
{ "glutGet", (const void *) glutGet },
|
||||
{ "glutDeviceGet", (const void *) glutDeviceGet },
|
||||
{ "glutExtensionSupported", (const void *) glutExtensionSupported },
|
||||
{ "glutGetModifiers", (const void *) glutGetModifiers },
|
||||
{ "glutLayerGet", (const void *) glutLayerGet },
|
||||
{ "glutGetProcAddress", (const void *) glutGetProcAddress },
|
||||
{ "glutBitmapCharacter", (const void *) glutBitmapCharacter },
|
||||
{ "glutBitmapWidth", (const void *) glutBitmapWidth },
|
||||
{ "glutStrokeCharacter", (const void *) glutStrokeCharacter },
|
||||
{ "glutStrokeWidth", (const void *) glutStrokeWidth },
|
||||
{ "glutBitmapLength", (const void *) glutBitmapLength },
|
||||
{ "glutStrokeLength", (const void *) glutStrokeLength },
|
||||
{ "glutWireSphere", (const void *) glutWireSphere },
|
||||
{ "glutSolidSphere", (const void *) glutSolidSphere },
|
||||
{ "glutWireCone", (const void *) glutWireCone },
|
||||
{ "glutSolidCone", (const void *) glutSolidCone },
|
||||
{ "glutWireCube", (const void *) glutWireCube },
|
||||
{ "glutSolidCube", (const void *) glutSolidCube },
|
||||
{ "glutWireTorus", (const void *) glutWireTorus },
|
||||
{ "glutSolidTorus", (const void *) glutSolidTorus },
|
||||
{ "glutWireDodecahedron", (const void *) glutWireDodecahedron },
|
||||
{ "glutSolidDodecahedron", (const void *) glutSolidDodecahedron },
|
||||
{ "glutWireTeapot", (const void *) glutWireTeapot },
|
||||
{ "glutSolidTeapot", (const void *) glutSolidTeapot },
|
||||
{ "glutWireOctahedron", (const void *) glutWireOctahedron },
|
||||
{ "glutSolidOctahedron", (const void *) glutSolidOctahedron },
|
||||
{ "glutWireTetrahedron", (const void *) glutWireTetrahedron },
|
||||
{ "glutSolidTetrahedron", (const void *) glutSolidTetrahedron },
|
||||
{ "glutWireIcosahedron", (const void *) glutWireIcosahedron },
|
||||
{ "glutSolidIcosahedron", (const void *) glutSolidIcosahedron },
|
||||
{ "glutVideoResizeGet", (const void *) glutVideoResizeGet },
|
||||
{ "glutSetupVideoResizing", (const void *) glutSetupVideoResizing },
|
||||
{ "glutStopVideoResizing", (const void *) glutStopVideoResizing },
|
||||
{ "glutVideoResize", (const void *) glutVideoResize },
|
||||
{ "glutVideoPan", (const void *) glutVideoPan },
|
||||
{ "glutReportErrors", (const void *) glutReportErrors },
|
||||
{ "glutIgnoreKeyRepeat", (const void *) glutIgnoreKeyRepeat },
|
||||
{ "glutSetKeyRepeat", (const void *) glutSetKeyRepeat },
|
||||
{ "glutForceJoystickFunc", (const void *) glutForceJoystickFunc },
|
||||
{ "glutGameModeString", (const void *) glutGameModeString },
|
||||
{ "glutEnterGameMode", (const void *) glutEnterGameMode },
|
||||
{ "glutLeaveGameMode", (const void *) glutLeaveGameMode },
|
||||
{ "glutGameModeGet", (const void *) glutGameModeGet },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
/* XXX This isn't an official GLUT function, yet */
|
||||
void * GLUTAPIENTRY
|
||||
glutGetProcAddress(const char *procName)
|
||||
{
|
||||
/* Try GLUT functions first */
|
||||
int i;
|
||||
for (i = 0; glut_functions[i].name; i++) {
|
||||
if (strcmp(glut_functions[i].name, procName) == 0)
|
||||
return (void *) glut_functions[i].address;
|
||||
}
|
||||
|
||||
/* Try core GL functions */
|
||||
#if defined(_WIN32)
|
||||
return (void *) wglGetProcAddress((LPCSTR) procName);
|
||||
|
||||
#elif defined(__OS2PM__)
|
||||
return (void *) wglGetProcAddress((char *) procName);
|
||||
#elif defined(GLX_ARB_get_proc_address)
|
||||
return (void *) glXGetProcAddressARB((const GLubyte *) procName);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,38 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1995, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutFullScreen(void)
|
||||
{
|
||||
assert(!__glutCurrentWindow->parent);
|
||||
IGNORE_IN_GAME_MODE();
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
if (__glutMotifHints == None) {
|
||||
__glutMotifHints = XSGIFastInternAtom(__glutDisplay, "_MOTIF_WM_HINTS",
|
||||
SGI_XA__MOTIF_WM_HINTS, 0);
|
||||
if (__glutMotifHints == None) {
|
||||
__glutWarning("Could not intern X atom for _MOTIF_WM_HINTS.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
__glutCurrentWindow->desiredX = 0;
|
||||
__glutCurrentWindow->desiredY = 0;
|
||||
__glutCurrentWindow->desiredWidth = __glutScreenWidth;
|
||||
__glutCurrentWindow->desiredHeight = __glutScreenHeight;
|
||||
__glutCurrentWindow->desiredConfMask |= CWX | CWY | CWWidth | CWHeight;
|
||||
|
||||
__glutPutOnWorkList(__glutCurrentWindow,
|
||||
GLUT_CONFIGURE_WORK | GLUT_FULL_SCREEN_WORK);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,679 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
/* SGI optimization introduced in IRIX 6.3 to avoid X server
|
||||
round trips for interning common X atoms. */
|
||||
#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
|
||||
#include <X11/SGIFastAtom.h>
|
||||
#else
|
||||
#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
|
||||
#endif
|
||||
#endif /* not _WIN32 */
|
||||
|
||||
int __glutDisplaySettingsChanged = 0;
|
||||
static DisplayMode *dmodes, *currentDm = NULL;
|
||||
static int ndmodes = -1;
|
||||
GLUTwindow *__glutGameModeWindow = NULL;
|
||||
|
||||
#ifdef TEST
|
||||
static char *compstr[] =
|
||||
{
|
||||
"none", "=", "!=", "<=", ">=", ">", "<", "~"
|
||||
};
|
||||
static char *capstr[] =
|
||||
{
|
||||
"width", "height", "bpp", "hertz", "num"
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(__OS2__)
|
||||
void
|
||||
#else
|
||||
void __cdecl
|
||||
#endif
|
||||
__glutCloseDownGameMode(void)
|
||||
{
|
||||
if (__glutDisplaySettingsChanged) {
|
||||
#ifdef _WIN32
|
||||
/* Assumes that display settings have been changed, that
|
||||
is __glutDisplaySettingsChanged is true. */
|
||||
ChangeDisplaySettings(NULL, 0);
|
||||
#endif
|
||||
__glutDisplaySettingsChanged = 0;
|
||||
}
|
||||
__glutGameModeWindow = NULL;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutLeaveGameMode(void)
|
||||
{
|
||||
if (__glutGameModeWindow == NULL) {
|
||||
__glutWarning("not in game mode so cannot leave game mode");
|
||||
return;
|
||||
}
|
||||
__glutDestroyWindow(__glutGameModeWindow,
|
||||
__glutGameModeWindow);
|
||||
XFlush(__glutDisplay);
|
||||
__glutGameModeWindow = NULL;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
/* Same values as from MSDN's SetDisp.c example. */
|
||||
#define MIN_WIDTH 400
|
||||
#define MIN_FREQUENCY 60
|
||||
|
||||
static void
|
||||
initGameModeSupport(void)
|
||||
{
|
||||
DEVMODE dm;
|
||||
DWORD mode;
|
||||
int i;
|
||||
|
||||
if (ndmodes >= 0) {
|
||||
/* ndmodes is initially -1 to indicate no
|
||||
dmodes allocated yet. */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Determine how many display modes there are. */
|
||||
ndmodes = 0;
|
||||
mode = 0;
|
||||
while (EnumDisplaySettings(NULL, mode, &dm)) {
|
||||
if (dm.dmPelsWidth >= MIN_WIDTH &&
|
||||
(dm.dmDisplayFrequency == 0 ||
|
||||
dm.dmDisplayFrequency >= MIN_FREQUENCY)) {
|
||||
ndmodes++;
|
||||
}
|
||||
mode++;
|
||||
}
|
||||
|
||||
/* Allocate memory for a list of all the display modes. */
|
||||
dmodes = (DisplayMode*)
|
||||
malloc(ndmodes * sizeof(DisplayMode));
|
||||
|
||||
/* Now that we know how many display modes to expect,
|
||||
enumerate them again and save the information in
|
||||
the list we allocated above. */
|
||||
i = 0;
|
||||
mode = 0;
|
||||
while (EnumDisplaySettings(NULL, mode, &dm)) {
|
||||
/* Try to reject any display settings that seem unplausible. */
|
||||
if (dm.dmPelsWidth >= MIN_WIDTH &&
|
||||
(dm.dmDisplayFrequency == 0 ||
|
||||
dm.dmDisplayFrequency >= MIN_FREQUENCY)) {
|
||||
dmodes[i].devmode = dm;
|
||||
dmodes[i].valid = 1; /* XXX Not used for now. */
|
||||
dmodes[i].cap[DM_WIDTH] = dm.dmPelsWidth;
|
||||
dmodes[i].cap[DM_HEIGHT] = dm.dmPelsHeight;
|
||||
dmodes[i].cap[DM_PIXEL_DEPTH] = dm.dmBitsPerPel;
|
||||
if (dm.dmDisplayFrequency == 0) {
|
||||
/* Guess a reasonable guess. */
|
||||
/* Lame Windows 95 version of EnumDisplaySettings. */
|
||||
dmodes[i].cap[DM_HERTZ] = 60;
|
||||
} else {
|
||||
dmodes[i].cap[DM_HERTZ] = dm.dmDisplayFrequency;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
mode++;
|
||||
}
|
||||
|
||||
assert(i == ndmodes);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* X Windows version of initGameModeSupport. */
|
||||
static void
|
||||
initGameModeSupport(void)
|
||||
{
|
||||
if (ndmodes >= 0) {
|
||||
/* ndmodes is initially -1 to indicate no
|
||||
dmodes allocated yet. */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Determine how many display modes there are. */
|
||||
ndmodes = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* This routine is based on similiar code in glut_dstr.c */
|
||||
static DisplayMode *
|
||||
findMatch(DisplayMode * dmodes, int ndmodes,
|
||||
Criterion * criteria, int ncriteria)
|
||||
{
|
||||
DisplayMode *found;
|
||||
int *bestScore, *thisScore;
|
||||
int i, j, numok, result = 0, worse, better;
|
||||
|
||||
found = NULL;
|
||||
numok = 1; /* "num" capability is indexed from 1,
|
||||
not 0. */
|
||||
|
||||
/* XXX alloca canidate. */
|
||||
bestScore = (int *) malloc(ncriteria * sizeof(int));
|
||||
if (!bestScore) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
for (j = 0; j < ncriteria; j++) {
|
||||
/* Very negative number. */
|
||||
bestScore[j] = -32768;
|
||||
}
|
||||
|
||||
/* XXX alloca canidate. */
|
||||
thisScore = (int *) malloc(ncriteria * sizeof(int));
|
||||
if (!thisScore) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
|
||||
for (i = 0; i < ndmodes; i++) {
|
||||
if (dmodes[i].valid) {
|
||||
worse = 0;
|
||||
better = 0;
|
||||
|
||||
for (j = 0; j < ncriteria; j++) {
|
||||
int cap, cvalue, dvalue;
|
||||
|
||||
cap = criteria[j].capability;
|
||||
cvalue = criteria[j].value;
|
||||
if (cap == NUM) {
|
||||
dvalue = numok;
|
||||
} else {
|
||||
dvalue = dmodes[i].cap[cap];
|
||||
}
|
||||
#ifdef TEST
|
||||
if (verbose)
|
||||
printf(" %s %s %d to %d\n",
|
||||
capstr[cap], compstr[criteria[j].comparison], cvalue, dvalue);
|
||||
#endif
|
||||
switch (criteria[j].comparison) {
|
||||
case EQ:
|
||||
result = cvalue == dvalue;
|
||||
thisScore[j] = 1;
|
||||
break;
|
||||
case NEQ:
|
||||
result = cvalue != dvalue;
|
||||
thisScore[j] = 1;
|
||||
break;
|
||||
case LT:
|
||||
result = dvalue < cvalue;
|
||||
thisScore[j] = dvalue - cvalue;
|
||||
break;
|
||||
case GT:
|
||||
result = dvalue > cvalue;
|
||||
thisScore[j] = dvalue - cvalue;
|
||||
break;
|
||||
case LTE:
|
||||
result = dvalue <= cvalue;
|
||||
thisScore[j] = dvalue - cvalue;
|
||||
break;
|
||||
case GTE:
|
||||
result = (dvalue >= cvalue);
|
||||
thisScore[j] = dvalue - cvalue;
|
||||
break;
|
||||
case MIN:
|
||||
result = dvalue >= cvalue;
|
||||
thisScore[j] = cvalue - dvalue;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
if (verbose)
|
||||
printf(" result=%d score=%d bestScore=%d\n", result, thisScore[j], bestScore[j]);
|
||||
#endif
|
||||
|
||||
if (result) {
|
||||
if (better || thisScore[j] > bestScore[j]) {
|
||||
better = 1;
|
||||
} else if (thisScore[j] == bestScore[j]) {
|
||||
/* Keep looking. */
|
||||
} else {
|
||||
goto nextDM;
|
||||
}
|
||||
} else {
|
||||
if (cap == NUM) {
|
||||
worse = 1;
|
||||
} else {
|
||||
goto nextDM;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (better && !worse) {
|
||||
found = &dmodes[i];
|
||||
for (j = 0; j < ncriteria; j++) {
|
||||
bestScore[j] = thisScore[j];
|
||||
}
|
||||
}
|
||||
numok++;
|
||||
|
||||
nextDM:;
|
||||
|
||||
}
|
||||
}
|
||||
free(bestScore);
|
||||
free(thisScore);
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses strings in the form of:
|
||||
* 800x600
|
||||
* 800x600:16
|
||||
* 800x600@60
|
||||
* 800x600:16@60
|
||||
* @60
|
||||
* :16
|
||||
* :16@60
|
||||
* NOTE that @ before : is not parsed.
|
||||
*/
|
||||
static int
|
||||
specialCaseParse(char *word, Criterion * criterion, int mask)
|
||||
{
|
||||
char *xstr, *response;
|
||||
int got;
|
||||
int width, height, bpp, hertz;
|
||||
|
||||
switch(word[0]) {
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
/* The WWWxHHH case. */
|
||||
if (mask & (1 << DM_WIDTH)) {
|
||||
return -1;
|
||||
}
|
||||
xstr = strpbrk(&word[1], "x");
|
||||
if (xstr) {
|
||||
width = (int) strtol(word, &response, 0);
|
||||
if (response == word || response[0] != 'x') {
|
||||
/* Not a valid number OR needs to be followed by 'x'. */
|
||||
return -1;
|
||||
}
|
||||
height = (int) strtol(&xstr[1], &response, 0);
|
||||
if (response == &xstr[1]) {
|
||||
/* Not a valid number. */
|
||||
return -1;
|
||||
}
|
||||
criterion[0].capability = DM_WIDTH;
|
||||
criterion[0].comparison = EQ;
|
||||
criterion[0].value = width;
|
||||
criterion[1].capability = DM_HEIGHT;
|
||||
criterion[1].comparison = EQ;
|
||||
criterion[1].value = height;
|
||||
got = specialCaseParse(response,
|
||||
&criterion[2], 1 << DM_WIDTH);
|
||||
if (got >= 0) {
|
||||
return got + 2;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
case ':':
|
||||
/* The :BPP case. */
|
||||
if (mask & (1 << DM_PIXEL_DEPTH)) {
|
||||
return -1;
|
||||
}
|
||||
bpp = (int) strtol(&word[1], &response, 0);
|
||||
if (response == &word[1]) {
|
||||
/* Not a valid number. */
|
||||
return -1;
|
||||
}
|
||||
criterion[0].capability = DM_PIXEL_DEPTH;
|
||||
criterion[0].comparison = EQ;
|
||||
criterion[0].value = bpp;
|
||||
got = specialCaseParse(response,
|
||||
&criterion[1], (1 << DM_WIDTH) | (1 << DM_PIXEL_DEPTH));
|
||||
if (got >= 0) {
|
||||
return got + 1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
case '@':
|
||||
/* The @HZ case. */
|
||||
if (mask & (1 << DM_HERTZ)) {
|
||||
return -1;
|
||||
}
|
||||
hertz = (int) strtol(&word[1], &response, 0);
|
||||
if (response == &word[1]) {
|
||||
/* Not a valid number. */
|
||||
return -1;
|
||||
}
|
||||
criterion[0].capability = DM_HERTZ;
|
||||
criterion[0].comparison = EQ;
|
||||
criterion[0].value = hertz;
|
||||
got = specialCaseParse(response,
|
||||
&criterion[1], ~DM_HERTZ);
|
||||
if (got >= 0) {
|
||||
return got + 1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
case '\0':
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* This routine is based on similiar code in glut_dstr.c */
|
||||
static int
|
||||
parseCriteria(char *word, Criterion * criterion)
|
||||
{
|
||||
char *cstr, *vstr, *response;
|
||||
int comparator, value = 0;
|
||||
|
||||
cstr = strpbrk(word, "=><!~");
|
||||
if (cstr) {
|
||||
switch (cstr[0]) {
|
||||
case '=':
|
||||
comparator = EQ;
|
||||
vstr = &cstr[1];
|
||||
break;
|
||||
case '~':
|
||||
comparator = MIN;
|
||||
vstr = &cstr[1];
|
||||
break;
|
||||
case '>':
|
||||
if (cstr[1] == '=') {
|
||||
comparator = GTE;
|
||||
vstr = &cstr[2];
|
||||
} else {
|
||||
comparator = GT;
|
||||
vstr = &cstr[1];
|
||||
}
|
||||
break;
|
||||
case '<':
|
||||
if (cstr[1] == '=') {
|
||||
comparator = LTE;
|
||||
vstr = &cstr[2];
|
||||
} else {
|
||||
comparator = LT;
|
||||
vstr = &cstr[1];
|
||||
}
|
||||
break;
|
||||
case '!':
|
||||
if (cstr[1] == '=') {
|
||||
comparator = NEQ;
|
||||
vstr = &cstr[2];
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
value = (int) strtol(vstr, &response, 0);
|
||||
if (response == vstr) {
|
||||
/* Not a valid number. */
|
||||
return -1;
|
||||
}
|
||||
*cstr = '\0';
|
||||
} else {
|
||||
comparator = NONE;
|
||||
}
|
||||
switch (word[0]) {
|
||||
case 'b':
|
||||
if (!strcmp(word, "bpp")) {
|
||||
criterion[0].capability = DM_PIXEL_DEPTH;
|
||||
if (comparator == NONE) {
|
||||
return -1;
|
||||
} else {
|
||||
criterion[0].comparison = comparator;
|
||||
criterion[0].value = value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
case 'h':
|
||||
if (!strcmp(word, "height")) {
|
||||
criterion[0].capability = DM_HEIGHT;
|
||||
if (comparator == NONE) {
|
||||
return -1;
|
||||
} else {
|
||||
criterion[0].comparison = comparator;
|
||||
criterion[0].value = value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (!strcmp(word, "hertz")) {
|
||||
criterion[0].capability = DM_HERTZ;
|
||||
if (comparator == NONE) {
|
||||
return -1;
|
||||
} else {
|
||||
criterion[0].comparison = comparator;
|
||||
criterion[0].value = value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
case 'n':
|
||||
if (!strcmp(word, "num")) {
|
||||
criterion[0].capability = DM_NUM;
|
||||
if (comparator == NONE) {
|
||||
return -1;
|
||||
} else {
|
||||
criterion[0].comparison = comparator;
|
||||
criterion[0].value = value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
case 'w':
|
||||
if (!strcmp(word, "width")) {
|
||||
criterion[0].capability = DM_WIDTH;
|
||||
if (comparator == NONE) {
|
||||
return -1;
|
||||
} else {
|
||||
criterion[0].comparison = comparator;
|
||||
criterion[0].value = value;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (comparator == NONE) {
|
||||
return specialCaseParse(word, criterion, 0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* This routine is based on similiar code in glut_dstr.c */
|
||||
static Criterion *
|
||||
parseDisplayString(const char *display, int *ncriteria)
|
||||
{
|
||||
Criterion *criteria = NULL;
|
||||
int n, parsed;
|
||||
char *copy, *word;
|
||||
|
||||
copy = __glutStrdup(display);
|
||||
/* Attempt to estimate how many criteria entries should be
|
||||
needed. */
|
||||
n = 0;
|
||||
word = strtok(copy, " \t");
|
||||
while (word) {
|
||||
n++;
|
||||
word = strtok(NULL, " \t");
|
||||
}
|
||||
/* Allocate number of words of criteria. A word
|
||||
could contain as many as four criteria in the
|
||||
worst case. Example: 800x600:16@60 */
|
||||
criteria = (Criterion *) malloc(4 * n * sizeof(Criterion));
|
||||
if (!criteria) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
|
||||
/* Re-copy the copy of the display string. */
|
||||
strcpy(copy, display);
|
||||
|
||||
n = 0;
|
||||
word = strtok(copy, " \t");
|
||||
while (word) {
|
||||
parsed = parseCriteria(word, &criteria[n]);
|
||||
if (parsed >= 0) {
|
||||
n += parsed;
|
||||
} else {
|
||||
__glutWarning("Unrecognized game mode string word: %s (ignoring)\n", word);
|
||||
}
|
||||
word = strtok(NULL, " \t");
|
||||
}
|
||||
|
||||
free(copy);
|
||||
*ncriteria = n;
|
||||
return criteria;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutGameModeString(const char *string)
|
||||
{
|
||||
Criterion *criteria;
|
||||
int ncriteria;
|
||||
|
||||
initGameModeSupport();
|
||||
criteria = parseDisplayString(string, &ncriteria);
|
||||
currentDm = findMatch(dmodes, ndmodes, criteria, ncriteria);
|
||||
free(criteria);
|
||||
}
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutEnterGameMode(void)
|
||||
{
|
||||
GLUTwindow *window;
|
||||
int width, height;
|
||||
Window win;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
__glutFatalUsage("entering game mode not allowed while menus in use");
|
||||
}
|
||||
if (__glutGameModeWindow) {
|
||||
/* Already in game mode, so blow away game mode
|
||||
window so apps can change resolutions. */
|
||||
window = __glutGameModeWindow;
|
||||
/* Setting the game mode window to NULL tricks
|
||||
the window destroy code into not undoing the
|
||||
screen display change since we plan on immediately
|
||||
doing another mode change. */
|
||||
__glutGameModeWindow = NULL;
|
||||
__glutDestroyWindow(window, window);
|
||||
}
|
||||
|
||||
/* Assume default screen size until we find out if we
|
||||
can actually change the display settings. */
|
||||
width = __glutScreenWidth;
|
||||
height = __glutScreenHeight;
|
||||
|
||||
if (currentDm) {
|
||||
#ifdef _WIN32
|
||||
LONG status;
|
||||
static int registered = 0;
|
||||
|
||||
status = ChangeDisplaySettings(¤tDm->devmode,
|
||||
CDS_FULLSCREEN);
|
||||
if (status == DISP_CHANGE_SUCCESSFUL) {
|
||||
__glutDisplaySettingsChanged = 1;
|
||||
width = currentDm->cap[DM_WIDTH];
|
||||
height = currentDm->cap[DM_HEIGHT];
|
||||
if (!registered) {
|
||||
atexit(__glutCloseDownGameMode);
|
||||
registered = 1;
|
||||
}
|
||||
} else {
|
||||
/* Switch back to default resolution. */
|
||||
ChangeDisplaySettings(NULL, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
window = __glutCreateWindow(NULL, 0, 0,
|
||||
width, height, /* game mode */ 1);
|
||||
win = window->win;
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
if (__glutMotifHints == None) {
|
||||
__glutMotifHints = XSGIFastInternAtom(__glutDisplay, "_MOTIF_WM_HINTS",
|
||||
SGI_XA__MOTIF_WM_HINTS, 0);
|
||||
if (__glutMotifHints == None) {
|
||||
__glutWarning("Could not intern X atom for _MOTIF_WM_HINTS.");
|
||||
}
|
||||
}
|
||||
|
||||
/* Game mode window is a toplevel window. */
|
||||
XSetWMProtocols(__glutDisplay, win, &__glutWMDeleteWindow, 1);
|
||||
#endif
|
||||
|
||||
/* Schedule the fullscreen property to be added and to
|
||||
make sure the window is configured right. Win32
|
||||
doesn't need this. */
|
||||
window->desiredX = 0;
|
||||
window->desiredY = 0;
|
||||
window->desiredWidth = width;
|
||||
window->desiredHeight = height;
|
||||
window->desiredConfMask |= CWX | CWY | CWWidth | CWHeight;
|
||||
#ifdef _WIN32
|
||||
/* Win32 does not want to use GLUT_FULL_SCREEN_WORK
|
||||
for game mode because we need to be maximizing
|
||||
the window in game mode, not just sizing it to
|
||||
take up the full screen. The Win32-ness of game
|
||||
mode happens when you pass 1 in the gameMode parameter
|
||||
to __glutCreateWindow above. A gameMode of creates
|
||||
a WS_POPUP window, not a standard WS_OVERLAPPEDWINDOW
|
||||
window. WS_POPUP ensures the taskbar is hidden. */
|
||||
__glutPutOnWorkList(window,
|
||||
GLUT_CONFIGURE_WORK);
|
||||
#else
|
||||
__glutPutOnWorkList(window,
|
||||
GLUT_CONFIGURE_WORK | GLUT_FULL_SCREEN_WORK);
|
||||
#endif
|
||||
|
||||
__glutGameModeWindow = window;
|
||||
return window->num + 1;
|
||||
}
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutGameModeGet(GLenum mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case GLUT_GAME_MODE_ACTIVE:
|
||||
return __glutGameModeWindow != NULL;
|
||||
case GLUT_GAME_MODE_POSSIBLE:
|
||||
return currentDm != NULL;
|
||||
case GLUT_GAME_MODE_WIDTH:
|
||||
return currentDm ? currentDm->cap[DM_WIDTH] : -1;
|
||||
case GLUT_GAME_MODE_HEIGHT:
|
||||
return currentDm ? currentDm->cap[DM_HEIGHT] : -1;
|
||||
case GLUT_GAME_MODE_PIXEL_DEPTH:
|
||||
return currentDm ? currentDm->cap[DM_PIXEL_DEPTH] : -1;
|
||||
case GLUT_GAME_MODE_REFRESH_RATE:
|
||||
return currentDm ? currentDm->cap[DM_HERTZ] : -1;
|
||||
case GLUT_GAME_MODE_DISPLAY_CHANGED:
|
||||
return __glutDisplaySettingsChanged;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -1,232 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h> /* SunOS 4 needs NULL defined for GETTIMEOFDAY macro. */
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
int GLUTAPIENTRY
|
||||
glutGet(GLenum param)
|
||||
{
|
||||
Window win, root;
|
||||
int x, y, value;
|
||||
unsigned int width, height, border, depth;
|
||||
|
||||
switch (param) {
|
||||
case GLUT_INIT_WINDOW_X:
|
||||
return __glutInitX;
|
||||
case GLUT_INIT_WINDOW_Y:
|
||||
return __glutInitY;
|
||||
case GLUT_INIT_WINDOW_WIDTH:
|
||||
return __glutInitWidth;
|
||||
case GLUT_INIT_WINDOW_HEIGHT:
|
||||
return __glutInitHeight;
|
||||
case GLUT_INIT_DISPLAY_MODE:
|
||||
return __glutDisplayMode;
|
||||
case GLUT_WINDOW_X:
|
||||
XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
|
||||
__glutRoot, 0, 0, &x, &y, &win);
|
||||
return x;
|
||||
case GLUT_WINDOW_Y:
|
||||
XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
|
||||
__glutRoot, 0, 0, &x, &y, &win);
|
||||
return y;
|
||||
case GLUT_WINDOW_WIDTH:
|
||||
if (!__glutCurrentWindow->reshape) {
|
||||
XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
|
||||
&root, &x, &y,
|
||||
&width, &height, &border, &depth);
|
||||
return width;
|
||||
}
|
||||
return __glutCurrentWindow->width;
|
||||
case GLUT_WINDOW_HEIGHT:
|
||||
if (!__glutCurrentWindow->reshape) {
|
||||
XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
|
||||
&root, &x, &y,
|
||||
&width, &height, &border, &depth);
|
||||
return height;
|
||||
}
|
||||
return __glutCurrentWindow->height;
|
||||
#ifdef __OS2__
|
||||
#define GET_CONFIG(attrib) \
|
||||
{ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) \
|
||||
glXGetConfig( __glutCurrentWindow->vis, attrib, &value); \
|
||||
else \
|
||||
glXGetConfig(__glutCurrentWindow->overlay->vis, attrib, &value); \
|
||||
} \
|
||||
|
||||
#else
|
||||
|
||||
#define GET_CONFIG(attrib) { \
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { \
|
||||
glXGetConfig(__glutDisplay, __glutCurrentWindow->vis, \
|
||||
attrib, &value); \
|
||||
} else { \
|
||||
glXGetConfig(__glutDisplay, __glutCurrentWindow->overlay->vis, \
|
||||
attrib, &value); \
|
||||
} \
|
||||
}
|
||||
#endif
|
||||
|
||||
case GLUT_WINDOW_BUFFER_SIZE:
|
||||
GET_CONFIG(GLX_BUFFER_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_STENCIL_SIZE:
|
||||
GET_CONFIG(GLX_STENCIL_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_DEPTH_SIZE:
|
||||
GET_CONFIG(GLX_DEPTH_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_RED_SIZE:
|
||||
GET_CONFIG(GLX_RED_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_GREEN_SIZE:
|
||||
GET_CONFIG(GLX_GREEN_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_BLUE_SIZE:
|
||||
GET_CONFIG(GLX_BLUE_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_ALPHA_SIZE:
|
||||
GET_CONFIG(GLX_ALPHA_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_ACCUM_RED_SIZE:
|
||||
GET_CONFIG(GLX_ACCUM_RED_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_ACCUM_GREEN_SIZE:
|
||||
GET_CONFIG(GLX_ACCUM_GREEN_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_ACCUM_BLUE_SIZE:
|
||||
GET_CONFIG(GLX_ACCUM_BLUE_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
|
||||
GET_CONFIG(GLX_ACCUM_ALPHA_SIZE);
|
||||
return value;
|
||||
case GLUT_WINDOW_DOUBLEBUFFER:
|
||||
GET_CONFIG(GLX_DOUBLEBUFFER);
|
||||
return value;
|
||||
case GLUT_WINDOW_RGBA:
|
||||
GET_CONFIG(GLX_RGBA);
|
||||
return value;
|
||||
case GLUT_WINDOW_COLORMAP_SIZE:
|
||||
GET_CONFIG(GLX_RGBA);
|
||||
if (value) {
|
||||
return 0;
|
||||
} else {
|
||||
#if defined(_WIN32) || defined(__OS2__)
|
||||
/* KLUDGE: we always assume 256 colors in CI mode on
|
||||
Win32 */
|
||||
return 256;
|
||||
#else
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
return __glutCurrentWindow->vis->visual->map_entries;
|
||||
} else {
|
||||
return __glutCurrentWindow->overlay->vis->visual->map_entries;
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
}
|
||||
case GLUT_WINDOW_PARENT:
|
||||
return __glutCurrentWindow->parent ?
|
||||
__glutCurrentWindow->parent->num + 1 : 0;
|
||||
case GLUT_WINDOW_NUM_CHILDREN:
|
||||
{
|
||||
int num = 0;
|
||||
GLUTwindow *children = __glutCurrentWindow->children;
|
||||
|
||||
while (children) {
|
||||
num++;
|
||||
children = children->siblings;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
case GLUT_WINDOW_NUM_SAMPLES:
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
|
||||
if (__glutIsSupportedByGLX("GLX_SGIS_multisample")) {
|
||||
GET_CONFIG(GLX_SAMPLES_SGIS);
|
||||
return value;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
/* Independent of GLX server support, multisampling not
|
||||
supported by GLX client-side. */
|
||||
return 0;
|
||||
#endif
|
||||
case GLUT_WINDOW_STEREO:
|
||||
GET_CONFIG(GLX_STEREO);
|
||||
return value;
|
||||
case GLUT_WINDOW_CURSOR:
|
||||
return __glutCurrentWindow->cursor;
|
||||
case GLUT_SCREEN_WIDTH:
|
||||
return DisplayWidth(__glutDisplay, __glutScreen);
|
||||
case GLUT_SCREEN_HEIGHT:
|
||||
return DisplayHeight(__glutDisplay, __glutScreen);
|
||||
case GLUT_SCREEN_WIDTH_MM:
|
||||
return DisplayWidthMM(__glutDisplay, __glutScreen);
|
||||
case GLUT_SCREEN_HEIGHT_MM:
|
||||
return DisplayHeightMM(__glutDisplay, __glutScreen);
|
||||
case GLUT_MENU_NUM_ITEMS:
|
||||
return __glutCurrentMenu->num;
|
||||
case GLUT_DISPLAY_MODE_POSSIBLE:
|
||||
{
|
||||
XVisualInfo *vi;
|
||||
Bool dummy, visAlloced;
|
||||
void *fbc;
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* Our fake glXChooseVisual (which is called by
|
||||
__glutDetermineVisual) needs an HDC to work with, so grab one
|
||||
from the "root" window. */
|
||||
XHDC = GetDC(GetDesktopWindow());
|
||||
#endif
|
||||
vi = __glutDetermineWindowVisual(&dummy, &visAlloced, &fbc);
|
||||
#if defined(_WIN32)
|
||||
ReleaseDC(GetDesktopWindow(), XHDC);
|
||||
#endif
|
||||
if (vi) {
|
||||
if (visAlloced)
|
||||
XFree(vi);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case GLUT_ELAPSED_TIME:
|
||||
{
|
||||
#ifdef OLD_VMS
|
||||
struct timeval6 elapsed, beginning, now;
|
||||
#else
|
||||
struct timeval elapsed, beginning, now;
|
||||
#endif
|
||||
|
||||
__glutInitTime(&beginning);
|
||||
GETTIMEOFDAY(&now);
|
||||
TIMEDELTA(elapsed, now, beginning);
|
||||
/* Return elapsed milliseconds. */
|
||||
#if defined(__vms) && ( __VMS_VER < 70000000 )
|
||||
return (int) (elapsed.val / TICKS_PER_MILLISECOND);
|
||||
#else
|
||||
return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
|
||||
#endif
|
||||
}
|
||||
case GLUT_WINDOW_FORMAT_ID:
|
||||
#if defined(__OS2__)
|
||||
return wglGetPixelFormat(__glutCurrentWindow->hdc);
|
||||
#elif defined(_WIN32)
|
||||
return GetPixelFormat(__glutCurrentWindow->hdc);
|
||||
#else
|
||||
if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
|
||||
return (int) __glutCurrentWindow->vis->visualid;
|
||||
} else {
|
||||
return (int) __glutCurrentWindow->overlay->vis->visualid;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
__glutWarning("invalid glutGet parameter: %d", param);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,451 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#ifdef __VMS
|
||||
#include <GL/vms_x_fix.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
#endif
|
||||
|
||||
/* SGI optimization introduced in IRIX 6.3 to avoid X server
|
||||
round trips for interning common X atoms. */
|
||||
#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
|
||||
#include <X11/SGIFastAtom.h>
|
||||
#else
|
||||
#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
|
||||
#endif
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* GLUT inter-file variables */
|
||||
/* *INDENT-OFF* */
|
||||
char *__glutProgramName = NULL;
|
||||
int __glutArgc = 0;
|
||||
char **__glutArgv = NULL;
|
||||
char *__glutGeometry = NULL;
|
||||
Display *__glutDisplay = NULL;
|
||||
int __glutScreen;
|
||||
Window __glutRoot;
|
||||
int __glutScreenHeight;
|
||||
int __glutScreenWidth;
|
||||
GLboolean __glutIconic = GL_FALSE;
|
||||
GLboolean __glutDebug = GL_FALSE;
|
||||
unsigned int __glutDisplayMode =
|
||||
GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
|
||||
char *__glutDisplayString = NULL;
|
||||
int __glutConnectionFD;
|
||||
XSizeHints __glutSizeHints = {0};
|
||||
int __glutInitWidth = 300, __glutInitHeight = 300;
|
||||
int __glutInitX = -1, __glutInitY = -1;
|
||||
GLboolean __glutForceDirect = GL_FALSE,
|
||||
__glutTryDirect = GL_TRUE;
|
||||
Atom __glutWMDeleteWindow;
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#ifdef _WIN32
|
||||
void (__cdecl *__glutExitFunc)(int retval) = NULL;
|
||||
#endif
|
||||
|
||||
static Bool synchronize = False;
|
||||
|
||||
#if defined(__OS2__)
|
||||
|
||||
MRESULT EXPENTRY GlutWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
|
||||
MRESULT EXPENTRY GlutWindowChildProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
|
||||
|
||||
|
||||
void __glutOpenOS2Connection(char* display)
|
||||
{
|
||||
static char *classname=NULL;
|
||||
extern HAB hab; /* PM anchor block handle */
|
||||
ERRORID erridErrorCode;/* last error id code */
|
||||
int ii;
|
||||
|
||||
/* Make sure we register the window only once. */
|
||||
if(classname)
|
||||
return;
|
||||
|
||||
classname = "GLUT";
|
||||
|
||||
if ( !WinRegisterClass( hab, /* PM anchor block handle */
|
||||
classname,/* window class name */
|
||||
GlutWindowProc,/* address of window procedure*/
|
||||
CS_SIZEREDRAW, /* |CS_SYNCPAINT size changes cause redrawing */
|
||||
0UL ) ) /* window data */
|
||||
{ erridErrorCode = WinGetLastError(hab);
|
||||
ii = erridErrorCode;
|
||||
return;
|
||||
}
|
||||
|
||||
classname = "GLUTCHILD";
|
||||
|
||||
if ( !WinRegisterClass( hab, /* PM anchor block handle */
|
||||
classname,/* window class name */
|
||||
GlutWindowChildProc,/* address of window procedure*/
|
||||
CS_SIZEREDRAW, /* size changes cause redrawing */
|
||||
0UL ) ) /* window data */
|
||||
{ erridErrorCode = WinGetLastError(hab);
|
||||
ii = erridErrorCode;
|
||||
return;
|
||||
}
|
||||
|
||||
__glutScreenWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||
__glutScreenHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||
|
||||
/* Set the root window to NULL because windows creates a top-level
|
||||
window when the parent is NULL. X creates a top-level window
|
||||
when the parent is the root window. */
|
||||
__glutRoot = NULLHANDLE;
|
||||
|
||||
/* Set the display to 1 -- we shouldn't be using this anywhere
|
||||
(except as an argument to X calls). */
|
||||
__glutDisplay = (Display*)1;
|
||||
|
||||
/* There isn't any concept of multiple screens in Win32, therefore,
|
||||
we don't need to keep track of the screen we're on... it's always
|
||||
the same one. */
|
||||
__glutScreen = 0;
|
||||
}
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#include <float.h> /* For masking floating point exceptions. */
|
||||
#endif
|
||||
|
||||
void
|
||||
__glutOpenWin32Connection(char* display)
|
||||
{
|
||||
static char *classname;
|
||||
WNDCLASS wc;
|
||||
HINSTANCE hInstance = GetModuleHandle(NULL);
|
||||
|
||||
/* Make sure we register the window only once. */
|
||||
if(classname)
|
||||
return;
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
/* Under certain conditions (e.g. while rendering solid surfaces with
|
||||
lighting enabled) Microsoft OpenGL libraries cause some illegal
|
||||
operations like floating point overflow or division by zero. The
|
||||
default behaviour of Microsoft compilers is to mask (ignore)
|
||||
floating point exceptions, while Borland compilers do not. The
|
||||
following function of Borland RTL allows to mask exceptions.
|
||||
Advice from Pier Giorgio Esposito (mc2172@mclink.it). */
|
||||
_control87(MCW_EM,MCW_EM);
|
||||
#endif
|
||||
|
||||
classname = "GLUT";
|
||||
|
||||
/* Clear (important!) and then fill in the window class structure. */
|
||||
memset(&wc, 0, sizeof(WNDCLASS));
|
||||
wc.style = CS_OWNDC;
|
||||
wc.lpfnWndProc = (WNDPROC)__glutWindowProc;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(hInstance, "GLUT_ICON");
|
||||
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
|
||||
wc.hbrBackground = NULL;
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = classname;
|
||||
|
||||
/* Fill in a default icon if one isn't specified as a resource. */
|
||||
if(!wc.hIcon)
|
||||
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
|
||||
|
||||
if(!RegisterClass(&wc)) {
|
||||
__glutFatalError("RegisterClass() failed:"
|
||||
"Cannot register GLUT window class.");
|
||||
}
|
||||
|
||||
__glutScreenWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||
__glutScreenHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||
|
||||
/* Set the root window to NULL because windows creates a top-level
|
||||
window when the parent is NULL. X creates a top-level window
|
||||
when the parent is the root window. */
|
||||
__glutRoot = NULL;
|
||||
|
||||
/* Set the display to 1 -- we shouldn't be using this anywhere
|
||||
(except as an argument to X calls). */
|
||||
__glutDisplay = (Display*)1;
|
||||
|
||||
/* There isn't any concept of multiple screens in Win32, therefore,
|
||||
we don't need to keep track of the screen we're on... it's always
|
||||
the same one. */
|
||||
__glutScreen = 0;
|
||||
}
|
||||
#else /* !_WIN32 */
|
||||
void
|
||||
__glutOpenXConnection(char *display)
|
||||
{
|
||||
int errorBase, eventBase;
|
||||
|
||||
__glutDisplay = XOpenDisplay(display);
|
||||
if (!__glutDisplay)
|
||||
__glutFatalError("could not open display: %s",
|
||||
XDisplayName(display));
|
||||
if (synchronize)
|
||||
XSynchronize(__glutDisplay, True);
|
||||
if (!glXQueryExtension(__glutDisplay, &errorBase, &eventBase))
|
||||
__glutFatalError(
|
||||
"OpenGL GLX extension not supported by display: %s",
|
||||
XDisplayName(display));
|
||||
__glutScreen = DefaultScreen(__glutDisplay);
|
||||
__glutRoot = RootWindow(__glutDisplay, __glutScreen);
|
||||
__glutScreenWidth = DisplayWidth(__glutDisplay, __glutScreen);
|
||||
__glutScreenHeight = DisplayHeight(__glutDisplay,
|
||||
__glutScreen);
|
||||
__glutConnectionFD = ConnectionNumber(__glutDisplay);
|
||||
__glutWMDeleteWindow = XSGIFastInternAtom(__glutDisplay,
|
||||
"WM_DELETE_WINDOW", SGI_XA_WM_DELETE_WINDOW, False);
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
void
|
||||
#ifdef OLD_VMS
|
||||
__glutInitTime(struct timeval6 *beginning)
|
||||
#else
|
||||
__glutInitTime(struct timeval *beginning)
|
||||
#endif
|
||||
{
|
||||
static int beenhere = 0;
|
||||
#ifdef OLD_VMS
|
||||
static struct timeval6 genesis;
|
||||
#else
|
||||
static struct timeval genesis;
|
||||
#endif
|
||||
|
||||
if (!beenhere) {
|
||||
GETTIMEOFDAY(&genesis);
|
||||
beenhere = 1;
|
||||
}
|
||||
*beginning = genesis;
|
||||
}
|
||||
|
||||
static void
|
||||
removeArgs(int *argcp, char **argv, int numToRemove)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0, j = numToRemove; argv[j]; i++, j++) {
|
||||
argv[i] = argv[j];
|
||||
}
|
||||
argv[i] = NULL;
|
||||
*argcp -= numToRemove;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutInit(int *argcp, char **argv)
|
||||
{
|
||||
char *display = NULL;
|
||||
char *str, *geometry = NULL;
|
||||
#ifdef OLD_VMS
|
||||
struct timeval6 unused;
|
||||
#else
|
||||
struct timeval unused;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
if (__glutDisplay) {
|
||||
__glutWarning("glutInit being called a second time.");
|
||||
return;
|
||||
}
|
||||
/* Determine temporary program name. */
|
||||
str = strrchr(argv[0], '/');
|
||||
if (str == NULL) {
|
||||
__glutProgramName = argv[0];
|
||||
} else {
|
||||
__glutProgramName = str + 1;
|
||||
}
|
||||
|
||||
/* Make private copy of command line arguments. */
|
||||
__glutArgc = *argcp;
|
||||
__glutArgv = (char **) malloc(__glutArgc * sizeof(char *));
|
||||
if (!__glutArgv)
|
||||
__glutFatalError("out of memory.");
|
||||
for (i = 0; i < __glutArgc; i++) {
|
||||
__glutArgv[i] = __glutStrdup(argv[i]);
|
||||
if (!__glutArgv[i])
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
|
||||
/* determine permanent program name */
|
||||
str = strrchr(__glutArgv[0], '/');
|
||||
if (str == NULL) {
|
||||
__glutProgramName = __glutArgv[0];
|
||||
} else {
|
||||
__glutProgramName = str + 1;
|
||||
}
|
||||
|
||||
/* parse arguments for standard options */
|
||||
for (i = 1; i < __glutArgc; i++) {
|
||||
if (!strcmp(__glutArgv[i], "-display")) {
|
||||
#if defined(_WIN32)
|
||||
__glutWarning("-display option not supported by Win32 GLUT.");
|
||||
#endif
|
||||
if (++i >= __glutArgc) {
|
||||
__glutFatalError(
|
||||
"follow -display option with X display name.");
|
||||
}
|
||||
display = __glutArgv[i];
|
||||
removeArgs(argcp, &argv[1], 2);
|
||||
} else if (!strcmp(__glutArgv[i], "-geometry")) {
|
||||
if (++i >= __glutArgc) {
|
||||
__glutFatalError(
|
||||
"follow -geometry option with geometry parameter.");
|
||||
}
|
||||
geometry = __glutArgv[i];
|
||||
removeArgs(argcp, &argv[1], 2);
|
||||
} else if (!strcmp(__glutArgv[i], "-direct")) {
|
||||
#if defined(_WIN32)
|
||||
__glutWarning("-direct option not supported by Win32 GLUT.");
|
||||
#endif
|
||||
if (!__glutTryDirect)
|
||||
__glutFatalError(
|
||||
"cannot force both direct and indirect rendering.");
|
||||
__glutForceDirect = GL_TRUE;
|
||||
removeArgs(argcp, &argv[1], 1);
|
||||
} else if (!strcmp(__glutArgv[i], "-indirect")) {
|
||||
#if defined(_WIN32)
|
||||
__glutWarning("-indirect option not supported by Win32 GLUT.");
|
||||
#endif
|
||||
if (__glutForceDirect)
|
||||
__glutFatalError(
|
||||
"cannot force both direct and indirect rendering.");
|
||||
__glutTryDirect = GL_FALSE;
|
||||
removeArgs(argcp, &argv[1], 1);
|
||||
} else if (!strcmp(__glutArgv[i], "-iconic")) {
|
||||
__glutIconic = GL_TRUE;
|
||||
removeArgs(argcp, &argv[1], 1);
|
||||
} else if (!strcmp(__glutArgv[i], "-gldebug")) {
|
||||
__glutDebug = GL_TRUE;
|
||||
removeArgs(argcp, &argv[1], 1);
|
||||
} else if (!strcmp(__glutArgv[i], "-sync")) {
|
||||
#if defined(_WIN32)
|
||||
__glutWarning("-sync option not supported by Win32 GLUT.");
|
||||
#endif
|
||||
synchronize = GL_TRUE;
|
||||
removeArgs(argcp, &argv[1], 1);
|
||||
} else {
|
||||
/* Once unknown option encountered, stop command line
|
||||
processing. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if defined(__OS2__)
|
||||
__glutOpenOS2Connection(display);
|
||||
#elif defined(_WIN32)
|
||||
__glutOpenWin32Connection(display);
|
||||
#else
|
||||
__glutOpenXConnection(display);
|
||||
#endif
|
||||
if (geometry) {
|
||||
int flags, x, y, width, height;
|
||||
|
||||
/* Fix bogus "{width|height} may be used before set"
|
||||
warning */
|
||||
width = 0;
|
||||
height = 0;
|
||||
|
||||
flags = XParseGeometry(geometry, &x, &y,
|
||||
(unsigned int *) &width, (unsigned int *) &height);
|
||||
if (WidthValue & flags) {
|
||||
/* Careful because X does not allow zero or negative
|
||||
width windows */
|
||||
if (width > 0)
|
||||
__glutInitWidth = width;
|
||||
}
|
||||
if (HeightValue & flags) {
|
||||
/* Careful because X does not allow zero or negative
|
||||
height windows */
|
||||
if (height > 0)
|
||||
__glutInitHeight = height;
|
||||
}
|
||||
glutInitWindowSize(__glutInitWidth, __glutInitHeight);
|
||||
if (XValue & flags) {
|
||||
if (XNegative & flags)
|
||||
x = DisplayWidth(__glutDisplay, __glutScreen) +
|
||||
x - __glutSizeHints.width;
|
||||
/* Play safe: reject negative X locations */
|
||||
if (x >= 0)
|
||||
__glutInitX = x;
|
||||
}
|
||||
if (YValue & flags) {
|
||||
if (YNegative & flags)
|
||||
y = DisplayHeight(__glutDisplay, __glutScreen) +
|
||||
y - __glutSizeHints.height;
|
||||
/* Play safe: reject negative Y locations */
|
||||
if (y >= 0)
|
||||
__glutInitY = y;
|
||||
}
|
||||
glutInitWindowPosition(__glutInitX, __glutInitY);
|
||||
}
|
||||
__glutInitTime(&unused);
|
||||
|
||||
/* check if GLUT_FPS env var is set */
|
||||
{
|
||||
const char *fps = getenv("GLUT_FPS");
|
||||
if (fps) {
|
||||
sscanf(fps, "%d", &__glutFPS);
|
||||
if (__glutFPS <= 0)
|
||||
__glutFPS = 5000; /* 5000 milliseconds */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
void APIENTRY
|
||||
__glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int))
|
||||
{
|
||||
__glutExitFunc = exitfunc;
|
||||
glutInit(argcp, argv);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutInitWindowPosition(int x, int y)
|
||||
{
|
||||
__glutInitX = x;
|
||||
__glutInitY = y;
|
||||
if (x >= 0 && y >= 0) {
|
||||
__glutSizeHints.x = x;
|
||||
__glutSizeHints.y = y;
|
||||
__glutSizeHints.flags |= USPosition;
|
||||
} else {
|
||||
__glutSizeHints.flags &= ~USPosition;
|
||||
}
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutInitWindowSize(int width, int height)
|
||||
{
|
||||
__glutInitWidth = width;
|
||||
__glutInitHeight = height;
|
||||
if (width > 0 && height > 0) {
|
||||
__glutSizeHints.width = width;
|
||||
__glutSizeHints.height = height;
|
||||
__glutSizeHints.flags |= USSize;
|
||||
} else {
|
||||
__glutSizeHints.flags &= ~USSize;
|
||||
}
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutInitDisplayMode(unsigned int mask)
|
||||
{
|
||||
__glutDisplayMode = mask;
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,628 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "glutint.h"
|
||||
#define POFIG 0
|
||||
#if POFIG
|
||||
|
||||
int __glutNumDials = 0;
|
||||
int __glutNumSpaceballButtons = 0;
|
||||
int __glutNumButtonBoxButtons = 0;
|
||||
int __glutNumTabletButtons = 0;
|
||||
int __glutNumMouseButtons = 3; /* Good guess. */
|
||||
XDevice *__glutTablet = NULL;
|
||||
XDevice *__glutDials = NULL;
|
||||
XDevice *__glutSpaceball = NULL;
|
||||
|
||||
int __glutHasJoystick = 0;
|
||||
int __glutNumJoystickButtons = 0;
|
||||
int __glutNumJoystickAxes = 0;
|
||||
|
||||
#if !defined(_WIN32)
|
||||
typedef struct _Range {
|
||||
int min;
|
||||
int range;
|
||||
} Range;
|
||||
|
||||
#define NUM_SPACEBALL_AXIS 6
|
||||
#define NUM_TABLET_AXIS 2
|
||||
#define NUM_DIALS_AXIS 8
|
||||
|
||||
Range __glutSpaceballRange[NUM_SPACEBALL_AXIS];
|
||||
Range __glutTabletRange[NUM_TABLET_AXIS];
|
||||
int *__glutDialsResolution;
|
||||
|
||||
/* Safely assumes 0 is an illegal event type for X Input
|
||||
extension events. */
|
||||
int __glutDeviceMotionNotify = 0;
|
||||
int __glutDeviceButtonPress = 0;
|
||||
int __glutDeviceButtonPressGrab = 0;
|
||||
int __glutDeviceButtonRelease = 0;
|
||||
int __glutDeviceStateNotify = 0;
|
||||
|
||||
static int
|
||||
normalizeTabletPos(int axis, int rawValue)
|
||||
{
|
||||
assert(rawValue >= __glutTabletRange[axis].min);
|
||||
assert(rawValue <= __glutTabletRange[axis].min
|
||||
+ __glutTabletRange[axis].range);
|
||||
/* Normalize rawValue to between 0 and 4000. */
|
||||
return ((rawValue - __glutTabletRange[axis].min) * 4000) /
|
||||
__glutTabletRange[axis].range;
|
||||
}
|
||||
|
||||
static int
|
||||
normalizeDialAngle(int axis, int rawValue)
|
||||
{
|
||||
/* XXX Assumption made that the resolution of the device is
|
||||
number of clicks for one complete dial revolution. This
|
||||
is true for SGI's dial & button box. */
|
||||
return (rawValue * 360.0) / __glutDialsResolution[axis];
|
||||
}
|
||||
|
||||
static int
|
||||
normalizeSpaceballAngle(int axis, int rawValue)
|
||||
{
|
||||
assert(rawValue >= __glutSpaceballRange[axis].min);
|
||||
assert(rawValue <= __glutSpaceballRange[axis].min +
|
||||
__glutSpaceballRange[axis].range);
|
||||
/* Normalize rawValue to between -1800 and 1800. */
|
||||
return ((rawValue - __glutSpaceballRange[axis].min) * 3600) /
|
||||
__glutSpaceballRange[axis].range - 1800;
|
||||
}
|
||||
|
||||
static int
|
||||
normalizeSpaceballDelta(int axis, int rawValue)
|
||||
{
|
||||
assert(rawValue >= __glutSpaceballRange[axis].min);
|
||||
assert(rawValue <= __glutSpaceballRange[axis].min +
|
||||
__glutSpaceballRange[axis].range);
|
||||
/* Normalize rawValue to between -1000 and 1000. */
|
||||
return ((rawValue - __glutSpaceballRange[axis].min) * 2000) /
|
||||
__glutSpaceballRange[axis].range - 1000;
|
||||
}
|
||||
|
||||
static void
|
||||
queryTabletPos(GLUTwindow * window)
|
||||
{
|
||||
XDeviceState *state;
|
||||
XInputClass *any;
|
||||
XValuatorState *v;
|
||||
int i;
|
||||
|
||||
state = XQueryDeviceState(__glutDisplay, __glutTablet);
|
||||
any = state->data;
|
||||
for (i = 0; i < state->num_classes; i++) {
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
switch (any->c_class) {
|
||||
#else
|
||||
switch (any->class) {
|
||||
#endif
|
||||
case ValuatorClass:
|
||||
v = (XValuatorState *) any;
|
||||
if (v->num_valuators < 2)
|
||||
goto end;
|
||||
if (window->tabletPos[0] == -1)
|
||||
window->tabletPos[0] = normalizeTabletPos(0, v->valuators[0]);
|
||||
if (window->tabletPos[1] == -1)
|
||||
window->tabletPos[1] = normalizeTabletPos(1, v->valuators[1]);
|
||||
}
|
||||
any = (XInputClass *) ((char *) any + any->length);
|
||||
}
|
||||
end:
|
||||
XFreeDeviceState(state);
|
||||
}
|
||||
|
||||
static void
|
||||
tabletPosChange(GLUTwindow * window, int first, int count, int *data)
|
||||
{
|
||||
int i, value, genEvent = 0;
|
||||
|
||||
for (i = first; i < first + count; i++) {
|
||||
switch (i) {
|
||||
case 0: /* X axis */
|
||||
case 1: /* Y axis */
|
||||
value = normalizeTabletPos(i, data[i - first]);
|
||||
if (value != window->tabletPos[i]) {
|
||||
window->tabletPos[i] = value;
|
||||
genEvent = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (window->tabletPos[0] == -1 || window->tabletPos[1] == -1)
|
||||
queryTabletPos(window);
|
||||
if (genEvent)
|
||||
window->tabletMotion(window->tabletPos[0], window->tabletPos[1]);
|
||||
}
|
||||
#endif /* !_WIN32 */
|
||||
|
||||
static int
|
||||
__glutProcessDeviceEvents(XEvent * event)
|
||||
{
|
||||
#if !defined(_WIN32)
|
||||
GLUTwindow *window;
|
||||
|
||||
/* XXX Ugly code fan out. */
|
||||
|
||||
/* Can't use switch/case since X Input event types are
|
||||
dynamic. */
|
||||
|
||||
if (__glutDeviceMotionNotify && event->type == __glutDeviceMotionNotify) {
|
||||
XDeviceMotionEvent *devmot = (XDeviceMotionEvent *) event;
|
||||
|
||||
window = __glutGetWindow(devmot->window);
|
||||
if (window) {
|
||||
if (__glutTablet
|
||||
&& devmot->deviceid == __glutTablet->device_id
|
||||
&& window->tabletMotion) {
|
||||
tabletPosChange(window, devmot->first_axis, devmot->axes_count,
|
||||
devmot->axis_data);
|
||||
} else if (__glutDials
|
||||
&& devmot->deviceid == __glutDials->device_id
|
||||
&& window->dials) {
|
||||
int i, first = devmot->first_axis, count = devmot->axes_count;
|
||||
|
||||
for (i = first; i < first + count; i++)
|
||||
window->dials(i + 1,
|
||||
normalizeDialAngle(i, devmot->axis_data[i - first]));
|
||||
} else if (__glutSpaceball
|
||||
&& devmot->deviceid == __glutSpaceball->device_id) {
|
||||
/* XXX Assume that space ball motion events come in as
|
||||
all the first 6 axes. Assume first 3 axes are XYZ
|
||||
translations; second 3 axes are XYZ rotations. */
|
||||
if (devmot->first_axis == 0 && devmot->axes_count == 6) {
|
||||
if (window->spaceMotion)
|
||||
window->spaceMotion(
|
||||
normalizeSpaceballDelta(0, devmot->axis_data[0]),
|
||||
normalizeSpaceballDelta(1, devmot->axis_data[1]),
|
||||
normalizeSpaceballDelta(2, devmot->axis_data[2]));
|
||||
if (window->spaceRotate)
|
||||
window->spaceRotate(
|
||||
normalizeSpaceballAngle(3, devmot->axis_data[3]),
|
||||
normalizeSpaceballAngle(4, devmot->axis_data[4]),
|
||||
normalizeSpaceballAngle(5, devmot->axis_data[5]));
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
} else if (__glutDeviceButtonPress
|
||||
&& event->type == __glutDeviceButtonPress) {
|
||||
XDeviceButtonEvent *devbtn = (XDeviceButtonEvent *) event;
|
||||
|
||||
window = __glutGetWindow(devbtn->window);
|
||||
if (window) {
|
||||
if (__glutTablet
|
||||
&& devbtn->deviceid == __glutTablet->device_id
|
||||
&& window->tabletButton
|
||||
&& devbtn->first_axis == 0
|
||||
&& devbtn->axes_count == 2) {
|
||||
tabletPosChange(window, devbtn->first_axis, devbtn->axes_count,
|
||||
devbtn->axis_data);
|
||||
window->tabletButton(devbtn->button, GLUT_DOWN,
|
||||
window->tabletPos[0], window->tabletPos[1]);
|
||||
} else if (__glutDials
|
||||
&& devbtn->deviceid == __glutDials->device_id
|
||||
&& window->buttonBox) {
|
||||
window->buttonBox(devbtn->button, GLUT_DOWN);
|
||||
} else if (__glutSpaceball
|
||||
&& devbtn->deviceid == __glutSpaceball->device_id
|
||||
&& window->spaceButton) {
|
||||
window->spaceButton(devbtn->button, GLUT_DOWN);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
} else if (__glutDeviceButtonRelease
|
||||
&& event->type == __glutDeviceButtonRelease) {
|
||||
XDeviceButtonEvent *devbtn = (XDeviceButtonEvent *) event;
|
||||
|
||||
window = __glutGetWindow(devbtn->window);
|
||||
if (window) {
|
||||
if (__glutTablet
|
||||
&& devbtn->deviceid == __glutTablet->device_id
|
||||
&& window->tabletButton
|
||||
&& devbtn->first_axis == 0
|
||||
&& devbtn->axes_count == 2) {
|
||||
tabletPosChange(window, devbtn->first_axis, devbtn->axes_count,
|
||||
devbtn->axis_data);
|
||||
window->tabletButton(devbtn->button, GLUT_UP,
|
||||
window->tabletPos[0], window->tabletPos[1]);
|
||||
} else if (__glutDials
|
||||
&& devbtn->deviceid == __glutDials->device_id
|
||||
&& window->buttonBox) {
|
||||
window->buttonBox(devbtn->button, GLUT_UP);
|
||||
} else if (__glutSpaceball
|
||||
&& devbtn->deviceid == __glutSpaceball->device_id
|
||||
&& window->spaceButton) {
|
||||
window->spaceButton(devbtn->button, GLUT_UP);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
{
|
||||
JOYINFOEX info;
|
||||
JOYCAPS joyCaps;
|
||||
|
||||
memset(&info, 0, sizeof(JOYINFOEX));
|
||||
info.dwSize = sizeof(JOYINFOEX);
|
||||
info.dwFlags = JOY_RETURNALL;
|
||||
|
||||
if (joyGetPosEx(JOYSTICKID1,&info) != JOYERR_NOERROR) {
|
||||
__glutHasJoystick = 1;
|
||||
joyGetDevCaps(JOYSTICKID1, &joyCaps, sizeof(joyCaps));
|
||||
__glutNumJoystickButtons = joyCaps.wNumButtons;
|
||||
__glutNumJoystickAxes = joyCaps.wNumAxes;
|
||||
} else {
|
||||
__glutHasJoystick = 0;
|
||||
__glutNumJoystickButtons = 0;
|
||||
__glutNumJoystickAxes = 0;
|
||||
}
|
||||
}
|
||||
#endif /* !_WIN32 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GLUTeventParser eventParser =
|
||||
{__glutProcessDeviceEvents, NULL};
|
||||
|
||||
static void
|
||||
addDeviceEventParser(void)
|
||||
{
|
||||
static Bool been_here = False;
|
||||
|
||||
if (been_here)
|
||||
return;
|
||||
been_here = True;
|
||||
__glutRegisterEventParser(&eventParser);
|
||||
}
|
||||
|
||||
static int
|
||||
probeDevices(void)
|
||||
{
|
||||
static Bool been_here = False;
|
||||
static int support;
|
||||
#if !defined(_WIN32)
|
||||
XExtensionVersion *version;
|
||||
XDeviceInfoPtr device_info, device;
|
||||
XAnyClassPtr any;
|
||||
XButtonInfoPtr b;
|
||||
XValuatorInfoPtr v;
|
||||
XAxisInfoPtr a;
|
||||
int num_dev = 0, btns = 0, dials = 0;
|
||||
int i, j, k;
|
||||
#endif /* !_WIN32 */
|
||||
|
||||
if (been_here) {
|
||||
return support;
|
||||
}
|
||||
been_here = True;
|
||||
|
||||
#if !defined(_WIN32)
|
||||
version = XGetExtensionVersion(__glutDisplay, "XInputExtension");
|
||||
/* Ugh. XInput extension API forces annoying cast of a pointer
|
||||
to a long so it can be compared with the NoSuchExtension
|
||||
value (#defined to 1). */
|
||||
if (version == NULL || ((long) version) == NoSuchExtension) {
|
||||
support = 0;
|
||||
return support;
|
||||
}
|
||||
XFree(version);
|
||||
device_info = XListInputDevices(__glutDisplay, &num_dev);
|
||||
if (device_info) {
|
||||
for (i = 0; i < num_dev; i++) {
|
||||
/* XXX These are SGI names for these devices;
|
||||
unfortunately, no good standard exists for standard
|
||||
types of X input extension devices. */
|
||||
|
||||
device = &device_info[i];
|
||||
any = (XAnyClassPtr) device->inputclassinfo;
|
||||
|
||||
if (!__glutSpaceball && !strcmp(device->name, "spaceball")) {
|
||||
v = NULL;
|
||||
b = NULL;
|
||||
for (j = 0; j < device->num_classes; j++) {
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
switch (any->c_class) {
|
||||
#else
|
||||
switch (any->class) {
|
||||
#endif
|
||||
case ButtonClass:
|
||||
b = (XButtonInfoPtr) any;
|
||||
btns = b->num_buttons;
|
||||
break;
|
||||
case ValuatorClass:
|
||||
v = (XValuatorInfoPtr) any;
|
||||
/* Sanity check: at least 6 valuators? */
|
||||
if (v->num_axes < NUM_SPACEBALL_AXIS)
|
||||
goto skip_device;
|
||||
a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
|
||||
for (k = 0; k < NUM_SPACEBALL_AXIS; k++, a++) {
|
||||
__glutSpaceballRange[k].min = a->min_value;
|
||||
__glutSpaceballRange[k].range = a->max_value - a->min_value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
any = (XAnyClassPtr) ((char *) any + any->length);
|
||||
}
|
||||
if (v) {
|
||||
__glutSpaceball = XOpenDevice(__glutDisplay, device->id);
|
||||
if (__glutSpaceball) {
|
||||
__glutNumSpaceballButtons = btns;
|
||||
addDeviceEventParser();
|
||||
}
|
||||
}
|
||||
} else if (!__glutDials && !strcmp(device->name, "dial+buttons")) {
|
||||
v = NULL;
|
||||
b = NULL;
|
||||
for (j = 0; j < device->num_classes; j++) {
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
switch (any->c_class) {
|
||||
#else
|
||||
switch (any->class) {
|
||||
#endif
|
||||
case ButtonClass:
|
||||
b = (XButtonInfoPtr) any;
|
||||
btns = b->num_buttons;
|
||||
break;
|
||||
case ValuatorClass:
|
||||
v = (XValuatorInfoPtr) any;
|
||||
/* Sanity check: at least 8 valuators? */
|
||||
if (v->num_axes < NUM_DIALS_AXIS)
|
||||
goto skip_device;
|
||||
dials = v->num_axes;
|
||||
__glutDialsResolution = (int *) malloc(sizeof(int) * dials);
|
||||
a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
|
||||
for (k = 0; k < dials; k++, a++) {
|
||||
__glutDialsResolution[k] = a->resolution;
|
||||
}
|
||||
break;
|
||||
}
|
||||
any = (XAnyClassPtr) ((char *) any + any->length);
|
||||
}
|
||||
if (v) {
|
||||
__glutDials = XOpenDevice(__glutDisplay, device->id);
|
||||
if (__glutDials) {
|
||||
__glutNumButtonBoxButtons = btns;
|
||||
__glutNumDials = dials;
|
||||
addDeviceEventParser();
|
||||
}
|
||||
}
|
||||
} else if (!__glutTablet && !strcmp(device->name, "tablet")) {
|
||||
v = NULL;
|
||||
b = NULL;
|
||||
for (j = 0; j < device->num_classes; j++) {
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
switch (any->c_class) {
|
||||
#else
|
||||
switch (any->class) {
|
||||
#endif
|
||||
case ButtonClass:
|
||||
b = (XButtonInfoPtr) any;
|
||||
btns = b->num_buttons;
|
||||
break;
|
||||
case ValuatorClass:
|
||||
v = (XValuatorInfoPtr) any;
|
||||
/* Sanity check: exactly 2 valuators? */
|
||||
if (v->num_axes != NUM_TABLET_AXIS)
|
||||
goto skip_device;
|
||||
a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
|
||||
for (k = 0; k < NUM_TABLET_AXIS; k++, a++) {
|
||||
__glutTabletRange[k].min = a->min_value;
|
||||
__glutTabletRange[k].range = a->max_value - a->min_value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
any = (XAnyClassPtr) ((char *) any + any->length);
|
||||
}
|
||||
if (v) {
|
||||
__glutTablet = XOpenDevice(__glutDisplay, device->id);
|
||||
if (__glutTablet) {
|
||||
__glutNumTabletButtons = btns;
|
||||
addDeviceEventParser();
|
||||
}
|
||||
}
|
||||
} else if (!strcmp(device->name, "mouse")) {
|
||||
for (j = 0; j < device->num_classes; j++) {
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
if (any->c_class == ButtonClass) {
|
||||
#else
|
||||
if (any->class == ButtonClass) {
|
||||
#endif
|
||||
b = (XButtonInfoPtr) any;
|
||||
__glutNumMouseButtons = b->num_buttons;
|
||||
}
|
||||
any = (XAnyClassPtr) ((char *) any + any->length);
|
||||
}
|
||||
}
|
||||
skip_device:;
|
||||
}
|
||||
XFreeDeviceList(device_info);
|
||||
}
|
||||
#else /* _WIN32 */
|
||||
__glutNumMouseButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
|
||||
#endif /* !_WIN32 */
|
||||
/* X Input extension might be supported, but only if there is
|
||||
a tablet, dials, or spaceball do we claim devices are
|
||||
supported. */
|
||||
support = __glutTablet || __glutDials || __glutSpaceball;
|
||||
return support;
|
||||
}
|
||||
|
||||
void
|
||||
__glutUpdateInputDeviceMask(GLUTwindow * window)
|
||||
{
|
||||
#if !defined(_WIN32)
|
||||
/* 5 (dial and buttons) + 5 (tablet locator and buttons) + 5
|
||||
(Spaceball buttons and axis) = 15 */
|
||||
XEventClass eventList[15];
|
||||
int rc, numEvents;
|
||||
|
||||
rc = probeDevices();
|
||||
if (rc) {
|
||||
numEvents = 0;
|
||||
if (__glutTablet) {
|
||||
if (window->tabletMotion) {
|
||||
DeviceMotionNotify(__glutTablet, __glutDeviceMotionNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->tabletButton) {
|
||||
DeviceButtonPress(__glutTablet, __glutDeviceButtonPress,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonPressGrab(__glutTablet, __glutDeviceButtonPressGrab,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonRelease(__glutTablet, __glutDeviceButtonRelease,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->tabletMotion || window->tabletButton) {
|
||||
DeviceStateNotify(__glutTablet, __glutDeviceStateNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
}
|
||||
if (__glutDials) {
|
||||
if (window->dials) {
|
||||
DeviceMotionNotify(__glutDials, __glutDeviceMotionNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->buttonBox) {
|
||||
DeviceButtonPress(__glutDials, __glutDeviceButtonPress,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonPressGrab(__glutDials, __glutDeviceButtonPressGrab,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonRelease(__glutDials, __glutDeviceButtonRelease,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->dials || window->buttonBox) {
|
||||
DeviceStateNotify(__glutDials, __glutDeviceStateNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
}
|
||||
if (__glutSpaceball) {
|
||||
if (window->spaceMotion || window->spaceRotate) {
|
||||
DeviceMotionNotify(__glutSpaceball, __glutDeviceMotionNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->spaceButton) {
|
||||
DeviceButtonPress(__glutSpaceball, __glutDeviceButtonPress,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonPressGrab(__glutSpaceball, __glutDeviceButtonPressGrab,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
DeviceButtonRelease(__glutSpaceball, __glutDeviceButtonRelease,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
if (window->spaceMotion || window->spaceRotate || window->spaceButton) {
|
||||
DeviceStateNotify(__glutSpaceball, __glutDeviceStateNotify,
|
||||
eventList[numEvents]);
|
||||
numEvents++;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if (window->children) {
|
||||
GLUTwindow *child = window->children;
|
||||
|
||||
do {
|
||||
XChangeDeviceDontPropagateList(__glutDisplay, child->win,
|
||||
numEvents, eventList, AddToList);
|
||||
child = child->siblings;
|
||||
} while (child);
|
||||
}
|
||||
#endif
|
||||
XSelectExtensionEvent(__glutDisplay, window->win,
|
||||
eventList, numEvents);
|
||||
if (window->overlay) {
|
||||
XSelectExtensionEvent(__glutDisplay, window->overlay->win,
|
||||
eventList, numEvents);
|
||||
}
|
||||
} else {
|
||||
/* X Input extension not supported; no chance for exotic
|
||||
input devices. */
|
||||
}
|
||||
#endif /* !_WIN32 */
|
||||
}
|
||||
|
||||
#endif //POFIG
|
||||
|
||||
/* CENTRY */
|
||||
int GLUTAPIENTRY
|
||||
glutDeviceGet(GLenum param)
|
||||
{
|
||||
#if POFIG
|
||||
probeDevices();
|
||||
#endif
|
||||
switch (param) {
|
||||
case GLUT_HAS_KEYBOARD:
|
||||
case GLUT_HAS_MOUSE:
|
||||
/* Assume window system always has mouse and keyboard. */
|
||||
return 1;
|
||||
#if POFIG
|
||||
case GLUT_HAS_SPACEBALL:
|
||||
return __glutSpaceball != NULL;
|
||||
case GLUT_HAS_DIAL_AND_BUTTON_BOX:
|
||||
return __glutDials != NULL;
|
||||
case GLUT_HAS_TABLET:
|
||||
return __glutTablet != NULL;
|
||||
case GLUT_NUM_MOUSE_BUTTONS:
|
||||
return __glutNumMouseButtons;
|
||||
case GLUT_NUM_SPACEBALL_BUTTONS:
|
||||
return __glutNumSpaceballButtons;
|
||||
case GLUT_NUM_BUTTON_BOX_BUTTONS:
|
||||
return __glutNumButtonBoxButtons;
|
||||
case GLUT_NUM_DIALS:
|
||||
return __glutNumDials;
|
||||
case GLUT_NUM_TABLET_BUTTONS:
|
||||
return __glutNumTabletButtons;
|
||||
case GLUT_DEVICE_IGNORE_KEY_REPEAT:
|
||||
return __glutCurrentWindow->ignoreKeyRepeat;
|
||||
#ifndef _WIN32
|
||||
case GLUT_DEVICE_KEY_REPEAT:
|
||||
{
|
||||
XKeyboardState state;
|
||||
|
||||
XGetKeyboardControl(__glutDisplay, &state);
|
||||
return state.global_auto_repeat;
|
||||
}
|
||||
case GLUT_JOYSTICK_POLL_RATE:
|
||||
return 0;
|
||||
#else
|
||||
case GLUT_DEVICE_KEY_REPEAT:
|
||||
/* Win32 cannot globally disable key repeat. */
|
||||
return GLUT_KEY_REPEAT_ON;
|
||||
case GLUT_JOYSTICK_POLL_RATE:
|
||||
return __glutCurrentWindow->joyPollInterval;
|
||||
#endif
|
||||
case GLUT_HAS_JOYSTICK:
|
||||
return __glutHasJoystick;
|
||||
case GLUT_JOYSTICK_BUTTONS:
|
||||
return __glutNumJoystickButtons;
|
||||
case GLUT_JOYSTICK_AXES:
|
||||
return __glutNumJoystickAxes;
|
||||
#endif //POFIG
|
||||
default:
|
||||
__glutWarning("invalid glutDeviceGet parameter: %d", param);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutKeyboardFunc(GLUTkeyboardCB keyboardFunc)
|
||||
{
|
||||
__glutChangeWindowEventMask(KeyPressMask,
|
||||
keyboardFunc != NULL || __glutCurrentWindow->special != NULL);
|
||||
__glutCurrentWindow->keyboard = keyboardFunc;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSpecialFunc(GLUTspecialCB specialFunc)
|
||||
{
|
||||
__glutChangeWindowEventMask(KeyPressMask,
|
||||
specialFunc != NULL || __glutCurrentWindow->keyboard != NULL);
|
||||
__glutCurrentWindow->special = specialFunc;
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1996, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutIgnoreKeyRepeat(int ignore)
|
||||
{
|
||||
__glutCurrentWindow->ignoreKeyRepeat = ignore;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSetKeyRepeat(int repeatMode)
|
||||
{
|
||||
#if !defined(_WIN32) && !defined(__OS2PM__)
|
||||
XKeyboardControl values;
|
||||
|
||||
/* GLUT's repeatMode #define's match the Xlib API values. */
|
||||
values.auto_repeat_mode = repeatMode;
|
||||
XChangeKeyboardControl(__glutDisplay, KBAutoRepeatMode, &values);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc)
|
||||
{
|
||||
__glutChangeWindowEventMask(KeyReleaseMask,
|
||||
keyboardUpFunc != NULL || __glutCurrentWindow->specialUp != NULL);
|
||||
__glutCurrentWindow->keyboardUp = keyboardUpFunc;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSpecialUpFunc(GLUTspecialCB specialUpFunc)
|
||||
{
|
||||
__glutChangeWindowEventMask(KeyReleaseMask,
|
||||
specialUpFunc != NULL || __glutCurrentWindow->keyboardUp != NULL);
|
||||
__glutCurrentWindow->specialUp = specialUpFunc;
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,57 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1996. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "glutint.h"
|
||||
|
||||
int __glutMesaSwapHackSupport = 0; /* Not supported until
|
||||
proven otherwise. */
|
||||
|
||||
/* Use the "Mesa swap hack" if reasonable if and only if
|
||||
MESA_SWAP_HACK is set to something whose first character is
|
||||
not "N" or "n" AND "Brian Paul" is the vendor string AND
|
||||
"Mesa X11"* (or "Mesa" for backward compatibility) is the
|
||||
renderer string.
|
||||
|
||||
Anyone who modifies Mesa so that glXSwapBuffers does not
|
||||
simply blit the previously rendered back buffer should
|
||||
change either their vendor or renderer string to avoid
|
||||
confusing GLUT. */
|
||||
|
||||
void
|
||||
__glutDetermineMesaSwapHackSupport(void)
|
||||
{
|
||||
static int doneAlready = 0;
|
||||
char *env, *vendor, *renderer;
|
||||
|
||||
if (doneAlready)
|
||||
return;
|
||||
env = getenv("MESA_SWAP_HACK");
|
||||
if (env) {
|
||||
if ((env[0] != 'n') && (env[0] != 'N')) {
|
||||
vendor = (char *) glGetString(GL_VENDOR);
|
||||
renderer = (char *) glGetString(GL_RENDERER);
|
||||
|
||||
/* Old versions of X11 Mesa uses the renderer string
|
||||
"Mesa"; Brian plans to start using "Mesa X11" to
|
||||
distinguish the X version of Mesa from other flavor
|
||||
such as Windows or 3Dfx. */
|
||||
|
||||
#define MESA_X11 "Mesa X11"
|
||||
|
||||
/* XXX At some point in the future, eliminate the
|
||||
backward compatibility for the old "Mesa" renderer
|
||||
string. */
|
||||
|
||||
if (!strcmp(vendor, "Brian Paul") && (!strcmp(renderer, "Mesa") ||
|
||||
!strncmp(renderer, MESA_X11, sizeof(MESA_X11) - 1)))
|
||||
__glutMesaSwapHackSupport = 1;
|
||||
}
|
||||
}
|
||||
doneAlready = 1;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
int GLUTAPIENTRY
|
||||
glutGetModifiers(void)
|
||||
{
|
||||
int modifiers;
|
||||
|
||||
if(__glutModifierMask == (unsigned int) ~0) {
|
||||
__glutWarning(
|
||||
"glutCurrentModifiers: do not call outside core input callback.");
|
||||
return 0;
|
||||
}
|
||||
modifiers = 0;
|
||||
if(__glutModifierMask & (ShiftMask|LockMask))
|
||||
modifiers |= GLUT_ACTIVE_SHIFT;
|
||||
if(__glutModifierMask & ControlMask)
|
||||
modifiers |= GLUT_ACTIVE_CTRL;
|
||||
if(__glutModifierMask & Mod1Mask)
|
||||
modifiers |= GLUT_ACTIVE_ALT;
|
||||
return modifiers;
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,595 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
|
||||
|
||||
/**
|
||||
(c) Copyright 1993, Silicon Graphics, Inc.
|
||||
|
||||
ALL RIGHTS RESERVED
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
for any purpose and without fee is hereby granted, provided
|
||||
that the above copyright notice appear in all copies and that
|
||||
both the copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Silicon
|
||||
Graphics, Inc. not be used in advertising or publicity
|
||||
pertaining to distribution of the software without specific,
|
||||
written prior permission.
|
||||
|
||||
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
|
||||
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
|
||||
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
||||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
|
||||
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
|
||||
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
|
||||
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
|
||||
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
|
||||
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
|
||||
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
|
||||
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
US Government Users Restricted Rights
|
||||
|
||||
Use, duplication, or disclosure by the Government is subject to
|
||||
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
||||
(c)(1)(ii) of the Rights in Technical Data and Computer
|
||||
Software clause at DFARS 252.227-7013 and/or in similar or
|
||||
successor clauses in the FAR or the DOD or NASA FAR
|
||||
Supplement. Unpublished-- rights reserved under the copyright
|
||||
laws of the United States. Contractor/manufacturer is Silicon
|
||||
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
|
||||
94039-7311.
|
||||
|
||||
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "glutint.h"
|
||||
|
||||
/* Some <math.h> files do not define M_PI... */
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
static GLUquadricObj *quadObj;
|
||||
|
||||
#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
|
||||
|
||||
static void
|
||||
initQuadObj(void)
|
||||
{
|
||||
quadObj = gluNewQuadric();
|
||||
if (!quadObj)
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||
{
|
||||
QUAD_OBJ_INIT();
|
||||
gluQuadricDrawStyle(quadObj, GLU_LINE);
|
||||
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||
/* If we ever changed/used the texture or orientation state
|
||||
of quadObj, we'd need to change it to the defaults here
|
||||
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||
gluSphere(quadObj, radius, slices, stacks);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||
{
|
||||
QUAD_OBJ_INIT();
|
||||
gluQuadricDrawStyle(quadObj, GLU_FILL);
|
||||
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||
/* If we ever changed/used the texture or orientation state
|
||||
of quadObj, we'd need to change it to the defaults here
|
||||
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||
gluSphere(quadObj, radius, slices, stacks);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutWireCone(GLdouble base, GLdouble height,
|
||||
GLint slices, GLint stacks)
|
||||
{
|
||||
QUAD_OBJ_INIT();
|
||||
gluQuadricDrawStyle(quadObj, GLU_LINE);
|
||||
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||
/* If we ever changed/used the texture or orientation state
|
||||
of quadObj, we'd need to change it to the defaults here
|
||||
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidCone(GLdouble base, GLdouble height,
|
||||
GLint slices, GLint stacks)
|
||||
{
|
||||
QUAD_OBJ_INIT();
|
||||
gluQuadricDrawStyle(quadObj, GLU_FILL);
|
||||
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||
/* If we ever changed/used the texture or orientation state
|
||||
of quadObj, we'd need to change it to the defaults here
|
||||
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
static void
|
||||
drawBox(GLfloat size, GLenum type)
|
||||
{
|
||||
static GLfloat n[6][3] =
|
||||
{
|
||||
{-1.0, 0.0, 0.0},
|
||||
{0.0, 1.0, 0.0},
|
||||
{1.0, 0.0, 0.0},
|
||||
{0.0, -1.0, 0.0},
|
||||
{0.0, 0.0, 1.0},
|
||||
{0.0, 0.0, -1.0}
|
||||
};
|
||||
static GLint faces[6][4] =
|
||||
{
|
||||
{0, 1, 2, 3},
|
||||
{3, 2, 6, 7},
|
||||
{7, 6, 5, 4},
|
||||
{4, 5, 1, 0},
|
||||
{5, 6, 2, 1},
|
||||
{7, 4, 0, 3}
|
||||
};
|
||||
GLfloat v[8][3];
|
||||
GLint i;
|
||||
|
||||
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
|
||||
v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
|
||||
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
|
||||
v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
|
||||
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
|
||||
v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
|
||||
|
||||
for (i = 5; i >= 0; i--) {
|
||||
glBegin(type);
|
||||
glNormal3fv(&n[i][0]);
|
||||
glVertex3fv(&v[faces[i][0]][0]);
|
||||
glVertex3fv(&v[faces[i][1]][0]);
|
||||
glVertex3fv(&v[faces[i][2]][0]);
|
||||
glVertex3fv(&v[faces[i][3]][0]);
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireCube(GLdouble size)
|
||||
{
|
||||
drawBox(size, GL_LINE_LOOP);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidCube(GLdouble size)
|
||||
{
|
||||
drawBox(size, GL_QUADS);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
static void
|
||||
doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
|
||||
{
|
||||
int i, j;
|
||||
GLfloat theta, phi, theta1;
|
||||
GLfloat cosTheta, sinTheta;
|
||||
GLfloat cosTheta1, sinTheta1;
|
||||
GLfloat ringDelta, sideDelta;
|
||||
|
||||
ringDelta = 2.0 * M_PI / rings;
|
||||
sideDelta = 2.0 * M_PI / nsides;
|
||||
|
||||
theta = 0.0;
|
||||
cosTheta = 1.0;
|
||||
sinTheta = 0.0;
|
||||
for (i = rings - 1; i >= 0; i--) {
|
||||
theta1 = theta + ringDelta;
|
||||
cosTheta1 = cos(theta1);
|
||||
sinTheta1 = sin(theta1);
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
phi = 0.0;
|
||||
for (j = nsides; j >= 0; j--) {
|
||||
GLfloat cosPhi, sinPhi, dist;
|
||||
|
||||
phi += sideDelta;
|
||||
cosPhi = cos(phi);
|
||||
sinPhi = sin(phi);
|
||||
dist = R + r * cosPhi;
|
||||
|
||||
glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
|
||||
glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
|
||||
glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
|
||||
glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
|
||||
}
|
||||
glEnd();
|
||||
theta = theta1;
|
||||
cosTheta = cosTheta1;
|
||||
sinTheta = sinTheta1;
|
||||
}
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
|
||||
GLint nsides, GLint rings)
|
||||
{
|
||||
glPushAttrib(GL_POLYGON_BIT);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
doughnut(innerRadius, outerRadius, nsides, rings);
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
|
||||
GLint nsides, GLint rings)
|
||||
{
|
||||
doughnut(innerRadius, outerRadius, nsides, rings);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
static GLfloat dodec[20][3];
|
||||
|
||||
static void
|
||||
initDodecahedron(void)
|
||||
{
|
||||
GLfloat alpha, beta;
|
||||
|
||||
alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
|
||||
beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
|
||||
2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
|
||||
/* *INDENT-OFF* */
|
||||
dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
|
||||
dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
|
||||
dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
|
||||
dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
|
||||
dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
|
||||
dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
|
||||
dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
|
||||
dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
|
||||
dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
|
||||
dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
|
||||
dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
|
||||
dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
|
||||
dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
|
||||
dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
|
||||
dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
|
||||
dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
|
||||
dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
|
||||
dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
|
||||
dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
|
||||
dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
|
||||
/* *INDENT-ON* */
|
||||
|
||||
}
|
||||
|
||||
#define DIFF3(_a,_b,_c) { \
|
||||
(_c)[0] = (_a)[0] - (_b)[0]; \
|
||||
(_c)[1] = (_a)[1] - (_b)[1]; \
|
||||
(_c)[2] = (_a)[2] - (_b)[2]; \
|
||||
}
|
||||
|
||||
static void
|
||||
crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
|
||||
{
|
||||
GLfloat p[3]; /* in case prod == v1 or v2 */
|
||||
|
||||
p[0] = v1[1] * v2[2] - v2[1] * v1[2];
|
||||
p[1] = v1[2] * v2[0] - v2[2] * v1[0];
|
||||
p[2] = v1[0] * v2[1] - v2[0] * v1[1];
|
||||
prod[0] = p[0];
|
||||
prod[1] = p[1];
|
||||
prod[2] = p[2];
|
||||
}
|
||||
|
||||
static void
|
||||
normalize(GLfloat v[3])
|
||||
{
|
||||
GLfloat d;
|
||||
|
||||
d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
|
||||
if (d == 0.0) {
|
||||
__glutWarning("normalize: zero length vector");
|
||||
v[0] = d = 1.0;
|
||||
}
|
||||
d = 1 / d;
|
||||
v[0] *= d;
|
||||
v[1] *= d;
|
||||
v[2] *= d;
|
||||
}
|
||||
|
||||
static void
|
||||
pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
|
||||
{
|
||||
GLfloat n0[3], d1[3], d2[3];
|
||||
|
||||
DIFF3(dodec[a], dodec[b], d1);
|
||||
DIFF3(dodec[b], dodec[c], d2);
|
||||
crossprod(d1, d2, n0);
|
||||
normalize(n0);
|
||||
|
||||
glBegin(shadeType);
|
||||
glNormal3fv(n0);
|
||||
glVertex3fv(&dodec[a][0]);
|
||||
glVertex3fv(&dodec[b][0]);
|
||||
glVertex3fv(&dodec[c][0]);
|
||||
glVertex3fv(&dodec[d][0]);
|
||||
glVertex3fv(&dodec[e][0]);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void
|
||||
dodecahedron(GLenum type)
|
||||
{
|
||||
static int inited = 0;
|
||||
|
||||
if (inited == 0) {
|
||||
inited = 1;
|
||||
initDodecahedron();
|
||||
}
|
||||
pentagon(0, 1, 9, 16, 5, type);
|
||||
pentagon(1, 0, 3, 18, 7, type);
|
||||
pentagon(1, 7, 11, 10, 9, type);
|
||||
pentagon(11, 7, 18, 19, 6, type);
|
||||
pentagon(8, 17, 16, 9, 10, type);
|
||||
pentagon(2, 14, 15, 6, 19, type);
|
||||
pentagon(2, 13, 12, 4, 14, type);
|
||||
pentagon(2, 19, 18, 3, 13, type);
|
||||
pentagon(3, 0, 5, 12, 13, type);
|
||||
pentagon(6, 15, 8, 10, 11, type);
|
||||
pentagon(4, 17, 8, 15, 14, type);
|
||||
pentagon(4, 12, 5, 16, 17, type);
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY glutWireDodecahedron(void)
|
||||
{
|
||||
dodecahedron(GL_LINE_LOOP);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidDodecahedron(void)
|
||||
{
|
||||
dodecahedron(GL_TRIANGLE_FAN);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
static void
|
||||
recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
|
||||
GLenum shadeType)
|
||||
{
|
||||
GLfloat q0[3], q1[3];
|
||||
|
||||
DIFF3(n1, n2, q0);
|
||||
DIFF3(n2, n3, q1);
|
||||
crossprod(q0, q1, q1);
|
||||
normalize(q1);
|
||||
|
||||
glBegin(shadeType);
|
||||
glNormal3fv(q1);
|
||||
glVertex3fv(n1);
|
||||
glVertex3fv(n2);
|
||||
glVertex3fv(n3);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void
|
||||
subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
|
||||
GLenum shadeType)
|
||||
{
|
||||
int depth;
|
||||
GLfloat w0[3], w1[3], w2[3];
|
||||
GLfloat l;
|
||||
int i, j, k, n;
|
||||
|
||||
depth = 1;
|
||||
for (i = 0; i < depth; i++) {
|
||||
for (j = 0; i + j < depth; j++) {
|
||||
k = depth - i - j;
|
||||
for (n = 0; n < 3; n++) {
|
||||
w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
|
||||
w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
|
||||
/ depth;
|
||||
w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
|
||||
/ depth;
|
||||
}
|
||||
l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
|
||||
w0[0] /= l;
|
||||
w0[1] /= l;
|
||||
w0[2] /= l;
|
||||
l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
|
||||
w1[0] /= l;
|
||||
w1[1] /= l;
|
||||
w1[2] /= l;
|
||||
l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
|
||||
w2[0] /= l;
|
||||
w2[1] /= l;
|
||||
w2[2] /= l;
|
||||
recorditem(w1, w0, w2, shadeType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
drawtriangle(int i, GLfloat data[][3], int ndx[][3],
|
||||
GLenum shadeType)
|
||||
{
|
||||
GLfloat *x0, *x1, *x2;
|
||||
|
||||
x0 = data[ndx[i][0]];
|
||||
x1 = data[ndx[i][1]];
|
||||
x2 = data[ndx[i][2]];
|
||||
subdivide(x0, x1, x2, shadeType);
|
||||
}
|
||||
|
||||
/* octahedron data: The octahedron produced is centered at the
|
||||
origin and has radius 1.0 */
|
||||
static GLfloat odata[6][3] =
|
||||
{
|
||||
{1.0, 0.0, 0.0},
|
||||
{-1.0, 0.0, 0.0},
|
||||
{0.0, 1.0, 0.0},
|
||||
{0.0, -1.0, 0.0},
|
||||
{0.0, 0.0, 1.0},
|
||||
{0.0, 0.0, -1.0}
|
||||
};
|
||||
|
||||
static int ondex[8][3] =
|
||||
{
|
||||
{0, 4, 2},
|
||||
{1, 2, 4},
|
||||
{0, 3, 4},
|
||||
{1, 4, 3},
|
||||
{0, 2, 5},
|
||||
{1, 5, 2},
|
||||
{0, 5, 3},
|
||||
{1, 3, 5}
|
||||
};
|
||||
|
||||
static void
|
||||
octahedron(GLenum shadeType)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 7; i >= 0; i--) {
|
||||
drawtriangle(i, odata, ondex, shadeType);
|
||||
}
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireOctahedron(void)
|
||||
{
|
||||
octahedron(GL_LINE_LOOP);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidOctahedron(void)
|
||||
{
|
||||
octahedron(GL_TRIANGLES);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
/* icosahedron data: These numbers are rigged to make an
|
||||
icosahedron of radius 1.0 */
|
||||
|
||||
#define X .525731112119133606
|
||||
#define Z .850650808352039932
|
||||
|
||||
static GLfloat idata[12][3] =
|
||||
{
|
||||
{-X, 0, Z},
|
||||
{X, 0, Z},
|
||||
{-X, 0, -Z},
|
||||
{X, 0, -Z},
|
||||
{0, Z, X},
|
||||
{0, Z, -X},
|
||||
{0, -Z, X},
|
||||
{0, -Z, -X},
|
||||
{Z, X, 0},
|
||||
{-Z, X, 0},
|
||||
{Z, -X, 0},
|
||||
{-Z, -X, 0}
|
||||
};
|
||||
|
||||
static int index[20][3] =
|
||||
{
|
||||
{0, 4, 1},
|
||||
{0, 9, 4},
|
||||
{9, 5, 4},
|
||||
{4, 5, 8},
|
||||
{4, 8, 1},
|
||||
{8, 10, 1},
|
||||
{8, 3, 10},
|
||||
{5, 3, 8},
|
||||
{5, 2, 3},
|
||||
{2, 7, 3},
|
||||
{7, 10, 3},
|
||||
{7, 6, 10},
|
||||
{7, 11, 6},
|
||||
{11, 0, 6},
|
||||
{0, 1, 6},
|
||||
{6, 1, 10},
|
||||
{9, 0, 11},
|
||||
{9, 11, 2},
|
||||
{9, 2, 5},
|
||||
{7, 2, 11},
|
||||
};
|
||||
|
||||
static void
|
||||
icosahedron(GLenum shadeType)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 19; i >= 0; i--) {
|
||||
drawtriangle(i, idata, index, shadeType);
|
||||
}
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireIcosahedron(void)
|
||||
{
|
||||
icosahedron(GL_LINE_LOOP);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidIcosahedron(void)
|
||||
{
|
||||
icosahedron(GL_TRIANGLES);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
|
||||
/* tetrahedron data: */
|
||||
|
||||
#define T 1.73205080756887729
|
||||
|
||||
static GLfloat tdata[4][3] =
|
||||
{
|
||||
{T, T, T},
|
||||
{T, -T, -T},
|
||||
{-T, T, -T},
|
||||
{-T, -T, T}
|
||||
};
|
||||
|
||||
static int tndex[4][3] =
|
||||
{
|
||||
{0, 1, 3},
|
||||
{2, 1, 0},
|
||||
{3, 2, 0},
|
||||
{1, 2, 3}
|
||||
};
|
||||
|
||||
static void
|
||||
tetrahedron(GLenum shadeType)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 3; i >= 0; i--)
|
||||
drawtriangle(i, tdata, tndex, shadeType);
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWireTetrahedron(void)
|
||||
{
|
||||
tetrahedron(GL_LINE_LOOP);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSolidTetrahedron(void)
|
||||
{
|
||||
tetrahedron(GL_TRIANGLES);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include "glutint.h"
|
||||
#include "glutstroke.h"
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutStrokeCharacter(GLUTstrokeFont font, int c)
|
||||
{
|
||||
const StrokeCharRec *ch;
|
||||
const StrokeRec *stroke;
|
||||
const CoordRec *coord;
|
||||
StrokeFontPtr fontinfo;
|
||||
int i, j;
|
||||
|
||||
|
||||
#if defined(_WIN32)
|
||||
fontinfo = (StrokeFontPtr) __glutFont(font);
|
||||
#else
|
||||
fontinfo = (StrokeFontPtr) font;
|
||||
#endif
|
||||
|
||||
if (c < 0 || c >= fontinfo->num_chars)
|
||||
return;
|
||||
ch = &(fontinfo->ch[c]);
|
||||
if (ch) {
|
||||
for (i = ch->num_strokes, stroke = ch->stroke;
|
||||
i > 0; i--, stroke++) {
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (j = stroke->num_coords, coord = stroke->coord;
|
||||
j > 0; j--, coord++) {
|
||||
glVertex2f(coord->x, coord->y);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
glTranslatef(ch->right, 0.0, 0.0);
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "glutint.h"
|
||||
|
||||
GLint __glutFPS = 0;
|
||||
GLint __glutSwapCount = 0;
|
||||
GLint __glutSwapTime = 0;
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutSwapBuffers(void)
|
||||
{
|
||||
GLUTwindow *window = __glutCurrentWindow;
|
||||
|
||||
if (window->renderWin == window->win) {
|
||||
if (__glutCurrentWindow->treatAsSingle) {
|
||||
/* Pretend the double buffered window is single buffered,
|
||||
so treat glutSwapBuffers as a no-op. */
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (__glutCurrentWindow->overlay->treatAsSingle) {
|
||||
/* Pretend the double buffered overlay is single
|
||||
buffered, so treat glutSwapBuffers as a no-op. */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* For the MESA_SWAP_HACK. */
|
||||
window->usedSwapBuffers = 1;
|
||||
|
||||
SWAP_BUFFERS_LAYER(__glutCurrentWindow);
|
||||
|
||||
/* I considered putting the window being swapped on the
|
||||
GLUT_FINISH_WORK work list because you could call
|
||||
glutSwapBuffers from an idle callback which doesn't call
|
||||
__glutSetWindow which normally adds indirect rendering
|
||||
windows to the GLUT_FINISH_WORK work list. Not being put
|
||||
on the list could lead to the buffering up of multiple
|
||||
redisplays and buffer swaps and hamper interactivity. I
|
||||
consider this an application bug due to not using
|
||||
glutPostRedisplay to trigger redraws. If
|
||||
glutPostRedisplay were used, __glutSetWindow would be
|
||||
called and a glFinish to throttle buffering would occur. */
|
||||
|
||||
if (__glutFPS) {
|
||||
GLint t = glutGet(GLUT_ELAPSED_TIME);
|
||||
__glutSwapCount++;
|
||||
if (__glutSwapTime == 0)
|
||||
__glutSwapTime = t;
|
||||
else if (t - __glutSwapTime > __glutFPS) {
|
||||
float time = 0.001 * (t - __glutSwapTime);
|
||||
float fps = (float) __glutSwapCount / time;
|
||||
fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n",
|
||||
__glutSwapCount, time, fps);
|
||||
__glutSwapTime = t;
|
||||
__glutSwapCount = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
@@ -1,210 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/**
|
||||
(c) Copyright 1993, Silicon Graphics, Inc.
|
||||
|
||||
ALL RIGHTS RESERVED
|
||||
|
||||
Permission to use, copy, modify, and distribute this software
|
||||
for any purpose and without fee is hereby granted, provided
|
||||
that the above copyright notice appear in all copies and that
|
||||
both the copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Silicon
|
||||
Graphics, Inc. not be used in advertising or publicity
|
||||
pertaining to distribution of the software without specific,
|
||||
written prior permission.
|
||||
|
||||
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
|
||||
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
|
||||
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
||||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
|
||||
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
|
||||
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
|
||||
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
|
||||
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
|
||||
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
|
||||
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
|
||||
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
US Government Users Restricted Rights
|
||||
|
||||
Use, duplication, or disclosure by the Government is subject to
|
||||
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
||||
(c)(1)(ii) of the Rights in Technical Data and Computer
|
||||
Software clause at DFARS 252.227-7013 and/or in similar or
|
||||
successor clauses in the FAR or the DOD or NASA FAR
|
||||
Supplement. Unpublished-- rights reserved under the copyright
|
||||
laws of the United States. Contractor/manufacturer is Silicon
|
||||
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
|
||||
94039-7311.
|
||||
|
||||
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
|
||||
*/
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* Rim, body, lid, and bottom data must be reflected in x and
|
||||
y; handle and spout data across the y axis only. */
|
||||
|
||||
static int patchdata[][16] =
|
||||
{
|
||||
/* rim */
|
||||
{102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
|
||||
12, 13, 14, 15},
|
||||
/* body */
|
||||
{12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
||||
24, 25, 26, 27},
|
||||
{24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
|
||||
37, 38, 39, 40},
|
||||
/* lid */
|
||||
{96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
|
||||
101, 0, 1, 2, 3,},
|
||||
{0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
|
||||
113, 114, 115, 116, 117},
|
||||
/* bottom */
|
||||
{118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
|
||||
125, 120, 40, 39, 38, 37},
|
||||
/* handle */
|
||||
{41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
|
||||
53, 54, 55, 56},
|
||||
{53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
|
||||
28, 65, 66, 67},
|
||||
/* spout */
|
||||
{68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
|
||||
80, 81, 82, 83},
|
||||
{80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
|
||||
92, 93, 94, 95}
|
||||
};
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
static float cpdata[][3] =
|
||||
{
|
||||
{0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
|
||||
-0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
|
||||
{0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
|
||||
0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
|
||||
2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
|
||||
2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
|
||||
{1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
|
||||
1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
|
||||
{0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
|
||||
0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
|
||||
0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
|
||||
{1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
|
||||
{1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
|
||||
-1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
|
||||
-0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
|
||||
2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
|
||||
2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
|
||||
2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
|
||||
{-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
|
||||
-0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
|
||||
1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
|
||||
-0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
|
||||
1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
|
||||
0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
|
||||
0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
|
||||
{2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
|
||||
-0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
|
||||
2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
|
||||
{3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
|
||||
{3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
|
||||
{2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
|
||||
3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
|
||||
3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
|
||||
-0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
|
||||
2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
|
||||
2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
|
||||
2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
|
||||
{0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
|
||||
-0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
|
||||
0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
|
||||
{0.84, -1.5, 0.075}
|
||||
};
|
||||
|
||||
static float tex[2][2][2] =
|
||||
{
|
||||
{ {0, 0},
|
||||
{1, 0}},
|
||||
{ {0, 1},
|
||||
{1, 1}}
|
||||
};
|
||||
|
||||
/* *INDENT-ON* */
|
||||
|
||||
static void
|
||||
teapot(GLint grid, GLdouble scale, GLenum type)
|
||||
{
|
||||
float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
|
||||
long i, j, k, l;
|
||||
|
||||
glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
|
||||
glEnable(GL_AUTO_NORMAL);
|
||||
glEnable(GL_NORMALIZE);
|
||||
glEnable(GL_MAP2_VERTEX_3);
|
||||
glEnable(GL_MAP2_TEXTURE_COORD_2);
|
||||
glPushMatrix();
|
||||
glRotatef(270.0, 1.0, 0.0, 0.0);
|
||||
glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
|
||||
glTranslatef(0.0, 0.0, -1.5);
|
||||
for (i = 0; i < 10; i++) {
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (k = 0; k < 4; k++) {
|
||||
for (l = 0; l < 3; l++) {
|
||||
p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||
q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||
if (l == 1)
|
||||
q[j][k][l] *= -1.0;
|
||||
if (i < 6) {
|
||||
r[j][k][l] =
|
||||
cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||
if (l == 0)
|
||||
r[j][k][l] *= -1.0;
|
||||
s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||
if (l == 0)
|
||||
s[j][k][l] *= -1.0;
|
||||
if (l == 1)
|
||||
s[j][k][l] *= -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
|
||||
&tex[0][0][0]);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&p[0][0][0]);
|
||||
glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&q[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
if (i < 6) {
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&r[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||
&s[0][0][0]);
|
||||
glEvalMesh2(type, 0, grid, 0, grid);
|
||||
}
|
||||
}
|
||||
glPopMatrix();
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutSolidTeapot(GLdouble scale)
|
||||
{
|
||||
teapot(7, scale, GL_FILL);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutWireTeapot(GLdouble scale)
|
||||
{
|
||||
teapot(10, scale, GL_LINE);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
#if !defined(__OS2__)
|
||||
|
||||
/* strdup is actually not a standard ANSI C or POSIX routine
|
||||
so implement a private one for GLUT. OpenVMS does not have a
|
||||
strdup; Linux's standard libc doesn't declare strdup by default
|
||||
(unless BSD or SVID interfaces are requested). */
|
||||
char *
|
||||
__glutStrdup(const char *string)
|
||||
{
|
||||
char *copy;
|
||||
|
||||
copy = (char*) malloc(strlen(string) + 1);
|
||||
if (copy == NULL)
|
||||
return NULL;
|
||||
strcpy(copy, string);
|
||||
return copy;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
__glutWarning(char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
fprintf(stderr, "GLUT: Warning in %s: ",
|
||||
__glutProgramName ? __glutProgramName : "(unamed)");
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
putc('\n', stderr);
|
||||
}
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutReportErrors(void)
|
||||
{
|
||||
GLenum error;
|
||||
|
||||
while ((error = glGetError()) != GL_NO_ERROR)
|
||||
__glutWarning("GL error: %s", gluErrorString(error));
|
||||
}
|
||||
/* ENDCENTRY */
|
||||
|
||||
void
|
||||
__glutFatalError(char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
fprintf(stderr, "GLUT: Fatal Error in %s: ",
|
||||
__glutProgramName ? __glutProgramName : "(unamed)");
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
putc('\n', stderr);
|
||||
/* || defined(__OS2__) */
|
||||
#if defined(_WIN32)
|
||||
if (__glutExitFunc) {
|
||||
__glutExitFunc(1);
|
||||
}
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
__glutFatalUsage(char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
fprintf(stderr, "GLUT: Fatal API Usage in %s: ",
|
||||
__glutProgramName ? __glutProgramName : "(unamed)");
|
||||
vfprintf(stderr, format, args);
|
||||
va_end(args);
|
||||
putc('\n', stderr);
|
||||
abort();
|
||||
}
|
||||
@@ -1,232 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1996. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __sgi
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* Grumble. The IRIX 6.3 and early IRIX 6.4 OpenGL headers
|
||||
support the video resize extension, but failed to define
|
||||
GLX_SGIX_video_resize. */
|
||||
#if 0
|
||||
#ifdef GLX_SYNC_FRAME_SGIX
|
||||
#define GLX_SGIX_video_resize 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
static int canVideoResize = -1;
|
||||
static int videoResizeChannel;
|
||||
#else
|
||||
static int canVideoResize = 0;
|
||||
#endif
|
||||
static int videoResizeInUse = 0;
|
||||
static int dx = -1, dy = -1, dw = -1, dh = -1;
|
||||
|
||||
/* XXX Note that IRIX 6.2, 6.3, and some 6.4 versions have a
|
||||
bug where programs seg-fault when they attempt video
|
||||
resizing from an indirect OpenGL context (either local or
|
||||
over a network). */
|
||||
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
|
||||
static volatile int errorCaught;
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
catchXSGIvcErrors(Display * dpy, XErrorEvent * event)
|
||||
{
|
||||
errorCaught = 1;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* CENTRY */
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutVideoResizeGet(GLenum param)
|
||||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (canVideoResize < 0) {
|
||||
canVideoResize = __glutIsSupportedByGLX("GLX_SGIX_video_resize");
|
||||
if (canVideoResize) {
|
||||
#if defined(__sgi) && __sgi
|
||||
/* This is a hack because IRIX 6.2, 6.3, and some 6.4
|
||||
versions were released with GLX_SGIX_video_resize
|
||||
being advertised by the X server though the video
|
||||
resize extension is not actually supported. We try to
|
||||
determine if the libGL.so we are using actually has a
|
||||
video resize entrypoint before we try to use the
|
||||
feature. */
|
||||
void (*func) (void);
|
||||
void *glxDso = dlopen("libGL.so", RTLD_LAZY);
|
||||
|
||||
func = (void (*)(void)) dlsym(glxDso, "glXQueryChannelDeltasSGIX");
|
||||
if (!func) {
|
||||
canVideoResize = 0;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
char *channelString;
|
||||
int (*handler) (Display *, XErrorEvent *);
|
||||
|
||||
channelString = getenv("GLUT_VIDEO_RESIZE_CHANNEL");
|
||||
videoResizeChannel = channelString ? atoi(channelString) : 0;
|
||||
|
||||
/* Work around another annoying problem with SGI's
|
||||
GLX_SGIX_video_resize implementation. Early IRIX
|
||||
6.4 OpenGL's advertise the extension and have the
|
||||
video resize API, but an XSGIvc X protocol errors
|
||||
result trying to use the API. Set up an error
|
||||
handler to intercept what would otherwise be a fatal
|
||||
error. If an error was recieved, do not report that
|
||||
video resize is possible. */
|
||||
handler = XSetErrorHandler(catchXSGIvcErrors);
|
||||
|
||||
errorCaught = 0;
|
||||
|
||||
#if defined(GLX_GLXEXT_PROTOTYPES)
|
||||
#endif
|
||||
|
||||
__glut_glXQueryChannelDeltasSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, &dx, &dy, &dw, &dh);
|
||||
|
||||
/* glXQueryChannelDeltasSGIX is an inherent X server
|
||||
round-trip so we know we will have gotten either the
|
||||
correct reply or and error by this time. */
|
||||
XSetErrorHandler(handler);
|
||||
|
||||
/* Still yet another work around. In IRIX 6.4 betas,
|
||||
glXQueryChannelDeltasSGIX will return as if it
|
||||
succeeded, but the values are filled with junk.
|
||||
Watch to make sure the delta variables really make
|
||||
sense. */
|
||||
if (errorCaught ||
|
||||
dx < 0 || dy < 0 || dw < 0 || dh < 0 ||
|
||||
dx > 2048 || dy > 2048 || dw > 2048 || dh > 2048) {
|
||||
canVideoResize = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* GLX_SGIX_video_resize */
|
||||
|
||||
switch (param) {
|
||||
case GLUT_VIDEO_RESIZE_POSSIBLE:
|
||||
return canVideoResize;
|
||||
case GLUT_VIDEO_RESIZE_IN_USE:
|
||||
return videoResizeInUse;
|
||||
case GLUT_VIDEO_RESIZE_X_DELTA:
|
||||
return dx;
|
||||
case GLUT_VIDEO_RESIZE_Y_DELTA:
|
||||
return dy;
|
||||
case GLUT_VIDEO_RESIZE_WIDTH_DELTA:
|
||||
return dw;
|
||||
case GLUT_VIDEO_RESIZE_HEIGHT_DELTA:
|
||||
return dh;
|
||||
case GLUT_VIDEO_RESIZE_X:
|
||||
case GLUT_VIDEO_RESIZE_Y:
|
||||
case GLUT_VIDEO_RESIZE_WIDTH:
|
||||
case GLUT_VIDEO_RESIZE_HEIGHT:
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (videoResizeInUse) {
|
||||
int x, y, width, height;
|
||||
|
||||
__glut_glXQueryChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, &x, &y, &width, &height);
|
||||
switch (param) {
|
||||
case GLUT_VIDEO_RESIZE_X:
|
||||
return x;
|
||||
case GLUT_VIDEO_RESIZE_Y:
|
||||
return y;
|
||||
case GLUT_VIDEO_RESIZE_WIDTH:
|
||||
return width;
|
||||
case GLUT_VIDEO_RESIZE_HEIGHT:
|
||||
return height;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
default:
|
||||
__glutWarning("invalid glutVideoResizeGet parameter: %d", param);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSetupVideoResizing(void)
|
||||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
|
||||
__glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, __glutCurrentWindow->win);
|
||||
videoResizeInUse = 1;
|
||||
} else
|
||||
#endif
|
||||
__glutFatalError("glutEstablishVideoResizing: video resizing not possible.\n");
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutStopVideoResizing(void)
|
||||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
|
||||
if (videoResizeInUse) {
|
||||
__glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, None);
|
||||
videoResizeInUse = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void GLUTAPIENTRY
|
||||
glutVideoResize(int x, int y, int width, int height)
|
||||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (videoResizeInUse) {
|
||||
#ifdef GLX_SYNC_SWAP_SGIX
|
||||
/* glXChannelRectSyncSGIX introduced in a patch to IRIX
|
||||
6.2; the original unpatched IRIX 6.2 behavior is always
|
||||
GLX_SYNC_SWAP_SGIX. */
|
||||
__glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, GLX_SYNC_SWAP_SGIX);
|
||||
#endif
|
||||
__glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, x, y, width, height);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void GLUTAPIENTRY
|
||||
glutVideoPan(int x, int y, int width, int height)
|
||||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (videoResizeInUse) {
|
||||
#ifdef GLX_SYNC_FRAME_SGIX
|
||||
/* glXChannelRectSyncSGIX introduced in a patch to IRIX
|
||||
6.2; the original unpatched IRIX 6.2 behavior is always
|
||||
GLX_SYNC_SWAP_SGIX. We just ignore that we cannot
|
||||
accomplish GLX_SYNC_FRAME_SGIX on IRIX unpatched 6.2;
|
||||
this means you'd need a glutSwapBuffers to actually
|
||||
realize the video resize. */
|
||||
__glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, GLX_SYNC_FRAME_SGIX);
|
||||
#endif
|
||||
__glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, x, y, width, height);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,29 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1996, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutWarpPointer(int x, int y)
|
||||
{
|
||||
// XWarpPointer(__glutDisplay, None, __glutCurrentWindow->win,
|
||||
// 0, 0, 0, 0, x, y);
|
||||
POINTL point;
|
||||
point.x = x;
|
||||
point.y = y;
|
||||
WinMapWindowPoints(__glutCurrentWindow->win,HWND_DESKTOP,&point,1);
|
||||
WinSetPointerPos(HWND_DESKTOP, point.x, point.y);
|
||||
|
||||
XFlush(__glutDisplay);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,126 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
/* CENTRY */
|
||||
void GLUTAPIENTRY
|
||||
glutSetWindowTitle(const char *title)
|
||||
{
|
||||
#if defined(__OS2PM__)
|
||||
__glutSetWindowText(__glutCurrentWindow->win, (char *)title);
|
||||
|
||||
#else
|
||||
XTextProperty textprop;
|
||||
|
||||
assert(!__glutCurrentWindow->parent);
|
||||
IGNORE_IN_GAME_MODE();
|
||||
textprop.value = (unsigned char *) title;
|
||||
textprop.encoding = XA_STRING;
|
||||
textprop.format = 8;
|
||||
textprop.nitems = strlen(title);
|
||||
XSetWMName(__glutDisplay,
|
||||
__glutCurrentWindow->win, &textprop);
|
||||
XFlush(__glutDisplay);
|
||||
#endif
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSetIconTitle(const char *title)
|
||||
{
|
||||
#if defined(__OS2PM__)
|
||||
//todo ?
|
||||
#else
|
||||
|
||||
XTextProperty textprop;
|
||||
|
||||
assert(!__glutCurrentWindow->parent);
|
||||
IGNORE_IN_GAME_MODE();
|
||||
textprop.value = (unsigned char *) title;
|
||||
textprop.encoding = XA_STRING;
|
||||
textprop.format = 8;
|
||||
textprop.nitems = strlen(title);
|
||||
XSetWMIconName(__glutDisplay,
|
||||
__glutCurrentWindow->win, &textprop);
|
||||
XFlush(__glutDisplay);
|
||||
#endif
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutPositionWindow(int x, int y)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
__glutCurrentWindow->desiredX = x;
|
||||
__glutCurrentWindow->desiredY = y;
|
||||
__glutCurrentWindow->desiredConfMask |= CWX | CWY;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutReshapeWindow(int w, int h)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
if (w <= 0 || h <= 0)
|
||||
__glutWarning("glutReshapeWindow: non-positive width or height not allowed");
|
||||
|
||||
__glutCurrentWindow->desiredWidth = w;
|
||||
__glutCurrentWindow->desiredHeight = h;
|
||||
__glutCurrentWindow->desiredConfMask |= CWWidth | CWHeight;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutPopWindow(void)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
__glutCurrentWindow->desiredStack = Above;
|
||||
__glutCurrentWindow->desiredConfMask |= CWStackMode;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutPushWindow(void)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
__glutCurrentWindow->desiredStack = Below;
|
||||
__glutCurrentWindow->desiredConfMask |= CWStackMode;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutIconifyWindow(void)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
assert(!__glutCurrentWindow->parent);
|
||||
__glutCurrentWindow->desiredMapState = IconicState;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutShowWindow(void)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
__glutCurrentWindow->desiredMapState = NormalState;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutHideWindow(void)
|
||||
{
|
||||
IGNORE_IN_GAME_MODE();
|
||||
__glutCurrentWindow->desiredMapState = WithdrawnState;
|
||||
__glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
|
||||
}
|
||||
|
||||
/* ENDCENTRY */
|
||||
@@ -1,32 +0,0 @@
|
||||
#ifndef __glutbitmap_h__
|
||||
#define __glutbitmap_h__
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#define GLUT_NO_LIB_PRAGMA /* Avoid auto library linking when building
|
||||
the GLUT library itself. */
|
||||
#include <GL/glut.h>
|
||||
|
||||
typedef struct {
|
||||
const GLsizei width;
|
||||
const GLsizei height;
|
||||
const GLfloat xorig;
|
||||
const GLfloat yorig;
|
||||
const GLfloat advance;
|
||||
const GLubyte *bitmap;
|
||||
} BitmapCharRec, *BitmapCharPtr;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const int num_chars;
|
||||
const int first;
|
||||
const BitmapCharRec * const *ch;
|
||||
} BitmapFontRec, *BitmapFontPtr;
|
||||
|
||||
typedef void *GLUTbitmapFont;
|
||||
|
||||
#endif /* __glutbitmap_h__ */
|
||||
@@ -1,36 +0,0 @@
|
||||
#ifndef __glutos2_h__
|
||||
#define __glutos2_h__
|
||||
|
||||
|
||||
/* Win32 "equivalent" cursors - eventually, the X glyphs should be
|
||||
converted to Win32 cursors -- then they will look the same */
|
||||
#define XC_arrow IDC_ARROW
|
||||
#define XC_top_left_arrow IDC_ARROW
|
||||
#define XC_hand1 IDC_SIZEALL
|
||||
#define XC_pirate IDC_NO
|
||||
#define XC_question_arrow IDC_HELP
|
||||
#define XC_exchange IDC_NO
|
||||
#define XC_spraycan IDC_SIZEALL
|
||||
#define XC_watch IDC_WAIT
|
||||
#define XC_xterm IDC_IBEAM
|
||||
#define XC_crosshair IDC_CROSS
|
||||
#define XC_sb_v_double_arrow IDC_SIZENS
|
||||
#define XC_sb_h_double_arrow IDC_SIZEWE
|
||||
#define XC_top_side IDC_UPARROW
|
||||
#define XC_bottom_side IDC_SIZENS
|
||||
#define XC_left_side IDC_SIZEWE
|
||||
#define XC_right_side IDC_SIZEWE
|
||||
#define XC_top_left_corner IDC_SIZENWSE
|
||||
#define XC_top_right_corner IDC_SIZENESW
|
||||
#define XC_bottom_right_corner IDC_SIZENWSE
|
||||
#define XC_bottom_left_corner IDC_SIZENESW
|
||||
|
||||
#define XA_STRING 0
|
||||
|
||||
/* Private routines from win32_util.c */
|
||||
extern int gettimeofday(struct timeval* tp, void* tzp);
|
||||
//extern void *__glutFont(void *font);
|
||||
extern int __glutGetTransparentPixel(Display *dpy, XVisualInfo *vinfo);
|
||||
extern void __glutAdjustCoords(Window parent, int *x, int *y, int *width, int *height);
|
||||
|
||||
#endif /* __glutos2_h__ */
|
||||
@@ -1,42 +0,0 @@
|
||||
#ifndef __glutstroke_h__
|
||||
#define __glutstroke_h__
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
#if defined(_WIN32)
|
||||
#pragma warning (disable:4244) /* disable bogus conversion warnings */
|
||||
#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
float x;
|
||||
float y;
|
||||
} CoordRec, *CoordPtr;
|
||||
|
||||
typedef struct {
|
||||
int num_coords;
|
||||
const CoordRec *coord;
|
||||
} StrokeRec, *StrokePtr;
|
||||
|
||||
typedef struct {
|
||||
int num_strokes;
|
||||
const StrokeRec *stroke;
|
||||
float center;
|
||||
float right;
|
||||
} StrokeCharRec, *StrokeCharPtr;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
int num_chars;
|
||||
const StrokeCharRec *ch;
|
||||
float top;
|
||||
float bottom;
|
||||
} StrokeFontRec, *StrokeFontPtr;
|
||||
|
||||
typedef void *GLUTstrokeFont;
|
||||
|
||||
#endif /* __glutstroke_h__ */
|
||||
@@ -1,59 +0,0 @@
|
||||
#ifndef __layerutil_h__
|
||||
#define __layerutil_h__
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1993, 1994. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
/* Based on XLayerUtil.h: Revision: 1.3 */
|
||||
|
||||
#ifdef __VMS
|
||||
#include <GL/vms_x_fix.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OS2__)
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xmd.h>
|
||||
#endif /* !_WIN32 */
|
||||
|
||||
/* Transparent type values */
|
||||
/* None 0 */
|
||||
#define TransparentPixel 1
|
||||
#define TransparentMask 2
|
||||
|
||||
/* layered visual info template flags */
|
||||
#define VisualLayerMask 0x200
|
||||
#define VisualTransparentType 0x400
|
||||
#define VisualTransparentValue 0x800
|
||||
#define VisualAllLayerMask 0xFFF
|
||||
|
||||
/* layered visual info structure */
|
||||
typedef struct _XLayerVisualInfo {
|
||||
XVisualInfo vinfo;
|
||||
long layer;
|
||||
long type;
|
||||
unsigned long value;
|
||||
} XLayerVisualInfo;
|
||||
|
||||
/* SERVER_OVERLAY_VISUALS property element */
|
||||
typedef struct _OverlayInfo {
|
||||
/* Avoid 64-bit portability problems by being careful to use
|
||||
longs due to the way XGetWindowProperty is specified. Note
|
||||
that these parameters are passed as CARD32s over X
|
||||
protocol. */
|
||||
long overlay_visual;
|
||||
long transparent_type;
|
||||
long value;
|
||||
long layer;
|
||||
} OverlayInfo;
|
||||
|
||||
extern int __glutGetTransparentPixel(Display *, XVisualInfo *);
|
||||
extern XLayerVisualInfo *__glutXGetLayerVisualInfo(Display *,
|
||||
long, XLayerVisualInfo *, int *);
|
||||
extern Status __glutXMatchLayerVisualInfo(Display *,
|
||||
int, int, int, int, XLayerVisualInfo *);
|
||||
|
||||
#endif /* __layerutil_h__ */
|
||||
@@ -1,94 +0,0 @@
|
||||
|
||||
;-----------------------------------------------------
|
||||
; def Module definition file for the DLL
|
||||
;-----------------------------------------------------
|
||||
|
||||
LIBRARY libGlut INITINSTANCE TERMINSTANCE
|
||||
PROTMODE
|
||||
DATA MULTIPLE NONSHARED READWRITE LOADONCALL
|
||||
CODE LOADONCALL
|
||||
EXPORTS ; Names of exported functions and data
|
||||
|
||||
;*********************************
|
||||
;MesaGLUT
|
||||
glutCommandFunc @3001
|
||||
glutCreateWindow @3002
|
||||
glutCreateSubWindow @3003
|
||||
glutDestroyWindow @3004
|
||||
glutDisplayFunc @3005
|
||||
glutEntryFunc @3006
|
||||
glutExtensionSupported @3007
|
||||
glutIdleFunc @3008
|
||||
glutInit @3009
|
||||
glutInitDisplayMode @3010
|
||||
glutInitWindowPosition @3011
|
||||
glutInitWindowSize @3012
|
||||
glutMainLoop @3013
|
||||
glutGet @3014
|
||||
glutGetColor @3015
|
||||
glutGetWindow @3016
|
||||
glutKeyboardFunc @3017
|
||||
glutMouseFunc @3018
|
||||
glutSpecialFunc @3019
|
||||
glutStrokeCharacter @3020
|
||||
glutSetColor @3021
|
||||
glutSetIconTitle @3022
|
||||
glutSetWindow @3023
|
||||
glutSetWindowTitle @3024
|
||||
|
||||
glutReshapeFunc @3025
|
||||
glutReshapeWindow @3026
|
||||
|
||||
|
||||
glutSwapBuffers @3027
|
||||
glutPostRedisplay @3028
|
||||
glutPositionWindow @3029
|
||||
glutVisibilityFunc @3030
|
||||
glutTimerFunc @3031
|
||||
glutMotionFunc @3032
|
||||
|
||||
glutCreateMenu @3033
|
||||
glutAttachMenu @3034
|
||||
glutDestroyMenu @3035
|
||||
glutAddMenuEntry @3036
|
||||
glutPassiveMotionFunc @3037
|
||||
|
||||
glutSolidCone @3038
|
||||
glutSolidCube @3039
|
||||
glutSolidDodecahedron @3040
|
||||
glutSolidOctahedron @3041
|
||||
glutSolidIcosahedron @3042
|
||||
glutSolidSphere @3043
|
||||
glutSolidTeapot @3044
|
||||
glutSolidTetrahedron @3045
|
||||
glutSolidTorus @3046
|
||||
|
||||
glutWireCone @3047
|
||||
glutWireCube @3048
|
||||
glutWireDodecahedron @3049
|
||||
glutWireIcosahedron @3050
|
||||
glutWireOctahedron @3051
|
||||
glutWireSphere @3052
|
||||
glutWireTetrahedron @3053
|
||||
glutWireTorus @3054
|
||||
glutWireTeapot @3055
|
||||
|
||||
;GL_GLEXT_PROTOTYPES
|
||||
glutBitmapCharacter @3101
|
||||
glutBitmap9By15 @3102
|
||||
glutBitmapHelvetica10 @3103
|
||||
glutBitmapHelvetica12 @3104
|
||||
glutBitmapHelvetica18 @3105
|
||||
glutBitmapTimesRoman24 @3106
|
||||
glutStrokeRoman @3107
|
||||
glutBitmap8By13 @3108
|
||||
|
||||
;Global constants
|
||||
; hab @12001
|
||||
; /* PM anchor block handle */
|
||||
; hpsCurrent @12002
|
||||
XHDC @12004
|
||||
XHWND @12005
|
||||
|
||||
|
||||
|
||||
@@ -1,145 +0,0 @@
|
||||
/* os2_glx.c */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include "gl/gl.h"
|
||||
#include "WarpGL.h"
|
||||
#include "GL/os2mesa.h"
|
||||
|
||||
#define POKA 0
|
||||
/* global current HDC */
|
||||
|
||||
XVisualInfo *wglDescribePixelFormat(int iPixelFormat);
|
||||
|
||||
extern HDC XHDC;
|
||||
extern HWND XHWND;
|
||||
//extern HPS hpsCurrent;
|
||||
extern HAB hab; /* PM anchor block handle */
|
||||
|
||||
GLXContext
|
||||
glXCreateContext(HPS hps, XVisualInfo * visinfo,
|
||||
GLXContext share, Bool direct)
|
||||
{
|
||||
/* KLUDGE: GLX really expects a display pointer to be passed
|
||||
in as the first parameter, but Win32 needs an HDC instead,
|
||||
so BE SURE that the global XHDC is set before calling this
|
||||
routine. */
|
||||
HGLRC context;
|
||||
|
||||
context = wglCreateContext(XHDC,hps,hab);
|
||||
|
||||
|
||||
/* Since direct rendering is implicit, the direct flag is
|
||||
ignored. */
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
glXGetConfig(XVisualInfo * visual, int attrib, int *value)
|
||||
{
|
||||
if (!visual)
|
||||
return GLX_BAD_VISUAL;
|
||||
|
||||
switch (attrib) {
|
||||
case GLX_USE_GL:
|
||||
if (visual->dwFlags & (PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW)) {
|
||||
/* XXX Brad's Matrix Millenium II has problems creating
|
||||
color index windows in 24-bit mode (lead to GDI crash)
|
||||
and 32-bit mode (lead to black window). The cColorBits
|
||||
filed of the PIXELFORMATDESCRIPTOR returned claims to
|
||||
have 24 and 32 bits respectively of color indices. 2^24
|
||||
and 2^32 are ridiculously huge writable colormaps.
|
||||
Assume that if we get back a color index
|
||||
PIXELFORMATDESCRIPTOR with 24 or more bits, the
|
||||
PIXELFORMATDESCRIPTOR doesn't really work and skip it.
|
||||
-mjk */
|
||||
if (visual->iPixelType == PFD_TYPE_COLORINDEX
|
||||
&& visual->cColorBits >= 24) {
|
||||
*value = 0;
|
||||
} else {
|
||||
*value = 1;
|
||||
}
|
||||
} else {
|
||||
*value = 0;
|
||||
}
|
||||
break;
|
||||
case GLX_BUFFER_SIZE:
|
||||
/* KLUDGE: if we're RGBA, return the number of bits/pixel,
|
||||
otherwise, return 8 (we guessed at 256 colors in CI
|
||||
mode). */
|
||||
if (visual->iPixelType == PFD_TYPE_RGBA)
|
||||
*value = visual->cColorBits;
|
||||
else
|
||||
*value = 8;
|
||||
break;
|
||||
case GLX_LEVEL:
|
||||
/* The bReserved flag of the pfd contains the
|
||||
overlay/underlay info. */
|
||||
*value = visual->bReserved;
|
||||
break;
|
||||
case GLX_RGBA:
|
||||
*value = visual->iPixelType == PFD_TYPE_RGBA;
|
||||
break;
|
||||
case GLX_DOUBLEBUFFER:
|
||||
*value = visual->dwFlags & PFD_DOUBLEBUFFER;
|
||||
break;
|
||||
case GLX_STEREO:
|
||||
*value = visual->dwFlags & PFD_STEREO;
|
||||
break;
|
||||
case GLX_AUX_BUFFERS:
|
||||
*value = visual->cAuxBuffers;
|
||||
break;
|
||||
case GLX_RED_SIZE:
|
||||
*value = visual->cRedBits;
|
||||
break;
|
||||
case GLX_GREEN_SIZE:
|
||||
*value = visual->cGreenBits;
|
||||
break;
|
||||
case GLX_BLUE_SIZE:
|
||||
*value = visual->cBlueBits;
|
||||
break;
|
||||
case GLX_ALPHA_SIZE:
|
||||
*value = visual->cAlphaBits;
|
||||
break;
|
||||
case GLX_DEPTH_SIZE:
|
||||
*value = visual->cDepthBits;
|
||||
break;
|
||||
case GLX_STENCIL_SIZE:
|
||||
*value = visual->cStencilBits;
|
||||
break;
|
||||
case GLX_ACCUM_RED_SIZE:
|
||||
*value = visual->cAccumRedBits;
|
||||
break;
|
||||
case GLX_ACCUM_GREEN_SIZE:
|
||||
*value = visual->cAccumGreenBits;
|
||||
break;
|
||||
case GLX_ACCUM_BLUE_SIZE:
|
||||
*value = visual->cAccumBlueBits;
|
||||
break;
|
||||
case GLX_ACCUM_ALPHA_SIZE:
|
||||
*value = visual->cAccumAlphaBits;
|
||||
break;
|
||||
#if POKA == 100
|
||||
#endif /* POKA == 100 */
|
||||
default:
|
||||
return GLX_BAD_ATTRIB;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
XVisualInfo * glXChooseVisual(int mode)
|
||||
{ int imode = 2;
|
||||
if(mode & GLUT_DOUBLE)
|
||||
imode = 1;
|
||||
return
|
||||
wglDescribePixelFormat(imode);
|
||||
}
|
||||
|
||||
|
||||
#if POKA
|
||||
#endif /* POKA */
|
||||
|
||||
@@ -1,532 +0,0 @@
|
||||
|
||||
/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
|
||||
/* Copyright (c) Nate Robins, 1997. */
|
||||
|
||||
/* This program is freely distributable without licensing fees
|
||||
and is provided without guarantee or warrantee expressed or
|
||||
implied. This program is -not- in the public domain. */
|
||||
|
||||
/* This file completely re-implements glut_menu.c and glut_menu2.c
|
||||
for Win32. Note that neither glut_menu.c nor glut_menu2.c are
|
||||
compiled into Win32 GLUT. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
void (GLUTCALLBACK *__glutMenuStatusFunc) (int, int, int);
|
||||
//GLUTmenu *__glutMappedMenu;
|
||||
//GLUTwindow *__glutMenuWindow;
|
||||
GLUTmenuItem *__glutItemSelected;
|
||||
unsigned __glutMenuButton;
|
||||
|
||||
static GLUTmenu **menuList = NULL;
|
||||
static int menuListSize = 0;
|
||||
static UINT uniqueMenuHandler = 1;
|
||||
|
||||
/* DEPRICATED, use glutMenuStatusFunc instead. */
|
||||
void GLUTAPIENTRY
|
||||
glutMenuStateFunc(GLUTmenuStateCB menuStateFunc)
|
||||
{
|
||||
__glutMenuStatusFunc = (GLUTmenuStatusCB) menuStateFunc;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutMenuStatusFunc(GLUTmenuStatusCB menuStatusFunc)
|
||||
{
|
||||
__glutMenuStatusFunc = menuStatusFunc;
|
||||
}
|
||||
|
||||
void
|
||||
__glutSetMenu(GLUTmenu * menu)
|
||||
{
|
||||
__glutCurrentMenu = menu;
|
||||
}
|
||||
|
||||
static void
|
||||
unmapMenu(GLUTmenu * menu)
|
||||
{
|
||||
if (menu->cascade) {
|
||||
unmapMenu(menu->cascade);
|
||||
menu->cascade = NULL;
|
||||
}
|
||||
menu->anchor = NULL;
|
||||
menu->highlighted = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
__glutFinishMenu(Window win, int x, int y)
|
||||
{
|
||||
|
||||
unmapMenu(__glutMappedMenu);
|
||||
|
||||
/* XXX Put in a GdiFlush just in case. Probably unnecessary. -mjk */
|
||||
// GdiFlush();
|
||||
|
||||
if (__glutMenuStatusFunc) {
|
||||
__glutSetWindow(__glutMenuWindow);
|
||||
__glutSetMenu(__glutMappedMenu);
|
||||
|
||||
/* Setting __glutMappedMenu to NULL permits operations that
|
||||
change menus or destroy the menu window again. */
|
||||
__glutMappedMenu = NULL;
|
||||
|
||||
__glutMenuStatusFunc(GLUT_MENU_NOT_IN_USE, x, y);
|
||||
}
|
||||
/* Setting __glutMappedMenu to NULL permits operations that
|
||||
change menus or destroy the menu window again. */
|
||||
__glutMappedMenu = NULL;
|
||||
|
||||
/* If an item is selected and it is not a submenu trigger,
|
||||
generate menu callback. */
|
||||
if (__glutItemSelected && !__glutItemSelected->isTrigger) {
|
||||
__glutSetWindow(__glutMenuWindow);
|
||||
/* When menu callback is triggered, current menu should be
|
||||
set to the callback menu. */
|
||||
__glutSetMenu(__glutItemSelected->menu);
|
||||
__glutItemSelected->menu->select(__glutItemSelected->value);
|
||||
}
|
||||
__glutMenuWindow = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
mapMenu(GLUTmenu * menu, int x, int y)
|
||||
{
|
||||
//todo
|
||||
// TrackPopupMenu((HMENU) menu->win, TPM_LEFTALIGN |
|
||||
// (__glutMenuButton == TPM_RIGHTBUTTON) ? TPM_RIGHTBUTTON : TPM_LEFTBUTTON,
|
||||
// x, y, 0, __glutCurrentWindow->win, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
__glutStartMenu(GLUTmenu * menu, GLUTwindow * window,
|
||||
int x, int y, int x_win, int y_win)
|
||||
{
|
||||
assert(__glutMappedMenu == NULL);
|
||||
__glutMappedMenu = menu;
|
||||
__glutMenuWindow = window;
|
||||
__glutItemSelected = NULL;
|
||||
if (__glutMenuStatusFunc) {
|
||||
__glutSetMenu(menu);
|
||||
__glutSetWindow(window);
|
||||
__glutMenuStatusFunc(GLUT_MENU_IN_USE, x_win, y_win);
|
||||
}
|
||||
mapMenu(menu, x, y);
|
||||
}
|
||||
|
||||
GLUTmenuItem *
|
||||
__glutGetUniqueMenuItem(GLUTmenu * menu, UINT unique)
|
||||
{
|
||||
GLUTmenuItem *item;
|
||||
int i;
|
||||
|
||||
i = menu->num;
|
||||
item = menu->list;
|
||||
while (item) {
|
||||
if (item->unique == unique) {
|
||||
return item;
|
||||
}
|
||||
if (item->isTrigger) {
|
||||
GLUTmenuItem *subitem;
|
||||
subitem = __glutGetUniqueMenuItem(menuList[item->value], unique);
|
||||
if (subitem) {
|
||||
return subitem;
|
||||
}
|
||||
}
|
||||
i--;
|
||||
item = item->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GLUTmenuItem *
|
||||
__glutGetMenuItem(GLUTmenu * menu, Window win, int *which)
|
||||
{
|
||||
GLUTmenuItem *item;
|
||||
int i;
|
||||
|
||||
i = menu->num;
|
||||
item = menu->list;
|
||||
while (item) {
|
||||
if (item->win == win) {
|
||||
*which = i;
|
||||
return item;
|
||||
}
|
||||
if (item->isTrigger) {
|
||||
GLUTmenuItem *subitem;
|
||||
|
||||
subitem = __glutGetMenuItem(menuList[item->value],
|
||||
win, which);
|
||||
if (subitem) {
|
||||
return subitem;
|
||||
}
|
||||
}
|
||||
i--;
|
||||
item = item->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GLUTmenu *
|
||||
__glutGetMenu(Window win)
|
||||
{
|
||||
GLUTmenu *menu;
|
||||
|
||||
menu = __glutMappedMenu;
|
||||
while (menu) {
|
||||
if (win == menu->win) {
|
||||
return menu;
|
||||
}
|
||||
menu = menu->cascade;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GLUTmenu *
|
||||
__glutGetMenuByNum(int menunum)
|
||||
{
|
||||
if (menunum < 1 || menunum > menuListSize) {
|
||||
return NULL;
|
||||
}
|
||||
return menuList[menunum - 1];
|
||||
}
|
||||
|
||||
static int
|
||||
getUnusedMenuSlot(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Look for allocated, unused slot. */
|
||||
for (i = 0; i < menuListSize; i++) {
|
||||
if (!menuList[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
/* Allocate a new slot. */
|
||||
menuListSize++;
|
||||
if (menuList) {
|
||||
menuList = (GLUTmenu **)
|
||||
realloc(menuList, menuListSize * sizeof(GLUTmenu *));
|
||||
} else {
|
||||
/* XXX Some realloc's do not correctly perform a malloc
|
||||
when asked to perform a realloc on a NULL pointer,
|
||||
though the ANSI C library spec requires this. */
|
||||
menuList = (GLUTmenu **) malloc(sizeof(GLUTmenu *));
|
||||
}
|
||||
if (!menuList) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
menuList[menuListSize - 1] = NULL;
|
||||
return menuListSize - 1;
|
||||
}
|
||||
|
||||
static void
|
||||
menuModificationError(void)
|
||||
{
|
||||
/* XXX Remove the warning after GLUT 3.0. */
|
||||
__glutWarning("The following is a new check for GLUT 3.0; update your code.");
|
||||
__glutFatalError("menu manipulation not allowed while menus in use.");
|
||||
}
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutCreateMenu(GLUTselectCB selectFunc)
|
||||
{
|
||||
GLUTmenu *menu;
|
||||
int menuid;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
menuid = getUnusedMenuSlot();
|
||||
menu = (GLUTmenu *) malloc(sizeof(GLUTmenu));
|
||||
if (!menu) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
menu->id = menuid;
|
||||
menu->num = 0;
|
||||
menu->submenus = 0;
|
||||
menu->select = selectFunc;
|
||||
menu->list = NULL;
|
||||
menu->cascade = NULL;
|
||||
menu->highlighted = NULL;
|
||||
menu->anchor = NULL;
|
||||
//todo
|
||||
// menu->win = (HWND) CreatePopupMenu();
|
||||
menuList[menuid] = menu;
|
||||
__glutSetMenu(menu);
|
||||
return menuid + 1;
|
||||
}
|
||||
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutDestroyMenu(int menunum)
|
||||
{
|
||||
GLUTmenu *menu = __glutGetMenuByNum(menunum);
|
||||
GLUTmenuItem *item, *next;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
assert(menu->id == menunum - 1);
|
||||
//todo DestroyMenu( (HMENU) menu->win);
|
||||
menuList[menunum - 1] = NULL;
|
||||
/* free all menu entries */
|
||||
item = menu->list;
|
||||
while (item) {
|
||||
assert(item->menu == menu);
|
||||
next = item->next;
|
||||
free(item->label);
|
||||
free(item);
|
||||
item = next;
|
||||
}
|
||||
if (__glutCurrentMenu == menu) {
|
||||
__glutCurrentMenu = NULL;
|
||||
}
|
||||
free(menu);
|
||||
}
|
||||
|
||||
int GLUTAPIENTRY
|
||||
glutGetMenu(void)
|
||||
{
|
||||
if (__glutCurrentMenu) {
|
||||
return __glutCurrentMenu->id + 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutSetMenu(int menuid)
|
||||
{
|
||||
GLUTmenu *menu;
|
||||
|
||||
if (menuid < 1 || menuid > menuListSize) {
|
||||
__glutWarning("glutSetMenu attempted on bogus menu.");
|
||||
return;
|
||||
}
|
||||
menu = menuList[menuid - 1];
|
||||
if (!menu) {
|
||||
__glutWarning("glutSetMenu attempted on bogus menu.");
|
||||
return;
|
||||
}
|
||||
__glutSetMenu(menu);
|
||||
}
|
||||
|
||||
static void
|
||||
setMenuItem(GLUTmenuItem * item, const char *label,
|
||||
int value, Bool isTrigger)
|
||||
{
|
||||
GLUTmenu *menu;
|
||||
|
||||
menu = item->menu;
|
||||
item->label = __glutStrdup(label);
|
||||
if (!item->label) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
item->isTrigger = isTrigger;
|
||||
item->len = (int) strlen(label);
|
||||
item->value = value;
|
||||
item->unique = uniqueMenuHandler++;
|
||||
//todo
|
||||
// if (isTrigger) {
|
||||
// AppendMenu((HMENU) menu->win, MF_POPUP, (UINT)item->win, label);
|
||||
// } else {
|
||||
// AppendMenu((HMENU) menu->win, MF_STRING, item->unique, label);
|
||||
// }
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutAddMenuEntry(const char *label, int value)
|
||||
{
|
||||
GLUTmenuItem *entry;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
entry = (GLUTmenuItem *) malloc(sizeof(GLUTmenuItem));
|
||||
if (!entry) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
entry->menu = __glutCurrentMenu;
|
||||
setMenuItem(entry, label, value, FALSE);
|
||||
__glutCurrentMenu->num++;
|
||||
entry->next = __glutCurrentMenu->list;
|
||||
__glutCurrentMenu->list = entry;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutAddSubMenu(const char *label, int menu)
|
||||
{
|
||||
GLUTmenuItem *submenu;
|
||||
GLUTmenu *popupmenu;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
submenu = (GLUTmenuItem *) malloc(sizeof(GLUTmenuItem));
|
||||
if (!submenu) {
|
||||
__glutFatalError("out of memory.");
|
||||
}
|
||||
__glutCurrentMenu->submenus++;
|
||||
submenu->menu = __glutCurrentMenu;
|
||||
popupmenu = __glutGetMenuByNum(menu);
|
||||
if (popupmenu) {
|
||||
submenu->win = popupmenu->win;
|
||||
}
|
||||
setMenuItem(submenu, label, /* base 0 */ menu - 1, TRUE);
|
||||
__glutCurrentMenu->num++;
|
||||
submenu->next = __glutCurrentMenu->list;
|
||||
__glutCurrentMenu->list = submenu;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutChangeToMenuEntry(int num, const char *label, int value)
|
||||
{
|
||||
GLUTmenuItem *item;
|
||||
int i;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
i = __glutCurrentMenu->num;
|
||||
item = __glutCurrentMenu->list;
|
||||
while (item) {
|
||||
if (i == num) {
|
||||
if (item->isTrigger) {
|
||||
/* If changing a submenu trigger to a menu entry, we
|
||||
need to account for submenus. */
|
||||
item->menu->submenus--;
|
||||
/* Nuke the Win32 menu. */
|
||||
//todo
|
||||
// DestroyMenu((HMENU) item->win);
|
||||
}
|
||||
free(item->label);
|
||||
|
||||
item->label = strdup(label);
|
||||
if (!item->label)
|
||||
__glutFatalError("out of memory");
|
||||
item->isTrigger = FALSE;
|
||||
item->len = (int) strlen(label);
|
||||
item->value = value;
|
||||
item->unique = uniqueMenuHandler++;
|
||||
//todo
|
||||
// ModifyMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1,
|
||||
// MF_BYPOSITION | MFT_STRING, item->unique, label);
|
||||
|
||||
return;
|
||||
}
|
||||
i--;
|
||||
item = item->next;
|
||||
}
|
||||
__glutWarning("Current menu has no %d item.", num);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutChangeToSubMenu(int num, const char *label, int menu)
|
||||
{
|
||||
GLUTmenu *popupmenu;
|
||||
GLUTmenuItem *item;
|
||||
int i;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
i = __glutCurrentMenu->num;
|
||||
item = __glutCurrentMenu->list;
|
||||
while (item) {
|
||||
if (i == num) {
|
||||
if (!item->isTrigger) {
|
||||
/* If changing a menu entry to as submenu trigger, we
|
||||
need to account for submenus. */
|
||||
item->menu->submenus++;
|
||||
//todo
|
||||
// item->win = (HWND) CreatePopupMenu();
|
||||
}
|
||||
free(item->label);
|
||||
|
||||
item->label = strdup(label);
|
||||
if (!item->label)
|
||||
__glutFatalError("out of memory");
|
||||
item->isTrigger = TRUE;
|
||||
item->len = (int) strlen(label);
|
||||
item->value = menu - 1;
|
||||
item->unique = uniqueMenuHandler++;
|
||||
popupmenu = __glutGetMenuByNum(menu);
|
||||
if (popupmenu)
|
||||
item->win = popupmenu->win;
|
||||
//todo
|
||||
// ModifyMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1,
|
||||
// MF_BYPOSITION | MF_POPUP, (UINT) item->win, label);
|
||||
return;
|
||||
}
|
||||
i--;
|
||||
item = item->next;
|
||||
}
|
||||
__glutWarning("Current menu has no %d item.", num);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutRemoveMenuItem(int num)
|
||||
{
|
||||
GLUTmenuItem *item, **prev;
|
||||
int i;
|
||||
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
i = __glutCurrentMenu->num;
|
||||
prev = &__glutCurrentMenu->list;
|
||||
item = __glutCurrentMenu->list;
|
||||
while (item) {
|
||||
if (i == num) {
|
||||
/* Found the menu item in list to remove. */
|
||||
__glutCurrentMenu->num--;
|
||||
|
||||
/* Patch up menu's item list. */
|
||||
*prev = item->next;
|
||||
//todo
|
||||
// RemoveMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1, MF_BYPOSITION);
|
||||
|
||||
free(item->label);
|
||||
free(item);
|
||||
return;
|
||||
}
|
||||
i--;
|
||||
prev = &item->next;
|
||||
item = item->next;
|
||||
}
|
||||
__glutWarning("Current menu has no %d item.", num);
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutAttachMenu(int button)
|
||||
{
|
||||
if (__glutCurrentWindow == __glutGameModeWindow) {
|
||||
__glutWarning("cannot attach menus in game mode.");
|
||||
return;
|
||||
}
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
if (__glutCurrentWindow->menu[button] < 1) {
|
||||
__glutCurrentWindow->buttonUses++;
|
||||
}
|
||||
__glutCurrentWindow->menu[button] = __glutCurrentMenu->id + 1;
|
||||
}
|
||||
|
||||
void GLUTAPIENTRY
|
||||
glutDetachMenu(int button)
|
||||
{
|
||||
if (__glutMappedMenu) {
|
||||
menuModificationError();
|
||||
}
|
||||
if (__glutCurrentWindow->menu[button] > 0) {
|
||||
__glutCurrentWindow->buttonUses--;
|
||||
__glutCurrentWindow->menu[button] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Reference in New Issue
Block a user