2022-09-02 09:48:52 +00:00
include ( GenerateIconsUtils )
2023-02-21 21:14:22 +00:00
unset ( CMAKE_CXX_CLANG_TIDY )
2022-09-02 09:48:52 +00:00
# generate custom states icons
set ( theme_dir ${ CMAKE_SOURCE_DIR } /theme )
set ( custom_state_icons_path "${theme_dir}/cfapishellext_custom_states" )
set ( CUSTOM_STATE_ICON_LOCKED_PATH "${custom_state_icons_path}/0-locked.svg" )
set ( CUSTOM_STATE_ICON_SHARED_PATH "${custom_state_icons_path}/1-shared.svg" )
foreach ( size IN ITEMS 24;32;40;48;64;128;256;512;1024 )
get_filename_component ( output_icon_name_custom_state_locked ${ CUSTOM_STATE_ICON_LOCKED_PATH } NAME_WLE )
generate_sized_png_from_svg ( ${ CUSTOM_STATE_ICON_LOCKED_PATH } ${ size } OUTPUT_ICON_NAME ${ output_icon_name_custom_state_locked } OUTPUT_ICON_PATH "${custom_state_icons_path}/" )
endforeach ( )
foreach ( size IN ITEMS 24;32;40;48;64;128;256;512;1024 )
get_filename_component ( output_icon_name_custom_state_shared ${ CUSTOM_STATE_ICON_SHARED_PATH } NAME_WLE )
generate_sized_png_from_svg ( ${ CUSTOM_STATE_ICON_SHARED_PATH } ${ size } OUTPUT_ICON_NAME ${ output_icon_name_custom_state_shared } OUTPUT_ICON_PATH "${custom_state_icons_path}/" )
endforeach ( )
# offset is used for referencing icon within the binary's resources (indexing start with 0, while IDI_ICON{i} 'i' starts with 1)
if ( NOT DEFINED CUSTOM_STATE_ICON_INDEX_OFFSET )
set ( CUSTOM_STATE_ICON_INDEX_OFFSET 1 )
endif ( )
2023-06-02 11:55:08 +00:00
# indices used for referencing icon within the binary's resources and .rc file's IDI_ICON{i} entries 'i'
2022-09-02 09:48:52 +00:00
if ( NOT DEFINED CUSTOM_STATE_ICON_LOCKED_INDEX )
set ( CUSTOM_STATE_ICON_LOCKED_INDEX 1 )
endif ( )
if ( NOT DEFINED CUSTOM_STATE_ICON_SHARED_INDEX )
set ( CUSTOM_STATE_ICON_SHARED_INDEX 2 )
endif ( )
file ( GLOB_RECURSE CUSTOM_STATE_ICONS_LOCKED "${custom_state_icons_path}/*-locked.png*" )
get_filename_component ( CUSTOM_STATE_ICON_LOCKED_NAME ${ CUSTOM_STATE_ICON_LOCKED_PATH } NAME_WLE )
ecm_add_app_icon ( CUSTOM_STATE_ICON_LOCKED_OUT ICONS "${CUSTOM_STATE_ICONS_LOCKED}" OUTFILE_BASENAME "${CUSTOM_STATE_ICON_LOCKED_NAME}" DO_NOT_GENERATE_RC_FILE TRUE )
file ( GLOB_RECURSE CUSTOM_STATE_ICONS_SHARED "${custom_state_icons_path}/*-shared.png*" )
get_filename_component ( CUSTOM_STATE_ICON_SHARED_NAME ${ CUSTOM_STATE_ICON_SHARED_PATH } NAME_WLE )
ecm_add_app_icon ( CUSTOM_STATE_ICON_SHARED_OUT ICONS "${CUSTOM_STATE_ICONS_SHARED}" OUTFILE_BASENAME "${CUSTOM_STATE_ICON_SHARED_NAME}" DO_NOT_GENERATE_RC_FILE TRUE )
file ( REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" )
file ( APPEND "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" "IDI_ICON${CUSTOM_STATE_ICON_LOCKED_INDEX} ICON DISCARDABLE \" ${ CMAKE_CURRENT_BINARY_DIR } / ${ CUSTOM_STATE_ICON_LOCKED_NAME } .ico\ "\n" )
file ( APPEND "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" "IDI_ICON${CUSTOM_STATE_ICON_SHARED_INDEX} ICON DISCARDABLE \" ${ CMAKE_CURRENT_BINARY_DIR } / ${ CUSTOM_STATE_ICON_SHARED_NAME } .ico\ "\n" )
add_custom_command (
O U T P U T " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { C F A P I _ S H E L L _ E X T E N S I O N S _ L I B _ N A M E } . r c "
C O M M A N D $ { C M A K E _ C O M M A N D }
A R G S - E c o p y " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { C F A P I _ S H E L L _ E X T E N S I O N S _ L I B _ N A M E } . r c . i n " " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { C F A P I _ S H E L L _ E X T E N S I O N S _ L I B _ N A M E } . r c "
D E P E N D S " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { C U S T O M _ S T A T E _ I C O N _ L O C K E D _ N A M E } . i c o " " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { C U S T O M _ S T A T E _ I C O N _ S H A R E D _ N A M E } . i c o "
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
)
message ( "CUSTOM_STATE_ICON_LOCKED_OUT: ${CUSTOM_STATE_ICON_LOCKED_OUT}" )
message ( "CUSTOM_STATE_ICON_SHARED_OUT: ${CUSTOM_STATE_ICON_SHARED_OUT}" )
#
# Windows SDK command-line tools require native paths
file ( TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" MidleFileFolder )
set ( GeneratedFilesPath "${CMAKE_CURRENT_BINARY_DIR}\\Generated" )
set ( MidlOutputPathHeader "${GeneratedFilesPath}\\CustomStateProvider.g.h" )
set ( MidlOutputPathTlb "${GeneratedFilesPath}\\CustomStateProvider.tlb" )
set ( MidlOutputPathWinmd "${GeneratedFilesPath}\\CustomStateProvider.winmd" )
add_custom_target ( CustomStateProviderImpl
D E P E N D S $ { M i d l O u t p u t P a t h H e a d e r }
)
if ( NOT DEFINED ENV{WindowsSdkDir} )
message ( "Getting WindowsSdkDir from Registry" )
get_filename_component ( WindowsSdkDir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" ABSOLUTE )
else ( )
set ( WindowsSdkDir $ENV{ WindowsSdkDir } )
message ( "Setting WindowsSdkDir from ENV{WindowsSdkDir" )
endif ( )
# we need cmake path to work with subfolders
file ( TO_CMAKE_PATH "${WindowsSdkDir}" WindowsSdkDir )
MACRO ( SUBDIRLIST result curdir )
FILE ( GLOB children RELATIVE ${ curdir } ${ curdir } /* )
SET ( dirlist "" )
FOREACH ( child ${ children } )
IF ( IS_DIRECTORY ${ curdir } / ${ child } )
LIST ( APPEND dirlist ${ child } )
ENDIF ( )
ENDFOREACH ( )
SET ( ${ result } ${ dirlist } )
ENDMACRO ( )
SUBDIRLIST ( WindowsSdkList "${WindowsSdkDir}/bin" )
# pick only dirs that start with 10.0
list ( FILTER WindowsSdkList INCLUDE REGEX "10.0." )
# sort the list of subdirs and choose the latest
list ( SORT WindowsSdkList ORDER ASCENDING )
list ( GET WindowsSdkList -1 WindowsSdkLatest )
message ( "WindowsSdkLatest has been set to: ${WindowsSdkLatest}" )
if ( NOT WindowsSdkLatest )
message ( FATAL_ERROR "Windows SDK not found" )
endif ( )
SUBDIRLIST ( listFoundationContracts "${WindowsSdkDir}/References/${WindowsSdkLatest}/Windows.Foundation.FoundationContract" )
list ( FILTER listFoundationContracts INCLUDE REGEX "[0-9]+\." )
list ( SORT listFoundationContracts ORDER ASCENDING )
list ( GET listFoundationContracts -1 WindowsFoundationContractVersion )
message ( "WindowsFoundationContractVersion has been set to: ${WindowsFoundationContractVersion}" )
if ( NOT WindowsFoundationContractVersion )
message ( FATAL_ERROR "Windows Foundation Contract is not found in ${WindowsSdkLatest} SDK." )
endif ( )
SUBDIRLIST ( listCloudFilesContracts "${WindowsSdkDir}/References/${WindowsSdkLatest}/Windows.Storage.Provider.CloudFilesContract" )
list ( FILTER listCloudFilesContracts INCLUDE REGEX "[0-9]+\." )
list ( SORT listCloudFilesContracts ORDER ASCENDING )
list ( GET listCloudFilesContracts -1 WindowsStorageProviderCloudFilesContractVersion )
message ( "WindowsStorageProviderCloudFilesContractVersion has been set to: ${WindowsStorageProviderCloudFilesContractVersion}" )
if ( NOT WindowsStorageProviderCloudFilesContractVersion )
message ( FATAL_ERROR "Windows Storage Provider Cloud Files Contract is not found in ${WindowsSdkLatest} SDK." )
endif ( )
# we no longer need to work with sub folders, so convert the WindowsSdkDir to native path
file ( TO_NATIVE_PATH ${ WindowsSdkDir } WindowsSdkDir )
message ( "WindowsSdkDir has been set to: ${WindowsSdkDir}" )
message ( "WindowsSdkList has been set to: ${WindowsSdkList}" )
message ( "WindowsSdkLatest has been set to: ${WindowsSdkLatest}" )
set ( TargetPlatform "x64" )
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set ( TargetPlatform "x64" )
elseif ( CMAKE_SIZEOF_VOID_P EQUAL 4 )
set ( TargetPlatform "x86" )
endif ( )
set ( WindowsSDKReferencesPath "${WindowsSdkDir}\\References\\${WindowsSdkLatest}" )
set ( WindowsSDKBinPathForTools "${WindowsSdkDir}\\bin\\${WindowsSdkLatest}\\${TargetPlatform}" )
set ( WindowsSDKMetadataDirectory "${WindowsSdkDir}\\UnionMetadata\\${WindowsSdkLatest}" )
IF ( NOT EXISTS "${WindowsSDKReferencesPath}" OR NOT IS_DIRECTORY "${WindowsSDKReferencesPath}" )
message ( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}" )
ENDIF ( )
IF ( NOT EXISTS "${WindowsSDKBinPathForTools}" OR NOT IS_DIRECTORY "${WindowsSDKBinPathForTools}" )
message ( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}" )
ENDIF ( )
IF ( NOT EXISTS "${WindowsSDKMetadataDirectory}" OR NOT IS_DIRECTORY "${WindowsSDKMetadataDirectory}" )
message ( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}" )
ENDIF ( )
set ( midlExe "${WindowsSDKBinPathForTools}\\midl.exe" )
set ( cppWinRtExe "${WindowsSDKBinPathForTools}\\cppwinrt.exe" )
message ( "cppWinRtExe: ${cppWinRtExe}" )
message ( "midlExe: ${midlExe}" )
# use midl.exe and cppwinrt.exe to generate files for CustomStateProvider (WinRT class)
add_custom_command ( OUTPUT ${ MidlOutputPathHeader }
C O M M A N D $ { m i d l E x e } / w i n r t / h n u l / t l b $ { M i d l O u t p u t P a t h T l b } / w i n m d $ { M i d l O u t p u t P a t h W i n m d } / m e t a d a t a _ d i r " $ { W i n d o w s S D K R e f e r e n c e s P a t h } \ \ W i n d o w s . F o u n d a t i o n . F o u n d a t i o n C o n t r a c t \ \ $ { W i n d o w s F o u n d a t i o n C o n t r a c t V e r s i o n } " / n o m i d l / r e f e r e n c e " $ { W i n d o w s S D K R e f e r e n c e s P a t h } \ \ W i n d o w s . F o u n d a t i o n . F o u n d a t i o n C o n t r a c t \ \ $ { W i n d o w s F o u n d a t i o n C o n t r a c t V e r s i o n } \ \ W i n d o w s . F o u n d a t i o n . F o u n d a t i o n C o n t r a c t . w i n m d " / r e f e r e n c e " $ { W i n d o w s S D K R e f e r e n c e s P a t h } \ \ W i n d o w s . S t o r a g e . P r o v i d e r . C l o u d F i l e s C o n t r a c t \ \ $ { W i n d o w s S t o r a g e P r o v i d e r C l o u d F i l e s C o n t r a c t V e r s i o n } \ \ W i n d o w s . S t o r a g e . P r o v i d e r . C l o u d F i l e s C o n t r a c t . w i n m d " / I $ { M i d l e F i l e F o l d e r } c u s t o m s t a t e p r o v i d e r . i d l
C O M M A N D $ { c p p W i n R t E x e } - i n $ { M i d l O u t p u t P a t h W i n m d } - c o m p $ { G e n e r a t e d F i l e s P a t h } - p c h p c h . h - r e f $ { W i n d o w s S D K M e t a d a t a D i r e c t o r y } - o u t $ { G e n e r a t e d F i l e s P a t h } - v e r b o s e
C O M M E N T " C r e a t i n g g e n e r a t e d f i l e s f r o m c u s t o m s t a t e p r o v i d e r . i d l "
)
2022-07-04 12:36:06 +00:00
add_library ( CfApiShellExtensions MODULE
d l l m a i n . c p p
c f a p i s h e l l i n t e g r a t i o n c l a s s f a c t o r y . c p p
2022-09-02 09:48:52 +00:00
c u s t o m s t a t e p r o v i d e r i p c . c p p
i p c c o m m o n . c p p
2022-07-04 12:36:06 +00:00
t h u m b n a i l p r o v i d e r . c p p
t h u m b n a i l p r o v i d e r i p c . c p p
$ { C M A K E _ S O U R C E _ D I R } / s r c / c o m m o n / s h e l l e x t e n s i o n u t i l s . c p p
2022-09-02 09:48:52 +00:00
c u s t o m s t a t e p r o v i d e r . c p p
2022-07-04 12:36:06 +00:00
C f A p i S h e l l I n t e g r a t i o n . d e f
)
2022-09-02 09:48:52 +00:00
message ( "CUSTOM_STATE_ICON_LOCKED_OUT: ${CUSTOM_STATE_ICON_LOCKED_OUT}" )
message ( "CUSTOM_STATE_ICON_SHARED_OUT: ${CUSTOM_STATE_ICON_SHARED_OUT}" )
if ( CUSTOM_STATE_ICON_LOCKED_OUT AND CUSTOM_STATE_ICON_SHARED_OUT )
message ( "Adding ${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc..." )
target_sources ( CfApiShellExtensions PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc" )
else ( )
message ( WARNING "Could not add ${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc to CfApiShellExtensions. Custom states for Windows Virtual Files won't work." )
endif ( )
2022-07-04 12:36:06 +00:00
2022-09-02 09:48:52 +00:00
add_dependencies ( CfApiShellExtensions CustomStateProviderImpl )
target_link_libraries ( CfApiShellExtensions shlwapi Gdiplus onecoreuap Nextcloud::csync Qt5::Core Qt5::Network )
target_include_directories ( CfApiShellExtensions PRIVATE ${ CMAKE_CURRENT_BINARY_DIR } )
2022-07-04 12:36:06 +00:00
target_include_directories ( CfApiShellExtensions PRIVATE ${ GeneratedFilesPath } )
target_include_directories ( CfApiShellExtensions PRIVATE ${ CMAKE_SOURCE_DIR } )
2022-09-02 09:48:52 +00:00
target_compile_features ( CfApiShellExtensions PRIVATE cxx_std_17 )
2022-07-04 12:36:06 +00:00
set_target_properties ( CfApiShellExtensions
P R O P E R T I E S
L I B R A R Y _ O U T P U T _ N A M E
$ { C F A P I _ S H E L L _ E X T E N S I O N S _ L I B _ N A M E }
R U N T I M E _ O U T P U T _ N A M E
$ { C F A P I _ S H E L L _ E X T E N S I O N S _ L I B _ N A M E }
L I B R A R Y _ O U T P U T _ D I R E C T O R Y
$ { B I N _ O U T P U T _ D I R E C T O R Y }
R U N T I M E _ O U T P U T _ D I R E C T O R Y
$ { B I N _ O U T P U T _ D I R E C T O R Y }
)
install ( TARGETS CfApiShellExtensions
R U N T I M E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ B I N D I R }
L I B R A R Y D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ B I N D I R }
)
2022-09-02 09:48:52 +00:00
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /configvfscfapishellext.h.in ${ CMAKE_CURRENT_BINARY_DIR } /configvfscfapishellext.h )