Bugfix: Fixes #284, Some application icons using defaults in taskband

This commit is contained in:
Rory Fewell
2024-03-29 15:10:08 +00:00
parent 88daabf12b
commit 48918291d6
8 changed files with 88 additions and 14 deletions

View File

@@ -23,6 +23,12 @@ WinTCWndMgmtWindow* (*p_wnck_screen_get_active_window) (
) = NULL;
WinTCWndMgmtScreen* (*p_wnck_screen_get_default) (void) = NULL;
const gchar* (*p_wnck_window_get_class_instance_name) (
WinTCWndMgmtWindow* window
) = NULL;
gboolean (*p_wnck_window_get_icon_is_fallback) (
WinTCWndMgmtWindow* window
) = NULL;
GdkPixbuf* (*p_wnck_window_get_mini_icon) (
WinTCWndMgmtWindow* window
) = NULL;
@@ -85,6 +91,12 @@ gboolean init_dll_wnck()
p_wnck_screen_get_default =
dlsym(dl_wnck, "wnck_screen_get_default");
p_wnck_window_get_class_instance_name =
dlsym(dl_wnck, "wnck_window_get_class_instance_name");
p_wnck_window_get_icon_is_fallback =
dlsym(dl_wnck, "wnck_window_get_icon_is_fallback");
p_wnck_window_get_mini_icon =
dlsym(dl_wnck, "wnck_window_get_mini_icon");
@@ -103,14 +115,16 @@ gboolean init_dll_wnck()
// Check all symbols loaded
//
if (
p_wnck_set_client_type == NULL ||
p_wnck_screen_get_active_window == NULL ||
p_wnck_screen_get_default == NULL ||
p_wnck_window_get_mini_icon == NULL ||
p_wnck_window_get_name == NULL ||
p_wnck_window_is_skip_tasklist == NULL ||
p_wnck_window_minimize == NULL ||
p_wnck_window_unminimize == NULL
p_wnck_set_client_type == NULL ||
p_wnck_screen_get_active_window == NULL ||
p_wnck_screen_get_default == NULL ||
p_wnck_window_get_class_instance_name == NULL ||
p_wnck_window_get_icon_is_fallback == NULL ||
p_wnck_window_get_mini_icon == NULL ||
p_wnck_window_get_name == NULL ||
p_wnck_window_is_skip_tasklist == NULL ||
p_wnck_window_minimize == NULL ||
p_wnck_window_unminimize == NULL
)
{
g_warning("%s", "libwnck loaded, but not all symbols.");

View File

@@ -27,6 +27,12 @@ extern WinTCWndMgmtWindow* (*p_wnck_screen_get_active_window) (
);
extern WinTCWndMgmtScreen* (*p_wnck_screen_get_default) (void);
extern const gchar* (*p_wnck_window_get_class_instance_name) (
WinTCWndMgmtWindow* Window
);
extern gboolean (*p_wnck_window_get_icon_is_fallback) (
WinTCWndMgmtWindow* window
);
extern GdkPixbuf* (*p_wnck_window_get_mini_icon) (
WinTCWndMgmtWindow* window
);

View File

@@ -10,6 +10,9 @@
//
// FORWARD DECLARATIONS
//
static GdkPixbuf* wnck_window_get_mini_icon_real(
WinTCWndMgmtWindow* window
);
static void wnck_window_unminimize_real(
WinTCWndMgmtWindow* window,
guint64 timestamp
@@ -30,7 +33,7 @@ gboolean init_wndmgmt_wnck_impl(void)
//
wintc_wndmgmt_screen_get_active_window = p_wnck_screen_get_active_window;
wintc_wndmgmt_screen_get_default = p_wnck_screen_get_default;
wintc_wndmgmt_window_get_mini_icon = p_wnck_window_get_mini_icon;
wintc_wndmgmt_window_get_mini_icon = &wnck_window_get_mini_icon_real;
wintc_wndmgmt_window_get_name = p_wnck_window_get_name;
wintc_wndmgmt_window_is_skip_tasklist = p_wnck_window_is_skip_tasklist;
wintc_wndmgmt_window_minimize = p_wnck_window_minimize;
@@ -44,6 +47,50 @@ gboolean init_wndmgmt_wnck_impl(void)
//
// PRIVATE FUNCTIONS
//
static GdkPixbuf* wnck_window_get_mini_icon_real(
WinTCWndMgmtWindow* window
)
{
GdkPixbuf* icon = p_wnck_window_get_mini_icon(window);
GdkPixbuf* icon_resolv;
GtkIconTheme* icon_theme;
const gchar* wm_class;
if (p_wnck_window_get_icon_is_fallback(window))
{
// Try resolving an icon in the theme using WM_CLASS
//
icon_theme = gtk_icon_theme_get_default();
wm_class = p_wnck_window_get_class_instance_name(window);
WINTC_LOG_DEBUG(
"dpa: look up icon for wnd %p using WM_CLASS %s",
window,
wm_class
);
icon_resolv =
gtk_icon_theme_load_icon(
icon_theme,
wm_class,
16, // GTK_ICON_SIZE_MENU
GTK_ICON_LOOKUP_FORCE_SIZE,
NULL
);
if (icon_resolv)
{
icon = icon_resolv; // Pass on
}
}
else
{
g_object_ref(icon);
}
return icon;
}
static void wnck_window_unminimize_real(
WinTCWndMgmtWindow* window,
guint64 timestamp

View File

@@ -120,17 +120,21 @@ static void window_manager_update_icon(
WindowManagerSingle* window_manager
)
{
GdkPixbuf* icon;
if (window_manager->button == NULL)
{
return;
}
icon = wintc_wndmgmt_window_get_mini_icon(window_manager->managed_window);
gtk_image_set_from_pixbuf(
window_manager->button_icon,
wintc_wndmgmt_window_get_mini_icon(
window_manager->managed_window
)
icon
);
g_object_unref(icon);
}
static void window_manager_update_state(

View File

@@ -68,10 +68,10 @@ int main(
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 413, 322);
gtk_window_set_icon(GTK_WINDOW(window), NULL); // FIXME: Icon still present :(
gtk_window_set_icon_name(GTK_WINDOW(window), "help-browser");
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_title(GTK_WINDOW(window), "About Windows");
gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_MENU);
gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
g_signal_connect(
window,

View File

@@ -0,0 +1 @@
notepad.png

View File

@@ -0,0 +1 @@
notepad.png

View File

@@ -0,0 +1 @@
notepad.png