summaryrefslogtreecommitdiff
path: root/stickynotes
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2018-04-30 22:02:05 -0400
committerraveit65 <[email protected]>2018-05-12 22:34:25 +0200
commit311ae4eb6690a2d089014622bd340aa79a33409c (patch)
tree266333cffb7425143f620e87cb2a26854d41653a /stickynotes
parente83811d07c2b598ebe46f9e54cb9dbcc1ea87f18 (diff)
downloadmate-applets-311ae4eb6690a2d089014622bd340aa79a33409c.tar.bz2
mate-applets-311ae4eb6690a2d089014622bd340aa79a33409c.tar.xz
Convert applet icons from pixbuf to surfaces
This improves support for HiDPI by loading properly scaled surfaces for applets.
Diffstat (limited to 'stickynotes')
-rw-r--r--stickynotes/stickynotes_applet.c81
-rw-r--r--stickynotes/stickynotes_applet.h6
2 files changed, 47 insertions, 40 deletions
diff --git a/stickynotes/stickynotes_applet.c b/stickynotes/stickynotes_applet.c
index c7c88ac2..aff61b55 100644
--- a/stickynotes/stickynotes_applet.c
+++ b/stickynotes/stickynotes_applet.c
@@ -83,9 +83,9 @@ static gboolean stickynotes_applet_factory(MatePanelApplet *mate_panel_applet, c
MATE_PANEL_APPLET_OUT_PROCESS_FACTORY("StickyNotesAppletFactory", PANEL_TYPE_APPLET, "stickynotes_applet",
stickynotes_applet_factory, NULL)
-/* colorshift a pixbuf */
+/* colorshift a surface */
static void
-stickynotes_make_prelight_icon (GdkPixbuf *dest, GdkPixbuf *src, int shift)
+stickynotes_make_prelight_icon (cairo_surface_t *dest, cairo_surface_t *src, int shift)
{
gint i, j;
gint width, height, has_alpha, srcrowstride, destrowstride;
@@ -96,13 +96,13 @@ stickynotes_make_prelight_icon (GdkPixbuf *dest, GdkPixbuf *src, int shift)
int val;
guchar r,g,b;
- has_alpha = gdk_pixbuf_get_has_alpha (src);
- width = gdk_pixbuf_get_width (src);
- height = gdk_pixbuf_get_height (src);
- srcrowstride = gdk_pixbuf_get_rowstride (src);
- destrowstride = gdk_pixbuf_get_rowstride (dest);
- target_pixels = gdk_pixbuf_get_pixels (dest);
- original_pixels = gdk_pixbuf_get_pixels (src);
+ has_alpha = cairo_surface_get_content (src) != CAIRO_CONTENT_COLOR;
+ width = cairo_image_surface_get_width (src);
+ height = cairo_image_surface_get_height (src);
+ srcrowstride = cairo_image_surface_get_stride (src);
+ destrowstride = cairo_image_surface_get_stride (dest);
+ original_pixels = cairo_image_surface_get_data (src);
+ target_pixels = cairo_image_surface_get_data (dest);
for (i = 0; i < height; i++) {
pixdest = target_pixels + i*destrowstride;
@@ -155,30 +155,37 @@ stickynotes_destroy (GtkWidget *widget,
void
stickynotes_applet_init (MatePanelApplet *mate_panel_applet)
{
+ cairo_t *cr;
+ gint size, scale;
+
stickynotes = g_new(StickyNotes, 1);
stickynotes->notes = NULL;
stickynotes->applets = NULL;
stickynotes->last_timeout_data = 0;
- g_set_application_name (_("Sticky Notes"));
+ size = mate_panel_applet_get_size (mate_panel_applet);
+ scale = gtk_widget_get_scale_factor (GTK_WIDGET (mate_panel_applet));
+ g_set_application_name (_("Sticky Notes"));
gtk_window_set_default_icon_name ("mate-sticky-notes-applet");
- stickynotes->icon_normal = gtk_icon_theme_load_icon (
+ stickynotes->icon_normal = gtk_icon_theme_load_surface (
gtk_icon_theme_get_default (),
"mate-sticky-notes-applet",
- 48, 0, NULL);
-
- stickynotes->icon_prelight = gdk_pixbuf_new (
- gdk_pixbuf_get_colorspace (stickynotes->icon_normal),
- gdk_pixbuf_get_has_alpha (stickynotes->icon_normal),
- gdk_pixbuf_get_bits_per_sample (
- stickynotes->icon_normal),
- gdk_pixbuf_get_width (stickynotes->icon_normal),
- gdk_pixbuf_get_height (stickynotes->icon_normal));
- stickynotes_make_prelight_icon (stickynotes->icon_prelight,
- stickynotes->icon_normal, 30);
+ size, scale, NULL, 0, NULL);
+
+ stickynotes->icon_prelight = cairo_surface_create_similar (stickynotes->icon_normal,
+ cairo_surface_get_content (stickynotes->icon_normal),
+ cairo_image_surface_get_width (stickynotes->icon_normal),
+ cairo_image_surface_get_height (stickynotes->icon_normal));
+
+ stickynotes_make_prelight_icon (stickynotes->icon_prelight, stickynotes->icon_normal, 30);
+
+ cr = cairo_create (stickynotes->icon_prelight);
+ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
+ cairo_mask_surface (cr, stickynotes->icon_normal, 0, 0);
+
stickynotes->settings = g_settings_new (STICKYNOTES_SCHEMA);
stickynotes->visible = TRUE;
@@ -343,7 +350,6 @@ stickynotes_applet_new(MatePanelApplet *mate_panel_applet)
applet->w_image = gtk_image_new();
applet->destroy_all_dialog = NULL;
applet->prelighted = FALSE;
- applet->pressed = FALSE;
applet->menu_tip = NULL;
@@ -413,29 +419,32 @@ stickynotes_applet_new(MatePanelApplet *mate_panel_applet)
void stickynotes_applet_update_icon(StickyNotesApplet *applet)
{
- GdkPixbuf *pixbuf1, *pixbuf2;
+ cairo_t *cr;
+ cairo_surface_t *surface;
gint size = applet->panel_size;
- if (size > 3)
- size = size -3;
+ if (size > 3)
+ size = size - 3;
/* Choose appropriate icon and size it */
if (applet->prelighted)
- pixbuf1 = gdk_pixbuf_scale_simple(stickynotes->icon_prelight, size, size, GDK_INTERP_BILINEAR);
+ surface = cairo_surface_create_similar (stickynotes->icon_prelight,
+ cairo_surface_get_content (stickynotes->icon_prelight),
+ size, size);
else
- pixbuf1 = gdk_pixbuf_scale_simple(stickynotes->icon_normal, size, size, GDK_INTERP_BILINEAR);
+ surface = cairo_surface_create_similar (stickynotes->icon_normal,
+ cairo_surface_get_content (stickynotes->icon_normal),
+ size, size);
- /* Shift the icon if pressed */
- pixbuf2 = gdk_pixbuf_copy(pixbuf1);
- if (applet->pressed)
- gdk_pixbuf_scale(pixbuf1, pixbuf2, 0, 0, size, size, 1, 1, 1, 1, GDK_INTERP_BILINEAR);
+ cr = cairo_create (surface);
+ cairo_set_source_surface (cr, applet->prelighted ? stickynotes->icon_prelight : stickynotes->icon_normal, 0, 0);
+ cairo_paint (cr);
- /* Apply the finished pixbuf to the applet image */
- gtk_image_set_from_pixbuf(GTK_IMAGE(applet->w_image), pixbuf2);
+ /* Apply the finished surface to the applet image */
+ gtk_image_set_from_surface(GTK_IMAGE(applet->w_image), surface);
- g_object_unref(pixbuf1);
- g_object_unref(pixbuf2);
+ cairo_surface_destroy(surface);
}
void
diff --git a/stickynotes/stickynotes_applet.h b/stickynotes/stickynotes_applet.h
index 6a1663d0..18364655 100644
--- a/stickynotes/stickynotes_applet.h
+++ b/stickynotes/stickynotes_applet.h
@@ -22,7 +22,6 @@
#include <glib/gi18n.h>
#include <gdk/gdk.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
#include <mate-panel-applet.h>
@@ -57,8 +56,8 @@ typedef struct
GList *notes; /* Linked-List of all the sticky notes */
GList *applets; /* Linked-List of all the applets */
- GdkPixbuf *icon_normal; /* Normal applet icon */
- GdkPixbuf *icon_prelight; /* Prelighted applet icon */
+ cairo_surface_t *icon_normal; /* Normal applet icon */
+ cairo_surface_t *icon_prelight; /* Prelighted applet icon */
GSettings *settings; /* Shared GSettings */
@@ -77,7 +76,6 @@ typedef struct
GtkWidget *destroy_all_dialog; /* The applet it's destroy all dialog */
gboolean prelighted; /* Whether applet is prelighted */
- gboolean pressed; /* Whether applet is pressed */
gint panel_size;
MatePanelAppletOrient panel_orient;