|
|
1.1 ! root 1: /* X Communication module for terminals which understand the X protocol. ! 2: Copyright (C) 1988, 1990 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU Emacs. ! 5: ! 6: GNU Emacs is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GNU Emacs is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU Emacs; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: /* Written by Yakim Martillo, mods and things by Robert Krawitz */ ! 21: /* Redone for X11 by Robert French */ ! 22: /* Thanks to Mark Biggers for all of the Window Manager support */ ! 23: ! 24: /* ! 25: * $Source: /mit/emacs/src/RCS/11xterm.c,v $ ! 26: * $Author: rfrench $ ! 27: * $Locker: $ ! 28: * $Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $ ! 29: */ ! 30: ! 31: #ifndef lint ! 32: static char *rcsid_xterm_c = "$Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $"; ! 33: #endif lint ! 34: ! 35: /* On 4.3 this loses if it comes after x11term.h. ! 36: On hp-ux it loses if it comes after config.h. */ ! 37: #include <signal.h> ! 38: #include <sys/ioctl.h> ! 39: ! 40: /* Load sys/types.h if not already loaded. ! 41: In some systems loading it twice is suicidal. */ ! 42: #ifndef makedev ! 43: #include <sys/types.h> ! 44: #endif ! 45: ! 46: #include "config.h" ! 47: ! 48: #ifdef HAVE_X_WINDOWS ! 49: ! 50: /* Get FIONREAD, if it is available. ! 51: It would be logical to include <sys/ioctl.h> here, ! 52: but it was moved up above to avoid problems. */ ! 53: #ifdef USG ! 54: #include <termio.h> ! 55: #endif /* USG */ ! 56: #include <fcntl.h> ! 57: ! 58: #include "lisp.h" ! 59: #undef NULL ! 60: ! 61: /* Allow m- file to inhibit use of interrupt-driven input. */ ! 62: #ifdef BROKEN_FIONREAD ! 63: #undef FIONREAD ! 64: #endif ! 65: ! 66: /* We are unable to use interrupts if FIONREAD is not available, ! 67: so flush SIGIO so we won't try. */ ! 68: #ifndef FIONREAD ! 69: #ifdef SIGIO ! 70: #undef SIGIO ! 71: #endif ! 72: #endif ! 73: ! 74: /* This may include sys/types.h, and that somehow loses ! 75: if this is not done before the other system files. ! 76: However, perhaps the problem has been avoided by loading types.h above. */ ! 77: ! 78: #include "x11term.h" ! 79: ! 80: #include "X11/Xresource.h" ! 81: ! 82: /* Allow the config file to specify whether we can assume X11R4. */ ! 83: #ifdef SPECIFY_X11R4 ! 84: #if SPECIFY_X11R4 > 0 ! 85: #define X11R4 ! 86: #endif ! 87: #else /* not SPECIFY_X11R4 */ ! 88: /* Try to guess whether this is release 4 or newer. */ ! 89: #ifdef PBaseSize ! 90: #define X11R4 ! 91: #endif ! 92: #endif /* not SPECIFY_X11R4 */ ! 93: ! 94: #ifdef HAVE_SOCKETS ! 95: #include <sys/socket.h> /* Must be done before gettime.h. */ ! 96: #endif ! 97: /* Include time.h, sys/time.h, or both. */ ! 98: #include "gettime.h" ! 99: ! 100: #ifdef AIX ! 101: static KeySym XMOD_Alt[] = { XK_Alt_L }; ! 102: static KeySym XMOD_Shift[] = { XK_Shift_L }; ! 103: static KeySym XMOD_ShiftAlt[] = { XK_Alt_L, XK_Shift_L }; ! 104: static KeySym XMOD_CtrlAlt[] = { XK_Control_L, XK_Alt_L }; ! 105: static KeySym XMOD_Ctrl[] = { XK_Control_L }; ! 106: static KeySym XMOD_CtrlShift[] = { XK_Control_L, XK_Shift_L }; ! 107: static KeySym XMOD_ShiftCtrlAlt[] = { XK_Control_L, XK_Alt_L, XK_Shift_L }; ! 108: #endif ! 109: ! 110: #if 0 /* On some machines, stdio.h doesn't define NULL ! 111: if stddef.h has been included already! */ ! 112: #ifdef NULL /* Sometimes various definitions conflict here. */ ! 113: #undef NULL ! 114: #endif ! 115: #endif ! 116: #include <stdio.h> ! 117: #include <ctype.h> ! 118: #include <errno.h> ! 119: #ifdef BSD ! 120: #include <strings.h> ! 121: #endif ! 122: #include <sys/stat.h> ! 123: ! 124: #ifndef NULL ! 125: #define NULL 0 ! 126: #endif ! 127: ! 128: #include "dispextern.h" ! 129: #include "termhooks.h" ! 130: #include "termopts.h" ! 131: #include "termchar.h" ! 132: ! 133: #include "sink11.h" ! 134: #include "sink11mask.h" ! 135: ! 136: #define min(a,b) ((a)<(b) ? (a) : (b)) ! 137: #define max(a,b) ((a)>(b) ? (a) : (b)) ! 138: ! 139: extern int errno; ! 140: ! 141: #define sigunblockx(sig) sigblock (SIGEMPTYMASK) ! 142: #define sigblockx(sig) sigblock (sigmask ((sig))) ! 143: ! 144: #define METABIT 0200 ! 145: #define MINWIDTH 12 /* In pixels */ ! 146: #define MINHEIGHT 5 /* In pixels */ ! 147: #define MAXHEIGHT 300 /* In lines */ ! 148: ! 149: int pixelwidth,pixelheight; ! 150: char *progname; ! 151: ! 152: XEvent *XXm_queue[XMOUSEBUFSIZE]; ! 153: int XXm_queue_num, XXm_queue_in, XXm_queue_out; ! 154: ! 155: char *XXcurrentfont; ! 156: XFontStruct *fontinfo; ! 157: Font XXfid; ! 158: int XXfontw, XXfonth, XXbase, XXisColor; ! 159: ! 160: /* Nonzero means Emacs has explicit keyboard focus. */ ! 161: int x_focus_flag; ! 162: ! 163: Colormap XXColorMap; ! 164: char *default_window; ! 165: extern int initialized; ! 166: extern int screen_width, screen_height; ! 167: extern int delayed_size_change; ! 168: ! 169: /* Function for init_keyboard to call with no args (if nonzero). */ ! 170: extern void (*keyboard_init_hook) (); ! 171: ! 172: extern char *alternate_display; ! 173: extern int xargc; ! 174: extern char **xargv; ! 175: ! 176: int XXdebug; ! 177: int XXpid; ! 178: ! 179: int WindowMapped; ! 180: ! 181: char *XXidentity; /* Resource name of this invocation of Emacs */ ! 182: static char *XXicon_name; /* user-supplied icon info */ ! 183: static int XXicon_usebitmap; /* Use bitmap or not */ ! 184: static char *XXheader; /* user-supplied window header info */ ! 185: ! 186: static int flexlines; /* last line affected by dellines or ! 187: * inslines functions */ ! 188: int VisibleX, VisibleY; /* genuine location of cursor on screen ! 189: * if it is there */ ! 190: ! 191: /* Last cursor position specified by move_cursor. ! 192: During an update, this does not display a cursor on the screen; ! 193: But it controls the position that is output. */ ! 194: static int local_cursor_hpos; ! 195: static int local_cursor_vpos; ! 196: ! 197: static int SavedX, SavedY; /* Where the cursor was before update ! 198: * started */ ! 199: ! 200: ! 201: int CursorExists; /* during updates cursor is turned off */ ! 202: int CursorOutline; /* when the pointer is not in the Emacs ! 203: * widow the cursor should be drawn in ! 204: * outline form a la xterm */ ! 205: static int InUpdate; /* many of functions here may be invoked ! 206: * even if no update in progress; when ! 207: * no update is in progress the action ! 208: * can be slightly different */ ! 209: ! 210: Display *XXdisplay; ! 211: int XXscreen; ! 212: Window XXwindow; ! 213: GC XXgc_norm,XXgc_rev,XXgc_curs,XXgc_temp,XXgc_curs_rev; ! 214: XGCValues XXgcv; ! 215: Cursor EmacsCursor; ! 216: Pixmap SinkPixmap, SinkMaskPixmap; ! 217: ! 218: static XrmDatabase db, db2; ! 219: ! 220: char *fore_color; /* Variables to store color names */ ! 221: char *back_color; ! 222: char *brdr_color; ! 223: char *curs_color; ! 224: char *mous_color; ! 225: ! 226: unsigned long fore; /* Variables to store pixel values */ ! 227: unsigned long back; ! 228: unsigned long brdr; ! 229: unsigned long curs; ! 230: ! 231: char *desiredwindow; ! 232: ! 233: int CurHL; /* Current Highlighting (ala mode line) */ ! 234: ! 235: int XXborder; /* Window border width */ ! 236: int XXInternalBorder; /* Internal border width */ ! 237: int updated[MAXHEIGHT]; ! 238: ! 239: static char *temp_font; /* needed because of loading hacks */ ! 240: static char *temp_reverseVideo; ! 241: static char *temp_borderWidth; ! 242: static char *temp_internalBorder; ! 243: static char *temp_useBitmap; ! 244: ! 245: struct _xdeftab ! 246: { ! 247: char *iname; /* instance name */ ! 248: char *cname; /* class name (fake it) */ ! 249: char **varp; /* variable to set */ ! 250: }; ! 251: ! 252: static struct _xdeftab xDefaultsValueTable[] ! 253: = { ! 254: { "reverseVideo", "ReverseVideo", &temp_reverseVideo }, ! 255: { "borderWidth", "BorderWidth", &temp_borderWidth }, ! 256: { "internalBorder","BorderWidth", &temp_internalBorder }, ! 257: { "bitmapIcon", "BitmapIcon", &temp_useBitmap }, ! 258: { "borderColor", "BorderColor", &brdr_color }, ! 259: { "background", "Background", &back_color }, ! 260: { "foreground", "Foreground", &fore_color }, ! 261: { "pointerColor", "Foreground", &mous_color }, ! 262: { "cursorColor", "Foreground", &curs_color }, ! 263: { "font", "Font", &temp_font }, ! 264: { "geometry", "Geometry", &desiredwindow }, ! 265: { "title", "Title", &XXheader }, ! 266: { "iconName", "Title", &XXicon_name }, ! 267: { NULL, NULL, NULL } ! 268: }; ! 269: ! 270: ! 271: int (*handler)(); ! 272: ! 273: static void x_init_1 (); ! 274: static int XInitWindow (); ! 275: ! 276: char *rindex(); ! 277: ! 278: /* HLmode -- Changes the GX function for output strings. Could be used to ! 279: * change font. Check an XText library function call. ! 280: */ ! 281: ! 282: HLmode (new) ! 283: int new; ! 284: { ! 285: extern Lisp_Object inverse_video; ! 286: ! 287: CurHL = new; ! 288: } ! 289: ! 290: /* External interface to control of standout mode. ! 291: Call this when about to modify line at position VPOS ! 292: and not change whether it is highlighted. */ ! 293: ! 294: XTreassert_line_highlight (highlight, vpos) ! 295: int highlight, vpos; ! 296: { ! 297: HLmode (highlight); ! 298: } ! 299: ! 300: /* Call this when about to modify line at position VPOS ! 301: and change whether it is highlighted. */ ! 302: ! 303: XTchange_line_highlight (new_highlight, vpos, first_unused_hpos) ! 304: int new_highlight, vpos, first_unused_hpos; ! 305: { ! 306: HLmode (new_highlight); ! 307: XTmove_cursor (vpos, 0); ! 308: x_clear_end_of_line (0); ! 309: } ! 310: ! 311: ! 312: /* Used for starting or restarting (after suspension) the X window. Puts the ! 313: * cursor in a known place, update does not begin with this routine but only ! 314: * with a call to redisplay. ! 315: */ ! 316: ! 317: XTset_terminal_modes () ! 318: { ! 319: int stuffpending; ! 320: #ifdef XDEBUG ! 321: fprintf (stderr, "XTset_terminal_modes\n"); ! 322: #endif ! 323: ! 324: InUpdate = 0; ! 325: stuffpending = 0; ! 326: if (!initialized) { ! 327: CursorExists = 0; ! 328: CursorOutline = 1; ! 329: VisibleX = 0; ! 330: VisibleY = 0; ! 331: } ! 332: XTclear_screen (); ! 333: } ! 334: ! 335: /* XTmove_cursor moves the cursor to the correct location and checks whether an ! 336: * update is in progress in order to toggle it on. ! 337: */ ! 338: ! 339: XTmove_cursor (row, col) ! 340: register int row, col; ! 341: { ! 342: BLOCK_INPUT_DECLARE (); ! 343: #ifdef XDEBUG ! 344: fprintf (stderr, "XTmove_cursor (X %d, Y %d)\n",col,row); ! 345: #endif ! 346: ! 347: BLOCK_INPUT (); ! 348: local_cursor_hpos = col; ! 349: local_cursor_vpos = row; ! 350: ! 351: if (InUpdate) { ! 352: if (CursorExists) ! 353: CursorToggle (); ! 354: UNBLOCK_INPUT (); ! 355: return; ! 356: /* Generally, XTmove_cursor will be invoked */ ! 357: /* when InUpdate with !CursorExists */ ! 358: /* so that wasteful XFlush is not called */ ! 359: } ! 360: if ((row == VisibleY) && (col == VisibleX)) { ! 361: if (!CursorExists) ! 362: CursorToggle (); ! 363: XFlush (XXdisplay); ! 364: UNBLOCK_INPUT (); ! 365: return; ! 366: } ! 367: if (CursorExists) ! 368: CursorToggle (); ! 369: VisibleX = col; ! 370: VisibleY = row; ! 371: if (!CursorExists) ! 372: CursorToggle (); ! 373: XFlush (XXdisplay); ! 374: UNBLOCK_INPUT (); ! 375: } ! 376: ! 377: /* Used to get the terminal back to a known state after resets. Usually ! 378: * used when restarting suspended or waiting emacs ! 379: */ ! 380: ! 381: cleanup () ! 382: { ! 383: inverse_video = 0; ! 384: HLmode (0); ! 385: } ! 386: ! 387: /* Erase current line from current column to column END. ! 388: Leave cursor at END. */ ! 389: ! 390: XTclear_end_of_line (end) ! 391: register int end; ! 392: { ! 393: register int numcols; ! 394: BLOCK_INPUT_DECLARE (); ! 395: ! 396: #ifdef XDEBUG ! 397: fprintf (stderr, "XTclear_end_of_line (to %d)\n",end); ! 398: #endif ! 399: ! 400: if (local_cursor_vpos < 0 || local_cursor_vpos >= screen_height) ! 401: return; ! 402: ! 403: if (end <= local_cursor_hpos) ! 404: return; ! 405: if (end >= screen_width) ! 406: end = screen_width; ! 407: ! 408: numcols = end - local_cursor_hpos; ! 409: BLOCK_INPUT (); ! 410: if (local_cursor_vpos == VisibleY && VisibleX >= local_cursor_hpos && VisibleX < end) ! 411: if (CursorExists) CursorToggle (); ! 412: if (CurHL) ! 413: XFillRectangle (XXdisplay, XXwindow, XXgc_norm, ! 414: local_cursor_hpos*XXfontw+XXInternalBorder, ! 415: local_cursor_vpos*XXfonth+XXInternalBorder, ! 416: XXfontw*numcols, ! 417: XXfonth); ! 418: else ! 419: XClearArea (XXdisplay, XXwindow, ! 420: local_cursor_hpos*XXfontw+XXInternalBorder, ! 421: local_cursor_vpos*XXfonth+XXInternalBorder, ! 422: XXfontw*numcols, ! 423: XXfonth, ! 424: 0); ! 425: XTmove_cursor (local_cursor_vpos, end); ! 426: UNBLOCK_INPUT (); ! 427: } ! 428: ! 429: /* Erase current line from column START to right margin. ! 430: Leave cursor at START. */ ! 431: ! 432: x_clear_end_of_line (start) ! 433: register int start; ! 434: { ! 435: register int numcols; ! 436: BLOCK_INPUT_DECLARE (); ! 437: ! 438: #ifdef XDEBUG ! 439: fprintf (stderr, "x_clear_end_of_line (start %d)\n", start); ! 440: #endif ! 441: ! 442: if (local_cursor_vpos < 0 || local_cursor_vpos >= screen_height) ! 443: return; ! 444: ! 445: if (start >= screen_width) ! 446: return; ! 447: if (start < 0) ! 448: start = 0; ! 449: ! 450: numcols = screen_width - start; ! 451: BLOCK_INPUT (); ! 452: if (local_cursor_vpos == VisibleY && VisibleX >= start) ! 453: if (CursorExists) CursorToggle (); ! 454: if (CurHL) ! 455: XFillRectangle (XXdisplay, XXwindow, XXgc_norm, ! 456: start*XXfontw+XXInternalBorder, ! 457: local_cursor_vpos*XXfonth+XXInternalBorder, ! 458: XXfontw*numcols, ! 459: XXfonth); ! 460: else ! 461: XClearArea (XXdisplay, XXwindow, ! 462: start*XXfontw+XXInternalBorder, ! 463: local_cursor_vpos*XXfonth+XXInternalBorder, ! 464: XXfontw*numcols, ! 465: XXfonth, ! 466: 0); ! 467: XTmove_cursor (local_cursor_vpos, start); ! 468: UNBLOCK_INPUT (); ! 469: } ! 470: ! 471: XTreset_terminal_modes () ! 472: { ! 473: #ifdef XDEBUG ! 474: fprintf (stderr, "XTreset_terminal_modes\n"); ! 475: #endif ! 476: ! 477: XTclear_screen (); ! 478: } ! 479: ! 480: XTclear_screen () ! 481: { ! 482: BLOCK_INPUT_DECLARE (); ! 483: ! 484: #ifdef XDEBUG ! 485: fprintf (stderr, "XTclear_screen\n"); ! 486: #endif ! 487: ! 488: BLOCK_INPUT (); ! 489: HLmode (0); ! 490: CursorExists = 0; ! 491: ! 492: local_cursor_hpos = 0; ! 493: local_cursor_vpos = 0; ! 494: SavedX = 0; ! 495: SavedY = 0; ! 496: VisibleX = 0; ! 497: VisibleY = 0; ! 498: XClearWindow(XXdisplay, XXwindow); ! 499: CursorToggle (); ! 500: if (!InUpdate) ! 501: XFlush (XXdisplay); ! 502: UNBLOCK_INPUT (); ! 503: } ! 504: ! 505: /* used by dumprectangle which is usually invoked upon Expose ! 506: * events which come from bit blt's or moving an obscuring opaque window ! 507: */ ! 508: ! 509: dumpchars (active_screen, numcols, tempX, tempY, tempHL) ! 510: register struct matrix *active_screen; ! 511: register int numcols; ! 512: register int tempX, tempY, tempHL; ! 513: { ! 514: if (numcols <= 0) ! 515: return; ! 516: ! 517: if (numcols-1+tempX > screen_width) ! 518: numcols = screen_width-tempX+1; ! 519: ! 520: if (tempX < 0 || tempX >= screen_width || ! 521: tempY < 0 || tempY >= screen_height) ! 522: return; ! 523: ! 524: XDrawImageString(XXdisplay, XXwindow, tempHL ? XXgc_rev : XXgc_norm, ! 525: tempX*XXfontw+XXInternalBorder, ! 526: tempY*XXfonth+XXInternalBorder+XXbase, ! 527: (char *) &active_screen->contents[tempY][tempX], ! 528: numcols); ! 529: } ! 530: ! 531: /* When a line has been changed this function is called. Due to various ! 532: * bits of braindamage on the parts of both X11 and Emacs, the new ! 533: * version of the line is simply output if this function is invoked while ! 534: * in UpDate. Sometimes writechars can be invoked when not in update if ! 535: * text is to be output at the end of the line. In this case the whole ! 536: * line is not output. Simply the new text at the current cursor ! 537: * position given by VisibleX,Y. The cursor is moved to the end of the ! 538: * new text. ! 539: */ ! 540: ! 541: updateline (first) ! 542: int first; ! 543: { ! 544: register int temp_length; ! 545: BLOCK_INPUT_DECLARE (); ! 546: ! 547: #ifdef XDEBUG ! 548: fprintf(stderr, "updateline\n"); ! 549: #endif /* XDEBUG */ ! 550: ! 551: BLOCK_INPUT (); ! 552: if ((local_cursor_vpos < 0) || (local_cursor_vpos >= screen_height) ! 553: || updated[local_cursor_vpos]) { ! 554: UNBLOCK_INPUT (); ! 555: return; ! 556: } ! 557: if (!first) ! 558: updated[local_cursor_vpos] = 1; ! 559: if (CursorExists) ! 560: CursorToggle (); ! 561: if (new_screen->enable[local_cursor_vpos]) ! 562: temp_length = new_screen->used[local_cursor_vpos]-first; ! 563: else ! 564: temp_length = 0; ! 565: if (temp_length > 0) { ! 566: XDrawImageString (XXdisplay, XXwindow, ! 567: CurHL ? XXgc_rev : XXgc_norm, ! 568: first*XXfontw+XXInternalBorder, ! 569: local_cursor_vpos*XXfonth+XXInternalBorder+XXbase, ! 570: (char *) &new_screen->contents[local_cursor_vpos][first], ! 571: temp_length); ! 572: if (temp_length < screen_width) ! 573: x_clear_end_of_line (temp_length); ! 574: XTmove_cursor (local_cursor_vpos, temp_length); ! 575: } ! 576: else { ! 577: x_clear_end_of_line (0); ! 578: XTmove_cursor (local_cursor_vpos, 0); ! 579: } ! 580: UNBLOCK_INPUT (); ! 581: } ! 582: ! 583: writechars (start, end) ! 584: register char *start, *end; ! 585: { ! 586: BLOCK_INPUT_DECLARE (); ! 587: ! 588: #ifdef XDEBUG ! 589: fprintf(stderr, "writechars (local_cursor_hpos %d temp_len %d InUpd %d)\n", ! 590: local_cursor_hpos, end-start+1, InUpdate); ! 591: #endif /* XDEBUG */ ! 592: ! 593: BLOCK_INPUT (); ! 594: ! 595: if ((local_cursor_vpos < 0) || (local_cursor_vpos >= screen_height)) ! 596: { ! 597: UNBLOCK_INPUT (); ! 598: return; ! 599: } ! 600: ! 601: if (CursorExists) ! 602: CursorToggle (); ! 603: ! 604: ! 605: if (InUpdate) ! 606: { ! 607: XDrawImageString (XXdisplay, XXwindow, ! 608: CurHL ? XXgc_rev : XXgc_norm, ! 609: local_cursor_hpos*XXfontw+XXInternalBorder, ! 610: local_cursor_vpos*XXfonth+XXInternalBorder+XXbase, ! 611: start, ! 612: (end - start) + 1); ! 613: XTmove_cursor (local_cursor_vpos, (end - start) + 1); ! 614: ! 615: UNBLOCK_INPUT (); ! 616: return; ! 617: } ! 618: ! 619: if ((VisibleX < 0) || (VisibleX >= screen_width)) { ! 620: UNBLOCK_INPUT (); ! 621: return; ! 622: } ! 623: if ((VisibleY < 0) || (VisibleY >= screen_height)) { ! 624: UNBLOCK_INPUT (); ! 625: return; ! 626: } ! 627: if (((end - start) + VisibleX) >= screen_width) ! 628: end = start + (screen_width - (VisibleX + 1)); ! 629: if (end >= start) { ! 630: XDrawImageString (XXdisplay, XXwindow, ! 631: CurHL ? XXgc_rev : XXgc_norm, ! 632: (VisibleX * XXfontw+XXInternalBorder), ! 633: VisibleY * XXfonth+XXInternalBorder+XXbase, ! 634: start, ! 635: ((end - start) + 1)); ! 636: VisibleX = VisibleX + (end - start) + 1; ! 637: } ! 638: if (!CursorExists) ! 639: CursorToggle (); ! 640: UNBLOCK_INPUT (); ! 641: } ! 642: ! 643: static ! 644: XToutput_chars (start, len) ! 645: register char *start; ! 646: register int len; ! 647: { ! 648: #ifdef XDEBUG ! 649: fprintf (stderr, "XToutput_chars (len %d)\n",len); ! 650: #endif ! 651: ! 652: writechars (start, start+len-1); ! 653: } ! 654: ! 655: XTflash () ! 656: { ! 657: #ifdef HAVE_TIMEVAL ! 658: #ifdef HAVE_SELECT ! 659: XGCValues gcv_temp; ! 660: struct timeval wakeup, now; ! 661: BLOCK_INPUT_DECLARE (); ! 662: ! 663: #ifdef XDEBUG ! 664: fprintf (stderr, "XTflash\n"); ! 665: #endif ! 666: ! 667: BLOCK_INPUT (); ! 668: XXgc_temp = XCreateGC(XXdisplay, XXwindow, 0, &gcv_temp); ! 669: XSetState(XXdisplay, XXgc_temp, WhitePixel (XXdisplay, XXscreen), ! 670: BlackPixel(XXdisplay, XXscreen), GXinvert, ! 671: AllPlanes); ! 672: ! 673: /* For speed, flash just 1/4 of the window's area, a rectangle in ! 674: the center. */ ! 675: XFillRectangle (XXdisplay, XXwindow, XXgc_temp, ! 676: screen_width*XXfontw/4, screen_height*XXfonth/4, ! 677: screen_width*XXfontw/2, screen_height*XXfonth/2); ! 678: XFlush (XXdisplay); ! 679: ! 680: UNBLOCK_INPUT (); ! 681: ! 682: gettimeofday (&wakeup, (struct timezone *)0); ! 683: ! 684: /* Compute time to wait until, propagating carry from usecs. */ ! 685: wakeup.tv_usec += 150000; ! 686: wakeup.tv_sec += (wakeup.tv_usec / 1000000); ! 687: wakeup.tv_usec %= 1000000; ! 688: ! 689: /* Keep waiting until past the time wakeup. */ ! 690: while (1) ! 691: { ! 692: struct timeval timeout; ! 693: ! 694: gettimeofday (&timeout, (struct timezone *)0); ! 695: ! 696: /* In effect, timeout = wakeup - timeout. ! 697: Break if result would be negative. */ ! 698: if (timeval_subtract (&timeout, wakeup, timeout)) ! 699: break; ! 700: ! 701: /* Try to wait that long--but we might wake up sooner. */ ! 702: select (0, 0, 0, 0, &timeout); ! 703: } ! 704: ! 705: BLOCK_INPUT (); ! 706: ! 707: XFillRectangle (XXdisplay, XXwindow, XXgc_temp, ! 708: screen_width*XXfontw/4, screen_height*XXfonth/4, ! 709: screen_width*XXfontw/2, screen_height*XXfonth/2); ! 710: ! 711: XFreeGC(XXdisplay, XXgc_temp); ! 712: XFlush (XXdisplay); ! 713: ! 714: UNBLOCK_INPUT (); ! 715: #endif ! 716: #endif ! 717: } ! 718: ! 719: XTfeep () ! 720: { ! 721: BLOCK_INPUT_DECLARE (); ! 722: #ifdef XDEBUG ! 723: fprintf (stderr, "XTfeep\n"); ! 724: #endif ! 725: BLOCK_INPUT (); ! 726: XBell (XXdisplay, 0); ! 727: XFlush (XXdisplay); ! 728: UNBLOCK_INPUT (); ! 729: } ! 730: ! 731: /* Artificially creating a cursor is hard, the actual position on the ! 732: * screen (either where it is or last was) is tracked with VisibleX,Y. ! 733: * Gnu Emacs code tends to assume a cursor exists in hardward at local_cursor_hpos,Y ! 734: * and that output text will appear there. During updates, the cursor is ! 735: * supposed to be blinked out and will only reappear after the update ! 736: * finishes. ! 737: */ ! 738: ! 739: CursorToggle () ! 740: { ! 741: register struct matrix *active_screen; ! 742: ! 743: if (!WindowMapped) { ! 744: CursorExists = 0; ! 745: CursorOutline = 1; ! 746: return 0; ! 747: /* Currently the return values are not */ ! 748: /* used, but I could anticipate using */ ! 749: /* them in the future. */ ! 750: } ! 751: ! 752: if (VisibleX < 0 || VisibleX >= screen_width || ! 753: VisibleY < 0 || VisibleY >= screen_height) { ! 754: /* Not much can be done */ ! 755: XFlush (XXdisplay); ! 756: CursorExists = 0; ! 757: return 0; ! 758: } ! 759: ! 760: active_screen = current_screen; ! 761: ! 762: if (active_screen->highlight[VisibleY]) ! 763: /* If the cursor is in the modeline, it means display was preempted. ! 764: Don't actually display the cursor there, just say we did. ! 765: The code below doesn't display it right, and nobody wants ! 766: to see it anyway. */ ! 767: ; ! 768: else if (active_screen->enable[VisibleY] ! 769: && VisibleX < active_screen->used[VisibleY]) { ! 770: if (CursorExists) ! 771: XDrawImageString(XXdisplay, XXwindow, XXgc_norm, ! 772: VisibleX*XXfontw+XXInternalBorder, ! 773: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 774: (char *) &active_screen->contents[VisibleY][VisibleX], ! 775: 1); ! 776: else if (CursorOutline) { ! 777: XDrawImageString(XXdisplay, XXwindow, XXgc_norm, ! 778: VisibleX*XXfontw+XXInternalBorder, ! 779: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 780: (char *) &active_screen->contents[VisibleY][VisibleX], ! 781: 1); ! 782: XDrawRectangle (XXdisplay, XXwindow, XXgc_curs_rev, ! 783: VisibleX*XXfontw+XXInternalBorder, ! 784: VisibleY*XXfonth+XXInternalBorder, ! 785: XXfontw - 1, XXfonth - 1); ! 786: } else ! 787: XDrawImageString(XXdisplay, XXwindow, XXgc_curs, ! 788: VisibleX*XXfontw+XXInternalBorder, ! 789: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 790: (char *) &active_screen->contents[VisibleY][VisibleX], ! 791: 1); ! 792: } ! 793: else { ! 794: if (CursorExists) ! 795: XClearArea (XXdisplay, XXwindow, ! 796: VisibleX*XXfontw+XXInternalBorder, ! 797: VisibleY*XXfonth+XXInternalBorder, ! 798: XXfontw, XXfonth, 0); ! 799: else if (CursorOutline) ! 800: XDrawRectangle (XXdisplay, XXwindow, XXgc_curs_rev, ! 801: VisibleX*XXfontw+XXInternalBorder, ! 802: VisibleY*XXfonth+XXInternalBorder, ! 803: XXfontw - 1, XXfonth - 1); ! 804: else ! 805: XDrawImageString(XXdisplay, XXwindow, XXgc_curs, ! 806: VisibleX*XXfontw+XXInternalBorder, ! 807: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 808: " ", 1); ! 809: } ! 810: ! 811: CursorExists = !CursorExists; ! 812: ! 813: if (!InUpdate) ! 814: XFlush (XXdisplay); ! 815: ! 816: return 1; ! 817: } ! 818: ! 819: /* This routine is used by routines which are called to paint regions */ ! 820: /* designated by Expose events. If the cursor may be in the exposed */ ! 821: /* region, this routine makes sure it is gone so that dumprectangle can */ ! 822: /* toggle it back into existance if dumprectangle is invoked when not in */ ! 823: /* the midst of a screen update. */ ! 824: ! 825: static ! 826: ClearCursor () ! 827: { ! 828: BLOCK_INPUT_DECLARE (); ! 829: ! 830: BLOCK_INPUT (); ! 831: if (!WindowMapped) { ! 832: CursorExists = 0; ! 833: CursorOutline = 1; ! 834: UNBLOCK_INPUT (); ! 835: return; ! 836: } ! 837: ! 838: if (VisibleX < 0 || VisibleX >= screen_width || ! 839: VisibleY < 0 || VisibleY >= screen_height) { ! 840: /* Not much can be done */ ! 841: CursorExists = 0; ! 842: UNBLOCK_INPUT (); ! 843: return; ! 844: } ! 845: ! 846: XClearArea (XXdisplay, XXwindow, ! 847: VisibleX*XXfontw+XXInternalBorder, ! 848: VisibleY*XXfonth+XXInternalBorder, ! 849: XXfontw, XXfonth, 0); ! 850: ! 851: CursorExists = 0; ! 852: UNBLOCK_INPUT (); ! 853: } ! 854: ! 855: XTupdate_begin () ! 856: { ! 857: BLOCK_INPUT_DECLARE (); ! 858: register int i; ! 859: ! 860: #ifdef XDEBUG ! 861: fprintf (stderr, "XTupdate_begin\n"); ! 862: #endif ! 863: ! 864: BLOCK_INPUT (); ! 865: InUpdate = 1; ! 866: if (CursorExists) ! 867: CursorToggle (); ! 868: ! 869: for (i=0;i<MAXHEIGHT;i++) ! 870: updated[i] = 0; ! 871: ! 872: SavedX = local_cursor_hpos; ! 873: SavedY = local_cursor_vpos; ! 874: /* Thw initial "hardware" cursor position is */ ! 875: /* saved because that is where gnu emacs */ ! 876: /* expects the cursor to be at the end of */ ! 877: /* the update */ ! 878: ! 879: UNBLOCK_INPUT (); ! 880: } ! 881: ! 882: XTupdate_end () ! 883: { ! 884: BLOCK_INPUT_DECLARE (); ! 885: ! 886: #ifdef XDEBUG ! 887: fprintf (stderr, "XTupdate_end\n"); ! 888: #endif ! 889: ! 890: BLOCK_INPUT (); ! 891: if (CursorExists) ! 892: CursorToggle (); ! 893: ! 894: InUpdate = 0; ! 895: /* Display cursor at last place requested. */ ! 896: XTmove_cursor (local_cursor_vpos, local_cursor_hpos); ! 897: XFlush (XXdisplay); ! 898: UNBLOCK_INPUT (); ! 899: } ! 900: ! 901: /* Used for Expose events. Have to get the text ! 902: * back into the newly blank areas. ! 903: */ ! 904: ! 905: dumprectangle (top, left, rows, cols) ! 906: register int top, left, rows, cols; ! 907: { ! 908: register struct matrix *active_screen; ! 909: register int ourindex; ! 910: int localX, localY, localHL; ! 911: ! 912: if (top < 0) ! 913: top = 0; ! 914: if (left < 0) ! 915: left = 0; ! 916: rows += top; ! 917: cols += left; ! 918: top /= XXfonth; ! 919: /* Get row and col containing up and */ ! 920: /* left borders of exposed region -- */ ! 921: /* round down here*/ ! 922: left /= XXfontw; ! 923: rows += XXfonth-1; ! 924: cols += XXfontw-1; ! 925: rows /= XXfonth; ! 926: /* Get row and col containing bottom and */ ! 927: /* right borders -- round up here */ ! 928: rows -= top; ! 929: cols /= XXfontw; ! 930: cols -= left; ! 931: ! 932: if (rows < 0) ! 933: return; ! 934: if (cols < 0) ! 935: return; ! 936: if (top > screen_height - 1) ! 937: return; ! 938: if (left > screen_width - 1) ! 939: return; ! 940: if (VisibleX >= left && VisibleX < left + cols && ! 941: VisibleY >= top && VisibleY < top + rows) ! 942: ClearCursor (); ! 943: ! 944: if (InUpdate) ! 945: active_screen = new_screen; ! 946: else ! 947: /* When queue is dumped in update this */ ! 948: active_screen = current_screen; ! 949: ! 950: for (localY = top, ourindex = 0; ! 951: ourindex < rows && localY < screen_height; ! 952: ++ourindex, ++localY) { ! 953: if (localY < 0 || localY >= screen_height || ! 954: !active_screen->enable[localY] || ! 955: left+1 > active_screen->used[localY]) ! 956: continue; ! 957: localX = left; ! 958: localHL = active_screen->highlight[localY]; ! 959: dumpchars (active_screen, ! 960: min (cols, ! 961: active_screen->used[localY]-localX), ! 962: localX, localY, localHL); ! 963: } ! 964: if (!InUpdate && !CursorExists) ! 965: CursorToggle (); ! 966: /* Routine usually called */ ! 967: /* when not in update */ ! 968: } ! 969: ! 970: /* What sections of the window will be modified from the UpdateDisplay ! 971: * routine is totally under software control. Any line with Y coordinate ! 972: * greater than flexlines will not change during an update. This is really ! 973: * used only during dellines and inslines routines (scraplines and stufflines) ! 974: */ ! 975: ! 976: XTset_terminal_window (n) ! 977: register int n; ! 978: { ! 979: #ifdef XDEBUG ! 980: fprintf (stderr, "XTset_terminal_window\n"); ! 981: #endif ! 982: ! 983: if (n <= 0 || n > screen_height) ! 984: flexlines = screen_height; ! 985: else ! 986: flexlines = n; ! 987: } ! 988: ! 989: XTins_del_lines (vpos, n) ! 990: int vpos, n; ! 991: { ! 992: #ifdef XDEBUG ! 993: fprintf (stderr, "XTins_del_lines\n"); ! 994: #endif ! 995: ! 996: XTmove_cursor (vpos, 0); ! 997: if (n >= 0) ! 998: stufflines (n); ! 999: else ! 1000: scraplines (-n); ! 1001: } ! 1002: ! 1003: /* Estimate the cost of scrolling as equal to drawing one fifth ! 1004: of the character cells copied if black and white, ! 1005: or half of those characters if color. */ ! 1006: ! 1007: static ! 1008: XTcalculate_costs (extra, costvec, ncostvec) ! 1009: int extra; ! 1010: int *costvec, *ncostvec; ! 1011: { ! 1012: int color_p = DisplayCells (XXdisplay, XXscreen) > 2; ! 1013: ! 1014: CalcLID (0, screen_width / (color_p ? 2 : 5), 0, 0, costvec, ncostvec); ! 1015: } ! 1016: ! 1017: static ! 1018: XTinsert_chars (start, len) ! 1019: register char *start; ! 1020: register int len; ! 1021: { ! 1022: #ifdef XDEBUG ! 1023: fprintf (stderr, "XTinsert_chars\n"); ! 1024: #endif ! 1025: ! 1026: updateline (0); ! 1027: } ! 1028: ! 1029: static ! 1030: XTdelete_chars (n) ! 1031: register int n; ! 1032: { ! 1033: char *msg = "Major foobars! This shouldn't show up!"; ! 1034: ! 1035: #ifdef XDEBUG ! 1036: fprintf (stderr, "XTdelete_chars (num %d local_cursor_hpos %d)\n",n,local_cursor_hpos); ! 1037: #endif ! 1038: ! 1039: updateline (0); ! 1040: } ! 1041: ! 1042: stufflines (n) ! 1043: register int n; ! 1044: { ! 1045: register int topregion, bottomregion; ! 1046: register int length, newtop; ! 1047: BLOCK_INPUT_DECLARE (); ! 1048: ! 1049: if (local_cursor_vpos >= flexlines) ! 1050: return; ! 1051: ! 1052: BLOCK_INPUT (); ! 1053: ! 1054: if (CursorExists) ! 1055: CursorToggle (); ! 1056: ! 1057: topregion = local_cursor_vpos; ! 1058: bottomregion = flexlines-(n+1); ! 1059: newtop = local_cursor_vpos+n; ! 1060: length = bottomregion-topregion+1; ! 1061: ! 1062: if (length > 0 && newtop <= flexlines) { ! 1063: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 1064: XXInternalBorder, ! 1065: topregion*XXfonth+XXInternalBorder, ! 1066: screen_width*XXfontw, ! 1067: length*XXfonth, ! 1068: XXInternalBorder, newtop*XXfonth+XXInternalBorder); ! 1069: } ! 1070: ! 1071: newtop = min (newtop, flexlines-1); ! 1072: length = newtop-topregion; ! 1073: if (length > 0) ! 1074: XClearArea (XXdisplay, XXwindow, ! 1075: XXInternalBorder, ! 1076: topregion*XXfonth+XXInternalBorder, ! 1077: screen_width*XXfontw, ! 1078: n*XXfonth, 0); ! 1079: UNBLOCK_INPUT (); ! 1080: } ! 1081: ! 1082: scraplines (n) ! 1083: register int n; ! 1084: { ! 1085: BLOCK_INPUT_DECLARE (); ! 1086: ! 1087: if (local_cursor_vpos >= flexlines) ! 1088: return; ! 1089: ! 1090: BLOCK_INPUT (); ! 1091: ! 1092: if (CursorExists) ! 1093: CursorToggle (); ! 1094: ! 1095: if (local_cursor_vpos+n >= flexlines) { ! 1096: if (flexlines >= (local_cursor_vpos + 1)) ! 1097: XClearArea (XXdisplay, XXwindow, ! 1098: XXInternalBorder, ! 1099: local_cursor_vpos*XXfonth+XXInternalBorder, ! 1100: screen_width*XXfontw, ! 1101: (flexlines-local_cursor_vpos) * XXfonth, ! 1102: 0); ! 1103: UNBLOCK_INPUT (); ! 1104: } ! 1105: else { ! 1106: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 1107: XXInternalBorder, ! 1108: (local_cursor_vpos+n)*XXfonth+XXInternalBorder, ! 1109: screen_width*XXfontw, ! 1110: (flexlines-local_cursor_vpos-n)*XXfonth, ! 1111: XXInternalBorder, local_cursor_vpos*XXfonth+XXInternalBorder); ! 1112: ! 1113: XClearArea (XXdisplay, XXwindow, XXInternalBorder, ! 1114: (flexlines-n)*XXfonth+XXInternalBorder, ! 1115: screen_width*XXfontw, ! 1116: n*XXfonth, 0); ! 1117: UNBLOCK_INPUT (); ! 1118: } ! 1119: } ! 1120: ! 1121: /* Substitutes for standard read routine. Under X not interested in individual ! 1122: * bytes but rather individual packets. ! 1123: */ ! 1124: ! 1125: XTread_socket (sd, bufp, numchars) ! 1126: register int sd; ! 1127: register char *bufp; ! 1128: register int numchars; ! 1129: { ! 1130: #ifdef XDEBUG ! 1131: fprintf(stderr,"XTread_socket\n"); ! 1132: #endif ! 1133: ! 1134: return (internal_socket_read (bufp, numchars)); ! 1135: } ! 1136: ! 1137: /* ! 1138: * Interpreting incoming keycodes. Should have table modifiable as needed ! 1139: * from elisp. ! 1140: */ ! 1141: ! 1142: #ifdef sun ! 1143: char *stringFuncVal(keycode) ! 1144: KeySym keycode; ! 1145: { ! 1146: switch (keycode) { ! 1147: case XK_L1: ! 1148: return("192"); ! 1149: case XK_L2: ! 1150: return("193"); ! 1151: case XK_L3: ! 1152: return("194"); ! 1153: case XK_L4: ! 1154: return("195"); ! 1155: case XK_L5: ! 1156: return("196"); ! 1157: case XK_L6: ! 1158: return("197"); ! 1159: case XK_L7: ! 1160: return("198"); ! 1161: case XK_L8: ! 1162: return("199"); ! 1163: case XK_L9: ! 1164: return("200"); ! 1165: case XK_L10: ! 1166: return("201"); ! 1167: ! 1168: case XK_R1: ! 1169: return("208"); ! 1170: case XK_R2: ! 1171: return("209"); ! 1172: case XK_R3: ! 1173: return("210"); ! 1174: case XK_R4: ! 1175: return("211"); ! 1176: case XK_R5: ! 1177: return("212"); ! 1178: case XK_R6: ! 1179: return("213"); ! 1180: case XK_R7: ! 1181: return("214"); ! 1182: case XK_R8: ! 1183: return("215"); ! 1184: case XK_R9: ! 1185: return("216"); ! 1186: case XK_R10: ! 1187: return("217"); ! 1188: case XK_R11: ! 1189: return("218"); ! 1190: case XK_R12: ! 1191: return("219"); ! 1192: case XK_R13: ! 1193: return("220"); ! 1194: case XK_R14: ! 1195: return("221"); ! 1196: case XK_R15: ! 1197: return("222"); ! 1198: ! 1199: case XK_Break: /* Sun3 "Alternate" key */ ! 1200: return("223"); ! 1201: ! 1202: case XK_F1: ! 1203: return("224"); ! 1204: case XK_F2: ! 1205: return("225"); ! 1206: case XK_F3: ! 1207: return("226"); ! 1208: case XK_F4: ! 1209: return("227"); ! 1210: case XK_F5: ! 1211: return("228"); ! 1212: case XK_F6: ! 1213: return("229"); ! 1214: case XK_F7: ! 1215: return("230"); ! 1216: case XK_F8: ! 1217: return("231"); ! 1218: case XK_F9: ! 1219: return("232"); ! 1220: case XK_F10: ! 1221: return("233"); ! 1222: ! 1223: default: ! 1224: return("-1"); ! 1225: } ! 1226: } ! 1227: #else ! 1228: #ifndef AIX ! 1229: char *stringFuncVal(keycode) ! 1230: KeySym keycode; ! 1231: { ! 1232: switch (keycode) { ! 1233: case XK_F1: ! 1234: return("11"); ! 1235: case XK_F2: ! 1236: return("12"); ! 1237: case XK_F3: ! 1238: return("13"); ! 1239: case XK_F4: ! 1240: return("14"); ! 1241: case XK_F5: ! 1242: return("15"); ! 1243: case XK_F6: ! 1244: return("17"); ! 1245: case XK_F7: ! 1246: return("18"); ! 1247: case XK_F8: ! 1248: return("19"); ! 1249: case XK_F9: ! 1250: return("20"); ! 1251: case XK_F10: ! 1252: return("21"); ! 1253: case XK_F11: ! 1254: return("23"); ! 1255: case XK_F12: ! 1256: return("24"); ! 1257: case XK_F13: ! 1258: return("25"); ! 1259: case XK_F14: ! 1260: return("26"); ! 1261: case XK_F15: ! 1262: return("28"); ! 1263: case XK_Help: ! 1264: return("28"); ! 1265: case XK_F16: ! 1266: return("29"); ! 1267: case XK_Menu: ! 1268: return("29"); ! 1269: case XK_F17: ! 1270: return("31"); ! 1271: case XK_F18: ! 1272: return("32"); ! 1273: case XK_F19: ! 1274: return("33"); ! 1275: case XK_F20: ! 1276: return("34"); ! 1277: ! 1278: case XK_Find : ! 1279: return("1"); ! 1280: case XK_Insert: ! 1281: return("2"); ! 1282: case XK_Delete: ! 1283: return("3"); ! 1284: case XK_Select: ! 1285: return("4"); ! 1286: case XK_Prior: ! 1287: return("5"); ! 1288: case XK_Next: ! 1289: return("6"); ! 1290: default: ! 1291: return("-1"); ! 1292: } ! 1293: } ! 1294: #endif /* not AIX */ ! 1295: #endif /* not sun */ ! 1296: ! 1297: internal_socket_read(bufp, numchars) ! 1298: register unsigned char *bufp; ! 1299: register int numchars; ! 1300: { ! 1301: /* Number of keyboard chars we have produced so far. */ ! 1302: int count = 0; ! 1303: int nbytes; ! 1304: char mapping_buf[20]; ! 1305: BLOCK_INPUT_DECLARE (); ! 1306: XEvent event; ! 1307: /* Must be static since data is saved between calls. */ ! 1308: static XComposeStatus status; ! 1309: KeySym keysym; ! 1310: SIGMASKTYPE oldmask; ! 1311: ! 1312: BLOCK_INPUT (); ! 1313: #ifdef BSD ! 1314: #ifndef BSD4_1 ! 1315: oldmask = sigblock (sigmask (SIGALRM)); ! 1316: #endif ! 1317: #endif ! 1318: #ifdef FIOSNBIO ! 1319: /* If available, Xlib uses FIOSNBIO to make the socket ! 1320: non-blocking, and then looks for EWOULDBLOCK. If O_NDELAY is set, FIOSNBIO is ! 1321: ignored, and instead of signalling EWOULDBLOCK, a read returns ! 1322: 0, which Xlib interprets as equivalent to EPIPE. */ ! 1323: fcntl (fileno (stdin), F_SETFL, 0); ! 1324: #endif ! 1325: #ifndef HAVE_SELECT ! 1326: if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY)) ! 1327: { ! 1328: extern int read_alarm_should_throw; ! 1329: read_alarm_should_throw = 1; ! 1330: XPeekEvent (XXdisplay,&event); ! 1331: read_alarm_should_throw = 0; ! 1332: } ! 1333: #endif ! 1334: while (XPending (XXdisplay)) { ! 1335: XNextEvent (XXdisplay,&event); ! 1336: event.type &= 0177; /* Mask out XSendEvent indication */ ! 1337: ! 1338: switch (event.type) { ! 1339: ! 1340: default: ! 1341: break; ! 1342: ! 1343: case MappingNotify: ! 1344: XRefreshKeyboardMapping(&event.xmapping); ! 1345: break; ! 1346: ! 1347: case MapNotify: ! 1348: WindowMapped = 1; ! 1349: break; ! 1350: ! 1351: case UnmapNotify: ! 1352: WindowMapped = 0; ! 1353: break; ! 1354: ! 1355: case ConfigureNotify: ! 1356: if (abs(pixelheight-event.xconfigure.height) >= XXfonth ! 1357: || abs(pixelwidth-event.xconfigure.width) >= XXfontw) ! 1358: { ! 1359: int rows, cols; ! 1360: ! 1361: rows = (event.xconfigure.height-2*XXInternalBorder)/XXfonth; ! 1362: cols = (event.xconfigure.width-2*XXInternalBorder)/XXfontw; ! 1363: pixelwidth = cols*XXfontw+2*XXInternalBorder; ! 1364: pixelheight = rows*XXfonth+2*XXInternalBorder; ! 1365: ! 1366: /* This is absolutely, amazingly gross. However, without ! 1367: it, emacs will core dump if the window gets too small. ! 1368: And uwm is too brain-damaged to handle large minimum size ! 1369: windows. */ ! 1370: if (cols > 11 && rows > 4) ! 1371: /* Delay the change unless Emacs is waiting for input. */ ! 1372: change_screen_size (rows, cols, 0, !waiting_for_input, 1); ! 1373: } ! 1374: break; ! 1375: ! 1376: case Expose: ! 1377: if (!delayed_size_change) ! 1378: dumprectangle (event.xexpose.y-XXInternalBorder, ! 1379: event.xexpose.x-XXInternalBorder, ! 1380: event.xexpose.height, ! 1381: event.xexpose.width); ! 1382: break; ! 1383: ! 1384: case GraphicsExpose: ! 1385: if (!delayed_size_change) ! 1386: dumprectangle (event.xgraphicsexpose.y-XXInternalBorder, ! 1387: event.xgraphicsexpose.x-XXInternalBorder, ! 1388: event.xgraphicsexpose.height, ! 1389: event.xgraphicsexpose.width); ! 1390: break; ! 1391: ! 1392: case NoExpose: ! 1393: break; ! 1394: ! 1395: #if 0 ! 1396: case FocusIn: ! 1397: case FocusOut: ! 1398: case EnterNotify: ! 1399: case LeaveNotify: ! 1400: { ! 1401: int cursor = -1; /* 0=on, 1=off, -1=no change */ ! 1402: ! 1403: if (event.type == FocusIn) cursor = 0; ! 1404: else if (event.type == FocusOut) cursor = 1; ! 1405: else ! 1406: { ! 1407: Window focus; ! 1408: int revert_to; /* dummy return val */ ! 1409: XGetInputFocus (XXdisplay, &focus, &revert_to); ! 1410: if (focus == PointerRoot) ! 1411: cursor = (event.type == LeaveNotify) ? 1 : 0; ! 1412: } ! 1413: if (cursor == -1) break; ! 1414: CursorToggle(); ! 1415: CursorOutline = cursor; ! 1416: CursorToggle(); ! 1417: } ! 1418: #endif ! 1419: case FocusIn: ! 1420: /* [email protected] says adding the following line fixes the ! 1421: problems with grabbing and twm. */ ! 1422: if (event.xfocus.mode == NotifyNormal) ! 1423: x_focus_flag = 1; ! 1424: case EnterNotify: ! 1425: if (event.type == FocusIn || (!x_focus_flag && event.xcrossing.focus)) ! 1426: { ! 1427: CursorToggle (); ! 1428: CursorOutline = 0; ! 1429: CursorToggle (); ! 1430: } ! 1431: break; ! 1432: ! 1433: case FocusOut: ! 1434: x_focus_flag = 0; ! 1435: case LeaveNotify: ! 1436: if (event.type == FocusOut || (!x_focus_flag && event.xcrossing.focus)) ! 1437: { ! 1438: CursorToggle (); ! 1439: CursorOutline = 1; ! 1440: CursorToggle (); ! 1441: } ! 1442: break; ! 1443: ! 1444: case KeyPress: ! 1445: nbytes = XLookupString (&event.xkey, ! 1446: mapping_buf, 20, &keysym, ! 1447: 0); ! 1448: ! 1449: #ifndef AIX ! 1450: /* Someday this will be unnecessary as we will ! 1451: be able to use XRebindKeysym so XLookupString ! 1452: will have already given us the string we want. */ ! 1453: if (IsFunctionKey(keysym) ! 1454: || IsMiscFunctionKey(keysym) ! 1455: || keysym == XK_Prior ! 1456: || keysym == XK_Next) { ! 1457: strcpy(mapping_buf,"["); ! 1458: strcat(mapping_buf,stringFuncVal(keysym)); ! 1459: #ifdef sun ! 1460: strcat(mapping_buf,"z"); ! 1461: #else ! 1462: strcat(mapping_buf,"~"); ! 1463: #endif /* sun */ ! 1464: nbytes = strlen(mapping_buf); ! 1465: } ! 1466: else { ! 1467: #endif /* not AIX */ ! 1468: switch (keysym) { ! 1469: case XK_Left: ! 1470: strcpy(mapping_buf,"\002"); ! 1471: nbytes = 1; ! 1472: break; ! 1473: case XK_Right: ! 1474: strcpy(mapping_buf,"\006"); ! 1475: nbytes = 1; ! 1476: break; ! 1477: case XK_Up: ! 1478: strcpy(mapping_buf,"\020"); ! 1479: nbytes = 1; ! 1480: break; ! 1481: case XK_Down: ! 1482: strcpy(mapping_buf,"\016"); ! 1483: nbytes = 1; ! 1484: break; ! 1485: } ! 1486: #ifndef AIX ! 1487: } ! 1488: #endif /* not AIX */ ! 1489: if (nbytes) { ! 1490: if ((nbytes == 1) && (event.xkey.state & Mod1Mask)) ! 1491: *mapping_buf |= METABIT; ! 1492: if ((nbytes == 1) && (event.xkey.state & ControlMask)) ! 1493: *mapping_buf &= 0x9F; /* mask off bits 1 and 2 */ ! 1494: if (numchars-nbytes > 0) { ! 1495: bcopy (mapping_buf, bufp, nbytes); ! 1496: bufp += nbytes; ! 1497: count += nbytes; ! 1498: numchars -= nbytes; ! 1499: } ! 1500: } ! 1501: break; ! 1502: ! 1503: case ButtonPress: ! 1504: case ButtonRelease: ! 1505: *bufp++ = (char) 'X' & 037; ! 1506: ++count; ! 1507: --numchars; ! 1508: *bufp++ = (char) '@' & 037; ! 1509: ++count; ! 1510: --numchars; ! 1511: if (XXm_queue_num == XMOUSEBUFSIZE) ! 1512: break; ! 1513: XXm_queue[XXm_queue_in] = (XEvent *) malloc (sizeof(XEvent)); ! 1514: *XXm_queue[XXm_queue_in] = event; ! 1515: XXm_queue_num++; ! 1516: XXm_queue_in = (XXm_queue_in + 1) % XMOUSEBUFSIZE; ! 1517: break; ! 1518: } ! 1519: } ! 1520: ! 1521: if (CursorExists) ! 1522: xfixscreen (); ! 1523: ! 1524: #ifdef BSD ! 1525: #ifndef BSD4_1 ! 1526: sigsetmask (oldmask); ! 1527: #endif ! 1528: #endif ! 1529: UNBLOCK_INPUT (); ! 1530: return count; ! 1531: } ! 1532: ! 1533: /* Exit gracefully from gnuemacs, doing an autosave and giving a status. ! 1534: */ ! 1535: ! 1536: XExitGracefully () ! 1537: { ! 1538: XCleanUp(); ! 1539: exit (70); ! 1540: } ! 1541: ! 1542: XIgnoreError () ! 1543: { ! 1544: return 0; ! 1545: } ! 1546: ! 1547: static int server_ping_timer; ! 1548: ! 1549: xfixscreen () ! 1550: { ! 1551: BLOCK_INPUT_DECLARE (); ! 1552: ! 1553: if (server_ping_timer > 0) ! 1554: server_ping_timer--; ! 1555: else ! 1556: { ! 1557: server_ping_timer = 100; ! 1558: ! 1559: /* Yes, this is really what I mean -- Check to see if we've ! 1560: * lost our connection */ ! 1561: ! 1562: BLOCK_INPUT (); ! 1563: XSetErrorHandler(0); ! 1564: XSetIOErrorHandler(0); ! 1565: XNoOp (XXdisplay); ! 1566: XFlush (XXdisplay); ! 1567: XSetErrorHandler(handler); ! 1568: XSetIOErrorHandler(handler); ! 1569: if (!InUpdate && !CursorExists) ! 1570: CursorToggle (); ! 1571: ! 1572: UNBLOCK_INPUT (); ! 1573: } ! 1574: } ! 1575: ! 1576: ! 1577: /* ------------------------------------------------------------ ! 1578: */ ! 1579: static int reversevideo; ! 1580: ! 1581: static int ! 1582: XT_GetDefaults (class) ! 1583: char *class; ! 1584: { ! 1585: register struct _xdeftab *entry; ! 1586: char *iname, *cname; ! 1587: ! 1588: char *disp = 0, *scrn = 0; ! 1589: ! 1590: int len = strlen (CLASS); ! 1591: if (strlen (class) > len) ! 1592: len = strlen (class); ! 1593: ! 1594: /* 100 is bigger than any of the resource names in our fixed set. */ ! 1595: iname = (char *) alloca (len + 100); ! 1596: cname = (char *) alloca (len + 100); ! 1597: ! 1598: XrmInitialize (); ! 1599: ! 1600: /* Merge all databases on root window. */ ! 1601: ! 1602: disp = XResourceManagerString (XXdisplay); ! 1603: if (disp) db = XrmGetStringDatabase (disp); ! 1604: ! 1605: #if (XlibSpecificationRelease >= 5) ! 1606: scrn = XScreenResourceString (ScreenOfDisplay (XXdisplay, XXscreen)); ! 1607: if (scrn) db2 = XrmGetStringDatabase (scrn); ! 1608: ! 1609: /* Screen database takes precedence over global database. */ ! 1610: XrmMergeDatabases (db2, &db); ! 1611: #endif ! 1612: ! 1613: /* ! 1614: * Walk the table reading in the resources. Instance names supersede ! 1615: * class names. ! 1616: */ ! 1617: ! 1618: for (entry = xDefaultsValueTable; entry->iname; entry++) ! 1619: { ! 1620: /* Build the instance name and class name of resource. */ ! 1621: XrmValue value; ! 1622: char *dummy; ! 1623: register char *option; ! 1624: ! 1625: strcpy (iname, class); ! 1626: strcat (iname, "."); ! 1627: strcat (iname, entry->iname); ! 1628: strcpy (cname, CLASS); ! 1629: strcat (cname, "."); ! 1630: strcat (cname, entry->cname); ! 1631: ! 1632: if (XrmGetResource (db, iname, cname, &dummy, &value)) ! 1633: { ! 1634: if (entry->varp) ! 1635: *entry->varp = (char*)value.addr; ! 1636: } ! 1637: else ! 1638: { ! 1639: #ifdef XBACKWARDS ! 1640: if (!(option = XGetDefault (XXdisplay, entry->iname, class))) ! 1641: if (!(option = XGetDefault (XXdisplay, entry->iname, CLASS))) ! 1642: if (!(option = XGetDefault (XXdisplay, entry->cname, class))) ! 1643: option = XGetDefault (XXdisplay, entry->cname, CLASS); ! 1644: #else ! 1645: if (!(option = XGetDefault (XXdisplay, class, entry->iname))) ! 1646: if (!(option = XGetDefault (XXdisplay, CLASS, entry->iname))) ! 1647: if (!(option = XGetDefault (XXdisplay, class, entry->cname))) ! 1648: option = XGetDefault (XXdisplay, CLASS, entry->cname); ! 1649: #endif ! 1650: if (option && entry->varp) ! 1651: *entry->varp = option; ! 1652: } ! 1653: } ! 1654: ! 1655: /* ! 1656: * Now set global variables that aren't character strings; yes it would ! 1657: * be nice to do this automatically as part of the scanning step, but this ! 1658: * is less likely to screw up. The real answer is to use the resource ! 1659: * manager. ! 1660: */ ! 1661: ! 1662: if (temp_reverseVideo) ! 1663: { ! 1664: if (strcmp (temp_reverseVideo, "on") == 0) ! 1665: reversevideo = 1; ! 1666: else if (strcmp (temp_reverseVideo, "off") == 0) ! 1667: reversevideo = 0; ! 1668: } ! 1669: ! 1670: if (temp_borderWidth) ! 1671: XXborder = atoi (temp_borderWidth); ! 1672: ! 1673: if (temp_internalBorder) ! 1674: XXInternalBorder = atoi (temp_internalBorder); ! 1675: ! 1676: if (temp_useBitmap) ! 1677: { ! 1678: if (strcmp (temp_useBitmap, "on") == 0) ! 1679: XXicon_usebitmap = 1; ! 1680: else if (strcmp (temp_useBitmap, "off") == 0) ! 1681: XXicon_usebitmap = 0; ! 1682: } ! 1683: ! 1684: return 0; ! 1685: } ! 1686: ! 1687: x_error_handler (disp, event) ! 1688: Display *disp; ! 1689: XErrorEvent *event; ! 1690: { ! 1691: char msg[200]; ! 1692: XGetErrorText (disp, event->error_code, msg, 200); ! 1693: fprintf (stderr, "Fatal X-windows error: %s\n", msg); ! 1694: Fkill_emacs (make_number (70)); ! 1695: } ! 1696: ! 1697: x_io_error_handler () ! 1698: { ! 1699: int save_errno = errno; ! 1700: if (errno == EPIPE) ! 1701: kill (0, SIGHUP); ! 1702: Fdo_auto_save (); ! 1703: errno = save_errno; ! 1704: perror ("Fatal X-windows I/O error"); ! 1705: kill (0, SIGILL); ! 1706: } ! 1707: ! 1708: x_term_init () ! 1709: { ! 1710: register char *vardisplay; ! 1711: register int xxargc; ! 1712: register char **xxargv; ! 1713: char *ptr; ! 1714: XColor cdef; ! 1715: ! 1716: extern char *getenv (); ! 1717: extern XTinterrupt_signal (); ! 1718: extern char *malloc (); ! 1719: extern Lisp_Object Vxterm, Vxterm1, Qt; ! 1720: extern int XIgnoreError(); ! 1721: int ix; ! 1722: ! 1723: ! 1724: vardisplay = (alternate_display ? alternate_display : ""); ! 1725: if (!vardisplay) { ! 1726: fprintf (stderr, "DISPLAY environment variable must be set\n"); ! 1727: exit (-200); ! 1728: } ! 1729: ! 1730: XXdisplay = XOpenDisplay (vardisplay); ! 1731: if (XXdisplay == (Display *) 0) { ! 1732: fprintf (stderr, "X server not responding. Check your DISPLAY environment variable.\n"); ! 1733: exit (-99); ! 1734: } ! 1735: ! 1736: XXscreen = DefaultScreen (XXdisplay); ! 1737: XXisColor = DisplayCells (XXdisplay, XXscreen) > 2; ! 1738: XXColorMap = DefaultColormap (XXdisplay, XXscreen); ! 1739: ! 1740: XSetErrorHandler (x_error_handler); ! 1741: XSetIOErrorHandler (x_io_error_handler); ! 1742: signal (SIGPIPE, x_io_error_handler); ! 1743: ! 1744: WindowMapped = 0; ! 1745: baud_rate = 9600; ! 1746: min_padding_speed = 10000; ! 1747: must_write_spaces = 1; ! 1748: meta_key = 1; ! 1749: visible_bell = 1; ! 1750: inverse_video = 0; ! 1751: ! 1752: fix_screen_hook = xfixscreen; ! 1753: clear_screen_hook = XTclear_screen; ! 1754: clear_end_of_line_hook = XTclear_end_of_line; ! 1755: ins_del_lines_hook = XTins_del_lines; ! 1756: change_line_highlight_hook = XTchange_line_highlight; ! 1757: insert_chars_hook = XTinsert_chars; ! 1758: output_chars_hook = XToutput_chars; ! 1759: delete_chars_hook = XTdelete_chars; ! 1760: ring_bell_hook = XTfeep; ! 1761: reset_terminal_modes_hook = XTreset_terminal_modes; ! 1762: set_terminal_modes_hook = XTset_terminal_modes; ! 1763: update_begin_hook = XTupdate_begin; ! 1764: update_end_hook = XTupdate_end; ! 1765: set_terminal_window_hook = XTset_terminal_window; ! 1766: read_socket_hook = XTread_socket; ! 1767: move_cursor_hook = XTmove_cursor; ! 1768: reassert_line_highlight_hook = XTreassert_line_highlight; ! 1769: scroll_region_ok = 1; /* we'll scroll partial screens */ ! 1770: char_ins_del_ok = 0; ! 1771: line_ins_del_ok = 1; /* we'll just blt 'em */ ! 1772: fast_clear_end_of_line = 1; /* X does this well */ ! 1773: memory_below_screen = 0; /* we don't remember what scrolls ! 1774: * off the bottom */ ! 1775: dont_calculate_costs = 1; ! 1776: calculate_costs_hook = XTcalculate_costs; ! 1777: ! 1778: /* New options section */ ! 1779: XXborder = 1; ! 1780: XXInternalBorder = 1; ! 1781: screen_width = 80; ! 1782: screen_height = 66; ! 1783: ! 1784: reversevideo = 0; ! 1785: ! 1786: XXdebug = 0; ! 1787: XXm_queue_num = 0; ! 1788: XXm_queue_in = 0; ! 1789: XXm_queue_out = 0; ! 1790: ! 1791: #if 0 ! 1792: handler = XIgnoreError; ! 1793: XSetErrorHandler (handler); ! 1794: XSetIOErrorHandler (handler); ! 1795: #endif ! 1796: ! 1797: desiredwindow = ! 1798: XXcurrentfont = ! 1799: XXidentity = ! 1800: XXicon_name = ! 1801: XXheader = (char *) NULL; ! 1802: ! 1803: XXicon_usebitmap = 0; ! 1804: ! 1805: #ifdef X_DEFAULT_FONT ! 1806: temp_font = X_DEFAULT_FONT; ! 1807: #else ! 1808: temp_font = "fixed"; ! 1809: #endif ! 1810: progname = xargv[0]; ! 1811: if (ptr = rindex(progname, '/')) ! 1812: progname = ptr+1; ! 1813: XXpid = getpid (); ! 1814: default_window = "=80x24+0+0"; ! 1815: ! 1816: #if 0 ! 1817: handler = XIgnoreError; ! 1818: XSetErrorHandler (handler); ! 1819: XSetIOErrorHandler (handler); ! 1820: #endif ! 1821: ! 1822: /* Get resource name and its defaults, it it exists... ! 1823: */ ! 1824: for (ix = 1; ix < xargc && xargv[ix][0] == '-'; ix++) ! 1825: { ! 1826: int valx; ! 1827: ! 1828: if (strcmp(xargv[ix], "-rn") == 0 && ! 1829: (valx = ix + 1) < xargc) ! 1830: { ! 1831: XXidentity = (char *) xmalloc (strlen(xargv[valx]) + 1 ); ! 1832: (void) strcpy(XXidentity, xargv[valx]); ! 1833: ! 1834: break; ! 1835: } ! 1836: } ! 1837: ! 1838: if (!XXidentity) ! 1839: { ! 1840: char *t; ! 1841: ! 1842: if ( (t = getenv("WM_RES_NAME")) != (char *) NULL ) ! 1843: XXidentity = t; ! 1844: ! 1845: if (!XXidentity) ! 1846: { ! 1847: XXidentity = progname; ! 1848: } ! 1849: } ! 1850: ! 1851: if (XXidentity) ! 1852: XT_GetDefaults(XXidentity); ! 1853: else ! 1854: XT_GetDefaults(CLASS); ! 1855: ! 1856: XXpid = getpid (); ! 1857: default_window = "=80x24+0+0"; ! 1858: ! 1859: /* Process X command line args...*/ ! 1860: xxargc = xargc; ! 1861: xxargv = xargv; ! 1862: xxargv++; ! 1863: xxargc--; ! 1864: while (xxargc) { ! 1865: int sargc; ! 1866: sargc = xxargc; ! 1867: if (xxargc && !strcmp (*xxargv, "-r")) { ! 1868: reversevideo = !reversevideo; ! 1869: xxargc--; ! 1870: xxargv++; ! 1871: } ! 1872: if ((xxargc > 1) && (!strcmp (*xxargv, "-font") || ! 1873: !strcmp (*xxargv, "-fn"))) { ! 1874: xxargc--; ! 1875: xxargv++; ! 1876: if (XXcurrentfont != NULL) ! 1877: free(XXcurrentfont); ! 1878: XXcurrentfont = (char *) xmalloc (strlen (*xxargv)+1); ! 1879: strcpy (XXcurrentfont, *xxargv); ! 1880: xxargc--; ! 1881: xxargv++; ! 1882: } ! 1883: if ((xxargc > 1) && !strcmp (*xxargv, "-wn")) { ! 1884: xxargc--; ! 1885: xxargv++; ! 1886: XXheader = (char *) xmalloc (strlen (*xxargv)+1); ! 1887: strcpy (XXheader, *xxargv); ! 1888: xxargc--; ! 1889: xxargv++; ! 1890: } ! 1891: if ((xxargc > 1) && !strcmp (*xxargv, "-in")) { ! 1892: xxargc--; ! 1893: xxargv++; ! 1894: XXicon_name = (char *) xmalloc (strlen (*xxargv)+1); ! 1895: strcpy (XXicon_name, *xxargv); ! 1896: xxargc--; ! 1897: xxargv++; ! 1898: } ! 1899: if (xxargc && !strcmp (*xxargv, "-i")) { ! 1900: xxargc--; ! 1901: xxargv++; ! 1902: XXicon_usebitmap = 1; ! 1903: } ! 1904: if ((xxargc > 1) && !strcmp (*xxargv, "-b")) { ! 1905: xxargc--; ! 1906: xxargv++; ! 1907: XXborder = atoi (*xxargv); ! 1908: xxargc--; ! 1909: xxargv++; ! 1910: } ! 1911: if ((xxargc > 1) && !strcmp (*xxargv, "-ib")) { ! 1912: xxargc--; ! 1913: xxargv++; ! 1914: XXInternalBorder = atoi (*xxargv); ! 1915: xxargc--; ! 1916: xxargv++; ! 1917: } ! 1918: if ((xxargc > 1) && (!strcmp (*xxargv, "-w") || ! 1919: !strcmp (*xxargv, "-geometry"))) { ! 1920: xxargc--; ! 1921: xxargv++; ! 1922: desiredwindow = (char *) xmalloc (strlen (*xxargv)+1); ! 1923: strcpy (desiredwindow, *xxargv); ! 1924: xxargc--; ! 1925: xxargv++; ! 1926: } ! 1927: if (XXisColor) { ! 1928: if ((xxargc > 1 && !strcmp (*xxargv, "-fg"))) { ! 1929: xxargc--; ! 1930: xxargv++; ! 1931: ! 1932: fore_color = ! 1933: (char *) xmalloc (strlen (*xxargv)+1); ! 1934: strcpy (fore_color, *xxargv); ! 1935: ! 1936: xxargc--; ! 1937: xxargv++; ! 1938: } ! 1939: if ((xxargc > 1 && !strcmp (*xxargv, "-bg"))) { ! 1940: xxargc--; ! 1941: xxargv++; ! 1942: ! 1943: back_color = ! 1944: (char *) xmalloc (strlen (*xxargv)+1); ! 1945: strcpy (back_color, *xxargv); ! 1946: ! 1947: xxargc--; ! 1948: xxargv++; ! 1949: } ! 1950: if ((xxargc > 1 && !strcmp (*xxargv, "-bd"))) { ! 1951: xxargc--; ! 1952: xxargv++; ! 1953: ! 1954: brdr_color = ! 1955: (char *) xmalloc (strlen (*xxargv)+1); ! 1956: strcpy (brdr_color, *xxargv); ! 1957: ! 1958: xxargc--; ! 1959: xxargv++; ! 1960: } ! 1961: if ((xxargc > 1 && !strcmp (*xxargv, "-cr"))) { ! 1962: xxargc--; ! 1963: xxargv++; ! 1964: ! 1965: curs_color = ! 1966: (char *) xmalloc (strlen (*xxargv)+1); ! 1967: strcpy (curs_color, *xxargv); ! 1968: ! 1969: xxargc--; ! 1970: xxargv++; ! 1971: } ! 1972: if ((xxargc > 1 && !strcmp (*xxargv, "-ms"))) { ! 1973: xxargc--; ! 1974: xxargv++; ! 1975: ! 1976: mous_color = ! 1977: (char *) xmalloc (strlen (*xxargv)+1); ! 1978: strcpy (mous_color, *xxargv); ! 1979: ! 1980: xxargc--; ! 1981: xxargv++; ! 1982: } ! 1983: } ! 1984: if (sargc == xxargc) { ! 1985: xxargc--; ! 1986: xxargv++; ! 1987: } ! 1988: } ! 1989: ! 1990: /* Now, actually Parse and Set colors... ! 1991: */ ! 1992: if (XXisColor) { ! 1993: if (fore_color || back_color) ! 1994: reversevideo = 0; ! 1995: if (fore_color && ! 1996: XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) && ! 1997: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1998: fore = cdef.pixel; ! 1999: else { ! 2000: fore_color = black_color; ! 2001: fore = BlackPixel (XXdisplay, XXscreen); ! 2002: } ! 2003: ! 2004: if (back_color && ! 2005: XParseColor (XXdisplay, XXColorMap, back_color, &cdef) && ! 2006: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 2007: back = cdef.pixel; ! 2008: else { ! 2009: back_color = white_color; ! 2010: back = WhitePixel (XXdisplay, XXscreen); ! 2011: } ! 2012: ! 2013: if (curs_color && ! 2014: XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) && ! 2015: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 2016: curs = cdef.pixel; ! 2017: else { ! 2018: curs_color = black_color; ! 2019: curs = BlackPixel (XXdisplay, XXscreen); ! 2020: } ! 2021: ! 2022: if (mous_color && ! 2023: XParseColor (XXdisplay, XXColorMap, mous_color, &cdef) && ! 2024: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 2025: ; ! 2026: else mous_color = black_color; ! 2027: ! 2028: if (brdr_color && ! 2029: XParseColor (XXdisplay, XXColorMap, brdr_color, &cdef) && ! 2030: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 2031: brdr = cdef.pixel; ! 2032: else { ! 2033: brdr_color = black_color; ! 2034: brdr = BlackPixel (XXdisplay, XXscreen); ! 2035: } ! 2036: } ! 2037: else { ! 2038: fore_color = curs_color = mous_color = brdr_color ! 2039: = black_color; ! 2040: fore = curs = brdr = BlackPixel (XXdisplay, XXscreen); ! 2041: back_color = white_color; ! 2042: back = WhitePixel (XXdisplay, XXscreen); ! 2043: } ! 2044: ! 2045: ! 2046: if (reversevideo) { ! 2047: int tempcolor; ! 2048: char *tempname; ! 2049: brdr = back; ! 2050: brdr_color = back_color; ! 2051: tempcolor = fore; ! 2052: fore = back; ! 2053: back = tempcolor; ! 2054: tempname = fore_color; ! 2055: fore_color = back_color; ! 2056: back_color = tempname; ! 2057: if (!strcmp (mous_color, back_color)) ! 2058: mous_color = fore_color; ! 2059: else if (!strcmp (mous_color, fore_color)) ! 2060: mous_color = back_color; ! 2061: if (!strcmp (curs_color, back_color)) ! 2062: curs_color = fore_color, curs = fore; ! 2063: else if (!strcmp (curs_color, fore_color)) ! 2064: curs_color = back_color, curs = back; ! 2065: } ! 2066: ! 2067: ! 2068: if (!XXcurrentfont) ! 2069: { ! 2070: XXcurrentfont = (char *) xmalloc (strlen (temp_font) + 1); ! 2071: ! 2072: if (!XXcurrentfont) { ! 2073: fprintf (stderr, "Memory allocation failure.\n"); ! 2074: exit (-150); ! 2075: } ! 2076: ! 2077: strcpy (XXcurrentfont, temp_font); ! 2078: } ! 2079: ! 2080: ! 2081: ! 2082: signal (SIGPIPE, XExitGracefully); ! 2083: ! 2084: #ifndef CANNOT_DUMP ! 2085: if (initialized) ! 2086: #endif /* CANNOT_DUMP */ ! 2087: Vxterm = Qt; ! 2088: ! 2089: Fset (intern ("window-system-version"), make_number (11)); ! 2090: ! 2091: XInitWindow (); ! 2092: ! 2093: keyboard_init_hook = x_init_1; ! 2094: } ! 2095: ! 2096: /* Initialize for keyboard input using X. ! 2097: This is called by init_keyboard via keyboard_init_hook. */ ! 2098: ! 2099: static void ! 2100: x_init_1 () ! 2101: { ! 2102: #ifdef F_SETOWN ! 2103: extern int old_fcntl_owner; ! 2104: #endif ! 2105: ! 2106: dup2 (ConnectionNumber(XXdisplay), 0); ! 2107: #ifndef SYSV_STREAMS ! 2108: /* Streams somehow keeps track of which descriptor number ! 2109: is being used to talk to X. So it is not safe to substitute ! 2110: descriptor 0. But it is safe to make descriptor 0 a copy of it. */ ! 2111: close (ConnectionNumber(XXdisplay)); ! 2112: ConnectionNumber(XXdisplay) = 0; /* Looks a little strange? ! 2113: * check the def of the macro; ! 2114: * it is a genuine lvalue */ ! 2115: #endif ! 2116: ! 2117: #ifdef USG ! 2118: setpgrp (); /* No arguments but equivalent in this case */ ! 2119: #else ! 2120: setpgrp (0, getpid ()); ! 2121: #endif /* USG */ ! 2122: ! 2123: #ifdef F_SETOWN ! 2124: old_fcntl_owner = fcntl (0, F_GETOWN, 0); ! 2125: #ifdef F_SETOWN_SOCK_NEG ! 2126: fcntl (0, F_SETOWN, -getpid ()); /* stdin is a socket here */ ! 2127: #else ! 2128: fcntl (0, F_SETOWN, getpid ()); ! 2129: #endif /* F_SETOWN_SOCK_NEG */ ! 2130: #endif /* F_SETOWN */ ! 2131: ! 2132: /* Enable interrupt_input because otherwise we cannot asynchronously ! 2133: detect C-g sent as a keystroke event from the X server. */ ! 2134: Fset_input_mode (Qt, Qnil, Qnil); ! 2135: } ! 2136: ! 2137: XSetFlash () ! 2138: { ! 2139: ring_bell_hook = XTflash; ! 2140: } ! 2141: ! 2142: XSetFeep () ! 2143: { ! 2144: ring_bell_hook = XTfeep; ! 2145: } ! 2146: ! 2147: ! 2148: /* ------------------------------------------------------------ ! 2149: * Load a font by name. Return the font pointer, or NULL if ! 2150: * it can't be loaded. Do all appropriate calculations. ! 2151: */ ! 2152: static XFontStruct * ! 2153: XT_CalcForFont(fontname) ! 2154: char *fontname; ! 2155: { ! 2156: XFontStruct *fontp; ! 2157: ! 2158: ! 2159: if ( (fontp = XLoadQueryFont(XXdisplay, fontname)) == (XFontStruct *) 0 ) ! 2160: { ! 2161: return (XFontStruct *) NULL; ! 2162: } ! 2163: ! 2164: XXfid = fontp->fid; ! 2165: XXfonth = fontp->ascent + fontp->descent; ! 2166: XXfontw = fontp->max_bounds.width; ! 2167: XXbase = fontp->ascent; ! 2168: ! 2169: return fontp; ! 2170: } ! 2171: ! 2172: ! 2173: /* ------------------------------------------------------------ ! 2174: */ ! 2175: XNewFont (newname) ! 2176: register char *newname; ! 2177: { ! 2178: XFontStruct *temp; ! 2179: BLOCK_INPUT_DECLARE (); ! 2180: ! 2181: BLOCK_INPUT (); ! 2182: XFlush (XXdisplay); ! 2183: ! 2184: ! 2185: temp = XT_CalcForFont(newname); ! 2186: ! 2187: if (temp == (XFontStruct *) NULL) ! 2188: { ! 2189: UNBLOCK_INPUT (); ! 2190: return -1; ! 2191: } ! 2192: ! 2193: XSetFont (XXdisplay, XXgc_norm, XXfid); ! 2194: XSetFont (XXdisplay, XXgc_rev, XXfid); ! 2195: XSetFont (XXdisplay, XXgc_curs, XXfid); ! 2196: XSetFont (XXdisplay, XXgc_curs_rev, XXfid); ! 2197: ! 2198: XFreeFont (XXdisplay, fontinfo); ! 2199: fontinfo = temp; ! 2200: ! 2201: ! 2202: XSetWindowSize(screen_height, screen_width); ! 2203: ! 2204: ! 2205: UNBLOCK_INPUT (); ! 2206: return 0; ! 2207: } ! 2208: ! 2209: /* Flip foreground/background colors */ ! 2210: ! 2211: XFlipColor () ! 2212: { ! 2213: int tempcolor; ! 2214: char *tempname; ! 2215: XColor forec, backc; ! 2216: BLOCK_INPUT_DECLARE (); ! 2217: ! 2218: BLOCK_INPUT (); ! 2219: CursorToggle (); ! 2220: XSetWindowBackground(XXdisplay, XXwindow, fore); ! 2221: if (XXborder) ! 2222: XSetWindowBorder(XXdisplay, XXwindow, back); ! 2223: ! 2224: brdr = back; ! 2225: brdr_color = back_color; ! 2226: tempcolor = fore; ! 2227: fore = back; ! 2228: back = tempcolor; ! 2229: tempname = fore_color; ! 2230: fore_color = back_color; ! 2231: back_color = tempname; ! 2232: XClearArea (XXdisplay, XXwindow, 0, 0, ! 2233: screen_width*XXfontw+2*XXInternalBorder, ! 2234: screen_height*XXfonth+2*XXInternalBorder, 0); ! 2235: ! 2236: XXgc_temp = XXgc_norm; ! 2237: XXgc_norm = XXgc_rev; ! 2238: XXgc_rev = XXgc_temp; ! 2239: ! 2240: if (!strcmp (mous_color, back_color)) ! 2241: mous_color = fore_color; ! 2242: else if (!strcmp (mous_color, fore_color)) ! 2243: mous_color = back_color; ! 2244: ! 2245: x_set_cursor_colors (); ! 2246: ! 2247: XRedrawDisplay (); ! 2248: if (!strcmp (curs_color, back_color)) ! 2249: curs_color = fore_color, curs = fore; ! 2250: else if (!strcmp (curs_color, fore_color)) ! 2251: curs_color = back_color, curs = back; ! 2252: ! 2253: XSetState (XXdisplay, XXgc_curs, back, curs, GXcopy, AllPlanes); ! 2254: XSetState (XXdisplay, XXgc_curs_rev, curs, back, GXcopy, AllPlanes); ! 2255: ! 2256: CursorToggle (); ! 2257: XFlush (XXdisplay); ! 2258: UNBLOCK_INPUT (); ! 2259: } ! 2260: ! 2261: /* ------------------------------------------------------------ ! 2262: */ ! 2263: ! 2264: #define NO_MANAGER 1 ! 2265: ! 2266: ! 2267: /* ------------------------------------------------------------ ! 2268: */ ! 2269: static XClassHint class_hint; ! 2270: ! 2271: ! 2272: static int ! 2273: XT_Set_Class_Hints(w) ! 2274: Window w; ! 2275: { ! 2276: extern char *getenv(); ! 2277: ! 2278: ! 2279: if (XXidentity == (char *) NULL) ! 2280: XXidentity = ""; /* XSCH() doesn't like NULL pointers! */ ! 2281: ! 2282: class_hint.res_name = XXidentity; ! 2283: class_hint.res_class = CLASS; ! 2284: ! 2285: ! 2286: XSetClassHint(XXdisplay, w, &class_hint); ! 2287: } ! 2288: ! 2289: ! 2290: /* ------------------------------------------------------------ ! 2291: */ ! 2292: static int ! 2293: XT_Set_Command_Line(w) ! 2294: Window w; ! 2295: { ! 2296: ! 2297: XSetCommand(XXdisplay, w, xargv, xargc); ! 2298: } ! 2299: ! 2300: ! 2301: /* ------------------------------------------------------------ ! 2302: */ ! 2303: static char hostname[100]; ! 2304: ! 2305: static int ! 2306: XT_Set_Host(w) ! 2307: Window w; ! 2308: { ! 2309: ! 2310: gethostname(hostname, 100); ! 2311: hostname[99] = '\0'; ! 2312: ! 2313: XChangeProperty(XXdisplay, w, XA_WM_CLIENT_MACHINE, XA_STRING, 8, ! 2314: PropModeReplace, ! 2315: (unsigned char *) hostname, strlen(hostname)); ! 2316: } ! 2317: ! 2318: ! 2319: /* ------------------------------------------------------------ ! 2320: * Set header title to window-name (from '-wn'), or if none, ! 2321: * "optional-id: class-of-appl @ host" ! 2322: */ ! 2323: static int ! 2324: XT_Set_Title(w) ! 2325: Window w; ! 2326: { ! 2327: char header_info[200]; ! 2328: ! 2329: ! 2330: if (XXheader != (char *) NULL) ! 2331: { ! 2332: strcpy(header_info, XXheader); ! 2333: } ! 2334: else ! 2335: { ! 2336: char *next; ! 2337: ! 2338: next = header_info; ! 2339: ! 2340: if (strlen(class_hint.res_name) != 0) ! 2341: { ! 2342: sprintf(header_info, "%s: ", ! 2343: class_hint.res_name); ! 2344: ! 2345: next += strlen(header_info); ! 2346: } ! 2347: ! 2348: sprintf(next, "%s @ %s", ! 2349: class_hint.res_class, ! 2350: hostname); ! 2351: } ! 2352: ! 2353: ! 2354: XStoreName(XXdisplay, w, header_info); ! 2355: } ! 2356: ! 2357: ! 2358: /* ------------------------------------------------------------ ! 2359: * Set icon title to icon-name (from '-in'), ! 2360: * or if none, to "invocation-or-class @ host". ! 2361: * ! 2362: */ ! 2363: static int ! 2364: XT_Set_Icon_Title(w) ! 2365: Window w; ! 2366: { ! 2367: char title_info[100]; ! 2368: ! 2369: if (XXicon_name != (char *) NULL) ! 2370: { ! 2371: strcpy(title_info, XXicon_name); ! 2372: } ! 2373: else ! 2374: { ! 2375: if (strlen(class_hint.res_name) != 0) ! 2376: { ! 2377: sprintf(title_info, "%s@", class_hint.res_name); ! 2378: } ! 2379: else ! 2380: { ! 2381: sprintf(title_info, "%s@", class_hint.res_class); ! 2382: } ! 2383: ! 2384: strcat(title_info, hostname); ! 2385: } ! 2386: ! 2387: ! 2388: XChangeProperty(XXdisplay, w, XA_WM_ICON_NAME, XA_STRING, 8, ! 2389: PropModeReplace, ! 2390: (unsigned char *) title_info, strlen(title_info)); ! 2391: } ! 2392: ! 2393: ! 2394: /* Arg PR carries value returned by XGeometry at startup, or 0. */ ! 2395: ! 2396: static int ! 2397: XT_Set_Size_Hints(w, x, y, width, height, do_resize, pr) ! 2398: int x, y; /* only used at Startup: do_resize == FALSE */ ! 2399: int width, height; ! 2400: Window w; ! 2401: Bool do_resize; ! 2402: int pr; ! 2403: { ! 2404: #ifndef X11R4 ! 2405: XSizeHints sizehints; ! 2406: ! 2407: sizehints.flags = (pr & (WidthValue | HeightValue)) ? USSize : PSize; ! 2408: ! 2409: if (!do_resize) ! 2410: sizehints.flags |= (pr & (XValue | YValue)) ? USPosition : PPosition; ! 2411: ! 2412: sizehints.flags |= PResizeInc|PMinSize; ! 2413: ! 2414: ! 2415: sizehints.x = x; ! 2416: sizehints.y = y; ! 2417: sizehints.width = width*XXfontw + 2 * XXInternalBorder; ! 2418: sizehints.height = height*XXfonth + 2 * XXInternalBorder; ! 2419: ! 2420: pixelwidth = sizehints.width; ! 2421: pixelheight = sizehints.height; ! 2422: flexlines = height; ! 2423: ! 2424: ! 2425: change_screen_size (height, width, 0 - (do_resize == False), 0, 0); ! 2426: ! 2427: sizehints.width_inc = XXfontw; ! 2428: sizehints.height_inc = XXfonth; ! 2429: ! 2430: sizehints.min_width = XXfontw*MINWIDTH+2*XXInternalBorder; ! 2431: sizehints.min_height = XXfonth*MINHEIGHT+2*XXInternalBorder; ! 2432: ! 2433: #if 0 ! 2434: /* old, broken versions */ ! 2435: sizehints.min_width = 3 * XXInternalBorder; ! 2436: sizehints.min_height = 3 * XXInternalBorder; ! 2437: #endif ! 2438: ! 2439: XSetNormalHints(XXdisplay, w, &sizehints); ! 2440: ! 2441: if (do_resize) ! 2442: { ! 2443: XResizeWindow(XXdisplay, XXwindow, pixelwidth, pixelheight); ! 2444: XFlush(XXdisplay); ! 2445: } ! 2446: #else /* not X11R4 */ ! 2447: XSizeHints sizehints; ! 2448: XWindowChanges changes; ! 2449: unsigned int change_mask = 0; ! 2450: ! 2451: sizehints.flags = 0; ! 2452: ! 2453: if (! do_resize) { ! 2454: changes.x = x; ! 2455: changes.y = y; ! 2456: sizehints.flags |= (pr & (XValue | YValue)) ? USPosition : PPosition; ! 2457: change_mask |= CWX | CWY; ! 2458: } ! 2459: ! 2460: sizehints.base_width = 2 * XXInternalBorder; ! 2461: sizehints.base_height = 2 * XXInternalBorder; ! 2462: changes.width = sizehints.base_width + width * XXfontw; ! 2463: changes.height = sizehints.base_height + height * XXfonth; ! 2464: sizehints.flags |= ((pr & (WidthValue | HeightValue)) ? USSize : PSize) | ! 2465: PBaseSize; ! 2466: ! 2467: /* If user has specified precise position, ... */ ! 2468: if ((pr & XValue) || (pr & YValue)) ! 2469: { ! 2470: sizehints.flags |= USSize | USPosition | PWinGravity; ! 2471: /* Tell window manager which corner to keep fixed. */ ! 2472: switch (pr & (XNegative | YNegative)) ! 2473: { ! 2474: case 0: ! 2475: sizehints.win_gravity = NorthWestGravity; ! 2476: break; ! 2477: case XNegative: ! 2478: sizehints.win_gravity = NorthEastGravity; ! 2479: break; ! 2480: case YNegative: ! 2481: sizehints.win_gravity = SouthWestGravity; ! 2482: break; ! 2483: default: ! 2484: sizehints.win_gravity = SouthEastGravity; ! 2485: break; ! 2486: } ! 2487: } ! 2488: ! 2489: change_mask |= CWWidth | CWHeight; ! 2490: ! 2491: /* ! 2492: * NOTE: The sizehints.x, sizehints.y, sizehints.width and ! 2493: * sizehints.height fields are OBSOLETE according to the ICCC, and ! 2494: * no window manager should be considering them, even if USSize/PSize ! 2495: * and/or USPosition/PPosition are set. Unfortunately, many ! 2496: * window managers consider them anyway, and programs like xprop ! 2497: * display their values when fetching the normal hints property ! 2498: * from the window. Therefore, I set them here just to make ! 2499: * things a little bit more robust. ! 2500: */ ! 2501: if (! do_resize) { ! 2502: sizehints.x = x; ! 2503: sizehints.y = y; ! 2504: } ! 2505: sizehints.width = changes.width; ! 2506: sizehints.height = changes.height; ! 2507: ! 2508: pixelwidth = sizehints.base_width; ! 2509: pixelheight = sizehints.base_height; ! 2510: flexlines = height; ! 2511: ! 2512: change_screen_size (height, width, 0 - (do_resize == False), 0, 0); ! 2513: ! 2514: sizehints.min_width = XXfontw * MINWIDTH + 2 * XXInternalBorder; ! 2515: sizehints.min_height = XXfonth * MINHEIGHT + 2 * XXInternalBorder; ! 2516: sizehints.flags |= PMinSize; ! 2517: ! 2518: sizehints.width_inc = XXfontw; ! 2519: sizehints.height_inc = XXfonth; ! 2520: sizehints.flags |= PResizeInc; ! 2521: ! 2522: XSetWMNormalHints(XXdisplay, w, &sizehints); ! 2523: XConfigureWindow(XXdisplay, w, change_mask, &changes); ! 2524: #endif /* not X11R4 */ ! 2525: } ! 2526: ! 2527: ! 2528: /* ------------------------------------------------------------ ! 2529: */ ! 2530: /*ARGSUSED*/ ! 2531: static int ! 2532: XT_Set_Zoom_Sizes(w) ! 2533: Window w; ! 2534: { ! 2535: } ! 2536: ! 2537: ! 2538: /* ------------------------------------------------------------ ! 2539: * Set our state and icon parameters. ! 2540: */ ! 2541: static int ! 2542: XT_Set_WM_Hints(w) ! 2543: Window w; ! 2544: { ! 2545: XWMHints wmhints; ! 2546: ! 2547: wmhints.flags = InputHint | StateHint; ! 2548: if (XXicon_usebitmap) ! 2549: wmhints.flags |= IconPixmapHint | IconMaskHint; ! 2550: ! 2551: wmhints.input = True; ! 2552: wmhints.initial_state = NormalState; ! 2553: ! 2554: SinkPixmap = XCreateBitmapFromData (XXdisplay, w, ! 2555: sink_bits, sink_width, ! 2556: sink_height); ! 2557: ! 2558: SinkMaskPixmap = XCreateBitmapFromData (XXdisplay, w, ! 2559: sink_mask_bits, ! 2560: sink_mask_width, ! 2561: sink_mask_height); ! 2562: ! 2563: if (XXicon_usebitmap) { ! 2564: wmhints.icon_pixmap = SinkPixmap; ! 2565: wmhints.icon_mask = SinkMaskPixmap; ! 2566: } ! 2567: else { ! 2568: wmhints.icon_pixmap = 0; ! 2569: wmhints.icon_mask = 0; ! 2570: } ! 2571: ! 2572: XSetWMHints(XXdisplay, w, &wmhints); ! 2573: } ! 2574: ! 2575: ! 2576: /* ------------------------------------------------------------ ! 2577: * Change just the size of the window. ! 2578: */ ! 2579: XSetWindowSize(rows, cols) ! 2580: int rows, cols; ! 2581: { ! 2582: XT_Set_Size_Hints(XXwindow, 0, 0, cols, rows, NO_MANAGER, 0); ! 2583: } ! 2584: ! 2585: ! 2586: /* ------------------------------------------------------------ ! 2587: */ ! 2588: static int ! 2589: XInitWindow () ! 2590: { ! 2591: extern int xargc; ! 2592: extern char **xargv; ! 2593: int x, y, width, height, pr; ! 2594: char *dp; ! 2595: Window desktop; ! 2596: XColor forec, backc; ! 2597: ! 2598: ! 2599: retry: ! 2600: fontinfo = XT_CalcForFont(XXcurrentfont); ! 2601: if (fontinfo == (XFontStruct *) NULL) ! 2602: { ! 2603: if (strcmp (XXcurrentfont, "fixed")) ! 2604: { ! 2605: free (XXcurrentfont); ! 2606: XXcurrentfont = (char *) xmalloc (6); ! 2607: strcpy (XXcurrentfont, "fixed"); ! 2608: goto retry; ! 2609: } ! 2610: fatal ("X server unable to find requested font `%s'\n", ! 2611: (XXcurrentfont == NULL) ? "(null)" : XXcurrentfont); ! 2612: } ! 2613: ! 2614: pr = XGeometry (XXdisplay, 0, desiredwindow, default_window, ! 2615: XXborder, XXfontw, XXfonth, ! 2616: XXInternalBorder*2, XXInternalBorder*2, ! 2617: &x, &y, &width, &height); ! 2618: ! 2619: /* Which desktop do we start up on? ! 2620: */ ! 2621: if ( (dp = getenv("WM_DESKTOP")) != (char *) NULL ) ! 2622: { ! 2623: desktop = atoi(dp); ! 2624: } ! 2625: else ! 2626: { ! 2627: desktop = RootWindow(XXdisplay, DefaultScreen(XXdisplay)); ! 2628: } ! 2629: ! 2630: XXwindow = XCreateSimpleWindow(XXdisplay, desktop, ! 2631: x, y, ! 2632: width*XXfontw + 2*XXInternalBorder, ! 2633: height*XXfonth + 2*XXInternalBorder, ! 2634: XXborder, brdr, back); ! 2635: if (!XXwindow) ! 2636: { ! 2637: fprintf (stderr, "Could not create X window!\n"); ! 2638: fflush (stderr); ! 2639: exit (-97); ! 2640: } ! 2641: ! 2642: XXgcv.font = XXfid; ! 2643: XXgcv.foreground = fore; ! 2644: XXgcv.background = back; ! 2645: XXgc_norm = XCreateGC(XXdisplay, XXwindow, ! 2646: GCFont|GCForeground|GCBackground, ! 2647: &XXgcv); ! 2648: XXgcv.foreground = back; ! 2649: XXgcv.background = fore; ! 2650: XXgc_rev = XCreateGC(XXdisplay, XXwindow, ! 2651: GCFont|GCForeground|GCBackground, ! 2652: &XXgcv); ! 2653: XXgcv.foreground = back; ! 2654: XXgcv.background = curs; ! 2655: XXgc_curs = XCreateGC(XXdisplay, XXwindow, ! 2656: GCFont|GCForeground|GCBackground, ! 2657: &XXgcv); ! 2658: XXgcv.foreground = curs; ! 2659: XXgcv.background = back; ! 2660: XXgc_curs_rev = XCreateGC(XXdisplay, XXwindow, ! 2661: GCFont|GCForeground|GCBackground, ! 2662: &XXgcv); ! 2663: ! 2664: EmacsCursor = XCreateFontCursor(XXdisplay, XC_left_ptr); ! 2665: ! 2666: x_set_cursor_colors (); ! 2667: ! 2668: XDefineCursor (XXdisplay, XXwindow, EmacsCursor); ! 2669: ! 2670: CursorExists = 0; ! 2671: CursorOutline = 1; ! 2672: VisibleX = 0; ! 2673: VisibleY = 0; ! 2674: ! 2675: ! 2676: XT_Set_Class_Hints(XXwindow); ! 2677: XT_Set_Command_Line(XXwindow); ! 2678: XT_Set_Host(XXwindow); ! 2679: XT_Set_Title(XXwindow); ! 2680: XT_Set_Icon_Title(XXwindow); ! 2681: XT_Set_Size_Hints(XXwindow, x, y, width, height, False, pr); ! 2682: XT_Set_Zoom_Sizes(XXwindow); ! 2683: XT_Set_WM_Hints(XXwindow); ! 2684: ! 2685: XSelectInput(XXdisplay, XXwindow, KeyPressMask | ! 2686: ExposureMask | ButtonPressMask | ButtonReleaseMask | ! 2687: EnterWindowMask | LeaveWindowMask | FocusChangeMask | ! 2688: StructureNotifyMask); ! 2689: ! 2690: XMapWindow (XXdisplay, XXwindow); ! 2691: XFlush (XXdisplay); ! 2692: ! 2693: #ifdef AIX ! 2694: #include "xkeys-aix.h" ! 2695: #endif /* AIX */ ! 2696: ! 2697: /* Free XrmGetStringDatabase */ ! 2698: ! 2699: #ifndef NO_X_DESTROY_DATABASE ! 2700: XrmDestroyDatabase (db); ! 2701: #if (XlibSpecificationRelease >= 5) ! 2702: XrmDestroyDatabase (db2); ! 2703: #endif ! 2704: #endif ! 2705: } ! 2706: ! 2707: #endif /* HAVE_X_WINDOWS */ ! 2708: ! 2709: /*#include "xundebug.h"*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.