US Tray Menu 2: Binaries

 

UniServer 5-Nano
US Tray Menu 2.
UniServer 6-Carbo

US Tray Menu 2 VC9 Binaries

Introduction

Our tray if it remains as a seperate plugin requires additional PHP modules. The following are required php_curl.dll for user IP address detection php_mysql.dll for password restore and restricted user configuration and php_openssl.dll and associated binaries for server certificate and key generation. These are duplications and only serve to increase size.

Solution is to use existing PHP installation with the addition of new php_winbinder.dll with UTF-8 support. Command line scripts by their nature do not support UTF-8 these require converting ideally to a windows-based format. This adds redundancy; hence delete old UniTray and associated files.

The server is already looking like a different beast, which begs the question why not take it a step further and convert to VC9 binaries.

As mentioned on the introduction page final twist is Uniform Server 6.0.0-Carbo (VC9 binary version)

There are a few issues outstanding lets clear these up first.

Issues

Tray menu is primarily an application launcher. When a menu item is clicked menu minimises and application is run. This is not the case with mesage boxes.

Top

Message boxes

Menu items that are unavailable when clicked a message box pops up informing a user as to why it is disabled.

Until closed standard message boxes halt program execution leaving our menu visible. Solution is to run a detached message box before doing so set environment variables for message box title and text to be displayed.

//=== US POP UP ===============================================================
// This function launches a detached pop-up allowing menu to minimise.
// Environment variables “title” and ”str” are set and picked-up by the pop-up.

function us_pop_up($str,$title){

  putenv("UT_TITLE=$title"); // Set vars
  putenv("UT_STR=$str");

  $cmd = "start ..\..\usr\local\php\php-win.exe -c ..\..\usr\local\php\php-cli.ini pop_up.php";
  pclose(popen($cmd,'r')); 

  putenv('UT_STR=');    // Reset
  putenv('UT_TITLE=');  // Reset

}//========================================================== END US POP UP ===

Script for the pop-up as follows:

chdir(dirname(__FILE__)); // Change wd to this files location

include_once "winbinder/winbinder.php";
include_once "includes/functions2.php";
include_once "includes/config2.inc.php";
include_once "lang/lang.php";

// Environment variables are set by main menu pick these up to display title
// and message in an alert box.

$ut_title = getenv('UT_TITLE');
$ut_str   = getenv('UT_STR');

wb_message_box (NULL, $TM[$ut_str], $TM[$ut_title]);

exit;

At first above looks like a viable solution however when run an annoying command window opens for a short period this really is a pain when scripting

Solution is to convert the following batch file:

cd ..\..\usr\local\php
php.exe -c php-cli.ini ..\..\..\unicon\tray_menu_2\pop_up.php
EXIT

To a hidden executable this runs the pop-up script

include_once "winbinder/winbinder.php";
include_once "includes/functions2.php";
include_once "includes/config2.inc.php";
include_once "lang/lang.php";

// Environment variables are set by main menu pick these up to display title
// and message in an alert box.

$ut_title = getenv('UT_TITLE');
$ut_str   = getenv('UT_STR');

wb_message_box (NULL, $TM[$ut_str], $TM[$ut_title]);

exit

Script picks up environment variables and runs message box.

Above pop-up is launched using the following function:

//=== US POP UP ===============================================================
// This function launches a detached pop-up allowing menu to minimise.
// Environment variables “title” and ”str” are set and picked-up by the pop-up.

function us_pop_up($str,$title){

  putenv("UT_TITLE=$title"); // Set var title  to be displayed in message box
  putenv("UT_STR=$str");     // Set var string  to be displayed in message box

  $cmd = getcwd()."/Run_pop_up..exe";   // set path to executable
  wb_exec($cmd);                        // detached message box 

  putenv('UT_STR=');    // Reset
  putenv('UT_TITLE=');  // Reset

}//========================================================== END US POP UP ===

This in turn is run from the command processor. For example:

  //== Command cmd_move_servers
  if($command_array[0] == "cmd_move_servers"){                 // Intercept command
      if(($AP || $APS || $MY || $MYS) ){                       // Servers running can not move servers
        us_pop_up("move_servers6-str1","move_servers6-title"); // Inform Users
      }
      else{                                       // No:
        $cmd = relative_to_absolute_paths("./Run_move_servers.exe");
        wb_exec($cmd);  
      }
   return;
   }
   //== End cmd_move_servers

