PtModalStart, PtModalEnd

Gamma/Photon: Using Gamma™ with the Photon microGUIŽ, Version 4.0
Prev |  | Next

# `PtModalStart`, `PtModalEnd`

`PtModalStart`, `PtModalEnd` -- start and end modal processing.

## Syntax

    PtModalStart ()
    PtModalEnd (start_number)

## Arguments

`start_number`

  The modal-processing loop number returned from a call to `PtModalStart`.

## Returns

`PtModalStart` returns an integer used as the start-number for PtModalEnd.

`PtModalEnd` returns t if modal processing was successfully exited.

## Description

`PtModalStart` initiates modal processing, which halts the current event loop and starts a new loop. This is useful for creating a dialog box where the user must make some input before accessing any other widget in the interface. To block and unblock other windows, you have to use the `Pt_BLOCKED` resource, as demonstrated in the example below. When the dialog or other use of modal processing is finished, the modal event loop is exited by calling `PtModalEnd`.

## Example

This example, `ex_PtModalStart.g`, is included in the `gamma_ph_`#`_examples_1_QNX4.tgz` file available on the Cogent Web Site.

    #!/usr/cogent/bin/phgamma

    /*
    This example creates a window with a label you can drag, and a
    "Freeze" button.  Pressing the "Freeze" button initiates
    PtModalStart() and opens another window, with an "Unfreeze" button.
    Until the "Unfreeze" button is pressed, the first window is frozen.
    */

    require_lisp("PhotonWidgets");

    PtInit(nil);

    //The main window.

    win = new(PtWindow);
    win.SetArea(300,50,250,250);
    PtRealizeWidget(win);

    lab = new(PtLabel);
    lab.text_string = "Drag Me";
    lab.SetPos(90, 30);
    PtRealizeWidget(lab);

    button1 = new(PtButton);
    button1.text_string = "Freeze label and open message";
    button1.SetPos(30, 75);
    PtAttachCallback(button1, Pt_CB_ACTIVATE, #doOpen());
    PtRealizeWidget(button1);

    exitbut = new(PtButton);
    exitbut.SetPos(110, 175);
    exitbut.text_string = "Exit";
    PtAttachCallback(exitbut,Pt_CB_ACTIVATE,#exit_program(1));
    PtRealizeWidget(exitbut);

    //Functions to start and end modal state.

    function PhabModalLoop(done)
    {
    	local count = nil;
    	protect
    	{
    		count = PtModalStart();
    		while(!eval(done))
    			PtProcessEvent();
    	}
    	unwind
    	{
    		if(count != nil)
    			PtModalEnd(count);
    	}
    }

    function doOpen()
    {
      make_msg();
      done = nil;
      win.flags = Pt_BLOCKED;
      PhabModalLoop(eval(done));
    }

    function doClose()
    {
     done = t;
     win.flags = cons(Pt_BLOCKED, nil);
    }

    //The modal_state window.

    /* This function makes the modal_state window using a PtMessage widget.*/
    function make_msg()
    {
      win2 = new(PtMessage);
      win2.msg_text = "Press Cancel to continue.\nPress Print to print this\nmessage and continue.\n ";
      win2.msg_title = "The message.";
      win2.flags = Pt_MSG_CENTER_ON_PARENT;
      win2.msg_button1 = "Cancel";
      win2.msg_button2 = "Print";

      PtAttachCallback(win2, Pt_CB_MSG_BUTTON2, `princ(@win2.msg_text, "\n"));
      PtAttachCallback(win2, Pt_CB_MSG_BUTTON2, #doClose());
      PtAttachCallback(win2, Pt_CB_MSG_BUTTON1, #doClose());
      PtRealizeWidget(win2);
    }

    /*  An alternate way to make the window, using a PtWindow widget.
    	If used, the following lines must be added...
    	to doOpen()  :  PtRealizeWidget(win2);
    	to doClose() :  PtUnrealizeWidget(win2);
    	and the line :  make_msg();
    	should be removed from doOpen().

    win2 = new(PtWindow);
    win2.SetArea(440,100,100,80);
    lab2 = new(PtLabel);
    lab2.text_string = "Press button to continue.";
    button2 = new(PtButton);
    button2.text_string = "Unfreeze";
    button2.SetPos(40, 30);
    PtAttachCallback(button2, Pt_CB_ACTIVATE, #doClose());
    */

    //Functions to create a drag_able widget.

    DraggedWidget := nil;

    method PtWidget.StartDrag ()
    {
       DraggedWidget = self;
       PtInitDrag (self, nil, Ph_TRACK_DRAG | Ph_DRAG_TRACK);
    }

    function handle_drag ()
    {
       local   event = cbinfo.event, rect;

       if (event.type == Ph_EV_DRAG)
       {
          if (event.subtype == Ph_EV_DRAG_COMPLETE ||
                event.subtype == Ph_EV_DRAG_MOVE)
          {
             if (DraggedWidget)
             {
                rect = TranslateRect (event_data.drag_event.rect,
                  event.translation);
                DraggedWidget.SetPos (rect.ul.x, rect.ul.y);
             }
             if (event.subtype == Ph_EV_DRAG_COMPLETE)
                DraggedWidget = nil;
          }
       }
    }

    PtAttachCallback(win,Pt_CB_RAW,#handle_drag(),Ph_EV_DRAG);
    PtAttachCallback(lab,Pt_CB_RAW,#widget.StartDrag(),Ph_EV_BUT_PRESS);

    PtMainLoop();

## See Also

In Photon documentation: PtModalStart and PtModalEnd.

Prev | Home | Next
`PtMainLoop` | Up | `PtProcessEvent`

Copyright 1995-2002 by Cogent Real-Time Systems, Inc.