The GTK version of this function selects a type font, deletes the existing message from the GtkText widget, and inserts the new text string, using GTK method calls. The Photon version simply uses a method call to insert the new text string.
/*--------------------------------------------------------------------
* Function: anygui_show_text
* Returns: t or nil
* Description: Displays a message string in a text widget. The fnt
* argument is only used in the GTK version of this
* function, and is ignored by the Photon version.
*------------------------------------------------------------------*/
function anygui_show_text(wgt, str, fnt)
{
local font;
switch (fnt)
{
case 1: font = gdk_font_load (FONT1);
case 2: font = gdk_font_load (FONT2);
case 3: font = gdk_font_load (FONT3);
}
wgt.delete_text(0, -1);
wgt.insert(font, nil, nil, str, -1);
}
/*--------------------------------------------------------------------
* Function: anygui_show_text
* Returns: t or nil
* Description: Displays a message string in a text widget. The fnt
* argument is only used in the GTK version of this
* function, and is ignored by the Photon version.
*------------------------------------------------------------------*/
function anygui_show_text(wgt, str, fnt)
{
wgt.text_string = str;
}
The difference between these two functions is simply the two different ways to release a toggled button programmatically in GTK and Photon. They both call the child_died function.
/*--------------------------------------------------------------------
* Function: anygui_sigchild
* Returns: t or nil
* Description: Pops out a button when the corresponding child dies.
*------------------------------------------------------------------*/
function anygui_sigchild ()
{
child_died(#button.set_active(FALSE));
}
/*--------------------------------------------------------------------
* Function: anygui_sigchild
* Returns: t or nil
* Description: Pops out a button when the corresponding child dies.
*------------------------------------------------------------------*/
function anygui_sigchild ()
{
child_died(#button.flags = cons(Pt_SET, nil));
}
/*--------------------------------------------------------------------
* Function: anygui_destroyer
* Returns: t or nil
* Description: Tells a program to exit when a widget (generally its
* main window) gets destroyed.
*------------------------------------------------------------------*/
function anygui_destroyer(wgt)
{
wgt.signal ("destroy", #exit_program(0));
}
/*--------------------------------------------------------------------
* Function: anygui_destroyer
* Returns: nil
* Description: A space-holder for a function only used in GTK.
*------------------------------------------------------------------*/
function anygui_destroyer(wgt)
{
nil;
}
Several demo functions need to check if a toggle button has been pressed or not. Most of these can be generalized simply by abstracting the check-for-button-pressed part of the code, which is what these methods do.
/*--------------------------------------------------------------------
* Function: GtkButton.switched_on
* Returns: t or nil
* Description: Creates common method to check Gtk and Photon buttons's
* toggled status.
*------------------------------------------------------------------*/
method GtkButton.switched_on()
{
if (.get_active() == TRUE)
t;
else
nil;
}
/*--------------------------------------------------------------------
* Method: PtLabel.switched_on
* Returns: t or nil
* Description: Creates common method to check Gtk and Photon buttons's
* toggled status. The on/off flag for a PtButton is
* inherited from the parent class, PtLabel.
*------------------------------------------------------------------*/
method PtLabel.switched_on()
{
if ((.flags & Pt_SET) != 0)
t;
else
nil;
}
/*--------------------------------------------------------------------
* Function: anygui_move_window
* Returns: t or nil
* Description: Moves the History or Log window to the left when the
* Plot button is pressed to allow space to show the plot.
*------------------------------------------------------------------*/
function anygui_move_window(button, window, old_x, old_y, new_x, new_y)
{
if(instance_p(window))
{
if (button.switched_on())
window.reposition(new_x, new_y);
else
window.reposition(old_x, old_y);
}
}
/*--------------------------------------------------------------------
* Function: anygui_move_window
* Returns: nil
* Description: A space-holder for a function only used in Linux/GTK.
*------------------------------------------------------------------*/
function anygui_move_window(button, window, old_x, old_y, new_x, new_y)
{
nil;
}
This function has been abstracted because of a characteristic in GTK widgets that isn't shared by Photon widgets. When you change a widget in GTK programmatically, such as click a button or move a slider, it automatically invokes any associated callback. The same programmatic change in Photon doesn't invoke a callback.
In addition, the main part of the Photon version of this function has to be abstracted further to handle a discrepancy between Photon 1.14 (QNX 4) and Photon 2 (QNX 6), by making a call to the anyver_change_settings function .
/*--------------------------------------------------------------------
* Function: anyos_change_settings
* Application: Monitor
* Returns: t or nil
* Description: Changes PID settings in the Monitor, and optionally
* unclicks the Auto button if it is on.
*------------------------------------------------------------------*/
function anyos_change_settings(button, auto, sp1, v1, sp2, v2, sp3, v3, sp4,
v4, sp5, v5, sp6, v6, msgno, autobutton?)
{
if (button.get_active() == TRUE)
{
if (auto == nil)
{
if (AUTO_001 != 0)
autobutton.clicked();
}
else
sp1.set_value(v1);
sp2.set_value(v2);
sp3.set_value(v3);
sp4.set_value(v4);
sp5.set_value(v5);
sp6.set_value(v6);
}
}
/*--------------------------------------------------------------------
* Function: anyos_change_settings
* Application: Monitor
* Returns: function
* Description: Used by the Monitor to change PID settings, and optionally
* unclick the Auto button if it is on. The PtNumeric widgets
* don't execute callbacks after they have been moved
* programmatically, so we have to write the point to the
* DataHub using write_point() each time a setting changes.
*------------------------------------------------------------------*/
function anyos_change_settings(auto, sp1, v1, sp2, v2, sp3, v3, sp4, v4,
sp5, v5, sp6, v6, msgno, autobutton?)
{
if (auto == nil)
{
if (AUTO_001 != 0)
{
autobutton.onoff_state = 0;
write_point(#AUTO_001, 0);
}
}
else
{
autobutton.onoff_state = 1;
write_point(#AUTO_001, 1);
sp1.numeric_value = v1;
write_point(#FREQ_001, v1);
}
anyver_change_settings(sp2, v2, sp3, v3, sp4, v4,
sp5, v5, sp6, v6);
write_point(#PID1_Kp, v2);
write_point(#PID1_Ki, v3);
write_point(#PID1_Kd, v4);
write_point(#PROP_001, v5);
write_point(#INT_001, v6);
}
This function has been abstracted because message/dialog windows are created differently in GTK than in Photon. GTK uses a GtkDialog widget, which requires a fair amount of setup. Photon's PtMessage widget has more default settings, and thus requires less coding in our case, which is a fairly basic.
/*--------------------------------------------------------------------
* Function: anygui_makemsg
* Returns: t or nil
* Description: Creates and displays a message window.
*------------------------------------------------------------------*/
function anygui_makemsg(msg)
{
if ((undefined_p(win_dialog)) || (win_dialog == nil))
{
local vbox, vboxchildren, separator, action_area, button, label;
win_dialog = new (GtkDialog);
win_dialog.signal ("destroy", #win_dialog = nil);
win_dialog.set_usize(550, 170);
win_dialog.set_title("Advisory");
vbox = car(win_dialog.children());
separator = car(vbox.children());
action_area = cadr(vbox.children());
button = new(GtkButton);
button.label = "OK";
button.width = 70;
button.can_default = TRUE;
button.signal("clicked", `(@win_dialog).destroy());
action_area.pack_start(button, FALSE, FALSE, 0);
button.grab_default();
button.show();
lbl = new(GtkLabel);
lbl.set_text(msg);
lbl.set_padding(10, 10);
vbox.pack_start(lbl, TRUE, TRUE, 0);
lbl.show();
win_dialog.show();
win_dialog;
}
else
if(instance_p(win_dialog))
win_dialog.destroy();
}
/*--------------------------------------------------------------------
* Function: anygui_makemsg
* Returns: t or nil
* Description: Creates and displays a message window.
*------------------------------------------------------------------*/
function anygui_makemsg(msg)
{
if ((undefined_p(msgwin)) || (destroyed_p(msgwin)))
{
msgwin = new(PtMessage);
msgwin.msg_text = msg;
msgwin.msg_button1 = " OK ";
PtRealizeWidget(msgwin);
}
else
if (instance_p(msgwin))
PtDestroyWidget(msgwin);
}