Mercurial > emacs
view src/w32xfns.c @ 14570:ca1ee2b8394e
(hanoi): Don't show line and column numbers.
Compute height and width of the window in the correct way,
give the correct error message if the window is too small.
Make rings only with numerical characters.
Set default number of rings to 7 (was 3 before).
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Fri, 16 Feb 1996 00:12:27 +0000 |
parents | 61fc696a0c6a |
children | c1494aa589e8 |
line wrap: on
line source
/* Functions taken directly from X sources Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <signal.h> #include <config.h> #include <stdio.h> #include "lisp.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 hEvent = NULL; void init_crit () { InitializeCriticalSection (&critsect); keyboard_handle = hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); } void enter_crit () { EnterCriticalSection (&critsect); } void leave_crit () { LeaveCriticalSection (&critsect); } void delete_crit () { DeleteCriticalSection (&critsect); if (hEvent) { CloseHandle (hEvent); hEvent = NULL; } } typedef struct int_msg { Win32Msg w32msg; struct int_msg *lpNext; } int_msg; int_msg *lpHead = NULL; int_msg *lpTail = NULL; int nQueue = 0; BOOL get_next_msg (lpmsg, bWait) Win32Msg * lpmsg; BOOL bWait; { BOOL bRet = FALSE; enter_crit (); /* The while loop takes care of multiple sets */ while (!nQueue && bWait) { leave_crit (); WaitForSingleObject (hEvent, INFINITE); enter_crit (); } if (nQueue) { bcopy (&(lpHead->w32msg), lpmsg, sizeof (Win32Msg)); { int_msg * lpCur = lpHead; lpHead = lpHead->lpNext; myfree (lpCur); } nQueue--; bRet = TRUE; } leave_crit (); return (bRet); } BOOL post_msg (lpmsg) Win32Msg * lpmsg; { int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); if (!lpNew) return (FALSE); bcopy (lpmsg, &(lpNew->w32msg), sizeof (Win32Msg)); lpNew->lpNext = NULL; enter_crit (); if (nQueue++) { lpTail->lpNext = lpNew; } else { lpHead = lpNew; SetEvent (hEvent); } lpTail = lpNew; leave_crit (); return (TRUE); } BOOL prepend_msg (Win32Msg *lpmsg) { int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); if (!lpNew) return (FALSE); bcopy (lpmsg, &(lpNew->w32msg), sizeof (Win32Msg)); enter_crit (); nQueue++; lpNew->lpNext = lpHead; lpHead = lpNew; leave_crit (); return (TRUE); } /* * 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 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; /* RETURN */ { 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 = 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 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); } /* We can use mouse menus when we wish. */ int have_menus_p (void) { return 1; } /* x_sync is a no-op on Win32. */ void x_sync (f) void *f; { }