blob: 3747505068c0a0cf375848a044f6c2c6cfeb9d84 [file] [log] [blame]
/*
*
* Connection Manager
*
* Copyright (C) 2008 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib/gi18n.h>
#include "connman-client.h"
#include "advanced.h"
static ConnmanClient *client;
static GtkWidget *interface_notebook;
static void update_status(struct config_data *data,
guint type, guint state, guint policy,
const gchar *network, const gchar *address)
{
const char *str;
gchar *markup, *info = NULL;
switch (type) {
case CONNMAN_TYPE_ETHERNET:
str = N_("Cable Unplugged");
info = g_strdup_printf(_("The cable for %s is "
"not plugged in."), N_("Ethernet"));
break;
case CONNMAN_TYPE_WIFI:
str = N_("Not Connected");
break;
default:
str = N_("Not Connected");
break;
}
markup = g_strdup_printf("<b>%s</b>", str);
gtk_label_set_markup(GTK_LABEL(data->title), markup);
g_free(markup);
gtk_label_set_markup(GTK_LABEL(data->label), info);
g_free(info);
switch (type) {
case CONNMAN_TYPE_ETHERNET:
update_ethernet_policy(data, policy);
break;
case CONNMAN_TYPE_WIFI:
update_wifi_policy(data, policy);
break;
default:
break;
}
}
static void update_config(struct config_data *data)
{
GtkTreeIter iter;
guint type;
gchar *network;
if (gtk_tree_model_get_iter_from_string(data->model,
&iter, data->index) == FALSE)
return;
gtk_tree_model_get(data->model, &iter,
CONNMAN_COLUMN_TYPE, &type,
CONNMAN_COLUMN_NAME, &network, -1);
g_free(network);
}
static void advanced_callback(GtkWidget *button, gpointer user_data)
{
struct config_data *data = user_data;
gtk_widget_show_all(data->dialog);
}
static struct config_data *create_config(GtkTreeModel *model,
GtkTreeIter *iter, gpointer user_data)
{
GtkWidget *mainbox;
GtkWidget *label;
GtkWidget *hbox;
GtkWidget *button;
struct config_data *data;
guint type, state = 0, policy = 0;
gchar *markup, *vendor = NULL, *product = NULL;
gchar *network = NULL, *address = NULL;
data = g_try_new0(struct config_data, 1);
if (data == NULL)
return NULL;
gtk_tree_model_get(model, iter,
CONNMAN_COLUMN_TYPE, &type, -1);
mainbox = gtk_vbox_new(FALSE, 6);
data->widget = mainbox;
label = gtk_label_new(NULL);
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(mainbox), label, FALSE, FALSE, 0);
data->title = label;
label = gtk_label_new(NULL);
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(mainbox), label, FALSE, FALSE, 0);
data->label = label;
switch (type) {
case CONNMAN_TYPE_ETHERNET:
add_ethernet_policy(mainbox, data);
break;
case CONNMAN_TYPE_WIFI:
add_wifi_policy(mainbox, data);
break;
default:
break;
}
hbox = gtk_hbox_new(FALSE, 12);
gtk_box_pack_end(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new(NULL);
gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0);
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
markup = g_strdup_printf("%s\n<small>%s</small>",
vendor ? vendor : "", product ? product : "");
gtk_label_set_markup(GTK_LABEL(label), markup);
g_free(markup);
if (0) {
button = gtk_button_new_with_label(_("Advanced..."));
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(advanced_callback), data);
data->button = button;
}
data->window = user_data;
create_advanced_dialog(data, type);
update_status(data, type, state, policy, network, address);
g_free(network);
g_free(address);
data->model = model;
data->index = gtk_tree_model_get_string_from_iter(model, iter);
gtk_widget_show_all(mainbox);
g_free(product);
g_free(vendor);
return data;
}
static void select_callback(GtkTreeSelection *selection, gpointer user_data)
{
GtkWidget *notebook = interface_notebook;
GtkTreeModel *model;
GtkTreeIter iter;
gboolean selected;
struct config_data *data = NULL;
gint page;
selected = gtk_tree_selection_get_selected(selection, &model, &iter);
if (selected == FALSE) {
gtk_widget_hide(interface_notebook);
return;
}
if (data == NULL) {
data = create_config(model, &iter, user_data);
if (data == NULL)
return;
page = gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
data->widget, NULL);
} else {
update_config(data);
page = gtk_notebook_page_num(GTK_NOTEBOOK(notebook),
data->widget);
}
gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page);
gtk_widget_show(notebook);
}
static void row_changed(GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter *iter, gpointer user_data)
{
guint type;
gboolean powered, inrange;
gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type,
CONNMAN_COLUMN_ENABLED, &powered,
CONNMAN_COLUMN_INRANGE, &inrange, -1);
}
static void state_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell,
GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
gboolean inrange;
gtk_tree_model_get(model, iter, CONNMAN_COLUMN_INRANGE, &inrange, -1);
if (inrange == TRUE)
g_object_set(cell, "icon-name", GTK_STOCK_YES, NULL);
else
g_object_set(cell, "icon-name", NULL, NULL);
}
static void type_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell,
GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
guint type;
gboolean powered, inrange;
gchar *markup;
const char *title, *info;
gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type,
CONNMAN_COLUMN_ENABLED, &powered,
CONNMAN_COLUMN_INRANGE, &inrange, -1);
switch (type) {
case CONNMAN_TYPE_ETHERNET:
title = N_("Ethernet");
break;
case CONNMAN_TYPE_WIFI:
title = N_("Wireless");
break;
case CONNMAN_TYPE_WIMAX:
title = N_("WiMAX");
break;
case CONNMAN_TYPE_BLUETOOTH:
title = N_("Bluetooth");
break;
default:
title = N_("Unknown");
break;
}
if (powered == TRUE) {
if (inrange == TRUE)
info = N_("Connceted");
else
info = N_("Not Connected");
} else
info = N_("Disabled");
markup = g_strdup_printf("<b>%s</b>\n<small>%s</small>", title, info);
g_object_set(cell, "markup", markup, NULL);
g_free(markup);
}
static void type_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell,
GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
guint type;
gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, -1);
switch (type) {
case CONNMAN_TYPE_ETHERNET:
g_object_set(cell, "icon-name", "network-wired",
"stock-size", 5, NULL);
break;
case CONNMAN_TYPE_WIFI:
case CONNMAN_TYPE_WIMAX:
g_object_set(cell, "icon-name", "network-wireless",
"stock-size", 5, NULL);
break;
case CONNMAN_TYPE_BLUETOOTH:
g_object_set(cell, "icon-name", "bluetooth",
"stock-size", 5, NULL);
break;
default:
g_object_set(cell, "icon-name", NULL, NULL);
break;
}
}
static GtkWidget *create_interfaces(GtkWidget *window)
{
GtkWidget *mainbox;
GtkWidget *hbox;
GtkWidget *scrolled;
GtkWidget *tree;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkTreeSelection *selection;
GtkTreeModel *model;
mainbox = gtk_vbox_new(FALSE, 18);
gtk_container_set_border_width(GTK_CONTAINER(mainbox), 12);
hbox = gtk_hbox_new(FALSE, 12);
gtk_box_pack_start(GTK_BOX(mainbox), hbox, TRUE, TRUE, 0);
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled),
GTK_SHADOW_OUT);
gtk_box_pack_start(GTK_BOX(hbox), scrolled, FALSE, TRUE, 0);
tree = gtk_tree_view_new();
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(tree), FALSE);
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
gtk_widget_set_size_request(tree, 180, -1);
gtk_container_add(GTK_CONTAINER(scrolled), tree);
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_expand(column, TRUE);
gtk_tree_view_column_set_spacing(column, 4);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
renderer = gtk_cell_renderer_pixbuf_new();
gtk_cell_renderer_set_fixed_size(renderer, 20, 45);
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_cell_data_func(column, renderer,
state_to_icon, NULL, NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, TRUE);
gtk_tree_view_column_set_cell_data_func(column, renderer,
type_to_text, NULL, NULL);
renderer = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_column_pack_end(column, renderer, FALSE);
gtk_tree_view_column_set_cell_data_func(column, renderer,
type_to_icon, NULL, NULL);
interface_notebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(interface_notebook), FALSE);
gtk_notebook_set_show_border(GTK_NOTEBOOK(interface_notebook), FALSE);
gtk_widget_set_no_show_all(interface_notebook, TRUE);
gtk_box_pack_start(GTK_BOX(hbox), interface_notebook, TRUE, TRUE, 0);
model = connman_client_get_device_model(client);
gtk_tree_view_set_model(GTK_TREE_VIEW(tree), model);
g_object_unref(model);
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(selection), "changed",
G_CALLBACK(select_callback), window);
g_signal_connect(G_OBJECT(model), "row-changed",
G_CALLBACK(row_changed), selection);
return mainbox;
}
static gboolean delete_callback(GtkWidget *window, GdkEvent *event,
gpointer user_data)
{
gtk_widget_destroy(window);
gtk_main_quit();
return FALSE;
}
static void close_callback(GtkWidget *button, gpointer user_data)
{
GtkWidget *window = user_data;
gtk_widget_destroy(window);
gtk_main_quit();
}
static GtkWidget *create_window(void)
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *notebook;
GtkWidget *buttonbox;
GtkWidget *button;
GtkWidget *widget;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), _("Connection Preferences"));
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 580, 380);
g_signal_connect(G_OBJECT(window), "delete-event",
G_CALLBACK(delete_callback), NULL);
vbox = gtk_vbox_new(FALSE, 12);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
gtk_container_add(GTK_CONTAINER(window), vbox);
notebook = gtk_notebook_new();
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
buttonbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonbox), GTK_BUTTONBOX_END);
gtk_box_pack_start(GTK_BOX(vbox), buttonbox, FALSE, FALSE, 0);
button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
gtk_container_add(GTK_CONTAINER(buttonbox), button);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(close_callback), window);
widget = create_interfaces(window);
gtk_notebook_prepend_page(GTK_NOTEBOOK(notebook), widget, NULL);
gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook),
widget, _("Devices"));
gtk_widget_show_all(window);
return window;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
gtk_init(&argc, &argv);
gtk_window_set_default_icon_name("network-wireless");
client = connman_client_new();
window = create_window();
gtk_main();
g_object_unref(client);
return 0;
}