```
czkawka_cli dup --dryrun -d $(pwd)/folder -m1 -D aen
Found 2 duplicated files in 1 groups with same content which took 2 B:
Size - 2 B (2) - 2 files
/home/thomas/Development/czkawka/folder/a
/home/thomas/Development/czkawka/folder/b
----
-------------------------------MESSAGES--------------------------------
Delete /home/thomas/Development/czkawka/folder/a
Delete /home/thomas/Development/czkawka/folder/b
---------------------------END OF MESSAGES-----------------------------
```
This is a proof of concept.
```
$ echo a > hardlinks/a
$ cp hardlinks/{a,b}
$ ln hardlinks/{a,c}
$ cargo run --bin czkawka_cli dup -m 1 --directories $(pwd)/hardlinks -f /dev/stderr > /dev/null
-------------------------------------------------Files with same hashes-------------------------------------------------
Found 1 duplicated files which in 1 groups which takes 2 B.
---- Size 2 B (2) - 2 files
/home/thomas/Development/czkawka/hardlinks/a
/home/thomas/Development/czkawka/hardlinks/b
```
Open:
- Windows support
- Probably this should be a cli option
* Initial Windows taskbar progress support
* Changes to COM (un)init
It turns out winapi exposes IIDs through a `uuidof()` function of interfaces, so the copied one can be removed.
* Don't return error codes
Now the `TaskbarProgress` functions fail silently.
The `TaskbarProgress` struct now will always be created (even in case of errors in initialisation), but it won't do anything.
* Fix builds for other systems
* Formatted code
* Fix progress shown after the operation finished
A progress update was received after the stop event.
Also `as_ref()` was removed in many places (I don't even know why it was there).
* Remove redundant call to hide
It's already called by the `glib_stop_receiver` receiver.
* Release the ITaskbarList3 and call CoUninitialize at exit
Because objects moved to closures used as fallbacks in GTK have [static lifetimes](https://gtk-rs.org/docs-src/tutorial/closures#closures), the `TaskbarProgress` will never be dropped.
To workaround this problem a `release` function is called when the main window is closed. This function behaves like `drop`, but sets the struct in a valid "empty" state, so that calling `release`/`drop` again won't cause problems.
* Don't set the NORMAL state manually
Because only NOPROGRESS and INDETERMINATE states are used, there is no need to set the NORMAL state when changing the progress value.
Now `set_progress_value` will also change the `TaskbarProgress::current_state` if such situation occurs.
> Unless [SetProgressState](https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setprogressstate)
> has set a blocking state (TBPF_ERROR or TBPF_PAUSED) for the window, a call to **SetProgressValue** assumes the TBPF_NORMAL
> state even if it is not explicitly set. A call to **SetProgressValue** overrides and clears the TBPF_INDETERMINATE state.
See the [SetProgressValue documentation](https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setprogressvalue#how-the-taskbar-button-chooses-the-progress-indicator-for-a-group)
The admin-gtk3-dark-osx theme contains relative symlinks, which after copying only this theme are no longer valid.
The -L (--dereference) option makes cp always follow symbolic links, so that all of them are replaced with files they pointed to.