Ejemplo n.º 1
0
static gboolean
_button_clicked_event (CairoMainIcon *icon, GdkEventButton *event, gpointer null)
{
  g_return_val_if_fail (AWN_IS_CAIRO_MAIN_ICON(icon), FALSE);
  CairoMainIconPrivate * priv = GET_PRIVATE (icon);

  if (event->button == 1)
  {
    awn_icon_popup_gtk_menu (AWN_ICON (icon), priv->menu, event->button, event->time);

    if (!priv->autohide_cookie)
    {
      priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(priv->applet),"CairoMenu" );
    }
    g_object_set(awn_overlayable_get_effects (AWN_OVERLAYABLE(icon)), "depressed", FALSE,NULL);
  }
  else if (event->button == 3)
  {
    GtkWidget * item;

    if (!priv->context_menu)
    {
      priv->context_menu = awn_applet_create_default_menu (AWN_APPLET(priv->applet));
      gtk_menu_set_screen(GTK_MENU(priv->context_menu), NULL);
      item = awn_themed_icon_create_remove_custom_icon_item (AWN_THEMED_ICON(icon),NULL);
      gtk_menu_shell_append (GTK_MENU_SHELL(priv->context_menu), item);
/*      item = gtk_image_menu_item_new_with_label("Applet Preferences");
      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(item),
                                     gtk_image_new_from_stock (GTK_STOCK_PREFERENCES,GTK_ICON_SIZE_MENU));
      gtk_widget_show(item);
      gtk_menu_shell_append(GTK_MENU_SHELL(priv->context_menu), item);
       */
//      g_signal_connect(G_OBJECT(item), "button-press-event", G_CALLBACK(_show_prefs), NULL);
      item=awn_applet_create_about_item_simple(AWN_APPLET(priv->applet),
                                               "Copyright 2007,2008, 2009 Rodney Cryderman <*****@*****.**>",
                                               AWN_APPLET_LICENSE_GPLV2,
                                               VERSION);
      gtk_menu_shell_append(GTK_MENU_SHELL(priv->context_menu), item);
      g_signal_connect(G_OBJECT(priv->context_menu), "deactivate", G_CALLBACK(_deactivate_event), icon);
    }
    if (!priv->autohide_cookie)
    {
      priv->autohide_cookie = awn_applet_inhibit_autohide (AWN_APPLET(priv->applet),"CairoMenu" );
    }
    awn_icon_popup_gtk_menu (AWN_ICON (icon), priv->context_menu, event->button, event->time);
    g_object_set(awn_overlayable_get_effects (AWN_OVERLAYABLE(icon)), "depressed", FALSE,NULL);
    awn_utils_show_menu_images (GTK_MENU (priv->context_menu));
  }
  else
  {
    return TRUE;
  }

  awn_icon_set_is_active (AWN_ICON(icon), TRUE);
  return TRUE;
}
static gboolean
on_click (GtkWidget *widget, GdkEventButton *event, AwnIconBox *box)
{
  AwnEffects *fx = awn_overlayable_get_effects (AWN_OVERLAYABLE (widget));
  switch (event->button) {
    /* left click > test progress pie */
    case 1: {
      float progress;
      g_object_get (fx, "progress", &progress, NULL);
      if (progress < 1.0) progress += 0.1; else progress = 0.0;
      if (progress > 1.0) progress = 1.0;
      g_object_set (fx, "progress", progress, NULL);
      break;
    }
    /* middle click > destroy AwnIcon */
    case 2:
      gtk_container_remove(GTK_CONTAINER(box), widget);
      break;
    /* right click > change position */
    case 3:
      position++;
      if (position > GTK_POS_BOTTOM) position = GTK_POS_LEFT;
      awn_icon_box_set_pos_type (box, position);
      break;
  }
  return TRUE;
}
static GtkWidget *
pixbuf_icon (GtkWidget *parent)
{
  GdkPixbuf *pixbuf;
  GtkWidget *icon;

  pixbuf = gdk_pixbuf_new_from_file_at_size (PICTURE_FILE, 50, 50, NULL);

  icon = awn_icon_new ();
  awn_icon_set_from_pixbuf (AWN_ICON (icon), pixbuf);
  awn_icon_set_tooltip_text (AWN_ICON (icon), "Pixbuf Icon");

  /* test the signals */
  AwnEffects *fx = awn_overlayable_get_effects (AWN_OVERLAYABLE (icon));
  g_signal_connect(fx, "animation-start", (GCallback)anim_started, NULL);
  g_signal_connect(fx, "animation-end", (GCallback)anim_ended, NULL);

  gtk_container_add (GTK_CONTAINER (parent), icon);
  gtk_widget_show (icon);

  g_signal_connect (icon, "button-release-event", 
                    G_CALLBACK (on_click), parent); 
  g_object_unref (pixbuf);
  return icon;
}
static AwnEffects*
awn_applet_simple_get_effects (AwnOverlayable *simple)
{
  AwnAppletSimplePrivate *priv = AWN_APPLET_SIMPLE_GET_PRIVATE (simple);

  if (AWN_IS_ICON (priv->icon))
    return awn_overlayable_get_effects (AWN_OVERLAYABLE (priv->icon));

  return NULL;
}
static gboolean
on_signal_click(GtkWidget *widget, gpointer user_data)
{
  AwnIcon *icon = AWN_ICON(icons[0]);

  AwnEffects *fx = awn_overlayable_get_effects (AWN_OVERLAYABLE (icon));
  awn_effects_start_ex(fx, AWN_EFFECT_OPENING, 1, TRUE, TRUE);

  g_object_set(fx, "arrow-png", "/usr/share/gimp/2.0/themes/Default/images/preferences/folders-gradients-22.png", NULL);

  return FALSE;
}
static gboolean
awn_throbber_timeout (gpointer user_data)
{
    AwnThrobberPrivate *priv = AWN_THROBBER_GET_PRIVATE (user_data);

    priv->counter = (priv->counter - 1) % 8 + 8;

    AwnOverlayable *overlayable = AWN_OVERLAYABLE (user_data);
    awn_effects_redraw (awn_overlayable_get_effects (overlayable));

    return TRUE;
}
void
awn_throbber_set_type (AwnThrobber *throbber, AwnThrobberType type)
{
    g_return_if_fail (AWN_IS_THROBBER (throbber));
    gboolean needs_redraw = FALSE;

    AwnThrobberPrivate *priv = throbber->priv;

    if (type != priv->type) needs_redraw = TRUE;

    priv->type = type;
    switch (type)
    {
    case AWN_THROBBER_TYPE_NORMAL:
        if (!priv->timer_id && gtk_widget_get_mapped (GTK_WIDGET (throbber)))
        {
            // we want lower prio than HIGH_IDLE
            priv->timer_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
                                                 100, awn_throbber_timeout,
                                                 throbber, NULL);
        }
        break;
    case AWN_THROBBER_TYPE_CLOSE_BUTTON:
        g_object_set (awn_overlayable_get_effects (AWN_OVERLAYABLE (throbber)),
                      "make-shadow", TRUE, NULL);
    // no break;
    default:
        if (priv->timer_id)
        {
            g_source_remove (priv->timer_id);
            priv->timer_id = 0;
        }
        break;
    }

    if (needs_redraw)
    {
        gtk_widget_queue_draw (GTK_WIDGET (throbber));
    }
}
static void
awn_throbber_init (AwnThrobber *throbber)
{
    AwnThrobberPrivate *priv;

    priv = throbber->priv = AWN_THROBBER_GET_PRIVATE (throbber);

    priv->size = 50;
    priv->counter = 0;
    priv->type = AWN_THROBBER_TYPE_NORMAL;

    g_object_set (awn_overlayable_get_effects (AWN_OVERLAYABLE (throbber)),
                  "effects", 0,
                  "reflection-visible", FALSE,
                  NULL);

    gtk_widget_add_events (GTK_WIDGET (throbber), GDK_ALL_EVENTS_MASK);

    g_signal_connect (throbber, "show",
                      G_CALLBACK (awn_throbber_show), NULL);
    g_signal_connect (throbber, "hide",
                      G_CALLBACK (awn_throbber_hide), NULL);
}
static gboolean
awn_throbber_expose_event (GtkWidget *widget, GdkEventExpose *event)
{
    AwnThrobberPrivate *priv = AWN_THROBBER (widget)->priv;
    cairo_t *cr;
    gint w, h;
    GtkPositionType pos_type;

    /* clip the drawing region, nvidia likes it */
    AwnEffects *fx = awn_overlayable_get_effects (AWN_OVERLAYABLE (widget));
    cr = awn_effects_cairo_create_clipped (fx, event);

    cairo_set_operator(cr, CAIRO_OPERATOR_OVER);

    // we'll paint to [0,0] - [1,1], so scale's needed
    g_object_get (G_OBJECT (widget), "icon-width", &w, "icon-height", &h, NULL);
    cairo_scale (cr, w, h);

    switch (priv->type)
    {
    case AWN_THROBBER_TYPE_NORMAL:
    {
        const gdouble RADIUS = 0.0625;
        const gdouble DIST = 0.3;
        const gdouble OTHER = DIST * 0.707106781; /* sqrt(2)/2 */
        const gint COUNT = 8;
        const gint counter = priv->counter;

        cairo_set_line_width (cr, 1. / priv->size);
        cairo_translate (cr, 0.5, 0.5);
        cairo_scale (cr, 1, -1);

#define PAINT_CIRCLE(cr, x, y, cnt) \
    awn_cairo_set_source_color_with_alpha_multiplier (cr, \
        priv->fill_color, ((counter+cnt) % COUNT) / (float)COUNT); \
    cairo_arc (cr, x, y, RADIUS, 0, 2*M_PI); \
    cairo_fill_preserve (cr); \
    awn_cairo_set_source_color_with_alpha_multiplier (cr, \
        priv->outline_color, ((counter+cnt) % COUNT) / (float)COUNT); \
    cairo_stroke (cr);

        PAINT_CIRCLE (cr, 0, DIST, 0);
        PAINT_CIRCLE (cr, OTHER, OTHER, 1);
        PAINT_CIRCLE (cr, DIST, 0, 2);
        PAINT_CIRCLE (cr, OTHER, -OTHER, 3);
        PAINT_CIRCLE (cr, 0, -DIST, 4);
        PAINT_CIRCLE (cr, -OTHER, -OTHER, 5);
        PAINT_CIRCLE (cr, -DIST, 0, 6);
        PAINT_CIRCLE (cr, -OTHER, OTHER, 7);

#undef PAINT_CIRCLE

        break;
    }
    case AWN_THROBBER_TYPE_SAD_FACE:
    {
        cairo_set_line_width (cr, 0.03);

        if (priv->fill_color == NULL)
        {
            GdkColor c;
            double r, g, b;

            c = gtk_widget_get_style (widget)->fg[GTK_STATE_NORMAL];
            r = c.red / 65535.0;
            g = c.green / 65535.0;
            b = c.blue / 65535.0;

            cairo_set_source_rgb (cr, r, g, b);
        }
        else
        {
            awn_cairo_set_source_color_with_alpha_multiplier (cr,
                    priv->fill_color,
                    0.75);
        }

        paint_sad_face (cr);

        break;
    }
    case AWN_THROBBER_TYPE_ARROW_1:
        cairo_rotate (cr, M_PI);
        cairo_translate (cr, -1.0, -1.0);
    // no break
    case AWN_THROBBER_TYPE_ARROW_2:
    {
        pos_type = awn_icon_get_pos_type (AWN_ICON (widget));

        if (pos_type == GTK_POS_LEFT || pos_type == GTK_POS_RIGHT)
        {
            cairo_rotate (cr, 0.5 * M_PI);
            cairo_translate (cr, 0.0, -1.0);
        }

        if (priv->outline_color)
        {
            cairo_set_line_width (cr, 3.5 / priv->size);
            awn_cairo_set_source_color (cr, priv->outline_color);

            cairo_move_to (cr, 0.125, 0.375);
            cairo_line_to (cr, 0.875, 0.5);
            cairo_line_to (cr, 0.125, 0.625);
            cairo_stroke (cr);
        }

        cairo_set_line_width (cr, 1.75 / priv->size);

        if (priv->fill_color == NULL)
        {
            GdkColor c = gtk_widget_get_style (widget)->fg[GTK_STATE_NORMAL];
            double r = c.red / 65535.0;
            double g = c.green / 65535.0;
            double b = c.blue / 65535.0;

            cairo_set_source_rgb (cr, r, g, b);
        }
        else
        {
            awn_cairo_set_source_color (cr, priv->fill_color);
        }

        cairo_move_to (cr, 0.125, 0.375);
        cairo_line_to (cr, 0.875, 0.5);
        cairo_line_to (cr, 0.125, 0.625);
        cairo_stroke (cr);

        break;
    }
    case AWN_THROBBER_TYPE_CLOSE_BUTTON:
    {
        cairo_set_line_width (cr, 1. / priv->size);

        cairo_pattern_t *pat = cairo_pattern_create_linear (0.0, 0.0, 0.5, 1.0);
        cairo_pattern_add_color_stop_rgb (pat, 0.0, 0.97254, 0.643137, 0.403921);
        //cairo_pattern_add_color_stop_rgb (pat, 0.0, 0.0, 0.0, 0.0); // test
        cairo_pattern_add_color_stop_rgb (pat, 0.7, 0.98823, 0.4, 0.0);
        cairo_pattern_add_color_stop_rgb (pat, 1.0, 0.98823, 0.4, 0.0);

        cairo_set_source (cr, pat);
        //cairo_arc (cr, 0.5, 0.5, 0.4, 0.0, 2 * M_PI);
        awn_cairo_rounded_rect (cr, 0.1, 0.1, 0.8, 0.8, 0.15, ROUND_ALL);
        cairo_fill_preserve (cr);

        cairo_pattern_destroy (pat);

        cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
        cairo_stroke (cr);

        cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
        cairo_set_line_width (cr, 2./priv->size);

        /*  \  starting with the upper point  */
        cairo_move_to (cr, 0.3, 0.25);
        cairo_line_to (cr, 0.7, 0.75);
        cairo_stroke (cr);
        /*  /  starting with the upper point  */
        cairo_move_to (cr, 0.7, 0.25);
        cairo_line_to (cr, 0.3, 0.75);
        cairo_stroke (cr);
        break;
    }
    default:
        break;
    }

    /* let effects know we're finished */
    awn_effects_cairo_destroy (fx);

    return TRUE;
}