Although this solution is convoluted it avoids that dreaded command window opening.

Top

Ghosting

Generic menu suffered from ghosting extremely annoying especially on a dark background.

Top

Problem

Mouse over a sub-menu item triggers the Winbinder wb_wait() function inserted to prevent a sudden pop-up. However once triggered continues to time-out on completion sub-menu is displayed. Because the mouse is no longer hovering over the sub-menu it is instantly closed. I say instantly however there is a finite time before it closes hence the ghosting effect.

Top

Solution

Solution is to check validity before opening a pop-up sub-menu. Its stored name ($name) can be used for this purpose. While the timer is timing out any items other than the pop-up in question is moused over resets this variable ($name). There remains a very slim chance of ghosting however during tests I have never seen it hence to all intense and purpose it has been eliminated

New code as shown below:

//== No mouse clicked process returned result ================================
 // No mouse click however mouse was moved and it requires processing.
 // On detecting a sub command display pop-up 

 if(!empty($result)) {                       // Skip if no value returned

   if($result[0] == "sub"){                  // Is command a sub-menu
    if($active){                             // Is there already an active pop-up
       if( $result[1] != $sub_name){         // Yes: Is it a new sub-menu window
         $sub_name="";                       // Reset name
         wb_destroy_window($sub_win);        // Yes: Close old window
         $active = FALSE;                    // and reset active flag 
       }                                     // Note: New window one will be created
     }                                       // next time around loop (mouse move).  

     else{                                   // No: No active pop-up create new

       $sub_name = $result[1];               // save sub-menu name required for closing
       wb_wait($mainwin,400, WBC_KEYDOWN);   // Prevent sudden pop-up   
       if($sub_name == $result[1]){          // Check to see if still viable
         $active = TRUE;                     // set active flag
         pop_win($window,$result[2]);        // Open pop-up pass its y cord $result[2]
       } 
    }
   }

   else{                                     // N0 Not a sub-menu command
    $sub_name="";                            // Reset name 
    if($active){                             // Is there an active pop-up 
     wb_destroy_window($sub_win);            // Yes: Close old window pop-up 
     $active = FALSE;                        // and reset active flag     
    }  
   }
 }// end not empty

 else{         // Is empty. Moved into a none hot spot. Close an active window                                     // 
  $sub_name="";                         // Reset name 
  if($active){                          // Is there an active pop-up
    wb_destroy_window($sub_win);        // Yes: Close window
    $active = FALSE;                    // now reset active flag
  }  
 }
 //== END No mouse clicked process returned result ============================

Note:

The wb_wait() function unlike PHP sleep() does not halt program execution. The windows application continues to process messages this stops the application freezing. What that means is any mouse events are processed. Code below function wb_wait is deferred from execution until its pre-set time is reached. It is important to note wb_wait is mono-stable meaning it can only be re-triggered after timing out.

Top

New server

Uniform server 5.6.7-Nano was taken as a starting point. All binaries where appropriate were replaced with their VC9 counterparts.

UniTray is replaced with a new version. This new version encompasses features from old UniTray and Zcon.

Note:

Applications from Zcon require a re-write see auto-resizing restriction below

UniTray

UniTray is an application launcher allowing additional features to be easily added. Each new feature or features are implemented with mini-applications written in PHP.

Advantage of this approach only a single entry is required in the configuration file UniTray.ini each application is independent which enhances testability.

Language Support

Text displayed to a user (buttons, labels, pop-up message boxes etc.) must be added to the language file lang.php. There are no restrictions placed on text width this is because after language translation string widths are bound to be different.

UniTray uses following two files for language support:

  • unicon\tray_menu_2\UniTray.ini
  • UniServer\unicon\tray_menu_2\lang\lang.php

A restriction imposed on your windows layout; variable width text requires a mini-application implement auto-resizing.

Menu Example

On the right is a menu example with Apache running and MySQL server stopped.

 

Top

Summary

That concludes this tutorial.

Download

You can download a beta version of the new server UniServer 6.0.0-Carbo


Top