* Jeroen Zwartepoorte
*/
+#include <config.h>
+
#include <string.h>
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
const char *name;
GtkWidget **widget_ptr;
- path = g_build_filename (DATADIR, "empathy", filename, NULL);
+ path = g_build_filename (UNINSTALLED_GLADE_DIR, filename, NULL);
+ if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
+ g_free (path);
+ path = g_build_filename (DATADIR, "empathy", filename, NULL);
+ }
+ empathy_debug (DEBUG_DOMAIN, "Loading glade file %s", path);
+
gui = glade_xml_new (path, root, domain);
g_free (path);
va_end (args);
}
-GdkPixbuf *
-empathy_pixbuf_from_icon_name (const gchar *icon_name,
- GtkIconSize icon_size)
-{
- GtkIconTheme *theme;
- GdkPixbuf *pixbuf = NULL;
- GError *error = NULL;
- gint w, h;
- gint size = 48;
-
- theme = gtk_icon_theme_get_default ();
-
- if (gtk_icon_size_lookup (icon_size, &w, &h)) {
- size = (w + h) / 2;
- }
-
- pixbuf = gtk_icon_theme_load_icon (theme,
- icon_name,
- size,
- 0,
- &error);
- if (error) {
- empathy_debug (DEBUG_DOMAIN, "Error loading icon: %s", error->message);
- g_clear_error (&error);
- }
-
- return pixbuf;
-}
-
-GdkPixbuf *
-empathy_pixbuf_from_smiley (EmpathySmiley type,
- GtkIconSize icon_size)
-{
- const gchar *icon_id;
-
- switch (type) {
- case EMPATHY_SMILEY_NORMAL: /* :) */
- icon_id = "stock_smiley-1";
- break;
- case EMPATHY_SMILEY_WINK: /* ;) */
- icon_id = "stock_smiley-3";
- break;
- case EMPATHY_SMILEY_BIGEYE: /* =) */
- icon_id = "stock_smiley-2";
- break;
- case EMPATHY_SMILEY_NOSE: /* :-) */
- icon_id = "stock_smiley-7";
- break;
- case EMPATHY_SMILEY_CRY: /* :'( */
- icon_id = "stock_smiley-11";
- break;
- case EMPATHY_SMILEY_SAD: /* :( */
- icon_id = "stock_smiley-4";
- break;
- case EMPATHY_SMILEY_SCEPTICAL: /* :/ */
- icon_id = "stock_smiley-9";
- break;
- case EMPATHY_SMILEY_BIGSMILE: /* :D */
- icon_id = "stock_smiley-6";
- break;
- case EMPATHY_SMILEY_INDIFFERENT: /* :| */
- icon_id = "stock_smiley-8";
- break;
- case EMPATHY_SMILEY_TOUNGE: /* :p */
- icon_id = "stock_smiley-10";
- break;
- case EMPATHY_SMILEY_SHOCKED: /* :o */
- icon_id = "stock_smiley-5";
- break;
- case EMPATHY_SMILEY_COOL: /* 8) */
- icon_id = "stock_smiley-15";
- break;
- case EMPATHY_SMILEY_SORRY: /* *| */
- icon_id = "stock_smiley-12";
- break;
- case EMPATHY_SMILEY_KISS: /* :* */
- icon_id = "stock_smiley-13";
- break;
- case EMPATHY_SMILEY_SHUTUP: /* :# */
- icon_id = "stock_smiley-14";
- break;
- case EMPATHY_SMILEY_YAWN: /* |O */
- icon_id = "";
- break;
- case EMPATHY_SMILEY_CONFUSED: /* :$ */
- icon_id = "stock_smiley-17";
- break;
- case EMPATHY_SMILEY_ANGEL: /* O) */
- icon_id = "stock_smiley-18";
- break;
- case EMPATHY_SMILEY_OOOH: /* :x */
- icon_id = "stock_smiley-19";
- break;
- case EMPATHY_SMILEY_LOOKAWAY: /* *) */
- icon_id = "stock_smiley-20";
- break;
- case EMPATHY_SMILEY_BLUSH: /* *S */
- icon_id = "stock_smiley-23";
- break;
- case EMPATHY_SMILEY_COOLBIGSMILE: /* 8D */
- icon_id = "stock_smiley-25";
- break;
- case EMPATHY_SMILEY_ANGRY: /* :@ */
- icon_id = "stock_smiley-16";
- break;
- case EMPATHY_SMILEY_BOSS: /* @) */
- icon_id = "stock_smiley-21";
- break;
- case EMPATHY_SMILEY_MONKEY: /* #) */
- icon_id = "stock_smiley-22";
- break;
- case EMPATHY_SMILEY_SILLY: /* O) */
- icon_id = "stock_smiley-24";
- break;
- case EMPATHY_SMILEY_SICK: /* +o( */
- icon_id = "stock_smiley-26";
- break;
-
- default:
- g_assert_not_reached ();
- icon_id = NULL;
- }
-
-
- return empathy_pixbuf_from_icon_name (icon_id, icon_size);
-}
-
const gchar *
empathy_icon_name_from_account (McAccount *account)
{
case MC_PRESENCE_EXTENDED_AWAY:
return EMPATHY_IMAGE_EXT_AWAY;
case MC_PRESENCE_HIDDEN:
+ return EMPATHY_IMAGE_HIDDEN;
case MC_PRESENCE_OFFLINE:
case MC_PRESENCE_UNSET:
return EMPATHY_IMAGE_OFFLINE;
const gchar *
empathy_icon_name_for_contact (EmpathyContact *contact)
{
- EmpathyPresence *presence;
- EmpathySubscription subscription;
+ EmpathyPresence *presence;
g_return_val_if_fail (EMPATHY_IS_CONTACT (contact),
EMPATHY_IMAGE_OFFLINE);
return empathy_icon_name_for_presence (presence);
}
- subscription = empathy_contact_get_subscription (contact);
- if (!(subscription & EMPATHY_SUBSCRIPTION_FROM)) {
- return EMPATHY_IMAGE_PENDING;
+ return EMPATHY_IMAGE_UNKNOWN;
+}
+
+GdkPixbuf *
+empathy_pixbuf_from_data (gchar *data,
+ gsize data_size)
+{
+ GdkPixbufLoader *loader;
+ GdkPixbuf *pixbuf = NULL;
+ GError *error = NULL;
+
+ if (!data) {
+ return NULL;
}
- return EMPATHY_IMAGE_OFFLINE;
+ 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");
+ 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");
+ g_clear_error (&error);
+ g_object_unref (loader);
+ return NULL;
+ }
+
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ if (pixbuf) {
+ g_object_ref (pixbuf);
+ }
+
+ g_object_unref (loader);
+
+ return pixbuf;
}
static void
return empathy_pixbuf_from_avatar_scaled (avatar, width, height);
}
+GdkPixbuf *
+empathy_pixbuf_scale_down_if_necessary (GdkPixbuf *pixbuf, gint max_size)
+{
+ gint width, height;
+ gdouble factor;
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+
+ if (width > max_size || height > max_size) {
+ factor = (gdouble) max_size / MAX (width, height);
+
+ width = width * factor;
+ height = height * factor;
+
+ return gdk_pixbuf_scale_simple (pixbuf,
+ width, height,
+ GDK_INTERP_HYPER);
+ }
+
+ return g_object_ref (pixbuf);
+}
+
+GdkPixbuf *
+empathy_pixbuf_from_icon_name (const gchar *icon_name,
+ GtkIconSize icon_size)
+{
+ GtkIconTheme *theme;
+ GdkPixbuf *pixbuf = NULL;
+ GError *error = 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)) {
+ size = (w + h) / 2;
+ }
+
+ pixbuf = gtk_icon_theme_load_icon (theme,
+ icon_name,
+ size,
+ 0,
+ &error);
+ if (error) {
+ empathy_debug (DEBUG_DOMAIN, "Error loading icon: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ return pixbuf;
+}
+
/* Stolen from GtkSourceView, hence the weird intendation. Please keep it like
* that to make it easier to apply changes from the original code.
*/
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);
}
GtkWindow *
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;
+}
+