static void on_icon_changed(WnckWindow *controlwindow, WindowckPlugin *wckp) { GdkPixbuf *pixbuf = NULL; GdkPixbuf *grayscale = NULL; if (!controlwindow) { xfce_panel_image_clear(XFCE_PANEL_IMAGE (wckp->icon->symbol)); } else if (wckp->prefs->show_on_desktop) { gtk_widget_set_sensitive (wckp->icon->symbol, TRUE); if (wnck_window_get_window_type (controlwindow) == WNCK_WINDOW_DESKTOP) { if (!wnck_window_is_active(controlwindow)) gtk_widget_set_sensitive (wckp->icon->symbol, FALSE); xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (wckp->icon->symbol),GTK_STOCK_HOME); } } if (controlwindow && wnck_window_get_window_type (controlwindow) != WNCK_WINDOW_DESKTOP) { /* This only returns a pointer - it SHOULDN'T be unrefed! */ if (XFCE_PANEL_IS_SMALL) pixbuf = wnck_window_get_mini_icon(controlwindow); else pixbuf = wnck_window_get_icon(controlwindow); /* leave when there is no valid pixbuf */ if (G_UNLIKELY (pixbuf == NULL)) { xfce_panel_image_clear (XFCE_PANEL_IMAGE (wckp->icon->symbol)); return; } if (!wnck_window_is_active(controlwindow)) { /* icon color is set to grayscale */ grayscale = gdk_pixbuf_copy(pixbuf); gdk_pixbuf_saturate_and_pixelate(grayscale, grayscale, 0, FALSE); if (G_UNLIKELY (grayscale != NULL)) pixbuf = grayscale; } xfce_panel_image_set_from_pixbuf(XFCE_PANEL_IMAGE (wckp->icon->symbol), pixbuf); } if (grayscale != NULL && grayscale != pixbuf) g_object_unref (G_OBJECT (grayscale)); }
void on_wck_state_changed (WnckWindow *controlwindow, gpointer data) { WindowckPlugin *wckp = data; on_name_changed (controlwindow, wckp); if (wckp->prefs->show_window_menu) { if (wckp->prefs->show_app_icon) { on_icon_changed (wckp->win->controlwindow, wckp); } else { GdkColor color; if (controlwindow && ((wnck_window_get_window_type (controlwindow) != WNCK_WINDOW_DESKTOP) || wckp->prefs->show_on_desktop)) { if (wnck_window_is_active(controlwindow) && gdk_color_parse (wckp->prefs->active_text_color, &color)) { gtk_widget_modify_fg (wckp->icon->symbol, GTK_STATE_NORMAL, &color); } else if (gdk_color_parse (wckp->prefs->inactive_text_color, &color)) { gtk_widget_modify_fg (wckp->icon->symbol, GTK_STATE_NORMAL, &color); } } } } }
static gboolean on_task_item_button_released (GtkWidget *widget, GdkEventButton *event, TaskItem *item) { WnckWindow *window; WnckScreen *screen; WnckWorkspace *workspace; TaskItemPrivate *priv; g_return_val_if_fail (TASK_IS_ITEM (item), TRUE); priv = item->priv; window = priv->window; g_return_val_if_fail (WNCK_IS_WINDOW (window), TRUE); screen = priv->screen; workspace = wnck_window_get_workspace (window); if (event->button == 1) { if (WNCK_IS_WORKSPACE (workspace) && workspace != wnck_screen_get_active_workspace (screen)) { wnck_workspace_activate (workspace, GDK_CURRENT_TIME); } if (wnck_window_is_active (window)) { wnck_window_minimize (window); } else { wnck_window_activate (window, GDK_CURRENT_TIME); } } return TRUE; }
static gboolean wnck_selector_scroll_event (GtkWidget *widget, GdkEventScroll *event) { WnckSelector *selector; WnckScreen *screen; WnckWorkspace *workspace; GList *windows_list; GList *l; WnckWindow *window; WnckWindow *previous_window; gboolean should_activate_next_window; selector = WNCK_SELECTOR (widget); screen = wnck_selector_get_screen (selector); workspace = wnck_screen_get_active_workspace (screen); windows_list = wnck_screen_get_windows (screen); windows_list = g_list_sort (windows_list, wnck_selector_windows_compare); /* Walk through the list of windows until we find the active one * (considering only those windows on the same workspace). * Then, depending on whether we're scrolling up or down, activate the next * window in the list (if it exists), or the previous one. */ previous_window = NULL; should_activate_next_window = FALSE; for (l = windows_list; l; l = l->next) { window = WNCK_WINDOW (l->data); if (wnck_window_is_skip_tasklist (window)) continue; if (workspace && !wnck_window_is_pinned (window) && wnck_window_get_workspace (window) != workspace) continue; if (should_activate_next_window) { wnck_window_activate_transient (window, event->time); return TRUE; } if (wnck_window_is_active (window)) { switch (event->direction) { case GDK_SCROLL_UP: if (previous_window != NULL) { wnck_window_activate_transient (previous_window, event->time); return TRUE; } break; case GDK_SCROLL_DOWN: should_activate_next_window = TRUE; break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: /* We ignore LEFT and RIGHT scroll events. */ break; case GDK_SCROLL_SMOOTH: break; default: g_assert_not_reached (); } } previous_window = window; } return TRUE; }
/* Warning! This function is called very often, so it should only do the most necessary things! */ static void on_name_changed (WnckWindow *controlwindow, WindowckPlugin *wckp) { gint i, n; const gchar *title_text; if (controlwindow && ((wnck_window_get_window_type (controlwindow) != WNCK_WINDOW_DESKTOP) || wckp->prefs->show_on_desktop)) { const gchar *title_color, *title_font, *subtitle_font; gchar **part, *title_markup; title_text = wnck_window_get_name(controlwindow); if (wnck_window_is_active(controlwindow)) { /* window focused */ //~ gtk_widget_set_sensitive(GTK_WIDGET(wckp->title), TRUE); title_color = wckp->prefs->active_text_color; } else { /* window unfocused */ //~ gtk_widget_set_sensitive(GTK_WIDGET(wckp->title), FALSE); title_color = wckp->prefs->inactive_text_color; } title_font = wckp->prefs->title_font; subtitle_font = wckp->prefs->subtitle_font; /* Set tooltips */ if (wckp->prefs->show_tooltips) { gtk_widget_set_tooltip_text(GTK_WIDGET(wckp->title), title_text); } /* get application and instance names */ if (wckp->prefs->full_name && !wckp->prefs->two_lines) { title_markup = g_markup_printf_escaped("<span font=\"%s\" color=\"%s\">%s</span>", title_font, title_color, title_text); } else { /* split title text */ part = g_strsplit (title_text, " - ", 0); n=0; for (i=0; part[i]; i++) n++; if (n > 1) { if (wckp->prefs->two_lines) { gchar *subtitle = malloc( sizeof(gchar) * ( strlen(title_text) + 1 ) ); strcpy (subtitle, part[0]); if (wckp->prefs->full_name) { for (i=1; i < n - 1; i++) { strcat (subtitle, " - "); strcat (subtitle, part[i]); } } title_markup = g_markup_printf_escaped("<span font=\"%s\" color=\"%s\">%s</span><span font=\"%s\" color=\"%s\">\n%s</span>", title_font, title_color, part[n-1], subtitle_font, title_color, subtitle); free (subtitle); } else { title_markup = g_markup_printf_escaped("<span font=\"%s\" color=\"%s\">%s</span>", title_font, title_color, part[n-1]); } } else { title_markup = g_markup_printf_escaped("<span font=\"%s\" color=\"%s\">%s</span>", title_font, title_color, part[0]); } g_strfreev(part); } gtk_label_set_markup(wckp->title, title_markup); if (wckp->prefs->title_alignment == LEFT) { gtk_label_set_justify(wckp->title, GTK_JUSTIFY_LEFT); } else if (wckp->prefs->title_alignment == CENTER) { gtk_label_set_justify(wckp->title, GTK_JUSTIFY_CENTER); } else if (wckp->prefs->title_alignment == RIGHT) { gtk_label_set_justify(wckp->title, GTK_JUSTIFY_RIGHT); } g_free (title_markup); } else { /* hide text */ title_text = ""; gtk_label_set_text(wckp->title, title_text); } }
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; }