Adicionando um menu à um GtkStatusIcon

Utilizar um GtkStatusIcon sem ação nenhuma não faz muita diferença para a maioria das aplicações. Com o ícone já construído, é possível adicionar evento de click do mouse por exemplo. Uma das técnicas mais utilizadas é a utilização de menus ao botão direito do mouse.

Imagem

Exemplo

/**
 * Seta a codificação do programa
 */
ini_set("php-gtk.codepage", "UTF-8");
	
/**
 * Classe de exemplo
 * 
 * @name Demo
 * @author Bruno P. Gonçalves <http: //bruno.pitteli.com.br></http:>
 * @download <http: //code.google.com/p/fabulafw></http:>
 */
class Demo {
	/**
	 * Armazena os widgets necessarios
	 * 
	 * @access private
	 * @property array $widgets
	 */
	public $widgets = array();
	
	/**
	 * Armazena o estado do window
	 * 
	 * @access private
	 * @property integer $state 
	 */
	private $state;
	
	/**
	 * @name __construct()
	 * @return Demo
	 */
	public function __construct() {
		// Cria a janela
		$this->widgets['frmDemo'] = new GtkWindow();
		$this->widgets['frmDemo']->set_size_request(250, 250);
		$this->widgets['frmDemo']->set_position(Gtk::WIN_POS_CENTER_ALWAYS);
		$this->widgets['frmDemo']->set_title("Demo");
		$this->widgets['frmDemo']->connect("destroy", array($this, "frmDemo_unload"));
		
		// Cria o status icon
		$this->widgets['stiMain'] = new GtkStatusIcon();
		$this->widgets['stiMain']->set_from_stock(Gtk::STOCK_CAPS_LOCK_WARNING);
		$this->widgets['stiMain']->set_tooltip("Demo");
		$this->widgets['stiMain']->connect("popup-menu", array($this, "stiMain_onpopup"));
		
		// Cria o menu
		$this->widgets['mnuMain'] = new GtkMenu();
		$this->widgets['mnuMain']->append($item = new GtkMenuItem("Mostrar/Esconder"));
		$item->connect("activate", array($this, "mnuMain_onclick"), 1);
		$this->widgets['mnuMain']->append(new GtkSeparatorMenuItem());
		$this->widgets['mnuMain']->append($item = new GtkMenuItem("Sair"));
		$item->connect("activate", array($this, "mnuMain_onclick"), 2);
		$this->widgets['mnuMain']->show_all();
		
		// Inicia a aplicação
		$this->widgets['frmDemo']->add(new GtkFixed());
		$this->frmDemo_onload();
	}
	
	/**
	 * Método do carregamento do formulario
	 * 
	 * @name frmDemo_onload()
	 */
	public function frmDemo_onload() {
		// Inicia o estado
		$this->state = 0;
		
		// Inicia a aplicação
		$this->widgets['frmDemo']->show_all();
		Gtk::main();
	}
	
	/**
	 * Método do descarregamento do formulario
	 * 
	 * @name frmDemo_unload()
	 */
	public function frmDemo_unload() {
		// Encerra a aplicação
		Gtk::main_quit();
		exit(0);
	}
	
	/**
	 * Método que mostra o menu ao clicar no popup
	 * 
	 * @name stiMain_onpopup
	 * @param GtkStatusIcon $widget Objeto do statusicon
	 */
	public function stiMain_onpopup($widget) {
		$this->widgets['mnuMain']->popup();
	}
	
	/**
	 * Método dos eventos dos menus
	 * 
	 * @name mnuMain_onclick
	 * @param GtkMenuItem $widget Menu que foi clicado
	 * @para integer $index Index do menu clicado 
	 */
	public function mnuMain_onclick($widget, $index) {
		// Verifica o menu
		var_dump($index);
		switch($index) {
			case 1:
				// Verifica se esta sendo mostrado
				if($this->state == 0) {
					// Esconde a janela
					$this->state = 1;
					$this->widgets['frmDemo']->hide();
				}
				else {
					// Mostra a janela
					$this->state = 0;
					$this->widgets['frmDemo']->show_all();
				}
				break;
			case 2:
				// Fecha a aplicação
				$this->frmDemo_unload();
				break;
		}
	}
}
	
/**
 * Inicia o demo
 */
new Demo();

Referências

http://gtk.php.net/manual/en/gtk.gtkstatusicon.php
http://gtk.php.net/manual/en/gtk.gtkmenu.php
http://gtk.php.net/manual/en/gtk.gtkmenuitem.php
http://gtk.php.net/manual/en/gtk.gtkwindow.php