Correctly set window icon from ICO

This commit is contained in:
Cheng Zhao 2016-05-20 19:46:05 +09:00
parent ea2807c890
commit d26480b74e
6 changed files with 34 additions and 13 deletions

View file

@ -9,6 +9,7 @@
#include "atom/browser/api/atom_api_web_contents.h" #include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/browser.h" #include "atom/browser/browser.h"
#include "atom/browser/native_window.h" #include "atom/browser/native_window.h"
#include "atom/common/api/atom_api_native_image.h"
#include "atom/common/native_mate_converters/callback.h" #include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/gfx_converter.h" #include "atom/common/native_mate_converters/gfx_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h" #include "atom/common/native_mate_converters/gurl_converter.h"
@ -99,6 +100,15 @@ Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) {
window_->InitFromOptions(options); window_->InitFromOptions(options);
window_->AddObserver(this); window_->AddObserver(this);
AttachAsUserData(window_.get()); AttachAsUserData(window_.get());
#if defined(OS_WIN)
// Sets the window icon.
mate::Handle<NativeImage> icon;
if (options.Get(options::kIcon, &icon) && !icon.IsEmpty()) {
static_cast<NativeWindowViews*>(window_.get())->SetIcon(
icon->GetHICON(GetSystemMetrics(SM_CXSMICON)), icon->GetHICON(256));
}
#endif
} }
Window::~Window() { Window::~Window() {

View file

@ -65,9 +65,6 @@ NativeWindow::NativeWindow(
// mode. // mode.
ui::GpuSwitchingManager::SetTransparent(transparent_); ui::GpuSwitchingManager::SetTransparent(transparent_);
// Read icon before window is created.
options.Get(options::kIcon, &icon_);
WindowList::AddWindow(this); WindowList::AddWindow(this);
} }

View file

@ -251,7 +251,6 @@ class NativeWindow : public base::SupportsUserData,
bool transparent() const { return transparent_; } bool transparent() const { return transparent_; }
SkRegion* draggable_region() const { return draggable_region_.get(); } SkRegion* draggable_region() const { return draggable_region_.get(); }
bool enable_larger_than_screen() const { return enable_larger_than_screen_; } bool enable_larger_than_screen() const { return enable_larger_than_screen_; }
gfx::ImageSkia icon() const { return icon_; }
void set_has_dialog_attached(bool has_dialog_attached) { void set_has_dialog_attached(bool has_dialog_attached) {
has_dialog_attached_ = has_dialog_attached; has_dialog_attached_ = has_dialog_attached;
@ -307,9 +306,6 @@ class NativeWindow : public base::SupportsUserData,
// Whether window can be resized larger than screen. // Whether window can be resized larger than screen.
bool enable_larger_than_screen_; bool enable_larger_than_screen_;
// Window icon.
gfx::ImageSkia icon_;
// The windows has been closed. // The windows has been closed.
bool is_closed_; bool is_closed_;

View file

@ -221,6 +221,10 @@ NativeWindowViews::NativeWindowViews(
std::string window_type; std::string window_type;
if (options.Get(options::kType, &window_type)) if (options.Get(options::kType, &window_type))
SetWindowType(GetAcceleratedWidget(), window_type); SetWindowType(GetAcceleratedWidget(), window_type);
// Set window icon.
options.Get(options::kIcon, &icon_);
window_->UpdateWindowIcon();
#endif #endif
// Add web view. // Add web view.
@ -273,7 +277,6 @@ NativeWindowViews::NativeWindowViews(
use_content_size_) use_content_size_)
size = ContentSizeToWindowSize(size); size = ContentSizeToWindowSize(size);
window_->UpdateWindowIcon();
window_->CenterWindow(size); window_->CenterWindow(size);
Layout(); Layout();
} }
@ -842,13 +845,15 @@ bool NativeWindowViews::ShouldHandleSystemCommands() const {
return true; return true;
} }
#if defined(USE_X11)
gfx::ImageSkia NativeWindowViews::GetWindowAppIcon() { gfx::ImageSkia NativeWindowViews::GetWindowAppIcon() {
return icon(); return icon_;
} }
gfx::ImageSkia NativeWindowViews::GetWindowIcon() { gfx::ImageSkia NativeWindowViews::GetWindowIcon() {
return GetWindowAppIcon(); return GetWindowAppIcon();
} }
#endif
views::Widget* NativeWindowViews::GetWidget() { views::Widget* NativeWindowViews::GetWidget() {
return window_.get(); return window_.get();

View file

@ -104,12 +104,14 @@ class NativeWindowViews : public NativeWindow,
gfx::AcceleratedWidget GetAcceleratedWidget() override; gfx::AcceleratedWidget GetAcceleratedWidget() override;
views::Widget* widget() const { return window_.get(); }
#if defined(OS_WIN) #if defined(OS_WIN)
void SetIcon(HICON small_icon, HICON app_icon);
TaskbarHost& taskbar_host() { return taskbar_host_; } TaskbarHost& taskbar_host() { return taskbar_host_; }
#endif #endif
views::Widget* widget() const { return window_.get(); }
private: private:
// views::WidgetObserver: // views::WidgetObserver:
void OnWidgetActivationChanged( void OnWidgetActivationChanged(
@ -125,8 +127,10 @@ class NativeWindowViews : public NativeWindow,
bool CanMinimize() const override; bool CanMinimize() const override;
base::string16 GetWindowTitle() const override; base::string16 GetWindowTitle() const override;
bool ShouldHandleSystemCommands() const override; bool ShouldHandleSystemCommands() const override;
#if defined(USE_X11)
gfx::ImageSkia GetWindowAppIcon() override; gfx::ImageSkia GetWindowAppIcon() override;
gfx::ImageSkia GetWindowIcon() override; gfx::ImageSkia GetWindowIcon() override;
#endif
views::Widget* GetWidget() override; views::Widget* GetWidget() override;
const views::Widget* GetWidget() const override; const views::Widget* GetWidget() const override;
views::View* GetContentsView() override; views::View* GetContentsView() override;
@ -145,7 +149,6 @@ class NativeWindowViews : public NativeWindow,
// MessageHandlerDelegate: // MessageHandlerDelegate:
bool PreHandleMSG( bool PreHandleMSG(
UINT message, WPARAM w_param, LPARAM l_param, LRESULT* result) override; UINT message, WPARAM w_param, LPARAM l_param, LRESULT* result) override;
void HandleSizeEvent(WPARAM w_param, LPARAM l_param); void HandleSizeEvent(WPARAM w_param, LPARAM l_param);
#endif #endif
@ -185,6 +188,9 @@ class NativeWindowViews : public NativeWindow,
// we need to make sure size constraints are restored when window becomes // we need to make sure size constraints are restored when window becomes
// resizable again. // resizable again.
extensions::SizeConstraints old_size_constraints_; extensions::SizeConstraints old_size_constraints_;
// Window icon.
gfx::ImageSkia icon_;
#elif defined(OS_WIN) #elif defined(OS_WIN)
// Weak ref. // Weak ref.
AtomDesktopWindowTreeHostWin* atom_desktop_window_tree_host_win_; AtomDesktopWindowTreeHostWin* atom_desktop_window_tree_host_win_;
@ -202,7 +208,6 @@ class NativeWindowViews : public NativeWindow,
// If true we have enabled a11y // If true we have enabled a11y
bool enabled_a11y_support_; bool enabled_a11y_support_;
#endif #endif
// Handles unhandled keyboard messages coming back from the renderer process. // Handles unhandled keyboard messages coming back from the renderer process.

View file

@ -73,6 +73,14 @@ const char* AppCommandToString(int command_id) {
} // namespace } // namespace
void NativeWindowViews::SetIcon(HICON small_icon, HICON app_icon) {
HWND hwnd = GetAcceleratedWidget();
SendMessage(hwnd, WM_SETICON, ICON_SMALL,
reinterpret_cast<LPARAM>(small_icon));
SendMessage(hwnd, WM_SETICON, ICON_BIG,
reinterpret_cast<LPARAM>(app_icon));
}
bool NativeWindowViews::ExecuteWindowsCommand(int command_id) { bool NativeWindowViews::ExecuteWindowsCommand(int command_id) {
std::string command = AppCommandToString(command_id); std::string command = AppCommandToString(command_id);
NotifyWindowExecuteWindowsCommand(command); NotifyWindowExecuteWindowsCommand(command);