[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