xsend.c

来自「speech signal process tools」· C语言 代码 · 共 1,229 行 · 第 1/3 页

C
1,229
字号
				 * registered. */   Window          commWindow;	/* X identifier for comm. window of				 * application.  */{   char            id[30];   char           *newProp;   int             idLength, newBytes;   sprintf(id, "%x ", (unsigned int) commWindow);   idLength = strlen(id);   newBytes = idLength + strlen(name) + 1;   newProp = (char *) malloc((unsigned) (regPtr->propLength + newBytes));   strcpy(newProp, id);   strcpy(newProp + idLength, name);   if (regPtr->propLength > 0) {      memcpy((void *) (newProp + newBytes), (void *) regPtr->property,	     regPtr->propLength);      if (regPtr->allocedByX) {	 XFree(regPtr->property);      } else {	 free(regPtr->property);      }   }   regPtr->modified = 1;   regPtr->propLength += newBytes;   regPtr->property = newProp;   regPtr->allocedByX = 0;}static voidRegClose(regPtr)   NameRegistry   *regPtr;	/* Pointer to a registry opened with a				 * previous call to RegOpen. */{   if (regPtr->modified) {      if (!regPtr->locked && !debug_level) {	 fprintf(stderr,		 "The name registry was modified without being locked!");	 return;      }      XChangeProperty(regPtr->display,		      RootWindow(regPtr->display, 0),		      registryProperty, XA_STRING, 8,		      PropModeReplace, (unsigned char *) regPtr->property,		      (int) regPtr->propLength);   }   if (regPtr->locked) {      XUngrabServer(regPtr->display);   }   XFlush(regPtr->display);   if (regPtr->propLength > 0) {      if (regPtr->allocedByX) {	 XFree(regPtr->property);      } else {	 free(regPtr->property);      }   }   free((char *) regPtr);}static intSplitList(list, argc, argv)   char           *list;   int            *argc;   char         ***argv;{   char           *p, *s, *strtok(), *strdup();   *argc = 0;   if (!list)      return 0;   *argv = (char **) malloc(sizeof(char *));   p = list;   while (s = strtok(p, "\0")) {      p = NULL;      if (debug_level)	 fprintf(stderr, "Split: %s\n", s);      *argv = (char **) realloc(*argv, sizeof(char *) + *argc);      (*argv)[*argc] = strdup(s);      *argc += 1;   }   return 1;}static intValidateName(display, name, window)   Display        *display;   char           *name;   Window          window;{   int             argc, result, actualFormat, i;   unsigned long   length, bytesAfter;   Atom            actualType;   char           *property;   char          **argv;   int             (*defaultHandler) () = NULL;   spsassert(display, "ValidateName: display is NULL");   spsassert(name, "ValidateName: name is NULL");   spsassert(window, "ValidateName: window is zero");   /*    * Be sure window matches Tk 4.0 commWindow specs.  This version does not    * allow pre 4.0 windows to work.    */   if (debug_level)      fprintf(stderr, "ValidateName display: %x, window: %x, name: %s\n",	      display, window, name);   property = NULL;   defaultHandler = XSetErrorHandler(XSend_Handler);   result = XGetWindowProperty(display, window,			       appNameProperty, 0, MAX_PROP_WORDS,			       False, XA_STRING, &actualType, &actualFormat,			&length, &bytesAfter, (unsigned char **) &property);   (void) XSetErrorHandler(defaultHandler);   if (debug_level)      fprintf(stderr, "ValidateName: Got property from X\n");   if ((result == Success) && (actualFormat == 8)       && (actualType == XA_STRING)) {      result = 0;      if (debug_level)	 print_data(property, length);      if (SplitList(property, &argc, &argv) == 1) {	 for (i = 0; i < argc; i++) {	    if (strcmp(argv[i], name) == 0) {	       result = 1;	       break;	    }	 }	 for (i = 0; i < argc; i++)	    free(argv[i]);	 free((char *) argv);      }   } else {      result = 0;   }   if (property != NULL) {      XFree(property);   }   return result;}static voidAppendProp(display, window, property, data, length)   Display        *display;   Window          window;   Atom            property;   char           *data;   int             length;{   int             (*defaultHandler) () = NULL;   if (debug_level) {      fprintf(stderr, "AppendProp:\n");      fprintf(stderr, "display: %x, win: %x, len: %d\n",	      display, window, length);   }   defaultHandler = XSetErrorHandler(XSend_Handler);   XChangeProperty(display, window, property, XA_STRING, 8,		   PropModeAppend, data, length);   XSync(display, FALSE);   (void) XSetErrorHandler(defaultHandler);}static voidprint_prop(regPtr)   NameRegistry   *regPtr;	/* Pointer to a registry opened with a				 * previous call to RegOpen. */{   char           *p, *entry;   Window          commWindow;   commWindow = None;   for (p = regPtr->property; (p - regPtr->property) < regPtr->propLength;) {      entry = p;      fprintf(stderr, "%s\n", entry);      while ((*p != 0) && (!isspace(UCHAR(*p)))) {	 p++;      }      while (*p != 0) {	 p++;      }      p++;   }   return;}static voidprint_data(ptr, len)   char           *ptr;   int             len;{   int             i;   fprintf(stderr, "print_data: len: %d\n", len);   for (i = 0; i < len; i++)      if (ptr[i] == '\0')	 fprintf(stderr, "<null>");      else	 fputc(ptr[i], stderr);   fprintf(stderr, ":end:\n");}static intXSend_Handler(display, error)   Display        *display;   XErrorEvent    *error;{   if (debug_level) {      char            msg[80];      fprintf(stderr, "XSend_Handler called\n");      XGetErrorText(display, error->error_code, msg, 80);      fprintf(stderr, "Error code %s\n", msg);   }   XSend_Error = 1;   return 0;}static intXSend_Update_Handler(display, error)   Display        *display;   XErrorEvent    *error;{   fprintf(stderr, "Unexpected X error in UpdateCommWindow, ignored.\n");   fprintf(stderr, "Cound not update Comm window property\n");   if (debug_level) {      char            msg[80];      XGetErrorText(display, error->error_code, msg, 80);      fprintf(stderr, "Error code %s\n", msg);   }   return 0;}static voidUsleep(usecs)   unsigned int    usecs;{   struct timeval  tval;   tval.tv_sec = usecs / 1000000;   tval.tv_usec = usecs % 1000000;   select(0, NULL, NULL, NULL, &tval);}intSendXwavesNoReply(display_name, dest, sxarg, msg)   char           *display_name;   char           *dest;   Sxptr          *sxarg;   char           *msg;{   int             res;   Sxptr          *sxptr;   if (!msg || (!sxarg && !dest))	/* bad args */      return 0;   if (!sxarg) {      if ((sxptr = OpenXwaves(display_name, dest, SendXwaves_defname)) == NULL)	 return 0;   } else      sxptr = sxarg;   res = Send_X_Msg(sxptr->display, sxptr->dest_name, sxptr->dest_window,		    IMMEDIATE_RESPONSE, msg, strlen(msg));   if (!sxarg)      CloseXwaves(sxptr);   return res;}char           *SendXwavesReply(display_name, dest, sxarg, msg, timeout)   char           *display_name;   char           *dest;   Sxptr          *sxarg;   char           *msg;   unsigned int    timeout;	/* in ms. */{   int             res;   XEvent          event;   char           *result = NULL;   int             serial, loop_count = 0;   Sxptr          *sxptr;   if (!msg || (!sxarg && !dest))	/* bad args */      return NULL;   if (!sxarg) {      if ((sxptr = OpenXwaves(display_name, dest, SendXwaves_defname)) == NULL)	 return NULL;   } else      sxptr = sxarg;   if( !ValidateName(sxptr->display, sxptr->dest_name, sxptr->dest_window) )      return NULL;   XSelectInput(sxptr->display, sxptr->my_window, PropertyChangeMask);   res = Send_X_Msg(sxptr->display, sxptr->dest_name, sxptr->dest_window,		    INTERLOCK_DELAY_RESPONSE, msg, strlen(msg));   if (!res) {      XSelectInput(sxptr->display, sxptr->my_window, NoEventMask);      if (sxarg)	 CloseXwaves(sxptr);      return NULL;   }   while (1) {      if (XCheckMaskEvent(sxptr->display, PropertyChangeMask, &event)	  != False) {	 if (event.type == PropertyNotify &&	     event.xproperty.window == sxptr->my_window) {	    result = Read_X_Reply(sxptr->display, sxptr->my_window,				  &event, SendSerial);	    if (result)	       break;	 }      }      Usleep((unsigned) 1000);      if (loop_count++ > timeout)	 break;   }   XSelectInput(sxptr->display, sxptr->my_window, NoEventMask);   if (!sxarg)      CloseXwaves(sxptr);   return result;}Sxptr          *OpenXwaves(display_name, dest, myname)   char           *display_name;   char           *dest;   char           *myname;{   Sxptr          *sxptr = (Sxptr *) malloc(sizeof(Sxptr));   int             screen_num;   char           *strdup();   if (!dest || !sxptr) {      return NULL;   }   if (!myname)      myname = SendXwaves_defname;   if ((sxptr->display = XOpenDisplay(display_name)) == NULL) {      fprintf(stderr, "%s: Cannot connect to X server %s\n",	      myname, XDisplayName(display_name));      return NULL;   }   screen_num = DefaultScreen(sxptr->display);   sxptr->my_window = XCreateSimpleWindow(sxptr->display,				     RootWindow(sxptr->display, screen_num),					  0, 0, 1, 1, 1,				     BlackPixel(sxptr->display, screen_num),				    WhitePixel(sxptr->display, screen_num));   sxptr->my_name = Setup_X_Comm(myname, sxptr->display, sxptr->my_window);   if (!sxptr->my_name) {      free(sxptr);      return NULL;   }   sxptr->my_name = strdup(sxptr->my_name);   sxptr->dest_window = Get_X_Comm_Win(sxptr->display, dest);   if (!sxptr->dest_window) {      free(sxptr->my_name);      free(sxptr);      return NULL;   }   sxptr->dest_name = strdup(dest);   return sxptr;}voidCloseXwaves(sxptr)   Sxptr          *sxptr;{   if (sxptr) {      Close_X_Comm(sxptr->display, sxptr->my_name);      XCloseDisplay(sxptr->display);      free(sxptr->dest_name);      free(sxptr->my_name);      free(sxptr);   }}char           *StripReturn(msg)   char           *msg;{   char           *ptr = NULL;   if (msg) {      ptr = msg;      if (!strncmp("returned", msg, 8))	 ptr += 9;   }   return ptr;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?