home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xcoral16.zip / MAIN_TEX.C < prev    next >
C/C++ Source or Header  |  1993-01-15  |  14KB  |  649 lines

  1. /*
  2. ** Copyright 1989, 1992 by Lionel Fournigault
  3. **
  4. ** Permission to use, copy, and distribute for non-commercial purposes,
  5. ** is hereby granted without fee, providing that the above copyright
  6. ** notice appear in all copies and that both the copyright notice and this
  7. ** permission notice appear in supporting documentation.
  8. ** The software may be modified for your own purposes, but modified versions
  9. ** may not be distributed.
  10. ** This software is provided "as is" without any expressed or implied warranty.
  11. **
  12. **
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include <sys/types.h>
  19. #include <sys/time.h>
  20. #include <string.h>
  21. #include <malloc.h>
  22.  
  23. #include "text.h"
  24. #include "browser.h"
  25.  
  26. static TextResources    tr;
  27. extern char *getenv ();
  28. extern void Display3D ();
  29.  
  30. /*
  31. **    Function name : InitTextRes
  32. **
  33. **    Description : Initialisations de resources communes
  34. **        aux fenetres de texte : la fonte et les couleurs.
  35. **
  36. **    Input : Le display, la fonte, les couleur du devant, du fond,
  37. **        du top_shadow et du buttom_shadow.
  38. **    Ouput :
  39. */
  40. void InitTextRes ( display, font, fg, bg, ts, bs )
  41.     Display        *display;
  42.     XFontStruct    *font;
  43.     unsigned long     fg, bg, ts, bs;
  44. {
  45.     XGCValues    gcv;
  46.     GC        gc;
  47.     unsigned long     gcm;
  48.  
  49.     gc = DefaultGC ( display, DefaultScreen ( display ) );
  50.  
  51.     tr.top_sh = ts;
  52.     tr.bot_sh = bs;
  53.     tr.cgc = XCreateGC ( display,     DefaultRootWindow ( display ), 0, &gcv );
  54.     tr.igc = XCreateGC ( display,    DefaultRootWindow ( display ), 0, &gcv );
  55.     tr.font = font;
  56.     tr.fg = fg;
  57.     tr.bg = bg;
  58.             
  59.     XCopyGC ( display, gc, (~0), tr.cgc );
  60.     XCopyGC ( display, gc, (~0), tr.igc );
  61.     
  62.     gcm = 0;
  63.     gcm |= GCForeground;    gcv.foreground = fg;
  64.     gcm |= GCBackground;    gcv.background = bg;
  65.     gcm |= GCFont;        gcv.font = font -> fid;
  66.  
  67.     XChangeGC ( display, tr.cgc, gcm, &gcv );
  68.     
  69.     gcm = 0;
  70.     gcm |= GCFunction;    gcv.function = GXxor;
  71.     gcm |= GCPlaneMask;    gcv.plane_mask = fg ^ bg;
  72.     gcm |= GCForeground;    gcv.foreground = fg ^ bg;
  73.     gcm |= GCBackground;    gcv.background = bg;
  74.  
  75.     XChangeGC ( display, tr.igc, gcm, &gcv );
  76. }
  77.  
  78.  
  79. /*
  80. **    Function name : MakeTextWindow
  81. **
  82. **    Description : Creation d'un fenetre de texte.
  83. **        
  84. **    Input : Le display, la fenetre parent, la position par rapport
  85. **        a celle-ci.
  86. **    Ouput : La structure Text.
  87. */
  88. Text *MakeTextWindow ( display, parent, x, y )
  89.     Display    *display;
  90.     Window    parent;
  91.     register int x, y;
  92. {
  93.     Text        *text;
  94.     XGCValues    gcv;
  95.     register char*    indent;
  96.     register int     tw;
  97.  
  98.     text = ( Text * ) malloc ( sizeof ( Text ));
  99.  
  100.     text -> width_relief = W_RELIEF;
  101.     text -> w_parent = parent;
  102.  
  103.     if ( DefaultDepth ( display, DefaultScreen ( display )) == 1 ) 
  104.         text -> width_relief = 1;           
  105.     
  106.     text -> window = XCreateSimpleWindow (display, parent, x,
  107.         y, DEFAULT_SIZE, DEFAULT_SIZE, 0, tr.fg, tr.bg );
  108.  
  109.     XSelectInput ( display, text -> window,
  110.         ExposureMask | KeyPressMask | VisibilityChangeMask |
  111.               KeyReleaseMask | ButtonPress | ButtonRelease );
  112.  
  113.     text -> Cgc = XCreateGC ( display, DefaultRootWindow ( display ), 0, &gcv );
  114.     XCopyGC ( display, tr.cgc, (~0), text -> Cgc );
  115.  
  116.     text -> Igc = tr.igc;
  117.     text -> top_sh = tr.top_sh;
  118.     text -> bot_sh = tr.bot_sh;
  119.     text -> lines_in_buf = 1;
  120.     text -> no_current_line = 1;
  121.     text -> n1 = 0;
  122.  
  123.     text -> fg = tr.fg;
  124.     text -> bg = tr.bg;
  125.  
  126.     text -> x_or = text -> y_or = MARGE;
  127.     text -> x_pos = text -> y_pos = MARGE;
  128.     text -> visible = 0;
  129.  
  130.     SetFontText ( display, text, tr.font );
  131.  
  132.     text -> cursor_stat = OFF;
  133.     text -> cursor_width = text -> char_width_ave;
  134.     text -> cursor_height = text -> font_height;
  135.     text -> sl = 0;
  136.     *text -> filename = 0;
  137.        text -> stat = 0;
  138.     text -> modif = False;
  139.     text -> mouse_in = False;
  140.     
  141.     text -> mode = TEXT;
  142.  
  143.     indent = (char *) getenv ( "XCORAL_INDENT_WIDTH" );
  144.     (void) strcpy ( text -> indent, "       " ); /* 8 blancs */
  145.     if ( indent == 0 )
  146.         text -> indent [3] = 0;
  147.     else {
  148.         tw = atoi (indent);
  149.         if ( tw <= 0 || tw > 7 )
  150.             text -> indent [3] = 0;
  151.         else
  152.             text -> indent [tw] = 0;
  153.     }
  154.  
  155.     indent = (char *) getenv ( "XCORAL_TAB_WIDTH" );
  156.     if ( indent == 0 ) 
  157.         text -> tab_width = TAB_WIDTH;
  158.     else {
  159.         tw = atoi (indent); 
  160.         text -> tab_width = ( tw <= 0 || tw > 7 ) ? TAB_WIDTH : tw; 
  161.     }
  162.     
  163.     (void) bzero ( (char *) text -> page.wline, 256 );
  164.     (void) bzero ( (char *) text -> page.sline, 256 );
  165.  
  166.     text -> markline = text -> markpos = 0;
  167.     return text;
  168. }
  169.  
  170.  
  171. /*
  172. **    Function name : DeleteText
  173. **
  174. **    Description : Destruction d'une fenetre de texte.
  175. **
  176. **    Input : Le Display , la structure text.
  177. **    Ouput :
  178. */
  179. void DeleteText ( display, text )
  180.     Display *display;
  181.     Text *text;
  182. {
  183.     XFreeGC ( display, text -> Cgc );
  184.     XDestroyWindow ( display, text -> window );
  185.        if ( text != 0 ) 
  186.         (void) free ( (char *) text );
  187. }
  188.  
  189.  
  190. /*
  191. **    Function name : SetTextVisibility
  192. **
  193. **    Description : Positionne l'etat de visibilite.
  194. **
  195. **    Input : Le text courant, l'etat.
  196. **    Ouput :
  197. */
  198. int SetTextVisibility ( w, text, state )
  199.     Window w;
  200.     Text *text;
  201.     register int state;
  202. {
  203.        if ( w != text -> window )
  204.            return False;
  205. #ifdef DEBUG
  206.     fprintf ( stderr, "Text  window stat = %d\n", state ); 
  207. #endif DEBUG
  208.     text -> visible = state;
  209.     return True;
  210. }
  211.  
  212.  
  213. /*
  214. **    Function name : GetVisibility
  215. **
  216. **    Description : Retourne l'etat de la visibilite.
  217. **
  218. **    Input : Le Display, le text courant.
  219. **    Ouput : Vrai ou Faux
  220. */
  221. int GetVisibility ( display, text )
  222.     Display *display;
  223.     Text *text;
  224. {
  225.         if ( text -> visible != VisibilityUnobscured ) {
  226.         XRaiseWindow ( display, text -> w_parent );
  227.         return False;
  228.     }
  229.     return True;
  230. }
  231.  
  232.  
  233. /*
  234. **    Function name : KillText
  235. **
  236. **    Description : Vire le texte d'une fenetre texte et met
  237. **        a jours les infos.
  238. **
  239. **    Input : Le display, le text courant.
  240. **    Ouput :
  241. */
  242. void KillText ( display, text )
  243.     Display *display;
  244.     Text *text;
  245. {
  246.     /*
  247.      * Affiche la premiere page pour positionner 
  248.      * certaines variables.
  249.      * Reset le buffer
  250.      */
  251.        FirstPage ( text );
  252.     ClearBuffer ( text -> buf );
  253.  
  254.     /* 
  255.      * Mis a jour des infos.
  256.      */
  257.     text -> lines_in_buf = 1; 
  258.        text -> modif = False;
  259.        text -> no_current_line = 1;
  260.     (void) bzero ( (char *) text -> page.wline, 256 );
  261.     (void) bzero ( (char *) text -> page.sline, 256 );
  262.  
  263.     /* 
  264.      * On nettoie bien
  265.      */
  266.     SetScrollLine ( text -> swin, 1 );
  267.     XClearWindow ( display, text -> window );
  268.     Display3D ( display, text -> window, text -> top_sh, text ->bot_sh, 2, 1 ); 
  269. }
  270.  
  271.  
  272. /*
  273. **    Function name : TextInBuf
  274. **
  275. **    Description : Comme son nom l'indique
  276. **    Input : Le text courant
  277. **    Ouput : Vrai ou faux
  278. */
  279. int TextInBuf ( text )
  280.     Text *text;
  281. {
  282.     if ( (! strcmp ( text -> filename, "NoName" )) && (text -> modif == False)) 
  283.         return False;
  284.     else 
  285.         return True;
  286. }
  287.  
  288.  
  289. /*
  290. **    Function name : SetFontText
  291. **
  292. **    Description : Positionne la fonte pour le texte courant.
  293. **
  294. **    Input :  Le display, le text courant, la fonte.
  295. **    Ouput :
  296. */
  297. void SetFontText ( display, text, font )
  298.     Display *display;
  299.     Text *text;
  300.     XFontStruct *font;
  301. {
  302.     text -> font = font;
  303.     text -> font_height = (font -> max_bounds.ascent) + (font ->max_bounds.descent);
  304.     text -> cursor_height = text -> font_height;
  305.  
  306.     text -> cursor_width = ( font -> min_bounds.width + font -> max_bounds.width ) / 2;
  307.     text -> char_width_ave = ( font -> min_bounds.width + font -> max_bounds.width ) / 2;
  308.  
  309.     XSetFont ( display, text -> Cgc, font -> fid );
  310. }
  311.  
  312.  
  313. /*
  314. **    Function name : LoadFont
  315. **
  316. **    Description : Comme son nom l'indique.
  317. **
  318. **    Input : Le display, le nom de la fonte
  319. **    Ouput : la structure
  320. */
  321. XFontStruct *LoadFont ( dpy, str )
  322.     Display *dpy;
  323.     char    *str;
  324. {
  325.     XFontStruct     *font;
  326.     extern void exit ();
  327.  
  328.        if ((font = XLoadQueryFont ( dpy, str )) == NULL ) {
  329.         (void) fprintf ( stderr, "Fontname error : %s\n", str );
  330.         if (( font = XLoadQueryFont ( dpy, "fixed" )) == NULL ) {
  331.             (void) fprintf ( stderr, "Can't load font : fixed\n" );
  332.             (void) exit (1);
  333.         }
  334.         ( void ) fprintf ( stderr, "Use font : fixed\n" );
  335.         }
  336.         return font;
  337. }
  338.  
  339.  
  340. /*
  341. **    Function name : ChangeTextFont
  342. **
  343. **    Description : Change la fonte courante.
  344. **
  345. **    Input : Le display, le text courant, le nom de la nouvelle fonte.
  346. **    Ouput :
  347. */
  348. void ChangeTextFont ( dpy, text, f )
  349.     Display *dpy;
  350.     Text *text;
  351.     register char *f;
  352. {
  353.     XFontStruct *font;
  354.     register int i;
  355.  
  356.     TextCursorOff ( text );
  357.     font = LoadFont ( dpy, f );
  358.     i = GetLineInPage ( text, font );
  359.  
  360.     SetFontText ( dpy, text, font );
  361.  
  362.     SetScrollFont ( text -> swin, font );
  363.     SetScrollLinePage ( text -> swin, i ); 
  364.     SetLineInPage ( text, i );
  365.     SetScrollBarSize ( dpy, text -> swin );
  366.  
  367.     ClearPage ( text );
  368.     text -> n1 = 0;
  369.     text -> n2 = text -> lines_in_page - 1;
  370.        
  371.     SetLinesTable ( text );
  372.     ClipOn ( text, NULL );
  373.     RefreshPage ( text );
  374.     ClipOff ( text );
  375.  
  376. #ifdef DEBUG
  377.        fprintf ( stderr, "no_current = %d\n", text -> no_current_line );
  378. #endif
  379.        
  380.     (void) MoveScrollBar ( dpy,  text -> swin, CURRENT, text -> no_current_line - 1 );
  381.     TextCursorOn ( text );
  382. }
  383.  
  384.  
  385. /*
  386. **    Function name : GetLineInPage
  387. **
  388. **    Description : Retourne le nombre de lignes dans la page
  389. **        courante pour une fonte donnee
  390. **
  391. **    Input : Le text courant, la fonte.
  392. **    Ouput : le nombre de lignes.
  393. */
  394. int GetLineInPage ( text, font )
  395.     Text *text;
  396.     XFontStruct *font;
  397. {
  398.     return ( (text -> height - (2*MARGE)) / 
  399.         (font -> max_bounds.ascent + font -> max_bounds.descent));
  400. }
  401.  
  402.  
  403. /*
  404. **    Function name : MouseIn
  405. **
  406. **    Description : La pointeur est dans le text courant.
  407. **
  408. **    Input : le text courant
  409. **    Ouput :
  410. */
  411. void MouseIn ( text )
  412.     Text *text;
  413. {
  414. #ifdef DEBUG
  415.     (void) fprintf ( stderr, "Mouse in\n" );
  416. #endif DEBUG
  417.     text -> mouse_in = True;
  418. }
  419.  
  420.  
  421. /*
  422. **    Function name : MouseOut
  423. **
  424. **    Description : Le pointeur n'est plus dans le text courant
  425. **
  426. **    Input : Le text courant.
  427. **    Ouput :
  428. */
  429. void MouseOut ( text )
  430.     Text *text;
  431. {
  432. #ifdef DEBUG
  433.     (void) fprintf ( stderr, "Mouse out\n" );
  434. #endif DEBUG
  435.     text -> mouse_in = False;
  436. }
  437.  
  438.  
  439. /*
  440. **    Function name : ShowWindowText
  441. **
  442. **    Description : Affichage de la fenetre de texte.
  443. **
  444. **    Input : Le display, le text courant, la geometrie.
  445. **    Ouput :
  446. */
  447. void ShowWindowText ( display, text,width, height )
  448.     Display    *display;
  449.     Text    *text;
  450.     int    width, height;
  451. {
  452.     register int x;
  453. #ifdef DEBUG
  454.     (void) fprintf ( stderr, "ShowWindowText width = %d height = %d\n",
  455.          width, height );
  456. #endif
  457.     x = height - ( 2 * MARGE );
  458.     text -> lines_in_page = (x / text -> font_height);
  459.     text -> n2 = ( text -> lines_in_page - 1 ) - text -> n1;
  460.     text -> width = width;
  461.     text -> height = height;
  462.  
  463. #ifdef DEBUG
  464.     (void) fprintf ( stderr, "ShowWindowText text-height = %d\n",
  465.          text -> height );
  466.     (void) fprintf ( stderr, "lineinpage = %d\n", text -> lines_in_page );
  467. #endif
  468.     XResizeWindow ( display, text -> window, text -> width, text -> height );
  469.     XMapWindow ( display, text -> window );
  470. }
  471.  
  472.  
  473. /*
  474. **    Function name : SetTextSave
  475. **
  476. **    Description : Mise a jour des infos apres une sauvegarde
  477. **        du buffer courant,
  478. **    Input : Le text
  479. **    Ouput :
  480. */
  481. SetTextSave ( text )
  482.     Text *text;
  483. {
  484.     text -> modif = False;
  485.           text -> mwin -> stat = False;
  486.     RefreshWindowStatBuf ( text -> mwin );
  487. }
  488.  
  489.  
  490. /*
  491. **    Function name : SetTextModif
  492. **
  493. **    Description : Mise a jour des infos apres une modification
  494. **        du buffer courant.
  495. **    Input : Le text
  496. **    Ouput :
  497. */
  498. SetTextModif ( text) 
  499.     Text *text;
  500. {
  501.     text -> modif = True;
  502.              text -> mwin -> stat = True;
  503.     RefreshWindowStatBuf ( text -> mwin );
  504. }
  505.  
  506.  
  507. /*
  508. **    Function name : SetDefaultMode
  509. **
  510. **    Description :
  511. **    Input : 
  512. **    Ouput :
  513. */
  514. void SetDefaultMode ( text )
  515.     Text *text;
  516. {
  517.     text -> mode = TEXT; 
  518.        text -> mwin -> mode = TEXT;
  519.     SetBrowserMode ( TEXT );
  520. /*    RefreshBrowserControl (); */
  521.     UnmapBrowser ();
  522.     RefreshWindowMode ( text -> mwin );
  523. }
  524.  
  525.  
  526. /*
  527. **    Function name : SetCMode
  528. **
  529. **    Description : 
  530. **    Input : 
  531. **    Ouput :
  532. */
  533. void SetCMode ( text )
  534.     Text *text;
  535. {
  536.     text -> mode = STD_C;
  537.     text -> mwin -> mode = STD_C;   
  538.     SetBrowserMode ( STD_C );
  539.        RefreshBrowserControl ();
  540.     RefreshWindowMode ( text -> mwin );
  541. }
  542.  
  543.  
  544. /*
  545. **    Function name : SetCCMode
  546. **
  547. **    Description : 
  548. **    Input : 
  549. **    Ouput :
  550. */
  551. void SetCCMode ( text )
  552.     Text *text; 
  553. {
  554.     text -> mode = CPLUS;
  555.     text -> mwin -> mode = CPLUS;
  556.     SetBrowserMode ( CPLUS );
  557.        RefreshBrowserControl ();
  558.     RefreshWindowMode ( text -> mwin );
  559. }
  560.  
  561.  
  562. /*
  563. **    Function name : ChangeDir
  564. **
  565. **    Description : Change de directorie courante.
  566. **    Input : Le text courant.
  567. **    Ouput :
  568. */
  569. void ChangeDir ( text )
  570.     Text *text;
  571. {
  572.     register char *tmp;
  573.        char buf [128];
  574.     register int len;
  575.    
  576.     (void) chdir ( text -> current_dir );
  577.        
  578.        /* 
  579.         * Affichage du filename ou de la directorie.
  580.         */
  581.     if ( text -> filename == 0 )
  582.         return;
  583.        len = strlen ( text -> filename );
  584.     if ( strcmp ( text -> filename + ( len - strlen ( "NoNmae" )), "NoName" ) == 0 ) {
  585.               len = strlen ( text -> current_dir );
  586.         if ( len > 20 ) {
  587.             (void) sprintf ( buf, "Dir : ...%s\n", 
  588.                 (char *) text -> current_dir + ( len - 20) );
  589.         }
  590.         else
  591.             (void) sprintf ( buf, "Dir : %s\n", text -> current_dir );
  592.         DisplayMessage ( text -> mwin, buf  );
  593.         return;
  594.     }
  595.     tmp = strrchr ( text -> filename, '/' );
  596.     if ( tmp != 0 )
  597.         DisplayMessage ( text -> mwin, tmp + 1 );
  598. }
  599.  
  600.  
  601. /*
  602. **    Function name : ExposeTextWindow
  603. **
  604. **    Description : Traitement d'un expose event dans une 
  605. **        fenetre de texte.
  606. **    Input : Le display, le text courant, la fenetre exposee.
  607. **    Ouput :
  608. */
  609. void ExposeTextWindow ( dpy, text, ev )
  610.     Display *dpy;
  611.     Text *text;
  612.     XEvent *ev;
  613. {
  614.     XRectangle rec [2];
  615.        Region region;
  616.        XEvent tmp;
  617.  
  618.     Display3D ( dpy, text -> window,
  619.         text -> top_sh,
  620.         text -> bot_sh,
  621.         text -> width_relief, DOWN );
  622.  
  623.     region = XCreateRegion ();
  624.  
  625.     rec [0].x = ((XExposeEvent *) ev) -> x;
  626.     rec [0].y = ((XExposeEvent *) ev) -> y;
  627.     rec [0].width = ((XExposeEvent *) ev) -> width;
  628.     rec [0].height = ((XExposeEvent *) ev) -> height;
  629.  
  630.     XUnionRectWithRegion ( rec, region, region );
  631.     while ( XCheckTypedWindowEvent ( dpy, text -> window, Expose, &tmp )) {
  632.         rec [0].x = tmp.xexpose.x;
  633.         rec [0].y = tmp.xexpose.y;
  634.         rec [0].width = tmp.xexpose.width;
  635.         rec [0].height = tmp.xexpose.height;
  636.         XUnionRectWithRegion ( rec, region, region );
  637.     }
  638.     XSetRegion ( dpy, text -> Cgc, region );
  639.     ExposePage ( region, text );
  640.     XSetClipMask ( dpy, text -> Cgc, None );
  641.     XDestroyRegion ( region );
  642.     SetCurrentLine ( text );
  643.     if ( text -> mouse_in == True ) 
  644.         TextCursorOn ( text );
  645.     else
  646.            FreeseTextCursor ( text ); 
  647.     return;
  648. }
  649.