[evolution] Contact map cleanups.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Contact map cleanups.
- Date: Thu, 31 Oct 2013 20:30:08 +0000 (UTC)
commit 0baabd24ecbf3f00c8361f0ab72eaa8eaad3dac9
Author: Matthew Barnes <mbarnes redhat com>
Date: Thu Oct 31 09:35:50 2013 -0400
Contact map cleanups.
addressbook/gui/widgets/e-contact-map-window.c | 259 +++++++++---------
addressbook/gui/widgets/e-contact-map-window.h | 18 +-
addressbook/gui/widgets/e-contact-map.c | 166 ++++++------
addressbook/gui/widgets/e-contact-map.h | 32 +--
addressbook/gui/widgets/e-contact-marker.c | 344 +++++++++++++----------
addressbook/gui/widgets/e-contact-marker.h | 57 ++--
6 files changed, 448 insertions(+), 428 deletions(-)
---
diff --git a/addressbook/gui/widgets/e-contact-map-window.c b/addressbook/gui/widgets/e-contact-map-window.c
index 483dde7..6dbc8d8 100644
--- a/addressbook/gui/widgets/e-contact-map-window.c
+++ b/addressbook/gui/widgets/e-contact-map-window.c
@@ -18,28 +18,24 @@
*
*/
-#ifdef HAVE_CONFIG_H
+/* This defines WITH_CONTACT_MAPS. */
#include <config.h>
-#endif
#ifdef WITH_CONTACT_MAPS
-#include "e-contact-map.h"
#include "e-contact-map-window.h"
-#include "e-contact-marker.h"
-
-#include <champlain/champlain.h>
#include <string.h>
-
#include <glib/gi18n.h>
-#include <glib-object.h>
-#define E_CONTACT_MAP_WINDOW_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_CONTACT_MAP_WINDOW, EContactMapWindowPrivate))
+#include <champlain/champlain.h>
-G_DEFINE_TYPE (EContactMapWindow, e_contact_map_window, GTK_TYPE_WINDOW)
+#include "e-contact-map.h"
+#include "e-contact-marker.h"
+
+#define E_CONTACT_MAP_WINDOW_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_CONTACT_MAP_WINDOW, EContactMapWindowPrivate))
struct _EContactMapWindowPrivate {
EContactMap *map;
@@ -50,7 +46,8 @@ struct _EContactMapWindowPrivate {
GtkWidget *search_entry;
GtkListStore *completion_model;
- GHashTable *hash_table; /* Hash table contact-name -> marker */
+ /* contact name -> marker */
+ GHashTable *hash_table;
GtkWidget *spinner;
gint tasks_cnt;
@@ -61,7 +58,12 @@ enum {
LAST_SIGNAL
};
-static gint signals[LAST_SIGNAL] = {0};
+static guint signals[LAST_SIGNAL];
+
+G_DEFINE_TYPE (
+ EContactMapWindow,
+ e_contact_map_window,
+ GTK_TYPE_WINDOW)
static void
marker_doubleclick_cb (ClutterActor *actor,
@@ -78,37 +80,39 @@ marker_doubleclick_cb (ClutterActor *actor,
}
static void
-book_contacts_received_cb (GObject *source_object,
- GAsyncResult *result,
- gpointer user_data)
+contact_map_window_get_contacts_cb (GObject *source_object,
+ GAsyncResult *result,
+ gpointer user_data)
{
- EContactMapWindow *window = user_data;
- EBookClient *client = E_BOOK_CLIENT (source_object);
- GSList *contacts = NULL, *p;
- GError *error = NULL;
+ EContactMapWindow *window;
+ GSList *list = NULL, *link;
+ GError *local_error = NULL;
- e_book_client_get_contacts_finish (client, result, &contacts, &error);
+ window = E_CONTACT_MAP_WINDOW (user_data);
- if (error != NULL) {
+ e_book_client_get_contacts_finish (
+ E_BOOK_CLIENT (source_object),
+ result, &list, &local_error);
+
+ if (local_error != NULL) {
g_warning (
"%s: Failed to get contacts: %s",
- G_STRFUNC, error->message);
- g_error_free (error);
+ G_STRFUNC, local_error->message);
+ g_error_free (local_error);
}
- for (p = contacts; p; p = p->next)
- e_contact_map_add_contact (
- window->priv->map, (EContact *) p->data);
+ for (link = list; link != NULL; link = g_slist_next (link)) {
+ EContact *contact = E_CONTACT (link->data);
+ e_contact_map_add_contact (window->priv->map, contact);
+ }
- g_slist_free_full (contacts, (GDestroyNotify) g_object_unref);
- g_object_unref (client);
+ g_slist_free_full (list, (GDestroyNotify) g_object_unref);
}
static void
contact_map_window_zoom_in_cb (GtkButton *button,
- gpointer user_data)
+ EContactMapWindow *window)
{
- EContactMapWindow *window = user_data;
ChamplainView *view;
view = e_contact_map_get_view (window->priv->map);
@@ -118,22 +122,23 @@ contact_map_window_zoom_in_cb (GtkButton *button,
static void
contact_map_window_zoom_out_cb (GtkButton *button,
- gpointer user_data)
+ EContactMapWindow *window)
{
- EContactMapWindow *window = user_data;
ChamplainView *view;
view = e_contact_map_get_view (window->priv->map);
champlain_view_zoom_out (view);
}
+
static void
-zoom_level_changed_cb (ChamplainView *view,
- GParamSpec *pspec,
- gpointer user_data)
+contact_map_window_zoom_level_changed_cb (ChamplainView *view,
+ GParamSpec *pspec,
+ EContactMapWindow *window)
{
- EContactMapWindow *window = user_data;
- gint zoom_level = champlain_view_get_zoom_level (view);
+ gint zoom_level;
+
+ zoom_level = champlain_view_get_zoom_level (view);
gtk_widget_set_sensitive (
window->priv->zoom_in_btn,
@@ -149,86 +154,90 @@ zoom_level_changed_cb (ChamplainView *view,
* that the contact has really been added to map.
*/
static void
-map_contact_added_cb (EContactMap *map,
- ClutterActor *marker,
- gpointer user_data)
+contact_map_window_contact_added_cb (EContactMap *map,
+ ClutterActor *marker,
+ EContactMapWindow *window)
{
- EContactMapWindowPrivate *priv = E_CONTACT_MAP_WINDOW (user_data)->priv;
- const gchar *name;
+ GtkListStore *list_store;
GtkTreeIter iter;
+ const gchar *name;
name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
g_hash_table_insert (
- priv->hash_table,
+ window->priv->hash_table,
g_strdup (name), marker);
- gtk_list_store_append (priv->completion_model, &iter);
- gtk_list_store_set (
- priv->completion_model, &iter,
- 0, name, -1);
+ list_store = window->priv->completion_model;
+ gtk_list_store_append (list_store, &iter);
+ gtk_list_store_set (list_store, &iter, 0, name, -1);
g_signal_connect (
marker, "double-clicked",
- G_CALLBACK (marker_doubleclick_cb), user_data);
+ G_CALLBACK (marker_doubleclick_cb), window);
- priv->tasks_cnt--;
- if (priv->tasks_cnt == 0) {
- gtk_spinner_stop (GTK_SPINNER (priv->spinner));
- gtk_widget_hide (priv->spinner);
+ window->priv->tasks_cnt--;
+ if (window->priv->tasks_cnt == 0) {
+ gtk_spinner_stop (GTK_SPINNER (window->priv->spinner));
+ gtk_widget_hide (window->priv->spinner);
}
}
static void
-map_contact_removed_cb (EContactMap *map,
- const gchar *name,
- gpointer user_data)
+contact_map_window_contact_removed_cb (EContactMap *map,
+ const gchar *name,
+ EContactMapWindow *window)
{
- EContactMapWindowPrivate *priv = E_CONTACT_MAP_WINDOW (user_data)->priv;
+ GtkListStore *list_store;
+ GtkTreeModel *tree_model;
GtkTreeIter iter;
- GtkTreeModel *model = GTK_TREE_MODEL (priv->completion_model);
-
- g_hash_table_remove (priv->hash_table, name);
-
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- do {
- gchar *name_str;
- gtk_tree_model_get (model, &iter, 0, &name_str, -1);
- if (g_ascii_strcasecmp (name_str, name) == 0) {
- g_free (name_str);
- gtk_list_store_remove (priv->completion_model, &iter);
- break;
- }
- g_free (name_str);
- } while (gtk_tree_model_iter_next (model, &iter));
+ gboolean iter_valid;
+
+ list_store = window->priv->completion_model;
+ tree_model = GTK_TREE_MODEL (list_store);
+
+ g_hash_table_remove (window->priv->hash_table, name);
+
+ iter_valid = gtk_tree_model_get_iter_first (tree_model, &iter);
+
+ while (iter_valid) {
+ gchar *name_str;
+ gboolean match;
+
+ gtk_tree_model_get (tree_model, &iter, 0, &name_str, -1);
+ match = (g_ascii_strcasecmp (name_str, name) == 0);
+ g_free (name_str);
+
+ if (match) {
+ gtk_list_store_remove (list_store, &iter);
+ break;
+ }
+
+ iter_valid = gtk_tree_model_iter_next (tree_model, &iter);
}
}
static void
-map_contact_geocoding_started_cb (EContactMap *map,
- ClutterActor *marker,
- gpointer user_data)
+contact_map_window_geocoding_started_cb (EContactMap *map,
+ ClutterActor *marker,
+ EContactMapWindow *window)
{
- EContactMapWindowPrivate *priv = E_CONTACT_MAP_WINDOW (user_data)->priv;
+ gtk_spinner_start (GTK_SPINNER (window->priv->spinner));
+ gtk_widget_show (window->priv->spinner);
- gtk_spinner_start (GTK_SPINNER (priv->spinner));
- gtk_widget_show (priv->spinner);
-
- priv->tasks_cnt++;
+ window->priv->tasks_cnt++;
}
static void
-map_contact_geocoding_failed_cb (EContactMap *map,
- const gchar *name,
- gpointer user_data)
+contact_map_window_geocoding_failed_cb (EContactMap *map,
+ const gchar *name,
+ EContactMapWindow *window)
{
- EContactMapWindowPrivate *priv = E_CONTACT_MAP_WINDOW (user_data)->priv;
+ window->priv->tasks_cnt--;
- priv->tasks_cnt--;
-
- if (priv->tasks_cnt == 0) {
- gtk_spinner_stop (GTK_SPINNER (priv->spinner));
- gtk_widget_hide (priv->spinner);
+ if (window->priv->tasks_cnt == 0) {
+ gtk_spinner_stop (GTK_SPINNER (window->priv->spinner));
+ gtk_widget_hide (window->priv->spinner);
}
}
@@ -280,39 +289,34 @@ entry_completion_match_selected_cb (GtkEntryCompletion *widget,
}
static void
-contact_map_window_finalize (GObject *object)
+contact_map_window_dispose (GObject *object)
{
EContactMapWindowPrivate *priv;
- priv = E_CONTACT_MAP_WINDOW (object)->priv;
+ priv = E_CONTACT_MAP_WINDOW_GET_PRIVATE (object);
- if (priv->hash_table) {
- g_hash_table_destroy (priv->hash_table);
- priv->hash_table = NULL;
+ if (priv->map != NULL) {
+ gtk_widget_destroy (GTK_WIDGET (priv->map));
+ priv->map = NULL;
}
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (e_contact_map_window_parent_class)->finalize (object);
+ g_clear_object (&priv->completion_model);
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_contact_map_window_parent_class)->dispose (object);
}
static void
-contact_map_window_dispose (GObject *object)
+contact_map_window_finalize (GObject *object)
{
EContactMapWindowPrivate *priv;
- priv = E_CONTACT_MAP_WINDOW (object)->priv;
+ priv = E_CONTACT_MAP_WINDOW_GET_PRIVATE (object);
- if (priv->map) {
- gtk_widget_destroy (GTK_WIDGET (priv->map));
- priv->map = NULL;
- }
+ g_hash_table_destroy (priv->hash_table);
- if (priv->completion_model) {
- g_object_unref (priv->completion_model);
- priv->completion_model = NULL;
- }
-
- G_OBJECT_CLASS (e_contact_map_window_parent_class)->dispose (object);
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (e_contact_map_window_parent_class)->finalize (object);
}
static void
@@ -323,8 +327,8 @@ e_contact_map_window_class_init (EContactMapWindowClass *class)
g_type_class_add_private (class, sizeof (EContactMapWindowPrivate));
object_class = G_OBJECT_CLASS (class);
- object_class->finalize = contact_map_window_finalize;
object_class->dispose = contact_map_window_dispose;
+ object_class->finalize = contact_map_window_finalize;
signals[SHOW_CONTACT_EDITOR] = g_signal_new (
"show-contact-editor",
@@ -371,19 +375,19 @@ e_contact_map_window_init (EContactMapWindow *window)
priv->map = E_CONTACT_MAP (map);
g_signal_connect (
view, "notify::zoom-level",
- G_CALLBACK (zoom_level_changed_cb), window);
+ G_CALLBACK (contact_map_window_zoom_level_changed_cb), window);
g_signal_connect (
map, "contact-added",
- G_CALLBACK (map_contact_added_cb), window);
+ G_CALLBACK (contact_map_window_contact_added_cb), window);
g_signal_connect (
map, "contact-removed",
- G_CALLBACK (map_contact_removed_cb), window);
+ G_CALLBACK (contact_map_window_contact_removed_cb), window);
g_signal_connect (
map, "geocoding-started",
- G_CALLBACK (map_contact_geocoding_started_cb), window);
+ G_CALLBACK (contact_map_window_geocoding_started_cb), window);
g_signal_connect (
map, "geocoding-failed",
- G_CALLBACK (map_contact_geocoding_failed_cb), window);
+ G_CALLBACK (contact_map_window_geocoding_failed_cb), window);
/* HBox container */
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 7);
@@ -455,8 +459,15 @@ e_contact_map_window_init (EContactMapWindow *window)
EContactMapWindow *
e_contact_map_window_new (void)
{
- return g_object_new (
- E_TYPE_CONTACT_MAP_WINDOW, NULL);
+ return g_object_new (E_TYPE_CONTACT_MAP_WINDOW, NULL);
+}
+
+EContactMap *
+e_contact_map_window_get_map (EContactMapWindow *window)
+{
+ g_return_val_if_fail (E_IS_CONTACT_MAP_WINDOW (window), NULL);
+
+ return window->priv->map;
}
/**
@@ -473,27 +484,15 @@ e_contact_map_window_load_addressbook (EContactMapWindow *map,
g_return_if_fail (E_IS_CONTACT_MAP_WINDOW (map));
g_return_if_fail (E_IS_BOOK_CLIENT (book_client));
- /* Reference book, so that it does not get deleted before the callback is
- * involved. The book is unrefed in the callback */
- g_object_ref (book_client);
-
book_query = e_book_query_field_exists (E_CONTACT_ADDRESS);
query_string = e_book_query_to_string (book_query);
e_book_query_unref (book_query);
e_book_client_get_contacts (
book_client, query_string, NULL,
- book_contacts_received_cb, map);
+ contact_map_window_get_contacts_cb, map);
g_free (query_string);
}
-EContactMap *
-e_contact_map_window_get_map (EContactMapWindow *window)
-{
- g_return_val_if_fail (E_IS_CONTACT_MAP_WINDOW (window), NULL);
-
- return window->priv->map;
-}
-
#endif /* WITH_CONTACT_MAPS */
diff --git a/addressbook/gui/widgets/e-contact-map-window.h b/addressbook/gui/widgets/e-contact-map-window.h
index aa7bff4..2db0bb6 100644
--- a/addressbook/gui/widgets/e-contact-map-window.h
+++ b/addressbook/gui/widgets/e-contact-map-window.h
@@ -62,17 +62,17 @@ struct _EContactMapWindow {
struct _EContactMapWindowClass {
GtkWindowClass parent_class;
- void (*show_contact_editor) (EContactMapWindow *window,
- const gchar *contact_uid);
+ void (*show_contact_editor) (EContactMapWindow *window,
+ const gchar *contact_uid);
};
-GType e_contact_map_window_get_type (void) G_GNUC_CONST;
-EContactMapWindow * e_contact_map_window_new (void);
-
-void e_contact_map_window_load_addressbook (EContactMapWindow *window,
- EBookClient *book);
-
-EContactMap * e_contact_map_window_get_map (EContactMapWindow *window);
+GType e_contact_map_window_get_type (void) G_GNUC_CONST;
+EContactMapWindow *
+ e_contact_map_window_new (void);
+EContactMap * e_contact_map_window_get_map (EContactMapWindow *window);
+void e_contact_map_window_load_addressbook
+ (EContactMapWindow *window,
+ EBookClient *book);
G_END_DECLS
diff --git a/addressbook/gui/widgets/e-contact-map.c b/addressbook/gui/widgets/e-contact-map.c
index eb114fb..d874df5 100644
--- a/addressbook/gui/widgets/e-contact-map.c
+++ b/addressbook/gui/widgets/e-contact-map.c
@@ -73,33 +73,30 @@ G_DEFINE_TYPE (EContactMap, e_contact_map, GTK_CHAMPLAIN_TYPE_EMBED)
static void
async_context_free (AsyncContext *async_context)
{
- if (async_context->map != NULL)
- g_object_unref (async_context->map);
+ g_clear_object (&async_context->map);
g_slice_free (AsyncContext, async_context);
}
static void
-contact_map_address_resolved_cb (GObject *source,
+contact_map_address_resolved_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
GHashTable *resolved = NULL;
gpointer marker_ptr;
- const gchar *name;
AsyncContext *async_context = user_data;
ChamplainMarkerLayer *marker_layer;
ChamplainMarker *marker;
GeocodePlace *place;
GeocodeLocation *location;
GList *search_results;
-
- g_return_if_fail (async_context != NULL);
- g_return_if_fail (E_IS_CONTACT_MAP (async_context->map));
- g_return_if_fail (E_IS_CONTACT_MARKER (async_context->marker));
+ const gchar *name;
+ GError *local_error = NULL;
marker = CHAMPLAIN_MARKER (async_context->marker);
marker_layer = async_context->map->priv->marker_layer;
+ name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
/* If the marker_layer does not exist anymore, the map has
* probably been destroyed before this callback was launched.
@@ -110,10 +107,24 @@ contact_map_address_resolved_cb (GObject *source,
goto exit;
search_results = geocode_forward_search_finish (
- GEOCODE_FORWARD (source), result, NULL);
+ GEOCODE_FORWARD (source_object), result, &local_error);
+
+ /* Sanity check. */
+ g_warn_if_fail (
+ ((search_results != NULL) && (local_error == NULL)) ||
+ ((search_results == NULL) && (local_error != NULL)));
+
+ /* Keep quiet if the search just came up empty. */
+ if (g_error_matches (local_error, GEOCODE_ERROR, GEOCODE_ERROR_NO_MATCHES)) {
+ g_clear_error (&local_error);
+
+ /* Leave a breadcrumb on the console for any other errors. */
+ } else if (local_error != NULL) {
+ g_warning ("%s: %s", G_STRFUNC, local_error->message);
+ g_clear_error (&local_error);
+ }
if (search_results == NULL) {
- name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
g_signal_emit (
async_context->map,
signals[GEOCODING_FAILED], 0, name);
@@ -135,7 +146,6 @@ contact_map_address_resolved_cb (GObject *source,
g_list_free (search_results);
/* Store the marker in the hash table, using its label as key. */
- name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
marker_ptr = g_hash_table_lookup (
async_context->map->priv->markers, name);
if (marker_ptr != NULL) {
@@ -193,46 +203,13 @@ address_to_xep (EContactAddress *address)
}
static void
-resolve_marker_position (EContactMap *map,
- EContactMarker *marker,
- EContactAddress *address)
-{
- GeocodeForward *geocoder;
- AsyncContext *async_context;
- GHashTable *hash_table;
-
- g_return_if_fail (E_IS_CONTACT_MAP (map));
- g_return_if_fail (address != NULL);
-
- hash_table = address_to_xep (address);
- geocoder = geocode_forward_new_for_params (hash_table);
- g_hash_table_destroy (hash_table);
-
- async_context = g_slice_new0 (AsyncContext);
- async_context->map = g_object_ref (map);
- async_context->marker = marker;
-
- geocode_forward_search_async (
- geocoder, NULL,
- contact_map_address_resolved_cb,
- async_context);
-
- g_object_unref (geocoder);
-
- g_signal_emit (map, signals[GEOCODING_STARTED], 0, marker);
-}
-
-static void
contact_map_finalize (GObject *object)
{
EContactMapPrivate *priv;
- priv = E_CONTACT_MAP (object)->priv;
+ priv = E_CONTACT_MAP_GET_PRIVATE (object);
- if (priv->markers) {
- g_hash_table_destroy (priv->markers);
- priv->markers = NULL;
- }
+ g_hash_table_destroy (priv->markers);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_contact_map_parent_class)->finalize (object);
@@ -288,17 +265,16 @@ e_contact_map_class_init (EContactMapClass *class)
static void
e_contact_map_init (EContactMap *map)
{
- GHashTable *hash_table;
ChamplainMarkerLayer *layer;
ChamplainView *view;
map->priv = E_CONTACT_MAP_GET_PRIVATE (map);
- hash_table = g_hash_table_new_full (
- g_str_hash, g_str_equal,
- (GDestroyNotify) g_free, NULL);
-
- map->priv->markers = hash_table;
+ map->priv->markers = g_hash_table_new_full (
+ (GHashFunc) g_str_hash,
+ (GEqualFunc) g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) NULL);
view = gtk_champlain_embed_get_view (GTK_CHAMPLAIN_EMBED (map));
/* This feature is somehow broken sometimes, so disable it for now */
@@ -311,8 +287,7 @@ e_contact_map_init (EContactMap *map)
GtkWidget *
e_contact_map_new (void)
{
- return g_object_new (
- E_TYPE_CONTACT_MAP,NULL);
+ return g_object_new (E_TYPE_CONTACT_MAP, NULL);
}
void
@@ -321,32 +296,43 @@ e_contact_map_add_contact (EContactMap *map,
{
EContactAddress *address;
EContactPhoto *photo;
+ const gchar *contact_name;
const gchar *contact_uid;
- gchar *name;
- g_return_if_fail (map && E_IS_CONTACT_MAP (map));
- g_return_if_fail (contact && E_IS_CONTACT (contact));
+ g_return_if_fail (E_IS_CONTACT_MAP (map));
+ g_return_if_fail (E_IS_CONTACT (contact));
photo = e_contact_get (contact, E_CONTACT_PHOTO);
+ contact_name = e_contact_get_const (contact, E_CONTACT_FILE_AS);
contact_uid = e_contact_get_const (contact, E_CONTACT_UID);
address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME);
- if (address) {
- name = g_strconcat (e_contact_get_const (contact, E_CONTACT_FILE_AS), " (", _("Home"), ")",
NULL);
- e_contact_map_add_marker (map, name, contact_uid, address, photo);
+ if (address != NULL) {
+ gchar *name;
+
+ name = g_strdup_printf (
+ "%s (%s)", contact_name, _("Home"));
+ e_contact_map_add_marker (
+ map, name, contact_uid, address, photo);
g_free (name);
+
e_contact_address_free (address);
}
address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK);
- if (address) {
- name = g_strconcat (e_contact_get_const (contact, E_CONTACT_FILE_AS), " (", _("Work"), ")",
NULL);
- e_contact_map_add_marker (map, name, contact_uid, address, photo);
+ if (address != NULL) {
+ gchar *name;
+
+ name = g_strdup_printf (
+ "%s (%s)", contact_name, _("Work"));
+ e_contact_map_add_marker (
+ map, name, contact_uid, address, photo);
g_free (name);
+
e_contact_address_free (address);
}
- if (photo)
+ if (photo != NULL)
e_contact_photo_free (photo);
}
@@ -358,15 +344,33 @@ e_contact_map_add_marker (EContactMap *map,
EContactPhoto *photo)
{
EContactMarker *marker;
+ GHashTable *hash_table;
+ GeocodeForward *geocoder;
+ AsyncContext *async_context;
+
+ g_return_if_fail (E_IS_CONTACT_MAP (map));
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (contact_uid != NULL);
+ g_return_if_fail (address != NULL);
+
+ marker = e_contact_marker_new (name, contact_uid, photo);
+
+ hash_table = address_to_xep (address);
+ geocoder = geocode_forward_new_for_params (hash_table);
+ g_hash_table_destroy (hash_table);
+
+ async_context = g_slice_new0 (AsyncContext);
+ async_context->map = g_object_ref (map);
+ async_context->marker = marker;
- g_return_if_fail (map && E_IS_CONTACT_MAP (map));
- g_return_if_fail (name && *name);
- g_return_if_fail (contact_uid && *contact_uid);
- g_return_if_fail (address);
+ geocode_forward_search_async (
+ geocoder, NULL,
+ contact_map_address_resolved_cb,
+ async_context);
- marker = E_CONTACT_MARKER (e_contact_marker_new (name, contact_uid, photo));
+ g_object_unref (geocoder);
- resolve_marker_position (map, marker, address);
+ g_signal_emit (map, signals[GEOCODING_STARTED], 0, marker);
}
/**
@@ -379,8 +383,8 @@ e_contact_map_remove_contact (EContactMap *map,
{
ChamplainMarker *marker;
- g_return_if_fail (map && E_IS_CONTACT_MAP (map));
- g_return_if_fail (name && *name);
+ g_return_if_fail (E_IS_CONTACT_MAP (map));
+ g_return_if_fail (name != NULL);
marker = g_hash_table_lookup (map->priv->markers, name);
@@ -392,28 +396,14 @@ e_contact_map_remove_contact (EContactMap *map,
}
void
-e_contact_map_remove_marker (EContactMap *map,
- ClutterActor *marker)
-{
- const gchar *name;
-
- g_return_if_fail (map && E_IS_CONTACT_MAP (map));
- g_return_if_fail (marker && CLUTTER_IS_ACTOR (marker));
-
- name = champlain_label_get_text (CHAMPLAIN_LABEL (marker));
-
- e_contact_map_remove_contact (map, name);
-}
-
-void
e_contact_map_zoom_on_marker (EContactMap *map,
ClutterActor *marker)
{
ChamplainView *view;
gdouble lat, lng;
- g_return_if_fail (map && E_IS_CONTACT_MAP (map));
- g_return_if_fail (marker && CLUTTER_IS_ACTOR (marker));
+ g_return_if_fail (E_IS_CONTACT_MAP (map));
+ g_return_if_fail (CLUTTER_IS_ACTOR (marker));
lat = champlain_location_get_latitude (CHAMPLAIN_LOCATION (marker));
lng = champlain_location_get_longitude (CHAMPLAIN_LOCATION (marker));
diff --git a/addressbook/gui/widgets/e-contact-map.h b/addressbook/gui/widgets/e-contact-map.h
index d9503e2..5944861 100644
--- a/addressbook/gui/widgets/e-contact-map.h
+++ b/addressbook/gui/widgets/e-contact-map.h
@@ -63,44 +63,34 @@ struct _EContactMap {
struct _EContactMapClass {
GtkWindowClass parent_class;
- void (*contact_added) (EContactMap *map,
- ClutterActor *marker);
-
- void (*contact_removed) (EContactMap *map,
- const gchar *name);
-
- void (*geocoding_started) (EContactMap *map,
- ClutterActor *marker);
-
- void (*geocoding_failed) (EContactMap *map,
- const gchar *name);
+ /* Signals */
+ void (*contact_added) (EContactMap *map,
+ ClutterActor *marker);
+ void (*contact_removed) (EContactMap *map,
+ const gchar *name);
+ void (*geocoding_started) (EContactMap *map,
+ ClutterActor *marker);
+ void (*geocoding_failed) (EContactMap *map,
+ const gchar *name);
};
GType e_contact_map_get_type (void) G_GNUC_CONST;
GtkWidget * e_contact_map_new (void);
-
void e_contact_map_add_contact (EContactMap *map,
EContact *contact);
-
void e_contact_map_add_marker (EContactMap *map,
const gchar *name,
const gchar *contact_uid,
EContactAddress *address,
EContactPhoto *photo);
-
void e_contact_map_remove_contact (EContactMap *map,
const gchar *name);
-
-void e_contact_map_remove_marker (EContactMap *map,
- ClutterActor *marker);
-
void e_contact_map_zoom_on_marker (EContactMap *map,
ClutterActor *marker);
-
-ChamplainView * e_contact_map_get_view (EContactMap *map);
+ChamplainView * e_contact_map_get_view (EContactMap *map);
G_END_DECLS
#endif /* WITH_CONTACT_MAPS */
-#endif
+#endif /* E_CONTACT_MAP_H */
diff --git a/addressbook/gui/widgets/e-contact-marker.c b/addressbook/gui/widgets/e-contact-marker.c
index 9d78637..1c1c9cc 100644
--- a/addressbook/gui/widgets/e-contact-marker.c
+++ b/addressbook/gui/widgets/e-contact-marker.c
@@ -39,13 +39,16 @@
#include <string.h>
#define E_CONTACT_MARKER_GET_PRIVATE(obj) \
- (G_TYPE_INSTANCE_GET_PRIVATE \
- ((obj), E_TYPE_CONTACT_MARKER, EContactMarkerPrivate))
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_CONTACT_MARKER, EContactMarkerPrivate))
-G_DEFINE_TYPE (EContactMarker, e_contact_marker, CHAMPLAIN_TYPE_LABEL);
+#define DEFAULT_FONT_NAME "Serif 9"
-struct _EContactMarkerPrivate
-{
+#define RADIUS 10
+#define PADDING (RADIUS / 2)
+#define HALF_PI (M_PI / 2.0)
+
+struct _EContactMarkerPrivate {
gchar *contact_uid;
ClutterActor *image;
@@ -67,14 +70,14 @@ enum {
LAST_SIGNAL
};
-static gint signals[LAST_SIGNAL] = {0};
-
-#define DEFAULT_FONT_NAME "Serif 9"
+static gint signals[LAST_SIGNAL];
static ClutterColor DEFAULT_COLOR = { 0x33, 0x33, 0x33, 0xff };
-#define RADIUS 10
-#define PADDING (RADIUS / 2)
+G_DEFINE_TYPE (
+ EContactMarker,
+ e_contact_marker,
+ CHAMPLAIN_TYPE_LABEL);
static gboolean
contact_marker_clicked_cb (ClutterActor *actor,
@@ -84,7 +87,7 @@ contact_marker_clicked_cb (ClutterActor *actor,
gint click_count = clutter_event_get_click_count (event);
if (click_count == 2)
- g_signal_emit (E_CONTACT_MARKER (actor), signals[DOUBLE_CLICKED], 0);
+ g_signal_emit (actor, signals[DOUBLE_CLICKED], 0);
return TRUE;
}
@@ -157,12 +160,12 @@ draw_box (cairo_t *cr,
{
cairo_move_to (cr, RADIUS, 0);
cairo_line_to (cr, width - RADIUS, 0);
- cairo_arc (cr, width - RADIUS, RADIUS, RADIUS - 1, 3 * M_PI / 2.0, 0);
+ cairo_arc (cr, width - RADIUS, RADIUS, RADIUS - 1, 3 * HALF_PI, 0);
cairo_line_to (cr, width, height - RADIUS);
- cairo_arc (cr, width - RADIUS, height - RADIUS, RADIUS - 1, 0, M_PI / 2.0);
+ cairo_arc (cr, width - RADIUS, height - RADIUS, RADIUS - 1, 0, HALF_PI);
cairo_line_to (cr, point, height);
cairo_line_to (cr, 0, height + point);
- cairo_arc (cr, RADIUS, RADIUS, RADIUS - 1, M_PI, 3 * M_PI / 2.0);
+ cairo_arc (cr, RADIUS, RADIUS, RADIUS - 1, M_PI, 3 * HALF_PI);
cairo_close_path (cr);
}
@@ -172,7 +175,6 @@ draw_shadow (EContactMarker *marker,
gint height,
gint point)
{
- EContactMarkerPrivate *priv = marker->priv;
ClutterActor *shadow = NULL;
cairo_t *cr;
gdouble slope;
@@ -203,15 +205,16 @@ draw_shadow (EContactMarker *marker,
clutter_actor_set_position (shadow, 0, height / 2.0);
- clutter_container_add_actor (CLUTTER_CONTAINER (priv->content_group), shadow);
+ clutter_container_add_actor (
+ CLUTTER_CONTAINER (marker->priv->content_group), shadow);
- if (priv->shadow != NULL) {
+ if (marker->priv->shadow != NULL) {
clutter_container_remove_actor (
- CLUTTER_CONTAINER (priv->content_group),
- priv->shadow);
+ CLUTTER_CONTAINER (marker->priv->content_group),
+ marker->priv->shadow);
}
- priv->shadow = shadow;
+ marker->priv->shadow = shadow;
}
static void
@@ -233,7 +236,7 @@ draw_background (EContactMarker *marker,
cairo_paint (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- /* If selected, add the selection color to the marker's color */
+ /* If selected, add the selection color to the marker's color */
if (champlain_marker_get_selected (CHAMPLAIN_MARKER (marker)))
color = champlain_marker_get_selection_color ();
else
@@ -275,28 +278,28 @@ draw_background (EContactMarker *marker,
static void
draw_marker (EContactMarker *marker)
{
- EContactMarkerPrivate *priv = marker->priv;
ChamplainLabel *label = CHAMPLAIN_LABEL (marker);
guint height = 0, point = 0;
guint total_width = 0, total_height = 0;
ClutterText *text;
- if (priv->image) {
- clutter_actor_set_position (priv->image, 2 *PADDING, 2 *PADDING);
- if (clutter_actor_get_parent (priv->image) == NULL)
+ if (marker->priv->image != NULL) {
+ clutter_actor_set_position (
+ marker->priv->image, 2 * PADDING, 2 * PADDING);
+ if (clutter_actor_get_parent (marker->priv->image) == NULL)
clutter_container_add_actor (
- CLUTTER_CONTAINER (priv->content_group),
- priv->image);
+ CLUTTER_CONTAINER (marker->priv->content_group),
+ marker->priv->image);
}
- if (priv->text_actor == NULL) {
- priv->text_actor = clutter_text_new_with_text (
+ if (marker->priv->text_actor == NULL) {
+ marker->priv->text_actor = clutter_text_new_with_text (
"Serif 8",
champlain_label_get_text (label));
champlain_label_set_font_name (label, "Serif 8");
}
- text = CLUTTER_TEXT (priv->text_actor);
+ text = CLUTTER_TEXT (marker->priv->text_actor);
clutter_text_set_text (
text,
champlain_label_get_text (label));
@@ -316,20 +319,42 @@ draw_marker (EContactMarker *marker)
text,
champlain_label_get_use_markup (label));
- if (priv->image) {
+ if (marker->priv->image != NULL) {
+ gfloat image_height;
+ gfloat image_width;
+ gfloat text_height;
+
+ image_height = clutter_actor_get_height (marker->priv->image);
+ image_width = clutter_actor_get_width (marker->priv->image);
+
clutter_actor_set_width (
- priv->text_actor,
- clutter_actor_get_width (priv->image));
- total_height = clutter_actor_get_height (priv->image) + 2 *PADDING +
- clutter_actor_get_height (priv->text_actor) + 2 *PADDING;
- total_width = clutter_actor_get_width (priv->image) + 4 *PADDING;
+ marker->priv->text_actor, image_width);
+ text_height = clutter_actor_get_height (
+ marker->priv->text_actor);
+
+ total_height =
+ text_height + 2 * PADDING +
+ image_height + 2 * PADDING;
+ total_width = image_width + 4 * PADDING;
+
clutter_actor_set_position (
- priv->text_actor, PADDING,
- clutter_actor_get_height (priv->image) + 2 *PADDING + 3);
+ marker->priv->text_actor,
+ PADDING, image_height + 2 * PADDING + 3);
} else {
- total_height = clutter_actor_get_height (priv->text_actor) + 2 *PADDING;
- total_width = clutter_actor_get_width (priv->text_actor) + 4 *PADDING;
- clutter_actor_set_position (priv->text_actor, 2 * PADDING, PADDING);
+ gfloat text_height;
+ gfloat text_width;
+
+ text_height = clutter_actor_get_height (
+ marker->priv->text_actor);
+ text_width = clutter_actor_get_width (
+ marker->priv->text_actor);
+
+ total_height = text_height + 2 * PADDING;
+ total_width = text_width + 4 * PADDING;
+
+ clutter_actor_set_position (
+ marker->priv->text_actor,
+ 2 * PADDING, PADDING);
}
height += 2 * PADDING;
@@ -337,33 +362,40 @@ draw_marker (EContactMarker *marker)
total_height = height;
clutter_text_set_color (
- CLUTTER_TEXT (priv->text_actor),
+ CLUTTER_TEXT (marker->priv->text_actor),
(champlain_marker_get_selected (CHAMPLAIN_MARKER (marker)) ?
champlain_marker_get_selection_text_color () :
champlain_label_get_text_color (CHAMPLAIN_LABEL (marker))));
- if (clutter_actor_get_parent (priv->text_actor) == NULL)
+ if (clutter_actor_get_parent (marker->priv->text_actor) == NULL)
clutter_container_add_actor (
- CLUTTER_CONTAINER (priv->content_group),
- priv->text_actor);
+ CLUTTER_CONTAINER (marker->priv->content_group),
+ marker->priv->text_actor);
- if (priv->text_actor == NULL && priv->image == NULL) {
+ if (marker->priv->text_actor == NULL && marker->priv->image == NULL) {
total_width = 6 * PADDING;
total_height = 6 * PADDING;
}
point = (total_height + 2 * PADDING) / 4.0;
- priv->total_width = total_width;
- priv->total_height = total_height;
+ marker->priv->total_width = total_width;
+ marker->priv->total_height = total_height;
draw_shadow (marker, total_width, total_height, point);
draw_background (marker, total_width, total_height, point);
- if (priv->text_actor != NULL && priv->background != NULL)
- clutter_actor_raise (priv->text_actor, priv->background);
- if (priv->image != NULL && priv->background != NULL)
- clutter_actor_raise (priv->image, priv->background);
+ if (marker->priv->background != NULL) {
+ if (marker->priv->text_actor != NULL)
+ clutter_actor_raise (
+ marker->priv->text_actor,
+ marker->priv->background);
+ if (marker->priv->image != NULL)
+ clutter_actor_raise (
+ marker->priv->image,
+ marker->priv->background);
+ }
- clutter_actor_set_anchor_point (CLUTTER_ACTOR (marker), 0, total_height + point);
+ clutter_actor_set_anchor_point (
+ CLUTTER_ACTOR (marker), 0, total_height + point);
}
static gboolean
@@ -391,62 +423,101 @@ queue_redraw (EContactMarker *marker)
}
static void
-allocate (ClutterActor *self,
- const ClutterActorBox *box,
- ClutterAllocationFlags flags)
+notify_selected (GObject *gobject,
+ G_GNUC_UNUSED GParamSpec *pspec,
+ G_GNUC_UNUSED gpointer user_data)
{
- ClutterActorBox child_box;
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (self)->priv;
+ queue_redraw (E_CONTACT_MARKER (gobject));
+}
- CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->allocate (self, box, flags);
+static void
+contact_marker_dispose (GObject *object)
+{
+ EContactMarkerPrivate *priv;
- child_box.x1 = 0;
- child_box.x2 = box->x2 - box->x1;
- child_box.y1 = 0;
- child_box.y2 = box->y2 - box->y1;
- clutter_actor_allocate (CLUTTER_ACTOR (priv->content_group), &child_box, flags);
+ priv = E_CONTACT_MARKER_GET_PRIVATE (object);
+
+ priv->background = NULL;
+ priv->shadow = NULL;
+ priv->text_actor = NULL;
+
+ if (priv->redraw_id > 0) {
+ g_source_remove (priv->redraw_id);
+ priv->redraw_id = 0;
+ }
+
+ if (priv->content_group != NULL) {
+ clutter_actor_unparent (CLUTTER_ACTOR (priv->content_group));
+ priv->content_group = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_contact_marker_parent_class)->dispose (object);
}
static void
-paint (ClutterActor *self)
+contact_marker_finalize (GObject *object)
{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (self)->priv;
+ EContactMarkerPrivate *priv;
- clutter_actor_paint (CLUTTER_ACTOR (priv->content_group));
+ priv = E_CONTACT_MARKER_GET_PRIVATE (object);
+
+ g_free (priv->contact_uid);
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (e_contact_marker_parent_class)->finalize (object);
}
static void
-map (ClutterActor *self)
+contact_marker_map (ClutterActor *actor)
{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (self)->priv;
+ EContactMarker *marker;
+
+ marker = E_CONTACT_MARKER (actor);
- CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->map (self);
+ /* Chain up to parent's map() method. */
+ CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->map (actor);
- clutter_actor_map (CLUTTER_ACTOR (priv->content_group));
+ clutter_actor_map (CLUTTER_ACTOR (marker->priv->content_group));
}
static void
-unmap (ClutterActor *self)
+contact_marker_unmap (ClutterActor *actor)
{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (self)->priv;
+ EContactMarker *marker;
- CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->unmap (self);
+ marker = E_CONTACT_MARKER (actor);
- clutter_actor_unmap (CLUTTER_ACTOR (priv->content_group));
+ /* Chain up to parent's unmap() method. */
+ CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->unmap (actor);
+
+ clutter_actor_unmap (CLUTTER_ACTOR (marker->priv->content_group));
}
static void
-pick (ClutterActor *self,
- const ClutterColor *color)
+contact_marker_paint (ClutterActor *actor)
{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (self)->priv;
+ EContactMarker *marker;
+
+ marker = E_CONTACT_MARKER (actor);
+
+ clutter_actor_paint (CLUTTER_ACTOR (marker->priv->content_group));
+}
+
+static void
+contact_marker_pick (ClutterActor *actor,
+ const ClutterColor *color)
+{
+ EContactMarker *marker;
gfloat width, height;
- if (!clutter_actor_should_pick_paint (self))
+ if (!clutter_actor_should_pick_paint (actor))
return;
- width = priv->total_width;
- height = priv->total_height;
+ marker = E_CONTACT_MARKER (actor);
+
+ width = marker->priv->total_width;
+ height = marker->priv->total_height;
cogl_path_new ();
@@ -470,64 +541,47 @@ pick (ClutterActor *self,
}
static void
-notify_selected (GObject *gobject,
- G_GNUC_UNUSED GParamSpec *pspec,
- G_GNUC_UNUSED gpointer user_data)
-{
- queue_redraw (E_CONTACT_MARKER (gobject));
-}
-
-static void
-e_contact_marker_finalize (GObject *object)
+contact_marker_allocate (ClutterActor *actor,
+ const ClutterActorBox *box,
+ ClutterAllocationFlags flags)
{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (object)->priv;
-
- if (priv->contact_uid) {
- g_free (priv->contact_uid);
- priv->contact_uid = NULL;
- }
-
- if (priv->redraw_id) {
- g_source_remove (priv->redraw_id);
- priv->redraw_id = 0;
- }
+ EContactMarker *marker;
+ ClutterActorBox child_box;
- G_OBJECT_CLASS (e_contact_marker_parent_class)->finalize (object);
-}
+ marker = E_CONTACT_MARKER (actor);
-static void
-e_contact_marker_dispose (GObject *object)
-{
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (object)->priv;
+ /* Chain up to parent's allocate() method. */
+ CLUTTER_ACTOR_CLASS (e_contact_marker_parent_class)->
+ allocate (actor, box, flags);
- priv->background = NULL;
- priv->shadow = NULL;
- priv->text_actor = NULL;
-
- if (priv->content_group) {
- clutter_actor_unparent (CLUTTER_ACTOR (priv->content_group));
- priv->content_group = NULL;
- }
+ child_box.x1 = 0;
+ child_box.x2 = box->x2 - box->x1;
+ child_box.y1 = 0;
+ child_box.y2 = box->y2 - box->y1;
- G_OBJECT_CLASS (e_contact_marker_parent_class)->dispose (object);
+ clutter_actor_allocate (
+ CLUTTER_ACTOR (marker->priv->content_group),
+ &child_box, flags);
}
static void
e_contact_marker_class_init (EContactMarkerClass *class)
{
- ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (class);
- GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GObjectClass *object_class;
+ ClutterActorClass *actor_class;
g_type_class_add_private (class, sizeof (EContactMarkerPrivate));
- object_class->dispose = e_contact_marker_dispose;
- object_class->finalize = e_contact_marker_finalize;
+ object_class = G_OBJECT_CLASS (class);
+ object_class->dispose = contact_marker_dispose;
+ object_class->finalize = contact_marker_finalize;
- actor_class->paint = paint;
- actor_class->allocate = allocate;
- actor_class->map = map;
- actor_class->unmap = unmap;
- actor_class->pick = pick;
+ actor_class = CLUTTER_ACTOR_CLASS (class);
+ actor_class->map = contact_marker_map;
+ actor_class->unmap = contact_marker_unmap;
+ actor_class->paint = contact_marker_paint;
+ actor_class->pick = contact_marker_pick;
+ actor_class->allocate = contact_marker_allocate;
signals[DOUBLE_CLICKED] = g_signal_new (
"double-clicked",
@@ -542,26 +596,15 @@ e_contact_marker_class_init (EContactMarkerClass *class)
static void
e_contact_marker_init (EContactMarker *marker)
{
- EContactMarkerPrivate *priv;
+ marker->priv = E_CONTACT_MARKER_GET_PRIVATE (marker);
- priv = E_CONTACT_MARKER_GET_PRIVATE (marker);
-
- marker->priv = priv;
- priv->contact_uid = NULL;
- priv->image = NULL;
- priv->background = NULL;
- priv->shadow = NULL;
- priv->text_actor = NULL;
- priv->content_group = CLUTTER_GROUP (clutter_group_new ());
- priv->redraw_id = 0;
+ marker->priv->content_group = CLUTTER_GROUP (clutter_group_new ());
clutter_actor_set_parent (
- CLUTTER_ACTOR (priv->content_group), CLUTTER_ACTOR (marker));
+ CLUTTER_ACTOR (marker->priv->content_group),
+ CLUTTER_ACTOR (marker));
clutter_actor_queue_relayout (CLUTTER_ACTOR (marker));
- priv->total_width = 0;
- priv->total_height = 0;
-
g_signal_connect (
marker, "notify::selected",
G_CALLBACK (notify_selected), NULL);
@@ -570,23 +613,24 @@ e_contact_marker_init (EContactMarker *marker)
G_CALLBACK (contact_marker_clicked_cb), NULL);
}
-ClutterActor *
+EContactMarker *
e_contact_marker_new (const gchar *name,
const gchar *contact_uid,
EContactPhoto *photo)
{
- ClutterActor *marker = CLUTTER_ACTOR (g_object_new (E_TYPE_CONTACT_MARKER, NULL));
- EContactMarkerPrivate *priv = E_CONTACT_MARKER (marker)->priv;
+ EContactMarker *marker;
+
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (contact_uid != NULL, NULL);
- g_return_val_if_fail (name && *name, NULL);
- g_return_val_if_fail (contact_uid && *contact_uid, NULL);
+ marker = g_object_new (E_TYPE_CONTACT_MARKER, NULL);
champlain_label_set_text (CHAMPLAIN_LABEL (marker), name);
- priv->contact_uid = g_strdup (contact_uid);
- if (photo)
- priv->image = contact_photo_to_texture (photo);
+ marker->priv->contact_uid = g_strdup (contact_uid);
+ if (photo != NULL)
+ marker->priv->image = contact_photo_to_texture (photo);
- queue_redraw (E_CONTACT_MARKER (marker));
+ queue_redraw (marker);
return marker;
}
@@ -594,7 +638,7 @@ e_contact_marker_new (const gchar *name,
const gchar *
e_contact_marker_get_contact_uid (EContactMarker *marker)
{
- g_return_val_if_fail (marker && E_IS_CONTACT_MARKER (marker), NULL);
+ g_return_val_if_fail (E_IS_CONTACT_MARKER (marker), NULL);
return marker->priv->contact_uid;
}
diff --git a/addressbook/gui/widgets/e-contact-marker.h b/addressbook/gui/widgets/e-contact-marker.h
index 791a9c4..b86b6ff 100644
--- a/addressbook/gui/widgets/e-contact-marker.h
+++ b/addressbook/gui/widgets/e-contact-marker.h
@@ -25,60 +25,57 @@
#ifdef WITH_CONTACT_MAPS
-#include <libebook/libebook.h>
-
-#include <champlain/champlain.h>
-
-#include <glib-object.h>
#include <clutter/clutter.h>
+#include <champlain/champlain.h>
-G_BEGIN_DECLS
-
-#define E_TYPE_CONTACT_MARKER e_contact_marker_get_type ()
+#include <libebook/libebook.h>
+/* Standard GObject macros */
+#define E_TYPE_CONTACT_MARKER \
+ (e_contact_marker_get_type ())
#define E_CONTACT_MARKER(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_MARKER, EContactMarker))
-
-#define E_CONTACT_MARKER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_MARKER, EContactMarkerClass))
-
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_CONTACT_MARKER, EContactMarker))
+#define E_CONTACT_MARKER_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_CONTACT_MARKER, EContactMarkerClass))
#define E_IS_CONTACT_MARKER(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_MARKER))
-
-#define E_IS_CONTACT_MARKER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_CONTACT_MARKER))
-
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_CONTACT_MARKER))
+#define E_IS_CONTACT_MARKER_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_CONTACT_MARKER))
#define E_CONTACT_MARKER_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_CONTACT_MARKER, EContactMarkerClass))
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_CONTACT_MARKER, EContactMarkerClass))
-typedef struct _EContactMarkerPrivate EContactMarkerPrivate;
+G_BEGIN_DECLS
typedef struct _EContactMarker EContactMarker;
typedef struct _EContactMarkerClass EContactMarkerClass;
+typedef struct _EContactMarkerPrivate EContactMarkerPrivate;
-struct _EContactMarker
-{
+struct _EContactMarker {
ChamplainLabel parent;
EContactMarkerPrivate *priv;
};
-struct _EContactMarkerClass
-{
+struct _EContactMarkerClass {
ChamplainLabelClass parent_class;
void (*double_clicked) (ClutterActor *actor);
};
-GType e_contact_marker_get_type (void);
-
-ClutterActor * e_contact_marker_new (const gchar *name,
+GType e_contact_marker_get_type (void) G_GNUC_CONST;
+EContactMarker *
+ e_contact_marker_new (const gchar *name,
const gchar *contact_uid,
EContactPhoto *photo);
-
-const gchar * e_contact_marker_get_contact_uid (EContactMarker *marker);
+const gchar * e_contact_marker_get_contact_uid
+ (EContactMarker *marker);
G_END_DECLS
#endif /* WITH_CONTACT_MAPS */
-#endif
+#endif /* E_CONTACT_MARKER_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]