PHP-GTK2 Newsletter

PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou



Sample Code 338: How to set up an application to run in the system tray using GtkStatusIcon - Part 7 - ensure only one popup menu?
Written by kksou   
Wednesday, 03 October 2007
Problem

If you have run the example How to set up an application to run in the system tray using GtkStatusIcon - Part 4 - display popup menu on right click? or How to set up an application to run in the system tray using GtkStatusIcon - Part 5 - make the tray icon blink?, you will have noticed that if you keep pressing the right-mouse button on the system tray icon without selecting any of the menu item, you will end up having many popup windows surrounding the tray icon.

Let's fix this in this article as shown below:

How to set up an application to run in the system tray using GtkStatusIcon - Part 7 - ensure only one popup menu?


Solution

  1. Use a variable as a flag to let us know if there's any active popup window.
  2. If there's already a previous popup window, pop it down using the method GtkMenu::popdown() before displaying the new popup window.

Important Note: This only works for PHP-GTK2 compliled with gtk+ v2.10 and above. If you are using an older version, for linux, you may follow the step-by-step instructions to recompile php-gtk2 with gtk+ v2.10. For windows, please refer to How to install php gtk2 on windows? You may also want to take a look here to see some of the new exciting PHP-GTK2 Functionalities.


Sample Code
1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87   
88   
89   
90   
91   
92   
93   
94   
95   
96   
97   
98   
<?php
// setup GTK main application
$window = new GtkWindow();
$window->set_title($argv[0]);
$window->set_size_request(400, 300);
$window->connect('destroy', 'destroy');

$window->add($vbox = new GtkVBox());

$vbox->pack_start($hbox = new GtkHBox(), 0, 0);
$hbox->set_size_request(-1, 2);

// Create the top textview to display the conversation
$buffer1 = new GtkTextBuffer();
$view1 = new GtkTextView();
$view1->set_buffer($buffer1);
$view1->set_editable(false);
$view1->modify_font(new PangoFontDescription("Arial 9"));
$view1->set_wrap_mode(Gtk::WRAP_WORD);

$scrolled_win1 = new GtkScrolledWindow();
$scrolled_win1->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
$frame1 = new GtkFrame();
$frame1->add($scrolled_win1);
$vbox->pack_start($frame1, 0, 0);
$scrolled_win1->add($view1);
$scrolled_win1->set_size_request(400,200);

$vbox->pack_start($hbox = new GtkHBox(), 0, 0);
$hbox->set_size_request(-1, 1);

// Create the bottom textview to type your message
$buffer2 = new GtkTextBuffer();
$buffer2->set_text('type your message here');
$view2 = new GtkTextView();
$view2->set_buffer($buffer2);
$view2->modify_font(new PangoFontDescription("Arial 9"));
$view2->set_wrap_mode(Gtk::WRAP_WORD);

$scrolled_win2 = new GtkScrolledWindow();
$scrolled_win2->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
$frame2 = new GtkFrame();
$frame2->add($scrolled_win2);
$vbox->pack_start($frame2, 0, 0);
$scrolled_win2->add($view2);
$view2->connect('key-press-event', 'on_key_press',
    $view1, $buffer1, $view2, $buffer2);
$scrolled_win2->set_size_request(400,80);
$view2->grab_focus();

// setup system tray icon
$statusicon = new GtkStatusIcon();
$statusicon->set_from_stock(Gtk::STOCK_NETWORK);
$statusicon->set_tooltip('Left click to launch PHP-GTK Messenger');

$app_status = 0;
$statusicon->connect('activate', 'on_activate');
$statusicon->connect('popup-menu', 'on_popup_menu');

$menu_popped_up = 0; // note 1
$popup_menu_ptr = null; // note 2

$window->hide_all();
Gtk::main();

function on_key_press($widget, $event, $view1, $buffer1, $view2, $buffer2) {
    if ($event->keyval==Gdk::KEY_Return) {
        if ($event->state & Gdk::SHIFT_MASK) return false;
        $input = $buffer2->get_text($buffer2->get_start_iter(),
            $buffer2->get_end_iter());
        $iter = $buffer1->get_end_iter();
        $buffer1->insert($iter, "You say: $input\n\n" );
        $view1->scroll_to_mark($buffer1->get_insert(), 0);
        $buffer2->set_text('');
        return true;
    } else {
        return false;
    }
}

function on_activate($statusicon) {
    global $window, $app_status, $view2;
    if ($app_status) {
        $statusicon->set_tooltip('Left click to launch PHP-GTK Messenger');
        $window->hide_all();
        $app_status = 0;
    } else {
        $statusicon->set_tooltip('Left click to hide PHP-GTK Messenger');
        $window->show_all();
        $view2->grab_focus();
        $app_status = 1;
    }
}

function on_popup_menu($statusicon) {
    $menu_definition = array('Show','Hide', '<hr>',
'Connect','Disconnect','<hr>','Exit');
    $menu = show_popup_menu($menu_definition);
  • Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
  • Registration is free and immediate.
  • Have some doubt about the registration? Please read this forum article.
Explanation

The sample code above is an extension of How to set up an application to run in the system tray using GtkStatusIcon - Part 4 - display popup menu on right click?

What's new here:

  1. Kees track if there's any active popup window.
  2. Take note of the pointer to this popup window.
  3. Check if there are any previous popup window.
  4. Yes, let's pop it down!

Related Links

User reviews   Average user ratings:    5.0   (from 5 users)
  1. ronpac
    November 21, 2007 5:38pm

    If I right click to show the menu, how do you close the menu without actually choosing a selection? In other applications, such as winamp, if I right click for the menu and then click on the task bar or another application, the menu will just close. Thank you.

  2. kksou
    November 28, 2007 7:14pm

    There doesn't seem to have any signal to notify us for the situation that you've described. Anybody has any clues?

  3. Luis Martinez Ulloa from PE
    December 27, 2007 9:36pm

    maybe hiding the popup menu with a timerout event; but, in Linux(gnome-ubuntu 7.10) the popup menu dissapears when clicked in other places. I'm wrong?

  4. David V.
    April 28, 2008 6:56am
    Closing popup without selecting

    Does anyone have anything new about the problem of closing the popup without selecting anything in it ? (By clicking somewhere else).

  5. Osgregs Norotico
    September 01, 2008 1:11am

Note: You have to be a registered member to leave a comment. Free registration here.

 
< Prev   Next >

Copyright © 2006-2008. kksou.com. All Rights Reserved