home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / alt / sources / 2525 / display.c < prev   
Encoding:
C/C++ Source or Header  |  1992-11-15  |  24.6 KB  |  901 lines

  1. /*
  2.  * @(#)display.c    1.48 11/15/92
  3.  *
  4.  * display.c - update the status indicators and other display elements.
  5.  */
  6. static char *ident = "@(#)display.c    1.48 11/15/92";
  7.  
  8. #include <stdio.h>
  9. #include <sys/param.h>
  10. #include <sys/types.h>
  11. #include <xview/xview.h>
  12. #include <xview/panel.h>
  13. #include "workman_ui.h"
  14. #include "struct.h"
  15.  
  16. void    continued();
  17. void    setup_itimer();
  18. void    init_stats();
  19. void    avoid_track();
  20. void    keep_settings();
  21. void    cd_volume();
  22. void    set_default_volume();
  23. char *    listentry();
  24. char *    trackname();
  25. int *    get_playlist();
  26. void    kill_stats();
  27. void    insert_into_playlist();
  28. void    scoot_stuff();
  29. int    switch_playlists();
  30.  
  31. extern Panel_item quitbutton;
  32. extern Rect    *track_rect;
  33. extern int    add_height, small_height, basic_spacing;
  34.  
  35. /*
  36.  * Global object definitions.
  37.  */
  38. extern window1_objects    *Workman_window1;
  39. extern popup1_objects    *Workman_popup1;
  40. extern about_objects    *Workman_about;
  41. extern goodies_objects    *Workman_goodies;
  42. extern plpopup_objects    *Workman_plpopup;
  43.  
  44. extern int num_names, num_nalloc, my_cdname, my_artist;
  45. extern int cur_track, cur_pos_abs, cur_pos_rel, cur_tracklen, cur_cdlen,
  46.     cur_cdmode, cur_ntracks, cur_nsections, cur_lasttrack;
  47. extern int cur_frame;
  48. extern char *cur_cdname, *cur_artist;
  49. extern int displayed_track, pop_track, *pop_list, pop_listsize, pl_item,
  50.     pl_listnum;
  51. extern char *empty;
  52. extern int min_lines;
  53. extern int mark_a, mark_b;
  54. extern int manual_volume;
  55. extern int window_is_open;
  56. extern int dont_retry;
  57. extern int dismiss_button;
  58.  
  59. /*
  60.  * Change the icon label. 
  61.  */
  62. void
  63. icon_label(string)
  64.     char    *string;
  65. {
  66.     Xv_opaque    icon;
  67.  
  68.     icon = xv_get(Workman_window1->window1, FRAME_ICON);
  69.     xv_set(icon, ICON_LABEL, string, NULL);
  70.     xv_set(Workman_window1->window1, FRAME_ICON, icon, NULL);
  71. }
  72.  
  73. /*
  74.  * Center the track list.
  75.  */
  76. void
  77. center_tracks()
  78. {
  79.     Rect *tracks;
  80.     int x, cwidth;
  81.     
  82.     cwidth = xv_get(Workman_window1->controls1, XV_WIDTH);
  83.  
  84.     tracks = (Rect *) xv_get(Workman_window1->tracks, PANEL_ITEM_RECT);
  85.     x = (cwidth - tracks->r_width) / 2;
  86.     if (x < 0)
  87.         x = 0;
  88.     xv_set(Workman_window1->tracks, PANEL_ITEM_X, x, NULL);
  89. }
  90.  
  91. static Xv_opaque *tracknames = NULL;
  92.  
  93. /*
  94.  * Center all the read-only titles.
  95.  */
  96. void
  97. center_titles()
  98. {
  99.     Rect *message;
  100.     int x, cwidth, i;
  101.     
  102.     cwidth = xv_get(Workman_window1->controls1, XV_WIDTH);
  103.  
  104.     message = (Rect *) xv_get(Workman_window1->cdname_display,
  105.         PANEL_ITEM_RECT);
  106.     x = (cwidth - message->r_width) / 2;
  107.     if (x < 0)
  108.         x = 0;
  109.     xv_set(Workman_window1->cdname_display, PANEL_ITEM_X, x, NULL);
  110.  
  111.     message = (Rect *) xv_get(Workman_window1->artist_display,
  112.         PANEL_ITEM_RECT);
  113.     x = (cwidth - message->r_width) / 2;
  114.     if (x < 0)
  115.         x = 0;
  116.     xv_set(Workman_window1->artist_display, PANEL_ITEM_X, x, NULL);
  117.  
  118.     for (i = 0; num_nalloc && (i < num_names); i++)
  119.         if (tracknames[i] != NULL)
  120.         {
  121.             message = (Rect *) xv_get(tracknames[i],
  122.                             PANEL_ITEM_RECT);
  123.             x = (cwidth - message->r_width) / 2;
  124.             if (x < 0)
  125.                 x = 0;
  126.             xv_set(tracknames[i], PANEL_ITEM_X, x, NULL);
  127.         }
  128. }
  129.  
  130. /*
  131.  * Search backwards to find a track's real title or artist.
  132.  *
  133.  * Those with weak stomachs should skip over this.
  134.  */
  135. char *
  136. backtitle(track, c)
  137.     int    track;
  138.     char    c;
  139. {
  140.     int    i;
  141.     char    *name, *p;
  142.     static char *newname = NULL;
  143.  
  144.     if (newname != NULL)
  145.         free(newname);
  146.  
  147.     for (i = track - 2; i > -1; i--)
  148.     {
  149.         name = trackname(i);
  150.         do {
  151.             p = strchr(name, c);
  152.             if (p != NULL && (p[1] && p[1] != '/' || p[2] != '/') &&
  153.                     (p == name || (p > name+1 &&
  154.                     p[-1] == '/' && p[-2] == '/')))
  155.                 break;
  156.             name = p + 1;
  157.         } while (p != NULL);
  158.  
  159.         if (p != NULL)    /* found one! */
  160.         {
  161.             name = p + 1;
  162.             do
  163.                 p = strchr(p + 1, '/');
  164.             while (p != NULL && p[1] && p[1] != '/');
  165.  
  166.             if (p != NULL)
  167.                 *p = '\0';
  168.             newname = malloc(strlen(name) + 1);
  169.             if (newname == NULL)
  170.                 perror("malloc");
  171.             else
  172.                 strcpy(newname, name);
  173.             if (p != NULL)
  174.                 *p = '/';
  175.  
  176.             return (newname);
  177.         }
  178.     }
  179.  
  180.     return (NULL);
  181. }
  182.  
  183. /*
  184.  * Update the track name, using "//" as a line delimiter.  Grow the number
  185.  * of tracks as necessary; never actually get rid of a message object, but
  186.  * rather hide all the unused ones.
  187.  */
  188. void
  189. new_trackname_display(title, track)
  190.     char    *title;
  191.     int    track;
  192. {
  193.     int    tnum = 0, i, newline, new_height, did_artist = 0,
  194.         did_cdname = 0, lineheight;
  195.     char    *c, *old, *at;
  196.  
  197. #define ip Workman_window1
  198.     if (xv_get(ip->cdname_display, XV_SHOW) == FALSE)
  199.         return;
  200.  
  201.     while (*title)
  202.     {
  203.         if (*title != '@' && *title != '+' && num_nalloc == tnum)
  204.         {
  205.             if (tracknames == NULL)
  206.                 tracknames = (Xv_opaque *)malloc(++num_nalloc *
  207.                     sizeof(Xv_opaque));
  208.             else
  209.                 tracknames = (Xv_opaque *)realloc(tracknames,
  210.                     sizeof (Xv_opaque) * ++num_nalloc);
  211.             if (tracknames == NULL)
  212.             {
  213.                 perror("track display");
  214.                 exit(1);
  215.             }
  216.  
  217.             lineheight = (int) xv_get(Workman_window1->
  218.                 cdname_display, XV_HEIGHT);
  219.             tracknames[tnum] = xv_create(Workman_window1->controls1,
  220.                 PANEL_MESSAGE, PANEL_ITEM_X, 0, PANEL_ITEM_Y,
  221.                 xv_get(Workman_window1->cdname_display,
  222.                 PANEL_ITEM_Y) + lineheight + basic_spacing +
  223.                 tnum * (lineheight + basic_spacing / 2),
  224.                 XV_SHOW, FALSE, NULL);
  225.             if (tracknames[tnum] == NULL)
  226.             {
  227.                 fprintf(stderr, "Couldn't display title\n");
  228.                 --num_nalloc;
  229.                 break;
  230.             }
  231.         }
  232.  
  233.         for (c = title; *c && ! (c[0] == '/' && c[1] == '/'); c++)
  234.             ;
  235.  
  236.         newline = *c;
  237.         if (newline)
  238.             *c = '\0';
  239.  
  240.         if (*title == '@')
  241.             if (title[1])
  242.             {
  243.                 xv_set(ip->artist_display, PANEL_LABEL_STRING,
  244.                     title + 1, NULL);
  245.                 did_artist = 1;
  246.                 tnum--;
  247.             }
  248.             else
  249.             {
  250.                 old = backtitle(track, '@');
  251.                 if (old != NULL)
  252.                 {
  253.                     xv_set(ip->artist_display,
  254.                         PANEL_LABEL_STRING, old, NULL);
  255.                     did_artist = 1;
  256.                 }
  257.                 tnum--;
  258.             }
  259.         else if (*title == '+')
  260.             if (title[1])
  261.             {
  262.                 xv_set(ip->cdname_display, PANEL_LABEL_STRING,
  263.                     title + 1, NULL);
  264.                 did_cdname = 1;
  265.                 tnum--;
  266.             }
  267.             else
  268.             {
  269.                 old = backtitle(track, '+');
  270.                 if (old != NULL)
  271.                 {
  272.                     xv_set(ip->cdname_display,
  273.                         PANEL_LABEL_STRING, old, NULL);
  274.                     did_cdname = 1;
  275.                 }
  276.                 tnum--;
  277.             }
  278.         else if (tracknames[tnum] != NULL)
  279.             xv_set(tracknames[tnum], PANEL_LABEL_STRING, title,
  280.                 NULL);
  281.  
  282.         if (newline)
  283.         {
  284.             *c = '/';
  285.             title = c + 2;
  286.         }
  287.         else
  288.             title = c;
  289.         tnum++;
  290.     }
  291.  
  292.     for (i = tnum; i < num_names; i++)
  293.         if (tracknames[i] != NULL)
  294.             xv_set(tracknames[i], XV_SHOW, FALSE, NULL);
  295.  
  296.     if (my_cdname && ! did_cdname)
  297.         xv_set(ip->cdname_display, PANEL_LABEL_STRING,
  298.             xv_get(Workman_popup1->cdname, PANEL_VALUE), NULL);
  299.     if (my_artist && ! did_artist)
  300.         xv_set(ip->artist_display, PANEL_LABEL_STRING,
  301.             xv_get(Workman_popup1->artist, PANEL_VALUE), NULL);
  302.     center_titles();
  303.     my_cdname = did_cdname;
  304.     my_artist = did_artist;
  305.  
  306.     if (min_lines == -1)
  307.         if (tnum < num_names)
  308.             new_height = 0;
  309.         else
  310.         {
  311.             new_height = (tnum - num_names) *
  312.                 ((int)xv_get(Workman_window1->cdname_display,
  313.                 XV_HEIGHT) + 4);
  314.             num_names = tnum;
  315.         }
  316.     else
  317.         if (tnum < min_lines)
  318.         {
  319.             new_height = (min_lines - num_names) *
  320.                 ((int)xv_get(Workman_window1->cdname_display,
  321.                 XV_HEIGHT) + 4);
  322.             num_names = min_lines;
  323.         }
  324.         else
  325.         {
  326.             new_height = (tnum - num_names) *
  327.                 ((int)xv_get(Workman_window1->cdname_display,
  328.                 XV_HEIGHT) + 4);
  329.             num_names = tnum;
  330.         }
  331.     
  332.     scoot_stuff(new_height, 1);
  333.  
  334. #undef ip
  335.     for (i = 0; i < tnum; i++)
  336.         if (tracknames[i] != NULL)
  337.             xv_set(tracknames[i], XV_SHOW, TRUE, NULL);
  338.  
  339.     center_titles();
  340. }
  341.  
  342. /* A bunch of numbers for button labels. */
  343. char **numbered_buttons = NULL;
  344.  
  345. /*
  346.  * Update the per-track information.  This is called once every time we
  347.  * see we're on a new track.
  348.  */
  349. void
  350. new_track(ip)
  351. window1_objects *ip;
  352. {
  353.     static int title_lines = 1;
  354.     static Xv_opaque *titles = NULL;
  355.     static int num_titles = 0;
  356.     popup1_objects    *pu = Workman_popup1;
  357.     char    scratch[20];
  358.  
  359.     if (cur_track == -1)
  360.         return;
  361.     new_trackname_display(trackname(cur_track - 1)[0] ?
  362.         trackname(cur_track - 1) : "Unknown track name", cur_track);
  363.     xv_set(ip->songpos, PANEL_MIN_VALUE, 0, PANEL_MAX_VALUE, 
  364.         tracklen(cur_track - 1), PANEL_INACTIVE, FALSE, PANEL_VALUE,
  365.         cur_frame < cd->trk[cur_track - 1].start ? 0 : cur_pos_rel,
  366.         NULL);
  367.     sprintf(scratch, "%2d:%02d", tracklen(cur_track - 1) / 60,
  368.         tracklen(cur_track - 1) % 60);
  369.     xv_set(ip->tracklen, PANEL_LABEL_STRING, scratch, NULL);
  370.     xv_set(ip->cdgauge, PANEL_MIN_VALUE, 0, PANEL_MAX_VALUE, get_runtime(),
  371.         PANEL_INACTIVE, FALSE, NULL);
  372.     sprintf(scratch, "%2d:%02d", get_runtime() / 60, get_runtime() % 60);
  373.     xv_set(ip->cdlen, PANEL_LABEL_STRING, scratch, NULL);
  374.     xv_set(ip->tracks, PANEL_VALUE, cur_track - 1, PANEL_CHOICE_STRING,
  375.         cur_track - 1, numbered_buttons[cur_track - 1], NULL);
  376.     xv_set(ip->cdgauge, PANEL_VALUE, cur_pos_abs, NULL);
  377.     xv_set(Workman_goodies->split, PANEL_INACTIVE,
  378.         cd->trk[cur_track - 1].data, NULL);
  379.     xv_set(Workman_goodies->delete, PANEL_INACTIVE,
  380.         cd->trk[cur_track - 1].section < 2, NULL);
  381.     sprintf(scratch, "Track %d", cd->trk[cur_track - 1].track);
  382.     if (cd->trk[cur_track - 1].section)
  383.         sprintf(scratch + strlen(scratch), ".%d",
  384.             cd->trk[cur_track - 1].section);
  385.     icon_label(scratch);
  386.     figure_volume(ip);
  387.     displayed_track = cur_track;
  388. }
  389.  
  390. /*
  391.  * Update all the moving status indicators.
  392.  */
  393. void
  394. show_stats(ip)
  395. window1_objects *ip;
  396. {
  397.     static char    trk_time[6], abs_time[6];
  398.     static int    old_cdmode = -1;
  399.     int        timemode, pos;
  400.  
  401. /* If we're on a different track than we used to be, update the track info */
  402.     if (cur_cdmode == 1 && displayed_track != cur_track)
  403.         new_track(ip);
  404.  
  405. /* Update the current play mode */
  406.     if (old_cdmode != cur_cdmode)
  407.     {
  408.         old_cdmode = cur_cdmode;
  409.         xv_set(ip->mode, PANEL_VALUE, cur_cdmode, NULL);
  410.     }
  411.  
  412.     if (! window_is_open)
  413.         return;
  414.  
  415. /* Update the track timer and slider */
  416.     if (displayed_track == -1)
  417.         cur_tracklen = cur_cdlen;
  418.  
  419.     timemode = xv_get(Workman_goodies->timemode, PANEL_VALUE);
  420.  
  421.     if (timemode == 0)
  422.     {
  423.         if (cur_track > 0 && cur_frame < cd->trk[cur_track - 1].start)
  424.             (void) sprintf(trk_time, "-%1d:%02d", cur_pos_rel / 60,
  425.                 cur_pos_rel % 60);
  426.         else
  427.             (void) sprintf(trk_time, "%02d:%02d", cur_pos_rel / 60,
  428.                 cur_pos_rel % 60);
  429.         (void) sprintf(abs_time, "%02d:%02d", cur_pos_abs / 60,
  430.             cur_pos_abs % 60);
  431.     }
  432.     else
  433.     {
  434.         pos = tracklen(cur_track - 1) - cur_pos_rel;
  435.         if (pos < 0)    /* transitioning between tracks... */
  436.             pos = 0;
  437.         (void) sprintf(trk_time, "%02d:%02d", pos / 60, pos % 60);
  438.         (void) sprintf(abs_time, "%02d:%02d", (get_runtime() -
  439.             cur_pos_abs) / 60, (get_runtime() - cur_pos_abs) % 60);
  440.     }
  441.     if (strcmp(trk_time, (char *)xv_get(ip->tracktimer, PANEL_LABEL_STRING)))
  442.         xv_set(ip->tracktimer, PANEL_LABEL_STRING, trk_time, NULL);
  443.     if ((cur_pos_rel % 5) == 0 && xv_get(ip->songpos, PANEL_VALUE) !=
  444.                                 cur_pos_rel)
  445.         xv_set(ip->songpos, PANEL_VALUE, (cur_track > 0 && cur_frame <
  446.             cd->trk[cur_track - 1].start) ? 0 : cur_pos_rel, NULL);
  447.  
  448. /* Update the CD gauge */
  449.     if (strcmp(abs_time, (char *)xv_get(ip->cdtimer, PANEL_LABEL_STRING)))
  450.         xv_set(ip->cdtimer, PANEL_LABEL_STRING, abs_time, NULL);
  451.     if ((cur_pos_rel % 10) == 0 && xv_get(ip->cdgauge, PANEL_VALUE) !=
  452.                                 cur_pos_abs)
  453.         xv_set(ip->cdgauge, PANEL_VALUE, cur_pos_abs, NULL);
  454.  
  455. /* Are we past the beginning of the a-b repeat block? */
  456.     if (mark_a && cur_frame > mark_a)
  457.     {
  458.         if (xv_get(Workman_goodies->b, PANEL_INACTIVE) == TRUE)
  459.             xv_set(Workman_goodies->b, PANEL_INACTIVE, FALSE, NULL);
  460.     }
  461.     else
  462.         if (xv_get(Workman_goodies->b, PANEL_INACTIVE) == FALSE)
  463.         {
  464.             xv_set(Workman_goodies->b, PANEL_INACTIVE, TRUE, NULL);
  465.             if (! xv_get(Workman_goodies->abrepeat, PANEL_VALUE))
  466.                 xv_set(Workman_goodies->blabel, PANEL_INACTIVE,
  467.                     TRUE, NULL);
  468.         }
  469.  
  470.     if (xv_get(Workman_goodies->a, PANEL_INACTIVE) == (cur_cdmode == 1))
  471.     {
  472.         xv_set(Workman_goodies->a, PANEL_INACTIVE, cur_cdmode != 1,
  473.             NULL);
  474.         if (cur_cdmode != 1)
  475.             xv_set(Workman_goodies->b, PANEL_INACTIVE, TRUE, NULL);
  476.     }
  477. }
  478.  
  479. /*
  480.  * Populate the numbered buttons.  This has to be done in a fairly stupid
  481.  * manner since XView doesn't copy choice strings to its own buffers.
  482.  */
  483. void
  484. fill_buttons()
  485. {
  486.     Xv_opaque t = Workman_window1->tracks;
  487.     int    i, oldheight;
  488.     char    temp[20];
  489.  
  490.     xv_set(t, XV_SHOW, FALSE, NULL);
  491.  
  492.     if (numbered_buttons != NULL)
  493.     {
  494.         for (i = 0; numbered_buttons[i]; i++)
  495.             free(numbered_buttons[i]);
  496.         free(numbered_buttons);
  497.     }
  498.  
  499.     numbered_buttons = (char **) calloc(cur_ntracks + 1, sizeof(char **));
  500.     if (numbered_buttons == NULL)
  501.     {
  502.         perror("fill_buttons");
  503.         exit(1);
  504.     }
  505.  
  506.     track_rect = (Rect *) xv_get(t, PANEL_ITEM_RECT);
  507.     oldheight = track_rect->r_height;
  508.  
  509.     xv_set(t, PANEL_CHOICE_STRINGS, " ", NULL, NULL);
  510.  
  511.     for (i = 0; i < cur_ntracks; i++)
  512.     {
  513.         if (cd->trk[i].section)
  514.             sprintf(temp, "%2d.%d", cd->trk[i].track,
  515.                 cd->trk[i].section);
  516.         else
  517.             sprintf(temp, "%*d", cur_nsections ? 3 : 2,
  518.                 cd->trk[i].track);
  519.         
  520.         numbered_buttons[i] = (char *) malloc(strlen(temp) + 1);
  521.         if (numbered_buttons[i] == NULL)
  522.         {
  523.             perror("fill_buttons");
  524.             exit(1);
  525.         }
  526.         strcpy(numbered_buttons[i], temp);
  527.  
  528.         xv_set(t, PANEL_CHOICE_STRING, i, numbered_buttons[i], NULL);
  529.     }
  530.  
  531.     numbered_buttons[i] = NULL;
  532.  
  533.     xv_set(t, PANEL_CHOICE_NROWS, 1, NULL);
  534.     i = 1;
  535.     while (xv_get(t, XV_WIDTH) + 5 >= xv_get(Workman_window1->controls1,
  536.                                 XV_WIDTH))
  537.         xv_set(t, PANEL_CHOICE_NROWS, ++i, NULL);
  538.  
  539.     center_tracks();
  540.  
  541.     track_rect = (Rect *) xv_get(t, PANEL_ITEM_RECT);
  542.     add_height = track_rect->r_height - small_height;
  543.     scoot_stuff(track_rect->r_height - oldheight, 0);
  544.  
  545.     xv_set(t, XV_SHOW, TRUE, NULL);
  546. }
  547.  
  548. /*
  549.  * Set the CD length gauge to the right length for the whole CD.
  550.  */
  551. void
  552. reset_cdlen(ip)
  553. window1_objects *ip;
  554. {
  555.     char    scratch[16];
  556.  
  557.     xv_set(ip->cdgauge, PANEL_MIN_VALUE, 0, PANEL_MAX_VALUE, get_runtime(),
  558.         PANEL_INACTIVE, FALSE, NULL);
  559.     sprintf(scratch, "%2d:%02d", get_runtime() / 60, get_runtime() % 60);
  560.     xv_set(ip->cdlen, PANEL_LABEL_STRING, scratch, NULL);
  561. }
  562.  
  563. /*
  564.  * Fill up the track scrolling list and the track number menu.
  565.  */
  566. void
  567. fill_lists()
  568. {
  569.     popup1_objects    *pu = Workman_popup1;
  570.     plpopup_objects    *pl = Workman_plpopup;
  571.     int i;
  572.  
  573.     xv_set(pu->tracklist, XV_SHOW, FALSE, NULL);
  574.     for (i = 0; i < cur_ntracks; i++)
  575.     {
  576.         xv_set(xv_get(pl->playlist, PANEL_ITEM_MENU), MENU_APPEND_ITEM,
  577.             xv_create(NULL, MENUITEM, MENU_NOTIFY_PROC,
  578.             insert_into_playlist, MENU_RELEASE,
  579.             MENU_STRING, numbered_buttons[i], XV_KEY_DATA, 1234, i +
  580.             1, NULL), NULL);
  581.         xv_set(pu->tracklist, PANEL_LIST_INSERT, i, NULL);
  582.         xv_set(pu->tracklist, PANEL_LIST_STRING, i, listentry(i), NULL);
  583.     }
  584.  
  585.     xv_set(pu->tracklist, XV_SHOW, TRUE, NULL);
  586.  
  587.     xv_set(xv_get(pl->playlist, PANEL_ITEM_MENU), MENU_NCOLS,
  588.         xv_get(Workman_window1->tracks, PANEL_CHOICE_NROWS), NULL);
  589. }
  590.  
  591. /*
  592.  * Initialize all the status indicators (a new CD has been inserted.)
  593.  * This only initializes the static values; the rest are done by show_stats().
  594.  */
  595. void
  596. init_stats(ip)
  597. window1_objects *ip;
  598. {
  599.     popup1_objects    *pu = Workman_popup1;
  600.     plpopup_objects    *pl = Workman_plpopup;
  601.     int i, *list;
  602.     Panel_setting update_title();
  603.  
  604.     reset_cdlen(ip);
  605.     xv_set(ip->mode, PANEL_VALUE, 4, NULL);
  606.     icon_label("Stop");
  607.     xv_set(pu->artist, PANEL_VALUE, cur_artist, PANEL_INACTIVE, FALSE,
  608.         NULL);
  609.     xv_set(pu->cdname, PANEL_VALUE, cur_cdname, PANEL_INACTIVE, FALSE,
  610.         NULL);
  611.     xv_set(ip->artist_display, PANEL_INACTIVE, FALSE, NULL);
  612.     xv_set(ip->cdname_display, PANEL_INACTIVE, FALSE, NULL);
  613.     update_title(pu->cdname, NULL);
  614.     xv_set(pu->tracklist, PANEL_INACTIVE, FALSE, NULL);
  615.     xv_set(pu->trackname, PANEL_INACTIVE, FALSE, NULL);
  616.     xv_set(pu->trackoptions, PANEL_INACTIVE, FALSE, NULL);
  617.     xv_set(pl->playlist, PANEL_INACTIVE, FALSE, NULL);
  618.     xv_set(pl->playlists, PANEL_INACTIVE, FALSE, NULL);
  619.     xv_set(pl->listname, PANEL_INACTIVE, FALSE, NULL);
  620.     xv_set(pl->button7, PANEL_INACTIVE, FALSE, NULL);
  621.     xv_set(pu->whichvolume, PANEL_INACTIVE, FALSE, NULL);
  622.     xv_set(pu->defaultvolume, PANEL_INACTIVE, FALSE, NULL);
  623.     xv_set(pu->defaultspeaker, PANEL_INACTIVE, FALSE, NULL);
  624.     xv_set(Workman_goodies->balance, PANEL_INACTIVE, FALSE, NULL);
  625.     xv_set(Workman_goodies->indexscan, PANEL_INACTIVE, FALSE, NULL);
  626.     xv_set(pu->playmode, PANEL_INACTIVE, FALSE, NULL);
  627.     xv_set(pu->button1, PANEL_INACTIVE, FALSE, NULL);
  628.     xv_set(pu->button8, PANEL_INACTIVE, FALSE, NULL);
  629.     fill_buttons(ip);
  630.     fill_lists();
  631.  
  632.     xv_set(ip->tracks, PANEL_CHOOSE_ONE, TRUE, PANEL_CHOOSE_NONE, TRUE,
  633.         PANEL_VALUE, -1, NULL);
  634.     xv_set(pu->whichvolume, PANEL_VALUE, 0, PANEL_DEFAULT_VALUE, 1, NULL);
  635.     xv_set(pu->defaultvolume, PANEL_VALUE, get_default_volume(0), NULL);
  636.     set_default_volume(pu->defaultvolume, get_default_volume(0), NULL);
  637.     xv_set(pu->tracklist, PANEL_LIST_SELECT, 0, TRUE, NULL);
  638.     update_trackname(pu->trackname, NULL, trackname(0),
  639.         PANEL_LIST_OP_SELECT, NULL, 0);
  640.  
  641.     if (cd->lists != NULL)
  642.     {
  643.         for (i = 0; cd->lists[i].name != NULL; i++)
  644.         {
  645.             xv_set(ip->shuffle, PANEL_CHOICE_STRING, i + 2,
  646.                 cd->lists[i].name, NULL);
  647.             xv_set(pl->playlists, PANEL_LIST_INSERT, i,
  648.                 PANEL_LIST_STRING, i, cd->lists[i].name, NULL);
  649.         }
  650.  
  651.         (void) switch_playlists(pl->playlists, NULL, NULL,
  652.             PANEL_LIST_OP_SELECT, NULL, 0);
  653.     }
  654.     else
  655.         pop_listsize = 0;
  656.  
  657.     xv_set(ip->shuffle, PANEL_VALUE, get_playmode(), PANEL_DEFAULT_VALUE,
  658.         (get_playmode() + 1) % (cd->lists == NULL ? 2 : i + 2), NULL);
  659.     next_playmode_default(ip->shuffle, get_playmode(), NULL);
  660.  
  661.     xv_set(pu->autoplay, PANEL_VALUE, get_autoplay(), NULL);
  662.     xv_set(pu->playmode, PANEL_VALUE, get_playmode(), NULL);
  663.  
  664.     displayed_track = -1;
  665.     cur_cdmode = 4;
  666. }
  667.  
  668. /*
  669.  * Clean out the lists/menus that contain track numbers.
  670.  */
  671. void
  672. cleanout_lists()
  673. {
  674.     popup1_objects    *pu = Workman_popup1;
  675.     plpopup_objects    *pl = Workman_plpopup;
  676.     Menu            m;
  677.     int i;
  678.  
  679.     xv_set(pu->tracklist, XV_SHOW, FALSE, NULL);
  680.     i = xv_get(pu->tracklist, PANEL_LIST_NROWS);
  681.     m = (Menu) xv_get(pl->playlist, PANEL_ITEM_MENU);
  682.     while (--i > -1)
  683.     {
  684.         xv_set(m, MENU_REMOVE, i + 2, NULL);
  685.         xv_set(pu->tracklist, PANEL_LIST_DELETE, i, NULL);
  686.     }
  687.     xv_set(pu->tracklist, XV_SHOW, TRUE, NULL);
  688. }
  689.  
  690. /*
  691.  * CD has been ejected.  Remove all the status information.
  692.  */
  693. void
  694. kill_stats(ip)
  695. window1_objects *ip;
  696. {
  697.     popup1_objects    *pu = Workman_popup1;
  698.     plpopup_objects    *pl = Workman_plpopup;
  699.     Menu            m;
  700.     int i, height;
  701.  
  702.     xv_set(ip->songpos, PANEL_INACTIVE, TRUE, PANEL_VALUE, 0, NULL);
  703.     xv_set(ip->cdgauge, PANEL_INACTIVE, TRUE, PANEL_VALUE, 0, NULL);
  704.     new_trackname_display("", 0);
  705.     xv_set(ip->artist_display, PANEL_INACTIVE, TRUE, PANEL_LABEL_STRING,
  706.         "No artist", NULL);
  707.     xv_set(ip->cdname_display, PANEL_INACTIVE, TRUE, PANEL_LABEL_STRING,
  708.         "No CD name", NULL);
  709.     center_titles();
  710.     icon_label("No CD");
  711.  
  712.     cleanout_lists();
  713.  
  714.     xv_set(pl->playlist, XV_SHOW, FALSE, NULL);
  715.     i = xv_get(pl->playlist, PANEL_LIST_NROWS);
  716.     while (--i > -1)
  717.         xv_set(pl->playlist, PANEL_LIST_DELETE, i, NULL);
  718.     xv_set(pl->playlist, XV_SHOW, TRUE, NULL);
  719.  
  720.     i = xv_get(pl->playlists, PANEL_LIST_NROWS);
  721.     while (--i > -1)
  722.     {
  723.         xv_set(pl->playlists, PANEL_LIST_DELETE, i, NULL);
  724.     }
  725.  
  726.     xv_set(pu->tracklist, PANEL_INACTIVE, TRUE, NULL);
  727.     xv_set(pu->trackname, PANEL_INACTIVE, TRUE, PANEL_VALUE, empty, NULL);
  728.     xv_set(pu->trackoptions, PANEL_INACTIVE, TRUE, NULL);
  729.     xv_set(pu->artist, PANEL_INACTIVE, TRUE, PANEL_VALUE, empty, NULL);
  730.     xv_set(pu->cdname, PANEL_INACTIVE, TRUE, PANEL_VALUE, empty, NULL);
  731.     xv_set(pl->playlist, PANEL_INACTIVE, TRUE, NULL);
  732.     xv_set(pl->playlists, PANEL_INACTIVE, TRUE, NULL);
  733.     xv_set(pl->listname, PANEL_INACTIVE, TRUE, NULL);
  734.     xv_set(pl->delete, PANEL_INACTIVE, TRUE, NULL);
  735.     xv_set(pl->button5, PANEL_INACTIVE, TRUE, NULL);
  736.     xv_set(pl->button6, PANEL_INACTIVE, TRUE, NULL);
  737.     xv_set(pl->button7, PANEL_INACTIVE, TRUE, NULL);
  738.     xv_set(Workman_goodies->balance, PANEL_INACTIVE, TRUE, NULL);
  739.     xv_set(Workman_goodies->a, PANEL_INACTIVE, TRUE, NULL);
  740.     xv_set(Workman_goodies->b, PANEL_INACTIVE, TRUE, NULL);
  741.     xv_set(Workman_goodies->alabel, PANEL_INACTIVE, TRUE, NULL);
  742.     xv_set(Workman_goodies->blabel, PANEL_INACTIVE, TRUE, NULL);
  743.     xv_set(Workman_goodies->abrepeat, PANEL_INACTIVE, TRUE, NULL);
  744.     xv_set(Workman_goodies->split, PANEL_INACTIVE, TRUE, NULL);
  745.     xv_set(Workman_goodies->delete, PANEL_INACTIVE, TRUE, NULL);
  746.     xv_set(Workman_goodies->indexscan, PANEL_INACTIVE, TRUE, NULL);
  747.     xv_set(pu->whichvolume, PANEL_INACTIVE, TRUE, NULL);
  748.     xv_set(pu->defaultvolume, PANEL_INACTIVE, TRUE, NULL);
  749.     xv_set(pu->defaultspeaker, PANEL_INACTIVE, TRUE, NULL);
  750.     xv_set(pu->playmode, PANEL_INACTIVE, TRUE, NULL);
  751.     xv_set(pu->button1, PANEL_INACTIVE, TRUE, NULL);
  752.     xv_set(pu->button8, PANEL_INACTIVE, TRUE, NULL);
  753.     xv_set(ip->tracks, PANEL_CHOICE_STRINGS, "No CD in drive", NULL, NULL);
  754.     xv_set(ip->tracktimer, PANEL_LABEL_STRING, "00:00", NULL);
  755.     xv_set(ip->cdtimer, PANEL_LABEL_STRING, "00:00", NULL);
  756.     xv_set(ip->tracklen, PANEL_LABEL_STRING, "0:00", NULL);
  757.     xv_set(ip->cdlen, PANEL_LABEL_STRING, "0:00", NULL);
  758.     xv_set(ip->shuffle, PANEL_CHOICE_STRINGS, "Normal", "Shuffle",
  759.         NULL, PANEL_VALUE, 0, PANEL_DEFAULT_VALUE, 1, NULL);
  760.     center_tracks();
  761.  
  762.     if (track_rect != NULL)
  763.         scoot_stuff(-add_height, 0);
  764.  
  765.     pop_track = 0;
  766.     pl_item = -1;
  767.     displayed_track = 0;
  768.     mark_a = mark_b = 0;
  769.     manual_volume = 0;
  770. }
  771.  
  772. /*
  773.  * Event interpose function.  Update window_is_open and a bunch of the
  774.  * quiescent displays.  Check for a CD if we aren't polling the player
  775.  * and there wasn't a CD before.
  776.  */
  777. Notify_value
  778. check_open(f, event, arg, type)
  779.     Frame            f;
  780.     Notify_event        event;
  781.     Notify_arg        arg;
  782.     Notify_event_type     type;
  783. {
  784.     Notify_value    val;
  785.     int        was_opened = window_is_open;
  786.     int        old_retry;
  787.  
  788.     val = (Notify_value) notify_next_event_func(f, event, arg, type);
  789.     window_is_open = ! xv_get(f, FRAME_CLOSED);
  790.  
  791.     if (window_is_open && ! was_opened)
  792.     {
  793.         show_stats(Workman_window1);
  794.         xv_set(Workman_window1->cdgauge, PANEL_VALUE, cur_pos_abs,
  795.             NULL);
  796.         xv_set(Workman_window1->songpos, PANEL_VALUE, cur_pos_rel,
  797.             NULL);
  798.  
  799.         if (dont_retry && cur_cdmode == 5)
  800.         {
  801.             old_retry = dont_retry;
  802.             dont_retry = 0;
  803.             handle_timer(Workman_window1->window1, 0);
  804.             dont_retry = old_retry;
  805.         }
  806.     }
  807.  
  808.     return (val);
  809. }
  810.  
  811. /*
  812.  * Scoot stuff in the main window up or down, as appropriate.  Pass a code for
  813.  * the topmost thing to scoot (0 = sliders, 1 = tracks) and the distance to
  814.  * scoot, with negative meaning scoot up.
  815.  */
  816. void
  817. scoot_stuff(distance, topmost)
  818.     int    distance, topmost;
  819. {
  820. #define ip Workman_window1
  821.     if (distance < 0)
  822.     {
  823.         xv_set(ip->window1, XV_HEIGHT, xv_get(ip->window1,
  824.             XV_HEIGHT) + distance, NULL);
  825.         if (topmost >= 1)
  826.             xv_set(ip->tracks, PANEL_ITEM_Y, xv_get(ip->tracks,
  827.                 PANEL_ITEM_Y) + distance, NULL);
  828.         xv_set(ip->tracktimer, PANEL_ITEM_Y, xv_get(ip->tracktimer,
  829.             PANEL_ITEM_Y) + distance, NULL);
  830.         xv_set(ip->songpos, PANEL_ITEM_Y, xv_get(ip->songpos,
  831.             PANEL_ITEM_Y) + distance, NULL);
  832.         xv_set(ip->tracklen, PANEL_ITEM_Y, xv_get(ip->tracklen,
  833.             PANEL_ITEM_Y) + distance, NULL);
  834.         xv_set(ip->speaker, PANEL_ITEM_Y, xv_get(ip->speaker,
  835.             PANEL_ITEM_Y) + distance, NULL);
  836.         xv_set(ip->volume, PANEL_ITEM_Y, xv_get(ip->volume,
  837.             PANEL_ITEM_Y) + distance, NULL);
  838.         xv_set(ip->mode, PANEL_ITEM_Y, xv_get(ip->mode,
  839.             PANEL_ITEM_Y) + distance, NULL);
  840.         xv_set(ip->repeat, PANEL_ITEM_Y, xv_get(ip->repeat,
  841.             PANEL_ITEM_Y) + distance, NULL);
  842.         xv_set(ip->shuffle, PANEL_ITEM_Y, xv_get(ip->shuffle,
  843.             PANEL_ITEM_Y) + distance, NULL);
  844.         xv_set(ip->cdtimer, PANEL_ITEM_Y, xv_get(ip->cdtimer,
  845.             PANEL_ITEM_Y) + distance, NULL);
  846.         xv_set(ip->cdgauge, PANEL_ITEM_Y, xv_get(ip->cdgauge,
  847.             PANEL_ITEM_Y) + distance, NULL);
  848.         xv_set(ip->cdlen, PANEL_ITEM_Y, xv_get(ip->cdlen,
  849.             PANEL_ITEM_Y) + distance, NULL);
  850.         xv_set(ip->button4, PANEL_ITEM_Y, xv_get(ip->button4,
  851.             PANEL_ITEM_Y) + distance, NULL);
  852.         xv_set(ip->button3, PANEL_ITEM_Y, xv_get(ip->button3,
  853.             PANEL_ITEM_Y) + distance, NULL);
  854.         xv_set(ip->button2, PANEL_ITEM_Y, xv_get(ip->button2,
  855.             PANEL_ITEM_Y) + distance, NULL);
  856.         if (dismiss_button)
  857.             xv_set(quitbutton, PANEL_ITEM_Y, xv_get(quitbutton,
  858.                 PANEL_ITEM_Y) + distance, NULL);
  859.     }
  860.     else if (distance > 0)
  861.     {
  862.         xv_set(ip->window1, XV_HEIGHT, xv_get(ip->window1,
  863.             XV_HEIGHT) + distance, NULL);
  864.         if (dismiss_button)
  865.             xv_set(quitbutton, PANEL_ITEM_Y, xv_get(quitbutton,
  866.                 PANEL_ITEM_Y) + distance, NULL);
  867.         xv_set(ip->button4, PANEL_ITEM_Y, xv_get(ip->button4,
  868.             PANEL_ITEM_Y) + distance, NULL);
  869.         xv_set(ip->button3, PANEL_ITEM_Y, xv_get(ip->button3,
  870.             PANEL_ITEM_Y) + distance, NULL);
  871.         xv_set(ip->button2, PANEL_ITEM_Y, xv_get(ip->button2,
  872.             PANEL_ITEM_Y) + distance, NULL);
  873.         xv_set(ip->cdtimer, PANEL_ITEM_Y, xv_get(ip->cdtimer,
  874.             PANEL_ITEM_Y) + distance, NULL);
  875.         xv_set(ip->cdgauge, PANEL_ITEM_Y, xv_get(ip->cdgauge,
  876.             PANEL_ITEM_Y) + distance, NULL);
  877.         xv_set(ip->cdlen, PANEL_ITEM_Y, xv_get(ip->cdlen,
  878.             PANEL_ITEM_Y) + distance, NULL);
  879.         xv_set(ip->volume, PANEL_ITEM_Y, xv_get(ip->volume,
  880.             PANEL_ITEM_Y) + distance, NULL);
  881.         xv_set(ip->speaker, PANEL_ITEM_Y, xv_get(ip->speaker,
  882.             PANEL_ITEM_Y) + distance, NULL);
  883.         xv_set(ip->mode, PANEL_ITEM_Y, xv_get(ip->mode,
  884.             PANEL_ITEM_Y) + distance, NULL);
  885.         xv_set(ip->shuffle, PANEL_ITEM_Y, xv_get(ip->shuffle,
  886.             PANEL_ITEM_Y) + distance, NULL);
  887.         xv_set(ip->repeat, PANEL_ITEM_Y, xv_get(ip->repeat,
  888.             PANEL_ITEM_Y) + distance, NULL);
  889.         xv_set(ip->tracktimer, PANEL_ITEM_Y, xv_get(ip->tracktimer,
  890.             PANEL_ITEM_Y) + distance, NULL);
  891.         xv_set(ip->songpos, PANEL_ITEM_Y, xv_get(ip->songpos,
  892.             PANEL_ITEM_Y) + distance, NULL);
  893.         xv_set(ip->tracklen, PANEL_ITEM_Y, xv_get(ip->tracklen,
  894.             PANEL_ITEM_Y) + distance, NULL);
  895.         if (topmost >= 1)
  896.             xv_set(ip->tracks, PANEL_ITEM_Y, xv_get(ip->tracks,
  897.                 PANEL_ITEM_Y) + distance, NULL);
  898.     }
  899. }
  900. #undef ip
  901.