Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "applyDefaultIcon" setting #22

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

ahigerd
Copy link

@ahigerd ahigerd commented Feb 13, 2024

Some applications don't provide their own icons. By default, Openbox sets a generic icon for these applications. Other environments, such as GNOME, instead supply an icon from /usr/share/pixmaps or the icon theme. Openbox's behavior is appropriate when it is running on its own, but when it is being used as the window manager in a broader desktop environment, the presence of the default icon prevents the environment from noticing that it needs to provide an icon.

This change adds an <applyDefaultIcon> configuration option that defaults to yes to preserve the standard Openbox behavior. By setting this option to no, Openbox will cede responsibility for setting default icons to the desktop environment.

Resolves issue #21

Some applications don't provide their own icons. By default, Openbox
sets a generic icon for these applications. Other environments, such
as GNOME, instead supply an icon from /usr/share/pixmaps or the icon
theme. Openbox's behavior is appropriate when it is running on its
own, but when it being used as the window manager in a broader
desktop environment, the presence of the default icon prevents the
environment from noticing that it needs to provide an icon.

This change adds an `<applyDefaultIcon>` configuration option that
defaults to `yes` to preserve the standard Openbox behavior. By
setting this option to `no`, Openbox will cede responsibility for
setting default icons to the desktop environment.

Resolves issue Mikachu#21
@ahigerd
Copy link
Author

ahigerd commented Feb 13, 2024

Hold this thought: This was working for me for several hours, but I just had a crash and I'm investigating if it's related to this change or not.

@ahigerd
Copy link
Author

ahigerd commented Feb 13, 2024

Doesn't look related, though it's kind of confusing. It crashed in client_calc_layer.

Okay, yeah, this PR should be good to go.

Recompiled with debug symbols and got a more useful crash log. It's crashing in an image resize operation.

@danakj
Copy link
Collaborator

danakj commented Feb 13, 2024

I was going to say there hasn’t been a crash report in many years :) Thanks for digging in more

@ahigerd
Copy link
Author

ahigerd commented Feb 14, 2024

Ah. Okay, so there's a bug in my panel where I'm assigning the icon, and that's triggering an overflow error in client_update_icons -- it's checking i + w*h > num but w*h overflows, so the > comparison doesn't notice it.

To be fair, this is a ridiculous edge case and a WM shouldn't be expected to have flawless behavior in the face of misbehaving clients! But I'll go ahead and fix it while I'm in here.

@ahigerd ahigerd force-pushed the alh/applyDefaultIcon branch from 1e3a682 to 25f182f Compare February 14, 2024 00:40
@ahigerd
Copy link
Author

ahigerd commented Feb 14, 2024

(For the record, the bug was that I was forgetting to prefix the image data with the icon dimensions.)

@ahigerd
Copy link
Author

ahigerd commented Feb 14, 2024

Okay, having fixed my panel and exercised this PR and my own fallback icon code for a few hours, it's been working great. Ready for review!

Copy link
Collaborator

@danakj danakj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I finally got around to reviewing and left some feedback. It looks good to me then.

@@ -2241,15 +2241,20 @@ void client_update_icons(ObClient *self)
while (i + 2 < num) { /* +2 is to make sure there is a w and h */
w = data[i++];
h = data[i++];
/* calculate the data size as guint64 to prevent integer
overflow due to invalid data */
guint64 size = w * h;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This did not actually calculate the size as a u64; it converts after multiplying. To do this, we need to cast at least one of w or h to u64 first.

size = (guint64)w * h;

The declaration of guint64 size should be up at the top of the function - openbox has followed old C rules in this regard.

/* watch for the data being too small for the specified size,
or for zero sized icons. */
if (i + w*h > num || w == 0 || h == 0) {
i += w*h;
if (i + size > num || size < w || size < h) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the above corrected, I believe we need to look for overflow here as well of i+size

            /* watch for addition overflow, for the data being too small for the
               specified size, or for zero sized icons. */
            if (i + size < i || i + size > num) {
                break;
            }
            else if (size == 0) {
                continue;
            }

@@ -2241,15 +2241,20 @@ void client_update_icons(ObClient *self)
while (i + 2 < num) { /* +2 is to make sure there is a w and h */
w = data[i++];
h = data[i++];
/* calculate the data size as guint64 to prevent integer
overflow due to invalid data */
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure that I would call it invalid data. the num here is guint which can be 64-bit. While unreasonably large, a w*h that is larger than 32 bits isn't invalid that I can see.

In fact, https://tronche.com/gui/x/xlib/window-information/XGetWindowProperty.html the value is an unsigned long which openbox converts incorrectly to guint, woops. But that's not your problem to solve here :) All this is just to say I think it's not invalid. We just need to ensure we don't go past whatever num we've got here.

So I think we can just drop "due to invalid data" from the comment.

continue;
}

/* convert it to the right bit order for ObRender */
for (j = 0; j < w*h; ++j)
for (j = 0; j < size; ++j)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will never finish for large size, as j will wrap around before it reaches size and will then go off writing all over memory, so we need to change more types.

as i and j are indexes into the data buffer, which we're comparing against a 64-bit size, we should make i and j also be guint64.

We may be prevented from this by num being a 32-bit value right now but that seems like a mistake anyway, so lets get these types right here at least.

@@ -50,6 +50,7 @@ gboolean config_theme_keepborder;
guint config_theme_window_list_icon_size;

gchar *config_title_layout;
gboolean config_apply_default_icon;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we have a consistent ordering across files? this can go right below config_theme_window_list_icon_size here, so move up a couple lines.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was looking for a consistent place to put it but the rest of the ordering is inconsistent so I wasn't sure exactly where to place it. I'll go ahead and follow your suggestions because that's probably better than where I did put it.

@@ -712,6 +713,8 @@ static void parse_theme(xmlNodePtr node, gpointer d)
config_theme_keepborder = obt_xml_node_bool(n);
if ((n = obt_xml_find_node(node, "animateIconify")))
config_animate_iconify = obt_xml_node_bool(n);
if ((n = obt_xml_find_node(node, "applyDefaultIcon")))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

then this can move down below config_theme_window_list_icon_size as well.

@@ -1098,6 +1101,7 @@ void config_startup(ObtXmlInst *i)
config_title_layout = g_strdup("NLIMC");
config_theme_keepborder = TRUE;
config_theme_window_list_icon_size = 36;
config_apply_default_icon = TRUE;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and this is already in the right place then.

@@ -152,6 +152,8 @@ extern gchar *config_title_layout;
extern gboolean config_animate_iconify;
/*! Size of icons in focus switching dialogs */
extern guint config_theme_window_list_icon_size;
/*! Set a default icon for windows that lack one */
extern gboolean config_apply_default_icon;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants