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"
31 static const char *copyright = "Copyright (c) 2009 Roy Marples";
33 static const char *authors[] = {
34 "Roy Marples <roy@marples.name>",
39 on_quit(_unused GtkMenuItem *item, _unused gpointer data)
45 on_help(_unused GtkMenuItem *item, _unused gpointer data)
50 url_show(GtkAboutDialog *dialog, const char *url)
54 screen = gtk_widget_get_screen(GTK_WIDGET(dialog));
55 gtk_show_uri(screen, url, GDK_CURRENT_TIME, NULL);
59 email_hook(GtkAboutDialog *dialog, const char *url, _unused gpointer p)
63 address = g_strdup_printf("mailto:%s", url);
64 url_show(dialog, address);
69 url_hook(GtkAboutDialog *dialog, const char *url, _unused gpointer p)
71 url_show(dialog, url);
75 ssid_hook(_unused GtkMenuItem *item, gpointer data)
77 wpa_configure((const struct if_ap *)data);
81 on_about(_unused GtkMenuItem *item, _unused gpointer data)
83 gtk_window_set_default_icon_name(GTK_STOCK_NETWORK);
84 gtk_about_dialog_set_email_hook(email_hook, NULL, NULL);
85 gtk_about_dialog_set_url_hook(url_hook, NULL, NULL);
86 gtk_show_about_dialog(NULL,
88 "copyright", copyright,
89 "website-label", "dhcpcd Website",
90 "website", "http://roy.marples.name/projects/dhcpcd",
92 "logo-icon-name", GTK_STOCK_NETWORK,
97 add_scan_results(GtkMenu *menu, const struct if_msg *ifm)
100 const struct if_ap *ifa;
101 GtkWidget *item, *image, *box, *label, *bar;
106 for (gl = ifm->scan_results; gl; gl = gl->next) {
107 ifa = (const struct if_ap *)gl->data;
108 item = gtk_check_menu_item_new();
109 gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), TRUE);
110 box = gtk_hbox_new(FALSE, 6);
111 gtk_container_add(GTK_CONTAINER(item), box);
112 label = gtk_label_new(ifa->ssid);
113 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0);
115 if (g_strcmp0(ifm->ssid, ifa->ssid) == 0)
116 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
117 if (ifa->flags == NULL)
118 icon = "network-wireless";
120 icon = "network-wireless-encrypted";
121 image = gtk_image_new_from_icon_name(icon,
123 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
125 bar = gtk_progress_bar_new();
126 gtk_widget_set_size_request(bar, 100, -1);
127 gtk_box_pack_end(GTK_BOX(box), bar, FALSE, TRUE, 0);
128 strength = CLAMP(ifa->quality, 0, 100);
129 perc = strength / 100.0;
130 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(bar), perc);
132 gtk_widget_show(label);
133 gtk_widget_show(bar);
134 gtk_widget_show(image);
135 gtk_widget_show(box);
136 g_signal_connect(G_OBJECT(item), "activate",
137 G_CALLBACK(ssid_hook), gl->data);
138 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
143 on_activate(GtkStatusIcon *icon, _unused guint button, _unused guint32 atime, _unused gpointer data)
146 const struct if_msg *ifm;
153 for (gl = interfaces; gl; gl = gl->next) {
154 ifm = (const struct if_msg *)gl->data;
162 menu = (GtkMenu *)gtk_menu_new();
164 for (gl = interfaces; gl; gl = gl->next) {
165 ifm = (const struct if_msg *)gl->data;
169 add_scan_results(menu, ifm);
173 item = gtk_image_menu_item_new_with_label(ifm->name);
174 image = gtk_image_new_from_icon_name("network-wireless",
176 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
178 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
181 gtk_widget_show_all(GTK_WIDGET(menu));
182 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
183 gtk_status_icon_position_menu, icon,
184 1, gtk_get_current_event_time());
188 on_popup(GtkStatusIcon *icon, guint button, guint32 atime, gpointer data)
191 GtkWidget *item, *image;
195 menu = (GtkMenu *)gtk_menu_new();
197 item = gtk_image_menu_item_new_with_mnemonic(_("_Quit"));
198 image = gtk_image_new_from_icon_name(GTK_STOCK_QUIT,
200 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
201 g_signal_connect(G_OBJECT(item), "activate",
202 G_CALLBACK(on_quit), icon);
203 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
205 item = gtk_separator_menu_item_new();
206 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
208 item = gtk_image_menu_item_new_with_mnemonic(_("_Help"));
209 image = gtk_image_new_from_icon_name(GTK_STOCK_HELP,
211 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
212 g_signal_connect(G_OBJECT(item), "activate",
213 G_CALLBACK(on_help), icon);
214 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
216 item = gtk_image_menu_item_new_with_mnemonic(_("_About"));
217 image = gtk_image_new_from_icon_name(GTK_STOCK_ABOUT,
219 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
220 g_signal_connect(G_OBJECT(item), "activate",
221 G_CALLBACK(on_about), icon);
222 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
224 gtk_widget_show_all(GTK_WIDGET(menu));
225 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
226 gtk_status_icon_position_menu, data, button, atime);
228 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu), FALSE);
232 menu_init(GtkStatusIcon *icon)
234 g_signal_connect_object(G_OBJECT(icon), "activate",
235 G_CALLBACK(on_activate), icon, 0);
236 g_signal_connect_object(G_OBJECT(icon), "popup_menu",
237 G_CALLBACK(on_popup), icon, 0);