|
|
1.1 ! root 1: #define BIGDEBUG ! 2: /* X Communication module for terminals which understand the X protocol. ! 3: Copyright (C) 1985, 1986 Free Software Foundation, Inc. ! 4: ! 5: This file is part of GNU Emacs. ! 6: ! 7: GNU Emacs is distributed in the hope that it will be useful, ! 8: but WITHOUT ANY WARRANTY. No author or distributor ! 9: accepts responsibility to anyone for the consequences of using it ! 10: or for whether it serves any particular purpose or works at all, ! 11: unless he says so in writing. Refer to the GNU Emacs General Public ! 12: License for full details. ! 13: ! 14: Everyone is granted permission to copy, modify and redistribute ! 15: GNU Emacs, but only under the conditions described in the ! 16: GNU Emacs General Public License. A copy of this license is ! 17: supposed to have been given to you along with GNU Emacs so you ! 18: can know your rights and responsibilities. It should be in a ! 19: file named COPYING. Among other things, the copyright notice ! 20: and this notice must be preserved on all copies. */ ! 21: ! 22: /* Written by Yakim Martillo, mods and things by Robert Krawitz */ ! 23: /* Redone for X11 by Robert French */ ! 24: ! 25: /* ! 26: * $Source: /@/orpheus/u1/X11/clients/emacs/RCS/xterm.c,v $ ! 27: * $Author: newman $ ! 28: * $Locker: $ ! 29: * $Header: xterm.c,v 1.2 87/09/12 16:34:06 newman Exp $ ! 30: */ ! 31: ! 32: #ifndef lint ! 33: static char *rcsid_xterm_c = "$Header: xterm.c,v 1.2 87/09/12 16:34:06 newman Exp $"; ! 34: #endif lint ! 35: ! 36: #include "config.h" ! 37: ! 38: #ifdef HAVE_X_WINDOWS ! 39: ! 40: #include "lisp.h" ! 41: #undef NULL ! 42: ! 43: /* On 4.3 this loses if it comes after xterm.h. */ ! 44: #include <signal.h> ! 45: ! 46: /* This may include sys/types.h, and that somehow loses ! 47: * if this is not done before the other system files. */ ! 48: ! 49: /*#include "xdebug.h"*/ ! 50: ! 51: #include "xterm.h" ! 52: ! 53: /* Load sys/types.h if not already loaded. ! 54: In some systems loading it twice is suicidal. */ ! 55: #ifndef makedev ! 56: #include <sys/types.h> ! 57: #endif ! 58: ! 59: #include <sys/time.h> ! 60: #include <sys/ioctl.h> ! 61: #include <fcntl.h> ! 62: #include <stdio.h> ! 63: #include <ctype.h> ! 64: #include <errno.h> ! 65: #ifdef BSD ! 66: #include <strings.h> ! 67: #endif ! 68: #include <sys/stat.h> ! 69: ! 70: #include "dispextern.h" ! 71: #include "termhooks.h" ! 72: #include "termopts.h" ! 73: #include "termchar.h" ! 74: #include "sink.h" ! 75: #include "sinkmask.h" ! 76: ! 77: #define min(a,b) ((a)<(b) ? (a) : (b)) ! 78: #define max(a,b) ((a)>(b) ? (a) : (b)) ! 79: #define sigunblockx(sig) sigblock (0) ! 80: #define sigblockx(sig) sigblock (1 << ((sig) - 1)) ! 81: ! 82: #define METABIT 0200 ! 83: #define MINWIDTH 12 ! 84: #define MINHEIGHT 5 ! 85: ! 86: int pixelwidth; ! 87: int pixelheight; ! 88: char *progname; ! 89: ! 90: XEvent *XXm_queue[XMOUSEBUFSIZE]; ! 91: int XXm_queue_num; ! 92: char *XXcurrentfont; ! 93: XFontStruct *fontinfo; ! 94: Font XXfid; ! 95: int XXfontw,XXfonth,XXbase,XXisColor; ! 96: Colormap XXColorMap; ! 97: char *default_window; ! 98: int configure_pending; ! 99: extern struct display_line *DesiredScreen[], *PhysScreen[]; ! 100: extern int initialized; ! 101: ! 102: extern char *alternate_display; ! 103: ! 104: int XXdebug; ! 105: int XXpid; ! 106: extern int screen_garbaged; ! 107: int XXxoffset, XXyoffset; ! 108: ! 109: int WindowMapped; ! 110: ! 111: static int flexlines; /* last line affected by dellines or */ ! 112: /* inslines functions */ ! 113: extern int errno; ! 114: int VisibleX, VisibleY; /* genuine location of cursor on screen */ ! 115: /* if it is there */ ! 116: static int SavedX, SavedY; /* Where the cursor was before update */ ! 117: /* started */ ! 118: ! 119: int CursorExists; /* during updates cursor is turned off */ ! 120: static int InUpdate; /* many of functions here may be invoked */ ! 121: /* even if no update in progress, when */ ! 122: /* no update is in progress the action */ ! 123: /* can be slightly different */ ! 124: ! 125: Display *XXdisplay; ! 126: Window XXwindow; ! 127: GC XXgc_norm,XXgc_rev,XXgc_curs,XXgc_temp; ! 128: XGCValues XXgcv; ! 129: Cursor EmacsCursor; ! 130: Pixmap SinkPixmap, SinkMaskPixmap; ! 131: ! 132: char *fore_color; /* Variables to store colors */ ! 133: char *back_color; ! 134: char *brdr_color; ! 135: char *curs_color; ! 136: char *mous_color; ! 137: ! 138: unsigned long fore; ! 139: unsigned long back; ! 140: unsigned long brdr; ! 141: unsigned long curs; ! 142: unsigned long mous; ! 143: ! 144: char *desiredwindow; ! 145: ! 146: int CurHL; /* Current Highlighting actually being */ ! 147: /* being used for bold font right now*/ ! 148: ! 149: int XXborder; ! 150: int XXInternalBorder; ! 151: ! 152: int (*handler)(); ! 153: ! 154: char *rindex(); ! 155: ! 156: extern Display *XOpenDisplay (); ! 157: extern Window XCreateSimpleWindow(); ! 158: extern XFontStruct *XLoadQueryFont(); ! 159: ! 160: #ifdef BIGDEBUG ! 161: char debug_string[500000]; ! 162: #endif BIGDEBUG ! 163: ! 164: /* HLmode -- Changes the GX function for output strings. Could be used to ! 165: * change font. Check an XText library function call. ! 166: */ ! 167: ! 168: HLmode (new) ! 169: int new; ! 170: { ! 171: CurHL = new; ! 172: } ! 173: ! 174: ! 175: /* External interface to control of standout mode. ! 176: Call this when about to modify line at position VPOS ! 177: and not change whether it is highlighted. */ ! 178: ! 179: XTreassert_line_highlight (highlight, vpos) ! 180: int highlight, vpos; ! 181: { ! 182: HLmode (highlight); ! 183: } ! 184: ! 185: /* Call this when about to modify line at position VPOS ! 186: and change whether it is highlighted. */ ! 187: ! 188: XTchange_line_highlight (new_highlight, vpos, first_unused_hpos) ! 189: int new_highlight, vpos, first_unused_hpos; ! 190: { ! 191: HLmode (new_highlight); ! 192: XTtopos (vpos, 0); ! 193: XTclear_end_of_line (0); ! 194: } ! 195: ! 196: ! 197: /* Used for starting or restarting (after suspension) the X window. Puts the ! 198: * cursor in a known place, update does not begin with this routine but only ! 199: * with a call to DoDsp. ! 200: */ ! 201: ! 202: XTset_terminal_modes () ! 203: { ! 204: int stuffpending; ! 205: #ifdef XDEBUG ! 206: fprintf (stderr, "XTset_terminal_modes\n"); ! 207: #endif ! 208: ! 209: InUpdate = 0; ! 210: stuffpending = 0; ! 211: if (!initialized) { ! 212: CursorExists = 0; ! 213: VisibleX = 0; ! 214: VisibleY = 0; ! 215: } ! 216: XTclear_screen (); ! 217: ! 218: #ifdef FIONREAD ! 219: ioctl (0, FIONREAD, &stuffpending); ! 220: if (stuffpending) ! 221: read_events_block (); ! 222: #endif ! 223: ! 224: } ! 225: ! 226: /* XTtopos moves the cursor to the correct location and checks whether an ! 227: * update is in progress in order to toggle it on. ! 228: */ ! 229: ! 230: XTtopos (row, col) ! 231: register int row, col; ! 232: { ! 233: int mask = sigblock (sigmask (SIGIO)); ! 234: #ifdef XDEBUG ! 235: fprintf (stderr, "XTtopos (X %d, Y %d)\n",col,row); ! 236: #endif ! 237: ! 238: cursX = col; ! 239: cursY = row; ! 240: ! 241: if (InUpdate) { ! 242: if (CursorExists) ! 243: CursorToggle (); ! 244: sigsetmask (mask); ! 245: return; ! 246: /* Generally, XTtopos will be invoked */ ! 247: /* when InUpdate with !CursorExists */ ! 248: /* so that wasteful XFlush is not called */ ! 249: } ! 250: if ((row == VisibleY) && (col == VisibleX)) { ! 251: if (!CursorExists) ! 252: CursorToggle (); ! 253: XFlush (XXdisplay); ! 254: sigsetmask (mask); ! 255: return; ! 256: } ! 257: if (CursorExists) ! 258: CursorToggle (); ! 259: VisibleX = col; ! 260: VisibleY = row; ! 261: if (!CursorExists) ! 262: CursorToggle (); ! 263: XFlush (XXdisplay); ! 264: sigsetmask (mask); ! 265: } ! 266: ! 267: /* Used to get the terminal back to a known state after resets. Usually ! 268: * used when restarting suspended or waiting emacs ! 269: */ ! 270: ! 271: cleanup () ! 272: { ! 273: inverse_video = 0; ! 274: HLmode (0); ! 275: } ! 276: ! 277: /* wipes out numcols columns starting a current column on the current line */ ! 278: ! 279: XTclear_end_of_line (first_blank) ! 280: register int first_blank; ! 281: { ! 282: register int numcols; ! 283: int mask; ! 284: ! 285: #ifdef XDEBUG ! 286: fprintf (stderr, "XTclear_end_of_line (blank %d)\n",first_blank); ! 287: #endif ! 288: ! 289: if (cursY < 0 || cursY >= screen_height) ! 290: return; ! 291: ! 292: #ifdef notdef ! 293: if (first_blank >= screen_width) ! 294: return; ! 295: ! 296: if (first_blank < 0) ! 297: first_blank = 0; ! 298: #endif notdef ! 299: ! 300: mask = sigblock (sigmask (SIGIO)); ! 301: numcols = screen_width - cursX; ! 302: if (cursY == VisibleY && VisibleX >= first_blank && CursorExists) ! 303: CursorToggle (); ! 304: ! 305: if (CurHL) ! 306: XFillRectangle (XXdisplay, XXwindow, XXgc_norm, ! 307: cursX*XXfontw+XXInternalBorder, ! 308: cursY*XXfonth+XXInternalBorder, ! 309: XXfontw*numcols, ! 310: XXfonth); ! 311: else ! 312: XClearArea (XXdisplay, XXwindow, ! 313: cursX*XXfontw+XXInternalBorder, ! 314: cursY*XXfonth+XXInternalBorder, ! 315: XXfontw*numcols, ! 316: XXfonth, ! 317: 0); ! 318: XTtopos (cursY, first_blank); ! 319: sigsetmask (mask); ! 320: } ! 321: ! 322: XTreset_terminal_modes () ! 323: { ! 324: #ifdef XDEBUG ! 325: fprintf (stderr, "XTreset_terminal_modes\n"); ! 326: #endif ! 327: ! 328: XTclear_screen (); ! 329: } ! 330: ! 331: XTclear_screen () ! 332: { ! 333: int mask = sigblock (sigmask (SIGIO)); ! 334: ! 335: #ifdef XDEBUG ! 336: fprintf (stderr, "XTclear_screen\n"); ! 337: #endif ! 338: ! 339: HLmode (0); ! 340: CursorExists = 0; ! 341: ! 342: cursX = 0; ! 343: cursY = 0; ! 344: SavedX = 0; ! 345: SavedY = 0; ! 346: VisibleX = 0; ! 347: VisibleY = 0; ! 348: XClearWindow(XXdisplay, XXwindow); ! 349: CursorToggle (); ! 350: if (!InUpdate) ! 351: XFlush (XXdisplay); ! 352: sigsetmask (mask); ! 353: } ! 354: ! 355: /* used by dumprectangle which is usually invoked upon Expose ! 356: * events which come from bit blt's or moving an obscuring opaque window ! 357: */ ! 358: ! 359: dumpchars (ActiveScreen, numcols, tempX, tempY, tempHL) ! 360: register struct display_line **ActiveScreen; ! 361: register int numcols; ! 362: register int tempX, tempY, tempHL; ! 363: { ! 364: if (numcols <= 0) ! 365: return; ! 366: ! 367: if (numcols-1+tempX > screen_width) ! 368: numcols = screen_width-tempX+1; ! 369: ! 370: if (tempX < 0 || tempX >= screen_width || ! 371: tempY < 0 || tempY >= screen_height) ! 372: return; ! 373: ! 374: XDrawImageString(XXdisplay, XXwindow, tempHL ? XXgc_rev : XXgc_norm, ! 375: tempX*XXfontw+XXInternalBorder, ! 376: tempY*XXfonth+XXInternalBorder+XXbase, ! 377: &ActiveScreen[tempY+1]->body[tempX], ! 378: numcols); ! 379: } ! 380: ! 381: /* When a line has been changed this function is called. X is so fast ! 382: * that the actual sequence is ignore. Rather, the new version of the ! 383: * line is simply output if this function is invoked while in UpDate. ! 384: * Sometimes writechars can be invoked when not in update if text is to ! 385: * be output at the end of the line. In this case the whole line is not ! 386: * output. Simply the new text at the current cursor position given ! 387: * by VisibleX,Y. The cursor is moved to the end of the new text. ! 388: */ ! 389: ! 390: writechars (start, end) ! 391: register char *start, *end; ! 392: { ! 393: int mask = sigblock (sigmask (SIGIO)); ! 394: ! 395: if (cursY < 0 || cursY >= screen_height) { ! 396: sigsetmask (mask); ! 397: return; ! 398: } ! 399: ! 400: if (CursorExists) ! 401: CursorToggle (); ! 402: ! 403: if (cursY < 0 || cursY >= screen_height || ! 404: cursX < 0 || cursX >= screen_width) { ! 405: sigsetmask (mask); ! 406: return; ! 407: } ! 408: ! 409: if (end-start+cursX >= screen_width) ! 410: end = start+screen_width-cursX -1; ! 411: ! 412: if (end >= start) { ! 413: if (start) ! 414: XDrawImageString(XXdisplay, XXwindow, ! 415: CurHL ? XXgc_rev : XXgc_norm, ! 416: cursX * XXfontw+XXInternalBorder, ! 417: cursY * XXfonth+XXInternalBorder+XXbase, ! 418: start, ! 419: end-start+1); ! 420: else ! 421: if (CurHL) ! 422: XFillRectangle (XXdisplay, XXwindow, XXgc_norm, ! 423: cursX*XXfontw+XXInternalBorder, ! 424: cursY*XXfonth+XXInternalBorder, ! 425: (end-start+1)*XXfontw, ! 426: XXfonth); ! 427: else ! 428: XClearArea (XXdisplay, XXwindow, ! 429: cursX*XXfontw+XXInternalBorder, ! 430: cursY*XXfonth+XXInternalBorder, ! 431: (end-start+1)*XXfontw, ! 432: XXfonth,0); ! 433: VisibleX = cursX+end-start+1; ! 434: if (InUpdate) ! 435: cursX = VisibleX; ! 436: } ! 437: if (!InUpdate && !CursorExists) ! 438: CursorToggle(); ! 439: sigsetmask (mask); ! 440: } ! 441: ! 442: static ! 443: XTwrite_chars (start, len) ! 444: register char *start; ! 445: register int len; ! 446: { ! 447: #ifdef XDEBUG ! 448: fprintf (stderr, "XTwrite_chars (len %d)\n",len); ! 449: #endif ! 450: ! 451: writechars (start, start+len-1); ! 452: } ! 453: ! 454: /* The following routine is for the deaf or for the pervert who prefers ! 455: * that his terminal flashes at him rather than beep at him. ! 456: */ ! 457: ! 458: static int flashedback; ! 459: ! 460: XTflash () ! 461: { ! 462: XGCValues gcv_temp; ! 463: struct itimerval itimer; ! 464: int mask = sigblock (sigmask (SIGIO)); ! 465: ! 466: extern int flashback (); ! 467: ! 468: #ifdef XDEBUG ! 469: fprintf (stderr, "XTflash\n"); ! 470: #endif ! 471: ! 472: XXgc_temp = XCreateGC(XXdisplay, XXwindow, 0, &gcv_temp); ! 473: XSetState(XXdisplay, XXgc_temp, WhitePixel(XXdisplay,0), ! 474: BlackPixel(XXdisplay,0), GXinvert, ! 475: AllPlanes); ! 476: ! 477: signal (SIGALRM, flashback); ! 478: getitimer (ITIMER_REAL, &itimer); ! 479: itimer.it_value.tv_usec += 250000; ! 480: itimer.it_interval.tv_sec = 0; ! 481: itimer.it_interval.tv_usec = 0; ! 482: flashedback = 0; ! 483: ! 484: setitimer (ITIMER_REAL, &itimer, 0); ! 485: ! 486: XFillRectangle (XXdisplay, XXwindow, XXgc_temp, 0, 0, ! 487: screen_width*XXfontw+2*XXInternalBorder, ! 488: screen_height*XXfonth+2*XXInternalBorder); ! 489: XFlush (XXdisplay); ! 490: ! 491: sigsetmask (mask); ! 492: ! 493: while (!flashedback) ! 494: pause (); ! 495: ! 496: XFreeGC(XXdisplay, XXgc_temp); ! 497: } ! 498: ! 499: flashback () ! 500: { ! 501: int mask = sigblock (sigmask (SIGIO) | sigmask (SIGALRM)); ! 502: ! 503: XFillRectangle (XXdisplay, XXwindow, XXgc_temp, 0, 0, ! 504: screen_width*XXfontw+2*XXInternalBorder, ! 505: screen_height*XXfonth+2*XXInternalBorder); ! 506: XFlush (XXdisplay); ! 507: ! 508: flashedback = 1; ! 509: sigsetmask (mask); ! 510: } ! 511: ! 512: XTfeep () ! 513: { ! 514: int mask = sigblock (sigmask (SIGIO)); ! 515: #ifdef XDEBUG ! 516: fprintf (stderr, "XTfeep\n"); ! 517: #endif ! 518: XBell (XXdisplay,50); ! 519: sigsetmask (mask); ! 520: } ! 521: ! 522: /* Artificially creating a cursor is hard, the actual position on the ! 523: * screen (either where it is or last was) is tracked with VisibleX,Y. ! 524: * Gnu Emacs code tends to assume a cursor exists in hardward at cursX,Y ! 525: * and that output text will appear there. During updates, the cursor is ! 526: * supposed to be blinked out and will only reappear after the update ! 527: * finishes. ! 528: */ ! 529: ! 530: CursorToggle () ! 531: { ! 532: register struct display_line **ActiveScreen; ! 533: ! 534: if (!WindowMapped) { ! 535: CursorExists = 0; ! 536: return 0; ! 537: /* Currently the return values are not */ ! 538: /* used, but I could anticipate using */ ! 539: /* them in the future. */ ! 540: } ! 541: ! 542: if (VisibleX < 0 || VisibleX >= screen_width || ! 543: VisibleY < 0 || VisibleY >= screen_height) { ! 544: /* Not much can be done */ ! 545: XFlush (XXdisplay); ! 546: CursorExists = 0; ! 547: return 0; ! 548: } ! 549: ! 550: ActiveScreen = PhysScreen; ! 551: ! 552: if (ActiveScreen && ActiveScreen[VisibleY+1] && ! 553: VisibleX < ActiveScreen[VisibleY+1]->length) ! 554: if (CursorExists) ! 555: XDrawImageString(XXdisplay, XXwindow, XXgc_norm, ! 556: VisibleX*XXfontw+XXInternalBorder, ! 557: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 558: &ActiveScreen[VisibleY+1]->body[VisibleX], ! 559: 1); ! 560: else ! 561: XDrawImageString(XXdisplay, XXwindow, XXgc_curs, ! 562: VisibleX*XXfontw+XXInternalBorder, ! 563: VisibleY*XXfonth+XXInternalBorder+XXbase, ! 564: &ActiveScreen[VisibleY+1]->body[VisibleX], ! 565: 1); ! 566: else ! 567: if (CursorExists) ! 568: XClearArea (XXdisplay, XXwindow, ! 569: VisibleX*XXfontw+XXInternalBorder, ! 570: VisibleY*XXfonth+XXInternalBorder, ! 571: XXfontw, XXfonth, 0); ! 572: else ! 573: XFillRectangle (XXdisplay, XXwindow, XXgc_norm, ! 574: VisibleX*XXfontw+XXInternalBorder, ! 575: VisibleY*XXfonth+XXInternalBorder, ! 576: XXfontw, XXfonth); ! 577: ! 578: CursorExists = !CursorExists; ! 579: ! 580: if (!InUpdate) ! 581: XFlush (XXdisplay); ! 582: ! 583: return 1; ! 584: } ! 585: ! 586: /* This routine is used by routines which are called to paint regions */ ! 587: /* designated by Expose events. If the cursor may be in the exposed */ ! 588: /* region, this routine makes sure it is gone so that dumprectangle can */ ! 589: /* toggle it back into existance if dumprectangle is invoked when not in */ ! 590: /* the midst of a screen update. */ ! 591: ! 592: static ! 593: ClearCursor () ! 594: { ! 595: int mask = sigblock (sigmask (SIGIO)); ! 596: ! 597: if (!WindowMapped) { ! 598: CursorExists = 0; ! 599: sigsetmask (mask); ! 600: return; ! 601: } ! 602: ! 603: if (VisibleX < 0 || VisibleX >= screen_width || ! 604: VisibleY < 0 || VisibleY >= screen_height) { ! 605: /* Not much can be done */ ! 606: CursorExists = 0; ! 607: sigsetmask (mask); ! 608: return; ! 609: } ! 610: ! 611: XClearArea (XXdisplay, XXwindow, ! 612: VisibleX*XXfontw+XXInternalBorder, ! 613: VisibleY*XXfonth+XXInternalBorder, ! 614: XXfontw, XXfonth, 0); ! 615: ! 616: CursorExists = 0; ! 617: sigsetmask (mask); ! 618: } ! 619: ! 620: XTupdate_begin () ! 621: { ! 622: int mask = sigblock (sigmask (SIGIO)); ! 623: ! 624: #ifdef XDEBUG ! 625: fprintf (stderr, "XTupdate_begin\n"); ! 626: #endif ! 627: ! 628: InUpdate = 1; ! 629: if (CursorExists) ! 630: CursorToggle (); ! 631: ! 632: SavedX = cursX; ! 633: SavedY = cursY; ! 634: /* Thw initial "hardware" cursor position is */ ! 635: /* saved because that is where gnu emacs */ ! 636: /* expects the cursor to be at the end of */ ! 637: /* the update */ ! 638: ! 639: sigsetmask (mask); ! 640: } ! 641: ! 642: XTupdate_end () ! 643: { ! 644: int mask = sigblock (sigmask (SIGIO)); ! 645: ! 646: #ifdef XDEBUG ! 647: fprintf (stderr, "XTupdate_end\n"); ! 648: #endif ! 649: ! 650: if (CursorExists) ! 651: CursorToggle (); ! 652: ! 653: InUpdate = 0; ! 654: XTtopos (SavedY, SavedX); /* XTtopos invokes cursor toggle */ ! 655: XFlush (XXdisplay); ! 656: sigsetmask (mask); ! 657: } ! 658: ! 659: /* Used for Expose events. Have to get the text ! 660: * back into the newly blank areas. ! 661: */ ! 662: ! 663: dumprectangle (top, left, rows, cols) ! 664: register int top, left, rows, cols; ! 665: { ! 666: register struct display_line **ActiveScreen; ! 667: register int ourindex; ! 668: int localX, localY, localHL; ! 669: ! 670: rows += top; ! 671: cols += left; ! 672: top /= XXfonth; ! 673: /* Get row and col containing up and */ ! 674: /* left borders of exposed region -- */ ! 675: /* round down here*/ ! 676: left /= XXfontw; ! 677: rows += XXfonth-1; ! 678: cols += XXfontw-1; ! 679: rows /= XXfonth; ! 680: /* Get row and col containing bottom and */ ! 681: /* right borders -- round up here */ ! 682: rows -= top; ! 683: cols /= XXfontw; ! 684: cols -= left; ! 685: ! 686: if (rows < 0) ! 687: return; ! 688: if (cols < 0) ! 689: return; ! 690: if (top > screen_height - 1) ! 691: return; ! 692: if (left > screen_width - 1) ! 693: return; ! 694: if (VisibleX >= left && VisibleX < left + cols && ! 695: VisibleY >= top && VisibleY < top + rows) ! 696: ClearCursor (); ! 697: ! 698: if (InUpdate && DesiredScreen) ! 699: ActiveScreen = DesiredScreen; ! 700: else ! 701: if (PhysScreen) ! 702: /* When queue is dumped in update this */ ! 703: ActiveScreen = PhysScreen; ! 704: else ! 705: return; ! 706: ! 707: /* should perhaps be DesiredScreen */ ! 708: /* but PhysScreen is guaranteed to contain */ ! 709: /* data which was good for every line on */ ! 710: /* screen. For desired screen only for */ ! 711: /* lines which are changing. Emacs does */ ! 712: /* not consider a line within a newly */ ! 713: /* exposed region necessarily to have */ ! 714: /* been changed. Emacs knows nothing */ ! 715: /* about Expose events. */ ! 716: ! 717: for (localY = top, ourindex = 0; ! 718: ourindex < rows && localY < screen_height; ! 719: ++ourindex, ++localY) { ! 720: if (localY < 0 || localY >= screen_height || ! 721: !ActiveScreen[localY+1] || ! 722: left+1 > ActiveScreen[localY+1]->length) ! 723: continue; ! 724: localX = left; ! 725: localHL = ActiveScreen[localY+1]->highlighted; ! 726: dumpchars (ActiveScreen, ! 727: min (cols, ! 728: ActiveScreen[localY+1]->length-localX), ! 729: localX, localY, localHL); ! 730: } ! 731: if (!InUpdate && !CursorExists) ! 732: CursorToggle (); ! 733: /* Routine usually called */ ! 734: /* when not in update */ ! 735: } ! 736: ! 737: /* What sections of the window will be modified from the UpdateDisplay ! 738: * routine is totally under software control. Any line with Y coordinate ! 739: * greater than flexlines will not change during an update. This is really ! 740: * used only during dellines and inslines routines (scraplines and stufflines) ! 741: */ ! 742: ! 743: XTset_terminal_window (n) ! 744: register int n; ! 745: { ! 746: #ifdef XDEBUG ! 747: fprintf (stderr, "XTset_terminal_window\n"); ! 748: #endif ! 749: ! 750: if (n <= 0 || n > screen_height) ! 751: flexlines = screen_height; ! 752: else ! 753: flexlines = n; ! 754: } ! 755: ! 756: XTins_del_lines (vpos, n) ! 757: int vpos, n; ! 758: { ! 759: #ifdef XDEBUG ! 760: fprintf (stderr, "XTins_del_lines\n"); ! 761: #endif ! 762: ! 763: XTtopos (vpos, 0); ! 764: if (n >= 0) ! 765: stufflines (n); ! 766: else ! 767: scraplines (-n); ! 768: } ! 769: ! 770: static ! 771: XTinsert_chars (start, len) ! 772: register char *start; ! 773: register int len; ! 774: { ! 775: int mask = sigblock (sigmask (SIGIO)); ! 776: ! 777: #ifdef XDEBUG ! 778: fprintf (stderr, "XTinsert_chars\n"); ! 779: #endif ! 780: ! 781: if (len > 0) { ! 782: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 783: cursX*XXfontw+XXInternalBorder, ! 784: cursY*XXfonth+XXInternalBorder, ! 785: (screen_width-cursX-len)*XXfontw, ! 786: XXfonth, ! 787: (cursX+len)*XXfontw+XXInternalBorder, ! 788: cursY*XXfonth+XXInternalBorder); ! 789: writechars (start, start+len-1); ! 790: } ! 791: ! 792: sigsetmask(mask); ! 793: } ! 794: ! 795: static ! 796: XTdelete_chars (n) ! 797: register int n; ! 798: { ! 799: int mask = sigblock (sigmask (SIGIO)); ! 800: ! 801: #ifdef XDEBUG ! 802: fprintf (stderr, "XTdelete_chars (num %d)\n",n); ! 803: #endif ! 804: ! 805: /* XXX WARNING! This is dangerous...We aren't waiting for the ! 806: * exposures from the copyarea because it slows things down too ! 807: * much. This could cause updating problems under some ! 808: * circumstances. */ ! 809: ! 810: if (n > 0) { ! 811: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 812: (cursX+n)*XXfontw+XXInternalBorder, ! 813: cursY*XXfonth+XXInternalBorder, ! 814: (screen_width-cursX-n)*XXfontw, ! 815: XXfonth, ! 816: cursX*XXfontw+XXInternalBorder, ! 817: cursY*XXfonth+XXInternalBorder); ! 818: } ! 819: ! 820: if (n >= 0) { ! 821: XClearArea (XXdisplay, XXwindow, ! 822: (screen_width-n)*XXfontw+XXInternalBorder, ! 823: cursY*XXfonth+XXInternalBorder, ! 824: n*XXfontw+XXInternalBorder, ! 825: XXfonth,0); ! 826: } ! 827: cursX += n; ! 828: ! 829: sigsetmask (mask); ! 830: } ! 831: ! 832: stufflines (n) ! 833: register int n; ! 834: { ! 835: register int topregion, bottomregion; ! 836: register int length, newtop, mask; ! 837: ! 838: if (cursY >= flexlines) ! 839: return; ! 840: ! 841: mask = sigblock (sigmask (SIGIO)); ! 842: ! 843: if (CursorExists) ! 844: CursorToggle (); ! 845: ! 846: sigsetmask (mask); ! 847: topregion = cursY; ! 848: bottomregion = flexlines-(n+1); ! 849: newtop = cursY+n; ! 850: length = bottomregion-topregion+1; ! 851: ! 852: if (length > 0 && newtop <= flexlines) { ! 853: mask = sigblock (sigmask (SIGIO)); ! 854: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 855: XXInternalBorder, ! 856: topregion*XXfonth+XXInternalBorder, ! 857: screen_width*XXfontw, ! 858: length*XXfonth, ! 859: XXInternalBorder, newtop*XXfonth+XXInternalBorder); ! 860: } ! 861: ! 862: newtop = min (newtop, flexlines-1); ! 863: length = newtop-topregion; ! 864: if (length > 0) ! 865: XClearArea (XXdisplay, XXwindow, ! 866: XXInternalBorder, ! 867: topregion*XXfonth+XXInternalBorder, ! 868: screen_width*XXfontw, ! 869: n*XXfonth, 0); ! 870: } ! 871: ! 872: scraplines (n) ! 873: register int n; ! 874: { ! 875: int mask; ! 876: ! 877: if (cursY >= flexlines) ! 878: return; ! 879: ! 880: mask = sigblock (sigmask (SIGIO)); ! 881: ! 882: if (CursorExists) ! 883: CursorToggle (); ! 884: ! 885: if (cursY+n >= flexlines) { ! 886: if (flexlines >= (cursY + 1)) ! 887: XClearArea (XXdisplay, XXwindow, ! 888: XXInternalBorder, ! 889: cursY*XXfonth+XXInternalBorder, ! 890: screen_width*XXfontw, ! 891: (flexlines-cursY) * XXfonth, ! 892: 0); ! 893: sigsetmask (mask); ! 894: } ! 895: else { ! 896: XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm, ! 897: XXInternalBorder, ! 898: (cursY+n)*XXfonth+XXInternalBorder, ! 899: screen_width*XXfontw, ! 900: (flexlines-cursY-n)*XXfonth, ! 901: XXInternalBorder, cursY*XXfonth+XXInternalBorder); ! 902: ! 903: XClearArea (XXdisplay, XXwindow, XXInternalBorder, ! 904: (flexlines-n)*XXfonth+XXInternalBorder, ! 905: screen_width*XXfontw, ! 906: n*XXfonth, 0); ! 907: sigsetmask (mask); ! 908: } ! 909: } ! 910: ! 911: /* Substitutes for standard read routine. Under X not interested in individual ! 912: * bytes but rather individual packets. ! 913: */ ! 914: ! 915: XTread_socket (sd, bufp, numchars) ! 916: register int sd; ! 917: register char *bufp; ! 918: register int numchars; ! 919: { ! 920: #ifdef XDEBUG ! 921: fprintf(stderr,"XTread_socket\n"); ! 922: #endif ! 923: ! 924: return (internal_socket_read (bufp, numchars)); ! 925: } ! 926: ! 927: read_events_block () ! 928: { ! 929: unsigned char buf[64]; ! 930: int i, nread; ! 931: ! 932: #ifdef XDEBUG ! 933: fprintf(stderr,"read_events_block\n"); ! 934: #endif ! 935: ! 936: nread = internal_socket_read (buf, sizeof buf); ! 937: if (!nread) ! 938: return; ! 939: ! 940: for (i=0; i < nread; i++) { ! 941: kbd_buffer_store_char (buf[i]); ! 942: /* Don't look at input that follows a C-g too closely. ! 943: * This reduces lossage due to autorepeat on C-g. */ ! 944: if (buf[i] == ('G' & 037)) ! 945: break; ! 946: } ! 947: } ! 948: ! 949: internal_socket_read(bufp, numchars) ! 950: register unsigned char *bufp; ! 951: register int numchars; ! 952: { ! 953: int count,nbytes,rows,cols; ! 954: char mapping_buf[20]; ! 955: int mask = sigblock (sigmask (SIGIO)); ! 956: XEvent event; ! 957: XComposeStatus status; ! 958: ! 959: extern int input_pending; ! 960: ! 961: count = 0; ! 962: ! 963: #ifdef BIGDEBUG ! 964: my_log("Entering internal_socket_read input_pending = %d\n",input_pending); ! 965: #endif BIGDEBUG ! 966: ! 967: while (XPending (XXdisplay)) { ! 968: XNextEvent (XXdisplay,&event); ! 969: ! 970: #ifdef BIGDEBUG ! 971: my_log("Got event %d\n",event.type); ! 972: #endif BIGDEBUG ! 973: ! 974: switch (event.type) { ! 975: ! 976: default: ! 977: break; ! 978: ! 979: case ConfigureNotify: ! 980: XXxoffset = event.xconfigure.x; ! 981: XXyoffset = event.xconfigure.y; ! 982: if (abs(pixelheight-event.xconfigure.height) < ! 983: XXfonth && ! 984: abs(pixelwidth-event.xconfigure.width) < ! 985: XXfontw) ! 986: break; ! 987: ! 988: configure_pending = 1; ! 989: ! 990: rows = event.xconfigure.height/XXfonth; ! 991: cols = event.xconfigure.width/XXfontw; ! 992: pixelwidth = cols*XXfontw+2*XXInternalBorder; ! 993: pixelheight = rows*XXfonth+2*XXInternalBorder; ! 994: ! 995: break; ! 996: ! 997: case Expose: ! 998: if (configure_pending) { ! 999: if (event.xexpose.count) ! 1000: break; ! 1001: change_screen_size ((pixelheight-2*XXInternalBorder)/XXfonth, ! 1002: (pixelwidth-2*XXInternalBorder)/XXfontw); ! 1003: configure_pending = 0; ! 1004: break; ! 1005: } ! 1006: dumprectangle (event.xexpose.y-XXInternalBorder, ! 1007: event.xexpose.x-XXInternalBorder, ! 1008: event.xexpose.height, ! 1009: event.xexpose.width); ! 1010: break; ! 1011: ! 1012: case GraphicsExpose: ! 1013: dumprectangle (event.xgraphicsexpose.y-XXInternalBorder, ! 1014: event.xgraphicsexpose.x-XXInternalBorder, ! 1015: event.xgraphicsexpose.height, ! 1016: event.xgraphicsexpose.width); ! 1017: break; ! 1018: ! 1019: case NoExpose: ! 1020: break; ! 1021: ! 1022: case KeyPress: ! 1023: nbytes = 0; ! 1024: switch (event.xkey.keycode) { ! 1025: case 167: ! 1026: strcpy(mapping_buf,"\002"); ! 1027: nbytes = 1; ! 1028: break; ! 1029: case 168: ! 1030: strcpy(mapping_buf,"\006"); ! 1031: nbytes = 1; ! 1032: break; ! 1033: case 170: ! 1034: strcpy(mapping_buf,"\020"); ! 1035: nbytes = 1; ! 1036: break; ! 1037: case 169: ! 1038: strcpy(mapping_buf,"\016"); ! 1039: nbytes = 1; ! 1040: break; ! 1041: } ! 1042: if (!nbytes) { ! 1043: nbytes = XLookupString (&event, ! 1044: mapping_buf, 20, 0, ! 1045: &status); ! 1046: if (nbytes) { ! 1047: if (event.xkey.state & Mod1Mask) ! 1048: *mapping_buf |= METABIT; ! 1049: } ! 1050: } ! 1051: if (numchars-nbytes > 0) { ! 1052: bcopy (mapping_buf, bufp, nbytes); ! 1053: bufp += nbytes; ! 1054: count += nbytes; ! 1055: numchars -= nbytes; ! 1056: } ! 1057: break; ! 1058: ! 1059: case ButtonPress: ! 1060: case ButtonRelease: ! 1061: *bufp++ = (char) 'X' & 037; ! 1062: ++count; ! 1063: --numchars; ! 1064: *bufp++ = (char) '@' & 037; ! 1065: ++count; ! 1066: --numchars; ! 1067: if (XXm_queue_num == XMOUSEBUFSIZE) ! 1068: break; ! 1069: XXm_queue[XXm_queue_num] = (XEvent *) ! 1070: malloc(sizeof(XEvent)); ! 1071: *XXm_queue[XXm_queue_num++] = event; ! 1072: break; ! 1073: } ! 1074: } ! 1075: ! 1076: if (CursorExists) ! 1077: xfixscreen (); ! 1078: ! 1079: sigsetmask (mask); ! 1080: return count; ! 1081: } ! 1082: ! 1083: #ifdef notdef ! 1084: XBitmapIcon () ! 1085: { ! 1086: XWMHints wmhints; ! 1087: int mask = sigblock (sigmask (SIGIO)); ! 1088: ! 1089: wmhints.flags = IconPixmapHint|IconMaskHint; ! 1090: wmhints.icon_pixmap = SinkPixmap; ! 1091: wmhints.icon_mask = SinkMaskPixmap; ! 1092: XSetWMHints (XXdisplay, XXwindow, &wmhints); ! 1093: ! 1094: sigsetmask (mask); ! 1095: } ! 1096: ! 1097: XTextIcon () ! 1098: { ! 1099: XWMHints wmhints; ! 1100: int mask = sigblock (sigmask (SIGIO)); ! 1101: ! 1102: wmhints.flags = 0; ! 1103: XSetWMHints (XXdisplay, XXwindow, &wmhints); ! 1104: ! 1105: sigsetmask (mask); ! 1106: } ! 1107: #endif notdef ! 1108: ! 1109: /* Interpreting incoming keycodes. Should have table modifiable as needed ! 1110: * from elisp. ! 1111: */ ! 1112: ! 1113: /* Exit gracefully from gnuemacs, doing an autosave and giving a status. ! 1114: */ ! 1115: ! 1116: XExitGracefully () ! 1117: { ! 1118: XCleanUp(); ! 1119: exit (70); ! 1120: } ! 1121: ! 1122: XIgnoreError () ! 1123: { ! 1124: return 0; ! 1125: } ! 1126: ! 1127: xfixscreen () ! 1128: { ! 1129: int mask = sigblock (sigmask (SIGIO)); ! 1130: ! 1131: /* Yes, this is really what I mean -- Check to see if we've ! 1132: * lost our connection */ ! 1133: ! 1134: XSetErrorHandler(0); ! 1135: XSetIOErrorHandler(0); ! 1136: XNoOp (XXdisplay); ! 1137: XFlush (XXdisplay); ! 1138: XSetErrorHandler(handler); ! 1139: XSetIOErrorHandler(handler); ! 1140: if (!InUpdate && !CursorExists) ! 1141: CursorToggle (); ! 1142: ! 1143: sigsetmask (mask); ! 1144: } ! 1145: ! 1146: x_term_init () ! 1147: { ! 1148: register char *vardisplay; ! 1149: register int xxargc; ! 1150: register char **xxargv; ! 1151: extern char *getenv (); ! 1152: char *temp_font; ! 1153: char *option; ! 1154: extern XTinterrupt_signal (); ! 1155: extern char *malloc (); ! 1156: int reversevideo; ! 1157: XColor cdef; ! 1158: XColor cursor_fore, cursor_back; ! 1159: extern Lisp_Object Vxterm, Vxterm1, Qt; ! 1160: extern int xargc; ! 1161: extern char **xargv; ! 1162: extern void init_sigio (), request_sigio (), unrequest_sigio (); ! 1163: extern int XIgnoreError(); ! 1164: ! 1165: vardisplay = (alternate_display ? alternate_display : ""); ! 1166: if (!vardisplay) { ! 1167: fprintf (stderr, "DISPLAY environment variable must be set\n"); ! 1168: exit (-200); ! 1169: } ! 1170: ! 1171: XXdisplay = XOpenDisplay (vardisplay); ! 1172: if (XXdisplay == (Display *) 0) { ! 1173: fprintf (stderr, "X server not responding. Check your DISPLAY environment variable.\n"); ! 1174: exit (-99); ! 1175: } ! 1176: ! 1177: XXisColor = DisplayCells(XXdisplay,0)>2; ! 1178: XXColorMap = DefaultColormap(XXdisplay,0); ! 1179: ! 1180: x_init_1 (1); ! 1181: WindowMapped = 0; ! 1182: baud_rate = 9600; ! 1183: min_padding_speed = 10000; ! 1184: must_write_spaces = 1; ! 1185: MetaFlag = 1; ! 1186: visible_bell = 1; ! 1187: interrupt_input = 1; ! 1188: inverse_video = 1; ! 1189: configure_pending = 0; ! 1190: ! 1191: fix_screen_hook = xfixscreen; ! 1192: clear_screen_hook = XTclear_screen; ! 1193: clear_end_of_line_hook = XTclear_end_of_line; ! 1194: ins_del_lines_hook = XTins_del_lines; ! 1195: change_line_highlight_hook = XTchange_line_highlight; ! 1196: insert_chars_hook = XTinsert_chars; ! 1197: write_chars_hook = XTwrite_chars; ! 1198: delete_chars_hook = XTdelete_chars; ! 1199: ring_bell_hook = XTfeep; ! 1200: reset_terminal_modes_hook = XTreset_terminal_modes; ! 1201: set_terminal_modes_hook = XTset_terminal_modes; ! 1202: update_begin_hook = XTupdate_begin; ! 1203: update_end_hook = XTupdate_end; ! 1204: set_terminal_window_hook = XTset_terminal_window; ! 1205: read_socket_hook = XTread_socket; ! 1206: topos_hook = XTtopos; ! 1207: reassert_line_highlight_hook = XTreassert_line_highlight; ! 1208: scroll_region_ok = 1; /* we'll scroll partial screens */ ! 1209: char_ins_del_ok = 1; /* Don't bother */ ! 1210: line_ins_del_ok = 1; /* we'll just blt 'em */ ! 1211: fast_clear_end_of_line = 1; /* X does this well */ ! 1212: memory_below_screen = 0; /* we don't remember what scrolls ! 1213: * off the bottom */ ! 1214: dont_calculate_costs = 1; ! 1215: ! 1216: /* New options section */ ! 1217: XXborder = 1; ! 1218: XXInternalBorder = 1; ! 1219: screen_width = 80; ! 1220: screen_height = 66; ! 1221: reversevideo = 0; ! 1222: XXxoffset = 0; ! 1223: XXyoffset = 0; ! 1224: XXdebug = 0; ! 1225: XXm_queue_num = 0; ! 1226: ! 1227: handler = XIgnoreError; ! 1228: XSetErrorHandler (handler); ! 1229: XSetIOErrorHandler (handler); ! 1230: ! 1231: progname = xargv[0]; ! 1232: if (rindex(progname,'/')) ! 1233: progname = rindex(progname,'/')+1; ! 1234: ! 1235: if (option = XGetDefault (XXdisplay, progname, "ReverseVideo")) ! 1236: if (!strcmp (option,"on")) ! 1237: reversevideo = 1; ! 1238: if (option = XGetDefault (XXdisplay, progname, "BorderWidth")) ! 1239: XXborder = atoi (option); ! 1240: if (option = XGetDefault (XXdisplay, progname, "InternalBorder")) ! 1241: XXInternalBorder = atoi (option); ! 1242: ! 1243: if (!(brdr_color = XGetDefault (XXdisplay, progname, "Border"))) ! 1244: brdr_color = XGetDefault (XXdisplay, progname, "BorderColor"); ! 1245: back_color = XGetDefault (XXdisplay, progname, "Background"); ! 1246: fore_color = XGetDefault (XXdisplay, progname, "Foreground"); ! 1247: mous_color = XGetDefault (XXdisplay, progname, "Mouse"); ! 1248: curs_color = XGetDefault (XXdisplay, progname, "Cursor"); ! 1249: ! 1250: temp_font = XGetDefault (XXdisplay, progname, "BodyFont"); ! 1251: desiredwindow = ""; ! 1252: if (option = XGetDefault (XXdisplay, progname, "Geometry")) ! 1253: desiredwindow = option; ! 1254: if (!temp_font) ! 1255: temp_font = "fixed"; ! 1256: XXcurrentfont = (char *) xmalloc (strlen (temp_font) + 1); ! 1257: strcpy (XXcurrentfont, temp_font); ! 1258: ! 1259: if (XXisColor) { ! 1260: if (fore_color && ! 1261: XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) && ! 1262: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1263: fore = cdef.pixel; ! 1264: else { ! 1265: fore_color = "black"; ! 1266: fore = BlackPixel(XXdisplay,0); ! 1267: } ! 1268: ! 1269: if (back_color && ! 1270: XParseColor (XXdisplay, XXColorMap, back_color, &cdef) && ! 1271: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1272: back = cdef.pixel; ! 1273: else { ! 1274: back_color = "white"; ! 1275: back = WhitePixel(XXdisplay,0); ! 1276: } ! 1277: ! 1278: if (curs_color && ! 1279: XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) && ! 1280: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1281: curs = cdef.pixel; ! 1282: else { ! 1283: curs_color = "black"; ! 1284: curs = BlackPixel(XXdisplay,0); ! 1285: } ! 1286: ! 1287: if (mous_color && ! 1288: XParseColor (XXdisplay, XXColorMap, mous_color, &cdef) && ! 1289: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1290: mous = cdef.pixel; ! 1291: else { ! 1292: mous_color = "black"; ! 1293: mous = BlackPixel(XXdisplay,0); ! 1294: } ! 1295: ! 1296: if (brdr_color && ! 1297: XParseColor (XXdisplay, XXColorMap, brdr_color, &cdef) && ! 1298: XAllocColor (XXdisplay, XXColorMap, &cdef)) ! 1299: brdr = cdef.pixel; ! 1300: else { ! 1301: brdr_color = "black"; ! 1302: brdr = BlackPixel(XXdisplay,0); ! 1303: } ! 1304: } ! 1305: else { ! 1306: fore_color = curs_color = mous_color = brdr_color = "black"; ! 1307: fore = curs = mous = brdr = BlackPixel(XXdisplay,0); ! 1308: back_color = "white"; ! 1309: back = WhitePixel(XXdisplay,0); ! 1310: } ! 1311: ! 1312: XXpid = getpid (); ! 1313: default_window = "=80x24+0+0"; ! 1314: ! 1315: /* Process X command line args...*/ ! 1316: xxargc = xargc; ! 1317: xxargv = xargv; ! 1318: xxargc++; ! 1319: xxargc--; ! 1320: while (xxargc) { ! 1321: int sargc; ! 1322: sargc = xxargc; ! 1323: if (xxargc && !strcmp (*xxargv, "-r")) { ! 1324: reversevideo = !reversevideo; ! 1325: xxargc--; ! 1326: xxargv++; ! 1327: } ! 1328: if ((xxargc > 1) && !strcmp (*xxargv, "-font")) { ! 1329: xxargc--; ! 1330: xxargv++; ! 1331: free(XXcurrentfont); ! 1332: XXcurrentfont = (char *) xmalloc (strlen (*xxargv)+1); ! 1333: strcpy (XXcurrentfont, *xxargv); ! 1334: xxargc--; ! 1335: xxargv++; ! 1336: } ! 1337: if ((xxargc > 1) && !strcmp (*xxargv, "-b")) { ! 1338: xxargc--; ! 1339: xxargv++; ! 1340: XXborder = atoi (*xxargv); ! 1341: xxargc--; ! 1342: xxargv++; ! 1343: } ! 1344: if ((xxargc > 1) && !strcmp (*xxargv, "-ib")) { ! 1345: xxargc--; ! 1346: xxargv++; ! 1347: XXInternalBorder = atoi (*xxargv); ! 1348: xxargc--; ! 1349: xxargv++; ! 1350: } ! 1351: if ((xxargc > 1) && !strcmp (*xxargv, "-w")) { ! 1352: xxargc--; ! 1353: xxargv++; ! 1354: desiredwindow = (char *) xmalloc (strlen (*xxargv)+1); ! 1355: strcpy (desiredwindow, *xxargv); ! 1356: xxargc--; ! 1357: xxargv++; ! 1358: } ! 1359: if (XXisColor) { ! 1360: if ((xxargc > 1 && !strcmp (*xxargv, "-fg"))) { ! 1361: xxargc--; ! 1362: xxargv++; ! 1363: if (XParseColor (XXdisplay, XXColorMap, ! 1364: *xxargv, &cdef) && ! 1365: XAllocColor (XXdisplay, XXColorMap, ! 1366: &cdef)) { ! 1367: fore_color = (char *) ! 1368: xmalloc (sizeof (*xxargv)+1); ! 1369: strcpy (fore_color, *xxargv); ! 1370: fore = cdef.pixel; ! 1371: } ! 1372: xxargc--; ! 1373: xxargv++; ! 1374: } ! 1375: if ((xxargc > 1 && !strcmp (*xxargv, "-bg"))) { ! 1376: xxargc--; ! 1377: xxargv++; ! 1378: if (XParseColor (XXdisplay, XXColorMap, ! 1379: *xxargv, &cdef) && ! 1380: XAllocColor (XXdisplay, XXColorMap, ! 1381: &cdef)) { ! 1382: back_color = (char *) ! 1383: xmalloc (sizeof (*xxargv)+1); ! 1384: strcpy (back_color, *xxargv); ! 1385: back = cdef.pixel; ! 1386: } ! 1387: xxargc--; ! 1388: xxargv++; ! 1389: } ! 1390: if ((xxargc > 1 && !strcmp (*xxargv, "-bd"))) { ! 1391: xxargc--; ! 1392: xxargv++; ! 1393: if (XParseColor (XXdisplay, XXColorMap, ! 1394: *xxargv, &cdef) && ! 1395: XAllocColor (XXdisplay, XXColorMap, ! 1396: &cdef)) { ! 1397: brdr_color = (char *) ! 1398: xmalloc (sizeof (*xxargv)+1); ! 1399: strcpy (brdr_color, *xxargv); ! 1400: brdr = cdef.pixel; ! 1401: } ! 1402: xxargc--; ! 1403: xxargv++; ! 1404: } ! 1405: if ((xxargc > 1 && !strcmp (*xxargv, "-cr"))) { ! 1406: xxargc--; ! 1407: xxargv++; ! 1408: if (XParseColor (XXdisplay, XXColorMap, ! 1409: *xxargv, &cdef) && ! 1410: XAllocColor (XXdisplay, XXColorMap, ! 1411: &cdef)) { ! 1412: curs_color = (char *) ! 1413: xmalloc (sizeof (*xxargv)+1); ! 1414: strcpy (curs_color, *xxargv); ! 1415: curs = cdef.pixel; ! 1416: } ! 1417: xxargc--; ! 1418: xxargv++; ! 1419: } ! 1420: if ((xxargc > 1 && !strcmp (*xxargv, "-ms"))) { ! 1421: xxargc--; ! 1422: xxargv++; ! 1423: if (XParseColor (XXdisplay, XXColorMap, ! 1424: *xxargv, &cdef) && ! 1425: XAllocColor (XXdisplay, XXColorMap, ! 1426: &cdef)) { ! 1427: mous_color = (char *) ! 1428: xmalloc (sizeof (*xxargv)+1); ! 1429: strcpy (mous_color, *xxargv); ! 1430: mous = cdef.pixel; ! 1431: } ! 1432: xxargc--; ! 1433: xxargv++; ! 1434: } ! 1435: } ! 1436: if (sargc == xxargc) { ! 1437: xxargc--; ! 1438: xxargv++; ! 1439: } ! 1440: } ! 1441: ! 1442: if (reversevideo) { ! 1443: int tempcolor; ! 1444: char *tempname; ! 1445: brdr = back; ! 1446: brdr_color = back_color; ! 1447: tempcolor = fore; ! 1448: fore = back; ! 1449: back = tempcolor; ! 1450: tempname = fore_color; ! 1451: fore_color = back_color; ! 1452: back_color = tempname; ! 1453: if (curs == WhitePixel(XXdisplay,0)) { ! 1454: curs = BlackPixel(XXdisplay,0); ! 1455: curs_color = "black"; ! 1456: } ! 1457: else if (curs == BlackPixel(XXdisplay,0)) { ! 1458: curs = WhitePixel(XXdisplay,0); ! 1459: curs_color = "white"; ! 1460: } ! 1461: if (mous == WhitePixel(XXdisplay,0)) { ! 1462: mous = BlackPixel(XXdisplay,0); ! 1463: mous_color = "black"; ! 1464: } ! 1465: else if (mous == BlackPixel(XXdisplay,0)) { ! 1466: mous = WhitePixel(XXdisplay,0); ! 1467: mous_color = "white"; ! 1468: } ! 1469: } ! 1470: ! 1471: if (!XXcurrentfont) { ! 1472: fprintf (stderr, "Memory allocation failure.\n"); ! 1473: exit (-150); ! 1474: } ! 1475: ! 1476: signal (SIGPIPE, XExitGracefully); ! 1477: fontinfo = XLoadQueryFont(XXdisplay,XXcurrentfont); ! 1478: if (fontinfo == (XFontStruct *) 0) { ! 1479: fprintf (stderr, "No font\n"); ! 1480: exit (-98); ! 1481: } ! 1482: ! 1483: XXfid = fontinfo->fid; ! 1484: XXfonth = fontinfo->ascent + fontinfo->descent; ! 1485: XXfontw = fontinfo->max_bounds.width; ! 1486: XXbase = fontinfo->ascent; ! 1487: pixelwidth = screen_width * XXfontw + 2 * XXInternalBorder; ! 1488: pixelheight = screen_height * XXfonth + 2 * XXInternalBorder; ! 1489: flexlines = screen_height; ! 1490: #ifndef CANNOT_DUMP ! 1491: if (initialized) ! 1492: #endif /* CANNOT_DUMP */ ! 1493: Vxterm = Qt, Vxterm1 = Qt; ! 1494: ! 1495: XInitWindow (); ! 1496: ! 1497: cursor_fore.pixel = fore; ! 1498: cursor_fore.flags = 0; ! 1499: cursor_back.pixel = back; ! 1500: cursor_back.flags = 0; ! 1501: ! 1502: XSelectInput (XXdisplay, XXwindow, KeyPressMask | ! 1503: ExposureMask | ButtonPressMask | ButtonReleaseMask | ! 1504: StructureNotifyMask); ! 1505: ! 1506: Fset_input_mode (Qt, Qnil); ! 1507: request_sigio(); ! 1508: ! 1509: #ifdef BIGDEBUG ! 1510: *debug_string = '\0'; ! 1511: if (1) { ! 1512: int dump_log(); ! 1513: signal(SIGUSR1,dump_log); ! 1514: } ! 1515: #endif BIGDEBUG ! 1516: } ! 1517: ! 1518: x_init_1 (unrequest) ! 1519: int unrequest; ! 1520: { ! 1521: #ifdef F_SETOWN ! 1522: extern int old_fcntl_owner; ! 1523: #endif ! 1524: extern void init_sigio (), request_sigio (), unrequest_sigio (); ! 1525: ! 1526: dup2 (ConnectionNumber(XXdisplay), 0); ! 1527: close (ConnectionNumber(XXdisplay)); ! 1528: ConnectionNumber(XXdisplay) = 0; /* Looks a little strange? ! 1529: * check the def of the macro; ! 1530: * it is a genuine lvalue */ ! 1531: init_sigio (); ! 1532: request_sigio (); ! 1533: setpgrp (0,getpid()); ! 1534: ! 1535: #ifdef F_SETOWN ! 1536: old_fcntl_owner = fcntl (0, F_GETOWN, 0); ! 1537: fcntl (0, F_SETOWN, getpid ()); ! 1538: #endif ! 1539: if (unrequest) ! 1540: unrequest_sigio (); ! 1541: } ! 1542: ! 1543: XSetFlash () ! 1544: { ! 1545: ring_bell_hook = XTflash; ! 1546: } ! 1547: ! 1548: XSetFeep () ! 1549: { ! 1550: ring_bell_hook = XTfeep; ! 1551: } ! 1552: ! 1553: XNewFont (newname) ! 1554: register char *newname; ! 1555: { ! 1556: XFontStruct *temp; ! 1557: XSizeHints sizes; ! 1558: ! 1559: int mask = sigblock (sigmask (SIGIO)); ! 1560: ! 1561: XFlush (XXdisplay); ! 1562: ! 1563: temp = XLoadQueryFont(XXdisplay, newname); ! 1564: if (temp == (XFontStruct *) 0) { ! 1565: sigsetmask (mask); ! 1566: if (QLength (XXdisplay) > 0) ! 1567: read_events_block (); ! 1568: return -1; ! 1569: } ! 1570: XXfid = temp->fid; ! 1571: XXfonth = temp->ascent + temp->descent; ! 1572: XXfontw = temp->max_bounds.width; ! 1573: XXbase = temp->ascent; ! 1574: XSetFont (XXdisplay, XXgc_norm, XXfid); ! 1575: XSetFont (XXdisplay, XXgc_rev, XXfid); ! 1576: XSetFont (XXdisplay, XXgc_curs, XXfid); ! 1577: XFreeFont (XXdisplay, fontinfo); ! 1578: fontinfo = temp; ! 1579: sizes.flags = PResizeInc|PMinSize; ! 1580: sizes.width_inc = XXfontw; ! 1581: sizes.height_inc = XXfonth; ! 1582: sizes.min_width = XXfontw*MINWIDTH+2*XXInternalBorder; ! 1583: sizes.min_height = XXfonth*MINHEIGHT+2*XXInternalBorder; ! 1584: XSetNormalHints (XXdisplay, XXwindow, &sizes); ! 1585: ! 1586: XSetWindowSize (screen_height, screen_width); ! 1587: ! 1588: sigsetmask (mask); ! 1589: if (QLength (XXdisplay) > 0) ! 1590: read_events_block (); ! 1591: ! 1592: return 0; ! 1593: } ! 1594: ! 1595: /* Flip foreground/background colors */ ! 1596: ! 1597: XFlipColor () ! 1598: { ! 1599: int tempcolor; ! 1600: char *tempname; ! 1601: int mask = sigblock (sigmask (SIGIO)); ! 1602: ! 1603: CursorToggle (); ! 1604: XSetWindowBackground(XXdisplay, XXwindow, fore); ! 1605: if (XXborder) ! 1606: XSetWindowBorder(XXdisplay, XXwindow, back); ! 1607: brdr = back; ! 1608: brdr_color = back_color; ! 1609: tempcolor = fore; ! 1610: fore = back; ! 1611: back = tempcolor; ! 1612: tempname = fore_color ; ! 1613: fore_color = back_color; ! 1614: back_color = tempname; ! 1615: XClearArea (XXdisplay, XXwindow, 0, 0, ! 1616: screen_width*XXfontw+2*XXInternalBorder, ! 1617: screen_height*XXfonth+2*XXInternalBorder, 0); ! 1618: XXgc_temp = XXgc_norm; ! 1619: XXgc_norm = XXgc_rev; ! 1620: XXgc_rev = XXgc_temp; ! 1621: ! 1622: XRedrawDisplay (); ! 1623: if (curs == WhitePixel(XXdisplay,0)) { ! 1624: curs = BlackPixel(XXdisplay,0); ! 1625: curs_color = "black"; ! 1626: } ! 1627: else ! 1628: if (curs == BlackPixel(XXdisplay,0)) { ! 1629: curs = WhitePixel(XXdisplay,0); ! 1630: curs_color = "white"; ! 1631: } ! 1632: XSetState (XXdisplay, XXgc_curs, back, curs, GXinvert, AllPlanes); ! 1633: ! 1634: if (mous == WhitePixel(XXdisplay,0)) { ! 1635: mous = BlackPixel(XXdisplay,0); ! 1636: mous_color = "black"; ! 1637: } ! 1638: else ! 1639: if (mous == BlackPixel(XXdisplay,0)) { ! 1640: mous = WhitePixel(XXdisplay,0); ! 1641: mous_color = "white"; ! 1642: } ! 1643: CursorToggle (); ! 1644: XFlush (XXdisplay); ! 1645: sigsetmask (mask); ! 1646: } ! 1647: ! 1648: /* Change just the size of the window */ ! 1649: ! 1650: XSetWindowSize (rows, cols) ! 1651: register int rows, cols; ! 1652: { ! 1653: pixelwidth = cols*XXfontw+2*XXInternalBorder; ! 1654: pixelheight = rows*XXfonth+2*XXInternalBorder; ! 1655: ! 1656: XResizeWindow(XXdisplay, XXwindow, pixelwidth, pixelheight); ! 1657: XFlush (XXdisplay); ! 1658: ! 1659: change_screen_size (rows, cols); ! 1660: } ! 1661: ! 1662: XInitWindow () ! 1663: { ! 1664: int x, y, width, height; ! 1665: XSizeHints sizes; ! 1666: XWMHints wmhints; ! 1667: char iconname[50]; ! 1668: extern int xargc; ! 1669: extern char **xargv; ! 1670: ! 1671: strcpy(iconname,"emacs@"); ! 1672: gethostname(iconname+strlen(iconname),30); ! 1673: ! 1674: XGeometry (XXdisplay, 0, (desiredwindow && *desiredwindow) ? ! 1675: desiredwindow : default_window, ! 1676: default_window, XXborder, XXfontw, XXfonth, ! 1677: XXInternalBorder*2, XXInternalBorder*2, ! 1678: &x, &y, &width, &height); ! 1679: ! 1680: XXwindow = XCreateSimpleWindow(XXdisplay, RootWindow(XXdisplay,0), ! 1681: x, y, width*XXfontw+2*XXInternalBorder, ! 1682: height*XXfonth+2*XXInternalBorder, ! 1683: XXborder, brdr, back); ! 1684: ! 1685: if (!XXwindow) { ! 1686: fprintf (stderr, "Could not create window"); ! 1687: fflush (stderr); ! 1688: exit (-97); ! 1689: } ! 1690: ! 1691: XXgcv.font = XXfid; ! 1692: XXgcv.foreground = fore; ! 1693: XXgcv.background = back; ! 1694: XXgc_norm = XCreateGC(XXdisplay, XXwindow, ! 1695: GCFont|GCForeground|GCBackground, ! 1696: &XXgcv); ! 1697: XXgcv.foreground = back; ! 1698: XXgcv.background = fore; ! 1699: XXgc_rev = XCreateGC(XXdisplay, XXwindow, ! 1700: GCFont|GCForeground|GCBackground, ! 1701: &XXgcv); ! 1702: XXgcv.foreground = back; ! 1703: XXgcv.background = curs; ! 1704: XXgc_curs = XCreateGC(XXdisplay, XXwindow, ! 1705: GCFont|GCForeground|GCBackground, ! 1706: &XXgcv); ! 1707: ! 1708: XSelectInput (XXdisplay, XXwindow, NoEventMask); ! 1709: ! 1710: EmacsCursor = XCreateFontCursor(XXdisplay, XC_left_ptr); ! 1711: XDefineCursor (XXdisplay, XXwindow, EmacsCursor); ! 1712: ! 1713: SinkPixmap = XCreateBitmapFromData (XXdisplay, XXwindow, ! 1714: sink_bits, sink_width, ! 1715: sink_height); ! 1716: SinkMaskPixmap = XCreateBitmapFromData (XXdisplay, XXwindow, ! 1717: sink_mask_bits, ! 1718: sink_mask_width, ! 1719: sink_mask_height); ! 1720: wmhints.flags = IconPixmapHint|IconMaskHint; ! 1721: wmhints.icon_pixmap = SinkPixmap; ! 1722: wmhints.icon_mask = SinkMaskPixmap; ! 1723: XSetWMHints (XXdisplay, XXwindow, &wmhints); ! 1724: ! 1725: sizes.flags = PResizeInc|PMinSize; ! 1726: sizes.width_inc = XXfontw; ! 1727: sizes.height_inc = XXfonth; ! 1728: sizes.min_width = XXfontw*MINWIDTH+2*XXInternalBorder; ! 1729: sizes.min_height = XXfonth*MINHEIGHT+2*XXInternalBorder; ! 1730: ! 1731: if (!desiredwindow || !*desiredwindow) ! 1732: sizes.flags |= PPosition|PSize; ! 1733: else ! 1734: sizes.flags |= USPosition|USSize; ! 1735: sizes.x = x; ! 1736: sizes.y = y; ! 1737: sizes.width = width*XXfontw+2*XXInternalBorder; ! 1738: sizes.height = height*XXfonth+2*XXInternalBorder; ! 1739: ! 1740: change_screen_size(height,width); ! 1741: ! 1742: XXxoffset = x; ! 1743: XXyoffset = y; ! 1744: pixelwidth = sizes.width; ! 1745: pixelheight = sizes.height; ! 1746: ! 1747: XSetStandardProperties (XXdisplay, XXwindow, progname, iconname, ! 1748: SinkPixmap, xargv, xargc, &sizes); ! 1749: ! 1750: CursorExists = 0; ! 1751: VisibleX = 0; ! 1752: VisibleY = 0; ! 1753: XMapWindow (XXdisplay, XXwindow); ! 1754: XFlush (XXdisplay); ! 1755: WindowMapped = 1; ! 1756: } ! 1757: ! 1758: #ifdef BIGDEBUG ! 1759: ! 1760: my_log(s,a,b,c,d,e,f,g,h) ! 1761: char *s; ! 1762: { ! 1763: char bfr[256]; ! 1764: ! 1765: sprintf(bfr,s,a,b,c,d,e,f,g,h); ! 1766: ! 1767: strcat(debug_string,bfr); ! 1768: } ! 1769: ! 1770: dump_log() ! 1771: { ! 1772: fputs(debug_string,stderr); ! 1773: fflush(stderr); ! 1774: *debug_string = '\0'; ! 1775: } ! 1776: ! 1777: #endif BIGDEBUG ! 1778: ! 1779: #endif /* HAVE_X_WINDOWS */ ! 1780: ! 1781: /*#include "xundebug.h"*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.