From 2934b08742112a2328a2f1a91c6a4ab74f0d076f Mon Sep 17 00:00:00 2001 From: daleclack Date: Thu, 14 Sep 2023 21:10:31 +0800 Subject: [PATCH] Fix gtk4 file explorer for windows --- Gtk4/gtk149_file_exp3/.vscode/settings.json | 3 ++- Gtk4/gtk149_file_exp3/CMakeLists.txt | 4 ++-- Gtk4/gtk149_file_exp3/src/FileColumnView.cpp | 3 ++- Gtk4/gtk149_file_exp3/src/FileGridView.cpp | 3 ++- Gtk4/gtk149_file_exp3/src/GetFileType.h | 23 ++++++++++++++++++++ 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 Gtk4/gtk149_file_exp3/src/GetFileType.h diff --git a/Gtk4/gtk149_file_exp3/.vscode/settings.json b/Gtk4/gtk149_file_exp3/.vscode/settings.json index b4d8c35..4d69525 100644 --- a/Gtk4/gtk149_file_exp3/.vscode/settings.json +++ b/Gtk4/gtk149_file_exp3/.vscode/settings.json @@ -1,3 +1,4 @@ { - "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools" + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", + "cmake.configureOnOpen": true } \ No newline at end of file diff --git a/Gtk4/gtk149_file_exp3/CMakeLists.txt b/Gtk4/gtk149_file_exp3/CMakeLists.txt index 520726f..1ea5c36 100644 --- a/Gtk4/gtk149_file_exp3/CMakeLists.txt +++ b/Gtk4/gtk149_file_exp3/CMakeLists.txt @@ -1,5 +1,5 @@ set(CMAKE_CXX_STANDARD 17) -cmake_minimum_required(VERSION 3.0.0) +cmake_minimum_required(VERSION 3.5.0) project(gtk149_file_exp VERSION 1.0.0) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros) @@ -59,7 +59,7 @@ if(WIN32) set_property(SOURCE ../icon.rc APPEND PROPERTY OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico ) - add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} ${SOURCE_FILE} ${RESOURCE_FILE}) + add_executable(${PROJECT_NAME} ${app_WINRC} ${SOURCE_FILE} ${RESOURCE_FILE}) add_custom_command( TARGET ${PROJECT_NAME} COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore) diff --git a/Gtk4/gtk149_file_exp3/src/FileColumnView.cpp b/Gtk4/gtk149_file_exp3/src/FileColumnView.cpp index b375a3d..b835069 100644 --- a/Gtk4/gtk149_file_exp3/src/FileColumnView.cpp +++ b/Gtk4/gtk149_file_exp3/src/FileColumnView.cpp @@ -1,4 +1,5 @@ #include "FileColumnView.h" +#include "GetFileType.h" static void setup_fileicon_item(GtkListItemFactory *factory, GtkListItem *item) { @@ -103,7 +104,7 @@ static void listview_activated(GtkColumnView *view, guint position, FileWindow * GtkDirectoryList *list = GTK_DIRECTORY_LIST(file_window_get_column_model(win)); // if the file type is directory, open the directory - if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) + if (check_directory(info)) { // Get the file and set it to the GtkDirectoryList GFile *file = G_FILE(g_file_info_get_attribute_object(info, "standard::file")); diff --git a/Gtk4/gtk149_file_exp3/src/FileGridView.cpp b/Gtk4/gtk149_file_exp3/src/FileGridView.cpp index 39c7bd7..1f88429 100644 --- a/Gtk4/gtk149_file_exp3/src/FileGridView.cpp +++ b/Gtk4/gtk149_file_exp3/src/FileGridView.cpp @@ -1,4 +1,5 @@ #include "FileGridView.h" +#include "GetFileType.h" static void setup_grid_item(GtkListItemFactory *factory, GtkListItem *item) { @@ -63,7 +64,7 @@ static void gridview_activate(GtkGridView *view, guint position, FileWindow *win GtkDirectoryList *list = GTK_DIRECTORY_LIST(file_window_get_grid_model(win)); // if the file type is directory, open the directory - if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) + if (check_directory(info)) { // Get the file and set it to the GtkDirectoryList GFile *file = G_FILE(g_file_info_get_attribute_object(info, "standard::file")); diff --git a/Gtk4/gtk149_file_exp3/src/GetFileType.h b/Gtk4/gtk149_file_exp3/src/GetFileType.h new file mode 100644 index 0000000..442f909 --- /dev/null +++ b/Gtk4/gtk149_file_exp3/src/GetFileType.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +// Check the whether the selected file is directory +// This is a patch for Microsoft Windows +static inline gboolean check_directory(GFileInfo *info) +{ +#ifdef _WIN32 + const char *file_type = g_file_info_get_content_type(info); + if(strncmp(file_type, "inode/directory", strlen("inode/directory")) == 0) + { + return TRUE; + } +#else + if(g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY){ + return TRUE; + } +#endif + // Not a directory, return FALSE + return FALSE; +}