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);
                }
            }
        }
    }
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
    }
}
Beispiel #6
0
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 (&current_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;
}