diff src/w32xfns.c @ 13434:53ba95a88cf2

Initial revision
author Geoff Voelker <voelker@cs.washington.edu>
date Tue, 07 Nov 1995 07:52:28 +0000
parents
children 808d4570cb4b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/w32xfns.c	Tue Nov 07 07:52:28 1995 +0000
@@ -0,0 +1,293 @@
+/* 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, 675 Mass Ave, Cambridge, MA 02139, 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);
+}
+
+/*
+ *    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);
+}
+
+/* The semantics of the use of using_x_p is really using_a_window_system.  */
+int
+using_x_p (void)
+{
+  return 1;
+}
+
+/* x_sync is a no-op on Win32.  */
+void
+x_sync (f)
+     void *f;
+{
+}
+