Fri, 15 Nov 2024 21:50:20 +0100
add reference counting to download window
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2023 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "pch.h" #include "dnd.h" #include "util.h" #include <thread> using namespace winrt; using namespace Windows::ApplicationModel::DataTransfer; using namespace Windows::Storage; using namespace Windows::Storage::Streams; UIEXPORT void ui_selection_settext(UiDnD* dnd, char* str, int len) { if (dnd->data) { if (len < 0) { len = strlen(str); } wchar_t *wstr = str2wstr_len(str, len, nullptr); dnd->data.SetText(wstr); free(wstr); } } UIEXPORT void ui_selection_seturis(UiDnD* dnd, char** uris, int nelm) { } UIEXPORT char* ui_selection_gettext(UiDnD* dnd) { return nullptr; } UIEXPORT UiFileList ui_selection_geturis(UiDnD *dnd) { UiFileList flist; flist.files = nullptr; flist.nfiles = 0; if (dnd->dataview.Contains(StandardDataFormats::StorageItems())) { UiFileList *flist_ptr = &flist; // we need to execute this in a different thread // this could block the main gui thread, but shouldn't happen with a simple uri list std::thread getDataThread([dnd, flist_ptr]() { auto items = dnd->dataview.GetStorageItemsAsync().get(); char **uris = (char**)calloc(items.Size(), sizeof(char*)); flist_ptr->files = uris; flist_ptr->nfiles = items.Size(); int i = 0; for (IStorageItem const& item : items) { winrt::hstring path = item.Path(); uris[i++] = wchar2utf8(path.c_str(), path.size()); } }); getDataThread.join(); } return flist; }