From 4c64279f9084395f1ddf30bf804876fe5cf77968 Mon Sep 17 00:00:00 2001 From: robshape Date: Sat, 15 Apr 2023 10:36:01 +0200 Subject: [PATCH] build: Merge submodules into repo --- .gitmodules | 6 - other/DinguxCommander | 1 - other/DinguxCommander/.gitignore | 1 + other/DinguxCommander/Makefile | 76 + other/DinguxCommander/README.md | 8 + other/DinguxCommander/README.txt | 82 + other/DinguxCommander/res/Commander-11.ttf | Bin 0 -> 29364 bytes other/DinguxCommander/res/Fiery_Turk.ttf | Bin 0 -> 62788 bytes other/DinguxCommander/res/background.png | Bin 0 -> 713 bytes other/DinguxCommander/res/file.png | Bin 0 -> 353 bytes other/DinguxCommander/res/folder.png | Bin 0 -> 307 bytes other/DinguxCommander/res/icon.png | Bin 0 -> 1238 bytes other/DinguxCommander/res/up.png | Bin 0 -> 272 bytes other/DinguxCommander/src/commander.cpp | 353 ++ other/DinguxCommander/src/commander.h | 54 + other/DinguxCommander/src/def.h | 124 + other/DinguxCommander/src/dialog.cpp | 260 ++ other/DinguxCommander/src/dialog.h | 89 + other/DinguxCommander/src/fileLister.cpp | 115 + other/DinguxCommander/src/fileLister.h | 58 + other/DinguxCommander/src/fileutils.cpp | 356 ++ other/DinguxCommander/src/fileutils.h | 50 + other/DinguxCommander/src/keyboard.cpp | 483 ++ other/DinguxCommander/src/keyboard.h | 79 + other/DinguxCommander/src/main.cpp | 89 + other/DinguxCommander/src/panel.cpp | 339 ++ other/DinguxCommander/src/panel.h | 101 + other/DinguxCommander/src/resourceManager.cpp | 71 + other/DinguxCommander/src/resourceManager.h | 52 + other/DinguxCommander/src/sdlutils.cpp | 322 ++ other/DinguxCommander/src/sdlutils.h | 76 + other/DinguxCommander/src/viewer.cpp | 219 + other/DinguxCommander/src/viewer.h | 69 + other/DinguxCommander/src/window.cpp | 138 + other/DinguxCommander/src/window.h | 58 + src/minarch/libretro-common | 1 - src/minarch/libretro-common/.gitignore | 6 + src/minarch/libretro-common/Makefile.test | 58 + src/minarch/libretro-common/audio/audio_mix.c | 377 ++ .../libretro-common/audio/audio_mixer.c | 1400 ++++++ .../audio/conversion/float_to_s16.c | 178 + .../audio/conversion/float_to_s16_neon.S | 69 + .../audio/conversion/float_to_s16_neon.c | 64 + .../audio/conversion/s16_to_float.c | 205 + .../audio/conversion/s16_to_float_neon.S | 76 + .../audio/conversion/s16_to_float_neon.c | 71 + .../libretro-common/audio/dsp_filter.c | 324 ++ .../audio/dsp_filters/BassBoost.dsp | 11 + .../audio/dsp_filters/ChipTune-Lowpass.dsp | 7 + .../audio/dsp_filters/ChipTuneEnhance.dsp | 22 + .../audio/dsp_filters/Chorus.dsp | 14 + .../audio/dsp_filters/Crystalizer.dsp | 4 + .../libretro-common/audio/dsp_filters/EQ.dsp | 41 + .../audio/dsp_filters/Echo.dsp | 19 + .../audio/dsp_filters/EchoReverb.dsp | 12 + .../audio/dsp_filters/HighShelfDampen.dsp | 6 + .../libretro-common/audio/dsp_filters/IIR.dsp | 22 + .../audio/dsp_filters/LowPassCPS.dsp | 47 + .../audio/dsp_filters/Makefile | 135 + .../audio/dsp_filters/Mono.dsp | 12 + .../audio/dsp_filters/Panning.dsp | 22 + .../audio/dsp_filters/Phaser.dsp | 10 + .../audio/dsp_filters/Reverb.dsp | 9 + .../audio/dsp_filters/Tremolo.dsp | 6 + .../audio/dsp_filters/Vibrato.dsp | 6 + .../audio/dsp_filters/WahWah.dsp | 9 + .../audio/dsp_filters/chorus.c | 160 + .../audio/dsp_filters/configure | 3 + .../audio/dsp_filters/crystalizer.c | 90 + .../libretro-common/audio/dsp_filters/echo.c | 180 + .../libretro-common/audio/dsp_filters/eq.c | 352 ++ .../audio/dsp_filters/fft/fft.c | 204 + .../audio/dsp_filters/fft/fft.h | 44 + .../libretro-common/audio/dsp_filters/iir.c | 371 ++ .../libretro-common/audio/dsp_filters/link.T | 4 + .../audio/dsp_filters/panning.c | 111 + .../audio/dsp_filters/phaser.c | 145 + .../audio/dsp_filters/reverb.c | 318 ++ .../audio/dsp_filters/tremolo.c | 132 + .../audio/dsp_filters/vibrato.c | 167 + .../audio/dsp_filters/wahwah.c | 147 + .../audio/resampler/audio_resampler.c | 189 + .../resampler/drivers/nearest_resampler.c | 84 + .../audio/resampler/drivers/sinc_resampler.c | 1025 +++++ .../resampler/drivers/sinc_resampler_neon.S | 74 + src/minarch/libretro-common/cdrom/cdrom.c | 1745 ++++++++ .../libretro-common/compat/compat_fnmatch.c | 122 + .../libretro-common/compat/compat_getopt.c | 238 + .../libretro-common/compat/compat_ifaddrs.c | 654 +++ .../compat/compat_posix_string.c | 104 + .../libretro-common/compat/compat_snprintf.c | 83 + .../compat/compat_strcasestr.c | 58 + .../libretro-common/compat/compat_strl.c | 62 + .../libretro-common/compat/compat_strldup.c | 33 + .../libretro-common/compat/compat_vscprintf.c | 44 + .../libretro-common/compat/fopen_utf8.c | 64 + .../libretro-common/crt/include/string.h | 10 + src/minarch/libretro-common/crt/string.c | 34 + src/minarch/libretro-common/dynamic/dylib.c | 225 + .../encodings/encoding_base64.c | 183 + .../encodings/encoding_crc32.c | 91 + .../libretro-common/encodings/encoding_utf.c | 532 +++ .../libretro-common/features/features_cpu.c | 919 ++++ .../libretro-common/file/archive_file.c | 734 +++ .../libretro-common/file/archive_file_7z.c | 526 +++ .../libretro-common/file/archive_file_zlib.c | 571 +++ .../libretro-common/file/config_file.c | 1515 +++++++ .../file/config_file_userdata.c | 171 + src/minarch/libretro-common/file/file_path.c | 1426 ++++++ .../libretro-common/file/file_path_io.c | 150 + .../libretro-common/file/nbio/nbio_intf.c | 103 + .../libretro-common/file/nbio/nbio_linux.c | 235 + .../libretro-common/file/nbio/nbio_orbis.c | 231 + .../libretro-common/file/nbio/nbio_stdio.c | 303 ++ .../libretro-common/file/nbio/nbio_unixmmap.c | 184 + .../file/nbio/nbio_windowsmmap.c | 237 + .../libretro-common/file/retro_dirent.c | 122 + .../libretro-common/formats/bmp/rbmp.c | 785 ++++ .../libretro-common/formats/bmp/rbmp_encode.c | 237 + .../libretro-common/formats/cdfs/cdfs.c | 651 +++ .../libretro-common/formats/image_texture.c | 333 ++ .../libretro-common/formats/image_transfer.c | 285 ++ .../libretro-common/formats/jpeg/rjpeg.c | 2635 +++++++++++ .../libretro-common/formats/json/rjson.c | 1447 ++++++ .../formats/libchdr/libchdr_bitstream.c | 119 + .../formats/libchdr/libchdr_cdrom.c | 417 ++ .../formats/libchdr/libchdr_chd.c | 1935 ++++++++ .../formats/libchdr/libchdr_flac.c | 324 ++ .../formats/libchdr/libchdr_flac_codec.c | 163 + .../formats/libchdr/libchdr_huffman.c | 563 +++ .../formats/libchdr/libchdr_lzma.c | 366 ++ .../formats/libchdr/libchdr_zlib.c | 313 ++ .../formats/logiqx_dat/logiqx_dat.c | 457 ++ .../libretro-common/formats/m3u/m3u_file.c | 633 +++ .../libretro-common/formats/png/rpng.c | 1255 ++++++ .../libretro-common/formats/png/rpng_encode.c | 448 ++ .../formats/png/rpng_internal.h | 49 + .../libretro-common/formats/tga/rtga.c | 474 ++ .../libretro-common/formats/wav/rwav.c | 187 + .../libretro-common/formats/xml/rxml.c | 321 ++ .../libretro-common/formats/xml/test/Makefile | 28 + .../formats/xml/test/rxml_test.c | 66 + .../libretro-common/gfx/gl_capabilities.c | 335 ++ .../libretro-common/gfx/scaler/pixconv.c | 1043 +++++ .../libretro-common/gfx/scaler/scaler.c | 359 ++ .../gfx/scaler/scaler_filter.c | 246 ++ .../libretro-common/gfx/scaler/scaler_int.c | 261 ++ src/minarch/libretro-common/glsym/README.md | 11 + src/minarch/libretro-common/glsym/glgen.py | 155 + src/minarch/libretro-common/glsym/glsym_es2.c | 409 ++ src/minarch/libretro-common/glsym/glsym_es3.c | 413 ++ src/minarch/libretro-common/glsym/glsym_gl.c | 2541 +++++++++++ src/minarch/libretro-common/glsym/rglgen.c | 45 + src/minarch/libretro-common/glsym/rglgen.py | 147 + src/minarch/libretro-common/glsym/xglgen.py | 156 + src/minarch/libretro-common/hash/lrc_hash.c | 576 +++ .../libretro-common/include/array/rbuf.h | 120 + .../libretro-common/include/array/rhmap.h | 285 ++ .../libretro-common/include/audio/audio_mix.h | 94 + .../include/audio/audio_mixer.h | 90 + .../include/audio/audio_resampler.h | 194 + .../include/audio/conversion/float_to_s16.h | 55 + .../include/audio/conversion/s16_to_float.h | 55 + .../include/audio/dsp_filter.h | 52 + src/minarch/libretro-common/include/boolean.h | 39 + .../libretro-common/include/cdrom/cdrom.h | 125 + .../libretro-common/include/clamping.h | 65 + .../include/compat/apple_compat.h | 84 + .../libretro-common/include/compat/fnmatch.h | 30 + .../include/compat/fopen_utf8.h | 34 + .../libretro-common/include/compat/getopt.h | 74 + .../libretro-common/include/compat/ifaddrs.h | 53 + .../include/compat/intrinsics.h | 99 + .../libretro-common/include/compat/msvc.h | 126 + .../include/compat/msvc/stdint.h | 255 ++ .../include/compat/posix_string.h | 60 + .../include/compat/strcasestr.h | 48 + .../libretro-common/include/compat/strl.h | 59 + .../libretro-common/include/compat/zconf.h | 483 ++ .../libretro-common/include/compat/zconf.h.in | 483 ++ .../libretro-common/include/compat/zlib.h | 1772 ++++++++ .../include/compat/zlib/zconf.h | 483 ++ .../include/compat/zlib/zconf.h.in | 483 ++ .../include/compat/zlib/zlib.h | 1761 ++++++++ .../include/compat/zlib/zutil.h | 253 ++ .../libretro-common/include/compat/zutil.h | 253 ++ .../include/defines/cocoa_defines.h | 76 + .../include/defines/d3d_defines.h | 92 + .../include/defines/gx_defines.h | 96 + .../include/defines/ps3_defines.h | 727 +++ .../include/defines/ps4_defines.h | 46 + .../include/defines/psp_defines.h | 145 + .../libretro-common/include/dynamic/dylib.h | 71 + .../include/encodings/base64.h | 16 + .../libretro-common/include/encodings/crc32.h | 37 + .../libretro-common/include/encodings/utf.h | 137 + .../libretro-common/include/encodings/win32.h | 63 + src/minarch/libretro-common/include/fastcpy.h | 93 + .../include/features/features_cpu.h | 75 + .../include/file/archive_file.h | 210 + .../include/file/config_file.h | 330 ++ .../include/file/config_file_userdata.h | 64 + .../libretro-common/include/file/file_path.h | 679 +++ .../libretro-common/include/file/nbio.h | 124 + src/minarch/libretro-common/include/filters.h | 103 + .../libretro-common/include/formats/cdfs.h | 113 + .../libretro-common/include/formats/image.h | 102 + .../include/formats/logiqx_dat.h | 107 + .../include/formats/m3u_file.h | 122 + .../libretro-common/include/formats/rbmp.h | 66 + .../libretro-common/include/formats/rjpeg.h | 48 + .../libretro-common/include/formats/rjson.h | 234 + .../include/formats/rjson_helpers.h | 76 + .../libretro-common/include/formats/rpng.h | 64 + .../libretro-common/include/formats/rtga.h | 48 + .../libretro-common/include/formats/rwav.h | 87 + .../libretro-common/include/formats/rxml.h | 69 + .../include/gfx/gl_capabilities.h | 68 + .../include/gfx/math/matrix_3x3.h | 253 ++ .../include/gfx/math/matrix_4x4.h | 395 ++ .../include/gfx/math/vector_2.h | 138 + .../include/gfx/math/vector_3.h | 68 + .../include/gfx/math/vector_4.h | 61 + .../include/gfx/scaler/filter.h | 37 + .../include/gfx/scaler/pixconv.h | 110 + .../include/gfx/scaler/scaler.h | 128 + .../include/gfx/scaler/scaler_int.h | 46 + .../libretro-common/include/gfx/video_frame.h | 220 + .../libretro-common/include/glsym/glsym.h | 45 + .../libretro-common/include/glsym/glsym_es2.h | 639 +++ .../libretro-common/include/glsym/glsym_es3.h | 650 +++ .../libretro-common/include/glsym/glsym_gl.h | 3140 +++++++++++++ .../libretro-common/include/glsym/rglgen.h | 46 + .../include/glsym/rglgen_headers.h | 53 + .../include/glsym/rglgen_private_headers.h | 76 + .../include/glsym/switch/nx_gl.h | 848 ++++ .../include/glsym/switch/nx_glsym.h | 928 ++++ .../include/libchdr/bitstream.h | 42 + .../libretro-common/include/libchdr/cdrom.h | 69 + .../libretro-common/include/libchdr/chd.h | 397 ++ .../include/libchdr/coretypes.h | 22 + .../libretro-common/include/libchdr/flac.h | 70 + .../libretro-common/include/libchdr/huffman.h | 89 + .../include/libchdr/libchdr_zlib.h | 69 + .../libretro-common/include/libchdr/lzma.h | 73 + .../libretro-common/include/libchdr/minmax.h | 21 + src/minarch/libretro-common/include/libco.h | 79 + .../libretro-common/include/libretro.h | 3935 +++++++++++++++++ .../libretro-common/include/libretro_d3d.h | 59 + .../include/libretro_dspfilter.h | 187 + .../include/libretro_gskit_ps2.h | 66 + .../libretro-common/include/libretro_vulkan.h | 397 ++ .../libretro-common/include/lists/dir_list.h | 100 + .../libretro-common/include/lists/file_list.h | 117 + .../include/lists/linked_list.h | 298 ++ .../include/lists/nested_list.h | 242 + .../include/lists/string_list.h | 205 + .../libretro-common/include/lrc_hash.h | 95 + .../libretro-common/include/math/complex.h | 77 + .../include/math/float_minmax.h | 61 + .../libretro-common/include/math/fxp.h | 61 + .../include/media/media_detect_cd.h | 61 + .../libretro-common/include/memalign.h | 40 + src/minarch/libretro-common/include/memmap.h | 52 + .../libretro-common/include/net/net_compat.h | 421 ++ .../libretro-common/include/net/net_http.h | 131 + .../include/net/net_http_parse.h | 53 + .../libretro-common/include/net/net_ifinfo.h | 54 + .../libretro-common/include/net/net_socket.h | 118 + .../include/net/net_socket_ssl.h | 50 + .../include/playlists/label_sanitization.h | 42 + .../include/queues/fifo_queue.h | 75 + .../include/queues/generic_queue.h | 208 + .../include/queues/message_queue.h | 156 + .../include/queues/task_queue.h | 262 ++ .../libretro-common/include/retro_assert.h | 35 + .../libretro-common/include/retro_common.h | 36 + .../include/retro_common_api.h | 119 + .../libretro-common/include/retro_dirent.h | 77 + .../include/retro_endianness.h | 579 +++ .../include/retro_environment.h | 114 + .../libretro-common/include/retro_inline.h | 39 + .../libretro-common/include/retro_math.h | 190 + .../include/retro_miscellaneous.h | 207 + .../libretro-common/include/retro_stat.h | 63 + .../libretro-common/include/retro_timers.h | 112 + .../include/rthreads/async_job.h | 35 + .../include/rthreads/rthreads.h | 269 ++ .../libretro-common/include/rthreads/tpool.h | 96 + .../include/streams/chd_stream.h | 68 + .../include/streams/file_stream.h | 142 + .../include/streams/file_stream_transforms.h | 101 + .../include/streams/interface_stream.h | 132 + .../include/streams/memory_stream.h | 63 + .../include/streams/network_stream.h | 267 ++ .../include/streams/rzip_stream.h | 188 + .../include/streams/stdin_stream.h | 39 + .../include/streams/trans_stream.h | 106 + .../include/string/stdstring.h | 387 ++ .../libretro-common/include/time/rtime.h | 48 + .../libretro-common/include/utils/md5.h | 51 + src/minarch/libretro-common/include/vfs/vfs.h | 111 + .../include/vfs/vfs_implementation.h | 82 + .../include/vfs/vfs_implementation_cdrom.h | 52 + .../include/vulkan/vulkan_symbol_wrapper.h | 345 ++ src/minarch/libretro-common/libco/aarch64.c | 128 + src/minarch/libretro-common/libco/amd64.c | 223 + src/minarch/libretro-common/libco/armeabi.c | 109 + src/minarch/libretro-common/libco/fiber.c | 71 + src/minarch/libretro-common/libco/genode.cpp | 29 + src/minarch/libretro-common/libco/libco.c | 45 + src/minarch/libretro-common/libco/ppc.c | 407 ++ src/minarch/libretro-common/libco/ps2.c | 66 + src/minarch/libretro-common/libco/ps3.S | 55 + src/minarch/libretro-common/libco/psp1.c | 41 + src/minarch/libretro-common/libco/psp2.c | 113 + src/minarch/libretro-common/libco/scefiber.c | 96 + src/minarch/libretro-common/libco/sjlj.c | 115 + src/minarch/libretro-common/libco/ucontext.c | 81 + src/minarch/libretro-common/libco/x86.c | 117 + src/minarch/libretro-common/lists/dir_list.c | 280 ++ src/minarch/libretro-common/lists/file_list.c | 353 ++ .../libretro-common/lists/linked_list.c | 479 ++ .../libretro-common/lists/nested_list.c | 613 +++ .../libretro-common/lists/string_list.c | 539 +++ .../libretro-common/lists/vector_list.c | 95 + .../libretro-common/media/media_detect_cd.c | 570 +++ src/minarch/libretro-common/memmap/memalign.c | 63 + src/minarch/libretro-common/memmap/memmap.c | 163 + src/minarch/libretro-common/net/net_compat.c | 639 +++ src/minarch/libretro-common/net/net_http.c | 1222 +++++ .../libretro-common/net/net_http_parse.c | 86 + src/minarch/libretro-common/net/net_ifinfo.c | 427 ++ src/minarch/libretro-common/net/net_socket.c | 852 ++++ .../libretro-common/net/net_socket_ssl_bear.c | 381 ++ .../libretro-common/net/net_socket_ssl_mbed.c | 290 ++ .../playlists/label_sanitization.c | 209 + .../libretro-common/queues/fifo_queue.c | 126 + .../libretro-common/queues/generic_queue.c | 303 ++ .../libretro-common/queues/message_queue.c | 351 ++ .../libretro-common/queues/task_queue.c | 997 +++++ .../libretro-common/rthreads/ctr_pthread.h | 326 ++ .../libretro-common/rthreads/gx_pthread.h | 186 + .../libretro-common/rthreads/psp_pthread.h | 305 ++ .../libretro-common/rthreads/rthreads.c | 933 ++++ src/minarch/libretro-common/rthreads/tpool.c | 268 ++ .../libretro-common/rthreads/wiiu_pthread.h | 167 + .../rthreads/xenon_sdl_threads.c | 58 + .../samples/compat/fnmatch/Makefile | 24 + .../compat/fnmatch/compat_fnmatch_test.c | 58 + .../samples/compat/snprintf/Makefile | 25 + .../samples/compat/snprintf/snprintf_test.c | 51 + .../samples/compat/strl/Makefile | 25 + .../samples/compat/strl/strl_test.c | 54 + .../samples/core_options/README.md | 59 + .../conversion_scripts/core_option_regex.py | 80 + .../conversion_scripts/v1_to_v2_converter.py | 419 ++ .../libretro_core_options.h | 458 ++ .../libretro_core_options_intl.h | 157 + .../example_default/libretro_core_options.h | 291 ++ .../libretro_core_options_intl.h | 90 + .../libretro_core_options.h | 317 ++ .../libretro_core_options_intl.h | 90 + .../libretro_core_options.h | 290 ++ .../libretro_core_options_intl.h | 125 + .../.github/workflows/crowdin_intl.yml | 41 + .../.github/workflows/crowdin_prep.yml | 41 + .../translation scripts/crowdin.yml | 3 + .../translation scripts/instructions.txt | 47 + .../translation scripts/intl/.gitignore | 1 + .../intl/core_opt_translation.py | 609 +++ .../intl/core_option_regex.py | 95 + .../translation scripts/intl/crowdin_intl.py | 43 + .../translation scripts/intl/crowdin_prep.py | 34 + .../intl/v1_to_v2_converter.py | 459 ++ .../samples/file/config_file/Makefile | 36 + .../file/config_file/config_file_test.c | 78 + .../samples/file/nbio/Makefile | 31 + .../samples/file/nbio/nbio_test.c | 69 + .../samples/formats/png/Makefile | 60 + .../samples/formats/png/rpng_test.c | 207 + .../samples/formats/xml/Makefile | 32 + .../samples/formats/xml/rxml_test.c | 66 + .../libretro-common/samples/net/Makefile | 80 + .../libretro-common/samples/net/http_test | Bin 0 -> 20464 bytes .../samples/net/net_http_parse_test.c | 39 + .../samples/net/net_http_test.c | 56 + .../libretro-common/samples/net/net_ifinfo | Bin 0 -> 8888 bytes .../samples/net/net_ifinfo_test.c | 45 + .../libretro-common/samples/net/udp-test.c | 55 + .../samples/streams/rzip/Makefile | 102 + .../samples/streams/rzip/rzip.c | 362 ++ .../libretro-common/samples/utils/Makefile | 113 + .../libretro-common/samples/utils/crc32.c | 43 + .../libretro-common/samples/utils/md5_test.c | 85 + .../libretro-common/samples/utils/sha1_main.c | 189 + .../libretro-common/streams/chd_stream.c | 470 ++ .../libretro-common/streams/file_stream.c | 660 +++ .../streams/file_stream_transforms.c | 195 + .../streams/interface_stream.c | 806 ++++ .../libretro-common/streams/memory_stream.c | 191 + .../libretro-common/streams/network_stream.c | 329 ++ .../libretro-common/streams/rzip_stream.c | 1069 +++++ .../libretro-common/streams/stdin_stream.c | 151 + .../libretro-common/streams/trans_stream.c | 92 + .../streams/trans_stream_pipe.c | 111 + .../streams/trans_stream_zlib.c | 330 ++ .../libretro-common/string/stdstring.c | 728 +++ .../libretro-common/test/hash/test_hash.c | 86 + .../test/lists/test_linked_list.c | 1300 ++++++ .../test/queues/test_generic_queue.c | 410 ++ .../test/string/test_stdstring.c | 321 ++ .../libretro-common/test/utils/test_utils.c | 159 + src/minarch/libretro-common/time/rtime.c | 81 + .../utils/debugbreak/debugbreak.c | 92 + src/minarch/libretro-common/utils/djb2.c | 26 + src/minarch/libretro-common/utils/md5.c | 295 ++ src/minarch/libretro-common/utils/sha1.c | 419 ++ .../libretro-common/vfs/vfs_implementation.c | 1195 +++++ .../vfs/vfs_implementation_cdrom.c | 495 +++ .../vfs/vfs_implementation_uwp.cpp | 809 ++++ .../vulkan/vulkan_symbol_wrapper.c | 480 ++ 422 files changed, 106715 insertions(+), 8 deletions(-) delete mode 100644 .gitmodules delete mode 160000 other/DinguxCommander create mode 100644 other/DinguxCommander/.gitignore create mode 100644 other/DinguxCommander/Makefile create mode 100644 other/DinguxCommander/README.md create mode 100644 other/DinguxCommander/README.txt create mode 100644 other/DinguxCommander/res/Commander-11.ttf create mode 100644 other/DinguxCommander/res/Fiery_Turk.ttf create mode 100644 other/DinguxCommander/res/background.png create mode 100644 other/DinguxCommander/res/file.png create mode 100644 other/DinguxCommander/res/folder.png create mode 100644 other/DinguxCommander/res/icon.png create mode 100644 other/DinguxCommander/res/up.png create mode 100644 other/DinguxCommander/src/commander.cpp create mode 100644 other/DinguxCommander/src/commander.h create mode 100644 other/DinguxCommander/src/def.h create mode 100644 other/DinguxCommander/src/dialog.cpp create mode 100644 other/DinguxCommander/src/dialog.h create mode 100644 other/DinguxCommander/src/fileLister.cpp create mode 100644 other/DinguxCommander/src/fileLister.h create mode 100644 other/DinguxCommander/src/fileutils.cpp create mode 100644 other/DinguxCommander/src/fileutils.h create mode 100644 other/DinguxCommander/src/keyboard.cpp create mode 100644 other/DinguxCommander/src/keyboard.h create mode 100644 other/DinguxCommander/src/main.cpp create mode 100644 other/DinguxCommander/src/panel.cpp create mode 100644 other/DinguxCommander/src/panel.h create mode 100644 other/DinguxCommander/src/resourceManager.cpp create mode 100644 other/DinguxCommander/src/resourceManager.h create mode 100644 other/DinguxCommander/src/sdlutils.cpp create mode 100644 other/DinguxCommander/src/sdlutils.h create mode 100644 other/DinguxCommander/src/viewer.cpp create mode 100644 other/DinguxCommander/src/viewer.h create mode 100644 other/DinguxCommander/src/window.cpp create mode 100644 other/DinguxCommander/src/window.h delete mode 160000 src/minarch/libretro-common create mode 100644 src/minarch/libretro-common/.gitignore create mode 100644 src/minarch/libretro-common/Makefile.test create mode 100644 src/minarch/libretro-common/audio/audio_mix.c create mode 100644 src/minarch/libretro-common/audio/audio_mixer.c create mode 100644 src/minarch/libretro-common/audio/conversion/float_to_s16.c create mode 100644 src/minarch/libretro-common/audio/conversion/float_to_s16_neon.S create mode 100644 src/minarch/libretro-common/audio/conversion/float_to_s16_neon.c create mode 100644 src/minarch/libretro-common/audio/conversion/s16_to_float.c create mode 100644 src/minarch/libretro-common/audio/conversion/s16_to_float_neon.S create mode 100644 src/minarch/libretro-common/audio/conversion/s16_to_float_neon.c create mode 100644 src/minarch/libretro-common/audio/dsp_filter.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/BassBoost.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/ChipTune-Lowpass.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/ChipTuneEnhance.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Chorus.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Crystalizer.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/EQ.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Echo.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/EchoReverb.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/HighShelfDampen.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/IIR.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/LowPassCPS.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Makefile create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Mono.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Panning.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Phaser.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Reverb.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Tremolo.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/Vibrato.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/WahWah.dsp create mode 100644 src/minarch/libretro-common/audio/dsp_filters/chorus.c create mode 100755 src/minarch/libretro-common/audio/dsp_filters/configure create mode 100644 src/minarch/libretro-common/audio/dsp_filters/crystalizer.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/echo.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/eq.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/fft/fft.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/fft/fft.h create mode 100644 src/minarch/libretro-common/audio/dsp_filters/iir.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/link.T create mode 100644 src/minarch/libretro-common/audio/dsp_filters/panning.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/phaser.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/reverb.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/tremolo.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/vibrato.c create mode 100644 src/minarch/libretro-common/audio/dsp_filters/wahwah.c create mode 100644 src/minarch/libretro-common/audio/resampler/audio_resampler.c create mode 100644 src/minarch/libretro-common/audio/resampler/drivers/nearest_resampler.c create mode 100644 src/minarch/libretro-common/audio/resampler/drivers/sinc_resampler.c create mode 100644 src/minarch/libretro-common/audio/resampler/drivers/sinc_resampler_neon.S create mode 100644 src/minarch/libretro-common/cdrom/cdrom.c create mode 100644 src/minarch/libretro-common/compat/compat_fnmatch.c create mode 100644 src/minarch/libretro-common/compat/compat_getopt.c create mode 100644 src/minarch/libretro-common/compat/compat_ifaddrs.c create mode 100644 src/minarch/libretro-common/compat/compat_posix_string.c create mode 100644 src/minarch/libretro-common/compat/compat_snprintf.c create mode 100644 src/minarch/libretro-common/compat/compat_strcasestr.c create mode 100644 src/minarch/libretro-common/compat/compat_strl.c create mode 100644 src/minarch/libretro-common/compat/compat_strldup.c create mode 100644 src/minarch/libretro-common/compat/compat_vscprintf.c create mode 100644 src/minarch/libretro-common/compat/fopen_utf8.c create mode 100644 src/minarch/libretro-common/crt/include/string.h create mode 100644 src/minarch/libretro-common/crt/string.c create mode 100644 src/minarch/libretro-common/dynamic/dylib.c create mode 100644 src/minarch/libretro-common/encodings/encoding_base64.c create mode 100644 src/minarch/libretro-common/encodings/encoding_crc32.c create mode 100644 src/minarch/libretro-common/encodings/encoding_utf.c create mode 100644 src/minarch/libretro-common/features/features_cpu.c create mode 100644 src/minarch/libretro-common/file/archive_file.c create mode 100644 src/minarch/libretro-common/file/archive_file_7z.c create mode 100644 src/minarch/libretro-common/file/archive_file_zlib.c create mode 100644 src/minarch/libretro-common/file/config_file.c create mode 100644 src/minarch/libretro-common/file/config_file_userdata.c create mode 100644 src/minarch/libretro-common/file/file_path.c create mode 100644 src/minarch/libretro-common/file/file_path_io.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_intf.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_linux.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_orbis.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_stdio.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_unixmmap.c create mode 100644 src/minarch/libretro-common/file/nbio/nbio_windowsmmap.c create mode 100644 src/minarch/libretro-common/file/retro_dirent.c create mode 100644 src/minarch/libretro-common/formats/bmp/rbmp.c create mode 100644 src/minarch/libretro-common/formats/bmp/rbmp_encode.c create mode 100644 src/minarch/libretro-common/formats/cdfs/cdfs.c create mode 100644 src/minarch/libretro-common/formats/image_texture.c create mode 100644 src/minarch/libretro-common/formats/image_transfer.c create mode 100644 src/minarch/libretro-common/formats/jpeg/rjpeg.c create mode 100644 src/minarch/libretro-common/formats/json/rjson.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_bitstream.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_cdrom.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_chd.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_flac.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_flac_codec.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_huffman.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_lzma.c create mode 100644 src/minarch/libretro-common/formats/libchdr/libchdr_zlib.c create mode 100644 src/minarch/libretro-common/formats/logiqx_dat/logiqx_dat.c create mode 100644 src/minarch/libretro-common/formats/m3u/m3u_file.c create mode 100644 src/minarch/libretro-common/formats/png/rpng.c create mode 100644 src/minarch/libretro-common/formats/png/rpng_encode.c create mode 100644 src/minarch/libretro-common/formats/png/rpng_internal.h create mode 100644 src/minarch/libretro-common/formats/tga/rtga.c create mode 100644 src/minarch/libretro-common/formats/wav/rwav.c create mode 100644 src/minarch/libretro-common/formats/xml/rxml.c create mode 100644 src/minarch/libretro-common/formats/xml/test/Makefile create mode 100644 src/minarch/libretro-common/formats/xml/test/rxml_test.c create mode 100644 src/minarch/libretro-common/gfx/gl_capabilities.c create mode 100644 src/minarch/libretro-common/gfx/scaler/pixconv.c create mode 100644 src/minarch/libretro-common/gfx/scaler/scaler.c create mode 100644 src/minarch/libretro-common/gfx/scaler/scaler_filter.c create mode 100644 src/minarch/libretro-common/gfx/scaler/scaler_int.c create mode 100644 src/minarch/libretro-common/glsym/README.md create mode 100755 src/minarch/libretro-common/glsym/glgen.py create mode 100644 src/minarch/libretro-common/glsym/glsym_es2.c create mode 100644 src/minarch/libretro-common/glsym/glsym_es3.c create mode 100644 src/minarch/libretro-common/glsym/glsym_gl.c create mode 100644 src/minarch/libretro-common/glsym/rglgen.c create mode 100755 src/minarch/libretro-common/glsym/rglgen.py create mode 100644 src/minarch/libretro-common/glsym/xglgen.py create mode 100644 src/minarch/libretro-common/hash/lrc_hash.c create mode 100644 src/minarch/libretro-common/include/array/rbuf.h create mode 100644 src/minarch/libretro-common/include/array/rhmap.h create mode 100644 src/minarch/libretro-common/include/audio/audio_mix.h create mode 100644 src/minarch/libretro-common/include/audio/audio_mixer.h create mode 100644 src/minarch/libretro-common/include/audio/audio_resampler.h create mode 100644 src/minarch/libretro-common/include/audio/conversion/float_to_s16.h create mode 100644 src/minarch/libretro-common/include/audio/conversion/s16_to_float.h create mode 100644 src/minarch/libretro-common/include/audio/dsp_filter.h create mode 100644 src/minarch/libretro-common/include/boolean.h create mode 100644 src/minarch/libretro-common/include/cdrom/cdrom.h create mode 100644 src/minarch/libretro-common/include/clamping.h create mode 100644 src/minarch/libretro-common/include/compat/apple_compat.h create mode 100644 src/minarch/libretro-common/include/compat/fnmatch.h create mode 100644 src/minarch/libretro-common/include/compat/fopen_utf8.h create mode 100644 src/minarch/libretro-common/include/compat/getopt.h create mode 100644 src/minarch/libretro-common/include/compat/ifaddrs.h create mode 100644 src/minarch/libretro-common/include/compat/intrinsics.h create mode 100644 src/minarch/libretro-common/include/compat/msvc.h create mode 100644 src/minarch/libretro-common/include/compat/msvc/stdint.h create mode 100644 src/minarch/libretro-common/include/compat/posix_string.h create mode 100644 src/minarch/libretro-common/include/compat/strcasestr.h create mode 100644 src/minarch/libretro-common/include/compat/strl.h create mode 100644 src/minarch/libretro-common/include/compat/zconf.h create mode 100644 src/minarch/libretro-common/include/compat/zconf.h.in create mode 100644 src/minarch/libretro-common/include/compat/zlib.h create mode 100644 src/minarch/libretro-common/include/compat/zlib/zconf.h create mode 100644 src/minarch/libretro-common/include/compat/zlib/zconf.h.in create mode 100644 src/minarch/libretro-common/include/compat/zlib/zlib.h create mode 100644 src/minarch/libretro-common/include/compat/zlib/zutil.h create mode 100644 src/minarch/libretro-common/include/compat/zutil.h create mode 100644 src/minarch/libretro-common/include/defines/cocoa_defines.h create mode 100644 src/minarch/libretro-common/include/defines/d3d_defines.h create mode 100644 src/minarch/libretro-common/include/defines/gx_defines.h create mode 100644 src/minarch/libretro-common/include/defines/ps3_defines.h create mode 100644 src/minarch/libretro-common/include/defines/ps4_defines.h create mode 100644 src/minarch/libretro-common/include/defines/psp_defines.h create mode 100644 src/minarch/libretro-common/include/dynamic/dylib.h create mode 100644 src/minarch/libretro-common/include/encodings/base64.h create mode 100644 src/minarch/libretro-common/include/encodings/crc32.h create mode 100644 src/minarch/libretro-common/include/encodings/utf.h create mode 100644 src/minarch/libretro-common/include/encodings/win32.h create mode 100644 src/minarch/libretro-common/include/fastcpy.h create mode 100644 src/minarch/libretro-common/include/features/features_cpu.h create mode 100644 src/minarch/libretro-common/include/file/archive_file.h create mode 100644 src/minarch/libretro-common/include/file/config_file.h create mode 100644 src/minarch/libretro-common/include/file/config_file_userdata.h create mode 100644 src/minarch/libretro-common/include/file/file_path.h create mode 100644 src/minarch/libretro-common/include/file/nbio.h create mode 100644 src/minarch/libretro-common/include/filters.h create mode 100644 src/minarch/libretro-common/include/formats/cdfs.h create mode 100644 src/minarch/libretro-common/include/formats/image.h create mode 100644 src/minarch/libretro-common/include/formats/logiqx_dat.h create mode 100644 src/minarch/libretro-common/include/formats/m3u_file.h create mode 100644 src/minarch/libretro-common/include/formats/rbmp.h create mode 100644 src/minarch/libretro-common/include/formats/rjpeg.h create mode 100644 src/minarch/libretro-common/include/formats/rjson.h create mode 100644 src/minarch/libretro-common/include/formats/rjson_helpers.h create mode 100644 src/minarch/libretro-common/include/formats/rpng.h create mode 100644 src/minarch/libretro-common/include/formats/rtga.h create mode 100644 src/minarch/libretro-common/include/formats/rwav.h create mode 100644 src/minarch/libretro-common/include/formats/rxml.h create mode 100644 src/minarch/libretro-common/include/gfx/gl_capabilities.h create mode 100644 src/minarch/libretro-common/include/gfx/math/matrix_3x3.h create mode 100644 src/minarch/libretro-common/include/gfx/math/matrix_4x4.h create mode 100644 src/minarch/libretro-common/include/gfx/math/vector_2.h create mode 100644 src/minarch/libretro-common/include/gfx/math/vector_3.h create mode 100644 src/minarch/libretro-common/include/gfx/math/vector_4.h create mode 100644 src/minarch/libretro-common/include/gfx/scaler/filter.h create mode 100644 src/minarch/libretro-common/include/gfx/scaler/pixconv.h create mode 100644 src/minarch/libretro-common/include/gfx/scaler/scaler.h create mode 100644 src/minarch/libretro-common/include/gfx/scaler/scaler_int.h create mode 100644 src/minarch/libretro-common/include/gfx/video_frame.h create mode 100644 src/minarch/libretro-common/include/glsym/glsym.h create mode 100644 src/minarch/libretro-common/include/glsym/glsym_es2.h create mode 100644 src/minarch/libretro-common/include/glsym/glsym_es3.h create mode 100644 src/minarch/libretro-common/include/glsym/glsym_gl.h create mode 100644 src/minarch/libretro-common/include/glsym/rglgen.h create mode 100644 src/minarch/libretro-common/include/glsym/rglgen_headers.h create mode 100644 src/minarch/libretro-common/include/glsym/rglgen_private_headers.h create mode 100644 src/minarch/libretro-common/include/glsym/switch/nx_gl.h create mode 100644 src/minarch/libretro-common/include/glsym/switch/nx_glsym.h create mode 100644 src/minarch/libretro-common/include/libchdr/bitstream.h create mode 100644 src/minarch/libretro-common/include/libchdr/cdrom.h create mode 100644 src/minarch/libretro-common/include/libchdr/chd.h create mode 100644 src/minarch/libretro-common/include/libchdr/coretypes.h create mode 100644 src/minarch/libretro-common/include/libchdr/flac.h create mode 100644 src/minarch/libretro-common/include/libchdr/huffman.h create mode 100644 src/minarch/libretro-common/include/libchdr/libchdr_zlib.h create mode 100644 src/minarch/libretro-common/include/libchdr/lzma.h create mode 100644 src/minarch/libretro-common/include/libchdr/minmax.h create mode 100644 src/minarch/libretro-common/include/libco.h create mode 100644 src/minarch/libretro-common/include/libretro.h create mode 100644 src/minarch/libretro-common/include/libretro_d3d.h create mode 100644 src/minarch/libretro-common/include/libretro_dspfilter.h create mode 100644 src/minarch/libretro-common/include/libretro_gskit_ps2.h create mode 100644 src/minarch/libretro-common/include/libretro_vulkan.h create mode 100644 src/minarch/libretro-common/include/lists/dir_list.h create mode 100644 src/minarch/libretro-common/include/lists/file_list.h create mode 100644 src/minarch/libretro-common/include/lists/linked_list.h create mode 100644 src/minarch/libretro-common/include/lists/nested_list.h create mode 100644 src/minarch/libretro-common/include/lists/string_list.h create mode 100644 src/minarch/libretro-common/include/lrc_hash.h create mode 100644 src/minarch/libretro-common/include/math/complex.h create mode 100644 src/minarch/libretro-common/include/math/float_minmax.h create mode 100644 src/minarch/libretro-common/include/math/fxp.h create mode 100644 src/minarch/libretro-common/include/media/media_detect_cd.h create mode 100644 src/minarch/libretro-common/include/memalign.h create mode 100644 src/minarch/libretro-common/include/memmap.h create mode 100644 src/minarch/libretro-common/include/net/net_compat.h create mode 100644 src/minarch/libretro-common/include/net/net_http.h create mode 100644 src/minarch/libretro-common/include/net/net_http_parse.h create mode 100644 src/minarch/libretro-common/include/net/net_ifinfo.h create mode 100644 src/minarch/libretro-common/include/net/net_socket.h create mode 100644 src/minarch/libretro-common/include/net/net_socket_ssl.h create mode 100644 src/minarch/libretro-common/include/playlists/label_sanitization.h create mode 100644 src/minarch/libretro-common/include/queues/fifo_queue.h create mode 100644 src/minarch/libretro-common/include/queues/generic_queue.h create mode 100644 src/minarch/libretro-common/include/queues/message_queue.h create mode 100644 src/minarch/libretro-common/include/queues/task_queue.h create mode 100644 src/minarch/libretro-common/include/retro_assert.h create mode 100644 src/minarch/libretro-common/include/retro_common.h create mode 100644 src/minarch/libretro-common/include/retro_common_api.h create mode 100644 src/minarch/libretro-common/include/retro_dirent.h create mode 100644 src/minarch/libretro-common/include/retro_endianness.h create mode 100644 src/minarch/libretro-common/include/retro_environment.h create mode 100644 src/minarch/libretro-common/include/retro_inline.h create mode 100644 src/minarch/libretro-common/include/retro_math.h create mode 100644 src/minarch/libretro-common/include/retro_miscellaneous.h create mode 100644 src/minarch/libretro-common/include/retro_stat.h create mode 100644 src/minarch/libretro-common/include/retro_timers.h create mode 100644 src/minarch/libretro-common/include/rthreads/async_job.h create mode 100644 src/minarch/libretro-common/include/rthreads/rthreads.h create mode 100644 src/minarch/libretro-common/include/rthreads/tpool.h create mode 100644 src/minarch/libretro-common/include/streams/chd_stream.h create mode 100644 src/minarch/libretro-common/include/streams/file_stream.h create mode 100644 src/minarch/libretro-common/include/streams/file_stream_transforms.h create mode 100644 src/minarch/libretro-common/include/streams/interface_stream.h create mode 100644 src/minarch/libretro-common/include/streams/memory_stream.h create mode 100644 src/minarch/libretro-common/include/streams/network_stream.h create mode 100644 src/minarch/libretro-common/include/streams/rzip_stream.h create mode 100644 src/minarch/libretro-common/include/streams/stdin_stream.h create mode 100644 src/minarch/libretro-common/include/streams/trans_stream.h create mode 100644 src/minarch/libretro-common/include/string/stdstring.h create mode 100644 src/minarch/libretro-common/include/time/rtime.h create mode 100644 src/minarch/libretro-common/include/utils/md5.h create mode 100644 src/minarch/libretro-common/include/vfs/vfs.h create mode 100644 src/minarch/libretro-common/include/vfs/vfs_implementation.h create mode 100644 src/minarch/libretro-common/include/vfs/vfs_implementation_cdrom.h create mode 100644 src/minarch/libretro-common/include/vulkan/vulkan_symbol_wrapper.h create mode 100644 src/minarch/libretro-common/libco/aarch64.c create mode 100644 src/minarch/libretro-common/libco/amd64.c create mode 100644 src/minarch/libretro-common/libco/armeabi.c create mode 100644 src/minarch/libretro-common/libco/fiber.c create mode 100644 src/minarch/libretro-common/libco/genode.cpp create mode 100644 src/minarch/libretro-common/libco/libco.c create mode 100644 src/minarch/libretro-common/libco/ppc.c create mode 100644 src/minarch/libretro-common/libco/ps2.c create mode 100644 src/minarch/libretro-common/libco/ps3.S create mode 100644 src/minarch/libretro-common/libco/psp1.c create mode 100644 src/minarch/libretro-common/libco/psp2.c create mode 100644 src/minarch/libretro-common/libco/scefiber.c create mode 100644 src/minarch/libretro-common/libco/sjlj.c create mode 100644 src/minarch/libretro-common/libco/ucontext.c create mode 100644 src/minarch/libretro-common/libco/x86.c create mode 100644 src/minarch/libretro-common/lists/dir_list.c create mode 100644 src/minarch/libretro-common/lists/file_list.c create mode 100644 src/minarch/libretro-common/lists/linked_list.c create mode 100644 src/minarch/libretro-common/lists/nested_list.c create mode 100644 src/minarch/libretro-common/lists/string_list.c create mode 100644 src/minarch/libretro-common/lists/vector_list.c create mode 100644 src/minarch/libretro-common/media/media_detect_cd.c create mode 100644 src/minarch/libretro-common/memmap/memalign.c create mode 100644 src/minarch/libretro-common/memmap/memmap.c create mode 100644 src/minarch/libretro-common/net/net_compat.c create mode 100644 src/minarch/libretro-common/net/net_http.c create mode 100644 src/minarch/libretro-common/net/net_http_parse.c create mode 100644 src/minarch/libretro-common/net/net_ifinfo.c create mode 100644 src/minarch/libretro-common/net/net_socket.c create mode 100644 src/minarch/libretro-common/net/net_socket_ssl_bear.c create mode 100644 src/minarch/libretro-common/net/net_socket_ssl_mbed.c create mode 100644 src/minarch/libretro-common/playlists/label_sanitization.c create mode 100644 src/minarch/libretro-common/queues/fifo_queue.c create mode 100644 src/minarch/libretro-common/queues/generic_queue.c create mode 100644 src/minarch/libretro-common/queues/message_queue.c create mode 100644 src/minarch/libretro-common/queues/task_queue.c create mode 100644 src/minarch/libretro-common/rthreads/ctr_pthread.h create mode 100644 src/minarch/libretro-common/rthreads/gx_pthread.h create mode 100644 src/minarch/libretro-common/rthreads/psp_pthread.h create mode 100644 src/minarch/libretro-common/rthreads/rthreads.c create mode 100644 src/minarch/libretro-common/rthreads/tpool.c create mode 100644 src/minarch/libretro-common/rthreads/wiiu_pthread.h create mode 100644 src/minarch/libretro-common/rthreads/xenon_sdl_threads.c create mode 100644 src/minarch/libretro-common/samples/compat/fnmatch/Makefile create mode 100644 src/minarch/libretro-common/samples/compat/fnmatch/compat_fnmatch_test.c create mode 100644 src/minarch/libretro-common/samples/compat/snprintf/Makefile create mode 100644 src/minarch/libretro-common/samples/compat/snprintf/snprintf_test.c create mode 100644 src/minarch/libretro-common/samples/compat/strl/Makefile create mode 100644 src/minarch/libretro-common/samples/compat/strl/strl_test.c create mode 100644 src/minarch/libretro-common/samples/core_options/README.md create mode 100644 src/minarch/libretro-common/samples/core_options/example_categories/conversion_scripts/core_option_regex.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_categories/conversion_scripts/v1_to_v2_converter.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_categories/libretro_core_options.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_categories/libretro_core_options_intl.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_default/libretro_core_options.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_default/libretro_core_options_intl.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_hide_option/libretro_core_options_intl.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/libretro_core_options.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_intl.yml create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/.github/workflows/crowdin_prep.yml create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/crowdin.yml create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/instructions.txt create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/.gitignore create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_opt_translation.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/core_option_regex.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_intl.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/crowdin_prep.py create mode 100644 src/minarch/libretro-common/samples/core_options/example_translation/translation scripts/intl/v1_to_v2_converter.py create mode 100644 src/minarch/libretro-common/samples/file/config_file/Makefile create mode 100644 src/minarch/libretro-common/samples/file/config_file/config_file_test.c create mode 100644 src/minarch/libretro-common/samples/file/nbio/Makefile create mode 100644 src/minarch/libretro-common/samples/file/nbio/nbio_test.c create mode 100644 src/minarch/libretro-common/samples/formats/png/Makefile create mode 100644 src/minarch/libretro-common/samples/formats/png/rpng_test.c create mode 100644 src/minarch/libretro-common/samples/formats/xml/Makefile create mode 100644 src/minarch/libretro-common/samples/formats/xml/rxml_test.c create mode 100644 src/minarch/libretro-common/samples/net/Makefile create mode 100644 src/minarch/libretro-common/samples/net/http_test create mode 100644 src/minarch/libretro-common/samples/net/net_http_parse_test.c create mode 100644 src/minarch/libretro-common/samples/net/net_http_test.c create mode 100644 src/minarch/libretro-common/samples/net/net_ifinfo create mode 100644 src/minarch/libretro-common/samples/net/net_ifinfo_test.c create mode 100644 src/minarch/libretro-common/samples/net/udp-test.c create mode 100644 src/minarch/libretro-common/samples/streams/rzip/Makefile create mode 100644 src/minarch/libretro-common/samples/streams/rzip/rzip.c create mode 100644 src/minarch/libretro-common/samples/utils/Makefile create mode 100644 src/minarch/libretro-common/samples/utils/crc32.c create mode 100644 src/minarch/libretro-common/samples/utils/md5_test.c create mode 100644 src/minarch/libretro-common/samples/utils/sha1_main.c create mode 100644 src/minarch/libretro-common/streams/chd_stream.c create mode 100644 src/minarch/libretro-common/streams/file_stream.c create mode 100644 src/minarch/libretro-common/streams/file_stream_transforms.c create mode 100644 src/minarch/libretro-common/streams/interface_stream.c create mode 100644 src/minarch/libretro-common/streams/memory_stream.c create mode 100644 src/minarch/libretro-common/streams/network_stream.c create mode 100644 src/minarch/libretro-common/streams/rzip_stream.c create mode 100644 src/minarch/libretro-common/streams/stdin_stream.c create mode 100644 src/minarch/libretro-common/streams/trans_stream.c create mode 100644 src/minarch/libretro-common/streams/trans_stream_pipe.c create mode 100644 src/minarch/libretro-common/streams/trans_stream_zlib.c create mode 100644 src/minarch/libretro-common/string/stdstring.c create mode 100644 src/minarch/libretro-common/test/hash/test_hash.c create mode 100644 src/minarch/libretro-common/test/lists/test_linked_list.c create mode 100644 src/minarch/libretro-common/test/queues/test_generic_queue.c create mode 100644 src/minarch/libretro-common/test/string/test_stdstring.c create mode 100644 src/minarch/libretro-common/test/utils/test_utils.c create mode 100644 src/minarch/libretro-common/time/rtime.c create mode 100644 src/minarch/libretro-common/utils/debugbreak/debugbreak.c create mode 100644 src/minarch/libretro-common/utils/djb2.c create mode 100644 src/minarch/libretro-common/utils/md5.c create mode 100644 src/minarch/libretro-common/utils/sha1.c create mode 100644 src/minarch/libretro-common/vfs/vfs_implementation.c create mode 100644 src/minarch/libretro-common/vfs/vfs_implementation_cdrom.c create mode 100644 src/minarch/libretro-common/vfs/vfs_implementation_uwp.cpp create mode 100644 src/minarch/libretro-common/vulkan/vulkan_symbol_wrapper.c diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 5b1f8a2..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "src/minarch/libretro-common"] - path = src/minarch/libretro-common - url = https://github.com/libretro/libretro-common -[submodule "other/DinguxCommander"] - path = other/DinguxCommander - url = https://github.com/shauninman/DinguxCommander.git diff --git a/other/DinguxCommander b/other/DinguxCommander deleted file mode 160000 index 2b8b290..0000000 --- a/other/DinguxCommander +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2b8b29042c172dbca78eadbbb989e51a0b9b635d diff --git a/other/DinguxCommander/.gitignore b/other/DinguxCommander/.gitignore new file mode 100644 index 0000000..ea1472e --- /dev/null +++ b/other/DinguxCommander/.gitignore @@ -0,0 +1 @@ +output/ diff --git a/other/DinguxCommander/Makefile b/other/DinguxCommander/Makefile new file mode 100644 index 0000000..8ccb968 --- /dev/null +++ b/other/DinguxCommander/Makefile @@ -0,0 +1,76 @@ + +########################################################### + +ifeq (,$(PLATFORM)) +PLATFORM=$(UNION_PLATFORM) +endif + +ifeq (,$(PLATFORM)) +$(error please specify PLATFORM, eg. make PLATFORM=trimui) +endif +ifeq (,$(CROSS_COMPILE)) +$(error missing CROSS_COMPILE for this toolchain) +endif + +########################################################### + +CXX:=$(CROSS_COMPILE)g++ +CXXFLAGS:=-DPLATFORM_$(shell echo $(PLATFORM) | tr a-z A-Z) -O3 -fomit-frame-pointer -ffast-math -funroll-loops + +ifeq (miyoomini,$(PLATFORM)) +CXXFLAGS+= -marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7ve -O3 +endif + +ifeq (rg35xx,$(PLATFORM)) +CXXFLAGS+= -marm -mtune=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=hard -march=armv7-a -O3 +endif + +RESDIR:=res + +CXXFLAGS+= -Wno-unknown-pragmas -Wno-format -Wno-write-strings # -Wall +CXXFLAGS+=-DRESDIR="\"$(RESDIR)\"" +LINKFLAGS+=-s +LINKFLAGS+=-lSDL -lSDL_image -lSDL_ttf + +ifdef V + CMD:= + SUM:=@\# +else + CMD:=@ + SUM:=@echo +endif + +OUTDIR:=output + +EXECUTABLE:=$(OUTDIR)/DinguxCommander + +OBJS:=main.o sdlutils.o resourceManager.o fileLister.o commander.o panel.o \ + dialog.o window.o fileutils.o viewer.o keyboard.o + +DEPFILES:=$(patsubst %.o,$(OUTDIR)/%.d,$(OBJS)) + +.PHONY: all clean + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(addprefix $(OUTDIR)/,$(OBJS)) + $(SUM) " LINK $@" + $(CMD)$(CXX) $(LINKFLAGS) -o $@ $^ + +$(OUTDIR)/%.o: src/%.cpp + @mkdir -p $(@D) + $(SUM) " CXX $@" + $(CMD)$(CXX) $(CXXFLAGS) -MP -MMD -MF $(@:%.o=%.d) -c $< -o $@ + @touch $@ # Force .o file to be newer than .d file. + +clean: + $(SUM) " RM $(OUTDIR)" + $(CMD)rm -rf $(OUTDIR) + +# Load dependency files. +-include $(DEPFILES) + +# Generate dependencies that do not exist yet. +# This is only in case some .d files have been deleted; +# in normal operation this rule is never triggered. +$(DEPFILES): diff --git a/other/DinguxCommander/README.md b/other/DinguxCommander/README.md new file mode 100644 index 0000000..83e7a27 --- /dev/null +++ b/other/DinguxCommander/README.md @@ -0,0 +1,8 @@ +DinguxCommander +=============== + +DinguxCommander is a two-pane file manager in the style of Norton Commander. + +Original site: http://beyondds.free.fr/index.php?Dingoo-dinguxcommander + +This repository contains customizations to make it integrate better with OpenDingux. diff --git a/other/DinguxCommander/README.txt b/other/DinguxCommander/README.txt new file mode 100644 index 0000000..1178ad5 --- /dev/null +++ b/other/DinguxCommander/README.txt @@ -0,0 +1,82 @@ +DinguxCommander for Dingux +-------------------------- + + +History +------- + +2011-03-09 : Version 2.1 + - Rename a file/dir + - Create new dir + - Minor fixes + +2011-02-16 : Version 2.0 + - Execute file + - View file + - Disk information + - Disk used by a list of selected files/dirs + - New button mapping + - Small fixes + +2011-02-05 : Version 1.0 : Initial version. + + +Introduction +------------ + +DinguxCommander is a file manager for Dingoo (Dingux). +It uses two vertical panels side by side, one being the source and the other the +destination, like many 'commander-style' file managers such as Norton Commander +or Midnight Commander. +DinguxCommander allows to: + o Copy, move and delete multiple files. + o View a file + o Execute a file + o Rename a file or directory + o Create a new directory + o Display disk space used by a list of selected files/dirs + o Display disk information (used, available, total) + +Installation +------------ + +As usual: + +o Extract the archive, keeping the directory structure +o Copy the directory 'DinguxCommander' and its contents somewhere on your SD + card under '/boot/local' (for example: in /boot/local/apps/) +o Create a shortcut to DinguxCommander.dge in your favorite menu. + + +Controls +-------- + +o D-pad Move +o L/R Page up/page down +o A For a directory: open + For a file: view or execute +o B Go to parent directory / cancel +o Y System actions: + - Select all items + - Select no items + - Create new directory + - Display disk information + - Quit program +o X Actions on selected items: + - Copy to destination directory + - Move to destination directory + - Rename (appears only if 1 item is selected) + - Delete + - Display disk used +o SELECT Select highlighted item. + Selected items are displayed in red. +o START Open highlighted directory in destination panel. + If a file is highlighted, open current directory in destination panel. + + +Credits +------- + +Homepage: http://beyondds.free.fr/ +Development: Mia +Font: Beycan Çetin diff --git a/other/DinguxCommander/res/Commander-11.ttf b/other/DinguxCommander/res/Commander-11.ttf new file mode 100644 index 0000000000000000000000000000000000000000..de148fc769aecd778d5ea2c4ea5d6d2391867073 GIT binary patch literal 29364 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 literal 0 HcmV?d00001 diff --git a/other/DinguxCommander/res/Fiery_Turk.ttf b/other/DinguxCommander/res/Fiery_Turk.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c9f4bca6ce6b998fe97746cdef9a7f648ebb3981 GIT binary patch literal 62788 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 E0kk#o9{>OV literal 0 HcmV?d00001 diff --git a/other/DinguxCommander/res/background.png b/other/DinguxCommander/res/background.png new file mode 100644 index 0000000000000000000000000000000000000000..339b03455c41d14f971b777e75a1834a980eff1f GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoKX5Ps$$$P@Hb9E8ILO_JVcj{ImkbO{&7Llf zAr-gY-rdOC>>%KJ@bDrw_G#Kp5?&3nG8*Uf>9FT9v70phJ2$0Z_3~c7+q#!8aBO|+ zo}D|_-GAb%hnx-v8X6cGn}L{_iH(H^ggGQYSinFbLBOCO`flaCIK``9r~dzSt)CYz zu8`nx0E7{m+YbG@|NXJ(CdrL>Rek#P{PkPHs$$g7q#rQ@Iss&bBa$_6H=Zhg*k>?bL8M@=Uubik^D`kQk4(qx$(zZxenQsm{%g0a r`sW>D1E&mF(1KD2Bx(-S{$XrTwoI>k_u>OEZ8CVe`njxgN@xNA>PpN( literal 0 HcmV?d00001 diff --git a/other/DinguxCommander/res/file.png b/other/DinguxCommander/res/file.png new file mode 100644 index 0000000000000000000000000000000000000000..23a2d18bd69d538c311a3f8d98c7993ffebc471e GIT binary patch literal 353 zcmV-n0iOPeP)Px$8%ab#R4C77k}+-qK@3H|J+oYcnuZe~(Nl(wT!M4Z1cfRzh)|QW&;a5T+W|Z4 z-Jil}#DX;%S@WO2Eo+1z006t+9RQMM7D6bBV)i-1a}XrB-ELD#B%7uoNwRI*&1U1O zAN7LU?G|G^oleK&@q9iX4u`s~N2AgDXPr$oXKmY(j4=WzilW!+U9Z>ic)a>vbkvWr~xTlBMO= zi3|C=}-QM2jV5*k&rkgf_mGj@- zJ+O3&zvtuI{rBG#we|d${1<;}vg(VZvP$Kzk9rxn%qPEgXq$cv=y3*5S3j3^P6< literal 0 HcmV?d00001 diff --git a/other/DinguxCommander/res/icon.png b/other/DinguxCommander/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1f1bc8e50116b5b4ad3d6b41130eefe97604bd92 GIT binary patch literal 1238 zcmV;{1S$K8P)_0{LcMU})bbZ_ zL)&l!esj)(R=&!@G=-^&fC_45}LMx`-ag;%~8+X_m^!nVKOzoKhG>G!@!U7$8le1?ZfZPoF=*-6e`ELTakg)x6wUx06s#GS1hHf@D#UD17B>f2JawPmoj!ZMhG=MM*BQ={?M(BSZcjp!8gJ&1G_6p9X={NR+NM2_jMhsMrq zvTLquD0*^im5MMPOoYXe5wWC`z^<|WmyMGQvSZwS*-F}1WiE=M-YL*x(QWqdAv*GG zO^Dz|tckggq>s6eq{n=A9dkEUR%vzhruczBykm@(N*s@jb&3OD+St?mZzmIyy!(&m5NdFbpLnqs1bp)f}V@ z)F8@B0kWqOjGHdo9ZnL-<_R(|*`THZPHd9(oiNd#PhfT=gu^M%C7j$(Ou>_ot} zH32g{QZWW_#JPtlr6fw|Ay|YzJAN&N2&5^v?>nT602Ev-6xugyP$s~_%XS4vh>U=< z0C8QV;1b1-RARl76sS~Ndk`>mvzg!Z<>lY}YIRCP)+T@maCo77%sY-P5rL~P-Mtut zfD{g!?CA#*S_3;LVTx%3RCOFyrJKM1@uBaxzUJ^fS+BpKaC~lTtc$3Q&eo}Z{#Y9% zt9v0}*=-UCy{MmCb+RgC@K#lws#1BZOn0~L;u01-#zi0BN`RA>S08&w5dy4HSTloQgH{u*#W4qEB z0V6HR5w^lZ_-Jk6dj+X5I?KYy`(vO-OH$x}0p^Z_cfhkI_W%F@07*qoM6N<$g5-oh ALI3~& literal 0 HcmV?d00001 diff --git a/other/DinguxCommander/res/up.png b/other/DinguxCommander/res/up.png new file mode 100644 index 0000000000000000000000000000000000000000..27eceb58b08daed48c3602a2979e8c70559e934e GIT binary patch literal 272 zcmV+r0q_2aP)Px#%1J~)R2b8Rkv$HAKoErov7T@l3b=rDcn`gSy>?3L%=N8HT|a!x-zjE{dZ0omj0`0C3%0 z0f30K*7-6Afce`YQc59&AG|Y7SZjX~QcCCCS3)T@j-$0!DdnBu^Do&V3&W6In3p%I We1MHOjt{8-0000 +#include +#include "commander.h" +#include "resourceManager.h" +#include "sdlutils.h" +#include "def.h" +#include "dialog.h" +#include "fileutils.h" +#include "viewer.h" +#include "keyboard.h" + +#define X_LEFT 1 +#define X_RIGHT 162 + +CCommander::CCommander(const std::string &p_pathL, const std::string &p_pathR): + CWindow::CWindow(), + m_panelLeft(p_pathL, X_LEFT), + m_panelRight(p_pathR, X_RIGHT), + m_panelSource(NULL), + m_panelTarget(NULL), + m_background(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_BG)) +{ + m_panelSource = &m_panelLeft; + m_panelTarget = &m_panelRight; +} + +CCommander::~CCommander(void) +{ +} + +void CCommander::render(const bool p_focus) const +{ + INHIBIT(std::cout << "CCommander::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;) + // Draw background image + SDL_utils::applySurface(0, 0, m_background, Globals::g_screen); + // Draw panels + m_panelLeft.render(p_focus && (m_panelSource == &m_panelLeft)); + m_panelRight.render(p_focus && (m_panelSource == &m_panelRight)); +} + +const bool CCommander::keyPress(const SDL_Event &p_event) +{ + CWindow::keyPress(p_event); + bool l_ret(false); + switch (p_event.key.keysym.sym) + { + case MYKEY_SYSTEM: + case MYKEY_MENU: + if (openSystemMenu()) + m_panelSource->refresh(); + l_ret = true; + break; + case MYKEY_UP: + l_ret = m_panelSource->moveCursorUp(1); + break; + case MYKEY_DOWN: + l_ret = m_panelSource->moveCursorDown(1); + break; + case MYKEY_PAGEUP: + l_ret = m_panelSource->moveCursorUp(NB_VISIBLE_LINES - 1); + break; + case MYKEY_PAGEDOWN: + l_ret = m_panelSource->moveCursorDown(NB_VISIBLE_LINES - 1); + break; + case MYKEY_LEFT: + if (m_panelSource == &m_panelRight) + { + m_panelSource = &m_panelLeft; + m_panelTarget = &m_panelRight; + l_ret = true; + } + break; + case MYKEY_RIGHT: + if (m_panelSource == &m_panelLeft) + { + m_panelSource = &m_panelRight; + m_panelTarget = &m_panelLeft; + l_ret = true; + } + break; + case MYKEY_OPEN: + if (m_panelSource->isDirectoryHighlighted()) + { + // It's a dir => open it + l_ret = m_panelSource->open(); + } + else + { + // It's a file => open execute menu + openExecuteMenu(); + l_ret = true; + } + break; + case MYKEY_PARENT: + l_ret = m_panelSource->goToParentDir(); + break; + case MYKEY_OPERATION: + // If there's no file in the select list, add current file + if (m_panelSource->getSelectList().empty() && m_panelSource->getHighlightedItem() != "..") + m_panelSource->addToSelectList(false); + if (!m_panelSource->getSelectList().empty()) + { + if (openCopyMenu()) + { + // Refresh file lists + m_panelSource->refresh(); + m_panelTarget->refresh(); + } + else + { + if (m_panelSource->getSelectList().size() == 1 && (*m_panelSource->getSelectList().begin()) == m_panelSource->getHighlightedIndex()) + m_panelSource->selectNone(); + } + l_ret = true; + } + break; + case MYKEY_SELECT: + l_ret = m_panelSource->addToSelectList(true); + break; + case MYKEY_TRANSFER: + if (m_panelSource->isDirectoryHighlighted() && m_panelSource->getHighlightedItem() != "..") + l_ret = m_panelTarget->open(m_panelSource->getHighlightedItemFull()); + else + l_ret = m_panelTarget->open(m_panelSource->getCurrentPath()); + break; + default: + break; + } + return l_ret; +} + +const bool CCommander::keyHold(void) +{ + bool l_ret(false); + switch(m_lastPressed) + { + case MYKEY_UP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_UP])) + l_ret = m_panelSource->moveCursorUp(1); + break; + case MYKEY_DOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN])) + l_ret = m_panelSource->moveCursorDown(1); + break; + case MYKEY_PAGEUP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEUP])) + l_ret = m_panelSource->moveCursorUp(NB_VISIBLE_LINES - 1); + break; + case MYKEY_PAGEDOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEDOWN])) + l_ret = m_panelSource->moveCursorDown(NB_VISIBLE_LINES - 1); + break; + case MYKEY_SELECT: + if (tick(SDL_GetKeyState(NULL)[MYKEY_SELECT])) + l_ret = m_panelSource->addToSelectList(true); + break; + default: + break; + } + return l_ret; +} + +const bool CCommander::openCopyMenu(void) const +{ + bool l_ret(false); + int l_dialogRetVal(0); + bool l_rename(false); + // List of selected files + std::vector l_list; + m_panelSource->getSelectList(l_list); + // The rename option appears only if one item is selected + l_rename = (l_list.size() == 1); + { + bool l_loop(false); + std::ostringstream l_stream; + l_stream << l_list.size() << " selected:"; + // File operation dialog + CDialog l_dialog(l_stream.str(), 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); + l_dialog.addOption(m_panelSource == &m_panelLeft ? "Copy >" : "< Copy"); + l_dialog.addOption(m_panelSource == &m_panelLeft ? "Move >" : "< Move"); + if (l_rename) + l_dialog.addOption("Rename"); + l_dialog.addOption("Delete"); + l_dialog.addOption("Disk used"); + l_dialog.init(); + do + { + l_loop = false; + l_dialogRetVal = l_dialog.execute(); + if (l_dialogRetVal == 3 + l_rename) + { + CDialog l_dialog2("", l_dialog.getX() + l_dialog.getImage()->w - DIALOG_BORDER, l_dialog.getY() + DIALOG_BORDER + (l_dialog.getHighlightedIndex() + 1) * LINE_HEIGHT); + l_dialog2.addOption("Yes"); + l_dialog2.addOption("No"); + l_dialog2.init(); + if (l_dialog2.execute() != 1) + l_loop = true; + } + } + while (l_loop); + } + // Perform operation + switch (l_dialogRetVal) + { + case 1: + // Copy + File_utils::copyFile(l_list, m_panelTarget->getCurrentPath()); + l_ret = true; + break; + case 2: + // Move + File_utils::moveFile(l_list, m_panelTarget->getCurrentPath()); + l_ret = true; + break; + case 3: + if (l_rename) + { + // Rename + CKeyboard l_keyboard(m_panelSource->getHighlightedItem()); + if (l_keyboard.execute() == 1 && !l_keyboard.getInputText().empty() && l_keyboard.getInputText() != m_panelSource->getHighlightedItem()) + { + File_utils::renameFile(m_panelSource->getHighlightedItemFull(), m_panelSource->getCurrentPath() + (m_panelSource->getCurrentPath() == "/" ? "" : "/") + l_keyboard.getInputText()); + l_ret = true; + } + } + else + { + // Delete + File_utils::removeFile(l_list); + l_ret = true; + } + break; + case 4: + if (l_rename) + { + // Delete + File_utils::removeFile(l_list); + l_ret = true; + } + else + // Disk used + File_utils::diskUsed(l_list); + break; + case 5: + if (l_rename) + // Disk used + File_utils::diskUsed(l_list); + break; + default: + break; + } + return l_ret; +} + +const bool CCommander::openSystemMenu(void) +{ + bool l_ret(false); + int l_dialogRetVal(0); + // Selection dialog + { + CDialog l_dialog("System:", 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); + l_dialog.addOption("Select all"); + l_dialog.addOption("Select none"); + l_dialog.addOption("New directory"); + l_dialog.addOption("Disk info"); + l_dialog.addOption("Quit"); + l_dialog.init(); + l_dialogRetVal = l_dialog.execute(); + } + switch (l_dialogRetVal) + { + case 1: + // Select all + m_panelSource->selectAll(); + break; + case 2: + // Select none + m_panelSource->selectNone(); + break; + case 3: + // New dir + { + CKeyboard l_keyboard(""); + if (l_keyboard.execute() == 1 && !l_keyboard.getInputText().empty()) + { + File_utils::makeDirectory(m_panelSource->getCurrentPath() + (m_panelSource->getCurrentPath() == "/" ? "" : "/") + l_keyboard.getInputText()); + l_ret = true; + } + } + break; + case 4: + // Disk info + File_utils::diskInfo(); + break; + case 5: + // Quit + m_retVal = -1; + break; + default: + break; + } + return l_ret; +} + +void CCommander::openExecuteMenu(void) const +{ + int l_dialogRetVal(0); + // Dialog + { + CDialog l_dialog(m_panelSource->getHighlightedItem() + ":", 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); + l_dialog.addOption("View"); + l_dialog.addOption("Execute"); + l_dialog.init(); + l_dialogRetVal = l_dialog.execute(); + } + // Perform operation + switch (l_dialogRetVal) + { + case 1: + // View + { + // Check size + const std::string l_file(m_panelSource->getHighlightedItemFull()); + INHIBIT(std::cout << "File size: " << File_utils::getFileSize(l_file) << std::endl;) + if (File_utils::getFileSize(l_file) > VIEWER_SIZE_MAX) + { + // File is too big to be viewed! + CDialog l_dialog("Error:", 0, 0); + l_dialog.addLabel("File is too big!"); + l_dialog.addOption("OK"); + l_dialog.init(); + l_dialog.execute(); + } + else + { + CViewer l_viewer(m_panelSource->getHighlightedItemFull()); + l_viewer.execute(); + } + } + break; + case 2: + // Execute + File_utils::executeFile(m_panelSource->getHighlightedItemFull()); + break; + default: + break; + } +} + +const bool CCommander::isFullScreen(void) const +{ + return true; +} diff --git a/other/DinguxCommander/src/commander.h b/other/DinguxCommander/src/commander.h new file mode 100644 index 0000000..c25f8f9 --- /dev/null +++ b/other/DinguxCommander/src/commander.h @@ -0,0 +1,54 @@ +#ifndef _COMMANDER_H_ +#define _COMMANDER_H_ + +#include +#include "panel.h" +#include "window.h" + +class CCommander : public CWindow +{ + public: + + // Constructor + CCommander(const std::string &p_pathL, const std::string &p_pathR); + + // Destructor + virtual ~CCommander(void); + + private: + + // Forbidden + CCommander(void); + CCommander(const CCommander &p_source); + const CCommander &operator =(const CCommander &p_source); + + // Key press management + virtual const bool keyPress(const SDL_Event &p_event); + + // Key hold management + virtual const bool keyHold(void); + + // Draw + virtual void render(const bool p_focus) const; + + // Is window full screen? + virtual const bool isFullScreen(void) const; + + // Open the file operation menus + const bool openCopyMenu(void) const; + void openExecuteMenu(void) const; + + // Open the selection menu + const bool openSystemMenu(void); + + // The two panels + CPanel m_panelLeft; + CPanel m_panelRight; + CPanel* m_panelSource; + CPanel* m_panelTarget; + + // Pointers to resources + SDL_Surface *m_background; +}; + +#endif diff --git a/other/DinguxCommander/src/def.h b/other/DinguxCommander/src/def.h new file mode 100644 index 0000000..86e84d5 --- /dev/null +++ b/other/DinguxCommander/src/def.h @@ -0,0 +1,124 @@ +#ifndef _DEF_H_ +#define _DEF_H_ + +//~ #define INHIBIT(X) X +#define INHIBIT(X) /* X */ + +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 +#define SCREEN_BPP 16 +#define SURFACE_FLAGS SDL_SWSURFACE +#define MS_PER_FRAME 33 +// Panel +#define LINE_HEIGHT 15 +#define NB_VISIBLE_LINES 14 +#define Y_LIST 17 +#define Y_HEADER 3 +#if defined(PLATFORM_TRIMUI) +#define Y_OFFSET 2 // added for larger Commander-11.ttf +#else +#define Y_OFFSET 0 +#endif +#define Y_FOOTER 228 +#define H_FOOTER 13 +// Dialogs +#define DIALOG_BORDER 2 +#define DIALOG_MARGIN 8 +// Colors +#define COLOR_KEY 255,0,255 +#define COLOR_TEXT_NORMAL 70,27,10 +#define COLOR_TEXT_TITLE 233,229,227 +#define COLOR_TEXT_DIR 75,70,164 +#define COLOR_TEXT_SELECTED 255,0,0 +#define COLOR_CURSOR_1 232,152,80 +#define COLOR_CURSOR_2 232,201,173 +#define COLOR_BG_1 255,255,255 +#define COLOR_BG_2 232,228,224 +#define COLOR_BORDER 102,85,74 + +#define DINGOO_X SDLK_LSHIFT +#define DINGOO_Y SDLK_LALT + +#if defined(PLATFORM_TRIMUI) +#define MYKEY_UP SDLK_UP // Up +#define MYKEY_RIGHT SDLK_RIGHT // Right +#define MYKEY_DOWN SDLK_DOWN // Down +#define MYKEY_LEFT SDLK_LEFT // Left +#define MYKEY_SYSTEM SDLK_LALT // Y +#define MYKEY_PAGEUP SDLK_TAB // L +#define MYKEY_PAGEDOWN SDLK_BACKSPACE // R +#define MYKEY_OPEN SDLK_SPACE // A +#define MYKEY_PARENT SDLK_LCTRL // B +#define MYKEY_OPERATION SDLK_LSHIFT // X +#define MYKEY_SELECT SDLK_RCTRL // SELECT +#define MYKEY_TRANSFER SDLK_RETURN // START +#define MYKEY_MENU SDLK_ESCAPE // MENU +#define PATH_DEFAULT "/" +#define FILE_SYSTEM "/dev/mmcblk0p1" +#elif defined(PLATFORM_RG35XX) +#define MYKEY_UP SDLK_KATAKANA +#define MYKEY_RIGHT SDLK_KATAKANAHIRAGANA +#define MYKEY_DOWN SDLK_HIRAGANA +#define MYKEY_LEFT SDLK_HENKAN +#define MYKEY_SYSTEM SDLK_RCTRL // Y +#define MYKEY_PAGEUP SDLK_RALT // L +#define MYKEY_PAGEDOWN SDLK_BREAK // R +#define MYKEY_OPEN SDLK_MUHENKAN // A +#define MYKEY_PARENT SDLK_KP_JPCOMMA // B +#define MYKEY_OPERATION SDLK_KP_ENTER // X +#define MYKEY_SELECT SDLK_PRINT // SELECT +#define MYKEY_TRANSFER SDLK_KP_DIVIDE // START +#define MYKEY_MENU SDLK_PAGEUP // MENU +#define PATH_DEFAULT "/" +#define FILE_SYSTEM "/dev/mmcblk0p1" +#elif defined(PLATFORM_MIYOOMINI) +#define MYKEY_UP SDLK_UP // Up +#define MYKEY_RIGHT SDLK_RIGHT // Right +#define MYKEY_DOWN SDLK_DOWN // Down +#define MYKEY_LEFT SDLK_LEFT // Left +#define MYKEY_SYSTEM SDLK_LALT // Y +#define MYKEY_PAGEUP SDLK_e // L +#define MYKEY_PAGEDOWN SDLK_t // R +#define MYKEY_OPEN SDLK_SPACE // A +#define MYKEY_PARENT SDLK_LCTRL // B +#define MYKEY_OPERATION SDLK_LSHIFT // X +#define MYKEY_SELECT SDLK_RCTRL // SELECT +#define MYKEY_TRANSFER SDLK_RETURN // START +#define MYKEY_MENU SDLK_ESCAPE // MENU +#define PATH_DEFAULT "/" +#define FILE_SYSTEM "/dev/mmcblk0p1" +#elif defined(PLATFORM_RG350) || defined(PLATFORM_ODBETA) +#define MYKEY_UP SDLK_UP // Up +#define MYKEY_RIGHT SDLK_RIGHT // Right +#define MYKEY_DOWN SDLK_DOWN // Down +#define MYKEY_LEFT SDLK_LEFT // Left +#define MYKEY_SYSTEM SDLK_LSHIFT // X +#define MYKEY_PAGEUP SDLK_TAB // L +#define MYKEY_PAGEDOWN SDLK_BACKSPACE // R +#define MYKEY_OPEN SDLK_LCTRL // A +#define MYKEY_PARENT SDLK_LALT // B +#define MYKEY_OPERATION SDLK_SPACE // Y +#define MYKEY_SELECT SDLK_ESCAPE // SELECT +#define MYKEY_TRANSFER SDLK_RETURN // START +#define MYKEY_MENU SDLK_HOME // POWER +#define PATH_DEFAULT "/" +#define FILE_SYSTEM "/dev/mmcblk0p1" +#elif defined(PLATFORM_RETROFW) +#define MYKEY_UP SDLK_UP // Up +#define MYKEY_RIGHT SDLK_RIGHT // Right +#define MYKEY_DOWN SDLK_DOWN // Down +#define MYKEY_LEFT SDLK_LEFT // Left +#define MYKEY_SYSTEM SDLK_LSHIFT // X +#define MYKEY_PAGEUP SDLK_TAB // L +#define MYKEY_PAGEDOWN SDLK_BACKSPACE // R +#define MYKEY_OPEN SDLK_LCTRL // A +#define MYKEY_PARENT SDLK_LALT // B +#define MYKEY_OPERATION SDLK_SPACE // Y +#define MYKEY_SELECT SDLK_ESCAPE // SELECT +#define MYKEY_TRANSFER SDLK_RETURN // START +#define MYKEY_MENU SDLK_END // POWER +#define PATH_DEFAULT "/" +#define FILE_SYSTEM "/dev/mmcblk0p1" +#endif + +#endif diff --git a/other/DinguxCommander/src/dialog.cpp b/other/DinguxCommander/src/dialog.cpp new file mode 100644 index 0000000..8a094ca --- /dev/null +++ b/other/DinguxCommander/src/dialog.cpp @@ -0,0 +1,260 @@ +#include +#include "dialog.h" +#include "sdlutils.h" +#include "resourceManager.h" +#include "def.h" + +CDialog::CDialog(const std::string &p_title, const Sint16 p_x, const Sint16 p_y): + CWindow(), + m_nbTitle(false), + m_nbLabels(0), + m_nbOptions(0), + m_highlightedLine(0), + m_image(NULL), + m_cursor1(NULL), + m_cursor2(NULL), + m_x(p_x), + m_y(p_y), + m_cursorX(0), + m_cursorY(0), + m_font(CResourceManager::instance().getFont()), + m_font_sm(CResourceManager::instance().getSmallFont()) +{ + // Title + if (!p_title.empty()) + { + m_nbTitle = true; + m_lines.push_back(p_title); + } + // Init clip + m_clip.x = 0; + m_clip.y = 0; + m_clip.w = 0; + m_clip.h = 0; +} + +CDialog::~CDialog(void) +{ + // Free surfaces + if (m_image != NULL) + { + SDL_FreeSurface(m_image); + m_image = NULL; + } + if (m_cursor1 != NULL) + { + SDL_FreeSurface(m_cursor1); + m_cursor1 = NULL; + } + if (m_cursor2 != NULL) + { + SDL_FreeSurface(m_cursor2); + m_cursor2 = NULL; + } + for (std::vector::iterator l_it = m_linesImg.begin(); l_it != m_linesImg.end(); ++l_it) + { + if (*l_it != NULL) + { + SDL_FreeSurface(*l_it); + *l_it = NULL; + } + } +} + +void CDialog::addLabel(const std::string &p_label) +{ + m_lines.push_back(p_label); + ++m_nbLabels; +} + +void CDialog::addOption(const std::string &p_option) +{ + m_lines.push_back(p_option); + ++m_nbOptions; +} + +void CDialog::init(void) +{ + // The width of the window depends on the width of the largest line + int l_width(0); + int l_cursorWidth(0); + SDL_Surface *l_surfaceTmp(NULL); + // Render every line + for (std::vector::const_iterator l_it = m_lines.begin(); l_it != m_lines.end(); ++l_it) + { + // Render line + l_surfaceTmp = SDL_utils::renderText(m_font, *l_it, (m_nbTitle && l_it == m_lines.begin()) ? Globals::g_colorTextTitle : Globals::g_colorTextNormal); + if (l_surfaceTmp->w > l_width) + l_width = l_surfaceTmp->w; + m_linesImg.push_back(l_surfaceTmp); + } + // Cursor width + l_cursorWidth = l_width + 2 * DIALOG_MARGIN; + if (l_cursorWidth > SCREEN_WIDTH - 2 * DIALOG_BORDER) + l_cursorWidth = SCREEN_WIDTH - 2 * DIALOG_BORDER; + // Line clip + m_clip.h = m_linesImg.front()->h; + m_clip.w = l_cursorWidth - DIALOG_MARGIN - 1; + // Adjust image width + l_width = l_width + 2 * DIALOG_MARGIN + 2 * DIALOG_BORDER; + if (l_width > SCREEN_WIDTH) + l_width = SCREEN_WIDTH; + // Create dialog image + m_image = SDL_utils::createImage(l_width, m_linesImg.size() * LINE_HEIGHT + 2 * DIALOG_BORDER, SDL_MapRGB(Globals::g_screen->format, COLOR_BORDER)); + { + SDL_Rect l_rect; + l_rect.x = DIALOG_BORDER; + l_rect.y = DIALOG_BORDER + m_nbTitle * LINE_HEIGHT; + l_rect.w = m_image->w - 2 * DIALOG_BORDER; + l_rect.h = m_image->h - 2 * DIALOG_BORDER - m_nbTitle * LINE_HEIGHT; + SDL_FillRect(m_image, &l_rect, SDL_MapRGB(m_image->format, COLOR_BG_1)); + } + // Create cursor image + m_cursor1 = SDL_utils::createImage(l_cursorWidth, LINE_HEIGHT, SDL_MapRGB(Globals::g_screen->format, COLOR_CURSOR_1)); + m_cursor2 = SDL_utils::createImage(l_cursorWidth, LINE_HEIGHT, SDL_MapRGB(Globals::g_screen->format, COLOR_CURSOR_2)); + // Adjust dialog coordinates + if (!m_x) + m_x = (SCREEN_WIDTH - m_image->w) >> 1; + if (!m_y) + { + m_y = (SCREEN_HEIGHT - m_image->h) >> 1; + } + else + { + m_y = m_y - (m_image->h >> 1) + (LINE_HEIGHT >> 1); + if (m_y < Y_LIST) + m_y = Y_LIST; + if (m_y + m_image->h > Y_FOOTER + 1) + m_y = Y_FOOTER + 1 - m_image->h; + } + // Cursor coordinates + m_cursorX = m_x + DIALOG_BORDER; + m_cursorY = m_y + DIALOG_BORDER + (m_nbTitle + m_nbLabels) * LINE_HEIGHT; +} + +void CDialog::render(const bool p_focus) const +{ + INHIBIT(std::cout << "CDialog::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;) + // Draw background + SDL_utils::applySurface(m_x, m_y, m_image, Globals::g_screen); + // Draw cursor + SDL_utils::applySurface(m_cursorX, m_cursorY + m_highlightedLine * LINE_HEIGHT, p_focus ? m_cursor1 : m_cursor2, Globals::g_screen); + // Draw lines text + Sint16 l_y(m_y + 4); + for (std::vector::const_iterator l_it = m_linesImg.begin(); l_it != m_linesImg.end(); ++l_it) + { + SDL_utils::applySurface(m_cursorX + DIALOG_MARGIN, (m_nbTitle && l_it == m_linesImg.begin()) ? l_y - 1 - Y_OFFSET : l_y - Y_OFFSET, *l_it, Globals::g_screen, &m_clip); + l_y += LINE_HEIGHT; + } +} + +const bool CDialog::keyPress(const SDL_Event &p_event) +{ + CWindow::keyPress(p_event); + bool l_ret(false); + switch (p_event.key.keysym.sym) + { + case MYKEY_PARENT: + m_retVal = -1; + l_ret = true; + break; + case MYKEY_UP: + l_ret = moveCursorUp(true); + break; + case MYKEY_DOWN: + l_ret = moveCursorDown(true); + break; + case MYKEY_PAGEUP: + if (m_highlightedLine) + { + m_highlightedLine = 0; + l_ret = true; + } + break; + case MYKEY_PAGEDOWN: + if (m_highlightedLine + 1 < m_nbOptions) + { + m_highlightedLine = m_nbOptions - 1; + l_ret = true; + } + break; + case MYKEY_OPEN: + m_retVal = m_highlightedLine + 1; + l_ret = true; + break; + default: + break; + } + return l_ret; +} + +const bool CDialog::moveCursorUp(const bool p_loop) +{ + bool l_ret(false); + if (m_highlightedLine) + { + --m_highlightedLine; + l_ret = true; + } + else if (p_loop && m_highlightedLine + 1 < m_nbOptions) + { + m_highlightedLine = m_nbOptions - 1; + l_ret = true; + } + return l_ret; +} + +const bool CDialog::moveCursorDown(const bool p_loop) +{ + bool l_ret(false); + if (m_highlightedLine + 1 < m_nbOptions) + { + ++m_highlightedLine; + l_ret = true; + } + else if (p_loop && m_highlightedLine) + { + m_highlightedLine = 0; + l_ret = true; + } + return l_ret; +} + +const bool CDialog::keyHold(void) +{ + bool l_ret(false); + switch(m_lastPressed) + { + case MYKEY_UP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_UP])) + l_ret = moveCursorUp(false); + break; + case MYKEY_DOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN])) + l_ret = moveCursorDown(false); + break; + default: + break; + } + return l_ret; +} + +const Sint16 &CDialog::getX(void) const +{ + return m_x; +} + +const Sint16 &CDialog::getY(void) const +{ + return m_y; +} + +const SDL_Surface * const CDialog::getImage(void) const +{ + return m_image; +} + +const unsigned int &CDialog::getHighlightedIndex(void) const +{ + return m_highlightedLine; +} diff --git a/other/DinguxCommander/src/dialog.h b/other/DinguxCommander/src/dialog.h new file mode 100644 index 0000000..bdc4ae5 --- /dev/null +++ b/other/DinguxCommander/src/dialog.h @@ -0,0 +1,89 @@ +#ifndef _DIALOG_H_ +#define _DIALOG_H_ + +#include +#include +#include +#include +#include "window.h" + +class CDialog : public CWindow +{ + public: + + // Constructor + // Coordinates = 0 => centered + CDialog(const std::string &p_title, const Sint16 p_x, const Sint16 p_y); + + // Destructor + virtual ~CDialog(void); + + // Add a label + void addLabel(const std::string &p_label); + + // Add a menu option + void addOption(const std::string &p_option); + + // Init. Call after all options are added. + void init(void); + + // Accessors + const Sint16 &getX(void) const; + const Sint16 &getY(void) const; + const SDL_Surface * const getImage(void) const; + const unsigned int &getHighlightedIndex(void) const; + + private: + + // Forbidden + CDialog(void); + CDialog(const CDialog &p_source); + const CDialog &operator =(const CDialog &p_source); + + // Key press management + virtual const bool keyPress(const SDL_Event &p_event); + + // Key hold management + virtual const bool keyHold(void); + + // Draw + virtual void render(const bool p_focus) const; + + // Move cursor + const bool moveCursorUp(const bool p_loop); + const bool moveCursorDown(const bool p_loop); + + // Number of titles (0 or 1), labels, and options + bool m_nbTitle; + unsigned char m_nbLabels; + unsigned char m_nbOptions; + + // List of lines + std::vector m_lines; + std::vector m_linesImg; + + // The highlighted item + unsigned int m_highlightedLine; + + // The image representing the dialog + SDL_Surface *m_image; + + // The cursor + SDL_Surface *m_cursor1; + SDL_Surface *m_cursor2; + + // Coordinates + Sint16 m_x; + Sint16 m_y; + Sint16 m_cursorX; + Sint16 m_cursorY; + + // Line clip + mutable SDL_Rect m_clip; + + // Pointers to resources + TTF_Font *m_font; + TTF_Font *m_font_sm; +}; + +#endif diff --git a/other/DinguxCommander/src/fileLister.cpp b/other/DinguxCommander/src/fileLister.cpp new file mode 100644 index 0000000..a539cda --- /dev/null +++ b/other/DinguxCommander/src/fileLister.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include "fileLister.h" + +bool compareNoCase(const T_FILE& p_s1, const T_FILE& p_s2) +{ + return strcasecmp(p_s1.m_name.c_str(), p_s2.m_name.c_str()) <= 0; +} + +CFileLister::CFileLister(void) +{ +} + +CFileLister::~CFileLister(void) +{ +} + +const bool CFileLister::list(const std::string &p_path) +{ + // Open dir + DIR *l_dir = opendir(p_path.c_str()); + if (l_dir == NULL) + { + std::cerr << "CFileLister::list: Error opening dir " << p_path << std::endl; + return false; + } + // Clean up + m_listFiles.clear(); + m_listDirs.clear(); + // Read dir + std::string l_file(""); + std::string l_fileFull(""); + struct stat l_stat; + struct dirent *l_dirent = readdir(l_dir); + while (l_dirent != NULL) + { + l_file = l_dirent->d_name; + // Filter the '.' and '..' dirs + if (l_file != "." && l_file != "..") + { + // Stat the file + l_fileFull = p_path + "/" + l_file; + if (stat(l_fileFull.c_str(), &l_stat) == -1) + { + std::cerr << "CFileLister::list: Error stat " << l_fileFull << std::endl; + } + else + { + // Check type + if (S_ISDIR(l_stat.st_mode)) + // It's a directory + m_listDirs.push_back(T_FILE(l_file, l_stat.st_size)); + else + // It's a file + m_listFiles.push_back(T_FILE(l_file, l_stat.st_size)); + } + } + // Next + l_dirent = readdir(l_dir); + } + // Close dir + closedir(l_dir); + // Sort lists + sort(m_listFiles.begin(), m_listFiles.end(), compareNoCase); + sort(m_listDirs.begin(), m_listDirs.end(), compareNoCase); + // Add "..", always at the first place + m_listDirs.insert(m_listDirs.begin(), T_FILE("..", 0)); + return true; +} + +const T_FILE &CFileLister::operator[](const unsigned int p_i) const +{ + if (p_i < m_listDirs.size()) + return m_listDirs[p_i]; + else + return m_listFiles[p_i - m_listDirs.size()]; +} + +const unsigned int CFileLister::getNbDirs(void) const +{ + return m_listDirs.size(); +} + +const unsigned int CFileLister::getNbFiles(void) const +{ + return m_listFiles.size(); +} + +const unsigned int CFileLister::getNbTotal(void) const +{ + return m_listDirs.size() + m_listFiles.size(); +} + +const bool CFileLister::isDirectory(const unsigned int p_i) const +{ + return p_i < m_listDirs.size(); +} + +const unsigned int CFileLister::searchDir(const std::string &p_name) const +{ + unsigned int l_ret = 0; + bool l_found = false; + // Search name in dirs + for (std::vector::const_iterator l_it = m_listDirs.begin(); (!l_found) && (l_it != m_listDirs.end()); ++l_it) + { + if ((*l_it).m_name == p_name) + l_found = true; + else + ++l_ret; + } + return l_found ? l_ret : 0; +} diff --git a/other/DinguxCommander/src/fileLister.h b/other/DinguxCommander/src/fileLister.h new file mode 100644 index 0000000..f1b4f82 --- /dev/null +++ b/other/DinguxCommander/src/fileLister.h @@ -0,0 +1,58 @@ +#ifndef _FILE_LISTER_H_ +#define _FILE_LISTER_H_ + +#include +#include + +// Class used to store file info +struct T_FILE +{ + T_FILE(void): m_name(""), m_size(0) {} + T_FILE(const std::string &p_name, const unsigned long int &p_size): m_name(p_name), m_size(p_size) {} + T_FILE(const T_FILE &p_source): m_name(p_source.m_name), m_size(p_source.m_size) {} + ~T_FILE(void) {} + const T_FILE &operator =(const T_FILE &p_source) { m_name = p_source.m_name; m_size = p_source.m_size; return *this; } + std::string m_name; + unsigned long int m_size; +}; + +class CFileLister +{ + public: + + // Constructor + CFileLister(void); + + // Destructor + virtual ~CFileLister(void); + + // Read the contents of the given path + // Returns false if the path does not exist + const bool list(const std::string &p_path); + + // Get an element in the list (dirs and files combined) + const T_FILE &operator[](const unsigned int p_i) const; + + // Get the number of dirs/files + const unsigned int getNbDirs(void) const; + const unsigned int getNbFiles(void) const; + const unsigned int getNbTotal(void) const; + + // True => directory, false => file + const bool isDirectory(const unsigned int p_i) const; + + // Get index of the given dir name, 0 if not found + const unsigned int searchDir(const std::string &p_name) const; + + private: + + // Forbidden + CFileLister(const CFileLister &p_source); + const CFileLister &operator =(const CFileLister &p_source); + + // The list of files/dir + std::vector m_listDirs; + std::vector m_listFiles; +}; + +#endif diff --git a/other/DinguxCommander/src/fileutils.cpp b/other/DinguxCommander/src/fileutils.cpp new file mode 100644 index 0000000..f97e5cc --- /dev/null +++ b/other/DinguxCommander/src/fileutils.cpp @@ -0,0 +1,356 @@ +#include +#include +#include +#include +#include +#include +#include "fileutils.h" +#include "def.h" +#include "dialog.h" +#include "sdlutils.h" + +#define SPECIAL_CHARS "\\`$();|{}&'\"*?<>[]!^~-#\n\r " + +void File_utils::copyFile(const std::vector &p_src, const std::string &p_dest) +{ + std::string l_command(""); + std::string l_destFile(""); + std::string l_fileName(""); + bool l_loop(true); + bool l_confirm(true); + bool l_execute(true); + for (std::vector::const_iterator l_it = p_src.begin(); l_loop && (l_it != p_src.end()); ++l_it) + { + l_execute = true; + // Check if destination files already exists + if (l_confirm) + { + l_fileName = getFileName(*l_it); + l_destFile = p_dest + (p_dest.at(p_dest.size() - 1) == '/' ? "" : "/") + l_fileName; + if (fileExists(l_destFile)) + { + INHIBIT(std::cout << "File " << l_destFile << " already exists => ask for confirmation" << std::endl;) + CDialog l_dialog("Question:", 0, 0); + l_dialog.addLabel("Overwrite " + l_fileName + "?"); + l_dialog.addOption("Yes"); + l_dialog.addOption("Yes to all"); + l_dialog.addOption("No"); + l_dialog.addOption("Cancel"); + l_dialog.init(); + switch (l_dialog.execute()) + { + case 1: + // Yes + break; + case 2: + // Yes to all + l_confirm = false; + break; + case 3: + // No + l_execute = false; + break; + default: + // Cancel + l_execute = false; + l_loop = false; + break; + } + } + } + if (l_execute) + { + // Waiting message + SDL_utils::pleaseWait(); + l_command = "\\cp -r " + specialChars(*l_it) + " " + specialChars(p_dest); + INHIBIT(std::cout << "Command: " << l_command << std::endl;) + system(l_command.c_str()); + } + } +} + +void File_utils::moveFile(const std::vector &p_src, const std::string &p_dest) +{ + std::string l_command(""); + std::string l_destFile(""); + std::string l_fileName(""); + bool l_loop(true); + bool l_confirm(true); + bool l_execute(true); + for (std::vector::const_iterator l_it = p_src.begin(); l_loop && (l_it != p_src.end()); ++l_it) + { + l_execute = true; + // Check if destination files already exists + if (l_confirm) + { + l_fileName = getFileName(*l_it); + l_destFile = p_dest + (p_dest.at(p_dest.size() - 1) == '/' ? "" : "/") + l_fileName; + if (fileExists(l_destFile)) + { + INHIBIT(std::cout << "File " << l_destFile << " already exists => ask for confirmation" << std::endl;) + CDialog l_dialog("Question:", 0, 0); + l_dialog.addLabel("Overwrite " + l_fileName + "?"); + l_dialog.addOption("Yes"); + l_dialog.addOption("Yes to all"); + l_dialog.addOption("No"); + l_dialog.addOption("Cancel"); + l_dialog.init(); + switch (l_dialog.execute()) + { + case 1: + // Yes + break; + case 2: + // Yes to all + l_confirm = false; + break; + case 3: + // No + l_execute = false; + break; + default: + // Cancel + l_execute = false; + l_loop = false; + break; + } + } + } + if (l_execute) + { + // Waiting message + SDL_utils::pleaseWait(); + l_command = "\\mv " + specialChars(*l_it) + " " + specialChars(p_dest); + INHIBIT(std::cout << "Command: " << l_command << std::endl;) + system(l_command.c_str()); + } + } +} + +void File_utils::renameFile(const std::string &p_file1, const std::string &p_file2) +{ + bool l_execute(true); + // Check if destination files already exists + if (fileExists(p_file2)) + { + INHIBIT(std::cout << "File " << p_file2 << " already exists => ask for confirmation" << std::endl;) + CDialog l_dialog("Question:", 0, 0); + l_dialog.addLabel("Overwrite " + getFileName(p_file2) + "?"); + l_dialog.addOption("Yes"); + l_dialog.addOption("No"); + l_dialog.init(); + if (l_dialog.execute() != 1) + l_execute = false; + } + if (l_execute) + { + std::string l_command = "\\mv " + specialChars(p_file1) + " " + specialChars(p_file2); + INHIBIT(std::cout << "Command: " << l_command << std::endl;) + system(l_command.c_str()); + } +} + +void File_utils::removeFile(const std::vector &p_files) +{ + std::string l_command(""); + for (std::vector::const_iterator l_it = p_files.begin(); l_it != p_files.end(); ++l_it) + { + l_command = "\\rm -rf " + specialChars(*l_it); + INHIBIT(std::cout << "Command: " << l_command << std::endl;) + system(l_command.c_str()); + } +} + +void File_utils::makeDirectory(const std::string &p_file) +{ + std::string l_command = "\\mkdir -p " + specialChars(p_file); + INHIBIT(std::cout << "Command: " << l_command << std::endl;) + system(l_command.c_str()); +} + +const bool File_utils::fileExists(const std::string &p_path) +{ + struct stat l_stat; + return stat(p_path.c_str(), &l_stat) == 0; +} + +const std::string File_utils::getFileName(const std::string &p_path) +{ + size_t l_pos = p_path.rfind('/'); + return p_path.substr(l_pos + 1); +} + +const std::string File_utils::getPath(const std::string &p_path) +{ + size_t l_pos = p_path.rfind('/'); + return p_path.substr(0, l_pos); +} + +void File_utils::executeFile(const std::string &p_file) +{ + // Command + std::string l_command = "./" + specialChars(getFileName(p_file)); + INHIBIT(std::cout << "File_utils::executeFile: " << l_command << " in " << getPath(p_file) << std::endl;) + // CD to the file's location + chdir(getPath(p_file).c_str()); + // Quit + SDL_utils::hastalavista(); + // Execute file + execlp("/bin/sh", "/bin/sh", "-c", l_command.c_str(), NULL); + // If we're here, there was an error with the execution + std::cerr << "Error executing file " << p_file << std::endl; + // Relaunch DinguxCommander + l_command = "./" + specialChars(getSelfExecutionName()); + INHIBIT(std::cout << "File_utils::executeFile: " << l_command << " in " << getSelfExecutionPath() << std::endl;) + chdir(getSelfExecutionPath().c_str()); + execlp(l_command.c_str(), l_command.c_str(), NULL); +} + +const std::string File_utils::getSelfExecutionPath(void) +{ + // Get execution path + std::string l_exePath(""); + char l_buff[255]; + int l_i = readlink("/proc/self/exe", l_buff, 255); + l_exePath = l_buff; + l_exePath = l_exePath.substr(0, l_i); + l_i = l_exePath.rfind("/"); + l_exePath = l_exePath.substr(0, l_i); + return l_exePath; +} + +const std::string File_utils::getSelfExecutionName(void) +{ + // Get execution path + std::string l_exePath(""); + char l_buff[255]; + int l_i = readlink("/proc/self/exe", l_buff, 255); + l_exePath = l_buff; + l_exePath = l_exePath.substr(0, l_i); + l_i = l_exePath.rfind("/"); + l_exePath = l_exePath.substr(l_i + 1); + return l_exePath; +} + +void File_utils::stringReplace(std::string &p_string, const std::string &p_search, const std::string &p_replace) +{ + // Replace all occurrences of p_search by p_replace in p_string + size_t l_pos = p_string.find(p_search, 0); + while (l_pos != std::string::npos) + { + p_string.replace(l_pos, p_search.length(), p_replace); + l_pos = p_string.find(p_search, l_pos + p_replace.length()); + } +} + +const std::string File_utils::specialChars(const std::string &p_string) +{ + // Insert a '\' before special characters + std::string l_ret(p_string); + const std::string l_specialChars(SPECIAL_CHARS); + const size_t l_length = l_specialChars.size(); + std::string l_char(""); + for (unsigned int l_i = 0; l_i < l_length; ++l_i) + { + l_char = l_specialChars.substr(l_i, 1); + stringReplace(l_ret, l_char, "\\" + l_char); + } + return l_ret; +} + +const unsigned long int File_utils::getFileSize(const std::string &p_file) +{ + unsigned long int l_ret(0); + struct stat l_stat; + if (stat(p_file.c_str(), &l_stat) == -1) + std::cerr << "File_utils::getFileSize: Error stat " << p_file << std::endl; + else + l_ret = l_stat.st_size; + return l_ret; +} + +void File_utils::diskInfo(void) +{ + std::string l_line(""); + // Execute command df -h + { + char l_buffer[256]; + FILE *l_pipe = popen("df -h", "r"); + if (l_pipe == NULL) + { + std::cerr << "File_utils::diskInfo: Error popen" << std::endl; + return; + } + while (l_line.empty() && fgets(l_buffer, sizeof(l_buffer), l_pipe) != NULL) + if (strstr(l_buffer, FILE_SYSTEM) != NULL) + l_line = l_buffer; + pclose(l_pipe); + } + if (!l_line.empty()) + { + // Separate line by spaces + std::istringstream l_iss(l_line); + std::vector l_tokens; + copy(std::istream_iterator(l_iss), std::istream_iterator(), std::back_inserter >(l_tokens)); + // Display dialog + CDialog l_dialog("Disk information:", 0, 0); + l_dialog.addLabel("Size: " + l_tokens[1]); + l_dialog.addLabel("Used: " + l_tokens[2] + " (" + l_tokens[4] + ")"); + l_dialog.addLabel("Available: " + l_tokens[3]); + l_dialog.addOption("OK"); + l_dialog.init(); + l_dialog.execute(); + } + else + std::cerr << "File_utils::diskInfo: Unable to find " << FILE_SYSTEM << std::endl; +} + +void File_utils::diskUsed(const std::vector &p_files) +{ + std::string l_line(""); + // Waiting message + SDL_utils::pleaseWait(); + // Build and execute command + { + std::string l_command("du -csh"); + for (std::vector::const_iterator l_it = p_files.begin(); l_it != p_files.end(); ++l_it) + l_command = l_command + " \"" + *l_it + "\""; + char l_buffer[256]; + FILE *l_pipe = popen(l_command.c_str(), "r"); + if (l_pipe == NULL) + { + std::cerr << "File_utils::diskUsed: Error popen" << std::endl; + return; + } + while (fgets(l_buffer, sizeof(l_buffer), l_pipe) != NULL); + l_line = l_buffer; + pclose(l_pipe); + } + // Separate line by spaces + { + std::istringstream l_iss(l_line); + std::vector l_tokens; + copy(std::istream_iterator(l_iss), std::istream_iterator(), std::back_inserter >(l_tokens)); + l_line = l_tokens[0]; + } + // Dialog + std::ostringstream l_stream; + CDialog l_dialog("Disk used:", 0, 0); + l_stream << p_files.size() << " items selected"; + l_dialog.addLabel(l_stream.str()); + l_dialog.addLabel("Disk used: " + l_line); + l_dialog.addOption("OK"); + l_dialog.init(); + l_dialog.execute(); +} + +void File_utils::formatSize(std::string &p_size) +{ + // Format 123456789 to 123,456,789 + int l_i = p_size.size() - 3; + while (l_i > 0) + { + p_size.insert(l_i, ","); + l_i -= 3; + } +} diff --git a/other/DinguxCommander/src/fileutils.h b/other/DinguxCommander/src/fileutils.h new file mode 100644 index 0000000..e8dbe62 --- /dev/null +++ b/other/DinguxCommander/src/fileutils.h @@ -0,0 +1,50 @@ +#ifndef _FILEUTILS_H_ +#define _FILEUTILS_H_ + +#include +#include + +namespace File_utils +{ + // File operations + + void copyFile(const std::vector &p_src, const std::string &p_dest); + + void moveFile(const std::vector &p_src, const std::string &p_dest); + + void removeFile(const std::vector &p_files); + + void executeFile(const std::string &p_file); + + void makeDirectory(const std::string &p_file); + + void renameFile(const std::string &p_file1, const std::string &p_file2); + + // File utilities + + const bool fileExists(const std::string &p_path); + + const unsigned long int getFileSize(const std::string &p_file); + + void formatSize(std::string &p_size); + + const std::string getFileName(const std::string &p_path); + + const std::string getPath(const std::string &p_path); + + const std::string getSelfExecutionPath(void); + + const std::string getSelfExecutionName(void); + + void stringReplace(std::string &p_string, const std::string &p_search, const std::string &p_replace); + + const std::string specialChars(const std::string &p_string); + + // Dialogs + + void diskInfo(void); + + void diskUsed(const std::vector &p_files); +} + +#endif diff --git a/other/DinguxCommander/src/keyboard.cpp b/other/DinguxCommander/src/keyboard.cpp new file mode 100644 index 0000000..2d7629c --- /dev/null +++ b/other/DinguxCommander/src/keyboard.cpp @@ -0,0 +1,483 @@ +#include +#include "keyboard.h" +#include "sdlutils.h" +#include "resourceManager.h" +#include "def.h" + +#define KB_X 28 +#define KB_Y 128 +#define FIELD_Y 98 +#define FIELD_W 258 + +CKeyboard::CKeyboard(const std::string &p_inputText): + CWindow(), + m_imageKeyboard(NULL), + m_textField(NULL), + m_inputText(p_inputText), + m_selected(0), + m_footer(NULL), + m_keySet(0), + m_font(CResourceManager::instance().getFont()), + m_font_sm(CResourceManager::instance().getSmallFont()) +{ + // Key sets + m_keySets[0] = "abcdefghijklmnopqrstuvwxyz0123456789., "; + m_keySets[1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789., "; + m_keySets[2] = "!#$%&'()[]{}+-;=@^_`´~¡¿¢£¤¥¦§«»±×÷©®° "; + m_keySets[3] = "áàäâãåéèëêæœçíìïîóòöôõðøñþúùüûýÿøßµ¹²³ "; + m_keySets[4] = "ÁÀÄÂÃÅÉÈËÊÆŒÇÍÌÏÎÓÒÖÔÕÐØÑÞÚÙÜÛÝŸØßµ¼½¾ "; + // Create keyboard image + { + SDL_Rect l_rect; + // Create keyboard image + m_imageKeyboard = SDL_utils::createImage(265, 84, SDL_MapRGB(Globals::g_screen->format, COLOR_BORDER)); + l_rect.x = 2; + l_rect.y = 2; + l_rect.w = 261; + l_rect.h = 80; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BG_2)); + // Keys + for (unsigned int l_y = 0; l_y < 3; ++l_y) + { + for (unsigned int l_x = 0; l_x < 13; ++l_x) + { + l_rect.x = 3 + 20 * l_x; + l_rect.y = 3 + 20 * l_y; + l_rect.w = 19; + l_rect.h = 18; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BORDER)); + ++l_rect.x; + ++l_rect.y; + l_rect.w -= 2; + l_rect.h -= 2; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BG_1)); + } + } + // Buttons Cancel and OK + l_rect.x = 3; + l_rect.y = 63; + l_rect.w = 129; + l_rect.h = 18; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BORDER)); + l_rect.x = 133; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BORDER)); + l_rect.w -= 2; + l_rect.h -= 2; + ++l_rect.y; + l_rect.x = 4; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BG_1)); + l_rect.x = 134; + SDL_FillRect(m_imageKeyboard, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BG_1)); + // Create text field image + m_textField = SDL_utils::createImage(265, 19, SDL_MapRGB(Globals::g_screen->format, COLOR_BORDER)); + l_rect.x = 2; + l_rect.y = 2; + l_rect.w = 261; + l_rect.h = 15; + SDL_FillRect(m_textField, &l_rect, SDL_MapRGB(m_imageKeyboard->format, COLOR_BG_1)); + } + // Create footer + m_footer = SDL_utils::createImage(SCREEN_WIDTH, H_FOOTER, SDL_MapRGB(Globals::g_screen->format, COLOR_BORDER)); + SDL_utils::applyText(SCREEN_WIDTH >> 1, 1, m_footer, m_font_sm, "A-Input B-Cancel START-OK L/R-Change Y-Backspace X-Space", Globals::g_colorTextTitle, SDL_utils::T_TEXT_ALIGN_CENTER); +} + +CKeyboard::~CKeyboard(void) +{ + // Free surfaces + if (m_imageKeyboard != NULL) + { + SDL_FreeSurface(m_imageKeyboard); + m_imageKeyboard = NULL; + } + if (m_textField != NULL) + { + SDL_FreeSurface(m_textField); + m_textField = NULL; + } + if (m_footer != NULL) + { + SDL_FreeSurface(m_footer); + m_footer = NULL; + } +} + +void CKeyboard::render(const bool p_focus) const +{ + INHIBIT(std::cout << "CKeyboard::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;) + // Draw input text field + SDL_utils::applySurface(KB_X, FIELD_Y, m_textField, Globals::g_screen); + // Input text + if (!m_inputText.empty()) + { + SDL_Surface *l_surfaceTmp = SDL_utils::renderText(m_font, m_inputText, Globals::g_colorTextNormal); + if (l_surfaceTmp->w > FIELD_W) + { + // Text is too big => clip it + SDL_Rect l_rect; + l_rect.x = l_surfaceTmp->w - FIELD_W; + l_rect.y = 0; + l_rect.w = FIELD_W; + l_rect.h = l_surfaceTmp->h; + SDL_utils::applySurface(KB_X + 5, FIELD_Y + 4 - Y_OFFSET, l_surfaceTmp, Globals::g_screen, &l_rect); + } + else + SDL_utils::applySurface(KB_X + 5, FIELD_Y + 4 - Y_OFFSET, l_surfaceTmp, Globals::g_screen); + } + // Draw keyboard + SDL_utils::applySurface(KB_X, KB_Y, m_imageKeyboard, Globals::g_screen); + // Cursor + { + SDL_Rect l_rect; + if (m_selected < 39) + { + // A letter is selected + l_rect.w = 17; + l_rect.h = 16; + l_rect.x = KB_X + 4; + if (m_selected >= 26) + { + l_rect.x = KB_X + 4 + (m_selected - 26) * 20; + l_rect.y = KB_Y + 44; + } + else if (m_selected >= 13) + { + l_rect.x = KB_X + 4 + (m_selected - 13) * 20; + l_rect.y = KB_Y + 24; + } + else + { + l_rect.x = KB_X + 4 + m_selected * 20; + l_rect.y = KB_Y + 4; + } + } + else + { + l_rect.w = 127; + l_rect.h = 16; + l_rect.x = KB_X + 4 + (m_selected == 40) * 130; + l_rect.y = KB_Y + 64; + } + SDL_FillRect(Globals::g_screen, &l_rect, SDL_MapRGB(Globals::g_screen->format, COLOR_CURSOR_1)); + } + // Draw keys text + { + unsigned int l_i(0); + unsigned int l_x(0); + unsigned int l_y(0); + std::string l_text(""); + for (l_y = 0; l_y < 3; ++l_y) + { + for (l_x = 0; l_x < 13; ++l_x) + { + if (utf8Code(m_keySets[m_keySet].at(l_i))) + { + l_text = m_keySets[m_keySet].substr(l_i, 2); + l_i += 2; + } + else + { + l_text = m_keySets[m_keySet].substr(l_i, 1); + l_i += 1; + } + SDL_utils::applyText(KB_X + 20 * l_x + 13, KB_Y + 7 + 20 * l_y - Y_OFFSET, Globals::g_screen, m_font, l_text, Globals::g_colorTextNormal, SDL_utils::T_TEXT_ALIGN_CENTER); + } + } + } + // Buttons text + SDL_utils::applyText(KB_X + 67, KB_Y + 67 - Y_OFFSET, Globals::g_screen, m_font, "Cancel", Globals::g_colorTextNormal, SDL_utils::T_TEXT_ALIGN_CENTER); + SDL_utils::applyText(KB_X + 197, KB_Y + 67 - Y_OFFSET, Globals::g_screen, m_font, "OK", Globals::g_colorTextNormal, SDL_utils::T_TEXT_ALIGN_CENTER); + // Draw footer + SDL_utils::applySurface(0, 227, m_footer, Globals::g_screen); +} + +const bool CKeyboard::keyPress(const SDL_Event &p_event) +{ + CWindow::keyPress(p_event); + bool l_ret(false); + switch (p_event.key.keysym.sym) + { + case MYKEY_PARENT: + // B => Cancel + m_retVal = -1; + l_ret = true; + break; + case MYKEY_UP: + l_ret = moveCursorUp(true); + break; + case MYKEY_DOWN: + l_ret = moveCursorDown(true); + break; + case MYKEY_LEFT: + l_ret = moveCursorLeft(true); + break; + case MYKEY_RIGHT: + l_ret = moveCursorRight(true); + break; + case MYKEY_SYSTEM: + // Y => Backspace + l_ret = backspace(); + break; + case MYKEY_OPERATION: + // X => Space + l_ret = type(" "); + break; + case MYKEY_OPEN: + // A => Button pressed + if (m_selected == 39) + { + // Button Cancel + m_retVal = -1; + l_ret = true; + } + else if (m_selected == 40) + { + // Button OK + m_retVal = 1; + l_ret = true; + } + else + // A letter button + l_ret = type(); + break; + case MYKEY_PAGEDOWN: + // R => Change keys forward + m_keySet = (m_keySet + 1) % NB_KEY_SETS; + l_ret = true; + break; + case MYKEY_PAGEUP: + // L => Change keys backward + m_keySet = m_keySet ? m_keySet - 1 : NB_KEY_SETS - 1; + l_ret = true; + break; + case MYKEY_TRANSFER: + // START => OK + m_retVal = 1; + l_ret = true; + default: + break; + } + return l_ret; +} + +const bool CKeyboard::keyHold(void) +{ + bool l_ret(false); + switch(m_lastPressed) + { + case MYKEY_UP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_UP])) + l_ret = moveCursorUp(false); + break; + case MYKEY_DOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN])) + l_ret = moveCursorDown(false); + break; + case MYKEY_LEFT: + if (tick(SDL_GetKeyState(NULL)[MYKEY_LEFT])) + l_ret = moveCursorLeft(false); + break; + case MYKEY_RIGHT: + if (tick(SDL_GetKeyState(NULL)[MYKEY_RIGHT])) + l_ret = moveCursorRight(false); + break; + case MYKEY_OPEN: + // A => Add letter + if (tick(SDL_GetKeyState(NULL)[MYKEY_OPEN])) + l_ret = type(); + break; + case MYKEY_SYSTEM: + // Y => Backspace + if (tick(SDL_GetKeyState(NULL)[MYKEY_SYSTEM])) + l_ret = backspace(); + break; + case MYKEY_OPERATION: + // X => Space + if (tick(SDL_GetKeyState(NULL)[MYKEY_OPERATION])) + l_ret = type(" "); + break; + default: + break; + } + return l_ret; +} + +const bool CKeyboard::moveCursorUp(const bool p_loop) +{ + bool l_ret(false); + if (m_selected == 39) + { + m_selected = 29; + l_ret = true; + } + else if (m_selected == 40) + { + m_selected = 35; + l_ret = true; + } + else if (m_selected >= 13) + { + m_selected -= 13; + l_ret = true; + } + else if (m_selected >= 6) + { + if (p_loop) + { + m_selected = 40; + l_ret = true; + } + } + else + { + if (p_loop) + { + m_selected = 39; + l_ret = true; + } + } + return l_ret; +} + +const bool CKeyboard::moveCursorDown(const bool p_loop) +{ + bool l_ret(false); + if (m_selected == 39) + { + if (p_loop) + { + m_selected = 3; + l_ret = true; + } + } + else if (m_selected == 40) + { + if (p_loop) + { + m_selected = 9; + l_ret = true; + } + } + else if (m_selected >= 32) + { + m_selected = 40; + l_ret = true; + } + else if (m_selected >= 26) + { + m_selected = 39; + l_ret = true; + } + else + { + m_selected += 13; + l_ret = true; + } + return l_ret; +} + +const bool CKeyboard::moveCursorLeft(const bool p_loop) +{ + bool l_ret(false); + switch (m_selected) + { + case 0: + case 13: + case 26: + if (p_loop) + { + m_selected += 12; + l_ret = true; + } + break; + case 39: + if (p_loop) + { + m_selected = 40; + l_ret = true; + } + break; + default: + --m_selected; + l_ret = true; + break; + } + return l_ret; +} + +const bool CKeyboard::moveCursorRight(const bool p_loop) +{ + bool l_ret(false); + switch (m_selected) + { + case 12: + case 25: + case 38: + if (p_loop) + { + m_selected -= 12; + l_ret = true; + } + break; + case 40: + if (p_loop) + { + m_selected = 39; + l_ret = true; + } + break; + default: + ++m_selected; + l_ret = true; + break; + } + return l_ret; +} + +const bool CKeyboard::type(const std::string &p_text) +{ + if (p_text.empty()) + { + // Append selected character to the input text + if (m_selected < 39) + { + // Get real index + unsigned char l_index(0); + for (unsigned char l_c = 0; l_c < m_selected; ++l_c) + l_index += 1 + utf8Code(m_keySets[m_keySet].at(l_index)); + // Get size + size_t l_size = 1 + utf8Code(m_keySets[m_keySet].at(l_index)); + // Append text + m_inputText += m_keySets[m_keySet].substr(l_index, l_size); + } + else + std::cerr << "CKeyboard::type : unexpected value: " << m_selected << std::endl; + } + else + // Append given text + m_inputText += p_text; + return true; +} + +const std::string &CKeyboard::getInputText(void) const +{ + return m_inputText; +} + +const bool CKeyboard::backspace(void) +{ + bool l_ret(false); + if (!m_inputText.empty()) + { + if (m_inputText.size() >= 2 && utf8Code(m_inputText.at(m_inputText.size() - 2))) + m_inputText.resize(m_inputText.size() - 2); + else + m_inputText.resize(m_inputText.size() - 1); + l_ret = true; + } + return l_ret; +} + +const bool CKeyboard::utf8Code(const unsigned char p_c) const +{ + return (p_c >= 194 && p_c <= 198) || p_c == 208 || p_c == 209; +} diff --git a/other/DinguxCommander/src/keyboard.h b/other/DinguxCommander/src/keyboard.h new file mode 100644 index 0000000..0af0592 --- /dev/null +++ b/other/DinguxCommander/src/keyboard.h @@ -0,0 +1,79 @@ +#ifndef _KEYBOARD_H_ +#define _KEYBOARD_H_ + +#include +#include +#include +#include "window.h" + +#define NB_KEY_SETS 5 + +class CKeyboard : public CWindow +{ + public: + + // Constructor + CKeyboard(const std::string &p_inputText); + + // Destructor + virtual ~CKeyboard(void); + + // Get input text + const std::string &getInputText(void) const; + + private: + + // Forbidden + CKeyboard(void); + CKeyboard(const CKeyboard &p_source); + const CKeyboard &operator =(const CKeyboard &p_source); + + // Key press management + virtual const bool keyPress(const SDL_Event &p_event); + + // Key hold management + virtual const bool keyHold(void); + + // Draw + virtual void render(const bool p_focus) const; + + // Move cursor + const bool moveCursorUp(const bool p_loop); + const bool moveCursorDown(const bool p_loop); + const bool moveCursorLeft(const bool p_loop); + const bool moveCursorRight(const bool p_loop); + + // Type a letter + const bool type(const std::string &p_text = ""); + + // Remove last letter + const bool backspace(void); + + // UTF8 character or not + const bool utf8Code(const unsigned char p_c) const; + + // The image representing the keyboard + SDL_Surface *m_imageKeyboard; + + // The image representing the input text field + SDL_Surface *m_textField; + + // The input text + std::string m_inputText; + + // The cursor index + unsigned char m_selected; + + // The footer + SDL_Surface *m_footer; + + // Key sets + std::string m_keySets[NB_KEY_SETS]; + unsigned char m_keySet; + + // Pointers to resources + TTF_Font *m_font; + TTF_Font *m_font_sm; +}; + +#endif diff --git a/other/DinguxCommander/src/main.cpp b/other/DinguxCommander/src/main.cpp new file mode 100644 index 0000000..0f72734 --- /dev/null +++ b/other/DinguxCommander/src/main.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include "def.h" +#include "sdlutils.h" +#include "resourceManager.h" +#include "commander.h" + +// Globals +SDL_Surface *Globals::g_screen = NULL; +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) +SDL_Surface *Globals::g_scaled = NULL; +#endif +const SDL_Color Globals::g_colorTextNormal = {COLOR_TEXT_NORMAL}; +const SDL_Color Globals::g_colorTextTitle = {COLOR_TEXT_TITLE}; +const SDL_Color Globals::g_colorTextDir = {COLOR_TEXT_DIR}; +const SDL_Color Globals::g_colorTextSelected = {COLOR_TEXT_SELECTED}; +std::vector Globals::g_windows; + +int main(int argc, char** argv) +{ + // Avoid crash due to the absence of mouse + { + char l_s[]="SDL_NOMOUSE=1"; + putenv(l_s); + } + +#if defined(PLATFORM_RG35XX) + // we launch in an overclocked state on rg35xx + system("echo 504000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed"); +#endif + + // Init SDL + SDL_Init(SDL_INIT_VIDEO); + + // Hide cursor + SDL_ShowCursor(SDL_DISABLE); + SDL_EnableKeyRepeat(300,100); + + // Screen +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) + Globals::g_scaled = SDL_SetVideoMode(640, 480, SCREEN_BPP, SURFACE_FLAGS); + if (Globals::g_scaled == NULL) + { + std::cerr << "SDL_SetVideoMode failed: " << SDL_GetError() << std::endl; + return 1; + } + Globals::g_screen = SDL_CreateRGBSurface(SURFACE_FLAGS, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 0,0,0,0); + if (Globals::g_screen == NULL) + { + std::cerr << "SDL_CreateRGBSurface (screen) failed: " << SDL_GetError() << std::endl; + return 1; + } +#else + Globals::g_screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SURFACE_FLAGS); + if (Globals::g_screen == NULL) + { + std::cerr << "SDL_SetVideoMode failed: " << SDL_GetError() << std::endl; + return 1; + } +#endif + + // Init font + if (TTF_Init() == -1) + { + std::cerr << "TTF_Init failed: " << SDL_GetError() << std::endl; + return 1; + } + +#if defined(PLATFORM_RG350) || defined(PLATFORM_ODBETA) + SDL_utils::checkIPU(); + SDL_utils::setIPUSharpness("0"); +#endif + + // Create instances + CResourceManager::instance(); + char *home = getenv("HOME"); + std::string l_path = home ? home : PATH_DEFAULT; + CCommander l_commander(l_path, l_path); + + // Main loop + l_commander.execute(); + + //Quit + SDL_utils::hastalavista(); + + return 0; +} diff --git a/other/DinguxCommander/src/panel.cpp b/other/DinguxCommander/src/panel.cpp new file mode 100644 index 0000000..d140752 --- /dev/null +++ b/other/DinguxCommander/src/panel.cpp @@ -0,0 +1,339 @@ +#include +#include +#include "panel.h" +#include "resourceManager.h" +#include "sdlutils.h" +#include "fileutils.h" + +#define PANEL_SIZE 158 +#define NAME_SIZE 140 + +CPanel::CPanel(const std::string &p_path, const Sint16 p_x): + m_currentPath(""), + m_camera(0), + m_x(p_x), + m_highlightedLine(0), + m_iconDir(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_FOLDER)), + m_iconFile(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_FILE)), + m_iconUp(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_UP)), + m_cursor1(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_CURSOR1)), + m_cursor2(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_CURSOR2)), + m_font(CResourceManager::instance().getFont()) +{ + // List the given path + if (m_fileLister.list(p_path)) + { + // Path OK + m_currentPath = p_path; + } + else + { + // The path is wrong => take default + m_fileLister.list(PATH_DEFAULT); + m_currentPath = PATH_DEFAULT; + } +} + +CPanel::~CPanel(void) +{ +} + +void CPanel::render(const bool p_active) const +{ + // Draw cursor + SDL_utils::applySurface(m_x - 1, Y_LIST + (m_highlightedLine - m_camera) * LINE_HEIGHT, p_active ? m_cursor1 : m_cursor2, Globals::g_screen); + // Draw panel + const Sint16 l_x = m_x + m_iconDir->w + 2; + const unsigned int l_nbTotal = m_fileLister.getNbTotal(); + Sint16 l_y = Y_LIST; + SDL_Surface *l_surfaceTmp = NULL; + const SDL_Color *l_color = NULL; + SDL_Rect l_rect; + // Current dir + l_surfaceTmp = SDL_utils::renderText(m_font, m_currentPath, Globals::g_colorTextTitle); + if (l_surfaceTmp->w > PANEL_SIZE) + { + l_rect.x = l_surfaceTmp->w - PANEL_SIZE; + l_rect.y = 0; + l_rect.w = PANEL_SIZE; + l_rect.h = l_surfaceTmp->h; + SDL_utils::applySurface(m_x, Y_HEADER - Y_OFFSET, l_surfaceTmp, Globals::g_screen, &l_rect); + } + else + { + SDL_utils::applySurface(m_x, Y_HEADER - Y_OFFSET, l_surfaceTmp, Globals::g_screen); + } + SDL_FreeSurface(l_surfaceTmp); + // Content + for (unsigned int l_i = m_camera; l_i < m_camera + NB_VISIBLE_LINES && l_i < l_nbTotal; ++l_i) + { + // Icon and color + if (m_fileLister.isDirectory(l_i)) + { + // Icon + if (m_fileLister[l_i].m_name == "..") + l_surfaceTmp = m_iconUp; + else + l_surfaceTmp = m_iconDir; + // Color + if (m_selectList.find(l_i) != m_selectList.end()) + l_color = &Globals::g_colorTextSelected; + else + l_color = &Globals::g_colorTextDir; + } + else + { + // Icon + l_surfaceTmp = m_iconFile; + // Color + if (m_selectList.find(l_i) != m_selectList.end()) + l_color = &Globals::g_colorTextSelected; + else + l_color = &Globals::g_colorTextNormal; + } + SDL_utils::applySurface(m_x, l_y, l_surfaceTmp, Globals::g_screen); + // Text + l_surfaceTmp = SDL_utils::renderText(m_font, m_fileLister[l_i].m_name, *l_color); + if (l_surfaceTmp->w > NAME_SIZE) + { + l_rect.x = 0; + l_rect.y = 0; + l_rect.w = NAME_SIZE; + l_rect.h = l_surfaceTmp->h; + SDL_utils::applySurface(l_x, l_y + 2 - Y_OFFSET, l_surfaceTmp, Globals::g_screen, &l_rect); + } + else + { + SDL_utils::applySurface(l_x, l_y + 2 - Y_OFFSET, l_surfaceTmp, Globals::g_screen); + } + SDL_FreeSurface(l_surfaceTmp); + // Next line + l_y += LINE_HEIGHT; + } + // Footer + std::string l_footer("-"); + if (!m_fileLister.isDirectory(m_highlightedLine)) + { + std::ostringstream l_s; + l_s << m_fileLister[m_highlightedLine].m_size; + l_footer = l_s.str(); + File_utils::formatSize(l_footer); + } + SDL_utils::applyText(m_x + 2, Y_FOOTER - Y_OFFSET, Globals::g_screen, m_font, "Size:", Globals::g_colorTextTitle); + SDL_utils::applyText(m_x + PANEL_SIZE - 2, Y_FOOTER - Y_OFFSET, Globals::g_screen, m_font, l_footer, Globals::g_colorTextTitle, SDL_utils::T_TEXT_ALIGN_RIGHT); +} + +const bool CPanel::moveCursorUp(unsigned char p_step) +{ + bool l_ret(false); + if (m_highlightedLine) + { + // Move cursor + if (m_highlightedLine > p_step) + m_highlightedLine -= p_step; + else + m_highlightedLine = 0; + // Adjust camera + adjustCamera(); + // Return true for new render + l_ret = true; + } + return l_ret; +} + +const bool CPanel::moveCursorDown(unsigned char p_step) +{ + bool l_ret(false); + const unsigned int l_nb = m_fileLister.getNbTotal(); + if (m_highlightedLine < l_nb - 1) + { + // Move cursor + if (m_highlightedLine + p_step > l_nb - 1) + m_highlightedLine = l_nb - 1; + else + m_highlightedLine += p_step; + // Adjust camera + adjustCamera(); + // Return true for new render + l_ret = true; + } + return l_ret; +} + +const bool CPanel::open(const std::string &p_path) +{ + bool l_ret(false); + std::string l_newPath(""); + std::string l_oldDir(""); + if (p_path.empty()) + { + // Open highlighted dir + if (m_fileLister[m_highlightedLine].m_name == "..") + { + // Go to parent dir + size_t l_pos = m_currentPath.rfind('/'); + // Remove the last dir in the path + l_newPath = m_currentPath.substr(0, l_pos); + if (l_newPath.empty()) + // We're at / + l_newPath = "/"; + l_oldDir = m_currentPath.substr(l_pos + 1); + } + else + { + l_newPath = m_currentPath + (m_currentPath == "/" ? "" : "/") + m_fileLister[m_highlightedLine].m_name; + } + } + else + { + // Open given dir + if (p_path == m_currentPath) + return false; + l_newPath = p_path; + } + // List the new path + if (m_fileLister.list(l_newPath)) + { + // Path OK + m_currentPath = l_newPath; + // If it's a back movement, restore old dir + if (!l_oldDir.empty()) + m_highlightedLine = m_fileLister.searchDir(l_oldDir); + else + m_highlightedLine = 0; + // Camera + adjustCamera(); + // Clear select list + m_selectList.clear(); + // New render + l_ret = true; + } + INHIBIT(std::cout << "open - new current path: " << m_currentPath << std::endl;) + return l_ret; +} + +const bool CPanel::goToParentDir(void) +{ + bool l_ret(false); + // Select ".." and open it + if (m_currentPath != "/") + { + m_highlightedLine = 0; + l_ret = open(); + } + return l_ret; +} + +void CPanel::adjustCamera(void) +{ + if (m_fileLister.getNbTotal() <= NB_VISIBLE_LINES) + m_camera = 0; + else if (m_highlightedLine < m_camera) + m_camera = m_highlightedLine; + else if (m_highlightedLine > m_camera + NB_VISIBLE_LINES - 1) + m_camera = m_highlightedLine - NB_VISIBLE_LINES + 1; +} + +const std::string &CPanel::getHighlightedItem(void) const +{ + return m_fileLister[m_highlightedLine].m_name; +} + +const std::string CPanel::getHighlightedItemFull(void) const +{ + return m_currentPath + (m_currentPath == "/" ? "" : "/") + m_fileLister[m_highlightedLine].m_name; +} + +const std::string &CPanel::getCurrentPath(void) const +{ + return m_currentPath; +} + +const unsigned int &CPanel::getHighlightedIndex(void) const +{ + return m_highlightedLine; +} + +const unsigned int CPanel::getHighlightedIndexRelative(void) const +{ + return m_highlightedLine - m_camera; +} + +void CPanel::refresh(void) +{ + // List current path + if (m_fileLister.list(m_currentPath)) + { + // Adjust selected line + if (m_highlightedLine > m_fileLister.getNbTotal() - 1) + m_highlightedLine = m_fileLister.getNbTotal() - 1; + } + else + { + // Current path doesn't exist anymore => default + m_fileLister.list(PATH_DEFAULT); + m_currentPath = PATH_DEFAULT; + m_highlightedLine = 0; + } + // Camera + adjustCamera(); + // Clear select list + m_selectList.clear(); +} + +const bool CPanel::addToSelectList(const bool p_step) +{ + if (m_fileLister[m_highlightedLine].m_name != "..") + { + // Search highlighted element in select list + std::set::iterator l_it = m_selectList.find(m_highlightedLine); + if (l_it == m_selectList.end()) + // Element not present => we add it + m_selectList.insert(m_highlightedLine); + else + // Element present => we remove it from the list + m_selectList.erase(m_highlightedLine); + if (p_step) + moveCursorDown(1); + return true; + } + else + { + return false; + } +} + +const std::set &CPanel::getSelectList(void) const +{ + return m_selectList; +} + +void CPanel::getSelectList(std::vector &p_list) const +{ + p_list.clear(); + // Insert full path of selected files + for (std::set::const_iterator l_it = m_selectList.begin(); l_it != m_selectList.end(); ++l_it) + { + if (m_currentPath == "/") + p_list.push_back(m_currentPath + m_fileLister[*l_it].m_name); + else + p_list.push_back(m_currentPath + "/" + m_fileLister[*l_it].m_name); + } +} + +void CPanel::selectAll(void) +{ + const unsigned int l_nb = m_fileLister.getNbTotal(); + for (unsigned int l_i = 1; l_i < l_nb; ++l_i) + m_selectList.insert(l_i); +} + +void CPanel::selectNone(void) +{ + m_selectList.clear(); +} + +const bool CPanel::isDirectoryHighlighted(void) const +{ + return m_fileLister.isDirectory(m_highlightedLine); +} diff --git a/other/DinguxCommander/src/panel.h b/other/DinguxCommander/src/panel.h new file mode 100644 index 0000000..7fcecec --- /dev/null +++ b/other/DinguxCommander/src/panel.h @@ -0,0 +1,101 @@ +#ifndef _PANEL_H_ +#define _PANEL_H_ + +#include +#include +#include +#include +#include "fileLister.h" +#include "def.h" + +class CPanel +{ + public: + + // Constructor + CPanel(const std::string &p_path, const Sint16 p_x); + + // Destructor + virtual ~CPanel(void); + + // Draw the panel on the screen + void render(const bool p_active) const; + + // Move cursor + const bool moveCursorUp(unsigned char p_step); + const bool moveCursorDown(unsigned char p_step); + + // Open selected item + const bool open(const std::string &p_path = ""); + + // Refresh current directory + void refresh(void); + + // Go to parent dir + const bool goToParentDir(void); + + // Selected file with just the name + const std::string &getHighlightedItem(void) const; + + // Selected file with full path + const std::string getHighlightedItemFull(void) const; + + // Current path + const std::string &getCurrentPath(void) const; + + // Selected index + const unsigned int &getHighlightedIndex(void) const; + const unsigned int getHighlightedIndexRelative(void) const; + + // True => directory, false => file, or dir ".." + const bool isDirectoryHighlighted(void) const; + + // Add/remove current file to the select list + const bool addToSelectList(const bool p_step); + + // Get select list + const std::set &getSelectList(void) const; + void getSelectList(std::vector &p_list) const; + + // Clear select list + void selectAll(void); + void selectNone(void); + + private: + + // Forbidden + CPanel(void); + CPanel(const CPanel &p_source); + const CPanel &operator =(const CPanel &p_source); + + // Adjust camera + void adjustCamera(void); + + // File lister + CFileLister m_fileLister; + + // Current path + std::string m_currentPath; + + // Index of the first displayed line + unsigned int m_camera; + + // X coordinate + const Sint16 m_x; + + // Highlighted line + unsigned int m_highlightedLine; + + // Selection list + std::set m_selectList; + + // Pointers to resources + SDL_Surface *m_iconDir; + SDL_Surface *m_iconFile; + SDL_Surface *m_iconUp; + SDL_Surface *m_cursor1; + SDL_Surface *m_cursor2; + TTF_Font *m_font; +}; + +#endif diff --git a/other/DinguxCommander/src/resourceManager.cpp b/other/DinguxCommander/src/resourceManager.cpp new file mode 100644 index 0000000..992eada --- /dev/null +++ b/other/DinguxCommander/src/resourceManager.cpp @@ -0,0 +1,71 @@ +#include +#include "resourceManager.h" +#include "def.h" +#include "sdlutils.h" +#include "def.h" + +CResourceManager& CResourceManager::instance(void) +{ + static CResourceManager l_singleton; + return l_singleton; +} + +CResourceManager::CResourceManager(void) : + m_font(NULL) +{ + // Load images + m_surfaces[T_SURFACE_BG] = SDL_utils::loadImage(RESDIR "/background.png"); + m_surfaces[T_SURFACE_FILE] = SDL_utils::loadImage(RESDIR "/file.png"); + m_surfaces[T_SURFACE_FOLDER] = SDL_utils::loadImage(RESDIR "/folder.png"); + m_surfaces[T_SURFACE_UP] = SDL_utils::loadImage(RESDIR "/up.png"); + m_surfaces[T_SURFACE_CURSOR1] = SDL_utils::createImage(159, 15, SDL_MapRGB(Globals::g_screen->format, COLOR_CURSOR_1)); + m_surfaces[T_SURFACE_CURSOR2] = SDL_utils::createImage(159, 15, SDL_MapRGB(Globals::g_screen->format, COLOR_CURSOR_2)); + // Load fonts +#if defined(PLATFORM_TRIMUI) + m_font = SDL_utils::loadFont(RESDIR "/Commander-11.ttf", 11); +#else + m_font = SDL_utils::loadFont(RESDIR "/Fiery_Turk.ttf", 8); +#endif + m_font_sm = SDL_utils::loadFont(RESDIR "/Fiery_Turk.ttf", 8); +} + +void CResourceManager::sdlCleanup(void) +{ + INHIBIT(std::cout << "CResourceManager::sdlCleanup" << std::endl;) + int l_i(0); + // Free surfaces + for (l_i = 0; l_i < NB_SURFACES; ++l_i) + { + if (m_surfaces[l_i] != NULL) + { + SDL_FreeSurface(m_surfaces[l_i]); + m_surfaces[l_i] = NULL; + } + } + // Free fonts + if (m_font != NULL) + { + TTF_CloseFont(m_font); + m_font = NULL; + } + if (m_font_sm != NULL) + { + TTF_CloseFont(m_font_sm); + m_font_sm = NULL; + } +} + +SDL_Surface *CResourceManager::getSurface(const T_SURFACE p_surface) const +{ + return m_surfaces[p_surface]; +} + +TTF_Font *CResourceManager::getFont(void) const +{ + return m_font; +} + +TTF_Font *CResourceManager::getSmallFont(void) const +{ + return m_font_sm; +} diff --git a/other/DinguxCommander/src/resourceManager.h b/other/DinguxCommander/src/resourceManager.h new file mode 100644 index 0000000..f9559ac --- /dev/null +++ b/other/DinguxCommander/src/resourceManager.h @@ -0,0 +1,52 @@ +#ifndef _RESOURCEMANAGER_H_ +#define _RESOURCEMANAGER_H_ + +#include +#include + +#define NB_SURFACES 6 + +class CResourceManager +{ + public: + + typedef enum + { + T_SURFACE_BG = 0, + T_SURFACE_FILE, + T_SURFACE_FOLDER, + T_SURFACE_UP, + T_SURFACE_CURSOR1, + T_SURFACE_CURSOR2 + } + T_SURFACE; + + // Method to get the instance + static CResourceManager& instance(void); + + // Cleanup all resources + void sdlCleanup(void); + + // Get a loaded surface + SDL_Surface *getSurface(const T_SURFACE p_surface) const; + + // Get the loaded fonts + TTF_Font *getFont(void) const; + TTF_Font *getSmallFont(void) const; + + private: + + // Forbidden + CResourceManager(void); + CResourceManager(const CResourceManager &p_source); + const CResourceManager &operator =(const CResourceManager &p_source); + + // Images + SDL_Surface *m_surfaces[NB_SURFACES]; + + // Fonts + TTF_Font *m_font; + TTF_Font *m_font_sm; +}; + +#endif diff --git a/other/DinguxCommander/src/sdlutils.cpp b/other/DinguxCommander/src/sdlutils.cpp new file mode 100644 index 0000000..b9dad35 --- /dev/null +++ b/other/DinguxCommander/src/sdlutils.cpp @@ -0,0 +1,322 @@ +#include +#include "sdlutils.h" +#include +#include "def.h" +#include "resourceManager.h" + + +#if defined(PLATFORM_RG350) || defined(PLATFORM_ODBETA) +#include +std::string ipuscaling = "NONE"; + +// copied from gambatte-dms +void SDL_utils::checkIPU(void) { + FILE *aspect_ratio_file = NULL; + DIR *ipu_dir = NULL; + std::string ipu_OpenDinguxLegacy = ("/sys/devices/platform/jz-lcd.0/keep_aspect_ratio"); + std::string ipu_RetroFW10 = ("/proc/jz/ipu_ratio"); + std::string ipu_RetroFW20 = ("/proc/jz/ipu"); + std::string ipu_OpenDingux = ("/sys/devices/platform/13080000.ipu"); + + aspect_ratio_file = fopen(ipu_OpenDinguxLegacy.c_str(), "r+"); + if (aspect_ratio_file != NULL) { + fclose(aspect_ratio_file); + ipuscaling = ipu_OpenDinguxLegacy; + printf("Detected IPU scaling - OpenDinguxLegacy\n"); + return; + } + aspect_ratio_file = fopen(ipu_RetroFW10.c_str(), "r+"); + if (aspect_ratio_file != NULL) { + fclose(aspect_ratio_file); + ipuscaling = ipu_RetroFW10; + printf("Detected IPU scaling - RetroFW 1.X\n"); + return; + } + aspect_ratio_file = fopen("/proc/jz/gpio", "r+"); //workaround to check if the fw is retrofw2 + if (aspect_ratio_file != NULL) { + fclose(aspect_ratio_file); + ipuscaling = ipu_RetroFW20; + printf("Detected IPU scaling - RetroFW 2.X\n"); + return; + } + ipu_dir = opendir("/sys/devices/platform/13080000.ipu"); + if (ipu_dir != NULL) { + closedir(ipu_dir); + ipuscaling = "NEW_OD_IPU"; + printf("Detected IPU scaling - OpenDingux\n"); + return; + } + printf("Could not detect IPU scaling\n"); + return; +} + +void SDL_utils::setIPUSharpness(const char *svalue){ + if (ipuscaling == "NONE") return; + else if (ipuscaling == "NEW_OD_IPU") { + if(svalue == "0"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=0"); + } else if(svalue == "1"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=1"); + } else if(svalue == "2"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=2"); + } else if(svalue == "3"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=3"); + } else if(svalue == "4"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=4"); + } else if(svalue == "5"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=5"); + } else if(svalue == "6"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=6"); + } else if(svalue == "7"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=7"); + } else if(svalue == "8"){ + SDL_putenv("SDL_VIDEO_KMSDRM_SCALING_SHARPNESS=8"); + } + return; + } + FILE *sharpness_file = NULL; + sharpness_file = fopen("/sys/devices/platform/jz-lcd.0/sharpness_upscaling", "r+"); + if (sharpness_file != NULL) { + fclose(sharpness_file); + sharpness_file = fopen("/sys/devices/platform/jz-lcd.0/sharpness_upscaling", "w"); + fwrite(svalue, 1, 1, sharpness_file); + fclose(sharpness_file); + } +} +#endif + +// Load an image using SDL_image +SDL_Surface *SDL_utils::loadImage(const std::string &p_filename) +{ + INHIBIT(std::cout << "SDL_utils::loadImage(" << p_filename << ")" << std::endl;) + // Load image + SDL_Surface* l_img = IMG_Load(p_filename.c_str()); + SDL_Surface* l_img2 = NULL; + if(l_img != NULL) + { + // Optimize the image + l_img2 = SDL_DisplayFormat(l_img); + // Free the first image + SDL_FreeSurface(l_img); + // Set color key + if (l_img2 != NULL) + SDL_SetColorKey(l_img2, SDL_SRCCOLORKEY, SDL_MapRGB(l_img2->format, COLOR_KEY)); + } + // Check errors + if (l_img2 == NULL) + std::cerr << "SDL_utils::loadImage: " << SDL_GetError() << std::endl; + return l_img2; +} + +void SDL_utils::applySurface(const Sint16 p_x, const Sint16 p_y, SDL_Surface* p_source, SDL_Surface* p_destination, SDL_Rect *p_clip) +{ + // Rectangle to hold the offsets + SDL_Rect l_offset; + // Set offsets + l_offset.x = p_x; + l_offset.y = p_y; + //Blit the surface + SDL_BlitSurface(p_source, p_clip, p_destination, &l_offset); +} + +TTF_Font *SDL_utils::loadFont(const std::string &p_font, const int p_size) +{ + INHIBIT(std::cout << "SDL_utils::loadFont(" << p_font << ", " << p_size << ")" << std::endl;) + TTF_Font *l_font = TTF_OpenFont(p_font.c_str(), p_size); + if (l_font == NULL) + std::cerr << "SDL_utils::loadFont: " << SDL_GetError() << std::endl; + return l_font; +} + +SDL_Surface *SDL_utils::renderText(TTF_Font *p_font, const std::string &p_text, const SDL_Color &p_fg) +{ + return TTF_RenderUTF8_Solid(p_font, p_text.c_str(), p_fg); +} + +void SDL_utils::applyText(const Sint16 p_x, const Sint16 p_y, SDL_Surface* p_destination, TTF_Font *p_font, const std::string &p_text, const SDL_Color &p_fg, const T_TEXT_ALIGN p_align) +{ + SDL_Surface *l_text = renderText(p_font, p_text, p_fg); + switch (p_align) + { + case T_TEXT_ALIGN_LEFT: + applySurface(p_x, p_y, l_text, p_destination); + break; + case T_TEXT_ALIGN_RIGHT: + applySurface(p_x - l_text->w, p_y, l_text, p_destination); + break; + case T_TEXT_ALIGN_CENTER: + applySurface(p_x - l_text->w / 2, p_y, l_text, p_destination); + break; + default: + break; + } + SDL_FreeSurface(l_text); +} + +SDL_Surface *SDL_utils::createImage(const int p_width, const int p_height, const Uint32 p_color) +{ + // Create image in the same format as the screen + SDL_Surface *l_ret = SDL_CreateRGBSurface(SURFACE_FLAGS, p_width, p_height, Globals::g_screen->format->BitsPerPixel, Globals::g_screen->format->Rmask, Globals::g_screen->format->Gmask, Globals::g_screen->format->Bmask, Globals::g_screen->format->Amask); + if (l_ret == NULL) + std::cerr << "SDL_utils::createImage: " << SDL_GetError() << std::endl; + // Fill image with the given color + SDL_FillRect(l_ret, NULL, p_color); + return l_ret; +} + +void SDL_utils::renderAll(void) +{ + if (Globals::g_windows.empty()) + return; + // First window to draw is the last fullscreen + unsigned int l_i = Globals::g_windows.size() - 1; + while (l_i && !Globals::g_windows[l_i]->isFullScreen()) + --l_i; + // Draw windows + for (std::vector::iterator l_it = Globals::g_windows.begin() + l_i; l_it != Globals::g_windows.end(); ++l_it) + (*l_it)->render(l_it + 1 == Globals::g_windows.end()); +} + +void SDL_utils::hastalavista(void) +{ + // Destroy all dialogs except the first one (the commander) + while (Globals::g_windows.size() > 1) + delete Globals::g_windows.back(); + // Free resources + CResourceManager::instance().sdlCleanup(); + +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) + SDL_FreeSurface(Globals::g_screen); +#endif + + // Quit SDL + TTF_Quit(); + SDL_Quit(); +} + +void SDL_utils::pleaseWait(void) +{ + SDL_Surface *l_surfaceTmp = renderText(CResourceManager::instance().getFont(), "Please wait...", Globals::g_colorTextNormal); + SDL_Rect l_rect; + l_rect.x = (SCREEN_WIDTH - (l_surfaceTmp->w + 2 * DIALOG_MARGIN + 2 * DIALOG_BORDER)) >> 1; + l_rect.y = (SCREEN_HEIGHT - (l_surfaceTmp->h + 9)) >> 1; + l_rect.w = l_surfaceTmp->w + 2 * DIALOG_MARGIN + 2 * DIALOG_BORDER; + l_rect.h = l_surfaceTmp->h + 9; + SDL_FillRect(Globals::g_screen, &l_rect, SDL_MapRGB(Globals::g_screen->format, COLOR_BORDER)); + l_rect.x += DIALOG_BORDER; + l_rect.y += DIALOG_BORDER; + l_rect.w -= 2 * DIALOG_BORDER; + l_rect.h -= 2 * DIALOG_BORDER; + SDL_FillRect(Globals::g_screen, &l_rect, SDL_MapRGB(Globals::g_screen->format, COLOR_BG_1)); + applySurface((SCREEN_WIDTH - l_surfaceTmp->w) >> 1, (SCREEN_HEIGHT - l_surfaceTmp->h) >> 1, l_surfaceTmp, Globals::g_screen); + SDL_FreeSurface(l_surfaceTmp); +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) + upscale16NEON(Globals::g_screen->pixels, Globals::g_scaled->pixels); + SDL_Flip(Globals::g_scaled); +#else + SDL_Flip(Globals::g_screen); +#endif +} + +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) +// eggs amazing SW integer scaler +void upscale16NEON(void* src, void* dst) { + asm volatile ( + " vmov.u64 d1,#0xFFFFFFFF ;" + " vmvn.u64 d0,#0xFFFFFFFF ;" + " add r2,%0,#(320*240*2) ;" + "1: add r3,%1,#(640*1*2) ;" + " add lr,%1,#(640*2*2) ;" + "2: vldmia %0!,{q8-q11} ;" + " vdup.16 d2,d23[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d23[2] ;" + " vand d3,d3,d1 ;" + " vorr d31,d2,d3 ;" + " vdup.16 d2,d23[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d23[0] ;" + " vand d3,d3,d1 ;" + " vorr d30,d2,d3 ;" + " vdup.16 d2,d22[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d22[2] ;" + " vand d3,d3,d1 ;" + " vorr d29,d2,d3 ;" + " vdup.16 d2,d22[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d22[0] ;" + " vand d3,d3,d1 ;" + " vorr d28,d2,d3 ;" + " vdup.16 d2,d21[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d21[2] ;" + " vand d3,d3,d1 ;" + " vorr d27,d2,d3 ;" + " vdup.16 d2,d21[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d21[0] ;" + " vand d3,d3,d1 ;" + " vorr d26,d2,d3 ;" + " vdup.16 d2,d20[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d20[2] ;" + " vand d3,d3,d1 ;" + " vorr d25,d2,d3 ;" + " vdup.16 d2,d20[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d20[0] ;" + " vand d3,d3,d1 ;" + " vorr d24,d2,d3 ;" + " vdup.16 d2,d19[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d19[2] ;" + " vand d3,d3,d1 ;" + " vorr d23,d2,d3 ;" + " vdup.16 d2,d19[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d19[0] ;" + " vand d3,d3,d1 ;" + " vorr d22,d2,d3 ;" + " vdup.16 d2,d18[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d18[2] ;" + " vand d3,d3,d1 ;" + " vorr d21,d2,d3 ;" + " vdup.16 d2,d18[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d18[0] ;" + " vand d3,d3,d1 ;" + " vorr d20,d2,d3 ;" + " vdup.16 d2,d17[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d17[2] ;" + " vand d3,d3,d1 ;" + " vorr d19,d2,d3 ;" + " vdup.16 d2,d17[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d17[0] ;" + " vand d3,d3,d1 ;" + " vorr d18,d2,d3 ;" + " vdup.16 d2,d16[3] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d16[2] ;" + " vand d3,d3,d1 ;" + " vorr d17,d2,d3 ;" + " vdup.16 d2,d16[1] ;" + " vand d2,d2,d0 ;" + " vdup.16 d3,d16[0] ;" + " vand d3,d3,d1 ;" + " vorr d16,d2,d3 ;" + " vstmia %1!,{q8-q15} ;" + " vstmia r3!,{q8-q15} ;" + " cmp r3,lr ;" + " bne 2b ;" + " cmp %0,r2 ;" + " mov %1,lr ;" + " bne 1b " + :: "r"(src), "r"(dst) + : "r2","r3","lr","q0","q1","q8","q9","q10","q11","q12","q13","q14","q15","memory","cc" + ); +} +#endif \ No newline at end of file diff --git a/other/DinguxCommander/src/sdlutils.h b/other/DinguxCommander/src/sdlutils.h new file mode 100644 index 0000000..294977f --- /dev/null +++ b/other/DinguxCommander/src/sdlutils.h @@ -0,0 +1,76 @@ +#ifndef _SDLUTILS_H_ +#define _SDLUTILS_H_ + +#include +#include +#include +#include +#include "window.h" + +namespace SDL_utils +{ + // Text alignment + typedef enum + { + T_TEXT_ALIGN_LEFT = 0, + T_TEXT_ALIGN_RIGHT, + T_TEXT_ALIGN_CENTER + } + T_TEXT_ALIGN; + +#if defined(PLATFORM_RG350) || defined(PLATFORM_ODBETA) + // identify IPU if available + void checkIPU(void); + void setIPUSharpness(const char *svalue); +#endif + + // Load an image using SDL_image + SDL_Surface *loadImage(const std::string &p_filename); + + // Load a TTF font + TTF_Font *loadFont(const std::string &p_font, const int p_size); + + // Apply a surface on another surface + void applySurface(const Sint16 p_x, const Sint16 p_y, SDL_Surface* p_source, SDL_Surface* p_destination, SDL_Rect *p_clip = NULL); + + // Render a text + SDL_Surface *renderText(TTF_Font *p_font, const std::string &p_text, const SDL_Color &p_fg); + + // Render a text and apply on a given surface + void applyText(const Sint16 p_x, const Sint16 p_y, SDL_Surface* p_destination, TTF_Font *p_font, const std::string &p_text, const SDL_Color &p_fg, const T_TEXT_ALIGN p_align = T_TEXT_ALIGN_LEFT); + + // Create an image filled with the given color + SDL_Surface *createImage(const int p_width, const int p_height, const Uint32 p_color); + + // Render all opened windows + void renderAll(void); + + // Cleanup and quit + void hastalavista(void); + + // Display a waiting window + void pleaseWait(void); +} + +// Globals +namespace Globals +{ + // Screen + extern SDL_Surface *g_screen; +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) + extern SDL_Surface *g_scaled; +#endif + // Colors + extern const SDL_Color g_colorTextNormal; + extern const SDL_Color g_colorTextTitle; + extern const SDL_Color g_colorTextDir; + extern const SDL_Color g_colorTextSelected; + // The list of opened windows + extern std::vector g_windows; +} + +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) +void upscale16NEON(void* src, void* dst); +#endif + +#endif diff --git a/other/DinguxCommander/src/viewer.cpp b/other/DinguxCommander/src/viewer.cpp new file mode 100644 index 0000000..204735a --- /dev/null +++ b/other/DinguxCommander/src/viewer.cpp @@ -0,0 +1,219 @@ +#include +#include +#include "viewer.h" +#include "resourceManager.h" +#include "def.h" +#include "sdlutils.h" + +CViewer::CViewer(const std::string &p_fileName): + CWindow(), + m_fileName(p_fileName), + m_firstLine(0), + m_image(NULL), + m_font(CResourceManager::instance().getFont()) +{ + // Init clip rect + m_clip.x = 0; + m_clip.y = 0; + m_clip.w = SCREEN_WIDTH - 2 * VIEWER_MARGIN; + // Create background image + m_image = SDL_utils::createImage(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_MapRGB(Globals::g_screen->format, COLOR_BG_1)); + { + SDL_Rect l_rect; + l_rect.x = 0; + l_rect.y = 0; + l_rect.w = SCREEN_WIDTH; + l_rect.h = Y_LIST; + SDL_FillRect(m_image, &l_rect, SDL_MapRGB(m_image->format, COLOR_BORDER)); + } + // Print title + SDL_Surface *l_surfaceTmp = SDL_utils::renderText(m_font, m_fileName, Globals::g_colorTextTitle); + if (l_surfaceTmp->w > m_image->w - 2 * VIEWER_MARGIN) + { + SDL_Rect l_rect; + l_rect.x = l_surfaceTmp->w - (m_image->w - 2 * VIEWER_MARGIN); + l_rect.y = 0; + l_rect.w = m_image->w - 2 * VIEWER_MARGIN; + l_rect.h = l_surfaceTmp->h; + SDL_utils::applySurface(VIEWER_MARGIN, Y_HEADER, l_surfaceTmp, m_image, &l_rect); + } + else + { + SDL_utils::applySurface(VIEWER_MARGIN, Y_HEADER, l_surfaceTmp, m_image); + } + m_clip.h = l_surfaceTmp->h; + SDL_FreeSurface(l_surfaceTmp); + // Read file + std::ifstream l_file(m_fileName.c_str()); + if (l_file.is_open()) + { + std::string l_line(""); + while (std::getline(l_file, l_line)) + { + m_lines.push_back(l_line); + } + l_file.close(); + } + else + std::cerr << "Error: unable to open file " << m_fileName << std::endl; + INHIBIT(std::cout << "CViewer: " << m_lines.size() << " lines read" << std::endl;) +} + +CViewer::~CViewer(void) +{ + // Free surfaces + if (m_image != NULL) + { + SDL_FreeSurface(m_image); + m_image = NULL; + } +} + +void CViewer::render(const bool p_focus) const +{ + INHIBIT(std::cout << "CViewer::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;) + // Draw background + SDL_utils::applySurface(0, 0, m_image, Globals::g_screen); + // Draw lines + SDL_Surface *l_surfaceTmp(NULL); + unsigned int l_i(0); + std::vector::const_iterator l_it = m_lines.begin() + m_firstLine; + while (l_it != m_lines.end() && l_i < VIEWER_NB_LINES) + { + if (!l_it->empty()) + { + l_surfaceTmp = SDL_utils::renderText(m_font, *l_it, Globals::g_colorTextNormal); + SDL_utils::applySurface(VIEWER_MARGIN, VIEWER_Y_LIST + l_i * VIEWER_LINE_HEIGHT - Y_OFFSET, l_surfaceTmp, Globals::g_screen, &m_clip); + SDL_FreeSurface(l_surfaceTmp); + } + // Next line + ++l_it; + ++l_i; + } +} + +const bool CViewer::keyPress(const SDL_Event &p_event) +{ + CWindow::keyPress(p_event); + bool l_ret(false); + switch (p_event.key.keysym.sym) + { + case MYKEY_PARENT: + case MYKEY_MENU: + m_retVal = -1; + l_ret = true; + break; + case MYKEY_UP: + l_ret = moveUp(1); + break; + case MYKEY_DOWN: + l_ret = moveDown(1); + break; + case MYKEY_PAGEUP: + l_ret = moveUp(VIEWER_NB_LINES - 1); + break; + case MYKEY_PAGEDOWN: + l_ret = moveDown(VIEWER_NB_LINES - 1); + break; + case MYKEY_LEFT: + l_ret = moveLeft(); + break; + case MYKEY_RIGHT: + moveRight(); + l_ret = true; + break; + default: + break; + } + return l_ret; +} + +const bool CViewer::keyHold(void) +{ + bool l_ret(false); + switch(m_lastPressed) + { + case MYKEY_UP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_UP])) + l_ret = moveUp(1); + break; + case MYKEY_DOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN])) + l_ret = moveDown(1); + break; + case MYKEY_PAGEUP: + if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEUP])) + l_ret = moveUp(VIEWER_NB_LINES - 1); + break; + case MYKEY_PAGEDOWN: + if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEDOWN])) + l_ret = moveDown(VIEWER_NB_LINES - 1); + break; + case MYKEY_LEFT: + if (tick(SDL_GetKeyState(NULL)[MYKEY_LEFT])) + l_ret = moveLeft(); + break; + case MYKEY_RIGHT: + if (tick(SDL_GetKeyState(NULL)[MYKEY_RIGHT])) + { + moveRight(); + l_ret = true; + } + break; + default: + break; + } + return l_ret; +} + +const bool CViewer::isFullScreen(void) const +{ + return true; +} + +const bool CViewer::moveUp(const unsigned int p_step) +{ + bool l_ret(false); + if (m_firstLine) + { + if (m_firstLine > p_step) + m_firstLine -= p_step; + else + m_firstLine = 0; + l_ret = true; + } + return l_ret; +} + +const bool CViewer::moveDown(const unsigned int p_step) +{ + bool l_ret(false); + if (m_firstLine + VIEWER_NB_LINES + 1 < m_lines.size()) + { + if (m_firstLine + VIEWER_NB_LINES + 1 + p_step > m_lines.size()) + m_firstLine = m_lines.size() - VIEWER_NB_LINES - 1; + else + m_firstLine += p_step; + l_ret = true; + } + return l_ret; +} + +const bool CViewer::moveLeft(void) +{ + bool l_ret(false); + if (m_clip.x > 0) + { + if (m_clip.x > VIEWER_X_STEP) + m_clip.x -= VIEWER_X_STEP; + else + m_clip.x = 0; + l_ret = true; + } + return l_ret; +} + +void CViewer::moveRight(void) +{ + m_clip.x += VIEWER_X_STEP; +} diff --git a/other/DinguxCommander/src/viewer.h b/other/DinguxCommander/src/viewer.h new file mode 100644 index 0000000..52094ca --- /dev/null +++ b/other/DinguxCommander/src/viewer.h @@ -0,0 +1,69 @@ +#ifndef _VIEWER_H_ +#define _VIEWER_H_ + +#include +#include +#include +#include +#include "window.h" + +#define VIEWER_LINE_HEIGHT 13 +#define VIEWER_NB_LINES 17 +#define VIEWER_Y_LIST 18 +#define VIEWER_MARGIN 1 +#define VIEWER_X_STEP 32 +#define VIEWER_SIZE_MAX 16777216 // = 16 MB + +class CViewer : public CWindow +{ + public: + + // Constructor + CViewer(const std::string &p_fileName); + + // Destructor + virtual ~CViewer(void); + + private: + + // Forbidden + CViewer(void); + CViewer(const CViewer &p_source); + const CViewer &operator =(const CViewer &p_source); + + // Key press management + virtual const bool keyPress(const SDL_Event &p_event); + + // Key hold management + virtual const bool keyHold(void); + + // Draw + virtual void render(const bool p_focus) const; + + // Is window full screen? + virtual const bool isFullScreen(void) const; + + // Scroll + const bool moveUp(const unsigned int p_step); + const bool moveDown(const unsigned int p_step); + const bool moveLeft(void); + void moveRight(void); + + // The viewed file name + std::string m_fileName; + + // Coordinates + unsigned int m_firstLine; + mutable SDL_Rect m_clip; + + // Background image + SDL_Surface *m_image; + + // List of read lines + std::vector m_lines; + + // Pointers to resources + TTF_Font *m_font; +}; + +#endif diff --git a/other/DinguxCommander/src/window.cpp b/other/DinguxCommander/src/window.cpp new file mode 100644 index 0000000..22f751a --- /dev/null +++ b/other/DinguxCommander/src/window.cpp @@ -0,0 +1,138 @@ +#include +#include "window.h" +#include "def.h" +#include "sdlutils.h" + +#define KEYHOLD_TIMER_FIRST 6 +#define KEYHOLD_TIMER 2 + +CWindow::CWindow(void): + m_timer(0), +#if defined(PLATFORM_RG35XX) + m_lastPressed(0), +#else + m_lastPressed(SDLK_0), +#endif + m_retVal(0) +{ + // Add window to the lists for render + Globals::g_windows.push_back(this); +} + +CWindow::~CWindow(void) +{ + // Remove last window + Globals::g_windows.pop_back(); +} + +const int CWindow::execute(void) +{ + m_retVal = 0; + Uint32 l_time(0); + SDL_Event l_event; + bool l_loop(true); + bool l_render(true); + // Main loop + while (l_loop) + { + l_time = SDL_GetTicks(); + // Handle key press + while (SDL_PollEvent(&l_event)) + { + if (l_event.type == SDL_KEYDOWN) + { + l_render = this->keyPress(l_event); + if (m_retVal) + l_loop = false; + } + else if (l_event.type == SDL_QUIT) + { + // Re-insert event so we exit from nested menus + SDL_PushEvent(&l_event); + l_loop = false; + break; + } + } + // Handle key hold + if (l_loop) + l_render = this->keyHold() || l_render; + // Render if necessary + if (l_render && l_loop) + { + SDL_utils::renderAll(); +#if defined(PLATFORM_MIYOOMINI) || defined(PLATFORM_RG35XX) + upscale16NEON(Globals::g_screen->pixels, Globals::g_scaled->pixels); + SDL_Flip(Globals::g_scaled); +#else + SDL_Flip(Globals::g_screen); +#endif + l_render = false; + INHIBIT(std::cout << "Render time: " << SDL_GetTicks() - l_time << "ms"<< std::endl;) + } + // Cap the framerate + l_time = MS_PER_FRAME - (SDL_GetTicks() - l_time); + if (l_time <= MS_PER_FRAME) SDL_Delay(l_time); + } + return m_retVal; +} + +const bool CWindow::keyPress(const SDL_Event &p_event) +{ + // Reset timer if running + if (m_timer) + m_timer = 0; +#if defined(PLATFORM_RG35XX) + m_lastPressed = p_event.key.keysym.scancode; +#else + m_lastPressed = p_event.key.keysym.sym; +#endif + return false; +} + +const bool CWindow::keyHold(void) +{ + // Default behavior + return false; +} + +const bool CWindow::tick(const Uint8 p_held) +{ + bool l_ret(false); + if (p_held) + { + if (m_timer) + { + --m_timer; + if (!m_timer) + { + // Trigger! + l_ret = true; + // Timer continues + m_timer = KEYHOLD_TIMER; + } + } + else + { + // Start timer + m_timer = KEYHOLD_TIMER_FIRST; + } + } + else + { + // Stop timer if running + if (m_timer) + m_timer = 0; + } + return l_ret; +} + +const int CWindow::getReturnValue(void) const +{ + return m_retVal; +} + +const bool CWindow::isFullScreen(void) const +{ + // Default behavior + return false; +} diff --git a/other/DinguxCommander/src/window.h b/other/DinguxCommander/src/window.h new file mode 100644 index 0000000..a998e62 --- /dev/null +++ b/other/DinguxCommander/src/window.h @@ -0,0 +1,58 @@ +#ifndef _WINDOW_H_ +#define _WINDOW_H_ + +#include + +class CWindow +{ + public: + + // Destructor + virtual ~CWindow(void); + + // Execute main loop of the window + const int execute(void); + + // Return value + const int getReturnValue(void) const; + + // Draw window + virtual void render(const bool p_focus) const = 0; + + // Is window full screen? + virtual const bool isFullScreen(void) const; + + protected: + + // Constructor + CWindow(void); + + // Key press management + virtual const bool keyPress(const SDL_Event &p_event); + + // Key hold management + virtual const bool keyHold(void); + + // Timer tick + const bool tick(const Uint8 p_held); + + // Timer for key hold + unsigned int m_timer; +#if defined(PLATFORM_RG35XX) + uint8_t m_lastPressed; +#else + SDLKey m_lastPressed; +#endif + + // Return value + int m_retVal; + + private: + + // Forbidden + CWindow(const CWindow &p_source); + const CWindow &operator =(const CWindow &p_source); + +}; + +#endif diff --git a/src/minarch/libretro-common b/src/minarch/libretro-common deleted file mode 160000 index 458bcd8..0000000 --- a/src/minarch/libretro-common +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 458bcd842bc48f730e12732fe8b3280e834d45ff diff --git a/src/minarch/libretro-common/.gitignore b/src/minarch/libretro-common/.gitignore new file mode 100644 index 0000000..4e88cc3 --- /dev/null +++ b/src/minarch/libretro-common/.gitignore @@ -0,0 +1,6 @@ +glsm/ +*.[od] +*.dll +*.so +*.dylib +*.exe diff --git a/src/minarch/libretro-common/Makefile.test b/src/minarch/libretro-common/Makefile.test new file mode 100644 index 0000000..4e1deed --- /dev/null +++ b/src/minarch/libretro-common/Makefile.test @@ -0,0 +1,58 @@ + +OBJDIR = ../obj-unix + +TEST_UNIT_CFLAGS = $(CFLAGS) -Iinclude $(LDFLAGS) -lcheck $(LIBCHECK_CFLAGS) -Werror -Wdeclaration-after-statement -fsanitize=address -fsanitize=undefined -ftest-coverage -fprofile-arcs -ggdb + +TEST_GENERIC_QUEUE = test/queues/test_generic_queue +TEST_GENERIC_QUEUE_SRC = test/queues/test_generic_queue.c queues/generic_queue.c + +TEST_LINKED_LIST = test/lists/test_linked_list +TEST_LINKED_LIST_SRC = test/lists/test_linked_list.c lists/linked_list.c + +TEST_STDSTRING = test/string/test_stdstring +TEST_STDSTRING_SRC = test/string/test_stdstring.c string/stdstring.c encodings/encoding_utf.c \ + compat/compat_strl.c + +TEST_UTILS = test/utils/test_utils +TEST_UTILS_SRC = test/utils/test_utils.c utils/md5.c encodings/encoding_crc32.c \ + streams/file_stream.c vfs/vfs_implementation.c file/file_path.c \ + compat/compat_strl.c time/rtime.c string/stdstring.c encodings/encoding_utf.c + +TEST_HASH = test/hash/test_hash +TEST_HASH_SRC = test/hash/test_hash.c hash/lrc_hash.c \ + streams/file_stream.c vfs/vfs_implementation.c file/file_path.c \ + compat/compat_strl.c time/rtime.c string/stdstring.c encodings/encoding_utf.c + +all: + # Build and execute tests in order, to avoid coverage file collision + # string + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_STDSTRING_SRC) -o $(TEST_STDSTRING) + $(TEST_STDSTRING) + lcov -c -d . -o `dirname $(TEST_STDSTRING)`/coverage.info + # utils + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_UTILS_SRC) -o $(TEST_UTILS) + $(TEST_UTILS) + lcov -c -d . -o `dirname $(TEST_UTILS)`/coverage.info + # utils + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_HASH_SRC) -o $(TEST_HASH) + $(TEST_HASH) + lcov -c -d . -o `dirname $(TEST_HASH)`/coverage.info + # list + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_LINKED_LIST_SRC) -o $(TEST_LINKED_LIST) + $(TEST_LINKED_LIST) + lcov -c -d . -o `dirname $(TEST_LINKED_LIST)`/coverage.info + # queue + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_GENERIC_QUEUE_SRC) -o $(TEST_GENERIC_QUEUE) + $(TEST_GENERIC_QUEUE) + lcov -c -d . -o `dirname $(TEST_GENERIC_QUEUE)`/coverage.info + + lcov -o test/coverage.info \ + -a test/utils/coverage.info \ + -a test/string/coverage.info \ + -a test/lists/coverage.info \ + -a test/queues/coverage.info + genhtml -o test/coverage/ test/coverage.info + +clean: + rm -f *.gcda *.gcno + diff --git a/src/minarch/libretro-common/audio/audio_mix.c b/src/minarch/libretro-common/audio/audio_mix.c new file mode 100644 index 0000000..eb138ed --- /dev/null +++ b/src/minarch/libretro-common/audio/audio_mix.c @@ -0,0 +1,377 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mix.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include + +#include + +#if defined(__SSE2__) +#include +#elif defined(__ALTIVEC__) +#include +#endif + +#include +#include