aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.in5
-rw-r--r--src/indicator-messages.c132
-rw-r--r--src/messages-service-server.h6
-rw-r--r--src/messages-service.c4
4 files changed, 131 insertions, 16 deletions
diff --git a/src/Makefile.in b/src/Makefile.in
index 756fbc9..6e6cc22 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -39,7 +39,10 @@ libexec_PROGRAMS = indicator-messages-service$(EXEEXT)
subdir = src
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/intltool.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
diff --git a/src/indicator-messages.c b/src/indicator-messages.c
index f47eccd..df2d972 100644
--- a/src/indicator-messages.c
+++ b/src/indicator-messages.c
@@ -44,6 +44,11 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define IS_INDICATOR_MESSAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_MESSAGES_TYPE))
#define INDICATOR_MESSAGES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_MESSAGES_TYPE, IndicatorMessagesClass))
+#define M_PI 3.1415926535897932384626433832795028841971693993751
+
+#define RIGHT_LABEL_FONT_SIZE 12
+#define RIGHT_LABEL_RADIUS 20
+
typedef struct _IndicatorMessages IndicatorMessages;
typedef struct _IndicatorMessagesClass IndicatorMessagesClass;
@@ -285,6 +290,115 @@ application_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value,
return;
}
+/* Draws a triangle on the left, using fg[STATE_TYPE] color. */
+static gboolean
+application_triangle_draw_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ GtkStyle *style;
+ cairo_t *cr;
+ int x, y, arrow_width, arrow_height;
+
+ if (!GTK_IS_WIDGET (widget)) return FALSE;
+
+ /* get style */
+ style = gtk_widget_get_style (widget);
+
+ /* set arrow position / dimensions */
+ arrow_width = (int) ((double)widget->allocation.height * 0.25f);
+ arrow_height = (int) ((double)widget->allocation.height * 0.50f);
+ x = widget->allocation.x;
+ y = widget->allocation.y + widget->allocation.height/2.0 - (double)arrow_height/2.0;
+
+ /* initialize cairo drawing area */
+ cr = (cairo_t*) gdk_cairo_create (widget->window);
+
+ /* set line width */
+ cairo_set_line_width (cr, 1.0);
+
+ /* cairo drawing code */
+ cairo_move_to (cr, x, y);
+ cairo_line_to (cr, x, y + arrow_height);
+ cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0);
+ cairo_close_path (cr);
+ cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0,
+ style->fg[gtk_widget_get_state(widget)].green/65535.0,
+ style->fg[gtk_widget_get_state(widget)].blue/65535.0);
+ cairo_fill (cr);
+
+ /* remember to destroy cairo context to avoid leaks */
+ cairo_destroy (cr);
+
+ return FALSE;
+}
+
+/* Custom function to draw rounded rectangle with max radius */
+static void
+custom_cairo_rounded_rectangle (cairo_t *cr,
+ double x, double y, double w, double h)
+{
+ double radius = MIN (w/2.0, h/2.0);
+
+ cairo_move_to (cr, x+radius, y);
+ cairo_arc (cr, x+w-radius, y+radius, radius, M_PI*1.5, M_PI*2);
+ cairo_arc (cr, x+w-radius, y+h-radius, radius, 0, M_PI*0.5);
+ cairo_arc (cr, x+radius, y+h-radius, radius, M_PI*0.5, M_PI);
+ cairo_arc (cr, x+radius, y+radius, radius, M_PI, M_PI*1.5);
+}
+
+/* Draws a rounded rectangle with text inside. */
+static gboolean
+numbers_draw_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ GtkStyle *style;
+ cairo_t *cr;
+ double x, y, w, h;
+ PangoLayout * layout;
+ gint font_size = RIGHT_LABEL_FONT_SIZE;
+
+ if (!GTK_IS_WIDGET (widget)) return FALSE;
+
+ /* get style */
+ style = gtk_widget_get_style (widget);
+
+ /* set arrow position / dimensions */
+ w = widget->allocation.width;
+ h = widget->allocation.height;
+ x = widget->allocation.x;
+ y = widget->allocation.y;
+
+ layout = gtk_label_get_layout (GTK_LABEL(widget));
+
+ /* This does not work, don't ask me why but font_size is 0.
+ * I wanted to use a dynamic font size to adjust the padding on left/right edges
+ * of the rounded rectangle. Andrea Cimitan */
+ /* const PangoFontDescription * font_description = pango_layout_get_font_description (layout);
+ font_size = pango_font_description_get_size (font_description); */
+
+ /* initialize cairo drawing area */
+ cr = (cairo_t*) gdk_cairo_create (widget->window);
+
+ /* set line width */
+ cairo_set_line_width (cr, 1.0);
+
+ cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
+
+ /* cairo drawing code */
+ custom_cairo_rounded_rectangle (cr, x - font_size/2.0, y, w + font_size, h);
+
+ cairo_set_source_rgba (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0,
+ style->fg[gtk_widget_get_state(widget)].green/65535.0,
+ style->fg[gtk_widget_get_state(widget)].blue/65535.0, 0.5);
+
+ cairo_move_to (cr, x, y);
+ pango_cairo_layout_path (cr, layout);
+ cairo_fill (cr);
+
+ /* remember to destroy cairo context to avoid leaks */
+ cairo_destroy (cr);
+
+ return TRUE;
+}
+
/* Builds a menu item representing a running application in the
messaging menu */
static gboolean
@@ -317,25 +431,17 @@ new_application_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbu
gtk_container_add(GTK_CONTAINER(gmi), hbox);
gtk_widget_show(hbox);
- /* Build up the running icon */
- GtkWidget * running_icon = gtk_image_new_from_icon_name("application-running", GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gmi), running_icon);
- gtk_widget_show(running_icon);
-
- /* Make sure it always appears */
- gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(gmi), TRUE);
-
/* Attach some of the standard GTK stuff */
dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
/* Make sure we can handle the label changing */
g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(application_prop_change_cb), label);
g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(application_icon_change_cb), icon);
+ g_signal_connect_after(G_OBJECT (gmi), "expose_event", G_CALLBACK (application_triangle_draw_cb), NULL);
return TRUE;
}
-
typedef struct _indicator_item_t indicator_item_t;
struct _indicator_item_t {
GtkWidget * icon;
@@ -405,6 +511,7 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new());
gint padding = 4;
+ gint font_size = RIGHT_LABEL_FONT_SIZE;
gtk_widget_style_get(GTK_WIDGET(gmi), "horizontal-padding", &padding, NULL);
GtkWidget * hbox = gtk_hbox_new(FALSE, 0);
@@ -455,8 +562,12 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
item. */
mi_data->right = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_RIGHT));
gtk_size_group_add_widget(indicator_right_group, mi_data->right);
+ /* install extra decoration overlay */
+ g_signal_connect (G_OBJECT (mi_data->right), "expose_event",
+ G_CALLBACK (numbers_draw_cb), NULL);
+
gtk_misc_set_alignment(GTK_MISC(mi_data->right), 1.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, padding);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, padding + font_size/2.0);
gtk_widget_show(mi_data->right);
gtk_container_add(GTK_CONTAINER(gmi), hbox);
@@ -494,4 +605,3 @@ get_menu (IndicatorObject * io)
return GTK_MENU(menu);
}
-
diff --git a/src/messages-service-server.h b/src/messages-service-server.h
index 5b862f6..51420b1 100644
--- a/src/messages-service-server.h
+++ b/src/messages-service-server.h
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
#define g_marshal_value_peek_object(v) g_value_get_object (v)
+#define g_marshal_value_peek_variant(v) g_value_get_variant (v)
#else /* !G_ENABLE_DEBUG */
/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
* Do not access GValues directly in your code. Instead, use the
@@ -50,14 +51,15 @@ G_BEGIN_DECLS
#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
+#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer
#endif /* !G_ENABLE_DEBUG */
-/* NONE:POINTER (/tmp/dbus-binding-tool-c-marshallers.CACX2U:1) */
+/* NONE:POINTER */
#define dbus_glib_marshal__messages_service_server_VOID__POINTER g_cclosure_marshal_VOID__POINTER
#define dbus_glib_marshal__messages_service_server_NONE__POINTER dbus_glib_marshal__messages_service_server_VOID__POINTER
-/* BOOLEAN:POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.CACX2U:2) */
+/* BOOLEAN:POINTER,POINTER */
extern void dbus_glib_marshal__messages_service_server_BOOLEAN__POINTER_POINTER (GClosure *closure,
GValue *return_value,
guint n_param_values,
diff --git a/src/messages-service.c b/src/messages-service.c
index 54b4055..0783d91 100644
--- a/src/messages-service.c
+++ b/src/messages-service.c
@@ -315,7 +315,7 @@ desktop_file_from_keyfile (const gchar * definition_file)
}
/* Add a definition file into the black list and eclipse
- and launchers that have the same file. */
+ any launchers that have the same file. */
static gboolean
blacklist_add (gpointer udata)
{
@@ -359,7 +359,7 @@ blacklist_add_core (gchar * desktop, gchar * definition)
}
/* Actually blacklist this thing */
- g_hash_table_insert(blacklist, desktop, definition);
+ g_hash_table_insert(blacklist, g_strdup(desktop), g_strdup(definition));
g_debug("Adding Blacklist item '%s' for desktop '%s'", definition, desktop);
/* Go through and eclipse folks */