glfw: add Window.setIcon
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
4f1c6d1b58
commit
20c9110d9b
1 changed files with 73 additions and 0 deletions
|
|
@ -1,10 +1,13 @@
|
||||||
//! Window type and related functions
|
//! Window type and related functions
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const testing = std.testing;
|
||||||
|
const mem = std.mem;
|
||||||
const c = @import("c.zig").c;
|
const c = @import("c.zig").c;
|
||||||
|
|
||||||
const Error = @import("errors.zig").Error;
|
const Error = @import("errors.zig").Error;
|
||||||
const getError = @import("errors.zig").getError;
|
const getError = @import("errors.zig").getError;
|
||||||
|
const Image = @import("Image.zig");
|
||||||
const Monitor = @import("Monitor.zig");
|
const Monitor = @import("Monitor.zig");
|
||||||
|
|
||||||
const Window = @This();
|
const Window = @This();
|
||||||
|
|
@ -282,6 +285,44 @@ pub inline fn setTitle(self: Window, title: [*c]const u8) Error!void {
|
||||||
c.glfwSetWindowTitle(self.handle, title);
|
c.glfwSetWindowTitle(self.handle, title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the icon for the specified window.
|
||||||
|
///
|
||||||
|
/// This function sets the icon of the specified window. If passed an array of candidate images,
|
||||||
|
/// those of or closest to the sizes desired by the system are selected. If no images are
|
||||||
|
/// specified, the window reverts to its default icon.
|
||||||
|
///
|
||||||
|
/// The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits per channel with
|
||||||
|
/// the red channel first. They are arranged canonically as packed sequential rows, starting from
|
||||||
|
/// the top-left corner.
|
||||||
|
///
|
||||||
|
/// The desired image sizes varies depending on platform and system settings. The selected images
|
||||||
|
/// will be rescaled as needed. Good sizes include 16x16, 32x32 and 48x48.
|
||||||
|
///
|
||||||
|
/// Possible errors include glfw.Error.NotInitialized and glfw.Error.PlatformError.
|
||||||
|
///
|
||||||
|
/// @pointer_lifetime The specified image data is copied before this function returns.
|
||||||
|
///
|
||||||
|
/// macos: The GLFW window has no icon, as it is not a document window, so this function does
|
||||||
|
/// nothing. The dock icon will be the same as the application bundle's icon. For more information
|
||||||
|
/// on bundles, see the [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)
|
||||||
|
/// in the Mac Developer Library.
|
||||||
|
///
|
||||||
|
/// wayland: There is no existing protocol to change an icon, the window will thus inherit the one
|
||||||
|
/// defined in the application's desktop file. This function always emits glfw.Error.PlatformError.
|
||||||
|
///
|
||||||
|
/// @thread_safety This function must only be called from the main thread.
|
||||||
|
///
|
||||||
|
/// see also: window_icon
|
||||||
|
pub inline fn setIcon(self: Window, allocator: *mem.Allocator, images: ?[]Image) Error!void {
|
||||||
|
if (images) |im| {
|
||||||
|
const tmp = try allocator.alloc(c.GLFWimage, im.len);
|
||||||
|
defer allocator.free(tmp);
|
||||||
|
for (im) |img, index| tmp[index] = img.toC();
|
||||||
|
c.glfwSetWindowIcon(self.handle, @intCast(c_int, im.len), &tmp[0]);
|
||||||
|
} else c.glfwSetWindowIcon(self.handle, 0, null);
|
||||||
|
try getError();
|
||||||
|
}
|
||||||
|
|
||||||
test "defaultHints" {
|
test "defaultHints" {
|
||||||
const glfw = @import("main.zig");
|
const glfw = @import("main.zig");
|
||||||
try glfw.init();
|
try glfw.init();
|
||||||
|
|
@ -351,3 +392,35 @@ test "setTitle" {
|
||||||
|
|
||||||
try window.setTitle("Updated title!");
|
try window.setTitle("Updated title!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "setIcon" {
|
||||||
|
const allocator = testing.allocator;
|
||||||
|
const glfw = @import("main.zig");
|
||||||
|
try glfw.init();
|
||||||
|
defer glfw.terminate();
|
||||||
|
|
||||||
|
const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null) catch |err| {
|
||||||
|
// return without fail, because most of our CI environments are headless / we cannot open
|
||||||
|
// windows on them.
|
||||||
|
std.debug.print("note: failed to create window: {}\n", .{err});
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
defer window.destroy();
|
||||||
|
|
||||||
|
// Create an all-red icon image.
|
||||||
|
var width: usize = 48;
|
||||||
|
var height: usize = 48;
|
||||||
|
const icon = try Image.init(allocator, width, height, width * height * 4);
|
||||||
|
var x: usize = 0;
|
||||||
|
var y: usize = 0;
|
||||||
|
while (y <= height) : (y += 1) {
|
||||||
|
while (x <= width) : (x += 1) {
|
||||||
|
icon.pixels[(x * y * 4) + 0] = 255; // red
|
||||||
|
icon.pixels[(x * y * 4) + 1] = 0; // green
|
||||||
|
icon.pixels[(x * y * 4) + 2] = 0; // blue
|
||||||
|
icon.pixels[(x * y * 4) + 3] = 255; // alpha
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try window.setIcon(allocator, &[_]Image{icon});
|
||||||
|
icon.deinit(allocator); // glfw copies it.
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue