[Xfce4-commits] [panel-plugins/xfce4-whiskermenu-plugin] 04/06: Use custom icon renderer.

noreply at xfce.org noreply at xfce.org
Tue Jan 14 11:43:57 CET 2020


This is an automated email from the git hooks/post-receive script.

g   o   t   t   c   o   d   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository panel-plugins/xfce4-whiskermenu-plugin.

commit 70fa034b5b920892f6fabf82a1f0333dd04c8ce4
Author: Graeme Gott <graeme at gottcode.org>
Date:   Mon Oct 16 08:18:22 2017 -0400

    Use custom icon renderer.
---
 panel-plugin/CMakeLists.txt         |   1 +
 panel-plugin/icon-renderer.cpp      | 271 ++++++++++++++++++++++++++++++++++++
 panel-plugin/icon-renderer.h        |  25 ++++
 panel-plugin/launcher-icon-view.cpp |   6 +-
 panel-plugin/launcher-tree-view.cpp |   7 +-
 panel-plugin/launcher.cpp           |   2 +-
 6 files changed, 305 insertions(+), 7 deletions(-)

diff --git a/panel-plugin/CMakeLists.txt b/panel-plugin/CMakeLists.txt
index 21fe169..14178f0 100644
--- a/panel-plugin/CMakeLists.txt
+++ b/panel-plugin/CMakeLists.txt
@@ -76,6 +76,7 @@ add_library(whiskermenu MODULE
 	configuration-dialog.cpp
 	element.cpp
 	favorites-page.cpp
+	icon-renderer.cpp
 	icon-size.cpp
 	launcher.cpp
 	launcher-icon-view.cpp
diff --git a/panel-plugin/icon-renderer.cpp b/panel-plugin/icon-renderer.cpp
new file mode 100644
index 0000000..7a0ad78
--- /dev/null
+++ b/panel-plugin/icon-renderer.cpp
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2020 Graeme Gott <graeme at gottcode.org>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "icon-renderer.h"
+
+#include <gio/gio.h>
+
+//-----------------------------------------------------------------------------
+
+struct _WhiskerMenuIconRenderer
+{
+	GtkCellRenderer parent;
+
+	gpointer launcher;
+	GIcon* gicon;
+	gint size;
+};
+
+#define WHISKERMENU_TYPE_ICON_RENDERER whiskermenu_icon_renderer_get_type()
+G_DECLARE_FINAL_TYPE(WhiskerMenuIconRenderer, whiskermenu_icon_renderer, WHISKERMENU, ICON_RENDERER, GtkCellRenderer)
+
+G_DEFINE_TYPE(WhiskerMenuIconRenderer, whiskermenu_icon_renderer, GTK_TYPE_CELL_RENDERER)
+
+enum
+{
+	PROP_0,
+	PROP_LAUNCHER,
+	PROP_GICON,
+	PROP_SIZE,
+};
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_get_size(GtkCellRenderer* renderer, GtkWidget* widget,
+		const GdkRectangle* cell_area, gint* x_offset, gint* y_offset, gint* width, gint* height)
+{
+	WhiskerMenuIconRenderer* icon_renderer = WHISKERMENU_ICON_RENDERER(renderer);
+
+	gint xpad, ypad;
+	gtk_cell_renderer_get_padding(renderer, &xpad, &ypad);
+	gint calc_width  = xpad * 2 + icon_renderer->size;
+	gint calc_height = ypad * 2 + icon_renderer->size;
+
+	if (cell_area)
+	{
+		gfloat xalign, yalign;
+		gtk_cell_renderer_get_alignment(renderer, &xalign, &yalign);
+		if (x_offset)
+		{
+			*x_offset = (((gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL) ? (1.0 - xalign) : xalign)
+					* (cell_area->width - calc_width));
+			*x_offset = MAX(*x_offset, 0);
+		}
+		if (y_offset)
+		{
+			*y_offset = (yalign * (cell_area->height - calc_height));
+			*y_offset = MAX(*y_offset, 0);
+		}
+	}
+	else
+	{
+		if (x_offset)
+		{
+			*x_offset = 0;
+		}
+		if (y_offset)
+		{
+			*y_offset = 0;
+		}
+	}
+
+	if (width)
+	{
+		*width = calc_width;
+	}
+	if (height)
+	{
+		*height = calc_height;
+	}
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_render(GtkCellRenderer* renderer, cairo_t* cr, GtkWidget* widget,
+		const GdkRectangle*, const GdkRectangle* cell_area, GtkCellRendererState)
+{
+	WhiskerMenuIconRenderer* icon_renderer = WHISKERMENU_ICON_RENDERER(renderer);
+
+	if (icon_renderer->gicon == NULL)
+	{
+		return;
+	}
+
+	GdkRectangle clip_area;
+	if (!gdk_cairo_get_clip_rectangle(cr, &clip_area))
+	{
+		return;
+	}
+
+	const gint scale = gtk_widget_get_scale_factor(widget);
+	GtkIconTheme* icon_theme = gtk_icon_theme_get_for_screen(gtk_widget_get_screen(widget));
+
+	GtkIconInfo* icon_info = gtk_icon_theme_lookup_by_gicon_for_scale(icon_theme,
+			icon_renderer->gicon,
+			icon_renderer->size,
+			scale,
+			GtkIconLookupFlags(GTK_ICON_LOOKUP_USE_BUILTIN | GTK_ICON_LOOKUP_FORCE_SIZE));
+
+	if (icon_info == NULL)
+	{
+		icon_info = gtk_icon_theme_lookup_icon_for_scale(icon_theme,
+				icon_renderer->launcher ? "application-x-executable" : "applications-other",
+				icon_renderer->size,
+				scale,
+				GtkIconLookupFlags(GTK_ICON_LOOKUP_USE_BUILTIN | GTK_ICON_LOOKUP_FORCE_SIZE));
+
+		if (icon_info == NULL)
+		{
+			return;
+		}
+	}
+
+	cairo_surface_t* surface = gtk_icon_info_load_surface(icon_info, gtk_widget_get_window(widget), NULL);
+	g_object_unref(icon_info);
+
+	GdkRectangle icon_area;
+	icon_area.width = cairo_image_surface_get_width(surface) / scale;
+	icon_area.height = cairo_image_surface_get_height(surface) / scale;
+	icon_area.x = cell_area->x + (cell_area->width - icon_area.width) / 2;
+	icon_area.y = cell_area->y + (cell_area->height - icon_area.height) / 2;
+
+	GdkRectangle draw_area;
+	if (gdk_rectangle_intersect(&clip_area, &icon_area, &draw_area))
+	{
+		cairo_set_source_surface(cr, surface, icon_area.x, icon_area.y);
+		cairo_rectangle(cr, draw_area.x, draw_area.y, draw_area.width, draw_area.height);
+		cairo_fill(cr);
+	}
+
+	cairo_surface_destroy(surface);
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
+{
+	WhiskerMenuIconRenderer* icon_renderer = WHISKERMENU_ICON_RENDERER(object);
+
+	switch(prop_id)
+	{
+	case PROP_LAUNCHER:
+		g_value_set_pointer(value, icon_renderer->launcher);
+		break;
+
+	case PROP_GICON:
+		g_value_set_object(value, icon_renderer->gicon);
+		break;
+
+	case PROP_SIZE:
+		g_value_set_int(value, icon_renderer->size);
+		break;
+
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
+{
+	WhiskerMenuIconRenderer* icon_renderer = WHISKERMENU_ICON_RENDERER(object);
+
+	switch(prop_id)
+	{
+	case PROP_LAUNCHER:
+		icon_renderer->launcher = g_value_get_pointer(value);
+		break;
+
+	case PROP_GICON:
+		if (icon_renderer->gicon != NULL)
+		{
+			g_object_unref(icon_renderer->gicon);
+		}
+		icon_renderer->gicon = static_cast<GIcon*>(g_value_dup_object(value));
+		break;
+
+	case PROP_SIZE:
+		icon_renderer->size = g_value_get_int(value);
+		break;
+
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_finalize(GObject* object)
+{
+	WhiskerMenuIconRenderer* icon_renderer = WHISKERMENU_ICON_RENDERER(object);
+
+	if (icon_renderer->gicon != NULL)
+	{
+		g_object_unref(icon_renderer->gicon);
+	}
+
+	G_OBJECT_CLASS(whiskermenu_icon_renderer_parent_class)->finalize(object);
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_class_init(WhiskerMenuIconRendererClass* klass)
+{
+	GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
+	gobject_class->finalize = whiskermenu_icon_renderer_finalize;
+	gobject_class->get_property = whiskermenu_icon_renderer_get_property;
+	gobject_class->set_property = whiskermenu_icon_renderer_set_property;
+
+	GtkCellRendererClass* renderer_class = GTK_CELL_RENDERER_CLASS(klass);
+	renderer_class->get_size = whiskermenu_icon_renderer_get_size;
+	renderer_class->render = whiskermenu_icon_renderer_render;
+
+	g_object_class_install_property(gobject_class,
+			PROP_LAUNCHER,
+			g_param_spec_pointer("launcher", "launcher", "launcher",
+					GParamFlags(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
+	g_object_class_install_property(gobject_class,
+			PROP_GICON,
+			g_param_spec_object("gicon", "gicon", "gicon",
+					G_TYPE_ICON,
+					GParamFlags(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+
+	g_object_class_install_property(gobject_class,
+			PROP_SIZE,
+			g_param_spec_int("size", "size", "size",
+					1, G_MAXINT, 48,
+					GParamFlags(G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+}
+
+//-----------------------------------------------------------------------------
+
+static void whiskermenu_icon_renderer_init(G_GNUC_UNUSED WhiskerMenuIconRenderer* icon_renderer)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+GtkCellRenderer* whiskermenu_icon_renderer_new()
+{
+	return static_cast<GtkCellRenderer*>(g_object_new(WHISKERMENU_TYPE_ICON_RENDERER, NULL));
+}
+
+//-----------------------------------------------------------------------------
diff --git a/panel-plugin/icon-renderer.h b/panel-plugin/icon-renderer.h
new file mode 100644
index 0000000..ec3e33c
--- /dev/null
+++ b/panel-plugin/icon-renderer.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 Graeme Gott <graeme at gottcode.org>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WHISKERMENU_ICON_RENDERER_H
+#define WHISKERMENU_ICON_RENDERER_H
+
+#include <gtk/gtk.h>
+
+GtkCellRenderer* whiskermenu_icon_renderer_new();
+
+#endif
diff --git a/panel-plugin/launcher-icon-view.cpp b/panel-plugin/launcher-icon-view.cpp
index 6a4675f..5896a1f 100644
--- a/panel-plugin/launcher-icon-view.cpp
+++ b/panel-plugin/launcher-icon-view.cpp
@@ -17,6 +17,7 @@
 
 #include "launcher-icon-view.h"
 
+#include "icon-renderer.h"
 #include "settings.h"
 #include "slot.h"
 
@@ -33,15 +34,14 @@ LauncherIconView::LauncherIconView() :
 	// Create the view
 	m_view = GTK_ICON_VIEW(gtk_icon_view_new());
 
-	m_icon_renderer = exo_cell_renderer_icon_new();
+	m_icon_renderer = whiskermenu_icon_renderer_new();
 	g_object_set(m_icon_renderer,
-			"follow-state", false,
 			"xalign", 0.5,
 			"yalign", 1.0,
 			NULL);
 	GtkCellLayout* cell_layout = GTK_CELL_LAYOUT(m_view);
 	gtk_cell_layout_pack_start(cell_layout, m_icon_renderer, false);
-	gtk_cell_layout_set_attributes(cell_layout, m_icon_renderer, "gicon", COLUMN_ICON, NULL);
+	gtk_cell_layout_set_attributes(cell_layout, m_icon_renderer, "gicon", COLUMN_ICON, "launcher", COLUMN_LAUNCHER, NULL);
 
 	gtk_icon_view_set_markup_column(m_view, COLUMN_TEXT);
 
diff --git a/panel-plugin/launcher-tree-view.cpp b/panel-plugin/launcher-tree-view.cpp
index b22dfff..c3fa2e7 100644
--- a/panel-plugin/launcher-tree-view.cpp
+++ b/panel-plugin/launcher-tree-view.cpp
@@ -18,6 +18,7 @@
 #include "launcher-tree-view.h"
 
 #include "category.h"
+#include "icon-renderer.h"
 #include "settings.h"
 #include "slot.h"
 
@@ -253,10 +254,10 @@ void LauncherTreeView::create_column()
 
 	if (m_icon_size > 1)
 	{
-		GtkCellRenderer* icon_renderer = exo_cell_renderer_icon_new();
-		g_object_set(icon_renderer, "follow-state", false, "size", m_icon_size, NULL);
+		GtkCellRenderer* icon_renderer = whiskermenu_icon_renderer_new();
+		g_object_set(icon_renderer, "size", m_icon_size, NULL);
 		gtk_tree_view_column_pack_start(m_column, icon_renderer, false);
-		gtk_tree_view_column_add_attribute(m_column, icon_renderer, "gicon", COLUMN_ICON);
+		gtk_tree_view_column_set_attributes(m_column, icon_renderer, "gicon", COLUMN_ICON, "launcher", COLUMN_LAUNCHER, NULL);
 	}
 
 	GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new();
diff --git a/panel-plugin/launcher.cpp b/panel-plugin/launcher.cpp
index 710aa46..57f22a9 100644
--- a/panel-plugin/launcher.cpp
+++ b/panel-plugin/launcher.cpp
@@ -105,7 +105,7 @@ Launcher::Launcher(GarconMenuItem* item) :
 {
 	// Fetch icon
 	const gchar* icon = garcon_menu_item_get_icon_name(m_item);
-	set_icon(icon);
+	set_icon(icon ? icon : "application-x-executable");
 
 	// Fetch text
 	const gchar* name = garcon_menu_item_get_name(m_item);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list