[comp.sys.apollo] detail solution for popup

wcwang@iuvax.cs.indiana.edu (08/20/87)

From: Bill Wang <wcwang@iuvax.cs.indiana.edu>


From ihnp4!attunix!apollo!molson Thu Aug 20 06:37:28 1987
Received: by ihnp4.ATT.COM id AA19151; 19 Aug 87 20:17:13 CDT (Wed)
Received: by apollo.UUCP id AA07017; Wed, 19 Aug 87 17:40:59 edt
From: Margaret Olson <ihnp4!apollo!molson>
Message-Id: <8708192140.AA07017@apollo.UUCP>
Date: Wed, 19 Aug 87 17:35:51 EDT
Subject: dsee popup problem
To: ihnp4!iuvax!wcwang
Cc: schulert
Status: R

Bill,

    I'm no Dialog expert, but I have dealt with the problem I think you are
    describing.  I'll redescribe it just to make sure.

    The problem:
        There is a popup that upon some action calls a subroutine.  If
        the subroutine succeeds, the popup should popdown.  If the subroutine
        fails, the popup should remain visible with it's associated error
        condition.  

        If the .dps just says * popdown, then the popup pops down as soon   
        as the subroutine exits, along with any error msg.  The error message
        is impossible to see if the user is not a super-speed reader.

    The solution:
        The only way to control popups from a program is with task groups.  
        Defining a task group for every popup is a pain, so what I have done
        is define one task group, which pops down whatever thing the locating 
        cursor is on.  When the subroutine is executing the locating cursor is 
        on the popup that caused the subr to be called, so this works.  The only 
        trick is that the dummy task is never deactivated, and if you just keep 
        reactivating it dialog won't do the activate action.  So you need to 
        write something to 'really_activate'.  really_activate gets the activate 
        count, deactivates down to zero, and then activates the task.

        Here is a simple example, with a popup string.  Once you have set this up,
        you don't have to modify your .dps for every popup technique.  You just
        have to remember to call really_activate at the end of every popup-derived
        subroutine call.

            The .dps:
            DIALOG
                APPLICATION_INTERFACE foo
                    
                    popped_string_thing := string:
                        comp => <call do_string_thing>;
                        end
                    
                    dummy_task := null:
                        end
                    dummy_task_group := task_group:
                        tasks = (dummy_task)
                        end
                           
                    most_tasks_group := task_group:
                        tasks = (popped_string_thing)
                        end

                USER_INTERFACE foo
                    dummy_task_group activate => <* popdown>; /* popdown the popup under the locater */
                    
                    popped_string_tech := string_field:
                        task = popped_string_thing;
                        /* [cr] => <+ accept>, by default if you use dialog_user.ins.dps */
                        end
            
                    popped_string_pop := popup:
                        contents = popped_string_tech;  
                        end
                           
                    < more stuff for window >
 
            The application, in c:

                void really_activate()
                {                
                    int       i;
                    status_$t st;
                    short     count;

                    dp_$task_get_activate_count(dummy_task_group,count,status);
                    
                    for (i = 0; i < count; i++)
                        dp_$task_deactivate(dummy_task_group,status);

                    /* really activate task! */
                    dp_$task_activate(dummy_task_group,status);
                }
            
                void do_popped_string_thing(task_id,event_id)
                dp_$task_id *task_id;
                dp_$event_id *evnet_id;
                {
                    if (anything_fails)
                        dp_$task_notify_msg(*task_id,....)
                    else
                        really_activate();
                }

    Hope this helps,

    Margaret Olson
    Apollo Computer

    molson!apollo
    
-------



====



Bill Wang
Speech & Hearing Center, Indiana University, Bloomington, IN 47405

UUCP  = {ihnp4,seismo,cbosgd}!iuvax!wcwang
CSNET = wcwang@indiana
ARPA  = wcwang@iuvax.cs.indiana.edu
Phone = (812) 335-0714