trayicon.c
上传用户:ledjyj
上传日期:2014-08-27
资源大小:2639k
文件大小:5k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /* trayicon.c
  2.  *
  3.  * Copyright (C) 2006 Jörgen Scheibengruber
  4.  *
  5.  * This program is free software; you can redistribute it and/or 
  6.  * modify it under the terms of the GNU General Public License as 
  7.  * published by the Free Software Foundation; either version 2 of the
  8.  * License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  18.  * USA
  19.  */
  20. #include <config.h>
  21. #include <gnome.h>
  22. #include "gui.h"
  23. #include "trayicon.h"
  24. static GtkWidget *showwindow_menuitem;
  25. static void mute_menuitem_toggled_cb(GtkCheckMenuItem *checkmenuitem, gpointer user_data)
  26. {
  27. toggle_volume();
  28. }
  29. static void record_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
  30. {
  31. rec_button_clicked_cb(NULL, user_data);
  32. }
  33. static void showwindow_menuitem_toggled_cb(GtkCheckMenuItem *checkmenuitem, gpointer user_data)
  34. {
  35. GtkWidget* app = GTK_WIDGET(user_data);
  36. toggle_mainwindow_visibility(app);
  37. }
  38. static void quit_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
  39. {
  40. exit_gnome_radio();
  41. }
  42. void preset_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data)
  43. {
  44. preset* ps;
  45. mom_ps = (int)user_data;
  46. g_assert(mom_ps >= 0 && mom_ps < g_list_length(settings.presets));
  47. ps = (preset*)g_list_nth_data(settings.presets, mom_ps);
  48. gtk_adjustment_set_value(adj, ps->freq * STEPS);
  49. }
  50. void create_tray_menu(GtkWidget *app) {
  51. GList *node = settings.presets;
  52. int i;
  53. tray_menu = gtk_menu_new();
  54. for (i = 0; node; i++, node = node->next)
  55. {
  56. preset *ps = (preset*)node->data;
  57. GtkWidget *menuitem = gtk_menu_item_new_with_label(ps->title); 
  58. gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, i);
  59. g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)i);
  60. gtk_widget_show(menuitem);
  61. }
  62. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), gtk_separator_menu_item_new());
  63. mute_menuitem = gtk_check_menu_item_new_with_label(_("Muted"));
  64. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), mixer_get_volume() == 0);
  65. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), mute_menuitem);
  66. mute_menuitem_toggled_cb_id = 
  67. g_signal_connect(G_OBJECT(mute_menuitem), "toggled", (GCallback)mute_menuitem_toggled_cb, (gpointer)app);
  68. gtk_widget_show(mute_menuitem);
  69. GtkWidget *record_menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_RECORD, NULL);
  70. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), record_menuitem);
  71. g_signal_connect(G_OBJECT(record_menuitem), "activate", (GCallback)record_menuitem_activate_cb, app);
  72. gtk_widget_show(record_menuitem);
  73. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), gtk_separator_menu_item_new());
  74. showwindow_menuitem = gtk_check_menu_item_new_with_label(_("Show Window"));
  75. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem), TRUE);
  76. /*gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem), GTK_WIDGET_VISIBLE(app));*/
  77. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), showwindow_menuitem);
  78. g_signal_connect(G_OBJECT(showwindow_menuitem), "activate", (GCallback)showwindow_menuitem_toggled_cb, (gpointer)app);
  79. gtk_widget_show(showwindow_menuitem);
  80. GtkWidget *quit_menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
  81. gtk_menu_shell_append(GTK_MENU_SHELL(tray_menu), quit_menuitem);
  82. g_signal_connect(G_OBJECT(quit_menuitem), "activate", (GCallback)quit_menuitem_activate_cb, NULL);
  83. gtk_widget_show(quit_menuitem);
  84. gtk_widget_show_all(tray_menu);
  85. }
  86. static gboolean tray_destroyed_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
  87. {
  88. create_tray_icon(GTK_WIDGET(data));
  89. return TRUE;
  90. }
  91. static gboolean tray_clicked_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
  92. {
  93. gboolean active;
  94. switch (event->button)
  95. {
  96. case 1:
  97. if (event->type != GDK_BUTTON_PRESS)
  98. break;
  99. active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem));
  100. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(showwindow_menuitem), !active);
  101. break;
  102. case 3:
  103. if (event->type != GDK_BUTTON_PRESS)
  104. break;
  105. gtk_menu_popup(GTK_MENU(tray_menu), NULL, NULL, NULL, NULL, event->button, event->time);
  106. break;
  107. }
  108. return FALSE;
  109. }
  110. void create_tray_icon(GtkWidget *app)
  111. {
  112. GdkPixbuf *pixbuf;
  113. GtkWidget *tray_icon_image;
  114. GtkWidget *eventbox;
  115. GtkIconTheme *icontheme;
  116. char *text;
  117. tray_icon = GTK_WIDGET(egg_tray_icon_new (PACKAGE));
  118. icontheme = gtk_icon_theme_get_default();
  119. pixbuf = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 22, 0, NULL);
  120. g_return_if_fail(pixbuf);
  121. tray_icon_image = gtk_image_new_from_pixbuf(pixbuf);
  122. gdk_pixbuf_unref(pixbuf);
  123. eventbox = gtk_event_box_new();
  124. gtk_container_add(GTK_CONTAINER(eventbox), tray_icon_image);
  125. gtk_container_add (GTK_CONTAINER(tray_icon), eventbox);
  126. g_signal_connect(G_OBJECT(eventbox), "button-press-event", 
  127. G_CALLBACK(tray_clicked_cb), (gpointer)app);
  128. g_signal_connect(G_OBJECT(tray_icon), "destroy-event",
  129. G_CALLBACK(tray_destroyed_cb), (gpointer)app);
  130. gtk_widget_show_all(GTK_WIDGET(tray_icon));
  131. text = g_strdup_printf(_("Gnomeradio - %.2f MHz"), adj->value/STEPS);
  132. gtk_tooltips_set_tip(tooltips, tray_icon, text, NULL);
  133. g_free(text);
  134. }