From 48918291d6345dd0d5271aa8548cd59680ade380 Mon Sep 17 00:00:00 2001 From: Rory Fewell Date: Fri, 29 Mar 2024 15:10:08 +0000 Subject: [PATCH] Bugfix: Fixes #284, Some application icons using defaults in taskband --- shared/shelldpa/src/dll/wnck.c | 30 +++++++++--- shared/shelldpa/src/dll/wnck.h | 6 +++ shared/shelldpa/src/impl-wndmgmt-wnck.c | 49 ++++++++++++++++++- .../taskband/src/taskbuttons/windowmonitor.c | 10 ++-- shell/winver/src/winver.c | 4 +- windows/notepad/icons/16x16/wintc-notepad.png | 1 + windows/notepad/icons/32x32/wintc-notepad.png | 1 + windows/notepad/icons/48x48/wintc-notepad.png | 1 + 8 files changed, 88 insertions(+), 14 deletions(-) create mode 120000 windows/notepad/icons/16x16/wintc-notepad.png create mode 120000 windows/notepad/icons/32x32/wintc-notepad.png create mode 120000 windows/notepad/icons/48x48/wintc-notepad.png diff --git a/shared/shelldpa/src/dll/wnck.c b/shared/shelldpa/src/dll/wnck.c index 579f6cd..5aa4015 100644 --- a/shared/shelldpa/src/dll/wnck.c +++ b/shared/shelldpa/src/dll/wnck.c @@ -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."); diff --git a/shared/shelldpa/src/dll/wnck.h b/shared/shelldpa/src/dll/wnck.h index 79757e8..22ca201 100644 --- a/shared/shelldpa/src/dll/wnck.h +++ b/shared/shelldpa/src/dll/wnck.h @@ -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 ); diff --git a/shared/shelldpa/src/impl-wndmgmt-wnck.c b/shared/shelldpa/src/impl-wndmgmt-wnck.c index 70fe4f3..d06e7e9 100644 --- a/shared/shelldpa/src/impl-wndmgmt-wnck.c +++ b/shared/shelldpa/src/impl-wndmgmt-wnck.c @@ -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 diff --git a/shell/taskband/src/taskbuttons/windowmonitor.c b/shell/taskband/src/taskbuttons/windowmonitor.c index 1702844..0d432be 100644 --- a/shell/taskband/src/taskbuttons/windowmonitor.c +++ b/shell/taskband/src/taskbuttons/windowmonitor.c @@ -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( diff --git a/shell/winver/src/winver.c b/shell/winver/src/winver.c index 641fbae..3631a2c 100644 --- a/shell/winver/src/winver.c +++ b/shell/winver/src/winver.c @@ -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, diff --git a/windows/notepad/icons/16x16/wintc-notepad.png b/windows/notepad/icons/16x16/wintc-notepad.png new file mode 120000 index 0000000..e41c9c9 --- /dev/null +++ b/windows/notepad/icons/16x16/wintc-notepad.png @@ -0,0 +1 @@ +notepad.png \ No newline at end of file diff --git a/windows/notepad/icons/32x32/wintc-notepad.png b/windows/notepad/icons/32x32/wintc-notepad.png new file mode 120000 index 0000000..e41c9c9 --- /dev/null +++ b/windows/notepad/icons/32x32/wintc-notepad.png @@ -0,0 +1 @@ +notepad.png \ No newline at end of file diff --git a/windows/notepad/icons/48x48/wintc-notepad.png b/windows/notepad/icons/48x48/wintc-notepad.png new file mode 120000 index 0000000..e41c9c9 --- /dev/null +++ b/windows/notepad/icons/48x48/wintc-notepad.png @@ -0,0 +1 @@ +notepad.png \ No newline at end of file