home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / educatio / xcoral16.zip / CTR_PANE.C < prev    next >
C/C++ Source or Header  |  1993-01-15  |  13KB  |  526 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 <malloc.h>
  19. #include <string.h>
  20.  
  21. #include "text.h"
  22. #include "buttons.h"
  23. #include "button.bm"
  24. #include "flist.h"
  25.  
  26. static ButtonWindow    bw [NB_BUTTONS];
  27. static ResourcesButton rs;
  28. extern unsigned long     PixelValue ();
  29. extern Display *dpy;
  30. static void MakeButtons ();
  31.  
  32. /*
  33. **    Function name : InitControlRes
  34. **
  35. **    Description : Les ressources pour le panel de controle.
  36. **        Creation des Pixmap pour les boutons et l'icone.
  37. **        Creation du contexte graphique pour la fenetre
  38. **        des messages.
  39. **    Input : 
  40. **    Ouput :
  41. */
  42. void InitControlRes ( fg, bg, ts, bs )
  43.     unsigned long     fg, bg, ts, bs;
  44. {
  45.     XGCValues     gcv;
  46.     Window        root;
  47.     int         depth;
  48.  
  49.     rs.fg = fg; 
  50.     rs.bg = bg;
  51.  
  52.     root = DefaultRootWindow ( dpy );
  53.     depth = DefaultDepth ( dpy, DefaultScreen ( dpy ));
  54.  
  55.     rs.mess_gc = XCreateGC ( dpy, root, 0, &gcv );
  56.  
  57.     XSetState ( dpy, rs.mess_gc, fg, bg, GXcopy, AllPlanes );
  58.     rs.font = XLoadQueryFont ( dpy,
  59.         "-adobe-courier-bold-r-normal--14-140-75-75-m-90-iso8859-1" );
  60.     if ( rs.font != NULL ) {
  61.         XSetFont ( dpy, rs.mess_gc, rs.font -> fid );
  62.     }
  63.     else {
  64.         (void) fprintf ( stderr, "Font error, used fixed" );
  65.             rs.font = XLoadQueryFont ( dpy, "fixed" );
  66.         XSetFont ( dpy, rs.mess_gc, rs.font -> fid );
  67.     }
  68.     rs.up_pix = XCreatePixmapFromBitmapData ( dpy, root, up_bits,
  69.         BUTTON_W, BUTTON_W, fg, bg, depth );
  70.     rs.down_pix = XCreatePixmapFromBitmapData ( dpy, root, down_bits,
  71.         BUTTON_W, BUTTON_W, fg, bg, depth );
  72.     rs.np_pix = XCreatePixmapFromBitmapData ( dpy, root, np_bits,
  73.         BUTTON_W, BUTTON_W, fg, bg, depth );
  74.     rs.pp_pix = XCreatePixmapFromBitmapData ( dpy, root, pp_bits,
  75.         BUTTON_W, BUTTON_W, fg, bg, depth );
  76.     rs.queue_pix = XCreatePixmapFromBitmapData ( dpy, root, q_bits,
  77.         BUTTON_W, BUTTON_W, fg, bg, depth );
  78.     rs.head_pix = XCreatePixmapFromBitmapData ( dpy, root, head_bits,
  79.         BUTTON_W, BUTTON_W, fg, bg ,depth );
  80.  
  81.     rs.top_shadow = ts;
  82.     rs.bot_shadow = bs;
  83. }
  84.  
  85.  
  86. /*
  87. **    Function name : MakeControlPanel
  88. **
  89. **    Description : Construction de la fenetre des messages
  90. **        et des boutons de scroll up, down, np, pp, debut et fin.
  91. **    Input : La fenetre parent.
  92. **    Ouput :
  93. */
  94. MWin *MakeControlPanel ( w )
  95.     Window        w;
  96. {
  97.     MWin    *mwin;
  98.     int result;
  99.  
  100.     mwin = ( MWin * ) malloc ( sizeof ( MWin ));    
  101.  
  102.     mwin -> frame = XCreateSimpleWindow ( dpy, w, 0,
  103.         0, DEFAULT_SIZE, DEFAULT_SIZE, 0, rs.fg, rs.bg );
  104.  
  105.     mwin -> w_stat = XCreateSimpleWindow ( dpy, mwin -> frame,
  106.         1, 1, BUTTON_W, BUTTON_W, 0, rs.fg, rs.bg );
  107.     XSelectInput ( dpy, mwin -> w_stat, ExposureMask );
  108.  
  109.     mwin -> mess = XCreateSimpleWindow ( dpy, mwin -> frame,
  110.         BUTTON_W + 1, 1, DEFAULT_SIZE, DEFAULT_SIZE, 0, rs.fg, rs.bg ); 
  111.     XSelectInput ( dpy, mwin -> mess, ExposureMask | KeyPressMask );
  112.  
  113.     mwin -> w_mode = XCreateSimpleWindow ( dpy, mwin -> frame, 0,
  114.         1, ( 3 * BUTTON_W ), BUTTON_W, 0, rs.fg, rs.bg );
  115.     XSelectInput ( dpy, mwin -> w_mode, ExposureMask );
  116.  
  117.     mwin -> mess_gc = rs.mess_gc;
  118.     mwin -> fg = rs.fg;
  119.     mwin -> bg = rs.bg;
  120.     mwin -> font = rs.font;
  121.     mwin -> top_sh = rs.top_shadow;
  122.     mwin -> bot_sh = rs.bot_shadow;
  123.        mwin -> mode = TEXT;
  124.        mwin -> stat = False;
  125.  
  126.     if ( DefaultDepth ( dpy, DefaultScreen ( dpy )) == 1 ) {
  127.         if ( mwin -> bg == BlackPixel ( dpy, DefaultScreen ( dpy ))) {
  128.             mwin -> red = WhitePixel ( dpy, DefaultScreen ( dpy ));
  129.             mwin -> green = BlackPixel ( dpy, DefaultScreen ( dpy ));
  130.         }
  131.         else {
  132.             mwin -> red = BlackPixel ( dpy, DefaultScreen ( dpy ));
  133.             mwin -> green = WhitePixel ( dpy, DefaultScreen ( dpy ));
  134.         }
  135.     }
  136.     else {
  137.         mwin -> red = PixelValue ( dpy, "red", &result ); 
  138.         if ( result == False )
  139.             mwin -> red = BlackPixel ( dpy, DefaultScreen ( dpy ));    
  140.         mwin -> green = PixelValue ( dpy, "green", &result );
  141.         if ( result == False )
  142.             mwin -> green = WhitePixel ( dpy, DefaultScreen ( dpy ));
  143.     }
  144.        (void) MakeButtons ( mwin, rs.fg, rs.bg ); 
  145.     return ( mwin );
  146. }
  147.  
  148.  
  149. /*
  150. **    Function name : RefreshWindowStatBuf
  151. **
  152. **    Description : Met a jour la fenetre qui indique l'etat
  153. **        du buffer ( modifie ou pas ).
  154. **    Input : Le controle panel courant.
  155. **    Ouput :
  156. */
  157. void RefreshWindowStatBuf ( mwin )
  158.     MWin *mwin;
  159. {
  160.     Display3D ( dpy, mwin -> w_stat, mwin -> top_sh, mwin -> bot_sh, 1, 0 );
  161.     Display3D ( dpy, mwin -> frame, mwin -> top_sh, mwin -> bot_sh, 1, 1 );
  162.  
  163.     if ( mwin -> stat == False )
  164.         XSetForeground ( dpy, mwin -> mess_gc, mwin -> green );
  165.     else
  166.         XSetForeground ( dpy, mwin -> mess_gc, mwin -> red );
  167.  
  168.     XDrawString ( dpy, mwin -> w_stat, mwin -> mess_gc,     8, 16 , "S", 1 ); 
  169.     XSetForeground ( dpy, mwin -> mess_gc, mwin -> fg ); 
  170. }
  171.  
  172. /*
  173. **    Function name : RefreshWindowMode
  174. **
  175. **    Description : Met a jour la fenetre qui indique le mode
  176. **        courant.
  177. **    Input : Le controle panel courant.
  178. **    Ouput :
  179. */
  180. void RefreshWindowMode ( mwin )
  181.     MWin *mwin;
  182. {
  183.     char tmp[16];
  184.     register int len;
  185.  
  186.     bzero (tmp, 16 );    
  187.     XClearWindow ( dpy, mwin -> w_mode );
  188.     Display3D ( dpy, mwin -> w_mode,
  189.         mwin -> top_sh, mwin -> bot_sh, 1, 0 );
  190.     Display3D ( dpy, mwin -> frame,
  191.         mwin -> top_sh, mwin -> bot_sh, 1, 1 );
  192.     switch ( mwin -> mode ) {
  193.         case TEXT:
  194.             (void) strcpy ( tmp, "Text" );
  195.             break;
  196.         case STD_C:
  197.             (void) strcpy ( tmp, "C" );
  198.             break;
  199.         case CPLUS:
  200.             (void) strcpy ( tmp, "C++" );
  201.             break;
  202.         case LATEX:
  203.             (void) strcpy ( tmp, "LaTeX" );
  204.             break;
  205.     }
  206.     if ( (len = strlen ( tmp )) != 0 ) {
  207.         XDrawString ( dpy, mwin -> w_mode, mwin -> mess_gc, 
  208.             ((( 3 * BUTTON_W ) - XTextWidth ( mwin -> font, tmp, len )) / 2),
  209.             16 , tmp, len ); 
  210.     }
  211. }
  212.  
  213.  
  214. /*
  215. **    Function name : DeleteControlPanel
  216. **
  217. **    Description : Destruction.
  218. **    Input : Le panel de controloe courant.
  219. **    Ouput :
  220. */
  221. void DeleteControlPanel ( mwin )
  222.     MWin *mwin;
  223. {
  224.     XDestroyWindow ( dpy, mwin -> frame );
  225.        if ( mwin != 0 )
  226.         free ( (char *) mwin );
  227. }
  228.  
  229.  
  230. /*
  231. **    Function name : GetString
  232. **
  233. **    Description : 
  234. **    Input : Le text courant, le prompt et le type de reponse.
  235. **    Ouput : Le chaine
  236. */
  237. char *GetString ( text, prompt, reply )
  238. Text *text;
  239. register char *prompt;
  240. register char *reply;
  241. {
  242.     return ( (char * ) GetStringFromWindow ( text -> mwin -> mess, 
  243.         text -> mwin -> mess_gc, 
  244.         text -> mwin -> font, prompt, 10, 16, reply, 0 ));
  245. }
  246.  
  247.  
  248. /*
  249. **    Function name : MakeButtons
  250. **
  251. **    Description : Fabrication des 6 boutons de scroll.
  252. **    Input : Le panel de controle courant, les couleurs. 
  253. **    Ouput :
  254. */
  255. static void MakeButtons ( mwin, fg, bg )
  256.     MWin        *mwin;
  257.     unsigned long     fg, bg;
  258. {
  259.     register int i;
  260.     
  261.     mwin -> np = XCreateSimpleWindow ( dpy, mwin -> frame,
  262.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  263.     XSetWindowBackgroundPixmap ( dpy, mwin -> np, rs.np_pix );
  264.     bw [0].w = mwin -> np;
  265.     bw [0].f = NextPage;
  266.  
  267.     mwin -> pp = XCreateSimpleWindow ( dpy, mwin -> frame,
  268.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  269.     XSetWindowBackgroundPixmap ( dpy, mwin -> pp, rs.pp_pix );
  270.     bw [1].w = mwin -> pp;
  271.     bw [1].f = PreviousPage;
  272.  
  273.     mwin -> down = XCreateSimpleWindow ( dpy, mwin -> frame,
  274.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  275.     XSetWindowBackgroundPixmap ( dpy, mwin -> down, rs.down_pix );
  276.     bw [2].w = mwin -> down ;
  277.     bw [2].f = ScrollDownCont;
  278.  
  279.     mwin -> up = XCreateSimpleWindow ( dpy, mwin -> frame,
  280.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  281.     XSetWindowBackgroundPixmap ( dpy, mwin -> up, rs.up_pix );
  282.     bw [3].w = mwin -> up;
  283.     bw [3].f = ScrollUpCont;
  284.     
  285.     mwin -> q = XCreateSimpleWindow ( dpy, mwin -> frame,
  286.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  287.     XSetWindowBackgroundPixmap ( dpy, mwin -> q, rs.queue_pix );
  288.     bw [4].w = mwin -> q;
  289.     bw [4].f = LastPage;
  290.  
  291.     mwin -> head = XCreateSimpleWindow ( dpy, mwin -> frame,
  292.         1, 1, BUTTON_W, BUTTON_W, 0, fg, bg );
  293.     XSetWindowBackgroundPixmap ( dpy, mwin -> head, rs.head_pix );
  294.     bw [5].w = mwin -> head;
  295.     bw [5].f = FirstPage;
  296.     
  297.     for ( i=0; i<NB_BUTTONS; i++ ) 
  298.         XSelectInput ( dpy, bw [i].w, ExposureMask
  299.             | ButtonPressMask | ButtonReleaseMask );
  300. }
  301.  
  302.  
  303. /*
  304. **    Function name : ShowControlPanel
  305. **
  306. **    Description : Affiche le controle panel.
  307. **        fenetres : stat_buf, message, mode, bouttons.
  308. **    Input : Le panel de controle courant.
  309. **    Ouput : Largeur et hauteur du parent.
  310. */
  311. void ShowControlPanel ( mwin, width, height )
  312.     MWin    *mwin;
  313.     int    width, height;
  314. {
  315.     register int width_mess;
  316.        register int width_frame = width - ( 2 * MW_SPACE );
  317.     
  318.     width_mess = width_frame - ( 10 * BUTTON_W ) - 2; 
  319.  
  320.     mwin -> twidth = width_mess;
  321.     mwin -> theight = BUTTON_W;
  322.  
  323.     XMoveResizeWindow ( dpy, mwin -> frame, MW_SPACE ,
  324.         height - BUTTON_W  - MW_SPACE,
  325.         width_frame, BUTTON_W + 2 );
  326.  
  327.     XResizeWindow ( dpy, mwin -> mess,
  328.         width_mess , BUTTON_W );
  329.  
  330.     XMoveWindow ( dpy, mwin -> w_mode, 
  331.         width_frame - ( 9 * BUTTON_W ) - 1, 1 );
  332.  
  333.     XMoveWindow ( dpy, mwin -> head,
  334.         width_frame- ( 6 * BUTTON_W ) - 1, 1 );
  335.  
  336.     XMoveWindow ( dpy, mwin -> q,
  337.         width_frame - ( 5 * BUTTON_W )  - 1, 1 );
  338.  
  339.     XMoveWindow ( dpy, mwin -> up,
  340.         width_frame - ( 4 * BUTTON_W ) - 1, 1 );
  341.  
  342.     XMoveWindow ( dpy, mwin -> down, 
  343.         width_frame - ( 3 * BUTTON_W ) - 1, 1 );
  344.  
  345.     XMoveWindow ( dpy, mwin -> pp, 
  346.         width_frame - ( 2 * BUTTON_W ) - 1, 1 );
  347.     
  348.     XMoveWindow ( dpy, mwin -> np, 
  349.         width_frame - BUTTON_W - 1, 1 );
  350.  
  351.     XMapSubwindows ( dpy, mwin -> frame ); 
  352.     XMapWindow ( dpy, mwin -> frame );
  353. }
  354.  
  355.  
  356. /*
  357. **    Function name : DisplayMessage
  358. **
  359. **    Description : Affiche un message.
  360. **    Input : Le panel de controle courant, le message.
  361. **    Ouput :
  362. */
  363. void DisplayMessage ( mwin, s ) 
  364.     MWin *mwin;
  365.     register char *s;
  366. {
  367.     if ( (s == NULL) || (mwin == NULL) )
  368.         return;
  369.  
  370. #ifdef DEBUG
  371.     (void) fprintf ( stderr, "window mess id = %d\n", mwin -> mess );
  372. #endif
  373.  
  374.     XClearArea ( dpy, mwin -> mess, 2, 2, mwin -> twidth - 4,
  375.             mwin -> theight - 4, False );
  376.  
  377.     XDrawString ( dpy, mwin -> mess,
  378.         mwin -> mess_gc, 10, 16, s, strlen (s) );
  379.  
  380. }
  381.  
  382.  
  383. /*
  384. **    Function name : ClearMessageWIndow
  385. **
  386. **    Description : Comme son nom l'indique.
  387. **    Input : Le panel de controle courant.
  388. **    Ouput :
  389. */
  390. void ClearMessageWindow ( mwin )
  391.     MWin *mwin;
  392. {
  393.     DisplayMessage ( mwin, " ");
  394. }
  395.  
  396.  
  397. /*
  398. **    Function name : ButtonPressInControl
  399. **
  400. **    Description : Gere le look des bouttons sur un 'ButtonPress'
  401. **    Input : L'evennement, le text courant, le no du boutton.
  402. **    Ouput :
  403. */
  404. void ButtonPressInControl ( ev, text, i )
  405.     XEvent *ev;
  406.     Text *text;
  407.     register int i;
  408. {
  409.  
  410.            static unsigned int button_press;
  411.     
  412.     button_press = ev -> xbutton.button;
  413.   
  414.     Display3D ( dpy, ev -> xbutton.window,
  415.         rs.top_shadow, rs.bot_shadow, 1, 1 );
  416.    
  417.     XGrabPointer ( dpy, ev -> xbutton.window, True,
  418.         ButtonPressMask, GrabModeAsync,GrabModeAsync,
  419.         ev -> xbutton.window, None, CurrentTime );
  420.  
  421.     ExecButtonFunction ( text, i );
  422.  
  423.     if ( (i==2) || (i==3) ) { 
  424.         Display3D ( dpy, ev -> xbutton.window,
  425.             rs.top_shadow, rs.bot_shadow, 1, 0 );
  426.               XUngrabPointer ( dpy, CurrentTime );
  427.         return;
  428.     }
  429.  
  430.     WaitButtonRelease ( button_press );
  431.     Display3D ( dpy, ev -> xbutton.window,
  432.         rs.top_shadow, rs.bot_shadow, 1, 0 );
  433. }
  434.  
  435.  
  436. /*
  437. **    Function name : ButtonPressInControl
  438. **
  439. **    Description : Recherche quel bouton a ete enfonce.
  440. **    Input : La fenetre associe
  441. **    Ouput : Le numero du bouton ou -1 si problemes.
  442. */
  443. int IsButtonInControl ( w )
  444.     Window w;
  445. {
  446.     register int i;
  447.     
  448.     for ( i=0; i < NB_BUTTONS; i++ ) {
  449.         if ( w == bw [i].w ) {
  450.             return i;
  451.         }
  452.     }
  453.     return ( -1 );
  454. }
  455.  
  456.  
  457. /*
  458. **    Function name : SetButton
  459. **
  460. **    Description : Met a jour la table des boutons.
  461. **    Input : Le panel de controle courant.
  462. **    Ouput :
  463. */
  464. void SetButton ( mwin )
  465.     MWin *mwin;
  466. {
  467.     bw [0].w = mwin -> np;
  468.     bw [1].w = mwin -> pp;
  469.     bw [2].w = mwin -> down;
  470.     bw [3].w = mwin -> up;
  471.     bw [4].w = mwin -> q;
  472.     bw [5].w = mwin -> head;
  473. }
  474.  
  475.  
  476. /*
  477. **    Function name : ExposeControlePanel
  478. **
  479. **    Description : Traitement d'un expose event dans le panel.
  480. **    Input : La fenetre exposee, le panel courant.
  481. **    Output: Vrai si exposition sur le panel, faux sinon.
  482. */
  483. int ExposeInControlePanel ( w, mwin )
  484.     Window w;
  485.     MWin *mwin;
  486. {
  487.        XEvent ev;
  488.    
  489.     if ( w == mwin -> up
  490.         || w == mwin -> down
  491.         || w == mwin -> np
  492.         || w == mwin -> pp
  493.         || w == mwin -> q
  494.         || w == mwin -> head ) {
  495.  
  496. #ifdef DEBUG
  497.     (void) fprintf ( stderr, "Button\n" );        
  498. #endif
  499.         Display3D ( dpy, w, mwin -> top_sh, mwin -> bot_sh, 1, 0 );
  500.         Display3D ( dpy, mwin -> frame, mwin -> top_sh, mwin -> bot_sh, 1, 1 );
  501.         while ( XCheckWindowEvent ( dpy, w, ExposureMask, &ev ));
  502.         return True;
  503.     }
  504.     if ( w == mwin -> w_stat ) {
  505.         RefreshWindowStatBuf ( mwin );
  506.         while ( XCheckWindowEvent ( dpy, w, ExposureMask, &ev ));
  507.         return True;
  508.     }
  509.     if ( w == mwin -> w_mode ) {
  510.         RefreshWindowMode ( mwin );
  511.         while ( XCheckWindowEvent ( dpy, w, ExposureMask, &ev ));
  512.         return True;
  513.     }
  514.     if ( w == mwin -> mess ) {
  515. #ifdef DEBUG
  516.      (void) fprintf ( stderr, "Refresh Message\n");
  517. #endif
  518.         Display3D ( dpy, w, mwin -> top_sh, mwin -> bot_sh, 1, 0 );
  519.         Display3D ( dpy, mwin -> frame, mwin -> top_sh, mwin -> bot_sh, 1, 1 );
  520.         ClearMessageWindow ( mwin );
  521.         while ( XCheckWindowEvent ( dpy, w, ExposureMask, &ev ));
  522.         return True;
  523.     }
  524.     return False;
  525. }
  526.