#help_index "Task/Settings"

public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0)
{//Typically, called at start of an application.
//It saves many settings so they can be restored
  //at the end of the application with SettingsPop().

  CTaskSettings *tmpse;
  CDoc *doc;
  if (!task) task=Fs;
  if (!TaskValidate(task)) return NULL;
  tmpse=CAlloc(sizeof(CTaskSettings),task);
  tmpse->cur_dir=DirCur(task,task);
  tmpse->draw_it=task->draw_it;
  GrPaletteGet(tmpse->palette);
  tmpse->task_end_cb=task->task_end_cb;

  if (!(flags&TSF_SAME_SONG)) {
    if (tmpse->song_task=task->song_task) {
      Suspend(task->song_task);
      Snd;
    }
    task->song_task=NULL;
  }

  if (tmpse->animate_task=task->animate_task)
    Suspend(task->animate_task);
  task->animate_task=NULL;

  if (doc=DocPut(task)) {
    tmpse->hide_cursor=!Bt(&doc->flags,DOCf_HIDE_CURSOR);
    tmpse->highlight_cursor=!Bt(&doc->flags,DOCf_DONT_HIGHLIGHT_CURSOR);
    tmpse->scroll=!Bt(&doc->flags,DOCf_NO_SCROLL_BARS);
  }

  tmpse->left=task->win_left;
  tmpse->right=task->win_right;
  tmpse->top=task->win_top;
  tmpse->bottom=task->win_bottom;

  tmpse->scroll_x=task->scroll_x;
  tmpse->scroll_y=task->scroll_y;
  tmpse->scroll_z=task->scroll_z;

  tmpse->win_inhibit=task->win_inhibit;
  tmpse->text_attr=task->text_attr;
  StrCpy(tmpse->task_title,task->task_title);
  tmpse->title_src  =task->title_src;
  tmpse->border_attr=task->border_attr;
  tmpse->border_src =task->border_src;
  tmpse->border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER);
  if (TaskValidate(ac.task))
    tmpse->autocomplete=TRUE;
  else
    tmpse->autocomplete=FALSE;

  tmpse->next=task->next_settings;
  task->next_settings=tmpse;
  return tmpse;
}

U0 SettingsPop2(CTask *task,CTaskSettings *tmpse)
{
  CDoc *doc;

  if (doc=DocPut(task)) {
    LBEqu(&doc->flags,DOCf_HIDE_CURSOR,!tmpse->hide_cursor);
    LBEqu(&doc->flags,DOCf_DONT_HIGHLIGHT_CURSOR,!tmpse->highlight_cursor);
    LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!tmpse->scroll);
  }

  WinBorder(tmpse->border,task);
  WinHorz(tmpse->left,tmpse->right,task);
  WinVert(tmpse->top,tmpse->bottom,task);
  task->scroll_x=tmpse->scroll_x;
  task->scroll_y=tmpse->scroll_y;
  task->scroll_z=tmpse->scroll_z;
  task->win_inhibit=tmpse->win_inhibit;
  task->text_attr=tmpse->text_attr;
  task->border_attr=tmpse->border_attr;
  task->border_src =tmpse->border_src;
  task->title_src  =tmpse->title_src;
  StrCpy(task->task_title,tmpse->task_title);
  AutoComplete(tmpse->autocomplete);
  GrPaletteSet(tmpse->palette);
  Snd;
}

public U0 SettingsPop(CTask *task=NULL,I64 flags=0)
{//Typically, called at end of an application.
  CTaskSettings *tmpse;
  if (!task) task=Fs;
  if (!TaskValidate(task))
    return;
  if (tmpse=task->next_settings) {
    task->next_settings=tmpse->next;
    Cd(tmpse->cur_dir);
    Free(tmpse->cur_dir);
    task->draw_it=tmpse->draw_it;
    task->task_end_cb=tmpse->task_end_cb;

    if (task->animate_task)
      Kill(task->animate_task);
    if (task->animate_task=tmpse->animate_task)
      Suspend(task->animate_task,FALSE);

    if (!(flags&TSF_SAME_SONG)) {
      if (task->song_task)
        Kill(task->song_task);
      if (task->song_task=tmpse->song_task)
        Suspend(task->song_task,FALSE);
    }

    SettingsPop2(task,tmpse); //Do it to get ress fast
    Refresh(,TRUE);
    SettingsPop2(task,tmpse); //Redo in case was lost by old update

    Free(tmpse);
  }
}