3 * Copyright 2009 Roy Marples <roy@marples.name>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include "dhcpcd-gtk.h"
30 static const char *copyright = "Copyright (c) 2009 Roy Marples";
32 static const char *authors[] = {
33 "Roy Marples <roy@marples.name>",
36 static const char *license[] = {
37 "Licensed under the 2 clause BSD license.\n",
38 "Redistribution and use in source and binary forms, with or without\n"
39 "modification, are permitted provided that the following conditions\n"
41 "1. Redistributions of source code must retain the above copyright\n"
42 " notice, this list of conditions and the following disclaimer.\n",
43 "2. Redistributions in binary form must reproduce the above copyright\n"
44 " notice, this list of conditions and the following disclaimer in the\n"
45 " documentation and/or other materials provided with the distribution.\n",
46 "THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n"
47 "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n"
48 "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"
49 "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n"
50 "FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"
51 "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n"
52 "OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n"
53 "HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n"
54 "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n"
55 "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n"
61 on_quit(_unused GtkMenuItem *item, _unused gpointer data)
67 on_help(_unused GtkMenuItem *item, _unused gpointer data)
72 url_show(GtkAboutDialog *dialog, const char *url)
76 screen = gtk_widget_get_screen(GTK_WIDGET(dialog));
77 gtk_show_uri(screen, url, GDK_CURRENT_TIME, NULL);
81 email_hook(GtkAboutDialog *dialog, const char *url, _unused gpointer p)
85 address = g_strdup_printf("mailto:%s", url);
86 url_show(dialog, address);
91 url_hook(GtkAboutDialog *dialog, const char *url, _unused gpointer p)
93 url_show(dialog, url);
97 on_about(_unused GtkMenuItem *item, _unused gpointer data)
101 l = g_strconcat(_(license[0]), "\n",
107 gtk_window_set_default_icon_name(GTK_STOCK_NETWORK);
108 gtk_about_dialog_set_email_hook(email_hook, NULL, NULL);
109 gtk_about_dialog_set_url_hook(url_hook, NULL, NULL);
110 gtk_show_about_dialog(NULL,
112 "copyright", copyright,
114 "website-label", "dhcpcd Website",
115 "website", "http://roy.marples.name/projects/dhcpcd",
117 "logo-icon-name", GTK_STOCK_NETWORK,
123 add_scan_results(GtkMenu *menu, const struct if_msg *ifm)
126 const struct if_ap *ifa;
127 GtkWidget *item, *image;
129 for (gl = ifm->scan_results; gl; gl = gl->next) {
130 ifa = (const struct if_ap *)gl->data;
131 item = gtk_image_menu_item_new_with_label(ifa->ssid);
132 image = gtk_image_new_from_icon_name("network-wireless",
134 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
135 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
140 on_activate(GtkStatusIcon *icon, _unused guint button, _unused guint32 atime, _unused gpointer data)
143 const struct if_msg *ifm;
150 for (gl = interfaces; gl; gl = gl->next) {
151 ifm = (const struct if_msg *)gl->data;
159 menu = (GtkMenu *)gtk_menu_new();
161 for (gl = interfaces; gl; gl = gl->next) {
162 ifm = (const struct if_msg *)gl->data;
166 add_scan_results(menu, ifm);
170 item = gtk_image_menu_item_new_with_label(ifm->name);
171 image = gtk_image_new_from_icon_name("network-wireless",
173 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
175 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
178 gtk_widget_show_all(GTK_WIDGET(menu));
179 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
180 gtk_status_icon_position_menu, icon,
181 1, gtk_get_current_event_time());
185 on_popup(GtkStatusIcon *icon, guint button, guint32 atime, gpointer data)
188 GtkWidget *item, *image;
192 menu = (GtkMenu *)gtk_menu_new();
194 item = gtk_image_menu_item_new_with_mnemonic(_("_Quit"));
195 image = gtk_image_new_from_icon_name(GTK_STOCK_QUIT,
197 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
198 g_signal_connect(G_OBJECT(item), "activate",
199 G_CALLBACK(on_quit), icon);
200 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
202 item = gtk_separator_menu_item_new();
203 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
205 item = gtk_image_menu_item_new_with_mnemonic(_("_Help"));
206 image = gtk_image_new_from_icon_name(GTK_STOCK_HELP,
208 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
209 g_signal_connect(G_OBJECT(item), "activate",
210 G_CALLBACK(on_help), icon);
211 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
213 item = gtk_image_menu_item_new_with_mnemonic(_("_About"));
214 image = gtk_image_new_from_icon_name(GTK_STOCK_ABOUT,
216 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
217 g_signal_connect(G_OBJECT(item), "activate",
218 G_CALLBACK(on_about), icon);
219 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
221 gtk_widget_show_all(GTK_WIDGET(menu));
222 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
223 gtk_status_icon_position_menu, data, button, atime);
225 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu), FALSE);
229 menu_init(GtkStatusIcon *icon)
231 g_signal_connect_object(G_OBJECT(icon), "activate",
232 G_CALLBACK(on_activate), icon, 0);
233 g_signal_connect_object(G_OBJECT(icon), "popup_menu",
234 G_CALLBACK(on_popup), icon, 0);