#include <config.h>
#include <signal.h>
#include <stdio.h>
#include "lisp.h"
#include "keyboard.h"
#include "frame.h"
#include "charset.h"
#include "fontset.h"
#include "blockinput.h"
#include "w32term.h"
#include "windowsx.h"
#define myalloc(cb) GlobalAllocPtr (GPTR, cb)
#define myfree(lp) GlobalFreePtr (lp)
CRITICAL_SECTION critsect;
extern HANDLE keyboard_handle;
HANDLE input_available = NULL;
HANDLE interrupt_handle = NULL;
void
init_crit ()
{
InitializeCriticalSection (&critsect);
keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
interrupt_handle = CreateEvent (NULL, TRUE, FALSE, NULL);
}
void
delete_crit ()
{
DeleteCriticalSection (&critsect);
if (input_available)
{
CloseHandle (input_available);
input_available = NULL;
}
if (interrupt_handle)
{
CloseHandle (interrupt_handle);
interrupt_handle = NULL;
}
}
void
signal_quit ()
{
PulseEvent (interrupt_handle);
}
void
select_palette (FRAME_PTR f, HDC hdc)
{
struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f);
if (!display_info->has_palette)
return;
if (display_info->palette == 0)
return;
if (!NILP (Vw32_enable_palette))
f->output_data.w32->old_palette =
SelectPalette (hdc, display_info->palette, FALSE);
else
f->output_data.w32->old_palette = NULL;
if (RealizePalette (hdc))
{
Lisp_Object frame, framelist;
FOR_EACH_FRAME (framelist, frame)
{
SET_FRAME_GARBAGED (XFRAME (frame));
}
}
}
void
deselect_palette (FRAME_PTR f, HDC hdc)
{
if (f->output_data.w32->old_palette)
SelectPalette (hdc, f->output_data.w32->old_palette, FALSE);
}
HDC
get_frame_dc (FRAME_PTR f)
{
HDC hdc;
if (f->output_method != output_w32)
abort ();
enter_crit ();
hdc = GetDC (f->output_data.w32->window_desc);
if (hdc)
select_palette (f, hdc);
return hdc;
}
int
release_frame_dc (FRAME_PTR f, HDC hdc)
{
int ret;
deselect_palette (f, hdc);
ret = ReleaseDC (f->output_data.w32->window_desc, hdc);
leave_crit ();
return ret;
}
typedef struct int_msg
{
W32Msg w32msg;
struct int_msg *lpNext;
} int_msg;
int_msg *lpHead = NULL;
int_msg *lpTail = NULL;
int nQueue = 0;
BOOL
get_next_msg (lpmsg, bWait)
W32Msg * lpmsg;
BOOL bWait;
{
BOOL bRet = FALSE;
enter_crit ();
while (!nQueue && bWait)
{
leave_crit ();
WaitForSingleObject (input_available, INFINITE);
enter_crit ();
}
if (nQueue)
{
bcopy (&(lpHead->w32msg), lpmsg, sizeof (W32Msg));
{
int_msg * lpCur = lpHead;
lpHead = lpHead->lpNext;
myfree (lpCur);
}
nQueue--;
bRet = TRUE;
}
if (nQueue == 0)
ResetEvent (input_available);
leave_crit ();
return (bRet);
}
BOOL
post_msg (lpmsg)
W32Msg * lpmsg;
{
int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
if (!lpNew)
return (FALSE);
bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
lpNew->lpNext = NULL;
enter_crit ();
if (nQueue++)
{
lpTail->lpNext = lpNew;
}
else
{
lpHead = lpNew;
}
lpTail = lpNew;
SetEvent (input_available);
leave_crit ();
return (TRUE);
}
BOOL
prepend_msg (W32Msg *lpmsg)
{
int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
if (!lpNew)
return (FALSE);
bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
enter_crit ();
nQueue++;
lpNew->lpNext = lpHead;
lpHead = lpNew;
leave_crit ();
return (TRUE);
}
void
drain_message_queue ()
{
MSG msg;
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
static int
read_integer (string, NextString)
register 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 (string, x, y, width, height)
char *string;
int *x, *y;
unsigned int *width, *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++;
strind = (char *)string;
if (*strind != '+' && *strind != '-' && *strind != 'x')
{
tempWidth = read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
mask |= WidthValue;
}
if (*strind == 'x' || *strind == 'X')
{
strind++;
tempHeight = read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
mask |= HeightValue;
}
if ((*strind == '+') || (*strind == '-'))
{
if (*strind == '-')
{
strind++;
tempX = -read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
mask |= XNegative;
}
else
{
strind++;
tempX = read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
}
mask |= XValue;
if ((*strind == '+') || (*strind == '-'))
{
if (*strind == '-')
{
strind++;
tempY = -read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
mask |= YNegative;
}
else
{
strind++;
tempY = read_integer (strind, &nextCharacter);
if (strind == nextCharacter)
return (0);
strind = nextCharacter;
}
mask |= YValue;
}
}
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);
}
void
x_sync (f)
void *f;
{
}