⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x11term.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	register int numchars;{  /* Number of keyboard chars we have produced so far.  */  int count = 0;  int nbytes,rows,cols;  char mapping_buf[20];  BLOCK_INPUT_DECLARE ();  XEvent event;  /* Must be static since data is saved between calls.  */  static XComposeStatus status;  KeySym keysym;  BLOCK_INPUT ();#ifdef FIOSNBIO  /* If available, Xlib uses FIOSNBIO to make the socket     non-blocking, and then looks for EWOULDBLOCK.  If O_NDELAY is set, FIOSNBIO is     ignored, and instead of signalling EWOULDBLOCK, a read returns     0, which Xlib interprets as equivalent to EPIPE. */  fcntl (fileno (stdin), F_SETFL, 0);#endif#ifndef HAVE_SELECT  if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY))    {      extern int read_alarm_should_throw;      read_alarm_should_throw = 1;      XPeekEvent (XXdisplay,&event);      read_alarm_should_throw = 0;    }#endif  while (XPending (XXdisplay)) {    XNextEvent (XXdisplay,&event);    event.type &= 0177;		/* Mask out XSendEvent indication */    switch (event.type) {    default:      break;    case MappingNotify:      XRefreshKeyboardMapping(&event.xmapping);      break;    case MapNotify:      WindowMapped = 1;      break;    case UnmapNotify:      WindowMapped = 0;      break;			    case ConfigureNotify:      if (abs(pixelheight-event.xconfigure.height) <	  XXfonth &&	  abs(pixelwidth-event.xconfigure.width) <	  XXfontw)	break;      configure_pending = 1;      rows = (event.xconfigure.height-2*XXInternalBorder)/	XXfonth;      cols = (event.xconfigure.width-2*XXInternalBorder)/	XXfontw;      pixelwidth = cols*XXfontw+2*XXInternalBorder;      pixelheight = rows*XXfonth+2*XXInternalBorder;      break;    case Expose:      if (configure_pending) {	int width, height;	if (event.xexpose.count)	  break;	/* This is absolutely, amazingly gross.	 * However, without it, emacs will core	 * dump if the window gets too small.  And	 * uwm is too brain-damaged to handle	 * large minimum size windows. */	width = (pixelwidth-2*XXInternalBorder)/XXfontw;	height = (pixelheight-2*XXInternalBorder)/XXfonth;	if (width > 11 && height > 4)		change_screen_size (height, width, 0);	dumprectangle (0,0,pixelheight,pixelwidth);	configure_pending = 0;	break;      }      dumprectangle (event.xexpose.y-XXInternalBorder,		     event.xexpose.x-XXInternalBorder,		     event.xexpose.height,		     event.xexpose.width);      break;    case GraphicsExpose:      dumprectangle (event.xgraphicsexpose.y-XXInternalBorder,		     event.xgraphicsexpose.x-XXInternalBorder,		     event.xgraphicsexpose.height,		     event.xgraphicsexpose.width);      break;    case NoExpose:      break;    case FocusIn:      x_focus_flag = 1;    case EnterNotify:      if (event.type == FocusIn || (!x_focus_flag && event.xcrossing.focus))	{	  CursorToggle ();	  CursorOutline = 0;	  CursorToggle ();	}      break;    case FocusOut:      x_focus_flag = 0;    case LeaveNotify:      if (event.type == FocusOut || (!x_focus_flag && event.xcrossing.focus))	{	  CursorToggle ();	  CursorOutline = 1;	  CursorToggle ();	}      break;			    case KeyPress:      nbytes = XLookupString (&event.xkey,			      mapping_buf, 20, &keysym,			      0);#ifndef AIX      /* Someday this will be unnecessary as we will	 be able to use XRebindKeysym so XLookupString	 will have already given us the string we want. */      if (IsFunctionKey(keysym) ||	  IsMiscFunctionKey(keysym)) {	strcpy(mapping_buf,"[");	strcat(mapping_buf,stringFuncVal(keysym));#ifdef sun	strcat(mapping_buf,"z");#else	strcat(mapping_buf,"~");#endif /* sun */	nbytes = strlen(mapping_buf);      }      else {	switch (keysym) {	case XK_Left:	  strcpy(mapping_buf,"\002");	  nbytes = 1;	  break;	case XK_Right:	  strcpy(mapping_buf,"\006");	  nbytes = 1;	  break;	case XK_Up:	  strcpy(mapping_buf,"\020");	  nbytes = 1;	  break;	case XK_Down:	  strcpy(mapping_buf,"\016");	  nbytes = 1;	  break;	}      }#endif  /* not AIX */      if (nbytes) {	if ((nbytes == 1) && (event.xkey.state & Mod1Mask))	  *mapping_buf |= METABIT;	if ((nbytes == 1) && (event.xkey.state & ControlMask))	  *mapping_buf &= 0x9F;		/* mask off bits 1 and 2 */	if (numchars-nbytes > 0) {	  bcopy (mapping_buf, bufp, nbytes);	  bufp += nbytes;	  count += nbytes;	  numchars -= nbytes;	}      }      break;    case ButtonPress:    case ButtonRelease:      *bufp++ = (char) 'X' & 037;      ++count;      --numchars;      *bufp++ = (char) '@' & 037;      ++count;      --numchars;      if (XXm_queue_num == XMOUSEBUFSIZE)	break;      XXm_queue[XXm_queue_in] = (XEvent *) malloc (sizeof(XEvent));      *XXm_queue[XXm_queue_in] = event;      XXm_queue_num++;      XXm_queue_in = (XXm_queue_in + 1) % XMOUSEBUFSIZE;      break;    }  }  if (CursorExists)    xfixscreen ();  UNBLOCK_INPUT ();  return count;}/* Exit gracefully from gnuemacs, doing an autosave and giving a status. */XExitGracefully (){	XCleanUp();	exit (70);}XIgnoreError (){	return 0;}xfixscreen (){	static int server_ping_timer;	BLOCK_INPUT_DECLARE ();	if (server_ping_timer > 0)	  server_ping_timer--;	else	  {	    server_ping_timer = 100;	    /* Yes, this is really what I mean -- Check to see if we've	     * lost our connection */	    BLOCK_INPUT ();	    XSetErrorHandler(0);	    XSetIOErrorHandler(0);	    XNoOp (XXdisplay);	    XFlush (XXdisplay);	    XSetErrorHandler(handler);	    XSetIOErrorHandler(handler);	    if (!InUpdate && !CursorExists)		    CursorToggle ();	    UNBLOCK_INPUT ();	  }}	/* ------------------------------------------------------------ */static int  reversevideo;static intXT_GetDefaults (class)    char *class;{  register char  *option;  register struct _xdeftab *entry;  /*   * Walk the table reading in the resources.  Instance names supersede   * class names.   */  for (entry = xDefaultsValueTable; entry->iname; entry++)    {#ifdef XBACKWARDS      if (!(option = XGetDefault (XXdisplay, entry->iname, class)))	if (!(option = XGetDefault (XXdisplay, entry->iname, CLASS)))	  if (!(option = XGetDefault (XXdisplay, entry->cname, class)))	    option = XGetDefault (XXdisplay, entry->cname, CLASS);#else      if (!(option = XGetDefault (XXdisplay, class, entry->iname)))	if (!(option = XGetDefault (XXdisplay, CLASS, entry->iname)))	  if (!(option = XGetDefault (XXdisplay, class, entry->cname)))	    option = XGetDefault (XXdisplay, CLASS, entry->cname);#endif      if (option && entry->varp)	*entry->varp = option;    }  /*   * Now set global variables that aren't character strings; yes it would   * be nice to do this automatically as part of the scanning step, but this   * is less likely to screw up.  The real answer is to use the resource   * manager.   */  if (temp_reverseVideo)    {      if (strcmp (temp_reverseVideo, "on") == 0)	reversevideo = 1;      else if (strcmp (temp_reverseVideo, "off") == 0)	reversevideo = 0;    }  if (temp_borderWidth)     XXborder = atoi (temp_borderWidth);  if (temp_internalBorder)    XXInternalBorder = atoi (temp_internalBorder);  if (temp_useBitmap)    {      if (strcmp (temp_useBitmap, "on") == 0)	XXicon_usebitmap = 1;      else if (strcmp (temp_useBitmap, "off") == 0)	XXicon_usebitmap = 0;    }  return 0;}x_error_handler (disp, event)     Display *disp;     XErrorEvent *event;{  char msg[200];  XGetErrorText (disp, event->error_code, msg, 200);  fprintf (stderr, "Fatal X-windows error: %s\n", msg);  Fkill_emacs (make_number (70));}x_io_error_handler (){  Fdo_auto_save ();  perror ("Fatal X-windows I/O error");  Fkill_emacs (make_number (70));}x_term_init (){	register char *vardisplay;	register int xxargc;	register char **xxargv;	char *ptr;	XColor cdef;	extern char *getenv ();	extern XTinterrupt_signal ();	extern char *malloc ();	extern Lisp_Object Vxterm, Vxterm1, Qt;	extern int XIgnoreError();	int  ix;		vardisplay = (alternate_display ? alternate_display : "");	if (!vardisplay) {		fprintf (stderr, "DISPLAY environment variable must be set\n");		exit (-200);	}	XXdisplay = XOpenDisplay (vardisplay);	if (XXdisplay == (Display *) 0) {		fprintf (stderr, "X server not responding.  Check your DISPLAY environment variable.\n");		exit (-99);		}	XXscreen = DefaultScreen (XXdisplay);	XXisColor = DisplayCells (XXdisplay, XXscreen) > 2;	XXColorMap = DefaultColormap (XXdisplay, XXscreen);	XSetErrorHandler (x_error_handler);	XSetIOErrorHandler (x_io_error_handler);	signal (SIGPIPE, x_io_error_handler);	WindowMapped = 0;	baud_rate = 9600;	min_padding_speed = 10000;	must_write_spaces = 1;	meta_key = 1;	visible_bell = 1;	inverse_video = 0;	configure_pending = 0;		fix_screen_hook = xfixscreen;	clear_screen_hook = XTclear_screen;	clear_end_of_line_hook = XTclear_end_of_line;	ins_del_lines_hook = XTins_del_lines;	change_line_highlight_hook = XTchange_line_highlight;	insert_chars_hook = XTinsert_chars;	output_chars_hook = XToutput_chars;	delete_chars_hook = XTdelete_chars;	ring_bell_hook = XTfeep;	reset_terminal_modes_hook = XTreset_terminal_modes;	set_terminal_modes_hook = XTset_terminal_modes;	update_begin_hook = XTupdate_begin;	update_end_hook = XTupdate_end;	set_terminal_window_hook = XTset_terminal_window;	read_socket_hook = XTread_socket;	move_cursor_hook = XTmove_cursor;	reassert_line_highlight_hook = XTreassert_line_highlight;	scroll_region_ok = 1;	/* we'll scroll partial screens */	char_ins_del_ok = 0;	line_ins_del_ok = 1;	/* we'll just blt 'em */	fast_clear_end_of_line = 1; /* X does this well */	memory_below_screen = 0; /* we don't remember what scrolls				  * 		off the bottom */	dont_calculate_costs = 1;	calculate_costs_hook = XTcalculate_costs;	/* New options section */	XXborder = 1;	XXInternalBorder = 1;	screen_width = 80;	screen_height = 66;		reversevideo = 0;	XXdebug = 0;	XXm_queue_num = 0;	XXm_queue_in = 0;	XXm_queue_out = 0;#if 0	handler = XIgnoreError;	XSetErrorHandler (handler);	XSetIOErrorHandler (handler);#endif	desiredwindow =	XXcurrentfont =	XXidentity =	XXicon_name =	XXheader = (char *) NULL;	XXicon_usebitmap = 0;		temp_font = "fixed";	progname = xargv[0];	if (ptr = rindex(progname, '/'))	  progname = ptr+1;	XXpid = getpid ();	default_window = "=80x24+0+0";#if 0	handler = XIgnoreError;	XSetErrorHandler (handler);	XSetIOErrorHandler (handler);#endif	/*  Get resource name and its defaults, it it exists...	 */	for (ix = 1; ix < xargc && xargv[ix][0] == '-'; ix++)	{	    int  valx;		    if (strcmp(xargv[ix], "-rn") == 0 &&		(valx = ix + 1) < xargc)	    {		XXidentity = (char *) xmalloc( strlen(xargv[valx]) + 1 );		(void) strcpy(XXidentity, xargv[valx]);		break;	    }	}	if (!XXidentity)	{	    char  *t;	    if ( (t = getenv("WM_RES_NAME")) != (char *) NULL )		XXidentity = t;	    if (!XXidentity)	    {		XXidentity = progname;	    }	}	if (XXidentity)	    XT_GetDefaults(XXidentity);	else	    XT_GetDefaults(CLASS);	XXpid = getpid ();	default_window = "=80x24+0+0";	/* Process X command line args...*/	xxargc = xargc;	xxargv = xargv;	xxargv++;	xxargc--;	while (xxargc) {		int sargc;		sargc = xxargc;		if (xxargc && !strcmp (*xxargv, "-r")) {			reversevideo = !reversevideo;			xxargc--;			xxargv++;		}		if ((xxargc > 1) && (!strcmp (*xxargv, "-font") ||				     !strcmp (*xxargv, "-fn"))) {			xxargc--;			xxargv++;			if (XXcurrentfont != NULL)				free(XXcurrentfont);			XXcurrentfont = (char *) xmalloc (strlen (*xxargv)+1);			strcpy (XXcurrentfont, *xxargv);			xxargc--;			xxargv++;		}		if ((xxargc > 1) && !strcmp (*xxargv, "-wn")) {			xxargc--;			xxargv++;			XXheader = (char *) xmalloc (strlen (*xxargv)+1);			strcpy (XXheader, *xxargv);			xxargc--;			xxargv++;		}		if ((xxargc > 1) && !strcmp (*xxargv, "-in")) {			xxargc--;			xxargv++;			XXicon_name = (char *) xmalloc (strlen (*xxargv)+1);			strcpy (XXicon_name, *xxargv);			xxargc--;			xxargv++;		}		if (xxargc && !strcmp (*xxargv, "-i")) {			xxargc--;			xxargv++;			XXicon_usebitmap = 1;		}		if ((xxargc > 1) && !strcmp (*xxargv, "-b")) {			xxargc--;			xxargv++;			XXborder = atoi (*xxargv);			xxargc--;			xxargv++;		}		if ((xxargc > 1) && !strcmp (*xxargv, "-ib")) {			xxargc--;			xxargv++;			XXInternalBorder = atoi (*xxargv);			xxargc--;			xxargv++;		}		if ((xxargc > 1) && (!strcmp (*xxargv, "-w") ||				     !strcmp (*xxargv, "-geometry"))) {			xxargc--;			xxargv++;			desiredwindow = (char *) xmalloc (strlen (*xxargv)+1);			strcpy (desiredwindow, *xxargv);			xxargc--;			xxargv++;		}		if (XXisColor) {			if ((xxargc > 1 && !strcmp (*xxargv, "-fg"))) {			        xxargc--;			        xxargv++;			        fore_color =				    (char *) xmalloc (strlen (*xxargv)+1);			        strcpy (fore_color, *xxargv);				xxargc--;				xxargv++;			}			if ((xxargc > 1 && !strcmp (*xxargv, "-bg"))) {			        xxargc--;			        xxargv++;				back_color =				    (char *) xmalloc (strlen (*xxargv)+1);				strcpy (back_color, *xxargv);				xxargc--;				xxargv++;			}			if ((xxargc > 1 && !strcmp (*xxargv, "-bd"))) {				xxargc--;				xxargv++;				brdr_color =				    (char *) xmalloc (strlen (*xxargv)+1);				strcpy (brdr_color, *xxargv);				xxargc--;				xxargv++;			}			if ((xxargc > 1 && !strcmp (*xxargv, "-cr"))) {				xxargc--;				xxargv++;				curs_color =				    (char *) xmalloc (strlen (*xxargv)+1);				strcpy (curs_color, *xxargv);				xxargc--;				xxargv++;			}			if ((xxargc > 1 && !strcmp (*xxargv, "-ms"))) {				xxargc--;				xxargv++;				mous_color =				    (char *) xmalloc (strlen (*xxargv)+1);				strcpy (mous_color, *xxargv);				xxargc--;				xxargv++;			}		}		if (sargc == xxargc) {			xxargc--;			xxargv++;		}	}	/*  Now, actually Parse and Set colors...	 */	if (XXisColor) {	  if (fore_color || back_color)	    reversevideo = 0;	  if (fore_color &&	      XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) &&	      XAllocColor (XXdisplay, XXColorMap, &cdef))	    fore = cdef.pixel;	  else {	    fore_color = "black";	    fore = BlackPixel (XXdisplay, XXscreen);	  }	  if (back_color &&	      XParseColor (XXdisplay, XXColorMap, back_color, &cdef) &&	      XAllocColor (XXdisplay, XXColorMap, &cdef))	    back = cdef.pixel;	  else {	    back_color = "white";	    back = WhitePixel (XXdisplay, XXscreen);	  }	  if (curs_color &&	      XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) &&	      XAllocColor (XXdisplay, XXColorMap, &cdef))	    curs = cdef.pixel;	  else {	    curs_color = "black";	    curs = BlackPixel (XXdisplay, XXscreen);

⌨️ 快捷键说明

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