aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/Makefile.am2
-rw-r--r--libempathy-gtk/empathy-contact-widget.c8
-rw-r--r--libempathy-gtk/empathy-contact-widget.ui12
-rw-r--r--libempathy-gtk/empathy-kludge-label.c89
-rw-r--r--libempathy-gtk/empathy-kludge-label.h53
5 files changed, 152 insertions, 12 deletions
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index 10931012a..5903efb15 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -60,6 +60,7 @@ libempathy_gtk_handwritten_source = \
empathy-theme-boxes.c \
empathy-theme-irc.c \
empathy-theme-manager.c \
+ empathy-kludge-label.c \
empathy-ui-utils.c
libempathy_gtk_la_SOURCES = \
@@ -120,6 +121,7 @@ libempathy_gtk_headers = \
empathy-theme-boxes.h \
empathy-theme-irc.h \
empathy-theme-manager.h \
+ empathy-kludge-label.h \
empathy-ui-utils.h
check_c_sources = \
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index 7e80d0d65..f078f5248 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -47,6 +47,7 @@
#include "empathy-avatar-chooser.h"
#include "empathy-avatar-image.h"
#include "empathy-ui-utils.h"
+#include "empathy-kludge-label.h"
#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
#include <libempathy/empathy-debug.h>
@@ -219,7 +220,6 @@ empathy_contact_widget_new (EmpathyContact *contact,
"hbox_presence", &information->hbox_presence,
"label_alias", &information->label_alias,
"image_state", &information->image_state,
- "label_status", &information->label_status,
"table_contact", &information->table_contact,
"vbox_avatar", &information->vbox_avatar,
"vbox_location", &information->vbox_location,
@@ -587,6 +587,12 @@ update_avatar_chooser_account_cb (EmpathyAccountChooser *account_chooser,
static void
contact_widget_contact_setup (EmpathyContactWidget *information)
{
+ /* Setup label_status as a KludgeLabel */
+ information->label_status = empathy_kludge_label_new ("");
+ gtk_box_pack_start (GTK_BOX (information->hbox_presence),
+ information->label_status, TRUE, TRUE, 0);
+ gtk_widget_show (information->label_status);
+
/* Setup account label/chooser */
if (information->flags & EMPATHY_CONTACT_WIDGET_EDIT_ACCOUNT)
{
diff --git a/libempathy-gtk/empathy-contact-widget.ui b/libempathy-gtk/empathy-contact-widget.ui
index c5bbd5bbe..5737b7d71 100644
--- a/libempathy-gtk/empathy-contact-widget.ui
+++ b/libempathy-gtk/empathy-contact-widget.ui
@@ -112,17 +112,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="label_status">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="xalign">0</property>
- <property name="use_markup">True</property>
- <property name="wrap">True</property>
- <property name="selectable">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
+ <placeholder/>
</child>
</object>
<packing>
diff --git a/libempathy-gtk/empathy-kludge-label.c b/libempathy-gtk/empathy-kludge-label.c
new file mode 100644
index 000000000..f4a29dec2
--- /dev/null
+++ b/libempathy-gtk/empathy-kludge-label.c
@@ -0,0 +1,89 @@
+/* vim: set ts=4 sts=4 sw=4 et: */
+/*
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
+ */
+
+#include "empathy-kludge-label.h"
+
+G_DEFINE_TYPE (EmpathyKludgeLabel, empathy_kludge_label, GTK_TYPE_LABEL);
+
+static void
+empathy_kludge_label_size_allocate (GtkWidget *self,
+ GtkAllocation *allocation)
+{
+ PangoLayout *layout;
+
+ GTK_WIDGET_CLASS (empathy_kludge_label_parent_class)->size_allocate (
+ self, allocation);
+
+ /* force the width of the PangoLayout to be the width of the allocation */
+ layout = gtk_label_get_layout (GTK_LABEL (self));
+ pango_layout_set_width (layout, allocation->width * PANGO_SCALE);
+}
+
+static gboolean
+empathy_kludge_label_expose_event (GtkWidget *self,
+ GdkEventExpose *event)
+{
+ PangoLayout *layout;
+ PangoRectangle rect;
+ GtkAllocation real_allocation;
+ gboolean r;
+
+ layout = gtk_label_get_layout (GTK_LABEL (self));
+ pango_layout_get_pixel_extents (layout, NULL, &rect);
+
+ /* this is mind-bendingly evil:
+ * get_layout_location() is going to remove rect.x from the position of the
+ * layout when painting it. This really sucks. We're going to compensate by
+ * adding this value to the allocation.
+ */
+ real_allocation = self->allocation;
+ self->allocation.x += rect.x;
+
+ r = GTK_WIDGET_CLASS (empathy_kludge_label_parent_class)->expose_event (
+ self, event);
+
+ self->allocation = real_allocation;
+
+ return r;
+}
+
+static void
+empathy_kludge_label_class_init (EmpathyKludgeLabelClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ widget_class->size_allocate = empathy_kludge_label_size_allocate;
+ widget_class->expose_event = empathy_kludge_label_expose_event;
+}
+
+static void
+empathy_kludge_label_init (EmpathyKludgeLabel *self)
+{
+}
+
+GtkWidget *
+empathy_kludge_label_new (const char *str)
+{
+ return g_object_new (EMPATHY_TYPE_KLUDGE_LABEL,
+ "label", str,
+ "xalign", 0.,
+ NULL);
+}
diff --git a/libempathy-gtk/empathy-kludge-label.h b/libempathy-gtk/empathy-kludge-label.h
new file mode 100644
index 000000000..f2ea1e938
--- /dev/null
+++ b/libempathy-gtk/empathy-kludge-label.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
+ */
+
+#ifndef __EMPATHY_KLUDGE_LABEL_H__
+#define __EMPATHY_KLUDGE_LABEL_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_KLUDGE_LABEL (empathy_kludge_label_get_type ())
+#define EMPATHY_KLUDGE_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabel))
+#define EMPATHY_KLUDGE_LABEL_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabelClass))
+#define EMPATHY_IS_KLUDGE_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMPATHY_TYPE_KLUDGE_LABEL))
+#define EMPATHY_IS_KLUDGE_LABEL_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), EMPATHY_TYPE_KLUDGE_LABEL))
+#define EMPATHY_KLUDGE_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabelClass))
+
+typedef struct _EmpathyKludgeLabel EmpathyKludgeLabel;
+typedef struct _EmpathyKludgeLabelClass EmpathyKludgeLabelClass;
+
+struct _EmpathyKludgeLabel
+{
+ GtkLabel parent;
+};
+
+struct _EmpathyKludgeLabelClass
+{
+ GtkLabelClass parent_class;
+};
+
+GType empathy_kludge_label_get_type (void);
+GtkWidget *empathy_kludge_label_new (const char *str);
+
+G_END_DECLS
+
+#endif