|
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:

Solution
- Use a variable as a flag to let us know if there's any active popup window.
- 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:
- Kees track if there's any active popup window.
- Take note of the pointer to this popup window.
- Check if there are any previous popup window.
- Yes, let's pop it down!
Related Links
User reviews Average user ratings: 5.0 (from 5 users) Note: You have to be a registered member to leave a comment. Free registration here. |
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.
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?
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?
April 28, 2008 6:56am
Does anyone have anything new about the problem of closing the popup without selecting anything in it ? (By clicking somewhere else).
September 01, 2008 1:11am