📄 x11term.c
字号:
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 + -