Skip to content

Commit

Permalink
Finally set a window icon on X11
Browse files Browse the repository at this point in the history
Since the creation of minetest, it had no window icon on X11.
Now we have one.

The misc/minetest-xorg-icon-128.png file is a rendering of the
misc/minetest.svg file with inkscape, created with something like:

inkscape -z -e misc/minetest-xorg-icon-128.png -w 128 -h 128 misc/minetest.svg
  • Loading branch information
est31 committed Jul 5, 2016
1 parent c1bdb55 commit 5d4d3f8
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 0 deletions.
Binary file added misc/minetest-xorg-icon-128.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/client/clientlauncher.cpp
Expand Up @@ -114,6 +114,9 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)

porting::setXorgClassHint(video_driver->getExposedVideoData(), PROJECT_NAME_C);

porting::setXorgWindowIcon(device,
porting::path_share + "/misc/minetest-xorg-icon-128.png");

/*
This changes the minimum allowed number of vertices in a VBO.
Default is 500.
Expand Down
87 changes: 87 additions & 0 deletions src/porting.cpp
Expand Up @@ -611,6 +611,93 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
#endif
}

bool setXorgWindowIcon(IrrlichtDevice *device,
const std::string &icon_file)
{
#ifdef XORG_USED

video::IVideoDriver *v_driver = device->getVideoDriver();

video::IImageLoader *image_loader = NULL;
for (u32 i = v_driver->getImageLoaderCount() - 1; i >= 0; i--) {
if (v_driver->getImageLoader(i)->isALoadableFileExtension(icon_file.c_str())) {
image_loader = v_driver->getImageLoader(i);
break;
}
}

if (!image_loader) {
warningstream << "Could not find image loader for file '"
<< icon_file << "'" << std::endl;
return false;
}

io::IReadFile *icon_f = device->getFileSystem()->createAndOpenFile(icon_file.c_str());

if (!icon_f) {
warningstream << "Could not load icon file '"
<< icon_file << "'" << std::endl;
return false;
}

video::IImage *img = image_loader->loadImage(icon_f);

if (!img) {
warningstream << "Could not load icon file '"
<< icon_file << "'" << std::endl;
icon_f->drop();
return false;
}

u32 height = img->getDimension().Height;
u32 width = img->getDimension().Width;

size_t icon_buffer_len = 2 + height * width;
long *icon_buffer = new long[icon_buffer_len];

icon_buffer[0] = width;
icon_buffer[1] = height;

for (u32 x = 0; x < width; x++) {
for (u32 y = 0; y < height; y++) {
video::SColor col = img->getPixel(x, y);
long pixel_val = 0;
pixel_val |= (u8)col.getAlpha() << 24;
pixel_val |= (u8)col.getRed() << 16;
pixel_val |= (u8)col.getGreen() << 8;
pixel_val |= (u8)col.getBlue();
icon_buffer[2 + x + y * width] = pixel_val;
}
}

img->drop();
icon_f->drop();

const video::SExposedVideoData &video_data = v_driver->getExposedVideoData();

Display *x11_dpl = (Display *)video_data.OpenGLLinux.X11Display;

if (x11_dpl == NULL) {
warningstream << "Could not find x11 display for setting its icon."
<< std::endl;
delete [] icon_buffer;
return false;
}

Window x11_win = (Window)video_data.OpenGLLinux.X11Window;

Atom net_wm_icon = XInternAtom(x11_dpl, "_NET_WM_ICON", False);
Atom cardinal = XInternAtom(x11_dpl, "CARDINAL", False);
XChangeProperty(x11_dpl, x11_win,
net_wm_icon, cardinal, 32,
PropModeReplace, (const unsigned char *)icon_buffer,
icon_buffer_len);

delete [] icon_buffer;

return true;
#endif
}

////
//// Video/Display Information (Client-only)
Expand Down
3 changes: 3 additions & 0 deletions src/porting.h
Expand Up @@ -367,6 +367,9 @@ inline const char *getPlatformName()
void setXorgClassHint(const video::SExposedVideoData &video_data,
const std::string &name);

bool setXorgWindowIcon(IrrlichtDevice *device,
const std::string &icon_file);

// This only needs to be called at the start of execution, since all future
// threads in the process inherit this exception handler
void setWin32ExceptionHandler();
Expand Down

1 comment on commit 5d4d3f8

@est31
Copy link
Contributor Author

@est31 est31 commented on 5d4d3f8 Jul 16, 2016

Choose a reason for hiding this comment

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

No, i think its a bug I've missed with this commit. See #4323

Please sign in to comment.