X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=libempathy-gtk%2Fempathy-ui-utils.c;h=6b02b1a929a6241f813a303f482c65012d77e796;hp=fe032c9ee72f22840f33ac383f65f9fef1c209f1;hb=9ddfc7ec17b25b1b02f30639e291b80be85b9a5f;hpb=0d4e81432f5ace47ac86991aa239e4a55686de00 diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c index fe032c9e..6b02b1a9 100644 --- a/libempathy-gtk/empathy-ui-utils.c +++ b/libempathy-gtk/empathy-ui-utils.c @@ -1,7 +1,7 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Copyright (C) 2002-2007 Imendio AB - * Copyright (C) 2007 Collabora Ltd. + * Copyright (C) 2007-2008 Collabora Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -28,22 +28,23 @@ * Jeroen Zwartepoorte */ +#include + #include #include #include #include #include +#include #include -#include #include -#include - #include "empathy-ui-utils.h" #include "empathy-images.h" -#define DEBUG_DOMAIN "UiUtils" +#define DEBUG_FLAG EMPATHY_DEBUG_OTHER +#include struct SizeData { gint width; @@ -58,18 +59,16 @@ get_glade_file (const gchar *filename, const gchar *first_required_widget, va_list args) { - gchar *path; GladeXML *gui; const char *name; GtkWidget **widget_ptr; - path = g_build_filename (DATADIR, "empathy", filename, NULL); - gui = glade_xml_new (path, root, domain); - g_free (path); + DEBUG ("Loading glade file %s", filename); + + gui = glade_xml_new (filename, root, domain); if (!gui) { g_warning ("Couldn't find necessary glade file '%s'", filename); - return NULL; } for (name = first_required_widget; name; name = va_arg (args, char *)) { @@ -106,11 +105,9 @@ empathy_glade_get_file_simple (const gchar *filename, va_end (args); - if (!gui) { - return; + if (gui) { + g_object_unref (gui); } - - g_object_unref (gui); } GladeXML * @@ -212,9 +209,9 @@ empathy_icon_name_from_account (McAccount *account) } const gchar * -empathy_icon_name_for_presence_state (McPresence state) +empathy_icon_name_for_presence (McPresence presence) { - switch (state) { + switch (presence) { case MC_PRESENCE_AVAILABLE: return EMPATHY_IMAGE_AVAILABLE; case MC_PRESENCE_DO_NOT_DISTURB: @@ -235,33 +232,16 @@ empathy_icon_name_for_presence_state (McPresence state) return NULL; } -const gchar * -empathy_icon_name_for_presence (EmpathyPresence *presence) -{ - McPresence state; - - g_return_val_if_fail (EMPATHY_IS_PRESENCE (presence), - EMPATHY_IMAGE_OFFLINE); - - state = empathy_presence_get_state (presence); - - return empathy_icon_name_for_presence_state (state); -} - const gchar * empathy_icon_name_for_contact (EmpathyContact *contact) { - EmpathyPresence *presence; + McPresence presence; g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), EMPATHY_IMAGE_OFFLINE); presence = empathy_contact_get_presence (contact); - if (presence) { - return empathy_icon_name_for_presence (presence); - } - - return EMPATHY_IMAGE_UNKNOWN; + return empathy_icon_name_for_presence (presence); } GdkPixbuf * @@ -278,15 +258,15 @@ empathy_pixbuf_from_data (gchar *data, loader = gdk_pixbuf_loader_new (); if (!gdk_pixbuf_loader_write (loader, data, data_size, &error)) { - empathy_debug (DEBUG_DOMAIN, "Failed to write to pixbuf loader: %s", - error ? error->message : "No error given"); + DEBUG ("Failed to write to pixbuf loader: %s", + error ? error->message : "No error given"); g_clear_error (&error); g_object_unref (loader); return NULL; } if (!gdk_pixbuf_loader_close (loader, &error)) { - empathy_debug (DEBUG_DOMAIN, "Failed to close pixbuf loader: %s", - error ? error->message : "No error given"); + DEBUG ("Failed to close pixbuf loader: %s", + error ? error->message : "No error given"); g_clear_error (&error); g_object_unref (loader); return NULL; @@ -530,6 +510,10 @@ empathy_pixbuf_from_icon_name (const gchar *icon_name, gint w, h; gint size = 48; + if (!icon_name) { + return NULL; + } + theme = gtk_icon_theme_get_default (); if (gtk_icon_size_lookup (icon_size, &w, &h)) { @@ -542,7 +526,7 @@ empathy_pixbuf_from_icon_name (const gchar *icon_name, 0, &error); if (error) { - empathy_debug (DEBUG_DOMAIN, "Error loading icon: %s", error->message); + DEBUG ("Error loading icon: %s", error->message); g_clear_error (&error); } @@ -1211,28 +1195,25 @@ empathy_text_iter_backward_search (const GtkTextIter *iter, return retval; } -static gboolean -window_get_is_on_current_workspace (GtkWindow *window) +gboolean +empathy_window_get_is_visible (GtkWindow *window) { - GdkWindow *gdk_window; + GdkWindowState state; + GdkWindow *gdk_window; + + g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); gdk_window = GTK_WIDGET (window)->window; - if (gdk_window) { - return !(gdk_window_get_state (gdk_window) & - GDK_WINDOW_STATE_ICONIFIED); - } else { + if (!gdk_window) { return FALSE; } -} -/* Checks if the window is visible as in visible on the current workspace. */ -gboolean -empathy_window_get_is_visible (GtkWindow *window) -{ - g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); + state = gdk_window_get_state (gdk_window); + if (state & (GDK_WINDOW_STATE_WITHDRAWN | GDK_WINDOW_STATE_ICONIFIED)) { + return FALSE; + } - return GTK_WIDGET_VISIBLE (GTK_WIDGET (window)) && - window_get_is_on_current_workspace (window); + return TRUE; } void @@ -1255,44 +1236,38 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon) XChangeProperty (dpy, GDK_WINDOW_XID (gdk_window), gdk_x11_get_xatom_by_name_for_display (gdk_drawable_get_display (gdk_window), - "_NET_WM_ICON_GEOMETRY"), + "_NET_WM_ICON_GEOMETRY"), XA_CARDINAL, 32, PropModeReplace, (guchar *)&data, 4); gtk_window_set_skip_taskbar_hint (window, TRUE); gtk_window_iconify (window); - } /* Takes care of moving the window to the current workspace. */ void empathy_window_present (GtkWindow *window, - gboolean steal_focus) + gboolean steal_focus) { - gboolean on_current; - guint32 timestamp; + guint32 timestamp; - g_return_if_fail (window != NULL); + g_return_if_fail (GTK_IS_WINDOW (window)); /* There are three cases: hidden, visible, visible on another * workspace. */ - on_current = window_get_is_on_current_workspace (window); - - if ( GTK_WIDGET_VISIBLE (GTK_WIDGET (window)) && !on_current) { + if (!empathy_window_get_is_visible (window)) { /* Hide it so present brings it to the current workspace. */ gtk_widget_hide (GTK_WIDGET (window)); } - gtk_window_set_skip_taskbar_hint (window, FALSE); - timestamp = gtk_get_current_event_time (); - if (steal_focus && timestamp != GDK_CURRENT_TIME) { - gtk_window_present_with_time (window, timestamp); - } else { - gtk_window_present (window); - } + gtk_window_set_skip_taskbar_hint (window, FALSE); + gtk_window_present_with_time (window, timestamp); + /* FIXME: This shouldn't be required as gtk_window_present's doc says + * it deiconify automatically. */ + gtk_window_deiconify (window); } GtkWindow * @@ -1319,31 +1294,45 @@ empathy_get_toplevel_window (GtkWidget *widget) static gchar * fixup_url (const gchar *url) { - gchar *real_url; - - if (!g_str_has_prefix (url, "http://") && + if (!g_str_has_prefix (url, "ghelp:") && !strstr (url, ":/") && !strstr (url, "@")) { - real_url = g_strdup_printf ("http://%s", url); + return g_strdup_printf ("http://%s", url); } else { - real_url = g_strdup (url); + return NULL; } - - return real_url; } void empathy_url_show (const char *url) { - gchar *real_url; - GnomeVFSResult res; + gchar *real_url; + GError *error = NULL; real_url = fixup_url (url); - res = gnome_vfs_url_show (real_url); - if (res != GNOME_VFS_OK) { - empathy_debug (DEBUG_DOMAIN, "Couldn't show URL %s: %s", - real_url, - gnome_vfs_result_to_string (res)); + if (real_url) { + url = real_url; + } + + /* FIXME: this does not work for multihead, we should use + * GdkAppLaunchContext or gtk_show_url, see bug #514396. + */ + g_app_info_launch_default_for_uri (url, NULL, &error); + if (error) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, 0, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + _("Unable to open URI")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", error->message); + + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + gtk_window_present (GTK_WINDOW (dialog)); + + g_clear_error (&error); } g_free (real_url); @@ -1384,3 +1373,51 @@ empathy_toggle_button_set_state_quietly (GtkWidget *widget, g_signal_handlers_unblock_by_func (widget, callback, user_data); } +GtkTextTag * +empathy_text_buffer_tag_set (GtkTextBuffer *buffer, + const gchar *tag_name, + const gchar *first_property_name, + ...) +{ + GtkTextTagTable *table; + GtkTextTag *tag; + + g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); + g_return_val_if_fail (tag_name != NULL, NULL); + + table = gtk_text_buffer_get_tag_table (buffer); + tag = gtk_text_tag_table_lookup (table, tag_name); + + if (!tag) { + tag = gtk_text_tag_new (tag_name); + gtk_text_tag_table_add (table, tag); + g_object_unref (tag); + } else { + /* Clear the old values so that we don't affect the new theme. */ + g_object_set (tag, + "background-set", FALSE, + "foreground-set", FALSE, + "invisible-set", FALSE, + "justification-set", FALSE, + "paragraph-background-set", FALSE, + "pixels-above-lines-set", FALSE, + "pixels-below-lines-set", FALSE, + "rise-set", FALSE, + "scale-set", FALSE, + "size-set", FALSE, + "style-set", FALSE, + "weight-set", FALSE, + NULL); + } + + if (first_property_name) { + va_list list; + + va_start (list, first_property_name); + g_object_set_valist (G_OBJECT (tag), first_property_name, list); + va_end (list); + } + + return tag; +} +