Index: configure.in =================================================================== RCS file: /cvsroot/bluez/gnome/configure.in,v retrieving revision 1.30 diff -u -p -u -p -r1.30 configure.in --- configure.in 9 Nov 2006 16:53:04 -0000 1.30 +++ configure.in 24 Dec 2006 14:56:21 -0000 @@ -57,6 +57,12 @@ PKG_CHECK_MODULES(NOTIFY, libnotify >= 0 AC_SUBST(NOTIFY_CFLAGS) AC_SUBST(NOTIFY_LIBS) +PKG_CHECK_MODULES(HAL, hal >= 0.5.8, [ + AC_DEFINE(HAVE_HAL, 1, [Define to 1 if you have HAL support.]) +], AC_MSG_RESULT(no)) +AC_SUBST(HAL_CFLAGS) +AC_SUBST(HAL_LIBS) + PKG_CHECK_MODULES(OPENOBEX, libopenobex-glib >= 1.4, dummy=yes, AC_MSG_RESULT(no)) AC_SUBST(OPENOBEX_CFLAGS) AC_SUBST(OPENOBEX_LIBS) Index: applet/Makefile.am =================================================================== RCS file: /cvsroot/bluez/gnome/applet/Makefile.am,v retrieving revision 1.14 diff -u -p -u -p -r1.14 Makefile.am --- applet/Makefile.am 27 Oct 2006 18:20:34 -0000 1.14 +++ applet/Makefile.am 24 Dec 2006 14:56:21 -0000 @@ -3,9 +3,9 @@ bin_PROGRAMS = bluetooth-applet bluetooth_applet_SOURCES = main.c -bluetooth_applet_LDADD = @NOTIFY_LIBS@ @GTK_LIBS@ @GCONF_LIBS@ @DBUS_LIBS@ $(top_builddir)/compat/libcompat.a +bluetooth_applet_LDADD = @NOTIFY_LIBS@ @GTK_LIBS@ @GCONF_LIBS@ @DBUS_LIBS@ @HAL_LIBS@ $(top_builddir)/compat/libcompat.a -AM_CFLAGS = @DBUS_CFLAGS@ @GCONF_CFLAGS@ @GTK_CFLAGS@ @NOTIFY_CFLAGS@ +AM_CFLAGS = @DBUS_CFLAGS@ @GCONF_CFLAGS@ @GTK_CFLAGS@ @NOTIFY_CFLAGS@ @HAL_CFLAGS@ INCLUDES = -I$(top_srcdir)/compat Index: applet/main.c =================================================================== RCS file: /cvsroot/bluez/gnome/applet/main.c,v retrieving revision 1.49 diff -u -p -u -p -r1.49 main.c --- applet/main.c 18 Nov 2006 20:01:35 -0000 1.49 +++ applet/main.c 24 Dec 2006 14:56:21 -0000 @@ -31,6 +31,11 @@ #include #include +#ifdef HAVE_HAL +#include +#include +#include +#endif #include @@ -935,6 +940,79 @@ static int attached_adapters(void) return count; } +#ifdef HAVE_HAL +static void +class_setup (struct adapter_data *adapter) +{ + DBusError error; + LibHalContext *ctx; + DBusConnection *c; + DBusGProxy *object; + char *formfactor; + gboolean bail = FALSE; + + c = dbus_g_connection_get_connection (conn); + if (!c) + return; + + ctx = libhal_ctx_new (); + if (ctx == NULL) + return; + + if (!libhal_ctx_set_dbus_connection (ctx, c)) { + libhal_ctx_free (ctx); + return; + } + + dbus_error_init (&error); + libhal_ctx_init (ctx, &error); + if (dbus_error_is_set (&error)) { + g_warning ("Couldn't get the system D-Bus: %s", error.message); + dbus_error_free (&error); + libhal_ctx_free (ctx); + return; + } + + formfactor = libhal_device_get_property_string (ctx, + "/org/freedesktop/Hal/devices/computer", + "system.formfactor", &error); + if (dbus_error_is_set (&error)) { + g_warning ("Couldn't get the form factor: %s", error.message); + dbus_error_free (&error); + bail = TRUE; + } + + if (!formfactor) + bail = TRUE; + + libhal_ctx_shutdown (ctx, NULL); + libhal_ctx_free (ctx); + if (bail) + return; + + if (strcmp (formfactor, "laptop") && + strcmp (formfactor, "desktop")) { + /* We don't know anything else */ + formfactor = g_strdup ("uncategorized"); + } + + /* Done with HAL, now act on the formfactor */ + object = dbus_g_proxy_new_for_name(conn, "org.bluez", + adapter->path, "org.bluez.Adapter"); + if (!object) { + g_free (formfactor); + return; + } + + dbus_g_proxy_call(object, "SetMajorClass", NULL, + G_TYPE_STRING, "computer", G_TYPE_INVALID, G_TYPE_INVALID); + dbus_g_proxy_call(object, "SetMinorClass", NULL, + G_TYPE_STRING, formfactor, G_TYPE_INVALID, G_TYPE_INVALID); + + g_free (formfactor); +} +#endif + static void add_adapter(const char *path) { GList *list; @@ -956,6 +1034,10 @@ static void add_adapter(const char *path adapter->path = g_strdup(path); adapter->attached = 1; +#ifdef HAVE_HAL + class_setup (adapter); +#endif + adapter_list = g_list_append(adapter_list, adapter); object = dbus_g_proxy_new_for_name(conn, "org.bluez", Index: properties/Makefile.am =================================================================== RCS file: /cvsroot/bluez/gnome/properties/Makefile.am,v retrieving revision 1.6 diff -u -p -u -p -r1.6 Makefile.am --- properties/Makefile.am 24 Nov 2006 20:26:39 -0000 1.6 +++ properties/Makefile.am 24 Dec 2006 14:56:21 -0000 @@ -3,10 +3,10 @@ bin_PROGRAMS = bluetooth-properties bluetooth_properties_SOURCES = main.c -bluetooth_properties_LDADD = @GTK_LIBS@ @GCONF_LIBS@ @DBUS_LIBS@ \ +bluetooth_properties_LDADD = @GTK_LIBS@ @GCONF_LIBS@ @DBUS_LIBS@ @HAL_LIBS@ \ $(top_builddir)/common/libcommon.a -AM_CFLAGS = @DBUS_CFLAGS@ @GCONF_CFLAGS@ @GTK_CFLAGS@ +AM_CFLAGS = @DBUS_CFLAGS@ @GCONF_CFLAGS@ @GTK_CFLAGS@ @HAL_CFLAGS@ desktopdir = $(datadir)/applications Index: properties/main.c =================================================================== RCS file: /cvsroot/bluez/gnome/properties/main.c,v retrieving revision 1.24 diff -u -p -u -p -r1.24 main.c --- properties/main.c 24 Nov 2006 20:26:39 -0000 1.24 +++ properties/main.c 24 Dec 2006 14:56:22 -0000 @@ -31,6 +31,11 @@ #include #include +#ifdef HAVE_HAL +#include +#include +#include +#endif #include @@ -75,6 +80,10 @@ static GtkWidget *device_tree; static GtkListStore *service_store; +#ifdef HAVE_HAL +static gboolean has_hal = FALSE; +#endif /* HAVE_HAL */ + static void update_icon_policy(GtkWidget *button) { GtkWidget *widget; @@ -905,10 +914,55 @@ static void class_callback(GtkWidget *co G_TYPE_STRING, minor, G_TYPE_INVALID, G_TYPE_INVALID); } +static void create_adapter_class(struct adapter_data *adapter, + GtkWidget *vbox, const char *minor, const char *major) +{ + GtkWidget *label; + GtkWidget *combobox; + gint index; + + label = gtk_label_new(NULL); + + gtk_label_set_markup(GTK_LABEL(label), _("\nClass of device")); + + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + combobox = gtk_combo_box_new_text(); + + gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Unspecified")); + gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Desktop workstation")); + gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Laptop computer")); + + if (major && minor && !strcmp(major, "computer")) { + if (!strcmp(minor, "uncategorized")) + index = 0; + else if (!strcmp(minor, "desktop")) + index = 1; + else if (!strcmp(minor, "laptop")) + index = 2; + else + index = -1; + + gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), index); + } else + gtk_widget_set_sensitive(GTK_WIDGET(combobox), FALSE); + + gtk_box_pack_start(GTK_BOX(vbox), combobox, FALSE, FALSE, 0); + + adapter->combo = combobox; + + g_signal_connect(G_OBJECT(combobox), "changed", + G_CALLBACK(class_callback), adapter); +} + static void create_adapter(struct adapter_data *adapter) { DBusGProxy *object; - const char *name = NULL, *mode = NULL, *major = NULL, *minor = NULL; + const char *name = NULL, *mode = NULL; const guint32 timeout; GtkWidget *vbox; @@ -916,10 +970,8 @@ static void create_adapter(struct adapte GtkWidget *button; GtkWidget *scale; GtkWidget *entry; - GtkWidget *combobox; GSList *group = NULL; gdouble value; - gint index; object = dbus_g_proxy_new_for_name(conn, "org.bluez", adapter->path, "org.bluez.Adapter"); @@ -933,12 +985,6 @@ static void create_adapter(struct adapte dbus_g_proxy_call(object, "GetName", NULL, G_TYPE_INVALID, G_TYPE_STRING, &name, G_TYPE_INVALID); - dbus_g_proxy_call(object, "GetMajorClass", NULL, G_TYPE_INVALID, - G_TYPE_STRING, &major, G_TYPE_INVALID); - - dbus_g_proxy_call(object, "GetMinorClass", NULL, G_TYPE_INVALID, - G_TYPE_STRING, &minor, G_TYPE_INVALID); - vbox = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); @@ -1071,42 +1117,17 @@ static void create_adapter(struct adapte g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(focus_callback), adapter); - label = gtk_label_new(NULL); - - gtk_label_set_markup(GTK_LABEL(label), _("\nClass of device")); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + if (!has_hal) { + const char *major, *minor; + dbus_g_proxy_call(object, "GetMajorClass", NULL, G_TYPE_INVALID, + G_TYPE_STRING, &major, G_TYPE_INVALID); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - combobox = gtk_combo_box_new_text(); - - gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Unspecified")); - gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Desktop workstation")); - gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Laptop computer")); + dbus_g_proxy_call(object, "GetMinorClass", NULL, G_TYPE_INVALID, + G_TYPE_STRING, &minor, G_TYPE_INVALID); - if (major && minor && !strcmp(major, "computer")) { - if (!strcmp(minor, "uncategorized")) - index = 0; - else if (!strcmp(minor, "desktop")) - index = 1; - else if (!strcmp(minor, "laptop")) - index = 2; - else - index = -1; - - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), index); - } else - gtk_widget_set_sensitive(GTK_WIDGET(combobox), FALSE); - - gtk_box_pack_start(GTK_BOX(vbox), combobox, FALSE, FALSE, 0); - - adapter->combo = combobox; - - g_signal_connect(G_OBJECT(combobox), "changed", - G_CALLBACK(class_callback), adapter); + create_adapter_class (adapter, vbox, minor, major); + } gtk_widget_show_all(vbox); } @@ -1215,6 +1236,11 @@ static void minor_changed(DBusGProxy *ob GList *list; const char *path; +#ifdef HAVE_HAL + if (has_hal) + return; +#endif /* HAVE_HAL */ + path = dbus_g_proxy_get_path(object); list = g_list_find_custom(adapter_list, path, adapter_compare); @@ -1569,6 +1595,40 @@ static DBusGProxy *setup_dbus(void) return object; } +#ifdef HAVE_HAL +static void setup_hal(void) +{ + DBusError error; + LibHalContext *ctx; + DBusConnection *c; + + c = dbus_g_connection_get_connection (conn); + if (!c) + return; + + ctx = libhal_ctx_new (); + if (ctx == NULL) + return; + + if (!libhal_ctx_set_dbus_connection (ctx, c)) { + libhal_ctx_free (ctx); + return; + } + + dbus_error_init (&error); + if (libhal_ctx_init (ctx, &error)) + has_hal = TRUE; + + if (dbus_error_is_set (&error)) { + g_warning ("Couldn't connect to HAL: %s", error.message); + dbus_error_free (&error); + has_hal = FALSE; + } + + libhal_ctx_free (ctx); +} +#endif /* HAVE_HAL */ + static void gconf_callback(GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data) { @@ -1638,6 +1698,7 @@ int main(int argc, char *argv[]) notebook = gtk_notebook_new(); service = setup_dbus(); + setup_hal (); manager = setup_manager();