UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2017 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "pch.h" 30 31 #include "icons.h" 32 #include "../ui/icons.h" 33 34 #include <stdlib.h> 35 #include <string.h> 36 37 #include "util.h" 38 39 #include <Windows.h> 40 #include <Shellapi.h> 41 42 43 using namespace winrt; 44 using namespace Microsoft::UI::Xaml; 45 using namespace Microsoft::UI::Xaml::Controls; 46 using namespace Windows::UI::Xaml::Interop; 47 using namespace winrt::Windows::Foundation; 48 using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives; 49 using namespace winrt::Microsoft::UI::Xaml::Media::Imaging; 50 //using namespace Windows::Storage::Streams; 51 52 static UiIcon* sys_folder_icon16; 53 static UiIcon* sys_file_icon16; 54 55 static UiIcon* sys_folder_icon32; 56 static UiIcon* sys_file_icon32; 57 58 std::unordered_map<std::string, Symbol> ui_symbol_icons = { 59 {"Accept", Symbol::Accept }, 60 {"Account", Symbol::Account }, 61 {"Add", Symbol::Add }, 62 {"AddFriend", Symbol::AddFriend }, 63 {"Admin", Symbol::Admin }, 64 {"AlignCenter", Symbol::AlignCenter }, 65 {"AlignLeft", Symbol::AlignLeft }, 66 {"AlignRight", Symbol::AlignRight }, 67 {"AllApps", Symbol::AllApps }, 68 {"Attach", Symbol::Attach }, 69 {"AttachCamera", Symbol::AttachCamera }, 70 {"Audio", Symbol::Audio }, 71 {"Back", Symbol::Back }, 72 {"BackToWindow", Symbol::BackToWindow }, 73 {"BlockContact", Symbol::BlockContact }, 74 {"Bold", Symbol::Bold }, 75 {"Bookmarks", Symbol::Bookmarks }, 76 {"BrowsePhotos", Symbol::BrowsePhotos }, 77 {"Bullets", Symbol::Bullets }, 78 {"Calculator", Symbol::Calculator }, 79 {"Calendar", Symbol::Calendar }, 80 {"CalendarDay", Symbol::CalendarDay }, 81 {"CalendarReply", Symbol::CalendarReply }, 82 {"CalendarWeek", Symbol::CalendarWeek }, 83 {"Camera", Symbol::Camera }, 84 {"Cancel", Symbol::Cancel }, 85 {"Caption", Symbol::Caption }, 86 {"CellPhone", Symbol::CellPhone }, 87 {"Character", Symbol::Character }, 88 {"Clear", Symbol::Clear }, 89 {"ClearSelection", Symbol::ClearSelection }, 90 {"Clock", Symbol::Clock }, 91 {"ClosedCaption", Symbol::ClosedCaption }, 92 {"ClosePane", Symbol::ClosePane }, 93 {"Comment", Symbol::Comment }, 94 {"Contact", Symbol::Contact }, 95 {"Contact2", Symbol::Contact2 }, 96 {"ContactInfo", Symbol::ContactInfo }, 97 {"ContactPresence", Symbol::ContactPresence }, 98 {"Copy", Symbol::Copy }, 99 {"Crop", Symbol::Crop }, 100 {"Cut", Symbol::Cut }, 101 {"Delete", Symbol::Delete }, 102 {"Directions", Symbol::Directions }, 103 {"DisableUpdates", Symbol::DisableUpdates }, 104 {"DisconnectDrive", Symbol::DisconnectDrive }, 105 {"Dislike", Symbol::Dislike }, 106 {"DockBottom", Symbol::DockBottom }, 107 {"DockLeft", Symbol::DockLeft }, 108 {"DockRight", Symbol::DockRight }, 109 {"Document", Symbol::Document }, 110 {"Download", Symbol::Download }, 111 {"Edit", Symbol::Edit }, 112 {"Emoji", Symbol::Emoji }, 113 {"Emoji2", Symbol::Emoji2 }, 114 {"Favorite", Symbol::Favorite }, 115 {"Filter", Symbol::Filter }, 116 {"Find", Symbol::Find }, 117 {"Flag", Symbol::Flag }, 118 {"Folder", Symbol::Folder }, 119 {"Font", Symbol::Font }, 120 {"FontColor", Symbol::FontColor }, 121 {"FontDecrease", Symbol::FontDecrease }, 122 {"FontIncrease", Symbol::FontIncrease }, 123 {"FontSize", Symbol::FontSize }, 124 {"Forward", Symbol::Forward }, 125 {"FourBars", Symbol::FourBars }, 126 {"FullScreen", Symbol::FullScreen }, 127 {"GlobalNavigationButton", Symbol::GlobalNavigationButton }, 128 {"Globe", Symbol::Globe }, 129 {"Go", Symbol::Go }, 130 {"GoToStart", Symbol::GoToStart }, 131 {"GoToToday", Symbol::GoToToday }, 132 {"HangUp", Symbol::HangUp }, 133 {"Help", Symbol::Help }, 134 {"HideBcc", Symbol::HideBcc }, 135 {"Highlight", Symbol::Highlight }, 136 {"Home", Symbol::Home }, 137 {"Import", Symbol::Import }, 138 {"ImportAll", Symbol::ImportAll }, 139 {"Important", Symbol::Important }, 140 {"Italic", Symbol::Italic }, 141 {"Keyboard", Symbol::Keyboard }, 142 {"LeaveChat", Symbol::LeaveChat }, 143 {"Library", Symbol::Library }, 144 {"Like", Symbol::Like }, 145 {"LikeDislike", Symbol::LikeDislike }, 146 {"Link", Symbol::Link }, 147 {"List", Symbol::List }, 148 {"Mail", Symbol::Mail }, 149 {"MailFilled", Symbol::MailFilled }, 150 {"MailForward", Symbol::MailForward }, 151 {"MailReply", Symbol::MailReply }, 152 {"MailReplyAll", Symbol::MailReplyAll }, 153 {"Manage", Symbol::Manage }, 154 {"Map", Symbol::Map }, 155 {"MapDrive", Symbol::MapDrive }, 156 {"MapPin", Symbol::MapPin }, 157 {"Memo", Symbol::Memo }, 158 {"Message", Symbol::Message }, 159 {"Microphone", Symbol::Microphone }, 160 {"More", Symbol::More }, 161 {"MoveToFolder", Symbol::MoveToFolder }, 162 {"MusicInfo", Symbol::MusicInfo }, 163 {"Mute", Symbol::Mute }, 164 {"NewFolder", Symbol::NewFolder }, 165 {"NewWindow", Symbol::NewWindow }, 166 {"Next", Symbol::Next }, 167 {"OneBar", Symbol::OneBar }, 168 {"OpenFile", Symbol::OpenFile }, 169 {"OpenLocal", Symbol::OpenLocal }, 170 {"OpenPane", Symbol::OpenPane }, 171 {"OpenWith", Symbol::OpenWith }, 172 {"Orientation", Symbol::Orientation }, 173 {"OtherUser", Symbol::OtherUser }, 174 {"OutlineStar", Symbol::OutlineStar }, 175 {"Page", Symbol::Page }, 176 {"Page2", Symbol::Page2 }, 177 {"Paste", Symbol::Paste }, 178 {"Pause", Symbol::Pause }, 179 {"People", Symbol::People }, 180 {"Permissions", Symbol::Permissions }, 181 {"Phone", Symbol::Phone }, 182 {"PhoneBook", Symbol::PhoneBook }, 183 {"Pictures", Symbol::Pictures }, 184 {"Pin", Symbol::Pin }, 185 {"Placeholder", Symbol::Placeholder }, 186 {"Play", Symbol::Play }, 187 {"PostUpdate", Symbol::PostUpdate }, 188 {"Preview", Symbol::Preview }, 189 {"PreviewLink", Symbol::PreviewLink }, 190 {"Previous", Symbol::Previous }, 191 {"Print", Symbol::Print }, 192 {"Priority", Symbol::Priority }, 193 {"ProtectedDocument", Symbol::ProtectedDocument }, 194 {"Read", Symbol::Read }, 195 {"Redo", Symbol::Redo }, 196 {"Refresh", Symbol::Refresh }, 197 {"Remote", Symbol::Remote }, 198 {"Remove", Symbol::Remove }, 199 {"Rename", Symbol::Rename }, 200 {"Repair", Symbol::Repair }, 201 {"RepeatAll", Symbol::RepeatAll }, 202 {"RepeatOne", Symbol::RepeatOne }, 203 {"ReportHacked", Symbol::ReportHacked }, 204 {"ReShare", Symbol::ReShare }, 205 {"Rotate", Symbol::Rotate }, 206 {"RotateCamera", Symbol::RotateCamera }, 207 {"Save", Symbol::Save }, 208 {"SaveLocal", Symbol::SaveLocal }, 209 {"Scan", Symbol::Scan }, 210 {"SelectAll", Symbol::SelectAll }, 211 {"Send", Symbol::Send }, 212 {"SetLockScreen", Symbol::SetLockScreen }, 213 {"SetTile", Symbol::SetTile }, 214 {"Setting", Symbol::Setting }, 215 {"Share", Symbol::Share }, 216 {"Shop", Symbol::Shop }, 217 {"ShowBcc", Symbol::ShowBcc }, 218 {"ShowResults", Symbol::ShowResults }, 219 {"Shuffle", Symbol::Shuffle }, 220 {"SlideShow", Symbol::SlideShow }, 221 {"SolidStar", Symbol::SolidStar }, 222 {"Sort", Symbol::Sort }, 223 {"Stop", Symbol::Stop }, 224 {"StopSlideShow", Symbol::StopSlideShow }, 225 {"Street", Symbol::Street }, 226 {"Switch", Symbol::Switch }, 227 {"SwitchApps", Symbol::SwitchApps }, 228 {"Sync", Symbol::Sync }, 229 {"SyncFolder", Symbol::SyncFolder }, 230 {"Tag", Symbol::Tag }, 231 {"Target", Symbol::Target }, 232 {"ThreeBars", Symbol::ThreeBars }, 233 {"TouchPointer", Symbol::TouchPointer }, 234 {"Trim", Symbol::Trim }, 235 {"TwoBars", Symbol::TwoBars }, 236 {"TwoPage", Symbol::TwoPage }, 237 {"Underline", Symbol::Underline }, 238 {"Undo", Symbol::Undo }, 239 {"UnFavorite", Symbol::UnFavorite }, 240 {"UnPin", Symbol::UnPin }, 241 {"UnSyncFolder", Symbol::UnSyncFolder }, 242 {"Up", Symbol::Up }, 243 {"Upload", Symbol::Upload }, 244 {"Video", Symbol::Video }, 245 {"VideoChat", Symbol::VideoChat }, 246 {"View", Symbol::View }, 247 {"ViewAll", Symbol::ViewAll }, 248 {"Volume", Symbol::Volume }, 249 {"WebCam", Symbol::WebCam }, 250 {"World", Symbol::World }, 251 {"XboxOneConsole", Symbol::XboxOneConsole }, 252 {"ZeroBars", Symbol::ZeroBars }, 253 {"Zoom", Symbol::Zoom }, 254 {"ZoomIn", Symbol::ZoomIn }, 255 {"ZoomOut", Symbol::ZoomOut } 256 }; 257 258 winrt::Microsoft::UI::Xaml::Controls::IconElement ui_get_icon(const char* name) { 259 if (ui_symbol_icons.find(name) == ui_symbol_icons.end()) { 260 SymbolIcon no_icon = { nullptr }; 261 return no_icon; 262 } 263 264 Symbol symbol = ui_symbol_icons[name]; 265 SymbolIcon icon = SymbolIcon(symbol); 266 return icon; 267 } 268 269 270 // symbol icon implementation 271 UiSymbolIcon::UiSymbolIcon(winrt::Microsoft::UI::Xaml::Controls::Symbol sym) { 272 symbol = sym; 273 } 274 275 UiSymbolIcon::~UiSymbolIcon() { 276 277 } 278 279 winrt::Microsoft::UI::Xaml::Controls::IconElement UiSymbolIcon::getIcon() { 280 return SymbolIcon(symbol); 281 } 282 283 // image icon implementation 284 UiImageIcon::UiImageIcon(const char* uristr) { 285 wchar_t* wuri = str2wstr(uristr, nullptr); 286 Windows::Foundation::Uri uri{ wuri }; 287 this->uri = uri; 288 free(wuri); 289 } 290 291 UiImageIcon::~UiImageIcon() { 292 293 } 294 295 winrt::Microsoft::UI::Xaml::Controls::IconElement UiImageIcon::getIcon() { 296 BitmapIcon icon = BitmapIcon(); 297 icon.UriSource(uri); 298 ImageIcon img = ImageIcon(); 299 img.Source(); 300 return icon; 301 } 302 303 // bitmap icon implementation 304 UiBitmapIcon::UiBitmapIcon(winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapSource bitmap) { 305 this->bitmap = bitmap; 306 } 307 308 UiBitmapIcon::~UiBitmapIcon() { 309 310 } 311 312 winrt::Microsoft::UI::Xaml::Controls::IconElement UiBitmapIcon::getIcon() { 313 ImageIcon icon = ImageIcon(); 314 icon.Source(bitmap); 315 return icon; 316 } 317 318 UIEXPORT UiIcon* ui_icon(const char* name, size_t size) { 319 Symbol symbol = ui_symbol_icons[name]; 320 UiSymbolIcon* icon = new UiSymbolIcon(symbol); 321 return icon; 322 } 323 324 325 UIEXPORT UiIcon* ui_imageicon(const char* file) { 326 return new UiImageIcon(file); 327 } 328 329 UIEXPORT void ui_icon_free(UiIcon* icon) { 330 delete icon; 331 } 332 333 334 struct __declspec(uuid("905a0fef-bc53-11df-8c49-001e4fc686da")) IBufferByteAccess : ::IUnknown 335 { 336 virtual HRESULT __stdcall Buffer(uint8_t** value) = 0; 337 }; 338 339 340 341 winrt::Microsoft::UI::Xaml::Media::Imaging::WriteableBitmap ui_dllicon2bitmap(const char* dll, int iconindex, bool large) { 342 WriteableBitmap wbitmap = { nullptr }; 343 344 // get the icon from the dll 345 HICON hicon_small; 346 HICON hicon_large; 347 if (ExtractIconExA(dll, iconindex, &hicon_large, &hicon_small, 1) > 0) { 348 HICON hicon = large ? hicon_large : hicon_small; 349 350 // convert icon to (gdi) bitmap 351 ICONINFO info; 352 info.hbmColor = nullptr; 353 info.hbmMask = nullptr; 354 if (GetIconInfo(hicon, &info)) { 355 BITMAP bitmap; 356 if (GetObjectW(info.hbmColor, sizeof(BITMAP), &bitmap) != 0) { 357 size_t bitmap_size = bitmap.bmWidthBytes * bitmap.bmHeight; 358 char *bitmap_data = (char*)malloc(bitmap_size); 359 360 // get the pixel data 361 if (GetBitmapBits(info.hbmColor, bitmap_size, bitmap_data) != 0) { 362 WriteableBitmap wb = WriteableBitmap(bitmap.bmWidth, bitmap.bmHeight); 363 void *wb_data = wb.PixelBuffer().data(); 364 memcpy(wb_data, bitmap_data, bitmap_size); 365 wbitmap = wb; 366 } 367 free(bitmap_data); 368 } 369 if (info.hbmMask) { 370 DeleteObject(info.hbmMask); 371 } 372 if (info.hbmColor) { 373 DeleteObject(info.hbmColor); 374 } 375 } 376 377 DestroyIcon(hicon_small); 378 DestroyIcon(hicon_large); 379 } 380 381 return wbitmap; 382 } 383 384 UiIcon* ui_dllicon(const char* dll, int iconindex, bool large) { 385 WriteableBitmap wbitmap = ui_dllicon2bitmap(dll, iconindex, large); 386 return new UiBitmapIcon(wbitmap); 387 } 388 389 UIEXPORT UiIcon* ui_foldericon(size_t size) { 390 bool large = true; 391 UiIcon** sys_folder_icon = &sys_folder_icon32; 392 if (size <= 24) { 393 large = false; 394 sys_folder_icon = &sys_folder_icon16; 395 } 396 397 if (*sys_folder_icon) { 398 return *sys_folder_icon; 399 } 400 401 UiIcon* icon = ui_dllicon("shell32.dll", 3, large); 402 *sys_folder_icon = icon; 403 return icon; 404 } 405 406 UIEXPORT UiIcon* ui_fileicon(size_t size) { 407 bool large = true; 408 UiIcon** sys_folder_icon = &sys_file_icon32; 409 if (size <= 24) { 410 large = false; 411 sys_folder_icon = &sys_file_icon16; 412 } 413 414 if (*sys_folder_icon) { 415 return *sys_folder_icon; 416 } 417 418 UiIcon* icon = ui_dllicon("shell32.dll", 0, large); 419 *sys_folder_icon = icon; 420 return icon; 421 } 422