>From 9cbb4c57f352f107f0dd2e0a980f26430adeacb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?"Rodolfo=20Garc=C3=ADa=20Pe=C3=B1as=20(kix)"?= <[email protected]>
Date: Fri, 30 Mar 2012 16:46:30 +0200
Subject: [PATCH 5/5] WindowMaker: net_icon_image replaced by WIcon
The wwindow struct has two icons; net_icon_image and icon. The net_icon_image
is used in some parts of the code, like switchpanel. Is created when the window
is created by the X-Server. The icon is used in other parts, like appicon,...
Now, this commit join the functionality of net_icon_image and icon in icon, the
switchpanel, appicon,... using the same icon.
---
src/application.c | 5 ++---
src/icon.c | 20 +++++++++++++++-----
src/switchpanel.c | 10 +++++-----
src/window.c | 2 --
src/window.h | 1 -
src/wmspec.c | 18 +++++++++---------
src/wmspec.h | 1 +
7 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/src/application.c b/src/application.c
index 94eec74..a0b8182 100644
--- a/src/application.c
+++ b/src/application.c
@@ -259,9 +259,6 @@ WApplication *wApplicationCreate(WWindow * wwin)
}
wapp->main_window_desc->fake_group = wwin->fake_group;
- wapp->main_window_desc->net_icon_image =
RRetainImage(wwin->net_icon_image);
-
- extractIcon(wapp->main_window_desc);
leader = wWindowFor(main_window);
if (leader)
@@ -353,6 +350,8 @@ WApplication *wApplicationCreate(WWindow * wwin)
char *tmp, *path;
struct stat dummy;
+ extractIcon(wapp->main_window_desc);
+
tmp = wDefaultGetIconFile(scr, wapp->app_icon->wm_instance,
wapp->app_icon->wm_class, True);
/* If the icon was saved by us from the client supplied icon,
but is
diff --git a/src/icon.c b/src/icon.c
index f32b372..f1f46ee 100644
--- a/src/icon.c
+++ b/src/icon.c
@@ -157,8 +157,18 @@ WIcon *wIconCreate(WWindow * wwin)
#else
icon->show_title = 1;
#endif
- icon->file_image = wDefaultGetImage(scr, wwin->wm_instance,
wwin->wm_class, wPreferences.icon_size, False);
+ /* Search the icon, without default icon included (see False parameter)
*/
+ icon->file_image = wDefaultGetImage(scr, wwin->wm_instance,
wwin->wm_class, wPreferences.icon_size, True);
+ /* If no icon found in the config files, get it from X11 */
+ if (!icon->file_image)
+ icon->file_image = get_wwindow_image_from_x11(wwin);
+
+ /* If no icon found, Search it but now WITH default icon (see False
parameter) */
+ if (!icon->file_image)
+ icon->file_image = wDefaultGetImage(scr, wwin->wm_instance,
wwin->wm_class, wPreferences.icon_size, False);
+
+ /* Search the icon, but not the default App icon */
file = wDefaultGetIconFile(scr, wwin->wm_instance, wwin->wm_class,
False);
if (file)
icon->file = wstrdup(file);
@@ -482,8 +492,8 @@ char *wIconStore(WIcon * icon)
if (!path)
return NULL;
- if (wwin->net_icon_image) {
- image = RRetainImage(wwin->net_icon_image);
+ if (wwin->icon && wwin->icon->file_image) {
+ image = RRetainImage(wwin->icon->file_image);
} else if (wwin->wm_hints && (wwin->wm_hints->flags & IconPixmapHint)
&& wwin->wm_hints->icon_pixmap != None) {
image =
RCreateImageFromDrawable(icon->core->screen_ptr->rcontext,
@@ -572,9 +582,9 @@ void wIconUpdate(WIcon * icon)
} else if (icon->icon_win != None) {
/* Get the Pixmap from the WIcon */
get_pixmap_icon_from_icon_win(icon);
- } else if (wwin && wwin->net_icon_image) {
+ } else if (wwin && wwin->icon && wwin->icon->file_image) {
/* Use _NET_WM_ICON icon */
- icon->pixmap = makeIcon(scr, wwin->net_icon_image,
icon->show_title,
+ icon->pixmap = makeIcon(scr, wwin->icon->file_image,
icon->show_title,
icon->shadowed,
icon->tile_type, icon->highlighted);
} else if (wwin && wwin->wm_hints && (wwin->wm_hints->flags &
IconPixmapHint)) {
/* Get the Pixmap from the wm_hints, else, from the user */
diff --git a/src/switchpanel.c b/src/switchpanel.c
index d2eb0a6..6fc6d6b 100644
--- a/src/switchpanel.c
+++ b/src/switchpanel.c
@@ -32,6 +32,7 @@
#include "switchpanel.h"
#include "funcs.h"
#include "xinerama.h"
+#include "icon.h"
extern Atom _XA_WM_IGNORE_FOCUS_EVENTS;
@@ -172,12 +173,11 @@ static void addIconForWindow(WSwitchPanel * panel,
WMWidget * parent, WWindow *
WMResizeWidget(icon, ICON_TILE_SIZE, ICON_TILE_SIZE);
WMMoveWidget(icon, x, y);
- if (!WFLAGP(wwin, always_user_icon) && wwin->net_icon_image)
- image = RRetainImage(wwin->net_icon_image);
+ /* The image is set when the icon is created, then, read it */
+ if (!WFLAGP(wwin, always_user_icon) && wwin->icon &&
wwin->icon->file_image)
+ image = RRetainImage(wwin->icon->file_image);
- // Make this use a caching thing. When there are many windows,
- // it's very likely that most of them are instances of the same thing,
- // so caching them should get performance acceptable in these cases.
+ /* If something is wrong, then, read the icon from the config files */
if (!image)
image = wDefaultGetImage(panel->scr, wwin->wm_instance,
wwin->wm_class, ICON_TILE_SIZE, False);
diff --git a/src/window.c b/src/window.c
index 7bc30be..7910530 100644
--- a/src/window.c
+++ b/src/window.c
@@ -239,8 +239,6 @@ void wWindowDestroy(WWindow *wwin)
if (wPreferences.auto_arrange_icons)
wArrangeIcons(wwin->screen_ptr, True);
}
- if (wwin->net_icon_image)
- RReleaseImage(wwin->net_icon_image);
wrelease(wwin);
}
diff --git a/src/window.h b/src/window.h
index edebe80..30fc564 100644
--- a/src/window.h
+++ b/src/window.h
@@ -301,7 +301,6 @@ typedef struct WWindow {
struct WIcon *icon; /* icon info for the window */
int icon_x, icon_y; /* position of the icon */
int icon_w, icon_h;
- RImage *net_icon_image;
Atom type;
} WWindow;
diff --git a/src/wmspec.c b/src/wmspec.c
index 9456841..6c2a3b0 100644
--- a/src/wmspec.c
+++ b/src/wmspec.c
@@ -413,7 +413,7 @@ static RImage *makeRImageFromARGBData(unsigned long *data)
return image;
}
-static RImage *get_wwindow_image_from_x11(WWindow *wwin)
+RImage *get_wwindow_image_from_x11(WWindow *wwin)
{
RImage *image;
Atom type;
@@ -448,16 +448,16 @@ static RImage *get_wwindow_image_from_x11(WWindow *wwin)
static void updateIconImage(WWindow *wwin)
{
- /* Remove the icon image from X11 */
- if (wwin->net_icon_image)
- RReleaseImage(wwin->net_icon_image);
-
- /* Save the icon in the X11 icon */
- wwin->net_icon_image = get_wwindow_image_from_x11(wwin);
+ /* If the WIcon don't exits, create it */
+ if (!wwin->icon) {
+ wwin->icon = wIconCreate(wwin);
+ wwin->icon->core->descriptor.parent_type = WCLASS_APPICON;
+ wwin->icon->core->descriptor.parent = wwin->icon;
+ AddToStackList(wwin->icon->core);
+ }
/* Refresh the Window Icon */
- if (wwin->icon)
- wIconUpdate(wwin->icon);
+ wIconUpdate(wwin->icon);
/* Refresh the application icon */
WApplication *app = wApplicationOf(wwin->main_window);
diff --git a/src/wmspec.h b/src/wmspec.h
index 71f8ee0..d963da2 100644
--- a/src/wmspec.h
+++ b/src/wmspec.h
@@ -44,4 +44,5 @@ int wNETWMGetPidForWindow(Window window);
int wNETWMGetCurrentDesktopFromHint(WScreen *scr);
char *wNETWMGetIconName(Window window);
char *wNETWMGetWindowName(Window window);
+RImage *get_wwindow_image_from_x11(WWindow *wwin);
#endif
--
1.7.9.1
--
||// //\\// Rodolfo "kix" Garcia
||\\// //\\ http://www.kix.es/
>From 9cbb4c57f352f107f0dd2e0a980f26430adeacb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?"Rodolfo=20Garc=C3=ADa=20Pe=C3=B1as=20(kix)"?= <[email protected]>
Date: Fri, 30 Mar 2012 16:46:30 +0200
Subject: [PATCH 5/5] WindowMaker: net_icon_image replaced by WIcon
The wwindow struct has two icons; net_icon_image and icon. The net_icon_image is used in some parts of the code, like switchpanel. Is created when the window is created by the X-Server. The icon is used in other parts, like appicon,...
Now, this commit join the functionality of net_icon_image and icon in icon, the switchpanel, appicon,... using the same icon.
---
src/application.c | 5 ++---
src/icon.c | 20 +++++++++++++++-----
src/switchpanel.c | 10 +++++-----
src/window.c | 2 --
src/window.h | 1 -
src/wmspec.c | 18 +++++++++---------
src/wmspec.h | 1 +
7 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/src/application.c b/src/application.c
index 94eec74..a0b8182 100644
--- a/src/application.c
+++ b/src/application.c
@@ -259,9 +259,6 @@ WApplication *wApplicationCreate(WWindow * wwin)
}
wapp->main_window_desc->fake_group = wwin->fake_group;
- wapp->main_window_desc->net_icon_image = RRetainImage(wwin->net_icon_image);
-
- extractIcon(wapp->main_window_desc);
leader = wWindowFor(main_window);
if (leader)
@@ -353,6 +350,8 @@ WApplication *wApplicationCreate(WWindow * wwin)
char *tmp, *path;
struct stat dummy;
+ extractIcon(wapp->main_window_desc);
+
tmp = wDefaultGetIconFile(scr, wapp->app_icon->wm_instance, wapp->app_icon->wm_class, True);
/* If the icon was saved by us from the client supplied icon, but is
diff --git a/src/icon.c b/src/icon.c
index f32b372..f1f46ee 100644
--- a/src/icon.c
+++ b/src/icon.c
@@ -157,8 +157,18 @@ WIcon *wIconCreate(WWindow * wwin)
#else
icon->show_title = 1;
#endif
- icon->file_image = wDefaultGetImage(scr, wwin->wm_instance, wwin->wm_class, wPreferences.icon_size, False);
+ /* Search the icon, without default icon included (see False parameter) */
+ icon->file_image = wDefaultGetImage(scr, wwin->wm_instance, wwin->wm_class, wPreferences.icon_size, True);
+ /* If no icon found in the config files, get it from X11 */
+ if (!icon->file_image)
+ icon->file_image = get_wwindow_image_from_x11(wwin);
+
+ /* If no icon found, Search it but now WITH default icon (see False parameter) */
+ if (!icon->file_image)
+ icon->file_image = wDefaultGetImage(scr, wwin->wm_instance, wwin->wm_class, wPreferences.icon_size, False);
+
+ /* Search the icon, but not the default App icon */
file = wDefaultGetIconFile(scr, wwin->wm_instance, wwin->wm_class, False);
if (file)
icon->file = wstrdup(file);
@@ -482,8 +492,8 @@ char *wIconStore(WIcon * icon)
if (!path)
return NULL;
- if (wwin->net_icon_image) {
- image = RRetainImage(wwin->net_icon_image);
+ if (wwin->icon && wwin->icon->file_image) {
+ image = RRetainImage(wwin->icon->file_image);
} else if (wwin->wm_hints && (wwin->wm_hints->flags & IconPixmapHint)
&& wwin->wm_hints->icon_pixmap != None) {
image = RCreateImageFromDrawable(icon->core->screen_ptr->rcontext,
@@ -572,9 +582,9 @@ void wIconUpdate(WIcon * icon)
} else if (icon->icon_win != None) {
/* Get the Pixmap from the WIcon */
get_pixmap_icon_from_icon_win(icon);
- } else if (wwin && wwin->net_icon_image) {
+ } else if (wwin && wwin->icon && wwin->icon->file_image) {
/* Use _NET_WM_ICON icon */
- icon->pixmap = makeIcon(scr, wwin->net_icon_image, icon->show_title,
+ icon->pixmap = makeIcon(scr, wwin->icon->file_image, icon->show_title,
icon->shadowed, icon->tile_type, icon->highlighted);
} else if (wwin && wwin->wm_hints && (wwin->wm_hints->flags & IconPixmapHint)) {
/* Get the Pixmap from the wm_hints, else, from the user */
diff --git a/src/switchpanel.c b/src/switchpanel.c
index d2eb0a6..6fc6d6b 100644
--- a/src/switchpanel.c
+++ b/src/switchpanel.c
@@ -32,6 +32,7 @@
#include "switchpanel.h"
#include "funcs.h"
#include "xinerama.h"
+#include "icon.h"
extern Atom _XA_WM_IGNORE_FOCUS_EVENTS;
@@ -172,12 +173,11 @@ static void addIconForWindow(WSwitchPanel * panel, WMWidget * parent, WWindow *
WMResizeWidget(icon, ICON_TILE_SIZE, ICON_TILE_SIZE);
WMMoveWidget(icon, x, y);
- if (!WFLAGP(wwin, always_user_icon) && wwin->net_icon_image)
- image = RRetainImage(wwin->net_icon_image);
+ /* The image is set when the icon is created, then, read it */
+ if (!WFLAGP(wwin, always_user_icon) && wwin->icon && wwin->icon->file_image)
+ image = RRetainImage(wwin->icon->file_image);
- // Make this use a caching thing. When there are many windows,
- // it's very likely that most of them are instances of the same thing,
- // so caching them should get performance acceptable in these cases.
+ /* If something is wrong, then, read the icon from the config files */
if (!image)
image = wDefaultGetImage(panel->scr, wwin->wm_instance, wwin->wm_class, ICON_TILE_SIZE, False);
diff --git a/src/window.c b/src/window.c
index 7bc30be..7910530 100644
--- a/src/window.c
+++ b/src/window.c
@@ -239,8 +239,6 @@ void wWindowDestroy(WWindow *wwin)
if (wPreferences.auto_arrange_icons)
wArrangeIcons(wwin->screen_ptr, True);
}
- if (wwin->net_icon_image)
- RReleaseImage(wwin->net_icon_image);
wrelease(wwin);
}
diff --git a/src/window.h b/src/window.h
index edebe80..30fc564 100644
--- a/src/window.h
+++ b/src/window.h
@@ -301,7 +301,6 @@ typedef struct WWindow {
struct WIcon *icon; /* icon info for the window */
int icon_x, icon_y; /* position of the icon */
int icon_w, icon_h;
- RImage *net_icon_image;
Atom type;
} WWindow;
diff --git a/src/wmspec.c b/src/wmspec.c
index 9456841..6c2a3b0 100644
--- a/src/wmspec.c
+++ b/src/wmspec.c
@@ -413,7 +413,7 @@ static RImage *makeRImageFromARGBData(unsigned long *data)
return image;
}
-static RImage *get_wwindow_image_from_x11(WWindow *wwin)
+RImage *get_wwindow_image_from_x11(WWindow *wwin)
{
RImage *image;
Atom type;
@@ -448,16 +448,16 @@ static RImage *get_wwindow_image_from_x11(WWindow *wwin)
static void updateIconImage(WWindow *wwin)
{
- /* Remove the icon image from X11 */
- if (wwin->net_icon_image)
- RReleaseImage(wwin->net_icon_image);
-
- /* Save the icon in the X11 icon */
- wwin->net_icon_image = get_wwindow_image_from_x11(wwin);
+ /* If the WIcon don't exits, create it */
+ if (!wwin->icon) {
+ wwin->icon = wIconCreate(wwin);
+ wwin->icon->core->descriptor.parent_type = WCLASS_APPICON;
+ wwin->icon->core->descriptor.parent = wwin->icon;
+ AddToStackList(wwin->icon->core);
+ }
/* Refresh the Window Icon */
- if (wwin->icon)
- wIconUpdate(wwin->icon);
+ wIconUpdate(wwin->icon);
/* Refresh the application icon */
WApplication *app = wApplicationOf(wwin->main_window);
diff --git a/src/wmspec.h b/src/wmspec.h
index 71f8ee0..d963da2 100644
--- a/src/wmspec.h
+++ b/src/wmspec.h
@@ -44,4 +44,5 @@ int wNETWMGetPidForWindow(Window window);
int wNETWMGetCurrentDesktopFromHint(WScreen *scr);
char *wNETWMGetIconName(Window window);
char *wNETWMGetWindowName(Window window);
+RImage *get_wwindow_image_from_x11(WWindow *wwin);
#endif
--
1.7.9.1