 |
OpenVMS RTL Screen Management (SMG$) Manual
SMG$DELETE_SUBPROCESS
The Terminate a Subprocess routine deletes a subprocess that was
created with the SMG$CREATE_SUBPROCESS routine.
Format
SMG$DELETE_SUBPROCESS display-id
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Argument
display-id
OpenVMS usage: |
identifier |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Identifier of the virtual display associated with the subprocess being
deleted. The display-id argument is the address of an
unsigned longword that contains this virtual display identifier.
Description
SMG$DELETE_SUBPROCESS deletes a subprocess that was created by a call
to SMG$CREATE_SUBPROCESS. Because the Screen Management Facility
provides its own exit handlers, do not invoke SMG$DELETE_SUBPROCESS
from within your own exit handler. For more information, see
Section 4.4.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SS$_xxxx
|
Any status returned by $DELPRC.
|
SMG$_INVDIS_ID
|
Invalid
display-id.
|
SMG$_NOSUBEXI
|
No subprocess exists.
|
LIB$_xxxx
|
Any status returned by LIB$FREE_VM.
|
SMG$DELETE_VIEWPORT
The Delete a Viewport routine deletes the specified viewport from any
pasteboards to which it is pasted.
Format
SMG$DELETE_VIEWPORT display-id
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Argument
display-id
OpenVMS usage: |
identifier |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Identifier of the virtual display associated with the viewport to be
deleted. The display-id argument is the address of an
unsigned longword containing the display identifier.
Description
SMG$DELETE_VIEWPORT deletes a viewport. The viewport is automatically
"unpasted" from any pasteboards to which it is pasted.
However, the virtual display associated with the deleted viewport has
not been deleted. To view this virtual display, you must paste it to
the pasteboard with the SMG$PASTE_VIRTUAL_DISPLAY routine. To delete
this virtual display, use the SMG$DELETE_VIRTUAL_DISPLAY routine.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SMG$_INVDIS_ID
|
Invalid
display-id.
|
SMG$_NO_WINASSOC
|
No viewport associated with the virtual display.
|
SMG$_WRONUMARG
|
Wrong number of arguments.
|
SMG$DELETE_VIRTUAL_DISPLAY
The Delete Virtual Display routine deletes a virtual display.
Format
SMG$DELETE_VIRTUAL_DISPLAY display-id
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Argument
display-id
OpenVMS usage: |
identifier |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Specifies the virtual display to be deleted. The
display-id argument is the address of an unsigned
longword that contains the display identifier.
The display identifier display-id is returned by
SMG$CREATE_VIRTUAL_DISPLAY.
Description
SMG$DELETE_VIRTUAL_DISPLAY deletes a virtual display and removes it
from any pasteboard on which it is pasted. It also deallocates any
buffer space associated with the virtual display.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SMG$_INVDIS_ID
|
Invalid
display-id.
|
SMG$_NOTPASTED
|
The specified virtual display is not pasted to the specified pasteboard.
|
SMG$_WILUSERMS
|
Pasteboard is not a video terminal.
|
SMG$_WRONUMARG
|
Wrong number of arguments.
|
Any condition values returned by LIB$FREE_VM.
SMG$DELETE_VIRTUAL_KEYBOARD
The Delete Virtual Keyboard routine deletes a virtual keyboard.
Format
SMG$DELETE_VIRTUAL_KEYBOARD keyboard-id
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Argument
keyboard-id
OpenVMS usage: |
identifier |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Specifies the virtual keyboard to be deleted. The
keyboard-id argument is the address of an unsigned
longword that contains the keyboard identifier.
The keyboard identifier is returned by SMG$CREATE_VIRTUAL_KEYBOARD.
Description
SMG$DELETE_VIRTUAL_KEYBOARD deletes a virtual keyboard. Any terminal
attributes specified when the keyboard was created are reset to their
previous values and the keypad mode (numeric or application) is reset
to its original state. In addition, the channel is deassigned and, if
the virtual keyboard was a file, the file is closed.
Because SMG$ provides its own exit handlers, this routine should not be
called from your own exit handler. For more information, see
Section 4.4.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SMG$_INVKBD_ID
|
Invalid
keyboard-id.
|
SMG$_WRONUMARG
|
Wrong number of arguments.
|
SMG$DEL_TERM_TABLE
The Delete Terminal Table routine terminates access to a private
TERMTABLE.EXE and frees the associated virtual address space.
Format
SMG$DEL_TERM_TABLE
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Arguments
None.
Description
SMG$DEL_TERM_TABLE terminates access to a private TERMTABLE.EXE.
Calling this routine is optional. This routine is useful in the case
where a calling program might need to reuse the virtual address space
used by a private TERMTABLE. This routine should be used only when you
perform direct (non-SMG$) I/O to terminals.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SMG$DISABLE_BROADCAST_TRAPPING
The Disable Broadcast Trapping routine disables trapping of broadcast
messages for the specified terminal.
Format
SMG$DISABLE_BROADCAST_TRAPPING pasteboard-id
RETURNS
OpenVMS usage: |
cond_value |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by value |
Argument
pasteboard-id
OpenVMS usage: |
identifier |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Specifies the pasteboard for the terminal to be affected. The
pasteboard-id argument is the address of an unsigned
longword that contains the pasteboard identifier.
Description
SMG$DISABLE_BROADCAST_TRAPPING disables trapping of broadcast messages
for the specified terminal. SMG$DISABLE_BROADCAST_TRAPPING deassigns
the mailbox set with SMG$SET_BROADCAST_TRAPPING, resets the terminal
characteristics, and therefore allows the user to call LIB$SPAWN. This
routine must be used to disable any broadcast trapping set with the
routine SMG$SET_BROADCAST_TRAPPING.
When you disable broadcast trapping, any broadcast messages that have
been queued to the terminal are lost. If you enable broadcast trapping
with SMG$SET_BROADCAST_TRAPPING but do not disable it with
SMG$DISABLE_BROADCAST_TRAPPING before the image exits, any messages
that have been broadcast to the terminal are lost when the image exits.
Note that if both broadcast trapping and the trapping of unsolicited
input are enabled, then both SMG$DISABLE_BROADCAST_TRAPPING and
SMG$DISABLE_UNSOLICITED_INPUT must be invoked to deassign the mailbox.
Condition Values Returned
SS$_NORMAL
|
Normal successful completion.
|
SMG$_WRONUMARG
|
Wrong number of arguments.
|
Any condition value returned by $QIOW.
Example
|
10 !+
!This VAX BASIC program creates three virtual displays on
!one pasteboard.
!
!The first virtual display contains instructions for the user,
!the second shows trapped unsolicited input, and the third
!lists trapped broadcast messages. The program sits in an
!infinite loop until the user types a Ctrl/Z.
!
!When the program traps unsolicited input, both broadcast message
!and unsolicited input trapping are disabled, and a subprocess
!is spawned which executes the trapped user input.
!
!When control returns to the main process, broadcast trapping and
!the trapping of unsolicited input are both reenabled. If the
!unsolicited input which is trapped is a Ctrl/Z, the program exits.
!-
OPTION TYPE = EXPLICIT
!+
!Declaration of all routines called by the main program.
!-
%INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
!+
!Declaration of the two AST routines:
!GET_MSG is called when a broadcast message is trapped
!GET_INPUT is called when there is unsolicited input
!GET_INPUT is the routine which spawns the subprocess
!-
EXTERNAL INTEGER GET_MSG
EXTERNAL INTEGER GET_INPUT
DECLARE LONG pb_id, ret_status, display_id, display2_id, display3_id, &
key_id, key_tab_id, counter
!+
!Create a MAP area for variables which must be shared between the
!main program and the AST routines.
!-
MAP (params) LONG disp_info(2), LONG keyboard_info(4), LONG done_flag
DECLARE STRING CONSTANT top_label = "User Input"
DECLARE STRING CONSTANT ins_label = "Instructions"
DECLARE STRING CONSTANT msg_label = "Messages"
DECLARE STRING CONSTANT instr_0 = "Type commands to fill INPUT display."
DECLARE STRING CONSTANT instr_1 = "Type Ctrl/T to fill MESSAGES display."
DECLARE STRING CONSTANT instr_2 = "Type Ctrl/Z to exit."
DECLARE LONG CONSTANT advance = 1
%INCLUDE "$SMGDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
!+
!The done_flag variable is clear (0) unless the user input was
!a Ctrl/Z. In that case, the program exits.
!-
done_flag = 0
!+
!Create the pasteboard and the virtual keyboard
!-
ret_status = SMG$CREATE_PASTEBOARD (pb_id)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!This is one of the values which must be stored in the MAP area.
!-
disp_info(0) = pb_id
ret_status = SMG$CREATE_VIRTUAL_KEYBOARD (key_id)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$CREATE_KEY_TABLE (key_tab_id)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!Create the three virtual displays
!-
ret_status = SMG$CREATE_VIRTUAL_DISPLAY(3 BY REF, 75 BY REF, &
display3_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$CREATE_VIRTUAL_DISPLAY(6 BY REF, 75 BY REF, &
display_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$CREATE_VIRTUAL_DISPLAY(6 BY REF, 75 BY REF, &
display2_id, SMG$M_BORDER BY REF, SMG$M_REVERSE BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!The disp_info and keyboard_info arrays are required in the MAP.
!-
disp_info(1) = display2_id
keyboard_info(0) = key_id
keyboard_info(1) = key_tab_id
keyboard_info(2) = display_id
keyboard_info(4) = pb_id
!+
!Put Label borders around the three virtual displays.
!-
ret_status = SMG$LABEL_BORDER (display3_id, ins_label,,, &
SMG$M_BOLD BY REF, SMG$M_REVERSE BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$LABEL_BORDER (display_id, top_label,,, &
SMG$M_BOLD BY REF,)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$LABEL_BORDER (display2_id, msg_label,,, &
SMG$M_BOLD BY REF,)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!Fill the INSTRUCTIONS virtual display with user instructions.
!-
ret_status = SMG$PUT_LINE(display3_id, instr_0, &
advance,,, smg$m_wrap_char)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$PUT_LINE(display3_id, instr_1, &
advance,,, smg$m_wrap_char)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$PUT_LINE(display3_id, instr_2, &
advance,,, smg$m_wrap_char)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!Paste the virtual displays to the screen.
!-
ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display3_id, pb_id, &
2 BY REF, 4 BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display_id, pb_id, &
8 BY REF, 4 BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
ret_status = SMG$PASTE_VIRTUAL_DISPLAY(display2_id, pb_id, &
18 BY REF, 4 BY REF)
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!Enable the trapping of unsolicited input. GET_INPUT is the
!AST procedure that is called when unsolicited input is
!received. This AST has one parameter, passed as null.
!-
ret_status = SMG$ENABLE_UNSOLICITED_INPUT(pb_id, LOC(GET_INPUT))
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!Enable the trapping of broadcast messages. GET_MSG is the
!AST which is called when broadcast messages are received.
!This AST outputs the trapped message into the MESSAGES display.
!-
ret_status = SMG$SET_BROADCAST_TRAPPING(pb_id, LOC(GET_MSG))
IF (ret_status AND 1%) = 0% THEN
CALL LIB$STOP(ret_status BY VALUE)
END IF
!+
!This loop continually executes until done_flag is set to 1.
!Done_flag is set to 1 when the user input is a Ctrl/Z.
!If done_flag is 1, delete the pasteboard and exit the program.
!-
Infinite_loop:
IF done_flag = 0 THEN
GOTO infinite_loop
ELSE
ret_status = SMG$DELETE_PASTEBOARD (pb_id)
GOTO all_done
END IF
All_done:
END
20 !+
!Start of AST routine GET_INPUT. This AST is called whenever there
!is unsolicited input. The unsolicited input is displayed in the
!INPUT virtual display, and if this input is not Ctrl/Z, a subprocess
!is spawned and the input command is executed. While this spawned
!subprocess is executing, broadcast and unsolicited input trapping
!are disabled.
!-
SUB GET_INPUT (paste_id, param, nl_1, nl_2, nl_3, nl_4)
MAP (params) LONG disp_info(2), LONG keyboard_info(4), LONG done_flag
DECLARE LONG z_status, status2, keybd_id, keybd_tab_id, disp_id, &
pastebd, new_display, spawn_status
DECLARE WORD msg2_len
DECLARE STRING msg2
DECLARE LONG CONSTANT next_line = 1
%INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
EXTERNAL INTEGER GET_MSG
EXTERNAL INTEGER GET_INPUT
!+
!Assign to the local variables the values that were stored from
!the main program using the MAP area.
!-
keybd_id = keyboard_info(0)
keybd_tab_id = keyboard_info(1)
disp_id = keyboard_info(2)
pastebd = keyboard_info(3)
!+
!SMG$ENABLE_UNSOLICITED_INPUT does not read the input, it simply
!signals the specified AST when there is unsolicited input present.
!You must use SMG$READ_COMPOSED_LINE to actually read the input.
!
!At this time, we check to see if the unsolicited input was a Ctrl/Z.
!If so, we skip over the program lines that spawn the subprocess and
!get ready to exit the program.
!-
status2 = SMG$READ_COMPOSED_LINE (keybd_id, keybd_tab_id, msg2,, &
msg2_len, disp_id)
IF (status2 = SMG$_EOF) THEN
GOTO Control_Z
END IF
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!In order to spawn a subprocess, we must first disable
!unsolicited input trapping and broadcast trapping.
!-
status2 = SMG$DISABLE_UNSOLICITED_INPUT (pastebd)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
status2 = SMG$DISABLE_BROADCAST_TRAPPING (pastebd)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!Save the current screen so that it will not be destroyed when
!the subprocess is executing.
!-
status2 = SMG$SAVE_PHYSICAL_SCREEN (pastebd, new_display)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!Call LIB$SPAWN to create the subprocess, and pass the unsolicited
!input as the command line.
!-
spawn_status = LIB$SPAWN (msg2)
!+
!Restore the saved screen image.
!-
status2 = SMG$RESTORE_PHYSICAL_SCREEN (pastebd, new_display)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!Reenable broadcast trapping and unsolicited input trapping.
!-
status2 = SMG$ENABLE_UNSOLICITED_INPUT (pastebd, LOC(GET_INPUT))
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
status2 = SMG$SET_BROADCAST_TRAPPING (pastebd, LOC(GET_MSG))
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!Skip the steps which are performed if the unsolicited input
!was a Ctrl/Z.
!-
GOTO Out_of_sub
Control_Z:
!+
!We should disable unsolicited input and broadcast trapping
!before we leave the program.
!-
status2 = SMG$DISABLE_UNSOLICITED_INPUT (pastebd)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
status2 = SMG$DISABLE_BROADCAST_TRAPPING (pastebd)
IF (status2 AND 1%) = 0% THEN
CALL LIB$STOP (status2 BY VALUE)
END IF
!+
!Set the done_flag to 1 so that the main program knows we have
!to exit.
!-
done_flag = 1
Out_of_sub:
END SUB
30 !+
!Start of AST routine GET_MSG. This AST is called whenever there
!is a broadcast message. This routine prints the message in the
!MESSAGES virtual display.
!-
SUB GET_MSG (paste_id, nl_1, nl_2, nl_3, nl_4)
DECLARE LONG status1, pasteboard, second_disp
DECLARE WORD msg_len
DECLARE STRING msg
DECLARE LONG CONSTANT forward = 1
MAP (params) LONG disp_info(2), LONG keyboard_info(4)
%INCLUDE "SMG$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "LIB$ROUTINES" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$SMGDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$SMGMSG" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
!+
!Assign values to the local variables according to the values stored
!in the MAP area.
!-
pasteboard = disp_info(0)
second_disp = disp_info(1)
!+
!Print the trapped message in the MESSAGES display. If there are no
!more messages, go back to the infinite loop in the main program.
!-
WHILE 1
status1 = SMG$GET_BROADCAST_MESSAGE (pasteboard, msg, msg_len)
IF (status1 = SMG$_NO_MORMSG) THEN
GOTO Exitloop
END IF
IF (status1 AND 1%) = 0% THEN
CALL LIB$STOP (status1 BY VALUE)
END IF
status1 = SMG$PUT_LINE (second_disp, msg, &
forward,,, SMG$M_WRAP_CHAR)
IF (status1 AND 1%) = 0% THEN
CALL LIB$STOP (status1 BY VALUE)
END IF
NEXT
Exitloop:
END SUB
|
To run the example program, use the following commands.
$ BASIC TRAPPING
$ LINK TRAPPING
$ RUN TRAPPING
|
The output for this program is shown in the following figures. In
Figure SMG-14, the program is waiting for either unsolicited input or
broadcast messages.
Figure SMG-14 Output Generated Before Any Input or Messages Are
Trapped
The output generated after the user presses Ctrl/T is shown in
Figure SMG-15.
Figure SMG-15 Output Generated After a Broadcast Message Is
Trapped
If the user types a command, that command is displayed in the INPUT
display, and a subprocess is spawned. The output generated after the
user types the MAIL command is shown in Figure SMG-16.
Figure SMG-16 Output Generated After a Call to
LIB$SPAWN
Once the subprocess completes execution, control is returned to the
main process. At this point, the screen is repainted and the program
continues to wait for broadcast messages or unsolicited input. The user
must press Ctrl/Z to exit the program.
|