Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions windows/cc/WindowWin32.cc
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,18 @@ void jwm::WindowWin32::setIcon(const std::wstring& iconPath) {
SendMessage(_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);
}

void jwm::WindowWin32::setIcon(const unsigned char* iconData, int dataLength) {
// Get the identifier (i.e. offset) of the icon that is most appropriate
// for the current video display
int nID = LookupIconIdFromDirectoryEx(const_cast<PBYTE>(reinterpret_cast<const BYTE*>(iconData)),
TRUE, 0, 0, LR_DEFAULTCOLOR);
if (nID > 0) {
HICON hicon = CreateIconFromResourceEx(const_cast<PBYTE>(reinterpret_cast<const BYTE*>(iconData + nID)),
dataLength - nID, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
SendMessage(_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);
}
}

void jwm::WindowWin32::setOpacity(float opacity) {
JWM_VERBOSE("Set window opacity'" << opacity << "'");
LONG_PTR previousStyle = GetWindowLongPtr(_hWnd, GWL_EXSTYLE);
Expand Down Expand Up @@ -1103,6 +1115,14 @@ extern "C" JNIEXPORT void JNICALL Java_io_github_humbleui_jwm_WindowWin32__1nSet
env->ReleaseStringChars(iconPath, iconPathStr);
}

extern "C" JNIEXPORT void JNICALL Java_io_github_humbleui_jwm_WindowWin32__1nSetIconData
(JNIEnv* env, jobject obj, jbyteArray iconData, jint dataLength) {
jwm::WindowWin32* instance = reinterpret_cast<jwm::WindowWin32*>(jwm::classes::Native::fromJava(env, obj));
jbyte* bytes = env->GetByteArrayElements(iconData, nullptr);
instance->setIcon(reinterpret_cast<const unsigned char*>(bytes), dataLength);
env->ReleaseByteArrayElements(iconData, bytes, 0);
}

extern "C" JNIEXPORT void JNICALL Java_io_github_humbleui_jwm_WindowWin32__1nSetVisible
(JNIEnv* env, jobject obj, jboolean isVisible) {
jwm::WindowWin32* instance = reinterpret_cast<jwm::WindowWin32*>(jwm::classes::Native::fromJava(env, obj));
Expand Down
1 change: 1 addition & 0 deletions windows/cc/WindowWin32.hh
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ namespace jwm {
void setTitle(const std::wstring& title);
void setTitlebarVisible(bool isVisible);
void setIcon(const std::wstring& iconPath);
void setIcon(const unsigned char* iconData, int dataLength);
void setOpacity(float opacity);
float getOpacity();
bool isHighContrast();
Expand Down
13 changes: 13 additions & 0 deletions windows/java/WindowWin32.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,18 @@ public Window setIcon(File icon){
return this;
}

/**
* <p>Set window icon from raw ICO bytes.</p>
*
* @param iconData byte array of raw ICO data
* @return this
*/
public Window setIcon(byte[] iconData) {
assert _onUIThread() : "Should be run on UI thread";
_nSetIconData(iconData, iconData.length);
return this;
}

@Override
public Window setTitlebarVisible(boolean value) {
assert _onUIThread();
Expand Down Expand Up @@ -228,6 +240,7 @@ public Window winSetParent(long hwnd) {
@ApiStatus.Internal public native void _nSetTitle(String title);
@ApiStatus.Internal public native void _nSetTitlebarVisible(boolean isVisible);
@ApiStatus.Internal public native void _nSetIcon(String iconPath);
@ApiStatus.Internal public native void _nSetIconData(byte[] iconData, int dataLength);
@ApiStatus.Internal public native void _nSetVisible(boolean isVisible);
@ApiStatus.Internal public native void _nSetOpacity(float opacity);
@ApiStatus.Internal public native float _nGetOpacity();
Expand Down
Loading