summaryrefslogtreecommitdiff
path: root/libmdock/mdock-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmdock/mdock-item.c')
-rw-r--r--libmdock/mdock-item.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/libmdock/mdock-item.c b/libmdock/mdock-item.c
index 2dd1611..aa3045f 100644
--- a/libmdock/mdock-item.c
+++ b/libmdock/mdock-item.c
@@ -17,6 +17,7 @@
* along with MDock. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <math.h>
#include "mdock-item.h"
#define MDOCK_ITEM_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), MDOCK_TYPE_ITEM, MDockItemPrivate))
@@ -98,16 +99,15 @@ static void mdock_item_realize(GtkWidget *widget)
widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask);
+ gdk_window_set_back_pixmap(widget->window, NULL, TRUE);
gdk_window_set_user_data(widget->window, widget);
gtk_widget_set_realized(widget, TRUE);
widget->style = gtk_style_attach(widget->style, widget->window);
- gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
}
static void mdock_item_size_request(GtkWidget *widget, GtkRequisition *requisition)
{
- MDockItem *self = MDOCK_ITEM(widget);
requisition->width = requisition->height = REQUISITION_ICON_SIZE;
}
@@ -115,8 +115,8 @@ static void mdock_item_size_allocate(GtkWidget *widget, GtkAllocation *allocatio
{
MDockItem *self = MDOCK_ITEM(widget);
self->priv->icon_size = MIN(allocation->width, allocation->height);
- mdock_item_update_icon(self);
GTK_WIDGET_CLASS(mdock_item_parent_class)->size_allocate(widget, allocation);
+ mdock_item_update_icon(self);
}
static gboolean mdock_item_expose(GtkWidget *widget, GdkEventExpose *event)
@@ -125,8 +125,19 @@ static gboolean mdock_item_expose(GtkWidget *widget, GdkEventExpose *event)
cairo_t *cr = gdk_cairo_create(widget->window);
if (self->priv->icon) {
+ cairo_save(cr);
gdk_cairo_set_source_pixbuf(cr, self->priv->icon, 0, 0);
cairo_paint(cr);
+ cairo_restore(cr);
+ }
+ if (self->priv->windows) {
+ double circle_radius = self->priv->icon_size / 8.0;
+ cairo_save(cr);
+ cairo_set_source_rgba(cr, 0.0, 0.0, 0.2, 0.6);
+ cairo_translate(cr, self->priv->icon_size / 2.0, self->priv->icon_size - circle_radius / 2.0);
+ cairo_arc(cr, 0, 0, circle_radius, 0, 2 * M_PI);
+ cairo_fill(cr);
+ cairo_restore(cr);
}
cairo_destroy(cr);
@@ -198,7 +209,7 @@ static void mdock_item_init(MDockItem *self)
{
self->priv = MDOCK_ITEM_GET_PRIVATE (self);
self->priv->pinned = FALSE;
- self->priv->icon_size = 48;
+ self->priv->icon_size = REQUISITION_ICON_SIZE;
gtk_widget_add_events(GTK_WIDGET(self),
GDK_BUTTON_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
@@ -341,6 +352,11 @@ GdkPixbuf *mdock_item_get_icon_pixbuf(MDockItem *self)
void mdock_item_add_window(MDockItem *self, WnckWindow *window)
{
+ if (!self->priv->windows) {
+ // If there were no windows before adding this one,
+ // we want to redraw in order to get the "active" indicator.
+ gtk_widget_queue_draw(GTK_WIDGET(self));
+ }
self->priv->windows = g_list_append(self->priv->windows, window);
if (!self->priv->icon) {
mdock_item_update_icon(self);
@@ -354,6 +370,11 @@ void mdock_item_remove_window(MDockItem *self, WnckWindow *window)
if (self->priv->last_active == window) {
self->priv->last_active = NULL;
}
+ if (self->priv->windows) {
+ // If there are no windows left,
+ // we want to redraw in order to remove the "active" indicator.
+ gtk_widget_queue_draw(GTK_WIDGET(self));
+ }
g_object_notify_by_pspec(G_OBJECT(self), obj_properties[PROP_N_WINDOWS]);
}