static GtkWidget * wnck_selector_item_new (WnckSelector *selector, const gchar *label, WnckWindow *window) { GtkWidget *item; GtkWidget *ellipsizing_label; window_hash_item *hash_item; static const GtkTargetEntry targets[] = { { "application/x-wnck-window-id", 0, 0 } }; item = gtk_image_menu_item_new (); gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); ellipsizing_label = gtk_label_new (label); gtk_misc_set_alignment (GTK_MISC (ellipsizing_label), 0.0, 0.5); gtk_label_set_ellipsize (GTK_LABEL (ellipsizing_label), PANGO_ELLIPSIZE_END); if (window != NULL) { /* if window demands attention, bold the label */ if (wnck_window_or_transient_needs_attention (window)) _make_gtk_label_bold (GTK_LABEL (ellipsizing_label)); hash_item = g_new0 (window_hash_item, 1); hash_item->item = item; hash_item->label = ellipsizing_label; g_hash_table_insert (selector->priv->window_hash, window, hash_item); } gtk_container_add (GTK_CONTAINER (item), ellipsizing_label); gtk_widget_show (ellipsizing_label); gtk_widget_set_size_request (ellipsizing_label, wnck_selector_get_width (GTK_WIDGET (selector), label), -1); if (window != NULL) { gtk_drag_source_set (item, GDK_BUTTON1_MASK, targets, 1, GDK_ACTION_MOVE); g_signal_connect_object (item, "drag_data_get", G_CALLBACK (wnck_selector_drag_data_get), G_OBJECT (window), 0); g_signal_connect_object (item, "drag_begin", G_CALLBACK (wnck_selector_drag_begin), G_OBJECT (window), 0); } return item; }
static void wnck_selector_window_state_changed (WnckWindow *window, WnckWindowState changed_mask, WnckWindowState new_state, WnckSelector *selector) { window_hash_item *item; char *window_name; if (! (changed_mask & (WNCK_WINDOW_STATE_MINIMIZED | WNCK_WINDOW_STATE_SHADED | WNCK_WINDOW_STATE_SKIP_TASKLIST | WNCK_WINDOW_STATE_DEMANDS_ATTENTION | WNCK_WINDOW_STATE_URGENT))) return; item = NULL; window_name = NULL; if (!selector->priv->window_hash) return; item = g_hash_table_lookup (selector->priv->window_hash, window); if (item == NULL) return; if (changed_mask & WNCK_WINDOW_STATE_SKIP_TASKLIST) { if (wnck_window_is_skip_tasklist (window)) gtk_widget_hide (item->item); else gtk_widget_show (item->item); wnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); } if (changed_mask & (WNCK_WINDOW_STATE_DEMANDS_ATTENTION | WNCK_WINDOW_STATE_URGENT)) { if (wnck_window_or_transient_needs_attention (window)) _make_gtk_label_bold (GTK_LABEL (item->label)); else _make_gtk_label_normal (GTK_LABEL (item->label)); } if (changed_mask & (WNCK_WINDOW_STATE_MINIMIZED | WNCK_WINDOW_STATE_SHADED)) { window_name = _wnck_window_get_name_for_display (window, FALSE, TRUE); gtk_label_set_text (GTK_LABEL (item->label), window_name); g_free (window_name); } }
static gboolean on_blink (TaskItem *item) { g_return_val_if_fail (TASK_IS_ITEM (item), FALSE); gtk_widget_queue_draw (GTK_WIDGET (item)); if (wnck_window_or_transient_needs_attention (item->priv->window)) { return TRUE; } else { item->priv->timer = 0; return FALSE; } }
task_item_expose_event (GtkWidget *widget, GdkEventExpose *event) #endif { #if !GTK_CHECK_VERSION (3, 0, 0) cairo_t *cr; #endif TaskItem *item; GdkRectangle area; TaskItemPrivate *priv; GdkPixbuf *desat; GdkPixbuf *pbuf; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (TASK_IS_ITEM (widget), FALSE); #if !GTK_CHECK_VERSION (3, 0, 0) g_return_val_if_fail (event != NULL, FALSE); #endif item = TASK_ITEM (widget); priv = item->priv; g_return_val_if_fail (WNCK_IS_WINDOW (priv->window), FALSE); area = priv->area; #if !GTK_CHECK_VERSION (3, 0, 0) cr = gdk_cairo_create (event->window); #endif pbuf = priv->pixbuf; desat = NULL; gint size = MIN (area.height, area.width); gboolean active = wnck_window_is_active (priv->window); gboolean attention = wnck_window_or_transient_needs_attention (priv->window); if (GDK_IS_PIXBUF (pbuf) && gdk_pixbuf_get_width (pbuf) != size && gdk_pixbuf_get_height (pbuf) != size) { g_object_unref (pbuf); pbuf = NULL; } if (active) { cairo_rectangle (cr, area.x + .5, area.y - 4, area.width - 1, area.height + 8); cairo_set_source_rgba (cr, .8, .8, .8, .2); cairo_fill_preserve (cr); cairo_set_line_width (cr, 1); cairo_set_source_rgba (cr, .8, .8, .8, .4); cairo_stroke (cr); } if (!pbuf) { pbuf = priv->pixbuf = task_item_sized_pixbuf_for_window (item, priv->window, size); } if (active || priv->mouse_over || attention) { gdk_cairo_set_source_pixbuf (cr, pbuf, (area.x + (area.width - gdk_pixbuf_get_width (pbuf)) / 2), (area.y + (area.height - gdk_pixbuf_get_height (pbuf)) / 2)); } else { desat = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, gdk_pixbuf_get_bits_per_sample (pbuf), gdk_pixbuf_get_width (pbuf), gdk_pixbuf_get_height (pbuf)); if (desat) { gdk_pixbuf_saturate_and_pixelate (pbuf, desat, 0, FALSE); } else /* just paint the colored version as a fallback */ { desat = pbuf; } gdk_cairo_set_source_pixbuf (cr, desat, (area.x + (area.width - gdk_pixbuf_get_width (desat)) / 2), (area.y + (area.height - gdk_pixbuf_get_height (desat)) / 2)); } if (!priv->mouse_over && attention) /* urgent */ { GTimeVal current_time; g_get_current_time (¤t_time); gdouble ms = (current_time.tv_sec - priv->urgent_time.tv_sec) * 1000 + (current_time.tv_usec - priv->urgent_time.tv_usec) / 1000; gdouble alpha = .66 + (cos (3.15 * ms / 600) / 3); cairo_paint_with_alpha (cr, alpha); } else if (priv->mouse_over || active) /* focused */ { cairo_paint (cr); } else /* not focused */ { cairo_paint_with_alpha (cr, .65); } if (GDK_IS_PIXBUF (desat)) g_object_unref (desat); #if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy (cr); #endif return FALSE; }