/* -*- 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
* Jeroen Zwartepoorte
*/
+#include <config.h>
+
#include <string.h>
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <gio/gio.h>
#include <glade/glade.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
#include <libmissioncontrol/mc-profile.h>
-#include <libempathy/empathy-debug.h>
-
#include "empathy-ui-utils.h"
#include "empathy-images.h"
-#define DEBUG_DOMAIN "UiUtils"
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include <libempathy/empathy-debug.h>
struct SizeData {
gint width;
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 *)) {
va_end (args);
- if (!gui) {
- return;
+ if (gui) {
+ g_object_unref (gui);
}
-
- g_object_unref (gui);
}
GladeXML *
}
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:
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 *
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;
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)) {
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);
}
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
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 *
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);
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;
+}
+