Compare commits

...

433 Commits

Author SHA1 Message Date
Nicolas H 8d31ee3056 Finalisation de l'ajout de multi-marques 2021-07-14 09:28:29 +00:00
Nicolas H 79d4f6f7a9 Ajout des sélection sur le composant FListView 2021-07-13 08:15:38 +00:00
Nicolas H ea7f53be41 Ajout de getindex, setindex & setmark pour le Listview 2021-07-06 17:26:44 +00:00
Markus Gans cf37e826e9 Moving the test from Travis CI to GitHub Actions 2021-07-05 02:19:23 +02:00
Markus Gans 3bf9713d23 More direct static access 2021-06-27 00:30:21 +02:00
Markus Gans 45110c5b21 Global non-constant variables are now encapsulated in classes 2021-06-26 23:49:16 +02:00
Markus Gans 7170fc846c Fix release build 2021-06-19 23:25:36 +02:00
Markus Gans 9931f75a51 Moving the creator methods from FTerm to its own class 2021-06-19 23:05:18 +02:00
Markus Gans 65c249dfe0 travis-ci.org -> travis-ci.com 2021-06-16 22:11:57 +02:00
Markus Gans c4376bae3e localtime to localtime_r 2021-06-16 21:55:11 +02:00
Markus Gans 85ae1612fd Converted the internal timer from timeval to std::chrono::time_point<system_clock> 2021-06-16 15:42:46 +02:00
Markus Gans de4ac269e4 Replace std::strlen with stringLength 2021-06-07 00:34:08 +02:00
Markus Gans 2dc8d7f2d3 FTermDetection now has clean code by using FString instead of char* 2021-06-06 21:57:35 +02:00
Markus Gans e38d604544 Bug fixing in FString and FTermDetection 2021-06-06 00:07:39 +02:00
Markus Gans 7d426ae25c Small FString bug fix 2021-06-03 16:40:09 +02:00
Markus Gans 5336462e68 Some FString optimizations 2021-06-03 16:08:36 +02:00
Markus Gans 7f9ba7464b FString internally changed from wchar_t* to std::wstring 2021-05-30 23:52:03 +02:00
Markus Gans 95c0717589 Using std::string for the attribute buffer 2021-05-24 21:13:10 +02:00
Markus Gans 920daaba1f Fix forwarding reference 2021-05-23 00:05:29 +02:00
Markus Gans f06ccc6495 Convert FOptiMove from char[] to std::string 2021-05-22 23:21:30 +02:00
Markus Gans 795ebcdea8 Added bug_report.md and feature_request.md 2021-05-16 18:37:28 +02:00
Markus Gans eacc857143 Added SECURITY.md 2021-05-15 12:29:58 +02:00
Markus Gans 7462c60cfd Prevent duplicate widget in the close widget list 2021-05-13 13:17:03 +02:00
Markus Gans af5ec304d8 Added Code of Conduct 2021-05-11 23:50:57 +02:00
Markus Gans 5f761199a7 Added Contributing.md 2021-05-09 21:05:53 +02:00
Markus Gans f5b4537223 More const references 2021-05-09 21:03:59 +02:00
Markus Gans d12875682d Some pointers were replaced by references 2021-05-07 23:17:23 +02:00
Markus Gans 07f6bda1ba Prevent flickering when resizing terminals or redrawing the screen via ctrl-l 2021-05-04 20:36:41 +02:00
Markus Gans 8ab4c02f42 SonarCloud Analysis Workaround 2021-05-03 00:20:16 +02:00
Markus Gans 3cf1ae0134 Bugfix for sending multiple SIGWINCH signals from gnome-terminal under Wayland 2021-05-02 23:50:00 +02:00
Markus Gans 24553aa7d0 Replace some std::bind with lambda functions 2021-05-01 18:58:37 +02:00
Markus Gans 0fefcd81c2 Fixes Linux console bug from February 20, 2021 2021-04-30 00:28:05 +02:00
Markus Gans 9ba7fc6178 Code optimization at widget focus 2021-04-27 11:51:53 +02:00
Markus Gans 8d54e1c11f Fixed mutex deadlock in FLogger 2021-04-24 17:00:28 +02:00
Markus Gans 38df8e2db2 Fixes the detection of the terminal size after a SIGWINCH signal 2021-04-21 23:46:45 +02:00
Markus Gans 4c3b5b6737 Decoupling the FWidget and FWindow classes from FVTerm 2021-04-18 15:05:55 +02:00
Markus Gans 8a7ce330a3 Better support for kitty terminals 2021-04-11 21:00:06 +02:00
Markus Gans d5ec54dcfd Minor code improvements 2021-04-05 21:20:02 +02:00
Markus Gans 865e78d9de Small code improvements 2021-03-31 23:03:05 +02:00
Markus Gans 5a6644de98 argv is now stored internally as a std::vector container 2021-03-31 13:49:25 +02:00
Markus Gans 4acca85a13 Treeview example iterator 2021-03-30 23:26:06 +02:00
Markus Gans 9df509dd3b No refreshing of the terminal during resizing of a dialog 2021-03-30 15:20:36 +02:00
Markus Gans 597f9e772b New method FWidget::initLayout() for setting widget layouts after terminal initialization 2021-03-28 23:19:01 +02:00
Markus Gans 0e7488f646 little code improvement 2021-03-18 18:42:21 +01:00
Markus Gans 7ae9f38229 Cygwin build fix 2021-03-15 18:03:48 +01:00
Markus Gans 6deb262dd7 Preparation of error handling in FTerm::putstring 2021-03-15 09:41:14 +01:00
Markus Gans e6dfd73e7a Dynamic adjustment of the terminal refresh rate between 5 and 60 Hz 2021-03-15 01:37:25 +01:00
Markus Gans d4f629f183 One unit test was commented out 2021-03-10 10:07:32 +01:00
Markus Gans 465fd9510a Implementation of an own padding print method for sending control codes to the terminal 2021-03-10 00:26:22 +01:00
Markus Gans f048d846da development release 0.7.2 2021-02-28 14:23:14 +01:00
Markus Gans 73faadd852 Removing the termcap library from the header files so that FINAL CUT programs are not affected by the preprocessor #define macros 2021-02-28 13:21:21 +01:00
Markus Gans 59917ed126 Fixed the incorrect display on terminals without UTF-8 character encoding 2021-02-24 19:55:20 +01:00
Markus Gans 48a67c4eab Some string pointer fixes 2021-02-22 20:29:49 +01:00
Markus Gans a55b33977c Optimize terminal output buffer queue with differencing for strings, and control characters and control sequences 2021-02-20 11:29:52 +01:00
Markus Gans 28f41f5d6c FTermBuffer unit test now also runs on older Linux distributions without multicolored emojis 2021-02-10 21:09:21 +01:00
Markus Gans a1107f96c7 Merge branch 'main' of https://github.com/gansm/finalcut into main 2021-02-09 22:23:19 +01:00
Markus Gans baa0c60c79 Added support for combined unicode characters 2021-02-09 22:01:21 +01:00
Markus Gans 5b789e4110 Fixed: build with gcc < 5.5 - std::hash<FKey> 2021-01-20 01:32:39 +01:00
Markus Gans fc7be67f2a Fixed: build with gcc < 5.5 - std::hash<FKey> 2021-01-01 03:46:43 +01:00
Markus Gans eb61e6fec0 Add some #includes 2020-12-31 23:22:22 +01:00
Markus Gans b2de303cfc Refactoring to scaled enumerations 2020-12-31 20:45:10 +01:00
Markus Gans 783f58bc4b .travis.yml 2020-12-06 02:45:21 +01:00
Markus Gans 4146b20028 Small fixes 2020-12-06 02:11:54 +01:00
Markus Gans 47cb79a7f0 Small fixes 2020-12-05 23:54:40 +01:00
Markus Gans c4b799d98f Fixed: build with gcc < 5.5 2020-12-05 21:24:09 +01:00
Markus Gans 226663889b Improvement of the move semantics in FVTermPreprocessing 2020-12-03 23:20:33 +01:00
Markus Gans 4517038521 Using smart pointers for global objects 2020-12-03 10:43:20 +01:00
Markus Gans 7868a0dee9 Use of default destructors 2020-11-24 21:06:39 +01:00
Markus Gans 25f2abe175 Bug fix for the FMouseControl unit test 2020-11-18 23:57:31 +01:00
Markus Gans ae1fdecb40 The terminal update rate is now limited to 60 Hz 2020-11-18 22:10:09 +01:00
Markus Gans 6c7fe98805 Small fixes 2020-11-14 22:14:30 +01:00
Markus Gans a0a65ee9fb unit test update 2020-11-14 21:48:46 +01:00
Markus Gans b28cf8b9c1 Bugfix: The cursor position was not changed anymore if there was no change to the content 2020-11-14 20:59:26 +01:00
Markus Gans 24696ffcd1 FString unit test fix 2020-11-08 18:51:59 +01:00
Markus Gans 96f2f28f21 deprecated code removed 2020-11-08 12:17:05 +01:00
Markus Gans d71ca6f028 Last minor changes 2020-11-07 21:51:55 +01:00
Markus Gans 1d3522f35b Elimination of unnecessary terminal flushes 2020-11-04 16:19:02 +01:00
Markus Gans 63672a28d5 Use FIONREAD to get the number of characters available for reading on stdin 2020-11-03 13:05:01 +01:00
Markus Gans d9003af7a1 Call of TIOCLINUX only in the Linux console 2020-11-02 23:24:14 +01:00
Markus Gans 396985f594 Non-blocking reading before timeout after keystroke 2020-11-02 22:17:07 +01:00
Markus Gans a053ccd69e Small improvements 2020-11-01 22:40:28 +01:00
Markus Gans ff70abd073 Small improvements 2020-11-01 22:15:44 +01:00
Markus Gans 0ee09aad2c Now FINAL CUT queues keyboard and mouse input to speed up the processing of widget events 2020-11-01 20:11:36 +01:00
Markus Gans 98f9cd5718 Replace pointers with references 2020-10-25 01:21:45 +02:00
Markus Gans 61eb8b8166 FVTerm code cleanup 2020-10-24 01:56:15 +02:00
Markus Gans e0cc130074 FVTerm code cleanup 2020-10-23 01:07:59 +02:00
Markus Gans a4a3d93203 Repair terminal update skipping 2020-10-22 03:14:14 +02:00
Markus Gans 531eb22182 Increased the keyboard interval from 13.3 Hz to 30 Hz 2020-10-21 00:58:22 +02:00
Markus Gans b69f3fc5d8 FWidget::show() optimized 2020-10-20 16:52:25 +02:00
Markus Gans 3c467c9c07 Optimize the terminal output speed 2020-10-19 23:38:12 +02:00
Markus Gans 6a8459c52b Fixes unit test segfault 2020-10-17 17:34:10 +02:00
Markus Gans 49ce0be914 FVTerm improvements 2020-10-15 00:07:36 +02:00
Markus Gans 4f49d9ffaa FVTerm improvements 2020-10-14 23:43:34 +02:00
Markus Gans 2c9778698e Small improvements 2020-10-14 17:31:52 +02:00
Markus Gans a14c45d8c7 Small improvements 2020-10-13 19:49:34 +02:00
Markus Gans 3c46dad798 FString optimization 2020-10-13 12:55:28 +02:00
Markus Gans 8d189e9ec4 Small fix-up 2020-10-12 00:02:03 +02:00
Markus Gans 493b1231fd Small fixes 2020-10-11 23:23:26 +02:00
Markus Gans 12ec2b0574 Refactoring of some methods 2020-10-11 22:50:08 +02:00
Markus Gans 396cda69e8 Solaris build fix 2020-10-11 09:14:52 +02:00
Markus Gans 73e587b9c2 Add some includes 2020-10-08 16:46:14 +02:00
Markus Gans 97f1dea7b8 Add some includes 2020-10-08 16:28:29 +02:00
Markus Gans 9f1bd87151 Minor changes 2020-10-08 12:09:48 +02:00
Markus Gans e74dccf481 Screen reports (like Secondary DA) are now read directly 2020-10-08 05:55:32 +02:00
Markus Gans adccd6ae3b Now hides the input cursor when a widget gets hidden 2020-10-05 04:24:14 +02:00
Markus Gans 37f238eef7 Add some includes 2020-10-04 05:56:13 +02:00
Markus Gans fb8baf8c5c Fixed a few minor bugs 2020-10-04 02:55:15 +02:00
Markus Gans c7d6af8b31 Merge branch 'master' of https://github.com/gansm/finalcut 2020-10-04 01:00:20 +02:00
Markus Gans a821030333 Replaces some C-style arrays with std::array 2020-10-04 00:59:21 +02:00
Markus Gans 61434b4d16
Update codeql-analysis.yml 2020-10-02 02:26:42 +02:00
Markus Gans dcc66b14db
Update codeql-analysis.yml 2020-10-02 02:23:00 +02:00
Markus Gans 021cd12d58
Update codeql-analysis.yml 2020-10-02 02:04:20 +02:00
Markus Gans 31eb81d612
Update codeql-analysis.yml 2020-10-02 01:51:52 +02:00
Markus Gans b428db3d9c
Update codeql-analysis.yml 2020-10-02 01:31:49 +02:00
Markus Gans 9c1f6fb05a
Create codeql-analysis.yml 2020-10-02 01:23:26 +02:00
Markus Gans 61d88eb413 Move FChar comparison operators to ftypes.h 2020-09-29 04:16:07 +02:00
Markus Gans 722be333df Additions to the documentation 2020-09-27 20:43:53 +02:00
Markus Gans 72bcce87b7 Limit for the number of FObject child objects 2020-09-26 19:06:49 +02:00
Markus Gans c1a2ef59e4 FData improvements 2020-09-26 02:09:34 +02:00
Markus Gans 4478948bc7 FData improvements 2020-09-26 01:59:58 +02:00
Markus Gans b15a665729 unit test for the FData 2020-09-25 06:16:32 +02:00
Markus Gans 3d9f621258 std::clog now streams everything to the FLogger object 2020-09-25 00:48:58 +02:00
Markus Gans a69d38fb1e Bugfix: empty FString() + wchar_t 2020-09-23 23:18:48 +02:00
Markus Gans d10e2888ac Bugfix in FDialog::setSize() 2020-09-22 01:04:36 +02:00
Markus Gans 44d6d8cdb9 Fixes minor bugs 2020-09-20 14:11:35 +02:00
Markus Gans ff2e29b246 FData optimization 2020-09-18 22:40:51 +02:00
Markus Gans 5092244b81 FDataPtr was replaced by the template class FData 2020-09-18 17:13:52 +02:00
Markus Gans ff555baf3b Fixes a problem with mouse input in Cygwin in non-blocking read mode 2020-09-11 00:08:22 +02:00
Markus Gans 51105e7db2 Speed up the reaction time of the gpm mouse 2020-09-08 23:22:52 +02:00
Markus Gans fdd7ff98ec Adding Windows Terminal detection 2020-08-30 22:47:24 +02:00
Markus Gans 28080abb3e first steps documentation changes 2020-08-23 14:00:53 +02:00
Markus Gans 147e213e07
Merge pull request #62 from Axenow/FixMenuBar
Fixed fMenuBar. Left arraw doesn't restore terminal redrawing.
2020-08-23 13:50:59 +02:00
Axenow 42854b3c50 Fixed fMenuBar. Left arraw doesn't restore terminal redrawing. 2020-08-23 12:09:06 +02:00
Markus Gans b9042d5a03 Small code and text changes 2020-08-23 00:32:41 +02:00
Markus Gans 2b33c1875a Fix timeout problem in keyboard unit test 2020-08-16 02:01:47 +02:00
Markus Gans 5574104dd9 Fixes high CPU load 2020-08-15 23:42:29 +02:00
Markus Gans c2894b6591 Fixed some minor bugs 2020-08-13 23:58:32 +02:00
Markus Gans 50fc6fdb63 Fixed some minor bugs 2020-08-13 00:34:39 +02:00
Markus Gans b54d1c2f38 Fixed some minor bugs 2020-08-12 22:28:02 +02:00
Markus Gans 6fef7a43a5 Activating the callback unit test 2020-08-11 23:38:56 +02:00
Markus Gans 6d72168ca4 New callback backend was implemented 2020-08-11 23:04:46 +02:00
Markus Gans 07127634fd Method name changes 2020-07-19 14:15:02 +02:00
Markus Gans 8f383a4def More function declared as const 2020-07-12 19:33:12 +02:00
Markus Gans f07a481d46 More function declared as const 2020-07-12 19:05:29 +02:00
Markus Gans 13dc85860b More function declared as const 2020-07-12 17:54:13 +02:00
Markus Gans d8b35dc1a7 More function declared as const 2020-07-12 17:00:16 +02:00
Markus Gans 361f0e6a14 More function declared as const 2020-07-12 15:25:21 +02:00
Markus Gans 53ba96504f New data wrapper class FData and minor text changes 2020-07-08 21:32:47 +02:00
Markus Gans 219ac28fb7 Add a document that describes how to create user themes 2020-07-06 19:32:01 +02:00
Markus Gans c64b17ac49 Add a "user event" chapter to the first steps document 2020-06-13 21:05:52 +02:00
Markus Gans 7749d28b92 Add a "user event" chapter to the first steps document 2020-06-13 20:35:27 +02:00
Markus Gans 9845a022a3 Fixed some minor bugs 2020-06-11 23:00:18 +02:00
Markus Gans ccb7eeb3c6 New widget FBusyIndicator 2020-06-11 21:38:33 +02:00
Markus Gans 0ff67da077 Parameter to specify a logging file 2020-06-07 18:21:59 +02:00
Markus Gans c1b2699e53 Simplification of FMouse::createMouseObject() 2020-06-06 22:22:01 +02:00
Markus Gans 3d2a0c6dd2 Lazy terminal initialization on show() 2020-06-06 21:10:06 +02:00
Markus Gans 70eabe93d6 Some methods are marked as 'Override' 2020-05-30 23:27:42 +02:00
Markus Gans f76a9d2114 Added FApplication::setDarkTheme() and FApplication::setDefaultTheme() 2020-05-30 23:02:53 +02:00
Markus Gans 6a20b728ba Adding a dark theme 2020-05-29 00:36:53 +02:00
Markus Gans 1f1c6053a7 Adding a dark theme 2020-05-29 00:27:25 +02:00
Markus Gans df672dfd73 With FColorPalette you can now create your own color palette themes 2020-05-28 01:02:53 +02:00
Markus Gans a0e1115ff6 Added FApplication::processExternalUserEvent() 2020-05-26 21:55:22 +02:00
Markus Gans 45ddbd88d3 With FWidgetColors you can now create your own widget color themes 2020-05-26 21:37:39 +02:00
Markus Gans 8a153c6d45 Fixed pointer in flogger-test 2020-05-25 00:30:51 +02:00
Markus Gans 59830cbd05 Fixed memory leak in FString move assignment operator 2020-05-24 23:55:08 +02:00
Markus Gans 6c6b70ed9e Fixed a small bug 2020-05-24 02:28:32 +02:00
Markus Gans 9e68344a2b New class FStringStream 2020-05-24 02:15:43 +02:00
Markus Gans f20e036a9e Fixed event queue in FApplication 2020-05-21 14:53:51 +02:00
Markus Gans 5a60794b85 More direct access to the static FTerm functions 2020-05-16 22:24:36 +02:00
Markus Gans 379c45efb5 A little more clean code 2020-05-14 01:22:45 +02:00
Markus Gans 923822ca25 New class FLogger for logging 2020-05-13 23:47:14 +02:00
Markus Gans 4a8b863238 Cygwin build fix 2020-05-03 13:45:47 +02:00
Markus Gans 21267f7ead
Merge pull request #53 from gansm/57c14fd
merged commit
2020-05-02 18:34:01 +02:00
Markus Gans 87777ad27c macOS build fix 2020-05-02 17:26:58 +02:00
Markus Gans d69b414094 macOS build fix 2020-05-02 17:18:40 +02:00
Markus Gans 5f447e8267 FTermcap is now null pointer resistant 2020-05-02 16:54:22 +02:00
Markus Gans 0be377a94a Moving all termcap functions into FTermcap 2020-05-02 05:28:30 +02:00
Markus Gans deccb4b74c Moving all termcap functions into FTermcap 2020-05-02 04:56:12 +02:00
Markus Gans a90cd1ad55 const type qualifiers and list initialization 2020-05-02 00:07:35 +02:00
Markus Gans 0fd6439f5a Static code for the special built-in key sequences 2020-04-29 02:24:48 +02:00
Markus Gans 4840978273 Static code for the special built-in key sequences 2020-04-29 00:37:29 +02:00
Markus Gans 1c3c687878 Adding the missing method getClientSize() 2020-04-28 01:46:26 +02:00
Markus Gans 0de0676092 A few inline and const changes 2020-04-26 20:45:57 +02:00
Markus Gans 159d086af4 macOS build fix 2020-04-25 02:32:33 +02:00
Markus Gans 2b1774e578 More internal use of const char* strings 2020-04-24 00:34:26 +02:00
Markus Gans 803e54d456 Further small code improvements 2020-04-20 01:01:20 +02:00
Markus Gans 88667f2cbb Fix for macOS build 2020-04-19 20:57:28 +02:00
Markus Gans 9da4f00115 Further small code improvements 2020-04-19 20:40:49 +02:00
Markus Gans d08dd8e9f4 Further small code improvements 2020-04-19 20:38:52 +02:00
Markus Gans 136b57eac6 Correction of some virtual methods 2020-04-18 13:33:42 +02:00
Markus Gans 6de04a3edd CWE-478: Addition of missing default case in the Switch statement 2020-04-17 10:53:47 +02:00
Markus Gans defc1714e4 CERT, OOP50-CPP: Avoids calling a virtual function from the constructor 2020-04-17 02:49:33 +02:00
Markus Gans fd92d7f4d8 Update comments for the copy assignment operator 2020-04-15 23:44:08 +02:00
Markus Gans 7d4de8e46f Improved event handling code 2020-04-15 23:17:42 +02:00
Markus Gans 62b4a68277 Better support of general arrow keys 2020-04-15 23:10:34 +02:00
Markus Gans 1ff34f64e1 Better support of general arrow keys 2020-04-15 10:55:23 +02:00
Markus Gans 7a520dc944 Add destructor 2020-04-15 01:01:16 +02:00
Markus Gans 9b654768aa Several small code improvements 2020-04-15 00:28:18 +02:00
Markus Gans 90b389035e Several small code improvements 2020-04-14 23:46:42 +02:00
Markus Gans f364f76aea add sonarcloud settings 2020-04-13 12:52:45 +02:00
Markus Gans 3bb001677f Several small code improvements 2020-04-13 12:40:11 +02:00
Markus Gans ac1ebfefad minor fixes 2020-04-10 22:13:13 +02:00
Markus Gans 20c3cf218e Dialogs can now be displayed without a border 2020-04-09 12:38:35 +02:00
Markus Gans 53d2f04e77 Update asciinema link 2020-04-04 21:45:27 +02:00
Markus Gans bb52b6fd7e Correction of methods that were unnecessarily declared as virtual 2020-04-04 20:58:47 +02:00
Markus Gans 53f1059312 Minor bug fixes 2020-04-02 09:59:34 +02:00
Markus Gans a1b31179c2 Update asciinema link 2020-03-22 22:05:26 +01:00
Markus Gans 4c0404ac60 A small benchmakt test was added to the Rotozoomer example 2020-03-22 21:53:27 +01:00
Markus Gans 86ccd30eae A rotozoomer example was added to demonstrate the drawing speed of FINAL CUT 2020-03-08 22:25:13 +01:00
Markus Gans 45218b0f61 Fixes keyboard input buffer problem when opening a modal dialog 2020-03-08 12:52:04 +01:00
Markus Gans b58936a6a2 Exit the move-resize-mode when the close confirmation dialog is displayed 2020-03-07 22:38:26 +01:00
Markus Gans 77638fcaa0 Fixes keyboard input buffer problem when opening a modal dialog 2020-03-07 21:32:18 +01:00
Markus Gans 925f106846 Unbuffered reading of keystrokes for better latency 2020-03-05 21:30:54 +01:00
Markus Gans 3102fa6e59 Add .editorconfig 2020-03-01 15:42:07 +01:00
Markus Gans e5902a6ee6 New command line switch "--no-terminal-data-request" 2020-02-25 23:42:31 +01:00
Markus Gans ff6ff14793 Travis CI MacOS Homebrew update 2020-02-24 11:41:54 +01:00
Markus Gans 65b47b40f2 Updated Debian package files 2020-02-23 23:05:05 +01:00
Markus Gans 3723d071a3 Updated Debian and rpm package files 2020-02-23 20:57:51 +01:00
Markus Gans b23974858e SGRoptimizer improved 2020-02-20 00:06:39 +01:00
Markus Gans 164487096c Some small code improvements 2020-02-19 21:59:13 +01:00
Markus Gans a33a9e1b6b Printing FStyle object to change attributes 2020-02-16 00:01:36 +01:00
Markus Gans 43bda37f71 Rename setTransShadow() to setColorOverlay() 2020-02-13 08:21:48 +01:00
Markus Gans 83a6ee497b Fix collapse() and expand() in FListViewItem() 2020-02-11 00:29:58 +01:00
Markus Gans dd625e0822 Adding a tty check for stdin 2020-02-09 21:58:17 +01:00
Markus Gans 07a29910b7 Add application structure diagram 2020-02-08 21:31:21 +01:00
Markus Gans b810b51e65 Fix in FListViewIterator 2020-02-05 08:57:13 +01:00
Markus Gans b05513a8f8 Add screenshorts to the first steps document 2020-02-04 01:07:22 +01:00
Markus Gans 9221703a40 Add screenshorts to the first steps document 2020-02-04 00:09:06 +01:00
Markus Gans 057c295af6 Fix uncaught exception 2020-02-02 23:57:18 +01:00
Markus Gans 60009d8f4b clear() and remove() were added to FListView 2020-02-02 22:34:27 +01:00
Markus Gans 06d65ed676 Fix metadata 2020-01-20 21:40:00 +01:00
Markus Gans 3e3076838f markdown formatting 2020-01-14 20:27:19 +01:00
Markus Gans 815562173f Replace bitmap in SVG with vector drawing 2020-01-14 00:42:48 +01:00
Markus Gans bd20b9aa8c svg: remove spaces from base64 code 2020-01-13 00:20:35 +01:00
Markus Gans 3183e376bb Add a "widget layout" chapter to the first steps document 2020-01-12 20:10:34 +01:00
Markus Gans eeac24aef2 Methods setText() and clearText() for FComboBox 2020-01-09 20:20:37 +01:00
Markus Gans c0b1dc5924 Add setCurrentItem() to the FComboBox widget class 2020-01-09 19:21:16 +01:00
Markus Gans 0ea63fa1c8 Illustrations to explain the widget layout 2020-01-03 22:00:42 +01:00
Markus Gans 926f9278bc Illustrations to explain the widget layout 2020-01-03 01:36:01 +01:00
Markus Gans fc1b9ebdf3 Small code improvements 2020-01-03 01:33:18 +01:00
Markus Gans d126c4996a Adding an ANSI X3.64 SGR optimizer 2019-12-31 06:32:51 +01:00
Markus Gans 853799b4d6 Screenshots have been updated 2019-12-23 21:29:08 +01:00
Markus Gans 23ddf5d6f2 Correction for height and width alignment in adjustSize() 2019-12-23 14:20:31 +01:00
Markus Gans 3a391f5fe5 Better setSize() implementation in some widgets 2019-12-23 03:53:32 +01:00
Markus Gans b7639f5301 Fixed the drawing of FLabel widget with the default size of 1×1 character 2019-12-20 19:36:18 +01:00
Markus Gans 867dabf637
Merge pull request #42 from grendello/fspinbox-inlines
Make FSPinBox::get{Prefix,Suffix} functions inline
2019-12-16 11:47:48 +01:00
Markus Gans 74d8585561 New widget class FComboBox to provide a dropdown list with an input field 2019-12-16 11:14:24 +01:00
Marek Habersack d34e839f83 Make FSPinBox::get{Prefix,Suffix} functions inline
Otherwise, if more than one file includes the header, we will have
duplicate symbols during link time.
2019-12-15 20:32:36 +01:00
Markus Gans aacf27ff74 update .travis.yml dist: xenial 2019-11-19 02:46:01 +01:00
Markus Gans cbe1179443 clang++ compile fix 2019-11-18 16:43:07 +01:00
Markus Gans 15fe47327e update g++ on macOS 2019-11-18 01:40:42 +01:00
Markus Gans 3de8e73281 Revision of FString number input stream 2019-11-18 01:18:15 +01:00
Markus Gans 8c434777bc Revision of FString number input stream 2019-11-17 22:06:07 +01:00
Markus Gans 5bb3f1ac9b Fixes the numerical streaming value for FLineEdit and FLabel 2019-11-16 22:33:21 +01:00
Markus Gans 7ba294c496 Fixes the numerical streaming value for FLineEdit and FLabel 2019-11-16 21:48:59 +01:00
Markus Gans 4540a6f455 Fixes the numerical streaming value for FLineEdit and FLabel 2019-11-16 19:57:45 +01:00
Markus Gans b3c367a168 Fixes the numerical streaming value for FLineEdit and FLabel 2019-11-16 19:10:08 +01:00
Markus Gans be1c2b2639 Revert "Set theme jekyll-theme-cayman"
This reverts commit 513c80efa1.
2019-11-16 15:43:23 +01:00
Markus Gans d4c964e0d8 Revert "Delete _config.yml"
This reverts commit 0727a59d4a.
2019-11-16 15:43:02 +01:00
Markus Gans 687043b174 Merge branch 'master' of https://github.com/gansm/finalcut 2019-11-16 15:38:17 +01:00
Markus Gans dedc1f3410 New Widget class FSpinBox to provide spin boxes 2019-11-16 15:16:44 +01:00
Markus Gans 0727a59d4a
Delete _config.yml 2019-11-13 20:20:18 +01:00
Markus Gans 513c80efa1 Set theme jekyll-theme-cayman 2019-11-13 20:06:37 +01:00
Markus Gans 5852c8129b Update Travis CI coverity scan test 2019-11-07 04:16:44 +01:00
Markus Gans 3112b6cbab Update Travis CI coverity scan test 2019-11-07 04:12:39 +01:00
Markus Gans 965cc95201 Update Travis CI coverity scan test 2019-11-07 03:43:39 +01:00
Markus Gans df12308b06 Update Travis CI coverity scan test 2019-11-07 02:55:20 +01:00
Markus Gans 18ec10ffd1 Update Travis CI coverity scan test 2019-11-07 02:48:27 +01:00
Markus Gans d76dcf2e9c Small NewFont midline fixes 2019-11-06 20:09:45 +01:00
Markus Gans 88d5c0d050 Improved display of the NewFont midline 2019-11-06 02:40:47 +01:00
Markus Gans b116fa5930 Newfont specialization for 8x16 and 9x16 pixel character 2019-11-03 23:34:47 +01:00
Markus Gans 1671a5ff3e Unicode support for 8x16graph font 2019-10-29 01:42:10 +01:00
Markus Gans ff39c85a33 Coverity scan compiler fix 2019-10-21 03:17:29 +02:00
Markus Gans 38d4fea995 Fix iterator container mismatch 2019-10-21 02:48:29 +02:00
Markus Gans 26b00e2b10 Coverity scan compiler fix 2019-10-21 02:07:12 +02:00
Markus Gans f30bb0f79b Update Travis CI compiler version 2019-10-20 23:05:45 +02:00
Markus Gans bdd6753444 Update Travis CI compiler version 2019-10-20 22:53:45 +02:00
Markus Gans a924eeafb4 Update Travis CI compiler version 2019-10-20 22:47:12 +02:00
Markus Gans d9f7985b40 Update Travis CI compiler version 2019-10-20 22:39:53 +02:00
Markus Gans dae345fbac Update Travis CI compiler version 2019-10-20 22:25:13 +02:00
Markus Gans 5e79e0a1fa Update Travis CI compiler version 2019-10-20 22:15:22 +02:00
Markus Gans 5ceee8b4c8 New method setInputType() in FLineEdit that allows to obscure password entries 2019-10-20 20:06:33 +02:00
Markus Gans 58c775c252
Merge pull request #41 from gansm/master
merge
2019-10-17 02:01:36 +02:00
Markus Gans 5e4a71dc0d Version 0.6.0 2019-10-17 01:13:18 +02:00
Markus Gans 7499f424dc Compile fix for some architectures 2019-10-14 01:44:24 +02:00
Markus Gans 762b232fd0 More code cleanups 2019-10-08 04:50:43 +02:00
Markus Gans b0080b00cf More code cleanups 2019-10-08 04:37:19 +02:00
Markus Gans 937654710b Code cleaning 2019-10-06 22:35:00 +02:00
Markus Gans 66ff1ba208 Small fixes 2019-10-06 00:36:58 +02:00
Markus Gans a279a0981a Internal redesign of the callback call 2019-10-05 23:20:07 +02:00
Markus Gans 298755a0fe Replacing null-terminated wide strings with FString objects 2019-10-01 23:14:00 +02:00
Markus Gans 6b9336d6c1 Streaming into an FTextView() object 2019-09-29 22:28:58 +02:00
Markus Gans bccdbbd3ad
Merge pull request #39 from gansm/master
merge
2019-09-28 06:23:05 +02:00
Markus Gans 8c67f64db4 Support for displaying full-width characters 2019-09-28 03:13:06 +02:00
Markus Gans e15f1a344a Minor code changes 2019-09-09 19:13:38 +02:00
Markus Gans bc3afa6235 Remove #pragma pack() directive lines 2019-09-08 02:04:24 +02:00
Markus Gans 81e00a22d3 Outsourcing the initialization data to a separate struct 2019-09-06 08:21:10 +02:00
Markus Gans d1fedfec9f Cygwin and Linux console do not use cp437 character encoding by default 2019-09-04 23:57:31 +02:00
Markus Gans 69db7417ad Removing public + protected data members from classes 2019-09-01 23:29:27 +02:00
Markus Gans 9a40890026 More use of direct initializations 2019-08-25 22:21:01 +02:00
Markus Gans 37ed970319 More use of direct initializations 2019-08-25 22:16:00 +02:00
Markus Gans 43de8d6150 add missing override 2019-08-18 21:46:38 +02:00
Markus Gans 8c90cd2a4c Fixes print() << FPoint() behavior in FScrollView 2019-08-18 21:36:10 +02:00
Markus Gans 248cf8a0ba Update VTerm information only in case of changes 2019-08-18 21:35:36 +02:00
Markus Gans ad2766e706 Solved problem detecting terminal size on quick changes 2019-08-18 02:04:44 +02:00
Markus Gans 4075e6e1ed Update .bettercodehub.yml 2019-08-11 22:32:46 +02:00
Markus Gans bda1582659 Update .bettercodehub.yml 2019-08-11 22:26:11 +02:00
Markus Gans 6b3e0135c7 Update .bettercodehub.yml 2019-08-11 22:18:30 +02:00
Markus Gans 4165772265 Update .bettercodehub.yml 2019-08-11 22:16:50 +02:00
Markus Gans 924d69225f Update .bettercodehub.yml 2019-08-11 22:12:51 +02:00
Markus Gans dec830a0d8 Update .bettercodehub.yml 2019-08-11 22:06:48 +02:00
Markus Gans 258b2489a3 Update .bettercodehub.yml 2019-08-11 22:04:01 +02:00
Markus Gans 5f7f2116f7 Update .bettercodehub.yml 2019-08-11 21:59:56 +02:00
Markus Gans 3bd3819a1a Update .bettercodehub.yml 2019-08-11 21:51:20 +02:00
Markus Gans 44e157e493 Converts getHotkeyPos() for sharing into a non-member function 2019-08-11 20:07:39 +02:00
Markus Gans 5a43a018cf FRect has now got a scaleBy() method 2019-08-11 18:15:57 +02:00
Markus Gans bd81fdb069 set OpenBSD pitch and duration of the system speaker 2019-08-10 20:14:44 +02:00
Markus Gans 5bd46e32ec Add Codecov 2019-08-09 06:48:39 +02:00
Markus Gans 3c5c2aa69e Fixes the Cygwin build 2019-08-07 11:47:03 +02:00
Markus Gans 5257beb73a Small cleanups 2019-08-06 23:45:28 +02:00
Markus Gans 77b76b7a2a Reduce the number of interface parameters 2019-08-04 23:38:47 +02:00
Markus Gans aac2231898 remove debug output from code 2019-08-01 00:28:36 +02:00
Markus Gans 0e12be93cc Unit test for the move assignment operator and move constructor in FPoint, FSize and FRect 2019-07-31 23:57:35 +02:00
Markus Gans 92c120b79e The FTermFreeBSD unit test has been extended 2019-07-29 15:52:23 +02:00
Markus Gans 0ba913a23e small fixes 2019-07-29 02:34:58 +02:00
Markus Gans 8026f64754 Add compile flag for the coverity scan test 2019-07-28 23:48:14 +02:00
Markus Gans f78aba0395 Add unit test for the FTermFreeBSD class 2019-07-28 23:12:01 +02:00
Markus Gans 2b9c64a445 Reduce include entries in the header files 2019-07-21 23:31:21 +02:00
Markus Gans 3c52e77448 FTermOpenBSD unit test completed 2019-07-17 01:37:44 +02:00
Markus Gans 8d9e92023a minor fixes 2019-07-14 23:21:49 +02:00
Markus Gans c49252ab45 Add a unit test for FTermOpenBSD to test the OpenBSD and NetBSD console 2019-07-14 23:05:54 +02:00
Markus Gans ff9673d262 Reduces the use of raw loops 2019-07-14 18:30:35 +02:00
Markus Gans 7cd169758c Expanding the unit test for FTermLinux 2019-07-06 02:57:03 +02:00
Markus Gans 38df039235 Expanding the unit test for FTermLinux 2019-07-04 15:26:26 +02:00
Markus Gans 340d78e433 Expanding the Unit Test for FTermLinux 2019-07-01 01:07:54 +02:00
Markus Gans 73293da481 Homebrew update 2019-06-19 23:12:44 +02:00
Markus Gans 1b35fd0623 pkg-config in .travis.yml 2019-06-19 21:57:45 +02:00
Markus Gans 4cd92ea36e Add a unit test for FTermLinux with a Linux console emulation and a dedicated FSystem test instance 2019-06-19 16:28:55 +02:00
Markus Gans 52c5b412f7 Fixes problem with scroll bar view after first draw 2019-06-12 11:37:34 +02:00
Markus Gans b9ef1200e8 Avoid drawing the scroll bars if the widget is non-visible 2019-06-02 19:14:06 +02:00
Markus Gans 7c46d52ef4 Avoid drawing the scroll bars if the widget is non-visible 2019-06-02 19:11:17 +02:00
Markus Gans c93c0b6e33 Further segfault bug fixes in FListView 2019-05-27 09:55:29 +02:00
Markus Gans 63366b7ef9
Merge pull request #34 from grendello/flistview_segfault
Fix a segfault when processing input to empty FListView
2019-05-27 08:31:06 +02:00
Markus Gans 622eb7089c debug switch build fix 2019-05-27 01:35:32 +02:00
Markus Gans 5e436e91dc Use the Singleton design pattern to get a single object instance via FTerm 2019-05-27 01:10:10 +02:00
Markus Gans 22e47adbcb Use the Singleton design pattern to get a single object instance via FTerm 2019-05-27 00:50:11 +02:00
Marek Habersack c4d9b33628 Fix a segfault when processing input to empty FListView
If the application has a list view with no items and the user clicks the widget
or sends any key (space, plus, minus etc) which acts on the items, the
application will segfault as the item returned from `getCurrentItem()` is
`nullptr` and there's no check made for this condition.

Instead of checking whether current item `!= nullptr` just check whether the
item list is empty and avoid running any code at all in such case.
2019-05-26 23:35:39 +02:00
Markus Gans 75ec596323 macOS build fix 2019-05-17 22:52:01 +02:00
Markus Gans 66fe27e5bc macOS build fix 2019-05-17 22:44:44 +02:00
Markus Gans 6811b32e8a macOS build fix 2019-05-17 22:29:22 +02:00
Markus Gans fa66a7091e Move system calls to the new class FSystem 2019-05-17 15:48:09 +02:00
Markus Gans 5bd8590dee Revision of some comments 2019-04-28 20:57:08 +02:00
Markus Gans 83fbc0a4f5 Use shrink_to_fit() to save memory space 2019-04-27 01:23:30 +02:00
Markus Gans ec502d208a Add the reserve() method to FListBox to increase the capacity of the list 2019-04-27 00:38:15 +02:00
Markus Gans cc720dc7db Travis CI - Work around incomplete ca-chain of scan.coverity.com
See also
https://travis-ci.community/t/certificate-issue-during-coverity-build/3153
2019-04-26 23:48:38 +02:00
Markus Gans 7f206e88f0 Using namespace aliases finalcut::fc in some exemple programs 2019-04-26 21:06:04 +02:00
Markus Gans e3b226b10d Add a "scroll view" chapter to the first steps document 2019-03-24 20:17:54 +01:00
Markus Gans 439b8310ef Add a "scroll view" chapter to the first steps document 2019-03-24 20:15:17 +01:00
Markus Gans 93f464f30e Add an lambda expression callback example to the first steps document 2019-02-28 02:18:30 +01:00
Markus Gans e3fb0c4a56 Drawing of the progress bar has been improved 2019-02-25 23:35:27 +01:00
Markus Gans cefd894c40 .gitignore 2019-02-24 20:59:48 +01:00
Markus Gans b0febda5b4 Added the 7-segment example 2019-02-24 20:21:12 +01:00
Markus Gans 2270f4cde5 Three new methods in FLineEdit 2019-02-24 00:25:36 +01:00
Markus Gans 54dbbbcf4e Build on Solaris 2019-02-10 22:38:00 +01:00
Markus Gans 8813290a89
Merge pull request #33 from gansm/master
merge
2019-02-09 13:43:15 +01:00
Markus Gans a3e3cf22d8 Add a "dynamic layout" Chapter into the first steps document 2019-02-07 23:05:50 +01:00
Markus Gans d91cd10311 Printing FColorPair to change foreground and background color 2019-01-30 12:17:48 +01:00
Markus Gans bd4d8bd3a2 FFileDialog geometry fix 2019-01-27 22:19:33 +01:00
Markus Gans 96cdaa2450 Print function can set the cursor position with an FPoint 2019-01-27 13:44:13 +01:00
Markus Gans c4df64c5bc Refactoring of some methods in FVTerm and FDialog 2019-01-24 00:23:00 +01:00
Markus Gans eeb32bd66e More accurate interfaces through the strict use of FPoint() and FSize() 2019-01-21 03:42:18 +01:00
Markus Gans 4dcc573be7 New class FSize for storing dimensions 2019-01-16 16:00:15 +01:00
Markus Gans cb090e8aff A bit of refactoring 2019-01-12 09:11:22 +01:00
Markus Gans 016f15c860 Generalize hide() method 2019-01-11 22:16:59 +01:00
Markus Gans 60e64be37b Better widget visibility handling with the methods hide() and show() 2019-01-09 20:05:29 +01:00
Markus Gans 6a91738f48 Improvement in widget focusing 2019-01-07 05:03:00 +01:00
Markus Gans 2b110d87d8 Use of initializer_list for FListBox, FListView and FTextView 2019-01-05 22:58:06 +01:00
Markus Gans a56ba6274e Use the final specifier 2019-01-04 02:18:54 +01:00
Markus Gans 652dc67e6e Improved UTF-8 encoding for Cygwin 2019-01-03 21:38:19 +01:00
Markus Gans c365f07298 Better background color for all terminals with a fixed color palette 2019-01-03 20:56:09 +01:00
Markus Gans 25a068590f
Merge pull request #32 from gansm/master
merge
2019-01-03 09:00:28 +01:00
Markus Gans 72fab50cbf Fix foptiattr-test 2019-01-03 08:31:48 +01:00
Markus Gans 838ba23c46 Integration of an output filter to replace missing characters 2019-01-03 07:36:18 +01:00
Markus Gans 4135215df5 Improved PC encoding for Cygwin and Linux 2019-01-02 03:00:07 +01:00
Markus Gans 719e9b0586 Use the override specifier 2018-12-31 06:18:39 +01:00
Markus Gans 0d1f6a5e51 Cygwin compiled fix for C++11 2018-12-30 04:24:46 +01:00
Markus Gans 3ad4652883 Replace redundant FString code with templates 2018-12-29 22:10:24 +01:00
Markus Gans bd3b2b31bb Adding horizontal and vertical scrollability checks in FTextView 2018-12-29 19:01:47 +01:00
Markus Gans 250c04cefd Small data type changes 2018-12-28 22:57:43 +01:00
Markus Gans bc389b730e Add a "signals and callbacks" chapter into the first steps document 2018-12-28 09:42:28 +01:00
Markus Gans 43f97a0d6a Add a "signals and callbacks" chapter into the first steps document 2018-12-28 08:09:05 +01:00
Markus Gans 17540c9581 Add a "signals and callbacks" chapter into the first steps document 2018-12-28 07:46:28 +01:00
Markus Gans 831e9fe05e Global use of FDataPtr for void* 2018-12-27 00:14:46 +01:00
Markus Gans 2a06915f1c Use constexpr for fixed values 2018-12-26 23:41:49 +01:00
Markus Gans 8e618812ac Bugfix in FTermDetection::getXTermColorName 2018-12-26 23:39:15 +01:00
Markus Gans eb8ae63b72 Add a "event processing" chapter into the first steps document 2018-12-25 22:34:04 +01:00
Markus Gans 9a694ab267 New event FUserEvent for user-defined events 2018-12-24 18:11:16 +01:00
Markus Gans 81a4e72916 bool on -> bool enable 2018-12-22 23:50:10 +01:00
Markus Gans ac9ed260f5 some fixes 2018-12-22 15:33:23 +01:00
Markus Gans 602526686c Add a "memory management" Chapter into the first steps document 2018-12-20 01:41:47 +01:00
Markus Gans f6c21db7e7 Use of smart pointers 2018-12-20 01:41:04 +01:00
Markus Gans f3bdc3b410 Use of smart pointers 2018-12-19 22:04:02 +01:00
Markus Gans eeb78aaea7
Merge pull request #30 from gansm/master
merge
2018-12-17 02:35:21 +01:00
Markus Gans 554d26ca00 Reactivate the event queue 2018-12-17 02:06:22 +01:00
Markus Gans ae38a45a5e Improve FButton mouse click animation 2018-12-17 00:50:24 +01:00
Markus Gans c2b6b2c0e2
Merge pull request #29 from gansm/master
merge
2018-12-16 00:19:55 +01:00
Markus Gans b459d55ae8 term-attributes now used a vector of lambda expressions to print the effects 2018-12-16 00:11:25 +01:00
Markus Gans fd924233c3 Code reduction by using of Range-based for loop 2018-12-15 22:10:31 +01:00
Markus Gans cef13611d1 Use of the C++11 auto specifier in the program code 2018-12-15 00:50:09 +01:00
Markus Gans a881b471f3
Merge pull request #28 from gansm/master
merge
2018-12-10 01:54:40 +01:00
Markus Gans 6ce8c5cb27 Use nullptr instead of 0 to initialize a pointer values 2018-12-10 01:48:26 +01:00
Markus Gans fe0c22abe4 Deactivate copy constructor and assignment operator with "= delete" 2018-12-09 22:04:55 +01:00
Markus Gans 7ef9b154b9 Better handling of the scrollbar maximum 2018-12-09 18:24:31 +01:00
Markus Gans 00dc24468f .lgtm.yml 2018-12-08 05:30:53 +01:00
Markus Gans 46f934907d .lgtm.yml 2018-12-07 19:58:26 +01:00
Markus Gans d6fe46c922 configure.ac AC_LANG = C++ 2018-12-06 22:31:33 +01:00
Markus Gans 8a45d9c1cb .travis.yml 2018-12-06 22:09:29 +01:00
Markus Gans 77619bd8f8 .travis.yml 2018-12-06 21:48:26 +01:00
Markus Gans 1b23b0806b ui.cpp: deactivate copy constructor and assignment operator with "= delete" 2018-12-06 21:19:37 +01:00
Markus Gans 31c828d25e Easier handling of fc::SpecialCharacter 2018-12-06 15:39:00 +01:00
Markus Gans fab5aaafdd Easier handling of fc::SpecialCharacter 2018-12-06 03:55:32 +01:00
Markus Gans 527f7d3432 Easier handling of fc::SpecialCharacter 2018-12-06 03:48:17 +01:00
Markus Gans 936995cbdd Easier handling of fc::SpecialCharacter 2018-12-06 03:30:43 +01:00
Markus Gans 9ba1b77069 Easier handling of fc::SpecialCharacter 2018-12-06 02:28:24 +01:00
Markus Gans 48f88fdeec Use delegated constructors and in-class default member initializers 2018-12-03 03:39:55 +01:00
Markus Gans 3537152c28 Use delegated constructors and in-class default member initializers 2018-12-03 03:22:36 +01:00
Markus Gans 4046f05a0c Switched to the language standard C++11 2018-12-02 14:13:52 +01:00
Markus Gans 11871cba89
Merge pull request #25 from gansm/master
merge
2018-11-25 19:58:39 +01:00
Markus Gans f30b8f9431
Merge pull request #22 from gansm/master
merge
2018-11-22 00:19:50 +01:00
Markus Gans fea2d1f5b2
Merge pull request #20 from gansm/master
Merge
2018-10-22 08:42:38 +02:00
Markus Gans 5778ac2741
Merge pull request #15 from gansm/master
Merge
2018-10-05 19:37:40 +02:00
Markus Gans e9634463b1
Merge pull request #14 from gansm/57c14fd
Merge
2018-10-05 19:30:42 +02:00
Markus Gans da2bea4268
Merge pull request #13 from gansm/master
Merge
2018-10-05 00:12:23 +02:00
333 changed files with 94334 additions and 46147 deletions

View File

@ -1,11 +1,15 @@
exclude:
- /fonts/.*
- /scripts/.*
- /doc/.*
- /build.sh
- /ltmain.sh
component_depth: 1
- /debian/.*
- /doc/.*
- /examples/.*
- /fonts/.*
- /icon/.*
- /logo/.*
- /m4/.*
- /scripts/.*
- /build.sh
- /ltmain.sh
component_depth: 3
languages:
- cpp
- script

15
.codacy.yml Normal file
View File

@ -0,0 +1,15 @@
---
engines:
duplication:
enabled: true
exclude_paths:
- 'fonts/**'
- 'test/**'
exclude_paths:
- 'debian/**'
- 'doc/**'
- 'icon/**'
- 'logo/**'
- 'm4/**'
- 'scripts/**'

View File

@ -1,4 +1,4 @@
PROJECT_NAME = "The Final Cut"
PROJECT_NAME = "FINAL CUT"
EXCLUDE = debian, doc, icon, logo, m4, scripts, examples
EXCLUDE_PATTERNS = */test/*

37
.editorconfig Normal file
View File

@ -0,0 +1,37 @@
# EditorConfig helps maintain consistent coding styles
# for multiple developers working on the same project
# across various editors and IDEs.
#
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length=72
[ChangeLog]
trim_trailing_whitespace = false
[*.txt]
trim_trailing_whitespace = false
[*.md]
trim_trailing_whitespace = false
# Domain-Specific Properties
[*.h]
curly_bracket_next_line = true
spaces_around_operators = true
indent_brace_style = Allman
[*.cpp]
curly_bracket_next_line = true
spaces_around_operators = true
indent_brace_style = Allman

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,38 @@
---
name: Bug report
about: Create a bug report
title: ''
labels: bug
assignees: ''
---
## Describe the bug
Give a detailed description of what the bug is.
## How to reproduce the bug?
Explain step-by-step the procedure to reproduce this behavior.
## What behavior did you expect?
Describe what you would expect instead.
## In which environment did the bug occur?
* Which operating system do you use?<br />
Linux, FreeBSD, NetBSD, OpenBSD, macOS, Cygwin, or Solaris
* Which distribution do you use?
* On which CPU architecture did you test?
* Which compiler in which version did you use?
* Which terminal do you use?
* What does the environment variable $TERM contain?

View File

@ -0,0 +1,32 @@
---
name: Feature request
about: Make a suggestion for this project
title: ''
labels: enhancement
assignees: ''
---
## Feature Request
**Do you want to solve a problem with your feature request? Please describe it.**
Describe clearly and precisely what the problem is.
Example: I have an issue when [...]
**Your desired solution**
Describe clearly and concisely what you want to reach.
**Alternatives you have considered**
Describe clearly and concisely the other solutions you considered.
**Additional context**
Add additional context or screenshots to your feature request here.

53
.github/workflows/arm.yml vendored Normal file
View File

@ -0,0 +1,53 @@
name: "ARM build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: ubuntu-latest
name: Build on ${{ matrix.arch }}
# Run steps on a matrix of 3 arch/distro combinations
strategy:
matrix:
include:
- arch: aarch64
- arch: armv7
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Before_install
run: |
lsb_release -a
uname -a
whoami
tty || echo
pwd
- name: Install dependencies via apt-get
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install \
ca-certificates \
gcc \
g++ \
gpm \
libgpm-dev \
libcppunit-dev \
autoconf-archive
- name: Build
run: |
autoreconf -v --install --force
./configure --prefix=/usr
make -j10

74
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@ -0,0 +1,74 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL analysis"
on:
push:
branches: [main]
pull_request:
# The branches below must be a subset of the branches above
branches: [main]
schedule:
- cron: '0 7 * * 2'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['cpp']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
- name: Build dependencies
run: sudo apt-get install autoconf-archive
- name: Create configure file
run: autoreconf -v --install --force
- name: Create makefiles
run: ./configure --prefix=/usr CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -W -Wall -pedantic"
- name: Build
run: make V=1 -j10
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

57
.github/workflows/coverage.yml vendored Normal file
View File

@ -0,0 +1,57 @@
name: "Code coverage"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
analyze:
runs-on: ubuntu-latest
env:
COVERALLS_REPO_TOKEN: "${{ secrets.COVERALLS_REPO_TOKEN }}"
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Before_install
run: |
lsb_release -a
uname -a
whoami
tty || echo
pwd
- name: Install dependencies via apt-get
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install \
ca-certificates \
gcc \
g++ \
gpm \
libgpm-dev \
libcppunit-dev \
autoconf-archive
- name: Download coderalls
run: pip install --user cpp-coveralls
- name: Download codecov
run: sudo pip install codecov
- name: Build with with gcov
run: script -e -c "./build.sh coverage"
- name: Coveralls
run: coveralls --gcov-options '\-lp' -e debian -e doc -e icon -e logo -e m4 -e scripts -e examples
- name: Codecov
run: bash <(curl -s https://codecov.io/bash)

86
.github/workflows/coverity-scan.yml vendored Normal file
View File

@ -0,0 +1,86 @@
name: "Coverity Scan"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
analyze:
# Ubuntu 16.04 LTS will be removed on September 20, 2021
runs-on: ubuntu-16.04
#runs-on: ubuntu-18.04
env:
COVERITY_SCAN_BRANCH_PATTERN: "${{ github.ref}}"
COVERITY_SCAN_NOTIFICATION_EMAIL: "guru.mail@muenster.de"
COVERITY_SCAN_PROJECT_NAME: "${{ github.repository }}"
# Set in repo settings -> secrets -> repository secrets
COVERITY_SCAN_TOKEN: "${{ secrets.COVERITY_SCAN_TOKEN }}"
CURRENT_REF: "${{ github.ref }}"
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Before_install
run: |
lsb_release -a
uname -a
whoami
tty || echo
pwd
- name: Download coverity scan build tool
run: |
wget -q https://scan.coverity.com/download/cxx/linux64 \
--post-data "token=$COVERITY_SCAN_TOKEN&project=gansm%2Ffinalcut" \
-O cov-analysis-linux64.tar.gz
mkdir cov-analysis-linux64
tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64
- name: Install dependencies via apt-get
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install \
ca-certificates \
gcc \
g++ \
gpm \
libgpm-dev \
libcppunit-dev \
autoconf-archive
- name: Build with cov-build
run: |
export PATH=`pwd`/cov-analysis-linux64/bin:$PATH
cat cov-int/scm_log.txt || echo
autoreconf -v --install --force
./configure --prefix=/usr \
CPPFLAGS="-DDEBUG" \
CXXFLAGS="-g -O0 -DDEBUG -DUNIT_TEST" \
--with-unit-test
cov-build --dir cov-int make V=1 -j10
- name: Submit the result to Coverity Scan
run: |
tar czvf finalcut.tgz cov-int
curl \
--form token=$COVERITY_SCAN_TOKEN \
--form email=$COVERITY_SCAN_NOTIFICATION_EMAIL \
--form file=@finalcut.tgz \
--form version="main" \
--form description="Build submitted via github action" \
https://scan.coverity.com/builds?project=gansm%2Ffinalcut
- name: Make unit test
run: |
script -e -c "make check" && RET=$? || RET=$?
cat test/*.log || echo
echo "Exit status: $RET"
exit "$RET"

45
.github/workflows/cygwin.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: "Cygwin build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: windows-latest
name: Build on ${{ matrix.platform }}
strategy:
matrix:
platform: [x86, x64]
steps:
- name: Install Cygwin
uses: egor-tensin/setup-cygwin@v3
with:
platform: ${{ matrix.platform }}
install-dir: C:\cygwin
packages: git grep make libncurses-devel gcc-core gcc-g++ automake autoconf autoconf-archive libtool pkgconf cppunit
- name: Test on Cygwin environment
run: |
uname -a
whoami
pwd
cygcheck -c -d # Show installed Cygwin packages
g++ --version
mkdir src && cd src
git clone git://github.com/gansm/finalcut.git
cd finalcut || echo "The source code directory was not found!"
autoreconf --force --install --verbose --warnings=all
automake --add-missing --copy
./configure --prefix=/usr
make -j10
shell: C:\cygwin\bin\bash.exe --login '{0}'
env:
SHELLOPTS: igncr

36
.github/workflows/freebsd.yml vendored Normal file
View File

@ -0,0 +1,36 @@
name: "FreeBSD build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: macos-10.15
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Test on FreeBSD 12.2
uses: cross-platform-actions/action@v0.0.1
with:
operating_system: freebsd
version: 12.2
shell: bash
run: |
uname -a
freebsd-version
whoami
pwd
sudo pkg update
sudo pkg install -y lang/gcc devel/autotools autotools automake autoconf autoconf-archive libtool pkgconf devel/ncurses devel/cppunit cppunit
g++ --version
autoreconf -v --install --force
./configure --prefix=/usr
make -j10

37
.github/workflows/macos.yml vendored Normal file
View File

@ -0,0 +1,37 @@
name: "macOS build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: macos-latest
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Before_install
run: |
uname -a
g++ --version
whoami
pwd
- name: Install dependencies via homebrew
run: |
brew update
brew install automake
brew install autoconf-archive
- name: Build
run: |
autoreconf -v --install --force
./configure --prefix=/usr
make -j10

38
.github/workflows/openbsd.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: "OpenBSD build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: macos-10.15
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Test on OpenBSD 6.8
uses: cross-platform-actions/action@v0.0.1
with:
operating_system: openbsd
version: 6.8
shell: bash
run: |
uname -a
whoami
pwd
# http://ftp.openbsd.org/pub/OpenBSD/6.8/packages/amd64/
sudo pkg_add gcc-8.4.0 g++-8.4.0 automake-1.16.2 autoconf-2.69p3 autoconf-archive libtool pkgconf cppunit
export CXX=eg++
export AUTOCONF_VERSION=2.69
export AUTOMAKE_VERSION=1.16
eg++ --version
autoreconf -v --install --force
./configure --prefix=/usr
make -j10

33
.github/workflows/solaris.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: "Solaris build"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: macos-latest
steps:
- name: Repository checkout
uses: actions/checkout@v2
- name: Test on Solaris 11.4
uses: vmactions/solaris-vm@v0.0.3
with:
prepare: pkgutil -y -i gcc5g++ automake autoconf autoconf_archive libtool pkgconfig libcppunit1_12_1 libcppunit_dev
run: |
uname -a
whoami
pwd
cat /etc/release
PATH=/opt/csw/bin:$PATH
export PATH
autoreconf -v --install --force
./configure --prefix=/usr
make

61
.github/workflows/sonarcloud.yml vendored Normal file
View File

@ -0,0 +1,61 @@
name: "SonarCloud analysis"
on:
push:
branches: [ main, actions-test ]
pull_request:
branches: [ main, actions-test ]
schedule:
- cron: '0 7 * * 2'
jobs:
build:
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}"
steps:
- name: Repository checkout
uses: actions/checkout@v2
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Before_install
run: |
lsb_release -a
uname -a
whoami
tty || echo
pwd
- name: Install dependencies via apt-get
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install \
ca-certificates \
gcc \
g++ \
gpm \
wget \
unzip \
libgpm-dev \
libcppunit-dev \
autoconf-archive
- name: Build with SonarCloud
run: |
wget -q "https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip"
unzip -q "build-wrapper-linux-x86.zip" -d "/tmp" || echo
LATEST_VERSION=$(wget -O- https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ 2>/dev/null | grep 'linux.zip"' | cut -d\" -f2 | tail -n1)
wget -q "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$LATEST_VERSION"
unzip -q "$LATEST_VERSION" -d "/tmp" || echo
echo "sonar.host.url=https://sonarcloud.io" >> /tmp/sonar-scanner-*/conf/sonar-scanner.properties
mkdir /tmp/sonar-cache
autoreconf -v --install --force
./configure --prefix=/usr
/tmp/build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir bw-output make all
/tmp/sonar-scanner-4.6.2.2472-linux/bin/sonar-scanner

7
.gitignore vendored
View File

@ -32,13 +32,17 @@ Makefile.in
/missing
/stamp-h1
/test-driver
src/.depend
src/.deps/
src/.libs/
examples/.deps/
examples/.libs/
examples/calculator
examples/dialog
examples/busy
examples/event-log
examples/string-operations
examples/background-color
examples/opti-move
examples/termcap
examples/hello
@ -49,12 +53,15 @@ examples/windows
examples/term-attributes
examples/transparent
examples/input-dialog
examples/fullwidth-character
examples/7segment
examples/choice
examples/listbox
examples/listview
examples/checklist
examples/treeview
examples/mandelbrot
examples/rotozoomer
examples/keyboard
examples/mouse
examples/timer

13
.lgtm.yml Normal file
View File

@ -0,0 +1,13 @@
extraction:
cpp:
prepare:
packages:
- autoconf-archive
configure:
command:
- autoreconf -v --install --force
- ./configure --prefix=/usr CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -W -Wall -pedantic"
index:
build_command:
- make V=1 -j10

View File

@ -1,94 +0,0 @@
language: cpp
dist: trusty
sudo: required
compiler:
- gcc
addons:
apt:
packages:
- autotools-dev
- automake
- autoconf
- autoconf-archive
- libtool
- libglib2.0-dev
- libncurses5-dev
- gpm
- libgpm-dev
- gperf
- libcppunit-dev
env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: |-
wvCvMaIm7LoSyWHmpRXvJIetdMnJKsLLxuon6r6BSfpyimoz5FIMEhNhfSt2psv8tJHZgN
/FcMcLhnTuTMIjvtlEtb3syfHDaNs7S2q3rm6LCmuIUU4ECAwAorkMQbXcyh5rgPlDMDiw
CyBE8O1yFQebAFxRoP181+0uI2IiIP/8EW3P5PDSQzds+9fnnwrFS+OeBoUZfxT0F2kj2f
kMXZN4+KmeVIrkqtj8hlRcicLgBPm4hrK5IEUcFLtAbzPj72wkV1duiYG6kqDsATmzMK0m
5EuMhQ/nL/rbSjhrcRZzPFQ7P31ToSwg1I6cyhMjyXSbpwdppZ/RSwTpqDCdq9l4bDDmvI
qizdwYZKcDtyHxm4Zl/LZKwWDsGEelcmuJKfdu+QuTgInGNlqulmDykvbsrk9jTimIzHTb
F8TOn9IpANlTWmvunGeOarvR9qJReZcwSMq41hdMbsUdHiC1arZjKvINcPVuwikzaNq4iA
te6mtSdrfdx1wLxQ6ZYNgKd9hz+uUTlBYl80hkATmq0NPnPQw2KzyG9E6nLrKOy2M0ozO8
bL/epiiMBKJ37X1UcRU4WZYq+peLME8EefcPcXOSWNLwJtR7mtON8uMBrLL9CWmRMFD5Hy
lQYALW2DhCnDBROKB3gxB/VkBGFNE0IPGeDtBGbLqDtKWPQoL125I=
matrix:
include:
#
# Coverity Scan
#
- os: linux
env:
- TEST="Coverity Scan"
addons:
coverity_scan:
project:
name: gansm/finalcut
description: Build submitted via Travis CI
notification_email: guru.mail@muenster.de
build_command_prepend: "autoreconf -v --install --force && ./configure --prefix=/usr CPPFLAGS='-DDEBUG' CXXFLAGS='-g -O0 -DDEBUG' --with-unit-test && make clean"
build_command: "make V=1 -j10"
branch_pattern: master
before_install:
- lsb_release -a
- uname -a
- whoami
- sudo apt-get install gpm libgpm-dev libcppunit-dev
script:
- autoreconf -v --install --force
- ./configure --prefix=/usr CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG" --with-unit-test
- make V=1 -j10
- make check
- cat test/*.log
#
# Coveralls
#
- os: linux
env:
- TEST="Coveralls"
before_install:
- lsb_release -a
- uname -a
- pip install --user cpp-coveralls
script:
- ./build.sh coverage
after_success:
- coveralls --gcov-options '\-lp' -e debian -e doc -e icon -e logo -e m4 -e scripts -e examples
#
# macOS
#
- os: osx
env:
- TEST="macOS"
before_install:
- uname -a
script:
- autoreconf -v --install --force
- ./configure --prefix=/usr
- make -j10

11
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,11 @@
# Code of Conduct
The FINAL CUT Project aims to be a welcoming place and we ask that everyone
who interacts with the project and the larger community treat each other
with dignity and respect. Individuals who do not behave in this manner will
be warned and asked to adjust their behavior; in extreme cases, individuals
could get excluded from the project.
Examples of inappropriate behavior include profane, offensive, or
prejudicial language directed at another person, vandalism, or spam.

633
ChangeLog
View File

@ -1,9 +1,638 @@
2021-06-26 Markus Gans <guru.mail@muenster.de>
* Global non-constant variables are now encapsulated in classes
2021-06-19 Markus Gans <guru.mail@muenster.de>
* Moving the creator methods from FTerm to its own class
2021-06-16 Markus Gans <guru.mail@muenster.de>
* Converted the internal timer from timeval
to std::chrono::time_point<system_clock>
2021-06-06 Markus Gans <guru.mail@muenster.de>
* Bug fixing in FString and FTermDetection
* FTermDetection now has clean code by using FString instead of char*
* Replace std::strlen with stringLength
2021-06-03 Markus Gans <guru.mail@muenster.de>
* Some FString optimizations
2021-05-30 Markus Gans <guru.mail@muenster.de>
* FString internally changed from wchar_t* to std::wstring
2021-05-24 Markus Gans <guru.mail@muenster.de>
* Using std::string for the attribute buffer
2021-05-22 Markus Gans <guru.mail@muenster.de>
* Convert FOptiMove from char[] to std::string
2021-05-13 Markus Gans <guru.mail@muenster.de>
* Prevent duplicate widget in the close widget list
2021-05-07 Markus Gans <guru.mail@muenster.de>
* Some pointers were replaced by references
2021-05-04 Markus Gans <guru.mail@muenster.de>
* Prevent flickering when resizing terminals or redrawing
the screen via ctrl-l
2021-05-02 Markus Gans <guru.mail@muenster.de>
* Bugfix for sending multiple SIGWINCH signals from
gnome-terminal under Wayland
2021-05-01 Markus Gans <guru.mail@muenster.de>
* Replace some std::bind with lambda functions
2021-04-30 Markus Gans <guru.mail@muenster.de>
* Fixes Linux console bug from February 20, 2021
2021-04-27 Markus Gans <guru.mail@muenster.de>
* Code optimization at widget focus
2021-04-24 Markus Gans <guru.mail@muenster.de>
* Fixed mutex deadlock in FLogger
2021-04-21 Markus Gans <guru.mail@muenster.de>
* Fixes the detection of the terminal size after a SIGWINCH signal
2021-04-18 Markus Gans <guru.mail@muenster.de>
* Decoupling the FWidget and FWindow classes from FVTerm
* Avoid redrawing widgets when show() is called multiple times
* Readjustment of the root widget when the terminal size is changed
2021-04-11 Markus Gans <guru.mail@muenster.de>
* Better support for kitty terminals
2021-03-31 Markus Gans <guru.mail@muenster.de>
* argv is now stored internally as a std::vector container
2021-03-30 Markus Gans <guru.mail@muenster.de>
* Stops terminal refresh during dialog resizing until all
child widgets have been redrawn
2021-03-28 Markus Gans <guru.mail@muenster.de>
* Widget now have the virtual method initLayout() to set
the widget layouts automatically before the first drawing
on the terminal is done. Also texts in full-width characters,
whose character width is determined automatically, should be
calculated here.
2021-03-15 Markus Gans <guru.mail@muenster.de>
* Dynamic adjustment of the terminal refresh rate between
5 and 60 Hz
2021-03-09 Markus Gans <guru.mail@muenster.de>
* Implementation of an own padding print method for sending
control codes to the terminal
2021-02-28 Markus Gans <guru.mail@muenster.de>
* Removing the termcap library from the header files so
that FINAL CUT programs are not affected by the preprocessor
#define macros.
Many thanks to Zhenyu Zhang for this optimization suggestion
2021-02-24 Markus Gans <guru.mail@muenster.de>
* Fixed the incorrect display on terminals without
UTF-8 character encoding
2021-02-20 Markus Gans <guru.mail@muenster.de>
* Optimize terminal output buffer queue with differencing
for strings, and control characters and control sequences
2021-02-09 Markus Gans <guru.mail@muenster.de>
* Added support for combined unicode characters
* Added a unit test for the FTermBuffer class
* Added a unit test for the FTterm functions
2020-12-31 Markus Gans <guru.mail@muenster.de>
* Refactoring to scoped enumerations
2020-11-18 Markus Gans <guru.mail@muenster.de>
* The terminal update rate is now limited to 60 Hz
2020-11-14 Markus Gans <guru.mail@muenster.de>
* Version 0.7.1
* Bugfix: The cursor position was not changed anymore
if there was no change to the content
* Forcing a direct update for faster terminal output
2020-11-07 Markus Gans <guru.mail@muenster.de>
* Version 0.7.0
2020-11-04 Markus Gans <guru.mail@muenster.de>
* Elimination of unnecessary terminal flushes
2020-11-03 Markus Gans <guru.mail@muenster.de>
* Use FIONREAD to get the number of characters available
for reading on stdin
2020-11-02 Markus Gans <guru.mail@muenster.de>
* Non-blocking reading before timeout after keystroke
* Every fourth event processing causes a terminal flush
* Call of TIOCLINUX only in the Linux console
2020-11-01 Markus Gans <guru.mail@muenster.de>
* Now FINAL CUT queues keyboard and mouse input to speed up
the processing of widget events
2020-10-22 Markus Gans <guru.mail@muenster.de>
* Repair terminal update skipping
2020-10-20 Markus Gans <guru.mail@muenster.de>
* For fast mouse movements the keyboard interval was increased
from 13.3 to 30 Hz
2020-10-19 Markus Gans <guru.mail@muenster.de>
* Optimize the terminal output speed
2020-10-17 Markus Gans <guru.mail@muenster.de>
* Fixes unit test segfault
2020-10-11 Markus Gans <guru.mail@muenster.de>
* Solaris build fix
* Added saving and restoring xterm titles to the stack
for vte terminals
* Menu key - activates the menu bar
* Shift-Menu - opens the dialog menu
2020-10-08 Markus Gans <guru.mail@muenster.de>
* Better keyboard support for urxvt terminals
* Screen reports (like Secondary DA) are now read directly
* Report Cursor Position (DECXCPR) support
* FListView and FListBox now have direct access to the list of client
elements via data()
2020-10-05 Markus Gans <guru.mail@muenster.de>
* Now hides the input cursor when a widget gets hidden
2020-10-04 Markus Gans <guru.mail@muenster.de>
* Replaces some C-style arrays with std::array
* Now you can use the arrow keys to move a window into the visible area
* Removes FData memory leak in FListBoxItem and FListViewItem
2020-09-27 Markus Gans <guru.mail@muenster.de>
* An explanation of the widget tree was added to the document
of the first steps
2020-09-26 Markus Gans <guru.mail@muenster.de>
* FData improvements
* The number of FObject children can now be limited with
setMaxChildren()
* FApplication can now have no more than one child widget
2020-09-25 Markus Gans <guru.mail@muenster.de>
* std::clog now streams everything to the FLogger object
* Added a unit test for the FData class
2020-09-23 Markus Gans <guru.mail@muenster.de>
* Bugfix: empty FString() + wchar_t
2020-09-22 Markus Gans <guru.mail@muenster.de>
* Bugfix in FDialog::setSize(): Automatic size adjustment and
simultaneous widget movement are now possible.
2020-09-18 Markus Gans <guru.mail@muenster.de>
* The generic data type FDataPtr is now deprecated and was
completely replaced by the template class FData
2020-09-11 Markus Gans <guru.mail@muenster.de>
* Fixes a problem with mouse input in Cygwin in non-blocking read mode
2020-09-08 Markus Gans <guru.mail@muenster.de>
* Speed up the reaction time of the gpm mouse
* FListView now correctly adjusts the size of the scrollbar,
when expanding and collapsing by double-clicking
2020-08-30 Markus Gans <guru.mail@muenster.de>
* Adding Windows Terminal detection
2020-08-15 Markus Gans <guru.mail@muenster.de>
* The call of the function setNonBlockingRead() resulted in
a high CPU load in idle mode.
Thanks to Pavel Stehule for reporting this problem.
2020-08-11 Markus Gans <guru.mail@muenster.de>
* New callback backend was implemented. Callback functions with any
number of arguments are now possible.
2020-07-19 Markus Gans <guru.mail@muenster.de>
* API: Some method name changes:
FObject::delOwnTimer() -> FObject::delOwnTimers()
FObject::delAllTimer() -> FObject::delAllTimers()
FWidget::delCallbacks() -> FWidget::delAllCallbacks()
2020-07-08 Markus Gans <guru.mail@muenster.de>
* New data wrapper class FData
2020-07-06 Markus Gans <guru.mail@muenster.de>
* Add a document that describes how to create user themes
2020-06-11 Markus Gans <guru.mail@muenster.de>
* New widget FBusyIndicator to indicate background activity
* Added example/busy to demonstrate the functionality of this widget
2020-06-07 Markus Gans <guru.mail@muenster.de>
* The --log-file parameter stores log output to any file. The file
can be viewed directly on another terminal with "tail -f".
2020-06-06 Markus Gans <guru.mail@muenster.de>
* Now, the terminal is not initialized before the method show()
is called. Or you force it explicitly via the FApplication object.
* Simplification of FMouse::createMouseObject()
2020-05-30 Markus Gans <guru.mail@muenster.de>
* With the two new methods FApplication::setDarkTheme() and
FApplication::setDefaultTheme() you can now change the theme
within an application. An example can be found in examples/ui
via the menu items "View" -> "Dark mode".
2020-05-29 Markus Gans <guru.mail@muenster.de>
* Adding a dark theme. Can be activated with the --dark-theme parameter.
2020-05-28 Markus Gans <guru.mail@muenster.de>
* FColorPalette now also uses polymorphism, so you can now
easily create your own color palette theme
2020-05-26 Markus Gans <guru.mail@muenster.de>
* FWidgetColors now uses polymorphism, so you can now easily
create your own widget color theme
* FApplication has got the new virtual method processExternalUserEvent()
for user code
2020-05-24 Markus Gans <guru.mail@muenster.de>
* New class FStringStream implements input and output operations
on FString based streams
* Fixed memory leak in FString move assignment operator
2020-05-21 Markus Gans <guru.mail@muenster.de>
* Fixed the event queue in FApplication
2020-05-16 Markus Gans <guru.mail@muenster.de>
* More direct access to the static FTerm functions
2020-05-13 Markus Gans <guru.mail@muenster.de>
* The new class FLogger for logging, which can be redirected
to different I/O channels
* Adding the event-log example to show the logging functionality
2020-05-02 Markus Gans <guru.mail@muenster.de>
* Transfer of all termcap functions into the FTermcap class
2020-04-28 Markus Gans <guru.mail@muenster.de>
* Adding the missing method getClientSize()
* Static code for the special built-in key sequences
2020-04-15 Markus Gans <guru.mail@muenster.de>
* Better support of general arrow keys
* Improved event handling code
2020-04-13 Markus Gans <guru.mail@muenster.de>
* Several small code improvements
2020-04-09 Markus Gans <guru.mail@muenster.de>
* A dialog can now be displayed without a framing border.
Many thanks to basedtho for this tip
2020-03-22 Markus Gans <guru.mail@muenster.de>
* A small benchmakt test was added to the Rotozoomer example
2020-03-08 Markus Gans <guru.mail@muenster.de>
* A rotozoomer example was added to demonstrate the drawing speed
of FINAL CUT
2020-03-07 Markus Gans <guru.mail@muenster.de>
* Fixes keyboard input buffer problem when opening a modal dialog
* Exit the move-resize-mode when the close confirmation dialog
is displayed
2020-03-05 Markus Gans <guru.mail@muenster.de>
* Unbuffered reading of keystrokes for better latency
* Mouse adjustments when resizing an rxvt terminal
2020-02-25 Markus Gans <guru.mail@muenster.de>
* New command line switch "--no-terminal-data-request" to disable
font and title determination
2020-02-19 Markus Gans <guru.mail@muenster.de>
* Some small code improvements
* SGRoptimizer improved
2020-02-16 Markus Gans <guru.mail@muenster.de>
* Printing a FStyle object allows you to change video attributes
2020-02-13 Markus Gans <guru.mail@muenster.de>
* Rename setTransShadow() to setColorOverlay()
2020-02-11 Markus Gans <guru.mail@muenster.de>
* Fix collapse() and expand() in FListViewItem()
2020-02-09 Markus Gans <guru.mail@muenster.de>
* Adding a tty check for stdin
* An application structure diagram was added to the document
of the first steps
2020-02-04 Markus Gans <guru.mail@muenster.de>
* Fix in FListViewIterator
* Add screenshorts to the first steps document
2020-02-02 Markus Gans <guru.mail@muenster.de>
* The methods clear() and remove() were added to FListView
* Add some const type qualifiers
* A small GNU autoconf-archive check
2020-01-12 Markus Gans <guru.mail@muenster.de>
* Add a "widget layout" chapter to the first steps document
2020-01-09 Markus Gans <guru.mail@muenster.de>
* With setText() and clearText() the text in the edit line can be changed
without changing the content of the combo box
* The setCurrentItem() method was added to the FComboBox widget class.
Thanks cybin for the sample code
2020-01-03 Markus Gans <guru.mail@muenster.de>
* Illustrations to explain the widget layout
2019-12-31 Markus Gans <guru.mail@muenster.de>
* The new SGRoptimizer class allows several consecutive parameters
from the SGR (Select Graphic Rendition) attributes to be combined
into one
2019-12-23 Markus Gans <guru.mail@muenster.de>
* Correction for height and width alignment in adjustSize()
* Better setSize() implementation in some widgets
2019-12-20 Markus Gans <guru.mail@muenster.de>
* Fixed the drawing of FLabel widget with the default size
of 1×1 character.
Thanks to terranpro for reporting this issue
2019-12-16 Markus Gans <guru.mail@muenster.de>
* New widget class FComboBox to provide a dropdown list
with an input field
2019-11-17 Markus Gans <guru.mail@muenster.de>
* Revision of FString number input stream
2019-11-16 Markus Gans <guru.mail@muenster.de>
* New widget class FSpinBox to provide spin boxes
2019-11-06 Markus Gans <guru.mail@muenster.de>
* Improved display of the NewFont midline
2019-11-03 Markus Gans <guru.mail@muenster.de>
* Newfont specialization for 8x16 and 9x16 pixel character
* Fixes the display of reverse characters on the 16 color
Linux console
2019-10-28 Markus Gans <guru.mail@muenster.de>
* Unicode support for 8x16graph font
2019-10-20 Markus Gans <guru.mail@muenster.de>
* New method setInputType() in FLineEdit that allows to obscure
password entries
* FAcceleratorList reimplemented as non-pointer
2019-10-15 Markus Gans <guru.mail@muenster.de>
* Version 0.6.0
2019-10-13 Markus Gans <guru.mail@muenster.de>
* Compile fix for Cygwin and Linux on arm architectures
* A small color palette optimization
* Corrected east asian ambiguous character width for OpenBSD, NetBSD,
FreeBSD and Solaris
2019-10-05 Markus Gans <guru.mail@muenster.de>
* Internal redesign of the callback call
* Mapping of key functions in an associative container to simplify
onKeyPress() in FListBox, FListView, FTextView and FScrollView
2019-10-01 Markus Gans <guru.mail@muenster.de>
* Replacing null-terminated wide strings with FString objects
* Fix for getColumnWidth() with newfont character
2019-09-29 Markus Gans <guru.mail@muenster.de>
* Streaming into an FTextView() object
* Fixes the streaming of empty FString objects into a stream with
a width > 0
* The FString operator [] now returns a null character ('\0')
if the position is equal to the string length
2019-09-28 Markus Gans <guru.mail@muenster.de>
* Support for displaying full-width characters (2 columns wide)
on the terminal. This is particularly important for the correct
display of CJK characters
2019-09-16 Markus Gans <guru.mail@muenster.de>
* Improve FStartOptions implementation
2019-09-08 Markus Gans <guru.mail@muenster.de>
* Remove the lines of the #pragma pack() directive from the code
because they caused a misaligned address
2019-09-06 Markus Gans <guru.mail@muenster.de>
* Outsourcing the initialization data to a separate struct
2019-09-04 Markus Gans <guru.mail@muenster.de>
* The Cygwin and Linux console do not use cp437 character encoding
by default anymore
2019-09-01 Markus Gans <guru.mail@muenster.de>
* Removing public + protected data members from classes
2019-08-25 Markus Gans <guru.mail@muenster.de>
* More use of direct initializations
2019-08-18 Markus Gans <guru.mail@muenster.de>
* Solved problem detecting terminal size on quick changes
* Update VTerm information only in case of changes
* Fixes print() << FPoint() behavior in FScrollView
2019-08-11 Markus Gans <guru.mail@muenster.de>
* FRect has now got a scaleBy() method
* Convert drawBorder() to a non-member function using FRect
* Converts getHotkeyPos() for sharing into a non-member function
2019-08-10 Markus Gans <guru.mail@muenster.de>
* Pitch and duration of system speaker can now be changed
on OpenBSD
2019-08-07 Markus Gans <guru.mail@muenster.de>
* Fixes the Cygwin build
2019-08-04 Markus Gans <guru.mail@muenster.de>
* Reduce the number of interface parameters
2019-07-31 Markus Gans <guru.mail@muenster.de>
* Unit test for the move assignment operator and move constructor
in FPoint, FSize and FRect
2019-07-28 Markus Gans <guru.mail@muenster.de>
* FreeBSD can now change the frequency and duration
of the pc speaker signal
* Added a unit test for the FTermFreeBSD class to test
the FreeBSD console
2019-07-21 Markus Gans <guru.mail@muenster.de>
* Reduce include entries in the header files
2019-07-14 Markus Gans <guru.mail@muenster.de>
* Reduces the use of raw loops
* Add a unit test for FTermOpenBSD to test the OpenBSD
and NetBSD console
2019-06-30 Markus Gans <guru.mail@muenster.de>
* Expanding the unit test for FTermLinux
* Update the cp437 unicode map
* Reducing the special cases for Solaris
2019-06-19 Markus Gans <guru.mail@muenster.de>
* Add a unit test for FTermLinux with a Linux console emulation
and a dedicated FSystem test instance
2019-06-12 Markus Gans <guru.mail@muenster.de>
* Fixes problem with scroll bar view after first draw
2019-06-02 Markus Gans <guru.mail@muenster.de>
* Avoid drawing the scroll bars if the widget is non-visible
2019-05-27 Markus Gans <guru.mail@muenster.de>
* Use the Singleton design pattern to get a single object instance
via FTerm
2019-05-26 Marek Habersack <grendel@twistedcode.net>
* Fix a segfault when processing input to empty FListView
2019-05-17 Markus Gans <guru.mail@muenster.de>
* Move system calls to the new class FSystem
2019-04-27 Markus Gans <guru.mail@muenster.de>
* Add the reserve() method to FListBox to increase the capacity
of the list
* Use shrink_to_fit() to save memory space
2019-03-24 Markus Gans <guru.mail@muenster.de>
* Add a "scroll view" chapter to the first steps document
2019-02-28 Markus Gans <guru.mail@muenster.de>
* Add an lambda expression callback example to the first steps document
2019-02-24 Markus Gans <guru.mail@muenster.de>
* FLineEdit now has the ability to define a character input filter
via regular expression (regex)
* Now FLineEdit can define a maximum character length for the input
* The cursor position can now be set directly in FLineEdit
* Added the 7-segment example to demonstrate the use of FTermBuffer
and FLineEdit input filters
2019-02-07 Markus Gans <guru.mail@muenster.de>
* Add a "dynamic layout" chapter into the first steps document
2019-01-30 Markus Gans <guru.mail@muenster.de>
* Printing an FColorPair object can change the foreground and
background color
2019-01-27 Markus Gans <guru.mail@muenster.de>
* The print command can now have an FPoint object as a parameter
to set the cursor position
* Refactoring of the FProgressbar drawing methods
2019-01-24 Markus Gans <guru.mail@muenster.de>
* Refactoring of some methods in FVTerm and FDialog
2019-01-21 Markus Gans <guru.mail@muenster.de>
* More accurate interfaces through the strict use of FPoint()
and FSize()
2019-01-16 Markus Gans <guru.mail@muenster.de>
* New class FSize for storing dimensions
2019-01-12 Markus Gans <guru.mail@muenster.de>
* Refactoring FFileDialog::fileOpenChooser
* Refactoring FFileDialog::fileSaveChooser
* Refactoring FListBox::init()
* Refactoring FListView::init()
* Refactoring FTextView::init()
* Refactoring FTermXTerminal::resetXTermForeground()
* Refactoring FTermXTerminal::resetXTermBackground()
* Refactoring FTermXTerminal::resetXTermCursorColor()
* Refactoring FTermXTerminal::resetXTermMouseForeground()
* Refactoring FTermXTerminal::resetXTermMouseBackground()
* Refactoring FTermXTerminal::resetXTermHighlightBackground()
2019-01-11 Markus Gans <guru.mail@muenster.de>
* Generalize hide() method
2019-01-09 Markus Gans <guru.mail@muenster.de>
* Improvement in widget focusing
* Better widget visibility handling with the methods hide() and show()
2019-01-05 Markus Gans <guru.mail@muenster.de>
* Use of initializer_list for FListBox, FListView and FTextView
2019-01-04 Markus Gans <guru.mail@muenster.de>
* Use the final specifier
2019-01-03 Markus Gans <guru.mail@muenster.de>
* Improved PC encoding for Cygwin and Linux
* Integration of an output filter to replace missing characters
* Better Linux console support for UTF-8 encoding
(Default is PC charset encoding)
* Better background color for all terminals with a fixed color palette
2018-12-31 Markus Gans <guru.mail@muenster.de>
* Use the override specifier
2018-12-30 Markus Gans <guru.mail@muenster.de>
* Cygwin compiled fix for C++11
2018-12-29 Markus Gans <guru.mail@muenster.de>
* Text scrolling in FTextView was broken since February 17th!
* Replace redundant FString code with templates
2018-12-28 Markus Gans <guru.mail@muenster.de>
* Add the assignment operator (=) for FButton to set the button text
* Corrected shortening of overlong texts in the title bar of FDialog
* Add a "signals and callbacks" chapter into the first steps document
2018-12-25 Markus Gans <guru.mail@muenster.de>
* Add a "event processing" chapter into the first steps document
2018-12-24 Markus Gans <guru.mail@muenster.de>
* Events can not only be sent to FWidgets, but also to FObjects
* New event FUserEvent for user-defined events
2018-12-19 Markus Gans <guru.mail@muenster.de>
* Use of smart pointers
* Add a "memory management" chapter into the first steps document
2018-12-17 Markus Gans <guru.mail@muenster.de>
* Improve FButton mouse click animation
* Minor data type corrections
* Reactivate the event queue
2018-12-15 Markus Gans <guru.mail@muenster.de>
* Use of the C++11 auto specifier in the program code
* Code reduction by using of range-based for loop
* The example program for video attributes now replaces
the switch statement with a vector of lambda expressions
2018-12-09 Markus Gans <guru.mail@muenster.de>
* Better handling of the scroll bar maximum
* Deactivate copy constructor and assignment operator with "= delete"
* Use nullptr instead of 0 to initialize a pointer values
2018-12-06 Markus Gans <guru.mail@muenster.de>
* Easier handling of fc::SpecialCharacter
2018-12-01 Markus Gans <guru.mail@muenster.de>
* Improved wheel mouse support
* Switched to the language standard C++11
* Use delegated constructors and in-class default member initializers
2018-12-01 Markus Gans <guru.mail@muenster.de>
* Improved gpm wheel mouse support
* Fix compile in optimization level 2 for newer gcc
2018-11-27 Markus Gans <guru.mail@muenster.de>
* Correct vertical scrollbar position after sorting in FListView
* Correct vertical scroll bar position after sorting in FListView
2018-11-25 Markus Gans <guru.mail@muenster.de>
* Version 0.5.0

103
Contributing.md Normal file
View File

@ -0,0 +1,103 @@
# Contributing
Thank you for your interest in FINAL CUT!
We welcome contributions of all kinds, including patches to code and
documentation, bug reports, or just neat feedback. If you ever think that
something could be better or different, please give us feedback on it. Do
you have problems with FINAL CUT, or are you looking for support in using
the library in your project? Feel free to open a new issue if there is not
already one on your topic. If you have problems with an application that
uses FINAL CUT and have no idea of the cause, please contact the author
first.
Github hosts the source code of FINAL CUT. You can make a local copy from
the repository using git clone:
```bash
> git clone git://github.com/gansm/finalcut.git
```
## Submitting patches
The FINAL CUT project accepts both
[GitHub pull requests](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)
and patches that reach me via other channels. GitHub pull requests are
preferred. Please follow our [coding style](doc/coding-style.txt) standard.
### Explain your work
When submitting a patch, you should include a description of the problem
you are trying to solve, how you solved it, and why you chose the solution
you implemented. When you submit a bug fix, it is often helpful to include
a reproducible description for the problem in your explanation. Important
would be instructions on how to test the error and verify its elimination.
### Test your code
Run the FINAL CUT unit tests if you have installed
[CppUnit](https://freedesktop.org/wiki/Software/cppunit/).
Proceed as follows:
The easy way
```bash
> make distclean
> ./build.sh unit-test
```
or
```bash
> make distclean
> ./configure --prefix=/usr CXXFLAGS="-g -O0 -DDEBUG -DUNIT_TEST" --with-unit-test
> make test
```
If you have created uncovered code, I would be very grateful for
complementary test code in the existing unit tests.
## Issue Tracking
We currently use the
[issue tracker on Github](https://github.com/gansm/finalcut/issues).
## How to help
### What FINAL CUT needs
* We want your feedback, your opinion, your advice, and to hear what you
think!
* Help make FINAL CUT better known. Tell others about this project. A large
user base also means a better and more stable codebase.
* Help maintain and improve the library.
* Write unit tests for untested code.
### What would be helpful
* **Improve documentation:** <br />
Fix typos or grammar mistakes. Revise sections that need improvement or
add missing sections.
* **Translations into other languages:** <br />
For many people, reading the documentary in their native language will
certainly make getting started with FINAL CUT much easier and more
attractive.
* **Better tests:** <br />
High code coverage gives us a stable base that prevents breaking code due
to a small patch.
* **Publication in repositories:** <br />
Advocate for the inclusion of FINAL CUT in your preferred distribution.
* **Support for other platforms:** <br />
There are still platforms on which FINAL CUT is not yet executable.
* **Do you like to help other people?** <br />
Answer questions in open issues or help moderate discussion forums or
other communication channels.
Please help us make the FINAL CUT widget toolkit the best library for
text-based user interfaces.

View File

@ -1,5 +1,5 @@
#----------------------------------------------------------------------
# Makefile.am - The Final Cut terminal programming library
# Makefile.am - FINAL CUT terminal programming library
#----------------------------------------------------------------------
AUTOMAKE_OPTIONS = foreign
@ -19,3 +19,7 @@ docdir = ${datadir}/doc/${PACKAGE}
doc_DATA = AUTHORS COPYING COPYING.LESSER ChangeLog
test: check
uninstall-hook:
if test -d ${docdir}; then rmdir ${docdir}; fi

305
README.md
View File

@ -1,24 +1,26 @@
![FINAL CUT](logo/svg/finalcut-logo.svg)
============================================
### Building and code analysis
*Latest release:*<br />
&#160;&#160;&#160;&#160;&#160;[![Latest Release](https://img.shields.io/github/release/gansm/finalcut.svg)](https://github.com/gansm/finalcut/releases) <br />
*Travis CI:*<br />
&#160;&#160;&#160;&#160;&#160;[![Build Status](https://travis-ci.org/gansm/finalcut.svg?branch=master)](https://travis-ci.org/gansm/finalcut) <br />
*Coverity Scan:*<br />
&#160;&#160;&#160;&#160;&#160;[![Coverity Scan Status](https://scan.coverity.com/projects/6508/badge.svg)](https://scan.coverity.com/projects/6508) <br />
*LGTM:*<br />
&#160;&#160;&#160;&#160;&#160;[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/gansm/finalcut.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/gansm/finalcut/context:cpp) <br />
*Class Reference:*<br />
&#160;&#160;&#160;&#160;&#160;[![documented](https://codedocs.xyz/gansm/finalcut.svg)](https://codedocs.xyz/gansm/finalcut/hierarchy.html)
# Library for creating terminal applications with text-based widgets
### Description
The FINAL CUT is a C++ class library and widget toolkit with full mouse support for creating a [text-based user interface](https://en.wikipedia.org/wiki/Text-based_user_interface). The library supports the programmer to develop an application for the text console. It allows the simultaneous handling of multiple text windows on the screen.
FINAL CUT is a C++ class library and widget toolkit with full [mouse](doc/mouse-control.md#title-bar-actions-on-mouse-clicks) support for creating a [text-based user interface](https://en.wikipedia.org/wiki/Text-based_user_interface). The library supports the programmer to develop an application for the text console. It allows the simultaneous handling of multiple text windows on the screen.
The structure of the Qt framework was originally the inspiration for the C++ class design of FINAL CUT. It provides common controls like dialog boxes, push buttons, check boxes, radio buttons, input lines, list boxes, status bars and so on.
### Installation
## Building and code analysis
| | Badge |
|-------------------:|:------|
| *Latest release* | [![Latest Release](https://img.shields.io/github/release/gansm/finalcut.svg)](https://github.com/gansm/finalcut/releases) |
| *License* | [![license](https://img.shields.io/github/license/gansm/finalcut.svg?colorA=#333)](COPYING) |
| *Class Reference* | [![documented](https://codedocs.xyz/gansm/finalcut.svg)](https://codedocs.xyz/gansm/finalcut/hierarchy.html) |
| *Travis CI* | [![Build Status](https://travis-ci.com/gansm/finalcut.svg?branch=main)](https://travis-ci.com/gansm/finalcut)
| *Coverity Scan* | [![Coverity Scan Status](https://img.shields.io/coverity/scan/6508.svg)](https://scan.coverity.com/projects/6508 )|
| *LGTM* | [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/gansm/finalcut.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/gansm/finalcut/context:cpp) |
| *SonarCloud* | [![Quality gate](https://sonarcloud.io/api/project_badges/measure?project=gansm_finalcut&metric=alert_status)](https://sonarcloud.io/dashboard?id=gansm_finalcut) |
| *CodeFactor* | [![CodeFactor](https://www.codefactor.io/repository/github/gansm/finalcut/badge)](https://www.codefactor.io/repository/github/gansm/finalcut) |
## Installation
```bash
> git clone git://github.com/gansm/finalcut.git
> cd finalcut
@ -28,7 +30,8 @@ The structure of the Qt framework was originally the inspiration for the C++ cla
> su -c "make install"
```
### Supported platforms
## Supported platforms
* Linux
* FreeBSD
* NetBSD
@ -37,186 +40,191 @@ The structure of the Qt framework was originally the inspiration for the C++ cla
* Cygwin
* Solaris
### First steps
## First steps
[How to use the library](doc/first-steps.md#first-steps-with-the-final-cut-widget-toolkit)
See the [first steps](doc/first-steps.md#first-steps-with-the-final-cut-widget-toolkit) documentation for information on how to use the library.
### Screenshots
## Some screenshots
The FFileDialog widget:
The FFileDialog widget with incremental file name search:
![FFileDialog](doc/fileopen-dialog.png)
The Final Cut FProgressbar widget:
The FINAL CUT FProgressbar widget:
![FProgressbar](doc/progress-bar.png)
Scrollable text in the FTextView widget:
![FTextView](doc/textview.png)
![FTextView](doc/textview.png)
The Mandelbrot set example:
![Mandelbrot set](doc/Mandelbrot.png)
![Mandelbrot set](doc/Mandelbrot.png)
## newfont
newfont
-------
A [graphical text font](fonts/) for X11 and the Linux console.
![ui example in newfont mode](doc/newfont1.png)
Newfont drive symbols:
![drive symbols](doc/newfont2.png)
The calculator example in newfont mode:
![calculator](doc/calculator.png)
## Benchmark
Virtual terminal
----------------
It uses a virtual terminal to print the character via an update method on the screen.
The virtual windows are an overlying layer to realizing window movements.
The update method transmits only the changes to the virtual terminal or the screen.
Here you can find a test for [measuring the character speed](doc/benchmark.md#benchmark) in the terminal.
## Virtual terminal
FINAL CUT uses a virtual terminal to print character via an update method on the screen. It provides (as an overlying layer) virtual windows for the realization of window movements. The update methods only transfer differences to the virtual terminal or physical screen.
<pre style="line-height: 1 !important;">
print(...)
printf(...)
│ ╔═════════════════════════[ vterm ]═════════════════════════╗
│ ║createVTerm() ║
│ ║ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║
│ ║ ║
│ ║ │ restoreVTerm(x,y,w,h) │ ║
│ ║ ║
│ ║ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║
│ ║ ║
│ ┌───────╨─────[ vwin ]─────────────┐ ║
│ │createArea(area) │ ║
│ │ │ ║
│ │ │ ║
└───┼─────────────► ──────► updateVTerm(area) ────► ║
│ │ ║
│ putArea(x,y,area) ║
│ ────────────────────► ║
│ getArea(x,y,area) ║
│ ◄──────────────────── ║
│ │ ║
│ │ ║
│ resizeArea(area)│ ║
└───────╥──────────────────────────┘ ║
║ ║
║ ║
║ ║
║ │ resizeVTerm()║
╚═══▼═══════════════════════════════════════════════════════╝
│ putVTerm()
└──────────────────► updateTerminalLine(y)
updateTerminal() │
┌───────────────┐
│ output_buffer │
└───────────────┘
│ flush_out()
│ +
│ Fputchar(char)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▌ ▐
▌ screen ▐
▌ ───────────── ▐
▌ real terminal ▐
▌ ▐
▀▀▀▀▀▀▀███▀▀▀▀▀▀▀
███
▀▀▀▀▀▀▀▀▀
│ ╔════════════════════════[ vterm ]════════════════════════╗
│ ║createVTerm() ║
│ ║ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║
│ ║ ║
│ ║ │ restoreVTerm(x,y,w,h) │ ║
│ ┌───────╨────[ vwin ]────────────┐ ║
│ │createArea(area) │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║
│ │ │ ║
│ │ │ ║
└──┼────────► putArea(area) ────► ║
│ │ ║
│ putArea(x,y,area) ────► ║
│ │ ║
│ ◄──── getArea(x,y,area) ║
│ │ ║
│ │ ║
│ │ ║
│ resizeArea(area)│ ║
└───────╥────────────────────────┘ ║
║ ║
║ │ resizeVTerm()║
╚═══════▼═════════════════════════════════════════════════╝
│ putVTerm()
└──────────────────► updateTerminalLine(y)
updateTerminal() │
┌───────────────┐
│ output_buffer │
└───────────────┘
│ flushOutputBuffer()
│ and putchar(char)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▌ ▐
▌ screen ▐
▌ ───────────── ▐
▌ real terminal ▐
▌ ▐
▀▀▀▀▀▀▀███▀▀▀▀▀▀▀
███
▀▀▀▀▀▀▀▀▀
</pre>
Class digramm
-------------
## Class digramm
<pre style="line-height: 1 !important;">
1┌──────────────┐
1┌────────────┐
┌-----------┤ FTermLinux │
: └────────────┘
: 1┌──────────────┐
┌-----------┤ FTermFreeBSD │
: └──────────────┘
: 1┌──────────────┐ ┌───────────┐
┌-----------┤ FTermOpenBSD │ ┌────┤ FKeyEvent │
: └──────────────┘ │ └───────────┘
: 1┌──────────────┐
┌-----------┤ FTermOpenBSD │
: └──────────────┘
: 1┌────────────────┐ ┌───────────┐
┌-----------┤ FTermDetection │ ┌────┤ FKeyEvent │
: └────────────────┘ │ └───────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermDetection │ ├────┤ FMouseEvent │
┌-----------┤ FTermcapQuirks │ ├────┤ FMouseEvent │
: └────────────────┘ │ └─────────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermcapQuirks │ ├────┤ FWheelEvent │
: └────────────────┘ │ └─────────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermXTerminal │ ├────┤ FFocusEvent │
┌-----------┤ FTermXTerminal │ ├────┤ FWheelEvent │
: └────────────────┘ │ └─────────────┘
: 1┌──────────┐ │ ┌─────────────┐
┌-----------┤ FTermcap │ ├────┤ FAccelEvent │
┌-----------┤ FTermcap │ ├────┤ FFocusEvent │
: └──────────┘ │ └─────────────┘
: 1┌──────────┐ │ ┌─────────────
┌-----------┤ FTermios │ ├────┤ FResizeEvent │
: └──────────┘ │ └─────────────
: 1┌───────────────┐ │ ┌────────────┐
┌-----------┤ FColorPalette │ ├────┤ FShowEvent │
: └───────────────┘ │ └────────────┘
: 1┌──────────┐ │ ┌─────────────┐
┌-----------┤ FTermios │ ├────┤ FAccelEvent │
: └──────────┘ │ └─────────────┘
: 1┌───────────────┐ │ ┌──────────────
┌-----------┤ FColorPalette │ ├────┤ FResizeEvent │
: └───────────────┘ │ └──────────────
: 1┌───────────┐ │ ┌────────────┐
┌-----------┤ FOptiMove │ ├────┤ FHideEvent │
┌-----------┤ FOptiMove │ ├────┤ FShowEvent │
: └───────────┘ │ └────────────┘
: 1┌───────────┐ │ ┌────────────┐
┌-----------┤ FOptiAttr │ ├────┤ FHideEvent │
: └───────────┘ │ └────────────┘
: 1┌───────────┐ │ ┌─────────────┐
┌-----------┤ FOptiAttr │ ├────┤ FCloseEvent │
┌-----------┤ FKeyboard │ ├────┤ FCloseEvent │
: └───────────┘ │ └─────────────┘
: 1┌───────────┐ │ ┌─────────────┐
┌-----------┤ FKeyboard │ ├────┤ FTimerEvent │
: └───────────┘ │ └─────────────┘
: 1┌───────────────┐ │
┌-----------┤ FMouseControl │ │ ┌──────────────┐
: └───────────────┘ │ ┌────┤ FApplication │
: *┌─────────┐ │ │ └──────────────┘
: ┌--------┤ FString │ │ │ ┌─────────┐
: : └─────────┘ │ ├────┤ FButton │
: : *┌────────┐ │ │ └─────────┘
: 1┌───────────────┐ │ ┌─────────────┐
┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │
: └───────────────┘ │ └─────────────┘
: 1┌─────────┐ │ ┌────────────┐1 1┌───────┐
┌-----------┤ FSystem │ ├────┤ FUserEvent ├------┤ FData │
: └─────────┘ │ └────────────┘ └───────┘
: *┌─────────┐ │ ┌──────┐ ┌─────────┐
: ┌--------┤ FString │ │ │ FLog │◄──┤ FLogger │
: : └─────────┘ │ └──┬───┘ └─────────┘
: : *┌───────────────┐ │ :1
: ┌--------┤ FStringStream │ │ ┌──┴───────────┐
: : └───────────────┘ │ ┌────┤ FApplication │
: : *┌────────┐ │ │ └──────────────┘
: ┌--------┤ FPoint │ │ │ ┌────────┐
: : └────────┘ │ ├────┤ FLabel │
: : *┌───────┐ │ │ └────────┘
: ┌--------┤ FRect │ │ │ ┌───────────┐
: : └───────┘ │ ├────┤ FLineEdit │
:1 :1 │ │ └───────────┘
┌─┴──┴──┐ │ │ ┌──────────────┐ ┌──────────────┐
│ FTerm │ │ ├────┤ FButtonGroup │ ┌──┤ FRadioButton │
└───┬───┘ ┌────────┐ │ │ └──────────────┘ │ └──────────────┘
:1 │ FEvent │◄─────┘ │ ┌───────────────┐ │ ┌───────────┐
┌───┴────┐ └────┬───┘ ├────┤ FToggleButton │◄─┼──┤ FCheckBox │
│ FVTerm │◄──┐ :1 │ └───────────────┘ │ └───────────┘
└────────┘ │ ┌────┴────┐ │ ┌──────────────┐ │ ┌─────────┐
├────┤ FWidget │◄───────┼────┤ FProgressbar │ └──┤ FSwitch │
┌─────────┐ │ └─────────┘ │ └──────────────┘ └─────────┘
│ FObject │◄──┘ │ ┌────────────┐
└─────────┘ ├────┤ FScrollbar │
: : *┌───────┐ │ │ └───────────┘
: ┌--------┤ FSize │ │ │ ┌──────────┐
: : └───────┘ │ ├────┤ FSpinBox │
:1 :1 │ │ └──────────┘
┌─┴──┴──┐ │ │ ┌─────────┐
│ FTerm │ │ ├────┤ FButton │
└───┬───┘ ┌────────┐ │ │ └─────────┘
:1 │ FEvent │◄─────┘ │ ┌──────────────┐ ┌──────────────┐
┌───┴────┐ └────┬───┘ ├────┤ FButtonGroup │ ┌──┤ FRadioButton │
│ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘
└────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐
├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │
┌─────────┐ │ └────┬────┘ │ └───────────────┘ │ └───────────┘
│ FObject │◄──┘ :1 │ ┌──────────────┐ │ ┌─────────┐
└─────────┘ ┌──────┴────────┐ ├────┤ FProgressbar │ └──┤ FSwitch │
│ FWidgetColors │ │ └──────────────┘ └─────────┘
└───────────────┘ │ ┌────────────┐
├────┤ FScrollbar │
│ └────────────┘
│ ┌───────────┐
├────┤ FTextView │
│ └───────────┘
│ ┌──────────┐1 *┌──────────────┐
├────┤ FListBox ├-------┤ FListBoxItem │
│ └──────────┘ └──────────────┘
┌─────────────┐1 │ 1┌───────────┐1 *┌───────────────┐
│ FTermBuffer ├----------------------├────┤ FListView ├------┤ FListViewItem │
└─────────────┘ │ └───────────┘ └───────────────┘
│ ┌─────────────┐
├────┤ FScrollView │
│ └─────────────┘
│ ┌───────────┐1 1┌──────────────────┐
├────┤ FComboBox ├------┤ FDropDownListBox │
│ └───────────┘ └──────────────────┘
┌─────────────┐1 │ ┌──────────┐1 *┌──────────────┐1
│ FTermBuffer ├----------------------├────┤ FListBox ├-------┤ FListBoxItem ├--┐
└─────────────┘ │ └──────────┘ └──────────────┘ :
│ 1┌───────────┐1 *┌───────────────┐ :
├────┤ FListView ├------┤ FListViewItem │ :
│ └───────────┘ └────────┬──────┘ :
│ ┌─────────────┐ :1 :
├────┤ FScrollView │ ┌───┴───┐1 :
│ └─────────────┘ │ FData ├----┘
│ └───────┘
│ ┌────────────┐1 *┌────────────┐
│ ┌──┤ FStatusBar ├-----┤ FStatusKey │
│ │ └────────────┘ └────────────┘
@ -227,9 +235,9 @@ Class digramm
└──┬──┬───┘ └─────────┘ │ ┌─────────────┐
▲ ▲ └──┤ FMessageBox │
│ │ └─────────────┘
│ │ ┌──────────┐
│ └──────┤ FToolTip │
│ └──────────┘
│ │ ┌──────────┐ ┌────────────────┐
│ └──────┤ FToolTip │◄─┤ FBusyIndicator │
│ └──────────┘ └────────────────┘
└───────────────┐ ┌──────────┐
│ ┌───┤ FMenuBar │
┌───────────┐ └──────┤ └──────────┘
@ -248,17 +256,14 @@ Class digramm
└────────────────┘
</pre>
License
-------
GNU Lesser General Public License Version 3
## Frequently Asked Questions
Frequently Asked Questions
--------------------------
If you have any problems, please read the
[FAQ](doc/faq.md#frequently-asked-questions)
before you give up.
For general questions about FINAL CUT, likely the answer is already included in the [FAQ](doc/faq.md#frequently-asked-questions).
## Please send bug reports to
Please send bug reports to
--------------------------
https://github.com/gansm/finalcut/issues
## License
GNU Lesser General Public License Version 3 <a href="https://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img width="200" align="right" src="https://camo.githubusercontent.com/726b87cc2ebaf8c40716842ff509c5f874381c8e/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f332f33622f4c47504c76335f4c6f676f2e737667" alt="LGPLv3" data-canonical-src="https://upload.wikimedia.org/wikipedia/commons/3/3b/LGPLv3_Logo.svg"></a>

12
SECURITY.md Normal file
View File

@ -0,0 +1,12 @@
# Security policy
## Dealing with security vulnerabilities
There is no separate process for handling security vulnerabilities in FINAL CUT. Security vulnerabilities are fixed and published like all other bugs. Nevertheless, from the moment they are brought to our attention, we try to close them as soon as possible.
## Reporting a security vulnerability
Preferably report a vulnerability via email to "guru.mail" + "@" + "muenster.de" or open an issue in the GitHub repository, the latter meaning that you made the vulnerability public before it was fixed.
If you already have a solution for the security problem, please submit a pull request.

View File

@ -35,7 +35,7 @@ then
autoreconf --install --force
else
echo "Build failed, please install autoconf first"
exit -1
exit 255
fi
fi
fi
@ -43,10 +43,10 @@ fi
# Build commands
case "$1" in
"--release"|"release")
if ! ./configure --prefix="$PREFIX" CXXFLAGS="-O2" # "-O3 -fno-rtti"
if ! ./configure --prefix="$PREFIX" CXXFLAGS="-O3" # "-flto -fno-rtti"
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
@ -54,15 +54,15 @@ case "$1" in
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -W -Wall -pedantic"
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
"--fulldebug"|"fulldebug")
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -W -Wall -Weffc++ -pedantic -pedantic-errors -Wextra -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimport -Winit-self -Winvalid-pch -Wlong-long -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wpacked -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -fstack-protector -Wstrict-aliasing -Wstrict-aliasing=3 -Wswitch -Wswitch-enum -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wsign-promo -Woverloaded-virtual -Wstrict-null-sentinel -fext-numeric-literals -Wreorder -Wnoexcept -Wnarrowing -Wliteral-suffix -Wctor-dtor-privacy"
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -W -Wall -Weffc++ -pedantic -pedantic-errors -Wextra -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimport -Winit-self -Winvalid-pch -Wlong-long -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wpacked -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -fstack-protector -Wstrict-aliasing -Wstrict-aliasing=3 -Wswitch -Wswitch-enum -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wsign-promo -Woverloaded-virtual -Wstrict-null-sentinel -fext-numeric-literals -Wreorder -Wnoexcept -Wnarrowing -Wliteral-suffix -Wctor-dtor-privacy -ftree-loop-distribute-patterns -Wmemset-transposed-args -Wno-format-nonliteral"
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
@ -70,7 +70,7 @@ case "$1" in
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -pg -O0 -DDEBUG -W -Wall -pedantic"
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
@ -78,23 +78,23 @@ case "$1" in
if ! ./configure --prefix="$PREFIX" --with-profiler
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
"--unit-test"|"unit-test")
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG" --with-unit-test
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -DUNIT_TEST" --with-unit-test
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
"--coverage"|"coverage")
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG" --with-unit-test --with-gcov
if ! ./configure --prefix="$PREFIX" CPPFLAGS="-DDEBUG" CXXFLAGS="-g -O0 -DDEBUG -DUNIT_TEST" --with-unit-test --with-gcov
then
echo "${RED}Configure failed!${NORMAL}" 1>&2
exit -1
exit 255
fi
;;
@ -139,6 +139,7 @@ if [ "$1" = "--unit-test" ] \
|| [ "$1" = "--coverage" ] \
|| [ "$1" = "coverage" ]
then
rm test/*.log 2>/dev/null
cd test && make check-TESTS
cat ./*.log 2>/dev/null
cd .. || exit

5
codecov.yml Normal file
View File

@ -0,0 +1,5 @@
coverage:
status:
project: on
patch: off

View File

@ -1,10 +1,10 @@
#----------------------------------------------------------------------
# configure.ac - the Final Cut library
# configure.ac - FINAL CUT library
#----------------------------------------------------------------------
# Process this file with autoconf to produce a configure script.
AC_INIT([finalcut], [0.5.0])
AC_INIT([finalcut], [0.7.2])
AC_CONFIG_HEADER([config.h])
AX_PREFIX_CONFIG_H([src/include/final/fconfig.h], [F])
AC_CONFIG_SRCDIR([src/fobject.cpp])
@ -13,6 +13,9 @@ AM_INIT_AUTOMAKE
AC_PROG_CC
AC_PROG_CXX
m4_pattern_forbid([^AX_CHECK_COMPILE_FLAG\b],
[Macro AX_CHECK_COMPILE_FLAG not found. Please install GNU autoconf-archive])
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS( \
@ -46,13 +49,14 @@ AC_CHECK_FUNCS( \
vsnprintf )
# Checks for 'tgetent'
AC_SEARCH_LIBS([tgetent], [termcap tinfo curses ncurses])
AC_SEARCH_LIBS([tgetent], [terminfo mytinfo termlib termcap tinfo ncurses curses])
# Checks for 'tparm'
AC_SEARCH_LIBS([tparm], [termcap tinfo curses ncurses])
AC_SEARCH_LIBS([tparm], [terminfo mytinfo termlib termcap tinfo ncurses curses])
# Checks for libtool
AC_ENABLE_SHARED
AC_ENABLE_STATIC
AC_LANG([C++])
LT_INIT([dlopen])
LT_LANG([C++])
LT_OUTPUT
@ -60,7 +64,7 @@ LT_OUTPUT
### This defines the version number of the installed .so files
### Update this value for every release! (A:B:C will map to foo.so.(A-C).C.B)
### using libtool's versioning system.
AC_SUBST(SO_VERSION, ["5:0:5"])
AC_SUBST(SO_VERSION, ["7:2:7"])
AC_SUBST([LIBTOOL_DEPS])
@ -75,15 +79,19 @@ AC_CONFIG_FILES([Makefile
finalcut.spec
finalcut.pc])
# Check for C++11 support
AX_CHECK_COMPILE_FLAG([[-std=c++11]],,
[AC_MSG_ERROR([compiler did not accept -std=c++11])])
# use GPM (General Purpose Mouse)
AC_ARG_WITH([gpm],
[AS_HELP_STRING([--without-gpm], [Disable GPM mouse support])],
[with_gpm=no],
[],
[with_gpm=yes])
if test "x$with_gpm" = "xyes"
if test "x$with_gpm" != "xno"
then
AC_CHECK_LIB([gpm],
[main],
[Gpm_Open],
[AC_DEFINE([HAVE_LIBGPM], 1, [Define to 1 if GPM mouse is enabled])
LIBS="$LIBS -lgpm"])
fi
@ -91,9 +99,9 @@ fi
# profiling
AC_ARG_WITH([profiler],
[AS_HELP_STRING([--with-profiler], [build extra google profiler binaries])],
[with_profiler=yes],
[],
[with_profiler=no])
if test "x$with_profiler" = "xyes"
if test "x$with_profiler" != "xno"
then
AC_CHECK_LIB([profiler],
[ProfilerFlush],
@ -103,26 +111,24 @@ fi
# unit test
AC_ARG_WITH([unit-test],
[AS_HELP_STRING([--with-unit-test], [build unit tests])],
[with_unit_test=yes],
[],
[with_unit_test=no])
if test "x$with_unit_test" = "xyes"
if test "x$with_unit_test" != "xno"
then
AC_MSG_NOTICE(enabled cppunit test)
AM_PATH_CPPUNIT([1.12.0],
[],
[AC_MSG_ERROR([*** CppUnit not found! ***])])
PKG_CHECK_MODULES(CPPUNIT,
[cppunit > 1.12.0])
AM_CONDITIONAL(CPPUNIT_TEST, [test "1" = "1"])
else
AM_CONDITIONAL(CPPUNIT_TEST, [test "1" = "0"])
fi
# code coverage
AC_ARG_WITH([gcov],
[AS_HELP_STRING([--with-gcov], [build for code coverage testing])],
[with_gcov=yes],
[],
[with_gcov=no])
if test "x$with_gcov" = "xyes"
if test "x$with_gcov" != "xno"
then
AC_CHECK_LIB([gcov],
[main],

18
debian/changelog vendored
View File

@ -1,3 +1,21 @@
finalcut (0.7.1) unstable; urgency=low
* Release (version 0.7.1)
-- Markus Gans <guru.mail@muenster.de> Sat, 14 Nov 2020 20:07:39 +0100
finalcut (0.7.0) unstable; urgency=low
* Release (version 0.7.0)
-- Markus Gans <guru.mail@muenster.de> Sat, 07 Nov 2020 11:24:39 +0100
finalcut (0.6.0) unstable; urgency=low
* Release (version 0.6.0)
-- Markus Gans <guru.mail@muenster.de> Mon, 14 Oct 2019 01:49:57 +0100
finalcut (0.5.0) unstable; urgency=low
* Release (version 0.5.0)

31
debian/control vendored
View File

@ -19,18 +19,15 @@ Architecture: any
Pre-Depends: ${misc:Pre-Depends}
Multi-Arch: same
Depends:
${shlibs:Depends}
, ${shlibs:Depends}
, ${misc:Depends}
Suggests:
coreutils
fonts-libfinal
, coreutils
, ncurses-term
, grep
, sed
, vim-common
, gzip
, xfonts-utils
Description: Shared library for the final cut widget toolkit
The Final Cut is a class library and widget toolkit with full mouse
FINAL CUT is a class library and widget toolkit with full mouse
support for creating a text-based user interface. The library supports
the programmer to develop an application for the text console. It allows
the simultaneous handling of multiple windows on the screen.
@ -53,7 +50,7 @@ Depends:
, libtinfo-dev
, libncurses5-dev
Description: Developer's library for the final cut widget toolkit
The Final Cut is a class library and widget toolkit with full mouse
FINAL CUT is a class library and widget toolkit with full mouse
support for creating a text-based user interface. The library supports
the programmer to develop an application for the text console. It allows
the simultaneous handling of multiple windows on the screen.
@ -77,7 +74,7 @@ Depends:
, libtinfo-dev
, libncurses5-dev
Description: Test and example programs for the final cut widget toolkit
The Final Cut is a class library and widget toolkit with full mouse
FINAL CUT is a class library and widget toolkit with full mouse
support for creating a text-based user interface. The library supports
the programmer to develop an application for the text console. It allows
the simultaneous handling of multiple windows on the screen.
@ -88,3 +85,19 @@ Description: Test and example programs for the final cut widget toolkit
.
This package contains programs that demonstrate the possibilities of
the final cut library.
Package: fonts-libfinal
Architecture: all
Multi-Arch: foreign
Section: fonts
Depends:
${misc:Depends}
, xfonts-utils
Suggests:
xserver | xfs
, grep
, sed
, gzip
Description: X11 bitmap font for FINAL CUT
Special X11 bitmap font used by FINAL CUT to display graphic objects.

6
debian/copyright vendored
View File

@ -7,13 +7,13 @@ Copyright: 2017, Markus Gans <guru.mail@muenster.de>
License: LGPL-3
License: LGPL-3
The Final Cut is free software: you can redistribute it and/or modify
FINAL CUT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
The Final Cut is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
FINAL CUT is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
.

9
debian/fonts-libfinal.docs vendored Normal file
View File

@ -0,0 +1,9 @@
AUTHORS
COPYING
COPYING.LESSER
fonts/newfont.txt
doc/newfont-8x16.txt
doc/newfont-9x16.txt
doc/newfont1.png
doc/newfont2.png
doc/calculator.png

3
debian/fonts-libfinal.install vendored Normal file
View File

@ -0,0 +1,3 @@
fonts/8x16graph.pcf.gz /usr/share/fonts/X11/misc/
fonts/xfonts-finalcut-newfont.alias /etc/X11/fonts/misc/
fonts/40-finalcut-newfont.conf usr/share/fontconfig/conf.avail

1
debian/fonts-libfinal.links vendored Normal file
View File

@ -0,0 +1 @@
usr/share/fontconfig/conf.avail/40-finalcut-newfont.conf etc/fonts/conf.d/40-finalcut-newfont.conf

View File

@ -1,11 +1,36 @@
AUTHORS
COPYING
COPYING.LESSER
ChangeLog
README.md
doc/benchmark.md
doc/calculator.png
doc/calendar-draft.png
doc/class-diagram.txt
doc/class_template.cpp
doc/class_template.h
doc/coding-style.txt
doc/console_codes-manual.sh
doc/console_ioctl-manual.sh
doc/faq.md
doc/fileopen-dialog.png
doc/final-cut-application-structure.svg
doc/final-cut-widget-tree.svg
doc/first-steps_callback-function.cpp.png
doc/first-steps_callback-lambda.cpp.png
doc/first-steps_callback-method.cpp.png
doc/first-steps_dialog.cpp.png
doc/first-steps_emit-signal.cpp.png
doc/first-steps.md
doc/first-steps_memory.cpp.png
doc/first-steps_scrollview.cpp.png
doc/first-steps_size-adjustment.cpp.png
doc/first-steps_timer.cpp.png
doc/first-steps_user-event.cpp.png
doc/framebuffer.txt
doc/Mandelbrot.png
doc/mouse-control.md
doc/ncurses.supp
doc/newfont1.png
doc/newfont2.png
doc/progress-bar.png
doc/readme.txt
doc/coding-style.txt
@ -13,6 +38,20 @@ doc/terminfo-capabilities.sh
doc/terminfo-manual.sh
doc/textview.png
doc/TODO
doc/vt100_line_drawing_graphics.png
doc/user-theme-bee-palette.svg
doc/user-theme-fc16-dark-palette.svg
doc/user-theme-fc16-palette.svg
doc/user-theme-fc8-palette.svg
doc/user-theme.md
doc/user-theme.png
doc/user-theme-vga-palette.svg
doc/vga.txt
doc/virtual-terminal.txt
doc/vt100_line_drawing_graphics.png
doc/widget-coordinates.svg
doc/widget-geometry.svg
doc/widget-lengths.svg
doc/xgraphics
doc/xterm.txt
fonts/newfont.txt

View File

@ -1,4 +1,5 @@
examples/.libs/* usr/share/doc/libfinal-examples/examples
examples/*.cpp usr/share/doc/libfinal-examples/examples
examples/Makefile.clang usr/share/doc/libfinal-examples/examples
examples/Makefile.gcc usr/share/doc/libfinal-examples/examples
doc/readme.txt usr/lib/libfinal/examples
examples/.libs/* usr/lib/libfinal/examples
examples/*.cpp usr/lib/libfinal/examples
examples/Makefile.clang usr/lib/libfinal/examples
examples/Makefile.gcc usr/lib/libfinal/examples

View File

@ -1 +1,2 @@
usr/share/doc/libfinal-examples/examples/Makefile.gcc usr/share/doc/libfinal-examples/examples/Makefile
usr/lib/libfinal/examples usr/share/doc/libfinal-examples/examples
usr/lib/libfinal/examples/Makefile.gcc usr/lib/libfinal/examples/Makefile

5
debian/libfinal0.docs vendored Normal file
View File

@ -0,0 +1,5 @@
AUTHORS
COPYING
COPYING.LESSER
ChangeLog
doc/readme.txt

View File

@ -1,3 +1,2 @@
usr/lib/*/lib*.so
usr/lib/*/lib*.so.*

View File

@ -1 +1 @@
libfinal 0 libfinal0 (>= 0.5.0)
libfinal 0 libfinal0 (>= 0.7.2)

8450
debian/libfinal0.symbols vendored

File diff suppressed because it is too large Load Diff

2
debian/rules vendored
View File

@ -19,6 +19,8 @@ include /usr/share/dpkg/default.mk
# main packaging script based on dh7 syntax
%:
sed -i 's/doc\///g' README.md
test -f fonts/fonts.alias && cp fonts/fonts.alias fonts/xfonts-finalcut-newfont.alias || true
dh $@ --with autotools-dev
# debmake generated override targets

View File

@ -1,18 +1,43 @@
#----------------------------------------------------------------------
# Makefile.am - the Final Cut library
# Makefile.am - FINAL CUT library
#----------------------------------------------------------------------
docdir = ${datadir}/doc/${PACKAGE}
EXTRA_DIST = \
benchmark.md \
build_openbsd.txt \
build_solaris.txt \
calendar-draft.png \
calculator.png \
class-diagram.txt \
class_template.cpp \
class_template.h \
console_codes-manual.sh \
console_ioctl-manual.sh \
faq.md \
fileopen-dialog.png \
final-cut-application-structure.svg \
final-cut-widget-tree.svg \
first-steps.md \
first-steps_callback-function.cpp.png \
first-steps_callback-lambda.cpp.png \
first-steps_callback-method.cpp.png \
first-steps_dialog.cpp.png \
first-steps_emit-signal.cpp.png \
first-steps_memory.cpp.png \
first-steps_scrollview.cpp.png \
first-steps_size-adjustment.cpp.png \
first-steps_timer.cpp.png \
first-steps_user-event.cpp.png \
framebuffer.txt \
Mandelbrot.png \
mouse-control.md \
ncurses.supp \
newfont1.png \
newfont2.png \
newfont-8x16.txt \
newfont-9x16.txt \
progress-bar.png \
readme.txt \
coding-style.txt \
@ -20,19 +45,56 @@ EXTRA_DIST = \
terminfo-manual.sh \
textview.png \
TODO \
user-theme.md \
user-theme.png \
user-theme-bee-palette.svg \
user-theme-fc16-dark-palette.svg \
user-theme-fc16-palette.svg \
user-theme-fc8-palette.svg \
user-theme-vga-palette.svg \
vga.txt \
vt100_line_drawing_graphics.png \
virtual-terminal.txt \
widget-coordinates.svg \
widget-geometry.svg \
widget-lengths.svg \
xterm.txt \
xgraphics
doc_DATA = \
benchmark.md \
build_openbsd.txt \
build_solaris.txt \
calendar-draft.png \
calculator.png \
class-diagram.txt \
class_template.cpp \
class_template.h \
console_codes-manual.sh \
console_ioctl-manual.sh \
faq.md \
fileopen-dialog.png \
final-cut-application-structure.svg \
final-cut-widget-tree.svg \
first-steps.md \
first-steps_callback-function.cpp.png \
first-steps_callback-lambda.cpp.png \
first-steps_callback-method.cpp.png \
first-steps_dialog.cpp.png \
first-steps_emit-signal.cpp.png \
first-steps_memory.cpp.png \
first-steps_scrollview.cpp.png \
first-steps_size-adjustment.cpp.png \
first-steps_timer.cpp.png \
first-steps_user-event.cpp.png \
framebuffer.txt \
Mandelbrot.png \
mouse-control.md \
ncurses.supp \
newfont1.png \
newfont2.png \
newfont-8x16.txt \
newfont-9x16.txt \
progress-bar.png \
readme.txt \
coding-style.txt \
@ -40,6 +102,19 @@ doc_DATA = \
terminfo-manual.sh \
textview.png \
TODO \
user-theme.md \
user-theme.png \
user-theme-bee-palette.svg \
user-theme-fc16-dark-palette.svg \
user-theme-fc16-palette.svg \
user-theme-fc8-palette.svg \
user-theme-vga-palette.svg \
vga.txt \
vt100_line_drawing_graphics.png \
virtual-terminal.txt \
widget-coordinates.svg \
widget-geometry.svg \
widget-lengths.svg \
xterm.txt \
xgraphics

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

30
doc/benchmark.md Normal file
View File

@ -0,0 +1,30 @@
Benchmark
=========
The Rotozoomer example can perform a benchmark run with the parameter "-b" to determine the FINAL CUT character speed in the terminal.
[![rotozoomer-benchmark](https://asciinema.org/a/316531.svg)](https://asciinema.org/a/316531?size=medium&autoplay=1)
Speed tests
-----------
| Terminal | Size | Time | Loops | Frame rate |
|--------------------|-------|---------|-------|------------|
| XTerm | 80x24 | 2.693ms | 314 | 116.598fps |
| PuTTY | 80x24 | 2.711ms | 314 | 115.824fps |
| Mintty | 80x24 | 2.799ms | 314 | 112.182fps |
| Cygwin (cmd) | 80x24 | 2.99ms | 314 | 105.016fps |
| rxvt-cygwin-native | 80x24 | 2.836ms | 314 | 110.719fps |
| rxvt | 80x24 | 3.064ms | 314 | 102.480fps |
| rxvt-unicode | 80x24 | 2.853ms | 314 | 110.059fps |
| Tera Term | 80x24 | 3.154ms | 314 | 99.5561fps |
| Konsole | 80x24 | 2.727ms | 314 | 115.144fps |
| GNOME-Terminal | 80x24 | 2.683ms | 314 | 117.033fps |
| Linux console | 80x25 | 2.757ms | 314 | 113.891fps |
| FreeBSD console | 80x25 | 2.726ms | 314 | 115.187fps |
| NetBSD console | 80x25 | 2.747ms | 314 | 114.306fps |
| OpenBSD console | 80x25 | 2.751ms | 314 | 114.140fps |
| Solaris console | 80x34 | 3.072ms | 314 | 102.213fps |

24
doc/build_openbsd.txt Normal file
View File

@ -0,0 +1,24 @@
Build FINAL CUT with the clang c++ compiler
-------------------------------------------
openbsd# CXX=clang++ ./build.sh
Build FINAL CUT with eg++
-------------------------
openbsd# CXX=eg++ ./build.sh
Install egcc on OpenBSD
-----------------------
openbsd# pkg_add g++
quirks-3.124 signed on 2019-04-15T12:10:16Z
Ambiguous: choose package for g++
a 0: <None>
1: g++-4.9.4p18
2: g++-8.3.0
Your choice: 2
g++-8.3.0:gcc-libs-8.3.0: ok
g++-8.3.0:gmp-6.1.2p3: ok
g++-8.3.0:mpfr-3.1.5.2p0: ok
g++-8.3.0:libmpc-0.9p2: ok
g++-8.3.0:gcc-8.3.0: ok
g++-8.3.0: ok

12
doc/build_solaris.txt Normal file
View File

@ -0,0 +1,12 @@
Install gcc5g++ on Solaris
https://www.opencsw.org/packages/gcc5g++/
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i gcc5g++
/usr/sbin/pkgchk -L CSWgcc5g++ # list files
PATH=/opt/csw/bin:$PATH

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,76 +1,95 @@
══════════════════════════════════════════════════════════════════════════════
Class digramm
══════════════════════════════════════════════════════════════════════════════
1┌──────────────┐
1┌────────────┐
┌-----------┤ FTermLinux │
: └────────────┘
: 1┌──────────────┐
┌-----------┤ FTermFreeBSD │
: └──────────────┘
: 1┌──────────────┐ ┌───────────┐
┌-----------┤ FTermOpenBSD │ ┌────┤ FKeyEvent │
: └──────────────┘ │ └───────────┘
: 1┌──────────────┐
┌-----------┤ FTermOpenBSD │
: └──────────────┘
: 1┌────────────────┐ ┌───────────┐
┌-----------┤ FTermDetection │ ┌────┤ FKeyEvent │
: └────────────────┘ │ └───────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermDetection │ ├────┤ FMouseEvent │
┌-----------┤ FTermcapQuirks │ ├────┤ FMouseEvent │
: └────────────────┘ │ └─────────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermcapQuirks │ ├────┤ FWheelEvent │
: └────────────────┘ │ └─────────────┘
: 1┌────────────────┐ │ ┌─────────────┐
┌-----------┤ FTermXTerminal │ ├────┤ FFocusEvent │
┌-----------┤ FTermXTerminal │ ├────┤ FWheelEvent │
: └────────────────┘ │ └─────────────┘
: 1┌──────────┐ │ ┌─────────────┐
┌-----------┤ FTermcap │ ├────┤ FAccelEvent │
┌-----------┤ FTermcap │ ├────┤ FFocusEvent │
: └──────────┘ │ └─────────────┘
: 1┌──────────┐ │ ┌─────────────
┌-----------┤ FTermios │ ├────┤ FResizeEvent │
: └──────────┘ │ └─────────────
: 1┌───────────────┐ │ ┌────────────┐
┌-----------┤ FColorPalette │ ├────┤ FShowEvent │
: └───────────────┘ │ └────────────┘
: 1┌──────────┐ │ ┌─────────────┐
┌-----------┤ FTermios │ ├────┤ FAccelEvent │
: └──────────┘ │ └─────────────┘
: 1┌───────────────┐ │ ┌──────────────
┌-----------┤ FColorPalette │ ├────┤ FResizeEvent │
: └───────────────┘ │ └──────────────
: 1┌───────────┐ │ ┌────────────┐
┌-----------┤ FOptiMove │ ├────┤ FHideEvent │
┌-----------┤ FOptiMove │ ├────┤ FShowEvent │
: └───────────┘ │ └────────────┘
: 1┌───────────┐ │ ┌────────────┐
┌-----------┤ FOptiAttr │ ├────┤ FHideEvent │
: └───────────┘ │ └────────────┘
: 1┌───────────┐ │ ┌─────────────┐
┌-----------┤ FOptiAttr │ ├────┤ FCloseEvent │
┌-----------┤ FKeyboard │ ├────┤ FCloseEvent │
: └───────────┘ │ └─────────────┘
: 1┌───────────┐ │ ┌─────────────┐
┌-----------┤ FKeyboard │ ├────┤ FTimerEvent │
: └───────────┘ │ └─────────────┘
: 1┌───────────────┐ │
┌-----------┤ FMouseControl │ │ ┌──────────────┐
: └───────────────┘ │ ┌────┤ FApplication │
: *┌─────────┐ │ │ └──────────────┘
: ┌--------┤ FString │ │ │ ┌─────────┐
: : └─────────┘ │ ├────┤ FButton │
: : *┌────────┐ │ │ └─────────┘
: 1┌───────────────┐ │ ┌─────────────┐
┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │
: └───────────────┘ │ └─────────────┘
: 1┌─────────┐ │ ┌────────────┐1 1┌───────┐
┌-----------┤ FSystem │ ├────┤ FUserEvent ├------┤ FData │
: └─────────┘ │ └────────────┘ └───────┘
: *┌─────────┐ │ ┌──────┐ ┌─────────┐
: ┌--------┤ FString │ │ │ FLog │◄──┤ FLogger │
: : └─────────┘ │ └──┬───┘ └─────────┘
: : *┌───────────────┐ │ :1
: ┌--------┤ FStringStream │ │ ┌──┴───────────┐
: : └───────────────┘ │ ┌────┤ FApplication │
: : *┌────────┐ │ │ └──────────────┘
: ┌--------┤ FPoint │ │ │ ┌────────┐
: : └────────┘ │ ├────┤ FLabel │
: : *┌───────┐ │ │ └────────┘
: ┌--------┤ FRect │ │ │ ┌───────────┐
: : └───────┘ │ ├────┤ FLineEdit │
:1 :1 │ │ └───────────┘
┌─┴──┴──┐ │ │ ┌──────────────┐ ┌──────────────┐
│ FTerm │ │ ├────┤ FButtonGroup │ ┌──┤ FRadioButton │
└───┬───┘ ┌────────┐ │ │ └──────────────┘ │ └──────────────┘
:1 │ FEvent │◄─────┘ │ ┌───────────────┐ │ ┌───────────┐
┌───┴────┐ └────┬───┘ ├────┤ FToggleButton │◄─┼──┤ FCheckBox │
│ FVTerm │◄──┐ :1 │ └───────────────┘ │ └───────────┘
└────────┘ │ ┌────┴────┐ │ ┌──────────────┐ │ ┌─────────┐
├────┤ FWidget │◄───────┼────┤ FProgressbar │ └──┤ FSwitch │
┌─────────┐ │ └─────────┘ │ └──────────────┘ └─────────┘
│ FObject │◄──┘ │ ┌────────────┐
└─────────┘ ├────┤ FScrollbar │
: : *┌───────┐ │ │ └───────────┘
: ┌--------┤ FSize │ │ │ ┌──────────┐
: : └───────┘ │ ├────┤ FSpinBox │
:1 :1 │ │ └──────────┘
┌─┴──┴──┐ │ │ ┌─────────┐
│ FTerm │ │ ├────┤ FButton │
└───┬───┘ ┌────────┐ │ │ └─────────┘
:1 │ FEvent │◄─────┘ │ ┌──────────────┐ ┌──────────────┐
┌───┴────┐ └────┬───┘ ├────┤ FButtonGroup │ ┌──┤ FRadioButton │
│ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘
└────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐
├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │
┌─────────┐ │ └────┬────┘ │ └───────────────┘ │ └───────────┘
│ FObject │◄──┘ :1 │ ┌──────────────┐ │ ┌─────────┐
└─────────┘ ┌──────┴────────┐ ├────┤ FProgressbar │ └──┤ FSwitch │
│ FWidgetColors │ │ └──────────────┘ └─────────┘
└───────────────┘ │ ┌────────────┐
├────┤ FScrollbar │
│ └────────────┘
│ ┌───────────┐
├────┤ FTextView │
│ └───────────┘
│ ┌──────────┐1 *┌──────────────┐
├────┤ FListBox ├-------┤ FListBoxItem │
│ └──────────┘ └──────────────┘
┌─────────────┐1 │ 1┌───────────┐1 *┌───────────────┐
│ FTermBuffer ├----------------------├────┤ FListView ├------┤ FListViewItem │
└─────────────┘ │ └───────────┘ └───────────────┘
│ ┌─────────────┐
├────┤ FScrollView │
│ └─────────────┘
│ ┌───────────┐1 1┌──────────────────┐
├────┤ FComboBox ├------┤ FDropDownListBox │
│ └───────────┘ └──────────────────┘
┌─────────────┐1 │ ┌──────────┐1 *┌──────────────┐1
│ FTermBuffer ├----------------------├────┤ FListBox ├-------┤ FListBoxItem ├--┐
└─────────────┘ │ └──────────┘ └──────────────┘ :
│ 1┌───────────┐1 *┌───────────────┐ :
├────┤ FListView ├------┤ FListViewItem │ :
│ └───────────┘ └────────┬──────┘ :
│ ┌─────────────┐ :1 :
├────┤ FScrollView │ ┌───┴───┐1 :
│ └─────────────┘ │ FData ├----┘
│ └───────┘
│ ┌────────────┐1 *┌────────────┐
│ ┌──┤ FStatusBar ├-----┤ FStatusKey │
│ │ └────────────┘ └────────────┘
@ -81,9 +100,9 @@
└──┬──┬───┘ └─────────┘ │ ┌─────────────┐
▲ ▲ └──┤ FMessageBox │
│ │ └─────────────┘
│ │ ┌──────────┐
│ └──────┤ FToolTip │
│ └──────────┘
│ │ ┌──────────┐ ┌────────────────┐
│ └──────┤ FToolTip │◄─┤ FBusyIndicator │
│ └──────────┘ └────────────────┘
└───────────────┐ ┌──────────┐
│ ┌───┤ FMenuBar │
┌───────────┐ └──────┤ └──────────┘
@ -100,4 +119,3 @@
└──────────┘ │ ┌────────────────┐* :
└──┤ FRadioMenuItem ├---┘
└────────────────┘

View File

@ -1,17 +1,17 @@
/***********************************************************************
* fclassname.cpp - [brief description] *
* *
* This file is part of the Final Cut widget toolkit *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright [year] [Maintainer] *
* Copyright [year] [Maintainer] *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *

View File

@ -1,17 +1,17 @@
/***********************************************************************
* fclassname.h - [brief description] *
* *
* This file is part of the Final Cut widget toolkit *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright [year] [Maintainer] *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
@ -44,9 +44,6 @@ namespace finalcut
// class FClassName
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class FClassName
{
public:
@ -59,9 +56,15 @@ class FClassName
// Constructors
FClassName();
// Disable copy constructor
FClassName (const FClassName&) = delete;
// Destructor
~FClassName();
// Disable copy assignment operator (=)
FClassName& operator = (const FClassName&) = delete;
// Overloaded operators
// Accessors
@ -76,7 +79,7 @@ class FClassName
// Callback methods
// Data Members
// Data members
protected:
// Typedefs and Enumerations
@ -93,19 +96,13 @@ class FClassName
// Callback methods
// Data Members
// Data members
private:
// Typedefs and Enumerations
// Constants
// Disable copy constructor
FClassName (const FClassName&);
// Disable assignment operator (=)
FClassName& operator = (const FClassName&);
// Accessors
// Inquiries
@ -116,12 +113,11 @@ class FClassName
// Callback methods
// Data Members
// Data members
// Friend class
};
#pragma pack(pop)
// FClassName inline functions
//----------------------------------------------------------------------
@ -130,4 +126,3 @@ class FClassName
#endif // FCLASSNAME_H

View File

@ -7,9 +7,18 @@ Formatting
* A new line should begin after 72 (max. 80) characters
* Use 2 spaces indent. Do not use tabs!
* Leave a space after the keywords if, switch, while, do, for, and return
* Conditions are placed in parentheses with spaces -> if ( a > 5 )
* Use one blank line before and after a for, if, switch,
while, do..while code block
* In parameter lists, leave a space after each comma
* Starting curly brace "{" in a new line
Naming
------
* class name: UpperCamelCase
* Function: lowerCamelCase
* Callback function: cb_lowerCamelCase (beginning with "cb_" as prefix)
* Variable: lower_case_underscored
Class declaration order
-----------------------

View File

@ -6,7 +6,7 @@ Frequently Asked Questions
What is FINAL CUT?
------------------
The Final Cut is a [C++](https://en.wikipedia.org/wiki/C%2B%2B) class library
FINAL CUT is a [C++](https://en.wikipedia.org/wiki/C%2B%2B) class library
and a widget toolkit with full mouse support for creating a text-based user
interface. It's based on the Termcap library and has its own cursor
optimization and window management.
@ -85,6 +85,7 @@ You need three things:
* autoconf
* autoconf-archive
* libtool
* pkg-config
3. Development packages for following libraries:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,220 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="74.630997mm"
viewBox="0 0 101.5 74.630997"
width="101.5mm"
version="1.1"
id="svg61"
sodipodi:docname="final-cut-application-structure.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview35"
showgrid="false"
inkscape:zoom="2.8893731"
inkscape:cx="331.13905"
inkscape:cy="54.29145"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="g23" />
<metadata
id="metadata67">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs65" />
<linearGradient
id="a"
gradientUnits="userSpaceOnUse"
x1="33.698196"
x2="34.111275"
y1="296.49637"
y2="222.78156">
<stop
offset="0"
stop-color="#dbdbdc"
id="stop2"
style="stop-color:#e8a7a7;stop-opacity:1" />
<stop
offset="1"
stop-color="#fff"
id="stop4" />
</linearGradient>
<g
transform="translate(0,-222.36897)"
id="g59">
<g
id="g23"
style="stroke:#000000;fill:none"
transform="translate(-0.00447221)">
<rect
height="74.20752"
ry="2.5604739"
stroke-miterlimit="1.5"
width="65.967117"
x="0.2115"
y="222.58098"
id="rect7"
style="fill:#f6f8fa;fill-opacity:1;stroke-width:0.42300001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5" />
<path
d="M 7.8726193,233.11525 H 66.187848"
id="path9"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001;stroke-linecap:square;stroke-linejoin:bevel" />
<path
d="M 7.8726193,243.73006 H 66.187848"
id="path11"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001" />
<path
d="M 7.8726193,254.34488 H 66.187848"
id="path13"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001" />
<path
d="M 7.8726193,264.95969 H 66.187848"
id="path15"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001" />
<path
d="M 0.19656226,275.5745 H 66.187852"
id="path17"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001" />
<path
d="M 0.19656226,286.18931 H 66.187852"
id="path19"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001" />
<path
d="M 7.9427453,275.5745 V 233.11525"
id="path21"
inkscape:connector-curvature="0"
style="fill:none;stroke-width:0.42300001;stroke-linecap:square;stroke-linejoin:bevel" />
</g>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;stroke-width:0.26458299;stroke-opacity:0"
x="33.420082"
y="229.02936"
id="text27">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.26458299;stroke-opacity:0"
x="33.420082"
y="229.02936"
id="tspan25">Application</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#052867;fill-opacity:1;stroke-width:0.42300001;stroke-opacity:0"
x="33.219879"
y="282.35825"
id="text31">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill:#052867;fill-opacity:1;stroke-width:0.42300001;stroke-opacity:0"
x="33.219879"
y="282.35825"
id="tspan29">Standard C/C++ Library</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#052867;fill-opacity:1;stroke-width:0.42300001;stroke-opacity:0"
x="33.220379"
y="293.15323"
id="text35">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill:#052867;fill-opacity:1;stroke-width:0.42300001;stroke-opacity:0"
x="33.220379"
y="293.15323"
id="tspan33">Operating System</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#083c99;stroke-width:0.42300001;stroke-opacity:0"
x="37.113426"
y="240.10773"
id="text39">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill:#083c99;stroke-width:0.42300001;stroke-opacity:0"
x="37.113426"
y="240.10773"
id="tspan37">Widgets</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#083c99;stroke-width:0.42300001;stroke-opacity:0"
x="37.113487"
y="250.53276"
id="text43">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill:#083c99;stroke-width:0.42300001;stroke-opacity:0"
x="37.113487"
y="250.53276"
id="tspan41">Virtual Terminal</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;stroke-width:0.42300001;stroke-opacity:0"
x="37.113487"
y="261.55215"
id="text47">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.42300001;stroke-opacity:0"
x="37.113487"
y="261.55215"
id="tspan45">Termcap</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill-opacity:0.99858398;stroke-width:0.42300001;stroke-opacity:0"
x="37.11351"
y="271.62482"
id="text51">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill-opacity:0.99858398;stroke-width:0.42300001;stroke-opacity:0"
x="37.11351"
y="271.62482"
id="tspan49">Terminal</tspan>
</text>
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#083c99;stroke-width:0.26458299;stroke-opacity:0"
x="86.416771"
y="245.48337"
id="text55">
<tspan
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;fill:#083c99;stroke-width:0.26458299;stroke-opacity:0"
x="86.416771"
y="245.48337"
id="tspan53">FINAL CUT</tspan>
</text>
<g
aria-label="}"
transform="scale(0.99731046,1.0026968)"
style="font-style:normal;font-variant:normal;font-weight:200;font-stretch:condensed;font-size:22.67463493px;line-height:125%;font-family:'Fira Sans Condensed';-inkscape-font-specification:'Fira Sans Condensed, Ultra-Light Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458329px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text4545">
<path
d="m 68.105817,232.32133 v 0.56687 c 1.22443,0 1.655248,0.61222 1.655248,1.90467 v 6.21285 c 0,1.4285 0.476168,1.83665 1.496526,2.06339 -1.020358,0.22675 -1.496526,0.63489 -1.496526,2.06339 v 6.21285 c 0,1.29246 -0.430818,1.90467 -1.655248,1.90467 v 0.56687 c 1.473851,0 2.312813,-0.74826 2.312813,-2.47154 v -6.30355 c 0,-1.20175 0.521516,-1.60989 1.541875,-1.60989 v -0.72559 c -1.020359,0 -1.541875,-0.40815 -1.541875,-1.6099 v -6.30355 c 0,-1.72327 -0.838962,-2.47154 -2.312813,-2.47154 z"
style="font-style:normal;font-variant:normal;font-weight:200;font-stretch:condensed;font-size:22.67463493px;font-family:'Fira Sans Condensed';-inkscape-font-specification:'Fira Sans Condensed, Ultra-Light Condensed';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458329px"
id="path4547"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,324 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
height="65.484894mm"
viewBox="0 0 149.86537 65.484895"
width="149.86537mm"
version="1.1"
id="svg109">
<metadata
id="metadata115">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs113" />
<marker
id="a"
orient="auto"
overflow="visible"
refX="0"
refY="0">
<path
d="m0 0 5-5-17.5 5 17.5 5z"
fill-rule="evenodd"
stroke="#000"
stroke-width="1pt"
transform="matrix(-.4 0 0 -.4 -4 0)"
id="path2" />
</marker>
<marker
id="b"
orient="auto"
overflow="visible"
refX="0"
refY="0">
<path
d="m0 0 5-5-17.5 5 17.5 5z"
fill-rule="evenodd"
stroke="#000"
stroke-width="1pt"
transform="matrix(-.4 0 0 -.4 -4 0)"
id="path5" />
</marker>
<marker
id="c"
orient="auto"
overflow="visible"
refX="0"
refY="0">
<path
d="m0 0 5-5-17.5 5 17.5 5z"
fill-rule="evenodd"
stroke="#000"
stroke-width="1pt"
transform="matrix(-.4 0 0 -.4 -4 0)"
id="path8" />
</marker>
<marker
id="d"
orient="auto"
overflow="visible"
refX="0"
refY="0">
<path
d="m0 0 5-5-17.5 5 17.5 5z"
fill-rule="evenodd"
stroke="#000"
stroke-width="1pt"
transform="matrix(-.4 0 0 -.4 -4 0)"
id="path11" />
</marker>
<marker
id="e"
orient="auto"
overflow="visible"
refX="0"
refY="0">
<path
d="m0 0 5-5-17.5 5 17.5 5z"
fill-rule="evenodd"
stroke="#000"
stroke-width="1pt"
transform="matrix(-.4 0 0 -.4 -4 0)"
id="path14" />
</marker>
<g
style="stroke-width:1.20796704"
id="g57">
<g
transform="matrix(0.82806766,0,0,0.82760652,18.811674,-210.24741)"
id="g23">
<path
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.51105303;stroke-linecap:round;stroke-linejoin:round"
d="m 7.868146,254.29825 h 57.783382 v 10.66144 H 7.868146 Z"
id="path17" />
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
x="37.113487"
y="261.55215"
id="text21">
<tspan
style="stroke-width:0.51097"
x="37.113487"
y="261.55215"
id="tspan19">FApplication</tspan>
</text>
</g>
<g
transform="matrix(0.82806766,0,0,0.82760652,25.151866,-0.203308)"
id="g31">
<path
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.51105303;stroke-linecap:round;stroke-linejoin:round"
d="M 15.875,19.022009 H 42.333334 V 29.683451 H 15.875 Z"
id="path25" />
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
x="29.24534"
y="26.275915"
id="text29">
<tspan
style="stroke-width:0.51097"
x="29.24534"
y="26.275915"
id="tspan27">FDialog</tspan>
</text>
</g>
<g
transform="matrix(0.82806766,0,0,0.82760652,38.120716,15.124655)"
id="g39">
<path
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.51105303;stroke-linecap:round;stroke-linejoin:round"
d="M 15.875,19.022009 H 42.333334 V 29.683451 H 15.875 Z"
id="path33" />
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
x="29.24534"
y="26.275915"
id="text37">
<tspan
style="stroke-width:0.51097"
x="29.24534"
y="26.275915"
id="tspan35">FDialog</tspan>
</text>
</g>
<g
transform="matrix(0.82806766,0,0,0.82760652,12.006292,15.124655)"
id="g47">
<path
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.51105303;stroke-linecap:round;stroke-linejoin:round"
d="M 15.875,19.022009 H 42.333334 V 29.683451 H 15.875 Z"
id="path41" />
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
x="29.24534"
y="26.275915"
id="text45">
<tspan
style="stroke-width:0.51097"
x="29.24534"
y="26.275915"
id="tspan43">FLabel</tspan>
</text>
</g>
<g
transform="matrix(0.82806766,0,0,0.82760652,25.151866,-0.203308)"
id="g55">
<path
style="fill:#f9f9f9;stroke:#000000;stroke-width:0.51105303;stroke-linecap:round;stroke-linejoin:round"
d="M 31.75,56.063679 H 58.208334 V 66.725121 H 31.75 Z"
id="path49" />
<text
style="font-weight:bold;font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
x="45.120338"
y="63.317585"
id="text53">
<tspan
style="stroke-width:0.51097"
x="45.120338"
y="63.317585"
id="tspan51">FListBox</tspan>
</text>
</g>
</g>
<text
style="font-style:italic;font-weight:bold;font-size:4.08859491px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.42300001;stroke-opacity:0"
transform="scale(1.0002786,0.99972148)"
x="62.287796"
y="65.409096"
id="text61">
<tspan
x="62.287796"
y="65.409096"
id="tspan59">etc.</tspan>
</text>
<path
d="m49.251306 9.2100164v5.7870836"
fill="none"
marker-end="url(#a)"
stroke="#000"
stroke-width=".423069"
id="path63" />
<path
d="m42.679299 24.537976v5.779196"
fill="none"
marker-end="url(#b)"
stroke="#000"
stroke-width=".423069"
id="path65" />
<path
d="m55.736511 24.537898v5.779196"
fill="none"
marker-end="url(#c)"
stroke="#000"
stroke-width=".423069"
id="path67" />
<path
d="m62.369882 39.865938v5.548839"
fill="none"
marker-end="url(#d)"
stroke="#000"
stroke-width=".423069"
id="path69" />
<path
d="m62.369882 55.193909v5.548839"
fill="none"
marker-end="url(#e)"
stroke="#000"
stroke-width=".423069"
id="path71" />
<g
style="font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
transform="matrix(0.82806766,0,0,0.82760652,25.151866,-0.203308)"
id="g89">
<text
x="-23.01368"
y="8.7182531"
id="text75">
<tspan
x="-23.01368"
y="8.7182531"
id="tspan73">Parent:</tspan>
</text>
<text
x="-24.412582"
y="27.239086"
id="text79">
<tspan
x="-24.412582"
y="27.239086"
id="tspan77">Child:</tspan>
</text>
<text
x="-20.59841"
y="44.796837"
id="text83">
<tspan
x="-20.59841"
y="44.796837"
id="tspan81">Subchild:</tspan>
</text>
<text
x="-15.852447"
y="63.317669"
id="text87">
<tspan
x="-15.852447"
y="63.317669"
id="tspan85">Sub-subchild:</tspan>
</text>
</g>
<g
style="font-size:4.93888903px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;letter-spacing:0;word-spacing:0;text-anchor:middle;fill:#1a1a1a;stroke-width:0.51097;stroke-opacity:0"
transform="matrix(0.82806766,0,0,0.82760652,107.7173,-0.203308)"
id="g107">
<text
x="-5.0208001"
y="8.7182531"
id="text93">
<tspan
x="-5.0208001"
y="8.7182531"
id="tspan91">Application widget (= 1)</tspan>
</text>
<text
x="-12.021867"
y="27.239086"
id="text97">
<tspan
x="-12.021868"
y="27.239086"
id="tspan95">Main widget (= 1)</tspan>
</text>
<text
x="5.9180651"
y="44.796837"
id="text101">
<tspan
x="5.918066"
y="44.796837"
id="tspan99">Widget(s) of the main widget (≥ 0)</tspan>
</text>
<text
x="10.413227"
y="63.317669"
id="text105">
<tspan
x="10.413226"
y="63.317669"
id="tspan103">Widget(s) from the parent widget (≥ 0)</tspan>
</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 863 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

View File

@ -1,7 +1,7 @@
Framebuffer
===========
The Final Cut determines the used number of bits per pixel (bpp)
FINAL CUT determines the used number of bits per pixel (bpp)
for Linux framebuffer console to determine whether 16 (or more)
different background colors can be displayed. Therefore your user
needs read-access to the framebuffer device (/dev/fb0 or /dev/fb/0).

29
doc/mouse-control.md Normal file
View File

@ -0,0 +1,29 @@
Title bar actions on mouse clicks
=================================
The FINAL CUT title bar of dialog windows has different behaviors on mouse clicks.
Clicking on the title bar
-------------------------
* A left-click activates and raises the window. After that, you can drag the window with the mouse.
* A middle-click activates and lower the window.
* A right-click activates the window and keeps its current position in the window stack.
* A double-click maximizes or restores the window size for a resizable dialog.
Clicking the title bar buttons
------------------------------
* Single-clicking on the title bar menu button opens the title bar menu.
* Double-clicking on the title bar menu button closes the dialog.
* Single-clicking on the zoom button maximizes the window size.
* Single-clicking on the unzoom button restores the window size.
Dialog resize corner
--------------------
If you click and drag the left mouse button in the lower right corner of the window, you can change the size of a resizable dialog.

1519
doc/newfont-8x16.txt Normal file

File diff suppressed because it is too large Load Diff

1558
doc/newfont-9x16.txt Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 788 B

After

Width:  |  Height:  |  Size: 843 B

View File

@ -1,8 +1,8 @@
----------------------------------------------------------------------
The Final Cut
FINAL CUT
----------------------------------------------------------------------
The Final Cut is a C++ class library and widget toolkit with full mouse
The FINAL CUT is a C++ class library and widget toolkit with full mouse
support for creating a text-based user interface. The library supports
the programmer to develop an application for the text console. It allows
the simultaneous handling of multiple text windows on the screen.
@ -12,3 +12,50 @@ the C++ class design of FINAL CUT. It provides common controls like
dialog boxes, push buttons, check boxes, radio buttons, input lines,
list boxes, status bars and so on.
Installation
------------
> git clone git://github.com/gansm/finalcut.git
> cd finalcut
> autoreconf --install --force
> ./configure --prefix=/usr
> make
> su -c "make install"
Supported platforms
-------------------
* Linux
* FreeBSD
* NetBSD
* OpenBSD
* macOS
* Cygwin
* Solaris
First steps
-----------
See the first-steps.md documentation for information on how to use
the library.
License
-------
GNU Lesser General Public License Version 3
Frequently Asked Questions
--------------------------
For general questions about FINAL CUT, likely the answer is already included in the faq.md.
Download
--------
You can find the latest version at https://github.com/gansm/finalcut
Please send bug reports to
--------------------------
https://github.com/gansm/finalcut/issues

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,330 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="43.074867"
viewBox="0 0 509.50272 43.074862"
width="509.50272"
version="1.1"
id="user-theme-own-palette"
sodipodi:docname="user-theme-own-palette.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview21"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.3138663"
inkscape:cx="31.395854"
inkscape:cy="8.1120765"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="user-theme-own-palette"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-bbox="true" />
<metadata
id="metadata">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs53" />
<rect
id="Black"
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="0.25" />
<rect
id="Blue"
style="fill:#23212c;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="32.380764" />
<rect
id="Green"
style="fill:#26937c;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="64.511536" />
<rect
id="Cyan"
style="fill:#cfb3a8;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="96.642288" />
<rect
id="Red"
style="fill:#ba1a1a;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="128.77304" />
<rect
id="Magenta"
style="fill:#b218b2;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="160.90382" />
<rect
id="Brown"
style="fill:#e8871f;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="193.03458" />
<rect
id="LightGray"
style="fill:#fffbe4;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="225.16534" />
<rect
id="DarkGray"
style="fill:#3a3637;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="257.29608" />
<rect
id="LightBlue"
style="fill:#a5a5b1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="289.42688" />
<rect
id="LightGreen"
style="fill:#5eeb5c;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="321.55765" />
<rect
id="LightCyan"
style="fill:#62bff8;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="353.68842" />
<rect
id="LightRed"
style="fill:#ee4444;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="385.81915" />
<rect
id="LightMagenta"
style="fill:#e9adff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="417.94992" />
<rect
id="Yellow"
style="fill:#f8efa6;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="450.08069" />
<rect
id="White"
style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="482.21146" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="13.822153"
y="42.771538"
id="0"><tspan
sodipodi:role="line"
id="tspan4501"
x="13.822153"
y="42.771538">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="46.455204"
y="42.852036"
id="1"><tspan
sodipodi:role="line"
id="tspan4633"
x="46.455204"
y="42.852036">1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="78.20282"
y="42.852036"
id="2"><tspan
sodipodi:role="line"
id="tspan4635"
x="78.20282"
y="42.852036">2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="110.20156"
y="42.771538"
id="3"><tspan
sodipodi:role="line"
id="tspan4637"
x="110.20156"
y="42.771538">3</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="142.32588"
y="42.852036"
id="4"><tspan
sodipodi:role="line"
id="tspan4639"
x="142.32588"
y="42.852036">4</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="174.3343"
y="42.687824"
id="5"><tspan
sodipodi:role="line"
id="tspan4641"
x="174.3343"
y="42.687824">5</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="206.51335"
y="42.771538"
id="6"><tspan
sodipodi:role="line"
id="tspan4643"
x="206.51335"
y="42.771538">6</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="238.70207"
y="42.768318"
id="7"><tspan
sodipodi:role="line"
id="tspan4645"
x="238.70207"
y="42.768318">7</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="270.84891"
y="42.768318"
id="8"><tspan
sodipodi:role="line"
id="tspan4647"
x="270.84891"
y="42.768318">8</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="303.04733"
y="42.768318"
id="9"><tspan
sodipodi:role="line"
id="tspan4649"
x="303.04733"
y="42.768318">9</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="334.8851"
y="42.771538"
id="10"><tspan
sodipodi:role="line"
id="tspan4651"
x="334.8851"
y="42.771538">10</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="367.76285"
y="42.852036"
id="11"><tspan
sodipodi:role="line"
id="tspan4653"
x="367.76285"
y="42.852036">11</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="399.15305"
y="42.852036"
id="12"><tspan
sodipodi:role="line"
id="tspan4663"
x="399.15305"
y="42.852036">12</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="431.2355"
y="42.771538"
id="13"><tspan
sodipodi:role="line"
id="tspan4665"
x="431.2355"
y="42.771538">13</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="463.23425"
y="42.852036"
id="14"><tspan
sodipodi:role="line"
id="tspan4667"
x="463.23425"
y="42.852036">14</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="495.41333"
y="42.771538"
id="15"><tspan
sodipodi:role="line"
id="tspan4669"
x="495.41333"
y="42.771538">15</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,330 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="43.074867"
viewBox="0 0 509.50272 43.074862"
width="509.50272"
version="1.1"
id="user-theme-own-palette"
sodipodi:docname="user-theme-own-palette.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview21"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.3138663"
inkscape:cx="31.395854"
inkscape:cy="8.1120765"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="user-theme-own-palette"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-bbox="true" />
<metadata
id="metadata">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs53" />
<rect
id="Black"
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="0.25" />
<rect
id="Blue"
style="fill:#4158b3;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="32.380764" />
<rect
id="Green"
style="fill:#187818;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="64.511536" />
<rect
id="Cyan"
style="fill:#4e6672;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="96.642288" />
<rect
id="Red"
style="fill:#a54040;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="128.77304" />
<rect
id="Magenta"
style="fill:#b218b2;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="160.90382" />
<rect
id="Brown"
style="fill:#e8871f;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="193.03458" />
<rect
id="LightGray"
style="fill:#dcdcdc;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="225.16534" />
<rect
id="DarkGray"
style="fill:#273339;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="257.29608" />
<rect
id="LightBlue"
style="fill:#b0b0b8;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="289.42688" />
<rect
id="LightGreen"
style="fill:#5eeb5c;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="321.55765" />
<rect
id="LightCyan"
style="fill:#62bff8;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="353.68842" />
<rect
id="LightRed"
style="fill:#dd5145;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="385.81915" />
<rect
id="LightMagenta"
style="fill:#e9adff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="417.94992" />
<rect
id="Yellow"
style="fill:#fbe867;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="450.08069" />
<rect
id="White"
style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="482.21146" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="13.822153"
y="42.771538"
id="0"><tspan
sodipodi:role="line"
id="tspan4501"
x="13.822153"
y="42.771538">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="46.455204"
y="42.852036"
id="1"><tspan
sodipodi:role="line"
id="tspan4633"
x="46.455204"
y="42.852036">1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="78.20282"
y="42.852036"
id="2"><tspan
sodipodi:role="line"
id="tspan4635"
x="78.20282"
y="42.852036">2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="110.20156"
y="42.771538"
id="3"><tspan
sodipodi:role="line"
id="tspan4637"
x="110.20156"
y="42.771538">3</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="142.32588"
y="42.852036"
id="4"><tspan
sodipodi:role="line"
id="tspan4639"
x="142.32588"
y="42.852036">4</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="174.3343"
y="42.687824"
id="5"><tspan
sodipodi:role="line"
id="tspan4641"
x="174.3343"
y="42.687824">5</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="206.51335"
y="42.771538"
id="6"><tspan
sodipodi:role="line"
id="tspan4643"
x="206.51335"
y="42.771538">6</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="238.70207"
y="42.768318"
id="7"><tspan
sodipodi:role="line"
id="tspan4645"
x="238.70207"
y="42.768318">7</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="270.84891"
y="42.768318"
id="8"><tspan
sodipodi:role="line"
id="tspan4647"
x="270.84891"
y="42.768318">8</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="303.04733"
y="42.768318"
id="9"><tspan
sodipodi:role="line"
id="tspan4649"
x="303.04733"
y="42.768318">9</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="334.8851"
y="42.771538"
id="10"><tspan
sodipodi:role="line"
id="tspan4651"
x="334.8851"
y="42.771538">10</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="367.76285"
y="42.852036"
id="11"><tspan
sodipodi:role="line"
id="tspan4653"
x="367.76285"
y="42.852036">11</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="399.15305"
y="42.852036"
id="12"><tspan
sodipodi:role="line"
id="tspan4663"
x="399.15305"
y="42.852036">12</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="431.2355"
y="42.771538"
id="13"><tspan
sodipodi:role="line"
id="tspan4665"
x="431.2355"
y="42.771538">13</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="463.23425"
y="42.852036"
id="14"><tspan
sodipodi:role="line"
id="tspan4667"
x="463.23425"
y="42.852036">14</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="495.41333"
y="42.771538"
id="15"><tspan
sodipodi:role="line"
id="tspan4669"
x="495.41333"
y="42.771538">15</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,330 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="43.074867"
viewBox="0 0 509.50272 43.074862"
width="509.50272"
version="1.1"
id="user-theme-own-palette"
sodipodi:docname="user-theme-own-palette.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview21"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.3138663"
inkscape:cx="31.395854"
inkscape:cy="8.1120765"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="user-theme-own-palette"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-bbox="true" />
<metadata
id="metadata">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs53" />
<rect
id="Black"
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="0.25" />
<rect
id="Blue"
style="fill:#103b9e;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="32.380764" />
<rect
id="Green"
style="fill:#187818;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="64.511536" />
<rect
id="Cyan"
style="fill:#556acf;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="96.642288" />
<rect
id="Red"
style="fill:#ba1a1a;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="128.77304" />
<rect
id="Magenta"
style="fill:#b218b2;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="160.90382" />
<rect
id="Brown"
style="fill:#e8871f;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="193.03458" />
<rect
id="LightGray"
style="fill:#bcbcbc;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="225.16534" />
<rect
id="DarkGray"
style="fill:#505050;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="257.29608" />
<rect
id="LightBlue"
style="fill:#80a4ec;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="289.42688" />
<rect
id="LightGreen"
style="fill:#5eeb5c;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="321.55765" />
<rect
id="LightCyan"
style="fill:#62bff8;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="353.68842" />
<rect
id="LightRed"
style="fill:#ee4444;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="385.81915" />
<rect
id="LightMagenta"
style="fill:#e9adff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="417.94992" />
<rect
id="Yellow"
style="fill:#fbe867;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="450.08069" />
<rect
id="White"
style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="482.21146" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="13.822153"
y="42.771538"
id="0"><tspan
sodipodi:role="line"
id="tspan4501"
x="13.822153"
y="42.771538">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="46.455204"
y="42.852036"
id="1"><tspan
sodipodi:role="line"
id="tspan4633"
x="46.455204"
y="42.852036">1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="78.20282"
y="42.852036"
id="2"><tspan
sodipodi:role="line"
id="tspan4635"
x="78.20282"
y="42.852036">2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="110.20156"
y="42.771538"
id="3"><tspan
sodipodi:role="line"
id="tspan4637"
x="110.20156"
y="42.771538">3</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="142.32588"
y="42.852036"
id="4"><tspan
sodipodi:role="line"
id="tspan4639"
x="142.32588"
y="42.852036">4</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="174.3343"
y="42.687824"
id="5"><tspan
sodipodi:role="line"
id="tspan4641"
x="174.3343"
y="42.687824">5</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="206.51335"
y="42.771538"
id="6"><tspan
sodipodi:role="line"
id="tspan4643"
x="206.51335"
y="42.771538">6</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="238.70207"
y="42.768318"
id="7"><tspan
sodipodi:role="line"
id="tspan4645"
x="238.70207"
y="42.768318">7</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="270.84891"
y="42.768318"
id="8"><tspan
sodipodi:role="line"
id="tspan4647"
x="270.84891"
y="42.768318">8</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="303.04733"
y="42.768318"
id="9"><tspan
sodipodi:role="line"
id="tspan4649"
x="303.04733"
y="42.768318">9</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="334.8851"
y="42.771538"
id="10"><tspan
sodipodi:role="line"
id="tspan4651"
x="334.8851"
y="42.771538">10</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="367.76285"
y="42.852036"
id="11"><tspan
sodipodi:role="line"
id="tspan4653"
x="367.76285"
y="42.852036">11</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="399.15305"
y="42.852036"
id="12"><tspan
sodipodi:role="line"
id="tspan4663"
x="399.15305"
y="42.852036">12</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="431.2355"
y="42.771538"
id="13"><tspan
sodipodi:role="line"
id="tspan4665"
x="431.2355"
y="42.771538">13</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="463.23425"
y="42.852036"
id="14"><tspan
sodipodi:role="line"
id="tspan4667"
x="463.23425"
y="42.852036">14</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="495.41333"
y="42.771538"
id="15"><tspan
sodipodi:role="line"
id="tspan4669"
x="495.41333"
y="42.771538">15</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="43.074867"
viewBox="0 0 252.45662 43.074862"
width="252.45662"
version="1.1"
id="user-theme-own-palette"
sodipodi:docname="user-theme-fc8-palette.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview21"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="10.738479"
inkscape:cx="126.22831"
inkscape:cy="21.537433"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="user-theme-own-palette"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-bbox="true" />
<metadata
id="metadata">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs53" />
<rect
id="Black"
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="0.25" />
<rect
id="Blue"
style="fill:#103b9e;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="32.380764" />
<rect
id="Green"
style="fill:#187818;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="64.511536" />
<rect
id="Cyan"
style="fill:#a0b2b2;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="96.642288" />
<rect
id="Red"
style="fill:#b21818;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="128.77304" />
<rect
id="Magenta"
style="fill:#b218b2;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="160.90382" />
<rect
id="Brown"
style="fill:#e8871f;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="193.03458" />
<rect
id="LightGray"
style="fill:#e0e0e0;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="225.16534" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="13.822153"
y="42.771538"
id="0"><tspan
sodipodi:role="line"
id="tspan4501"
x="13.822153"
y="42.771538">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="46.455204"
y="42.852036"
id="1"><tspan
sodipodi:role="line"
id="tspan4633"
x="46.455204"
y="42.852036">1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="78.20282"
y="42.852036"
id="2"><tspan
sodipodi:role="line"
id="tspan4635"
x="78.20282"
y="42.852036">2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="110.20156"
y="42.771538"
id="3"><tspan
sodipodi:role="line"
id="tspan4637"
x="110.20156"
y="42.771538">3</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="142.32588"
y="42.852036"
id="4"><tspan
sodipodi:role="line"
id="tspan4639"
x="142.32588"
y="42.852036">4</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="174.3343"
y="42.687824"
id="5"><tspan
sodipodi:role="line"
id="tspan4641"
x="174.3343"
y="42.687824">5</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="206.51335"
y="42.771538"
id="6"><tspan
sodipodi:role="line"
id="tspan4643"
x="206.51335"
y="42.771538">6</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="238.70207"
y="42.768318"
id="7"><tspan
sodipodi:role="line"
id="tspan4645"
x="238.70207"
y="42.768318">7</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,330 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="43.074867"
viewBox="0 0 509.50272 43.074862"
width="509.50272"
version="1.1"
id="user-theme-vga-palette"
sodipodi:docname="user-theme-vga-palette.svg"
inkscape:version="0.92.1 r15371">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="1984"
id="namedview21"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.3138663"
inkscape:cx="31.395854"
inkscape:cy="8.1120765"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1"
inkscape:current-layer="user-theme-vga-palette"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-bbox="true" />
<metadata
id="metadata">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs53" />
<rect
id="Black"
style="fill:#000000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="0.25" />
<rect
id="Blue"
style="fill:#0000aa;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="32.380764" />
<rect
id="Green"
style="fill:#00aa00;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="64.511536" />
<rect
id="Cyan"
style="fill:#00aaaa;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="96.642288" />
<rect
id="Red"
style="fill:#aa0000;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="128.77304" />
<rect
id="Magenta"
style="fill:#aa00aa;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="160.90382" />
<rect
id="Brown"
style="fill:#aa5500;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="193.03458" />
<rect
id="LightGray"
style="fill:#aaaaaa;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="225.16534" />
<rect
id="DarkGray"
style="fill:#555555;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="257.29608" />
<rect
id="LightBlue"
style="fill:#5555ff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="289.42688" />
<rect
id="LightGreen"
style="fill:#55ff55;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="321.55765" />
<rect
id="LightCyan"
style="fill:#55ffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="353.68842" />
<rect
id="LightRed"
style="fill:#ff5555;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="385.81915" />
<rect
id="LightMagenta"
style="fill:#ff55ff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="417.94992" />
<rect
id="Yellow"
style="fill:#ffff55;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="450.08069" />
<rect
id="White"
style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
height="27.725"
width="27.041273"
y="0.25"
x="482.21146" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="13.822153"
y="42.771538"
id="0"><tspan
sodipodi:role="line"
id="tspan4501"
x="13.822153"
y="42.771538">0</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="46.455204"
y="42.852036"
id="1"><tspan
sodipodi:role="line"
id="tspan4633"
x="46.455204"
y="42.852036">1</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="78.20282"
y="42.852036"
id="2"><tspan
sodipodi:role="line"
id="tspan4635"
x="78.20282"
y="42.852036">2</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="110.20156"
y="42.771538"
id="3"><tspan
sodipodi:role="line"
id="tspan4637"
x="110.20156"
y="42.771538">3</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="142.32588"
y="42.852036"
id="4"><tspan
sodipodi:role="line"
id="tspan4639"
x="142.32588"
y="42.852036">4</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="174.3343"
y="42.687824"
id="5"><tspan
sodipodi:role="line"
id="tspan4641"
x="174.3343"
y="42.687824">5</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="206.51335"
y="42.771538"
id="6"><tspan
sodipodi:role="line"
id="tspan4643"
x="206.51335"
y="42.771538">6</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="238.70207"
y="42.768318"
id="7"><tspan
sodipodi:role="line"
id="tspan4645"
x="238.70207"
y="42.768318">7</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="270.84891"
y="42.768318"
id="8"><tspan
sodipodi:role="line"
id="tspan4647"
x="270.84891"
y="42.768318">8</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="303.04733"
y="42.768318"
id="9"><tspan
sodipodi:role="line"
id="tspan4649"
x="303.04733"
y="42.768318">9</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="334.8851"
y="42.771538"
id="10"><tspan
sodipodi:role="line"
id="tspan4651"
x="334.8851"
y="42.771538">10</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="367.76285"
y="42.852036"
id="11"><tspan
sodipodi:role="line"
id="tspan4653"
x="367.76285"
y="42.852036">11</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="399.15305"
y="42.852036"
id="12"><tspan
sodipodi:role="line"
id="tspan4663"
x="399.15305"
y="42.852036">12</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="431.2355"
y="42.771538"
id="13"><tspan
sodipodi:role="line"
id="tspan4665"
x="431.2355"
y="42.771538">13</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="463.23425"
y="42.852036"
id="14"><tspan
sodipodi:role="line"
id="tspan4667"
x="463.23425"
y="42.852036">14</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:13.18826675px;line-height:125%;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1"
x="495.41333"
y="42.771538"
id="15"><tspan
sodipodi:role="line"
id="tspan4669"
x="495.41333"
y="42.771538">15</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

448
doc/user-theme.md Normal file
View File

@ -0,0 +1,448 @@
User Themes
===========
FINAL CUT supports color themes. That makes it possible to change the color
of all elements of a widget in the program. Also, you can adjust the color
palette to your preferences. If you want to switch back to the default
themes, you can always call the method `FApplication::setDefaultTheme()`
or `FApplication::setDarkTheme()` for the dark theme.
Widget Color Theme
------------------
FINAL CUT uses a default color scheme that the user can override in a
derived class of `FWidgetColors`. All widget colors are redefined in the
constructor by the method `setColorTheme()`.
```cpp
class myWidgetColors final : public finalcut::FWidgetColors
{
public:
myWidgetColors()
{
myWidgetColors::setColorTheme();
}
~myWidgetColors() override
{ }
finalcut::FString getClassName() const override
{
return "myWidgetColors";
}
void myWidgetColors() override
{
... // Color definitions
}
};
```
For setting the widget colors, it is recommended to call the method
`FWidget::setColorTheme()` via the `FApplication` object to create a
new instance of the theme and assign it to the application.
```cpp
finalcut::FApplication app(argc, argv);
app.setColorTheme<myWidgetColors>();
```
In the following example, we will create the `BeeColorTheme`. For this
purpose, we will first create an include file that can be easily included
later in your application.
**File:** *widget-color-theme.h*
```cpp
#ifndef WIDGETCOLORTHEME_H
#define WIDGETCOLORTHEME_H
class BeeColorTheme final : public finalcut::FWidgetColors
{
public:
BeeColorTheme()
{
BeeColorTheme::setColorTheme();
}
~BeeColorTheme() override
{ }
finalcut::FString getClassName() const override
{
return "BeeColorTheme";
}
void setColorTheme() override
{
term_fg = finalcut::FColor::Black;
term_bg = finalcut::FColor::LightBlue;
list_fg = finalcut::FColor::Black;
list_bg = finalcut::FColor::LightGray;
selected_list_fg = finalcut::FColor::LightRed;
selected_list_bg = finalcut::FColor::LightGray;
dialog_fg = finalcut::FColor::Black;
dialog_resize_fg = finalcut::FColor::Red;
dialog_emphasis_fg = finalcut::FColor::Blue;
dialog_bg = finalcut::FColor::LightGray;
error_box_fg = finalcut::FColor::Black;
error_box_emphasis_fg = finalcut::FColor::Red;
error_box_bg = finalcut::FColor::Yellow;
tooltip_fg = finalcut::FColor::Black;
tooltip_bg = finalcut::FColor::Yellow;
shadow_fg = finalcut::FColor::Black;
shadow_bg = finalcut::FColor::LightGray;
current_element_focus_fg = finalcut::FColor::White;
current_element_focus_bg = finalcut::FColor::Green;
current_element_fg = finalcut::FColor::LightGray;
current_element_bg = finalcut::FColor::DarkGray;
current_inc_search_element_fg = finalcut::FColor::Brown;
selected_current_element_focus_fg = finalcut::FColor::LightRed;
selected_current_element_focus_bg = finalcut::FColor::Green;
selected_current_element_fg = finalcut::FColor::LightRed;
selected_current_element_bg = finalcut::FColor::DarkGray;
label_fg = finalcut::FColor::Black;
label_bg = finalcut::FColor::LightGray;
label_inactive_fg = finalcut::FColor::LightGray;
label_inactive_bg = finalcut::FColor::DarkGray;
label_hotkey_fg = finalcut::FColor::Red;
label_hotkey_bg = finalcut::FColor::LightGray;
label_emphasis_fg = finalcut::FColor::Blue;
label_ellipsis_fg = finalcut::FColor::DarkGray;
inputfield_active_focus_fg = finalcut::FColor::LightGray;
inputfield_active_focus_bg = finalcut::FColor::Green;
inputfield_active_fg = finalcut::FColor::Black;
inputfield_active_bg = finalcut::FColor::Cyan ;
inputfield_inactive_fg = finalcut::FColor::Black;
inputfield_inactive_bg = finalcut::FColor::LightGray;
toggle_button_active_focus_fg = finalcut::FColor::White;
toggle_button_active_focus_bg = finalcut::FColor::Green;
toggle_button_active_fg = finalcut::FColor::Black;
toggle_button_active_bg = finalcut::FColor::LightGray;
toggle_button_inactive_fg = finalcut::FColor::DarkGray;
toggle_button_inactive_bg = finalcut::FColor::LightGray;
button_active_focus_fg = finalcut::FColor::White;
button_active_focus_bg = finalcut::FColor::Green;
button_active_fg = finalcut::FColor::Black;
button_active_bg = finalcut::FColor::Cyan;
button_inactive_fg = finalcut::FColor::Cyan;
button_inactive_bg = finalcut::FColor::LightGray;
button_hotkey_fg = finalcut::FColor::Red;
titlebar_active_fg = finalcut::FColor::White;
titlebar_active_bg = finalcut::FColor::Blue;
titlebar_inactive_fg = finalcut::FColor::LightGray;
titlebar_inactive_bg = finalcut::FColor::DarkGray;
titlebar_button_fg = finalcut::FColor::Black;
titlebar_button_bg = finalcut::FColor::LightGray;
titlebar_button_focus_fg = finalcut::FColor::LightGray;
titlebar_button_focus_bg = finalcut::FColor::Black;
menu_active_focus_fg = finalcut::FColor::White;
menu_active_focus_bg = finalcut::FColor::Blue;
menu_active_fg = finalcut::FColor::Black;
menu_active_bg = finalcut::FColor::Yellow;
menu_inactive_fg = finalcut::FColor::Cyan;
menu_inactive_bg = finalcut::FColor::Yellow;
menu_hotkey_fg = finalcut::FColor::Red;
menu_hotkey_bg = finalcut::FColor::Yellow;
statusbar_fg = finalcut::FColor::White;
statusbar_bg = finalcut::FColor::DarkGray;
statusbar_hotkey_fg = finalcut::FColor::LightRed;
statusbar_hotkey_bg = finalcut::FColor::DarkGray;
statusbar_separator_fg = finalcut::FColor::Black;
statusbar_active_fg = finalcut::FColor::White;
statusbar_active_bg = finalcut::FColor::Green;
statusbar_active_hotkey_fg = finalcut::FColor::LightRed;
statusbar_active_hotkey_bg = finalcut::FColor::Green;
scrollbar_fg = finalcut::FColor::Black;
scrollbar_bg = finalcut::FColor::Green;
scrollbar_button_fg = finalcut::FColor::Black;
scrollbar_button_bg = finalcut::FColor::Green;
scrollbar_button_inactive_fg = finalcut::FColor::Cyan;
scrollbar_button_inactive_bg = finalcut::FColor::LightGray;
progressbar_fg = finalcut::FColor::Green;
progressbar_bg = finalcut::FColor::DarkGray;
}
};
#endif // WIDGETCOLORTHEME_H
```
Color Palette Theme
-------------------
FINAL CUT has four color tables for the 16 standard colors in the terminal.
These are a redefinition of the 16 ANSI colors. You can address the colors
via indexes values from 0 to 15. They correspond to the following colors:
| Index | Color name |
|:------:|:-------------------------------|
| 0 | finalcut::FColor::Black |
| 1 | finalcut::FColor::Blue |
| 2 | finalcut::FColor::Green |
| 3 | finalcut::FColor::Cyan |
| 4 | finalcut::FColor::Red |
| 5 | finalcut::FColor::Magenta |
| 6 | finalcut::FColor::Brown |
| 7 | finalcut::FColor::LightGray |
| 8 | finalcut::FColor::DarkGray |
| 9 | finalcut::FColor::LightBlue |
| 10 | finalcut::FColor::LightGreen |
| 11 | finalcut::FColor::LightCyan |
| 12 | finalcut::FColor::LightRed |
| 13 | finalcut::FColor::LightMagenta |
| 14 | finalcut::FColor::Yellow |
| 15 | finalcut::FColor::White |
You can define your color as an 8-bit value based on its red, green, and
blue components. To create a color palette, create a derived class of
`FColorPalette`. The constructor gets as argument the function to set
a palette color. This function must have the following structure:
```cpp
setPalette(finalcut::FColor index, int red, int green, int blue);
```
A possible implementation could look as follows:
```cpp
class myColorPalette final : public finalcut::FColorPalette
{
public:
explicit myColorPalette (const FSetPalette& f)
: FColorPalette(f)
{ }
~myColorPalette()
{ }
finalcut::FString getClassName() const override
{
return "myColorPalette";
}
void setColorPalette() override
{
... // Palette definitions
}
void resetColorPalette() override
{
setVGAdefaultPalette();
}
};
```
To set the colors of a palette theme, you should use the method
`FTerm::setColorPaletteTheme()`. This method creates a new instance and
saves it in the `FTerm` object.
```cpp
finalcut::FTerm::setColorPaletteTheme<myColorPalette>();
```
The standard VGA palette is part of the `FColorPalette` class. To set it,
use the method `setVGAdefaultPalette()`. You can use it to reset the color
palette of terminals that cannot reset to default values with escape
sequences.
<figure class="image">
<img src="user-theme-vga-palette.svg" alt="VGA palette">
<figcaption>Figure 1. VGA palette</figcaption>
</figure>
<br /><br />
The FINAL CUT eight-color palette `default8ColorPalette` is optimized for
the eight-color widget theme `default8ColorTheme`. It is for terminals
that cannot display more than eight colors.
<figure class="image">
<img src="user-theme-fc8-palette.svg" alt="FINAL CUT 8-color palette">
<figcaption>Figure 2. FINAL CUT 8-color palette</figcaption>
</figure>
<br /><br />
The FINAL CUT palette `default16ColorPalette` is the default 16-color
palette. It is optimized for the widget color theme `default16ColorTheme`.
<figure class="image">
<img src="user-theme-fc16-palette.svg" alt="FINAL CUT 16-color palette">
<figcaption>Figure 3. FINAL CUT 16-color palette</figcaption>
</figure>
<br /><br />
The second 16-color palette in FINAL CUT is for the dark theme. It was
adjusted for the widget color themes `default8ColorDarkTheme` and
`default16ColorDarkTheme`.
<figure class="image">
<img src="user-theme-fc16-dark-palette.svg" alt="FINAL CUT 16-color dark palette">
<figcaption>Figure 4. FINAL CUT 16-color dark palette</figcaption>
</figure>
<br /><br />
In the following example, we want to create the palette them
`BeeColorPalette`. For this purpose, we generate an include file again,
in which we implement the new palette class.
<figure class="image">
<img src="user-theme-bee-palette.svg" alt="Bee palette">
<figcaption>Figure 6. Bee palette</figcaption>
</figure>
<br /><br />
**File:** *color-palette-theme.h*
```cpp
#ifndef BEECOLORPALETTE_H
#define BEECOLORPALETTE_H
class BeeColorPalette final : public finalcut::FColorPalette
{
public:
explicit BeeColorPalette (const FSetPalette& f)
: FColorPalette(f)
{ }
~BeeColorPalette()
{ }
finalcut::FString getClassName() const override
{
return "BeeColorPalette";
}
void setColorPalette() override
{
setPalette (finalcut::FColor::Black, 0x00, 0x00, 0x00);
setPalette (finalcut::FColor::Blue, 0x23, 0x21, 0x2c);
setPalette (finalcut::FColor::Green, 0x26, 0x93, 0x7c);
setPalette (finalcut::FColor::Cyan, 0xcf, 0xb3, 0xa8);
setPalette (finalcut::FColor::Red, 0xba, 0x1a, 0x1a);
setPalette (finalcut::FColor::Magenta, 0xb2, 0x18, 0xb2);
setPalette (finalcut::FColor::Brown, 0xe8, 0x87, 0x1f);
setPalette (finalcut::FColor::LightGray, 0xff, 0xfb, 0xe4);
setPalette (finalcut::FColor::DarkGray, 0x3a, 0x36, 0x37);
setPalette (finalcut::FColor::LightBlue, 0xa5, 0xa5, 0xb1);
setPalette (finalcut::FColor::LightGreen, 0x5e, 0xeb, 0x5c);
setPalette (finalcut::FColor::LightCyan, 0x62, 0xbf, 0xf8);
setPalette (finalcut::FColor::LightRed, 0xee, 0x44, 0x44);
setPalette (finalcut::FColor::LightMagenta, 0xe9, 0xad, 0xff);
setPalette (finalcut::FColor::Yellow, 0xf8, 0xef, 0xa6);
setPalette (finalcut::FColor::White, 0xff, 0xff, 0xff);
}
void resetColorPalette() override
{
setVGAdefaultPalette();
}
};
#endif // BEECOLORPALETTE_H
```
Use of Themes
-------------
If you include the two include files above in your application, you can use
the widget color theme and the color palette theme. In the main function of
your application, the object instances of both classes are created and set.
<figure class="image">
<img src="user-theme.png" alt="User theme example">
<figcaption>Figure 7. User theme example</figcaption>
</figure>
<br /><br />
**File:** *theme.cpp*
```cpp
#include <final/final.h>
#include "widget-color-theme.h"
#include "color-palette-theme.h"
using namespace finalcut;
class dialogWidget final : public FDialog
{
public:
explicit dialogWidget (FWidget* parent = nullptr)
: FDialog{"Theming test application", parent}
{
Input.setLabelText("File name:");
Input.setLabelOrientation(FLineEdit::LabelOrientation::Above);
Input.setStatusbarMessage("Enter a file name");
Browse.addCallback
(
"clicked",
this, &dialogWidget::cb_FileBrowse
);
Apply.setStatusbarMessage("Apply settings");
Quit.setStatusbarMessage("Exit the program");
Quit.addCallback
(
"clicked",
finalcut::getFApplication(),
&finalcut::FApplication::cb_exitApp,
this
);
Open.addCallback
(
"clicked",
this, &dialogWidget::cb_FileBrowse
);
}
private:
void initLayout()
{
setGeometry (FPoint{15, 5}, FSize{50, 9});
Input.setGeometry (FPoint{2, 2}, FSize{39, 1});
Browse.setGeometry (FPoint{43, 2}, FSize{4, 1});
Apply.setGeometry (FPoint{24, 5}, FSize{10, 1});
Quit.setGeometry (FPoint{37, 5}, FSize{10, 1});
FDialog::initLayout();
}
void cb_FileBrowse()
{
auto filename = FFileDialog::fileOpenChooser(this);
if ( ! filename.isEmpty() )
{
Input.setText(filename);
Input.redraw();
}
}
FMenuBar Menubar{this};
FMenu File{"&File", &Menubar};
FMenuItem New{"&New", &File};
FMenuItem Open{"&Open...", &File};
FMenu Edit{"&Edit", &Menubar};
FMenuItem Undo{"&Undo", &Edit};
FMenu Help{"&Help", &Menubar};
FMenuItem About{"&About", &Help};
FStatusBar Statusbar{this};
FLineEdit Input{"input...", this};
FButton Browse{"..", this};
FButton Apply{"&Apply", this};
FButton Quit{"&Quit", this};
};
int main (int argc, char* argv[])
{
FApplication app(argc, argv);
// Set the widget color theme
app.setColorTheme<BeeColorTheme>();
// Set the color palette theme
FTerm::setColorPaletteTheme<BeeColorPalette>();
dialogWidget dialog(&app);
FWidget::setMainWidget(&dialog);
dialog.show();
return app.exec();
}
```
After entering the source code in *theme.cpp* you can compile
the above program with gcc:
```bash
g++ theme.cpp -o theme -O2 -lfinal -std=c++11
```

BIN
doc/user-theme.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

517
doc/vga.txt Normal file
View File

@ -0,0 +1,517 @@
3C0h: Attribute Controller: Address register
bit 0-4 Address of data register to write to port 3C0h or read from port 3C1h
(Reads only on VGA).
5 If set screen output is enabled and the palette can not be modified,
if clear screen output is disabled and the palette can be modified.
Port 3C0h is special in that it is both address and data-write register.
Data reads happen from port 3C1h. An internal flip-flop remembers whether it
is currently acting as address or data register.
Accesses to the attribute controller must be separated by at least 250ns.
Reading port 3dAh will reset the flip-flop to address mode.
3C0h index 0-Fh (r/W): Attribute: Palette
bit 0 (EGA) Primary Blue
1 (EGA) Primary Green
2 (EGA) Primary Red
3 (EGA) Secondary Blue
4 (EGA) Secondary Green
5 (EGA) Secondary Red
0-5 (VGA) Index into the 256 color DAC table.
May be modified by 3C0h index 10h and 14h.
3C0h index 10h (r/W): Attribute: Mode Control Register
bit 0 Graphics mode if set, Alphanumeric mode else.
1 Monochrome mode if set, color mode else.
2 9-bit wide characters if set.
The 9th bit of characters C0h-DFh will be the same as
the 8th bit. Otherwise it will be the background color.
3 If set Attribute bit 7 is blinking, else high intensity.
5 (VGA Only) If set the PEL panning register (3C0h index 13h) is
temporarily set to 0 from when the line compare causes a wrap around
until the next vertical retrace when the register is automatically
reloaded with the old value, else the PEL panning register ignores
line compares.
6 (VGA Only) If set pixels are 8 bits wide. Used in 256 color modes.
7 (VGA Only) If set bit 4-5 of the index into the DAC table are taken
from port 3C0h index 14h bit 0-1, else the bits in the palette
register are used.
3C0h index 11h (r/W): Attribute: Overscan Color Register.
bit 0-5 Color of screen border. Color is defined as in the palette registers.
Note: The EGA requires the Overscan color to be 0 in high resolution modes.
3C0h index 12h (r/W): Attribute: Color Plane Enable Register
bit 0 Bit plane 0 is enabled if set.
1 Bit plane 1 is enabled if set.
2 Bit plane 2 is enabled if set.
3 Bit plane 3 is enabled if set.
4-5 Video Status MUX. Diagnostics use only.
Two attribute bits appear on bits 4 and 5 of the Input
Status Register 1 (3dAh).
Value EGA VGA
0 Red/Blue Bit 2/Bit 0
1 Blue'/Green Bit 5/Bit 4
2 Red'/Green' Bit 3/Bit 1
3 Bit 7/Bit 6
3C0h index 13h (r/W): Attribute: Horizontal PEL Panning Register
bit 0-3 Indicates number of pixels to shift the display left
Value 9bit textmode 256color mode Other modes
0 1 0 0
1 2 n/a 1
2 3 1 2
3 4 n/a 3
4 5 2 4
5 6 n/a 5
6 7 3 6
7 8 n/a 7
8 0 n/a n/a
3C0h index 14h (r/W): Attribute: Color Select Register (VGA Only)
bit 0-1 If 3C0h index 10h bit 7 is set these 2 bits are used as bits 4-5 of
the index into the DAC table.
2-3 These 2 bits are used as bit 6-7 of the index into the DAC table
except in 256 color mode.
Note: this register does not affect 256 color modes.
3C2h (R): Input Status #0 Register
bit 4 Status of the switch selected by the Miscellaneous Output
Register 3C2h bit 2-3. Switch high if set.
5 (EGA Only) Pin 19 of the Feature Connector (FEAT0) is high if set
6 (EGA Only) Pin 17 of the Feature Connector (FEAT1) is high if set
7 (EGA Only ??) If set IRQ 2 has happened due to Vertical Retrace.
Should be cleared by IRQ 2 interrupt routine by clearing port 3d4h
index 11h bit 4.
3C2h (W): Miscellaneous Output Register
bit 0 If set Color Emulation. Base Address=3Dxh else Mono Emulation. Base
Address=3Bxh.
1 Enable CPU Access to video memory if set
2-3 Clock Select
0: 14MHz(EGA) 25MHz(VGA)
1: 16MHz(EGA) 28MHz(VGA)
2: External(EGA) Reserved(VGA)
4 (EGA Only) Disable internal video drivers if set
5 When in Odd/Even modes Select High 64k bank if set
6 Horizontal Sync Polarity. Negative if set
7 Vertical Sync Polarity. Negative if set
Bit 6-7 indicates the number of lines on the display:
0=200(EGA) Reserved(VGA)
1= 400(VGA)
2=350(EGA) 350(VGA)
3= 480(VGA).
Note: Set to all zero on a hardware reset.
Note: On the VGA this register can be read from port 3CCh.
3C3h (W): Video Subsystem Enable Register
bit 0 Enables the VGA display if set
3C4h index 0 (r/W): Sequencer: Reset
bit 0 (EGA) Asynchronous Reset if clear
0 (VGA) Synchronous Reset just as bit 1
1 Synchronous Reset if clear
3C4h index 1 (r/W): Sequencer: Clocking Mode
bit 0 If set character clocks are 8 dots wide, else 9.
1 (EGA Only) If set the CRTC uses 2/5 of the clock cycles, else 4/5.
2 If set loads video serializers every other character
clock cycle, else every one.
3 If set the Dot Clock is Master Clock/2, else same as
Master Clock (See 3C2h bit 2-3). (Doubles pixels).
4 (VGA Only) If set loads video serializers every fourth character
clock cycle, else every one.
5 (VGA Only) if set turns off screen and gives all memory cycles to the
CPU interface.
3C4h index 2 (r/W): Sequencer: Map Mask Register
bit 0 Enable writes to plane 0 if set
1 Enable writes to plane 1 if set
2 Enable writes to plane 2 if set
3 Enable writes to plane 3 if set
3C4h index 3 (r/W): Sequencer: Character Map Select Register
bit 0-1 (EGA) Selects EGA Character Map (0..3) if bit 3 of the character
attribute is clear.
2-3 (EGA) Selects EGA Character Map (0..3) if bit 3 of the character
attribute is set.
0,1,4 (VGA) Selects VGA Character Map (0..7) if bit 3 of the character
attribute is clear.
2,3,5 (VGA) Selects VGA Character Map (0..7) if bit 3 of the character
attribute is set.
Note: Character Maps are placed at:
Map no. (EGA/VGA) Map no. (VGA)
0 0k 4 8k
1 16k 5 24k
2 32k 6 40k
3 48k 7 56k
3C4h index 4 (r/W): Sequencer: Memory Mode Register
bit 0 Set if in an alphanumeric mode, clear in graphics modes.
1 Set if more than 64kbytes on the adapter.
2 Enables Odd/Even addressing mode if set. Odd/Even mode places all odd
bytes in plane 1&3, and all even bytes in plane 0&2.
3 (VGA Only) If set address bit 0-1 selects video memory planes
(256 color mode), rather than the Map Mask and Read Map Select
Registers.
3C4h index 7 (R/W): Sequencer Horizontal Character Counter Reset Register.
(VGA Only)
Note: Undocumented by IBM. May not be available in all clones.
A write to this register will cause the Horizontal Character Counter
to be held reset (=0) until a write happens to any of the Sequencer
registers index 0..6.
The Vertical Line counter is clocked by a signal derived from the
Horizontal Display Enable (which does not occur if the Horizontal
Character Counter is held reset).
Thus a write to index 7 during Vertical Retrace can stop the display
timing and allow software to start the next frame reasonably
synchronous to an external event.
3C6h (R/W): PEL Mask (VGA Only)
bit 0-7 This register is anded with the palette index sent for each dot.
Should be set to FFh.
3C7h (R): DAC State Register (VGA Only)
bit 0-1 0 indicates the DAC is in Read Mode and 3 indicates write mode.
3C7h (W): PEL Address Read Mode (VGA Only)
bit 0-7 The PEL data register (0..255) to be read from 3C9h.
Note: After reading the 3 bytes at 3C9h this register will increment,
pointing to the next data register.
3C8h (R/W): PEL Address Write Mode (VGA Only)
bit 0-7 The PEL data register (0..255) to be written to 3C9h.
Note: After writing the 3 bytes at 3C9h this register will increment, pointing
to the next data register.
3C9h (R/W): PEL Data Register (VGA Only)
bit 0-5 Color value
Note: Each read or write of this register will cycle through first the
registers for Red, Blue and Green, then increment the appropriate
address register, thus the entire palette can be loaded by writing 0 to
the PEL Address Write Mode register 3C8h and then writing all 768 bytes
of the palette to this register.
3CAh (R): Feature Control Register (VGA Only)
Bit 3 Vertical Sync Select. If set Vertical Sync to the monitor is the
logical OR of the vertical sync and the vertical display enable.
Note: This register is written to port 3dAh and read from 3CAh.
3CAh (W): Graphics 2 Position (EGA Only)
bit 0-1 Select which bit planes should be controlled by Graphics Controller
#2. Always set to 1.
3CCh (R): Miscellaneous Output Register (VGA Only)
bit 0 If set Color Emulation. Base Address=3Dxh else Mono Emulation. Base
Address=3Bxh.
1 Enable CPU Access to video memory if set
2-3 Clock Select. 0= 25MHz, 1= 28MHz, 2= Reserved
5 When in Odd/Even modes Select High 64k bank if set
6 Horizontal Sync Polarity. Negative if set
7 Vertical Sync Polarity. Negative if set
Bit 6-7 indicates the number of lines on the display:
0=Reserved, 1=400, 2=350, 3=480.
Note: This register is written to port 3C2h and read from port 3CCh.
3CCh (W): Graphics 1 Position (EGA Only)
bit 0-1 Select which bit planes should be controlled by Graphics Controller
#1. Always set to 0.
3CEh index 0 (r/W): Graphics: Set/Reset Register
bit 0 If in Write Mode 0 and bit 0 of 3CEh index 1 is set a write to
display memory will set all the bits in plane 0 of the byte to this
bit, if the corresponding bit is set in the Map Mask Register (3CEh
index 8).
1 Same for plane 1 and bit 1 of 3CEh index 1.
2 Same for plane 2 and bit 2 of 3CEh index 1.
3 Same for plane 3 and bit 3 of 3CEh index 1.
3CEh index 1 (r/W): Graphics: Enable Set/Reset Register
bit 0 If set enables Set/reset of plane 0 in Write Mode 0.
1 Same for plane 1.
2 Same for plane 2.
3 Same for plane 3.
3CEh index 2 (r/W): Graphics: Color Compare Register
bit 0-3 In Read Mode 1 each pixel at the address of the byte read is compared
to this color and the corresponding bit in the output set to 1 if
they match, 0 if not. The Color Don't Care Register (3CEh index 7)
can exclude bitplanes from the comparison.
3CEh index 3 (r/W): Graphics: Data Rotate
bit 0-2 Number of positions to rotate data right before it is written to
display memory. Only active in Write Mode 0.
3-4 In Write Mode 2 this field controls the relation between the data
written from the CPU, the data latched from the previous read and the
data written to display memory:
0: CPU Data is written unmodified
1: CPU data is ANDed with the latched data
2: CPU data is ORed with the latch data.
3: CPU data is XORed with the latched data.
3CEh index 4 (r/W): Graphics: Read Map Select Register
bit 0-1 Number of the plane Read Mode 0 will read from.
3CEh index 5 (r/W): Graphics: Mode Register
bit 0-1 Write Mode: Controls how data from the CPU is transformed before
being written to display memory:
0: Mode 0 works as a Read-Modify-Write operation.
First a read access loads the data latches of the EGA/VGA with
the value in video memory at the addressed location. Then a
write access will provide the destination address and the CPU
data byte. The data written is modified by the function code in
the Data Rotate register (3CEh index 3) as a function of the CPU
data and the latches, then data is rotated as specified by the
same register.
1: Mode 1 is used for video to video transfers.
A read access will load the data latches with the contents of
the addressed byte of video memory. A write access will write
the contents of the latches to the addressed byte. Thus a single
MOVSB instruction can copy all pixels in the source address byte
to the destination address.
2: Mode 2 writes a color to all pixels in the addressed byte of
video memory. Bit 0 of the CPU data is written to plane 0 et
cetera. Individual bits can be enabled or disabled through the
Bit Mask register (3CEh index 8).
3: (VGA Only) Mode 3 can be used to fill an area with a color and
pattern. The CPU data is rotated according to 3CEh index 3 bits
0-2 and anded with the Bit Mask Register (3CEh index 8). For
each bit in the result the corresponding pixel is set to the
color in the Set/Reset Register (3CEh index 0 bits 0-3) if the
bit is set and to the contents of the processor latch if the bit
is clear.
2 (EGA Only) Forces all outputs to a high impedance state if set.
3 Read Mode
0: Data is read from one of 4 bit planes depending on the Read Map
Select Register (3CEh index 4).
1: Data returned is a comparison between the 8 pixels occupying the
read byte and the color in the Color Compare Register (3CEh
index 2). A bit is set if the color of the corresponding pixel
matches the register.
4 Enables Odd/Even mode if set (See 3C4h index 4 bit 2).
5 Enables CGA style 4 color pixels using even/odd bit pairs if set.
6 (VGA Only) Enables 256 color mode if set.
3CEh index 6 (r/W): Graphics: Miscellaneous Register
bit 0 Indicates Graphics Mode if set, Alphanumeric mode else.
1 Enables Odd/Even mode if set.
2-3 Memory Mapping:
0: use A000h-BFFFh
1: use A000h-AFFFh EGA/VGA Graphics modes
2: use B000h-B7FFh Monochrome modes
3: use B800h-BFFFh CGA modes
3CEh index 7 (r/W): Graphics: Color Don't Care Register
bit 0 Ignore bit plane 0 in Read mode 1 if clear.
1 Ignore bit plane 1 in Read mode 1 if clear.
2 Ignore bit plane 2 in Read mode 1 if clear.
3 Ignore bit plane 3 in Read mode 1 if clear.
3CEh index 8 (r/W): Graphics: Bit Mask Register
bit 0-7 Each bit if set enables writing to the corresponding bit of a byte in
display memory.
3d4h index 0 (r/W): CRTC: Horizontal Total Register
bit 0-7 (EGA) Horizontal Total Character Clocks-2
0-7 (VGA) Horizontal Total Character Clocks-5
3d4h index 1 (r/W): CRTC: Horizontal Display End Register
bit 0-7 Number of Character Clocks Displayed -1
3d4h index 2 (r/W): CRTC: Start Horizontal Blanking Register
bit 0-7 The count at which Horizontal Blanking starts
3d4h index 3 (r/W): CRTC: End Horizontal Blanking Register
bit 0-4 Horizontal Blanking ends when the last 5 (6 for VGA) bits of the
character counter equals this field.
(VGA) The sixth bit is found in port 3d4h index 5 bit 7.
5-6 Number of character clocks to delay start of display after Horizontal
Total has been reached.
7 (VGA Only) Access to Vertical Retrace registers if set. If clear
reads to 3d4h index 10h and 11h access the Lightpen read back
registers ??
3d4h index 4 (r/W): CRTC: Start Horizontal Retrace Register
bit 0-7 Horizontal Retrace starts when the Character Counter reaches this
value.
3d4h index 5 (r/W): CRTC: End Horizontal Retrace Register
bit 0-4 Horizontal Retrace ends when the last 5 bits of the character counter
equals this value.
5-6 Number of character clocks to delay start of display after Horizontal
Retrace.
7 (EGA) Provides Smooth Scrolling in Odd/Even mode. When set display
starts from an odd byte.
7 (VGA) bit 5 of the End Horizontal Blanking count (See 3d4h index 3
bit 0-4).
3d4h index 6 (r/W): CRTC: Vertical Total Register
bit 0-7 Lower 8 bits of the Vertical Total. Bit 8 is found in 3d4h index 7
bit 0. (VGA) Bit 9 is found in 3d4h index 7 bit 5.
Note: For the VGA this value is the number of scan lines in the display -2.
3d4h index 7 (r/W): CRTC: Overflow Register
bit 0 Bit 8 of Vertical Total (3d4h index 6)
1 Bit 8 of Vertical Display End (3d4h index 12h)
2 Bit 8 of Vertical Retrace Start (3d4h index 10h)
3 Bit 8 of Start Vertical Blanking (3d4h index 15h)
4 Bit 8 of Line Compare Register (3d4h index 18h)
5 (VGA) Bit 9 of Vertical Total (3d4h index 6)
6 (VGA) Bit 9 of Vertical Display End (3d4h index 12h)
7 (VGA) Bit 9 of Vertical Retrace Start (3d4h index 10h)
3d4h index 8 (r/W): CRTC: Preset Row Scan Register
bit 0-4 Number of lines we have scrolled down in the first character row.
Provides Smooth Vertical Scrolling.
5-6 (VGA Only) Number of bytes to skip at the start of scanline. Provides
Smooth Horizontal Scrolling together with the Horizontal Panning
Register (3C0h index 13h).
3d4h index 9 (r/W): CRTC: Maximum Scan Line Register
bit 0-4 Number of scan lines in a character row -1. In graphics modes this is
the number of times (-1) the line is displayed before passing on to
the next line (0: normal, 1: double, 2: triple...).
This is independent of bit 7, except in CGA modes which seems to
require this field to be 1 and bit 7 to be set to work.
5 (VGA) Bit 9 of Start Vertical Blanking
6 (VGA) Bit 9 of Line Compare Register
7 (VGA) Doubles each scan line if set.
I.e. displays 200 lines on a 400 display.
3d4h index Ah (r/W): CRTC: Cursor Start Register
bit 0-4 First scanline of cursor within character.
5 (VGA) Turns Cursor off if set
3d4h index Bh (r/W): CRTC: Cursor End Register
bit 0-4 Last scanline of cursor within character
5-6 Delay of cursor data in character clocks.
3d4h index Ch (r/W): CRTC: Start Address High Register
bit 0-7 Upper 8 bits of the start address of the display buffer
3d4h index Dh (r/W): CRTC: Start Address Low Register
bit 0-7 Lower 8 bits of the start address of the display buffer
3d4h index Eh (r/W): CRTC: Cursor Location High Register
bit 0-7 Upper 8 bits of the address of the cursor
3d4h index Fh (r/W): CRTC: Cursor Location Low Register
bit 0-7 Lower 8 bits of the address of the cursor
3d4h index 10h (R): CRTC: Light Pen High Register (EGA Only)
bit 0-7 (EGA Only) Upper 8 bits of the address of the lightpen position.
3d4h index 10h (r/W): CRTC: Vertical Retrace Start Register
bit 0-7 Lower 8 bits of Vertical Retrace Start. Vertical Retrace starts when
the line counter reaches this value. Bit 8 is found in 3d4h index 7
bit 2. (VGA Only) Bit 9 is found in 3d4h index 7 bit 7.
3d4h index 11h (R): CRTC: Light Pen Low Register (EGA Only)
bit 0-7 (EGA Only) Lower 8 bits of the address of the lightpen position.
3d4h index 11h (r/W): CRTC: Vertical Retrace End Register
bit 0-3 Vertical Retrace ends when the last 4 bits of the line counter equals
this value.
4 if clear Clears pending Vertical Interrupts.
5 Vertical Interrupts (IRQ 2) disabled if set. Can usually be left
disabled, but some systems (including PS/2) require it to be enabled.
6 (VGA Only) If set selects 5 refresh cycles per scanline rather
than 3.
7 (VGA Only) Disables writing to registers 0-7 if set 3d4h index 7
bit 4 is not affected by this bit.
3d4h index 12h (r/W): CRTC: Vertical Display End Register
bit 0-7 Lower 8 bits of Vertical Display End. The display ends when the line
counter reaches this value. Bit 8 is found in 3d4h index 7 bit 1.
(VGA Only) Bit 9 is found in 3d4h index 7 bit 6.
3d4h index 13h (r/W): CRTC: Offset register
bit 0-7 Number of bytes in a scanline / K. Where K is 2 for byte mode, 4 for
word mode and 8 for Double Word mode.
3d4h index 14h (r/W): CRTC: Underline Location Register
bit 0-4 Position of underline within Character cell.
5 (VGA Only) If set memory address is only changed every fourth
character clock.
6 (VGA Only) Double Word mode addressing if set
3d4h index 15h (r/W): CRTC: Start Vertical Blank Register
bit 0-7 Lower 8 bits of Vertical Blank Start. Vertical blanking starts when
the line counter reaches this value. Bit 8 is found in 3d4h index 7
bit 3.
3d4h index 16h (r/W): CRTC: End Vertical Blank Register
bit 0-4 (EGA) Vertical blanking stops when the lower 5 bits of the line
counter equals this field.
0-6 (VGA) Vertical blanking stops when the lower 7 bits of the line
counter equals this field.
3d4h index 17h (r/W): CRTC: Mode Control Register
bit 0 If clear use CGA compatible memory addressing system
by substituting character row scan counter bit 0 for address bit 13,
thus creating 2 banks for even and odd scan lines.
1 If clear use Hercules compatible memory addressing system by
substituting character row scan counter bit 1 for address bit 14,
thus creating 4 banks.
2 If set increase scan line counter only every second line.
3 If set increase memory address counter only every other character
clock.
4 (EGA Only) If set disable the EGA output drivers. This bit is used
for other purposes in some Super VGA chips.
5 When in Word Mode bit 15 is rotated to bit 0 if this bit is set else
bit 13 is rotated into bit 0.
6 If clear system is in word mode. Addresses are rotated 1 position up
bringing either bit 13 or 15 into bit 0.
7 Clearing this bit will reset the display system until the bit is set
again.
3d4h index 18h (r/W): CRTC: Line Compare Register
bit 0-7 Lower 8 bits of the Line Compare. When the Line counter reaches this
value, the display address wraps to 0. Provides Split Screen
facilities. Bit 8 is found in 3d4h index 7 bit 4.
(VGA Only) Bit 9 is found in 3d4h index 9 bit 6.
3d4h index 22h (R): Memory Latch Register (VGA - Undoc)
bit 0-7 Reads the contents of the Graphics Controller Memory Data Latch for
the plane selected by 3C0h index 4 bit 0-1 (Read Map Select).
Note: This register is not documented by IBM and may not be available on all
clones.
3d4h index 24h (R): Attribute Controller Toggle Register. (VGA - Undoc)
bit 0-4 Attribute Controller Index.
The current value of the Attribute Index Register.
5 Palette Address Source. Same as 3C0h bit 5.
7 If set next read or write to 3C0h will access the data register.
Note: This register is not documented by IBM and may not be available on all
clones.
3d4h index 30h-3Fh (W): Clear Vertical Display Enable. (VGA - Undoc)
bit 0 Setting this bit will clear the Vertical Display Enable thus blanking
the display for the rest of the frame and giving the CPU total access
to display memory until the start of the next frame.
Note: This register is not documented by IBM and may not be available on all
clones.
3dAh (R): Input Status #1 Register
bit 0 Either Vertical or Horizontal Retrace active if set
1 (EGA Only) Light Pen has triggered if set
2 (EGA Only) Light Pen switch is open if set
3 Vertical Retrace in progress if set
4-5 (EGA Only) Shows two of the 6 color outputs, depending on 3C0h index
12h bit 4-5:
Attr: Bit 4-5: Out bit 4 Out bit 5
0 Blue Red
1 I Blue Green
2 I Red I Green
3dAh (W): Feature Control Register
bit 0 (EGA Only) Output to pin 21 of the Feature Connector.
1 (EGA Only) Output to pin 20 of the Feature Connector.
3 (VGA Only) Vertical Sync Select. If set Vertical Sync to the monitor
is the logical OR of the vertical sync and the vertical display
enable.
Note: On the VGA this register can be read from port 3CAh.

View File

@ -1,57 +1,56 @@
The virtual terminal (vterm)
----------------------------
FINAL CUT uses a virtual terminal to print character via an update method
on the screen. It provides (as an overlying layer) virtual windows for
the realization of window movements. The update methods only transfer
differences to the virtual terminal or physical screen.
print(...)
printf(...)
│ ╔═════════════════════════[ vterm ]═════════════════════════╗
│ ║createVTerm() ║
│ ║ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║
│ ║ ║
│ ║ │ restoreVTerm(x,y,w,h) │ ║
│ ║ ║
│ ║ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║
│ ║ ║
│ ┌───────╨─────[ vwin ]─────────────┐ ║
│ │createArea(area) │ ║
│ │ │ ║
│ │ │ ║
└───┼─────────────► ──────► updateVTerm(area) ────► ║
│ │ ║
│ putArea(x,y,area) ║
│ ────────────────────► ║
│ getArea(x,y,area) ║
│ ◄──────────────────── ║
│ │ ║
│ │ ║
│ resizeArea(area)│ ║
└───────╥──────────────────────────┘ ║
║ ║
║ ║
║ ║
║ │ resizeVTerm()║
╚═══▼═══════════════════════════════════════════════════════╝
│ putVTerm()
└──────────────────► updateTerminalLine(y)
updateTerminal() │
┌───────────────┐
│ output_buffer │
└───────────────┘
│ flush_out()
│ +
│ Fputchar(char)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▌ ▐
▌ screen ▐
▌ ───────────── ▐
▌ real terminal ▐
▌ ▐
▀▀▀▀▀▀▀███▀▀▀▀▀▀▀
███
▀▀▀▀▀▀▀▀▀
│ ╔════════════════════════[ vterm ]════════════════════════╗
│ ║createVTerm() ║
│ ║ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║
│ ║ ║
│ ║ │ restoreVTerm(x,y,w,h) │ ║
│ ┌───────╨────[ vwin ]────────────┐ ║
│ │createArea(area) │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║
│ │ │ ║
│ │ │ ║
└──┼────────► putArea(area) ────► ║
│ │ ║
│ putArea(x,y,area) ────► ║
│ │ ║
│ ◄──── getArea(x,y,area) ║
│ │ ║
│ │ ║
│ │ ║
│ resizeArea(area)│ ║
└───────╥────────────────────────┘ ║
║ ║
║ │ resizeVTerm()║
╚═══════▼═════════════════════════════════════════════════╝
│ putVTerm()
└──────────────────► updateTerminalLine(y)
updateTerminal() │
┌───────────────┐
│ output_buffer │
└───────────────┘
│ flushOutputBuffer()
│ and putchar(char)
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▌ ▐
▌ screen ▐
▌ ───────────── ▐
▌ real terminal ▐
▌ ▐
▀▀▀▀▀▀▀███▀▀▀▀▀▀▀
███
▀▀▀▀▀▀▀▀▀

432
doc/widget-coordinates.svg Normal file
View File

@ -0,0 +1,432 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
height="142.65057mm"
viewBox="-3.4827666 -3.5036988 233.1604 142.65057"
width="233.1604mm"
version="1.1"
id="svg165">
<metadata
id="metadata171">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs169">
<marker
id="a-3"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path2-6"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="s-7"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 0,5.65 V -5.65"
transform="scale(0.8)"
id="path56-5"
style="fill:none;stroke:#000000;stroke-width:1.00000003pt" />
</marker>
<marker
id="r-9"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 0,5.65 V -5.65"
transform="scale(0.8)"
id="path53-1"
style="fill:none;stroke:#000000;stroke-width:1.00000003pt" />
</marker>
<marker
id="c-2"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)"
id="path8-7"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="b-0"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path5-6"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
</defs>
<g
id="Terminal"
transform="translate(2.0027161e-8,-1.1799729e-6)">
<rect
y="-1.6996995"
x="-1.6787703"
height="139.04257"
width="229.55241"
id="background"
style="opacity:1;fill:#98b5ef;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
<path
id="dialog-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613544;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 73.582026,96.010501 h 84.672244 v 5.637389 H 73.582028 Z M 158.25427,33.999698 h 5.64481 V 101.6479 l -5.64481,-1e-5 z" />
<rect
style="opacity:1;fill:#4d4dc0;fill-opacity:1;stroke:none;stroke-width:0.26458329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="titlebar"
width="81.849838"
height="5.637352"
x="76.404434"
y="28.362345"
ry="0" />
<g
transform="translate(71.692613,37.697864)"
aria-label="Dialog"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="title-bar-text">
<path
d="m 36.734547,-5.2188523 c 0.380342,0 0.645834,-0.099754 0.796479,-0.2992606 0.150644,-0.2011031 0.225967,-0.563408 0.225967,-1.0869146 0,-0.5282949 -0.07532,-0.8921958 -0.225967,-1.0917029 -0.149153,-0.2011032 -0.414646,-0.3016548 -0.796479,-0.3016548 h -0.214781 v 2.7795329 z m 0.0089,-3.176951 c 0.510105,0 0.959924,0.038483 1.201552,0.3289651 0.241628,0.2904823 0.28849,0.8489248 0.28849,1.4618107 0,0.6096937 -0.05097,1.1409181 -0.292598,1.4314005 -0.241629,0.2888862 -0.687339,0.3521929 -1.197444,0.3521929 h -0.677902 v -3.5743692 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4980" />
<path
d="m 39.416509,-7.374682 0.802684,4.768e-4 0.01072,2.1092046 0.323533,-0.00427 0.0043,0.4307556 -1.11338,0.00854 0.01281,-0.4392963 h 0.319263 l -0.0084,-1.6582097 -0.351555,6.36e-4 z m 0.372748,-1.0651357 h 0.427881 l -0.0044,0.78334 -0.425031,-4.739e-4 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4982" />
<path
d="m 43.125816,-6.0642176 h -0.27473 c -0.249596,0 -0.406952,-0.022255 -0.534076,0.066111 -0.125574,0.086816 -0.188361,0.217041 -0.188361,0.3906738 0,0.1565796 -0.0093,0.177762 0.09181,0.2675815 0.119043,0.1057463 0.200316,0.063855 0.367748,0.063855 0.235644,0 0.606933,-0.00609 0.84811,-0.022709 -0.0072,-0.223167 -0.0098,-0.3086156 -0.01715,-0.622359 v -0.1443988 z m 0.78146,-0.052714 -0.01329,1.2910685 -0.470069,0.00443 c -0.383705,0.023525 -0.613681,-0.015785 -0.877687,0.00543 -0.2651,0 -0.450139,-0.012404 -0.608269,-0.1612326 -0.15813,-0.1503784 -0.237195,-0.3511413 -0.237195,-0.6022888 0,-0.2899047 0.09689,-0.5100463 0.29068,-0.6604247 0.195337,-0.1503784 0.481366,-0.2255676 0.858087,-0.2255676 h 0.574384 v -0.067438 c -0.0015,-0.2077528 0.02628,-0.3111209 -0.0862,-0.3697529 -0.134874,-0.00598 -0.357472,-0.011877 -0.574003,-0.015059 -0.216531,-0.00318 -0.201855,-0.00432 -0.415259,-0.00808 -0.213404,-0.00376 -0.231246,-0.00347 -0.455954,-0.014158 l -0.001,-0.3673202 c 0.188279,-0.043006 0.323439,-0.05143 0.475607,-0.068437 0.152169,-0.017007 0.216267,-0.024363 0.392225,-0.024363 0.175959,0 0.545366,0.00521 0.697295,0.068767 0.153479,0.063562 0.09339,0.025958 0.258827,0.144224 0.06634,0.04776 0.147125,0.2290897 0.175883,0.3915519 0.0137,0.1385602 0.01156,0.2868772 0.01156,0.5147702 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4984" />
<path
d="m 45.900031,-5.6889027 c -1.56e-4,0.1884622 -0.0045,0.2960245 0.0014,0.4029534 0.128075,2.853e-4 0.38981,0.00676 0.325949,0.00344 l -1.39e-4,0.1054309 v 0.3556467 c 0,0 -0.204277,-1.388e-4 -0.306416,0 -0.276552,3.759e-4 -0.618616,0.00213 -0.829655,0.00226 -0.0042,-0.2397473 -0.0023,-0.4554667 4.08e-4,-0.4668341 0,0 0.0976,0.00163 0.189007,0.00197 0.183136,6.815e-4 0.166946,0.017973 0.166109,-0.027117 -0.0021,-0.1142859 0.002,-0.2795005 0.0012,-0.4269249 l -0.01118,-2.2559473 h -0.354419 l -0.0045,-0.3998272 h 0.824422 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4986" />
<path
d="m 48.501809,-7.0373667 q -0.331439,0 -0.501894,0.2391665 -0.170455,0.2391665 -0.170455,0.7087226 0,0.4673619 0.170455,0.7087226 0.170455,0.2391664 0.501894,0.2391664 0.333808,0 0.504263,-0.2391664 0.170454,-0.2413607 0.170454,-0.7087226 0,-0.4695561 -0.170454,-0.7087226 -0.170455,-0.2391665 -0.504263,-0.2391665 z m 0,-0.3422933 q 0.55161,0 0.842805,0.3313224 0.29356,0.3313223 0.29356,0.95886 0,0.6297319 -0.291193,0.9610541 -0.291194,0.3291282 -0.845172,0.3291282 -0.55161,0 -0.842803,-0.3291282 -0.291194,-0.3313222 -0.291194,-0.9610541 0,-0.6275377 0.291194,-0.95886 0.291193,-0.3313224 0.842803,-0.3313224 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
id="path4988" />
<path
d="m 51.964761,-6.1043033 c 0,-0.3153981 -0.05478,-0.554613 -0.164328,-0.7176449 -0.107941,-0.1645555 -0.439029,-0.1268362 -0.646856,-0.1268362 -0.217493,0 -0.394754,0.042656 -0.497818,0.2468332 -0.0023,0.1743523 0.0016,0.2822498 0.0016,0.5976479 0,0.3153981 0.05719,0.5561367 0.171579,0.7222158 0.115996,0.1645555 0.262038,0.1347607 0.481143,0.1347607 0.204605,0 0.382387,0.029033 0.490328,-0.1370461 0.109552,-0.1660792 0.164328,-0.406056 0.164328,-0.7199304 z m 0.444654,1.1358901 c 0,0.3839629 -0.09586,0.6749823 -0.287575,0.8730584 -0.191717,0.1980761 -0.459268,0.2076824 -0.706567,0.2076824 -0.247298,0 -0.33316,0.00858 -0.480462,0.00196 -0.147303,-0.00662 -0.39649,-0.028793 -0.530208,-0.069932 l -0.0045,-0.4386006 c 0.175997,0.00217 0.296741,0.00642 0.436946,0.00372 0.140205,-0.0027 0.242375,-0.00179 0.41637,-0.00179 0.173995,0 0.335605,0.014139 0.574211,-0.044752 0.119552,-0.1030316 0.110826,-0.1010778 0.134895,-0.3592803 -0.223716,-0.00621 -0.02265,-0.00143 -0.203956,7.318e-4 -0.141072,0.00169 -0.355235,0.010041 -0.530841,0.010041 -0.315768,0 -0.607522,-0.059609 -0.796017,-0.298824 -0.188494,-0.2392149 -0.243119,-0.6191825 -0.243119,-1.0199056 0,-0.4022468 0.06708,-0.7229777 0.255572,-0.9621926 0.188495,-0.239215 0.396232,-0.2914175 0.774508,-0.2965599 0.378275,-0.00514 0.57781,-0.00176 0.781477,0.00434 l 0.407313,0.00318 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4990" />
</g>
<rect
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="title-bar-button"
width="8.4672203"
height="5.6373534"
x="67.93721"
y="28.362345" />
<path
style="opacity:1;fill:none;stroke:#727272;stroke-width:0.40613541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="title-bar-button-line"
d="M 73.131727,31.089285 H 71.019288" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-client-area"
width="90.317062"
height="62.010803"
x="67.93721"
y="33.999699" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:0;stroke:#000000;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-border"
width="87.551292"
height="56.458969"
x="69.366524"
y="36.825737" />
<path
id="button-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 124.38536,84.735805 h 25.40168 v 2.900645 h -25.40168 z m 25.3985,-2.767792 h 2.81775 v 5.668438 h -2.81775 z" />
<rect
style="opacity:1;fill:#727272;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="button"
width="28.224081"
height="5.6373444"
x="121.56296"
y="79.098457" />
<g
transform="translate(71.692613,37.697864)"
id="button-text">
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.2473854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="Q-underline"
d="M 61.074994,46.475002 H 58.683557" />
<path
d="m 61.556895,45.081249 v -1.673628 h 0.452124 v 1.673628 q 0,0.364146 0.130232,0.535368 0.132689,0.17122 0.407894,0.17122 0.319436,0 0.488983,-0.219452 0.169546,-0.221864 0.169546,-0.634242 v -1.526522 h 0.454582 v 2.696132 H 63.205674 V 45.69861 q -0.120402,0.233922 -0.329264,0.3545 -0.206404,0.120579 -0.484068,0.120579 -0.422638,0 -0.629042,-0.270097 -0.206405,-0.272507 -0.206405,-0.822343 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4661" />
<path
d="m 64.87924,43.518911 0.785453,4.86e-4 0.01049,2.155477 0.316588,-0.0044 0.0042,0.440206 -1.08948,0.0087 0.01253,-0.448935 h 0.31241 l -0.0082,-1.694587 -0.344008,6.5e-4 z m 0.364746,-1.088502 h 0.418696 l -0.0043,0.800525 -0.415908,-4.84e-4 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.76249981px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4982-36" />
<path
d="m 68.340878,42.63592 -0.0082,0.870231 0.667564,-0.0041 0.0041,0.415134 -0.655161,-0.0041 -0.0082,1.300867 c -0.0013,0.199353 0.03618,0.338423 0.108529,0.417201 0.07235,0.07878 0.198587,0.118167 0.378699,0.118167 h 0.477992 v 0.354501 h -0.519556 c -0.318661,0 -0.543417,-0.06672 -0.674269,-0.200161 -0.130851,-0.133439 -0.196277,-0.363343 -0.196277,-0.689708 l -0.0041,-1.305001 c -0.332119,0 -0.359412,0.0041 -0.686298,0.01654 l -0.0041,-0.427537 h 0.686297 l 0.0082,-0.861963 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4665" />
<path
id="path4722"
transform="matrix(0.26458333,0,0,0.26458333,-75.17538,-41.201563)"
d="m 510.18359,316.11914 c -1.46621,0 -2.55977,0.58334 -3.28125,1.75 -0.71566,1.16667 -1.07226,2.93858 -1.07226,5.31445 0,2.36979 0.35661,4.13802 1.07226,5.30469 0.72148,1.16667 1.8091,1.75 3.26368,1.75 0.0465,0 0.10796,-0.004 0.18359,-0.01 -0.0488,0.12717 1.33074,-0.19815 1.57569,-0.41698 l 1.28368,0.84276 1.26563,-0.56055 -1.06836,-1.21875 c 0.32119,-0.33486 0.4522,-0.54975 0.64258,-0.95312 0.1363,-0.31537 0.5,-2.95183 0.5,-4.73829 0,-2.37587 -0.36056,-4.14778 -1.08203,-5.31445 -0.71565,-1.16666 -1.81117,-1.75 -3.28321,-1.75 z m 0,1.49414 c 0.89602,0 1.53987,0.42839 1.92969,1.28516 0.39565,0.85677 0.59375,2.28406 0.59375,4.2832 0,1.99913 -0.1981,3.42838 -0.59375,4.28516 -0.30165,-0.10534 -0.78096,-0.85138 -1.30469,-0.84571 l -1.45507,0.31641 1.03906,1.17969 0.4375,0.52539 c 0.0131,-7.4e-4 0.0224,-0.005 0.0351,-0.006 -0.20919,0.0651 -0.43368,0.10547 -0.68164,0.10547 -0.8902,0 -1.53209,-0.42839 -1.92773,-1.28516 -0.38983,-0.85677 -0.58398,-2.28233 -0.58398,-4.27539 -10e-6,-1.99914 0.19416,-3.42643 0.58398,-4.2832 0.39564,-0.85677 1.03753,-1.28516 1.92773,-1.28516 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
id="grid"
d="M 0.19939842,0.00358645 V 135.70594 M 3.0218084,0.00358645 V 135.70594 M 5.8442174,0.00358645 V 135.70594 M 8.6666254,0.00358645 V 135.70594 M 11.489038,0.00358645 V 135.70594 M 14.311447,0.00358645 V 135.70594 M 17.133854,0.00358645 V 135.70594 M 19.956264,0.00358645 V 135.70594 M 22.778672,0.00358645 V 135.70594 M 25.60108,0.00358645 V 135.70594 M 28.42349,0.00358645 V 135.70594 M 31.245898,0.00358645 V 135.70594 M 34.068306,0.00358645 V 135.70594 M 36.890714,0.00358645 V 135.70594 M 39.713123,0.00358645 V 135.70594 M 42.535532,0.00358645 V 135.70594 M 45.35794,0.00358645 V 135.70594 M 48.180349,0.00358645 V 135.70594 M 51.00276,0.00358645 V 135.70594 M 53.82517,0.00358645 V 135.70594 M 56.647575,0.00358645 V 135.70594 M 59.469985,0.00358645 V 135.70594 M 62.292391,0.00358645 V 135.70594 M 65.114806,0.00358645 V 135.70594 M 67.937211,0.00358645 V 135.70594 M 70.759622,0.00358645 V 135.70594 M 73.582026,0.00358645 V 135.70594 M 76.404432,0.00358645 V 135.70594 M 79.226847,0.00358645 V 135.70594 M 82.049252,0.00358645 V 135.70594 M 84.871663,0.00358645 V 135.70594 M 87.694067,0.00358645 V 135.70594 M 90.516478,0.00358645 V 135.70594 M 93.338889,0.00358645 V 135.70594 M 96.161298,0.00358645 V 135.70594 M 98.983704,0.00358645 V 135.70594 M 101.8061,0.00358645 V 135.70594 M 104.6285,0.00358645 V 135.70594 M 107.45091,0.00358645 V 135.70594 M 110.27332,0.00358645 V 135.70594 M 113.09573,0.00358645 V 135.70594 M 115.91813,0.00358645 V 135.70594 M 118.74054,0.00358645 V 135.70594 M 121.56296,0.00358645 V 135.70594 M 124.38536,0.00358645 V 135.70594 M 127.20777,0.00358645 V 135.70594 M 130.03017,0.00358645 V 135.70594 M 132.85259,0.00358645 V 135.70594 M 135.67499,0.00358645 V 135.70594 M 138.49741,0.00358645 V 135.70594 M 141.31982,0.00358645 V 135.70594 M 144.14222,0.00358645 V 135.70594 M 146.96463,0.00358645 V 135.70594 M 149.78704,0.00358645 V 135.70594 M 152.60945,0.00358645 V 135.70594 M 155.43186,0.00358645 V 135.70594 M 158.25427,0.00358645 V 135.70594 M 161.07667,0.00358645 V 135.70594 M 163.89908,0.00358645 V 135.70594 M 166.72149,0.00358645 V 135.70594 M 169.5439,0.00358645 V 135.70594 M 172.36631,0.00358645 V 135.70594 M 175.18871,0.00358645 V 135.70594 M 178.01112,0.00358645 V 135.70594 M 180.83353,0.00358645 V 135.70594 M 183.65594,0.00358645 V 135.70594 M 186.47835,0.00358645 V 135.70594 M 189.30076,0.00358645 V 135.70594 M 192.12317,0.00358645 V 135.70594 M 194.94557,0.00358645 V 135.70594 M 197.76799,0.00358645 V 135.70594 M 200.59039,0.00358645 V 135.70594 M 203.41281,0.00358645 V 135.70594 M 206.23521,0.00358645 V 135.70594 M 209.05761,0.00358645 V 135.70594 M 211.88003,0.00358645 V 135.70594 M 214.70243,0.00358645 V 135.70594 M 217.52485,0.00358645 V 135.70594 M 220.34725,0.00358645 V 135.70594 M 223.16966,0.00358645 V 135.70594 M 225.99207,0.00358645 V 135.70594 M 0.19939842,0.17562045 H 226.19405 M 0.19939842,5.8129634 H 226.19405 M 0.19939842,11.450306 H 226.19405 M 0.19939842,17.087659 H 226.19405 M 0.19939842,22.725002 H 226.19405 M 0.19939842,28.362345 H 226.19405 M 0.19939842,33.999698 H 226.19405 M 0.19939842,39.637041 H 226.19405 M 0.19939842,45.274384 H 226.19405 M 0.19939842,50.911727 H 226.19405 M 0.19939842,56.54908 H 226.19405 M 0.19939842,62.186423 H 226.19405 M 0.19939842,67.823776 H 226.19405 M 0.19939842,73.461119 H 226.19405 M 0.19939842,79.098462 H 226.19405 M 0.19939842,84.735805 H 226.19405 M 0.19939842,90.373158 H 226.19405 M 0.19939842,96.010501 H 226.19405 M 0.19939842,101.64789 H 226.19405 M 0.19939842,107.28523 H 226.19405 M 0.19939842,112.92258 H 226.19405 M 0.19939842,118.55993 H 226.19405 M 0.19939842,124.19727 H 226.19405 M 0.19939842,129.83461 H 226.19405 M 0.19939842,135.47196 H 226.19405"
style="fill:none;stroke:#7c7c7c;stroke-width:0.106363;stroke-dasharray:0.212725, 0.106363, 0.053181, 0.106363;stroke-opacity:0.57478602" />
</g>
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.26458299"
font-size="3.880556"
x="195.95805"
y="120.19452"
id="text79">getDesktopWidth() = 80</text>
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.26458299"
font-size="3.880556"
x="196.55679"
y="125.13338"
id="text81">getDesktopHeight() = 24</text>
<path
d="M 79.217364,0.22472627 V 30.998882"
id="path83"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#r-9);marker-end:url(#c-2)" />
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
font-size="3.88055611"
x="28.494898"
y="9.6283751"
id="text89">
<tspan
x="28.494898"
y="9.6283751"
id="tspan85">getPos() = (25,6)</tspan>
<tspan
x="28.494898"
y="14.920043"
id="tspan87">getTermPos() = (25,6)</tspan>
</text>
<text
font-size="3.880556"
x="80.911568"
y="13.147828"
id="text97"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">
<tspan
font-size="3.880556"
x="80.911568"
y="13.147828"
id="tspan93"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getY() = 6</tspan>
<tspan
font-size="3.880556"
x="80.911568"
y="17.998522"
id="tspan95"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getTermY() = 6</tspan>
</text>
<path
d="M 68.681659,39.660894 H 0.24701944"
id="path91"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#a-3);marker-end:url(#r-9)" />
<path
d="M 69.044694,30.9307 52.569957,16.081284"
id="path99"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#a-3)" />
<text
font-size="3.880556"
x="23.529711"
y="38.200218"
id="text105"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">
<tspan
font-size="3.880556"
x="23.529711"
y="38.200218"
id="tspan101"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getX() = 25</tspan>
<tspan
font-size="3.880556"
x="23.529711"
y="43.050911"
id="tspan103"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getTermX() = 25</tspan>
</text>
<path
style="fill:none;stroke:#4f4f4f;stroke-width:3.60800004;stroke-linejoin:round"
d="M -1.6787666,-1.6996988 H 227.87363 V 137.34287 H -1.6787666 Z"
id="path163" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#aa4f5d;fill-opacity:1;stroke-width:0.26458299"
font-size="3.880556"
x="7.6337833"
y="4.3176794"
id="text81-3">
<tspan
y="4.3176794"
x="7.6337833"
id="tspan4561">(1,1)</tspan>
</text>
<rect
y="0.17561977"
x="0.19939597"
height="5.6135254"
width="2.8310132"
id="rect4575"
style="opacity:1;fill:#aa4f5d;fill-opacity:0.27777782;stroke:#aa4f5d;stroke-width:0.13229166;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#aa4f5d;fill-opacity:1;stroke-width:0.26458299"
font-size="3.880556"
x="217.05225"
y="133.3719"
id="text81-3-0">
<tspan
y="133.3719"
x="217.05225"
id="tspan4598">(80,24)</tspan>
</text>
<rect
y="129.86887"
x="223.19901"
height="5.6135254"
width="2.8310132"
id="rect4575-1"
style="opacity:1;fill:#aa4f5d;fill-opacity:0.27777782;stroke:#aa4f5d;stroke-width:0.13229166;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 122.40614,81.759513 H 70.75244"
id="path91-3"
style="fill:none;stroke:#000000;stroke-width:0.40613502;marker-start:url(#a-3);marker-end:url(#s-7)" />
<text
font-size="3.880556"
x="83.122948"
y="80.298859"
id="text105-5"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">
<tspan
font-size="3.880556"
x="83.122948"
y="80.298859"
id="tspan101-6"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getX() = 19</tspan>
<tspan
font-size="3.880556"
x="83.122948"
y="85.149551"
id="tspan103-2"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getTermX() = 44</tspan>
</text>
<path
d="M 124.41247,39.600857 V 80.403768"
id="path83-0"
style="fill:none;stroke:#000000;stroke-width:0.40613541;marker-start:url(#r-9);marker-end:url(#c-2);stroke-miterlimit:4;stroke-dasharray:none" />
<text
font-size="3.880556"
x="126.10664"
y="59.332214"
id="text97-9"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">
<tspan
font-size="3.880556"
x="126.10664"
y="59.332214"
id="tspan93-3"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getY() = 8</tspan>
<tspan
font-size="3.880556"
x="126.10664"
y="64.182915"
id="tspan95-6"
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299">getTermY() = 15</tspan>
</text>
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
font-size="3.88055611"
x="81.139328"
y="58.211746"
id="text89-2">
<tspan
x="81.139328"
y="58.211746"
id="tspan85-6"
style="stroke-width:0.26458299">getPos() = (19,8)</tspan>
<tspan
x="81.139328"
y="63.503418"
id="tspan87-1"
style="stroke-width:0.26458299">getTermPos() = (44,15)</tspan>
</text>
<path
d="M 122.21838,79.514056 105.74357,64.664639"
id="path99-8"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#b-0)" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#aa4f5d;fill-opacity:1;stroke-width:0.26458299"
font-size="3.880556"
x="216.86626"
y="4.3176794"
id="text81-3-0-7">
<tspan
y="4.3176794"
x="216.86626"
id="tspan5248">(80,1)</tspan>
</text>
<rect
y="0.16718166"
x="223.17175"
height="5.6135254"
width="2.8310132"
id="rect4575-1-2"
style="opacity:1;fill:#aa4f5d;fill-opacity:0.27777782;stroke:#aa4f5d;stroke-width:0.13229166;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777767px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#aa4f5d;fill-opacity:1;stroke-width:0.26458299"
font-size="3.880556"
x="8.6122913"
y="133.3719"
id="text81-3-9">
<tspan
y="133.3719"
x="8.6122913"
id="tspan4561-3"
style="stroke-width:0.26458299">(1,24)</tspan>
</text>
<rect
y="129.86887"
x="0.19944175"
height="5.6135254"
width="2.8310132"
id="rect4575-6"
style="opacity:1;fill:#aa4f5d;fill-opacity:0.27777782;stroke:#aa4f5d;stroke-width:0.13229166;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

481
doc/widget-geometry.svg Normal file
View File

@ -0,0 +1,481 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
height="142.65057mm"
viewBox="-3.4827666 -3.5036988 233.1604 142.65057"
width="233.1604mm"
version="1.1"
id="svg165">
<metadata
id="metadata171">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs169">
<marker
id="b-0-367"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path5-6-5"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="b-0-3"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path5-6-6"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="b-0-3-5"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path5-6-6-3"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="b-0-36"
orient="auto"
overflow="visible"
refX="0"
refY="0"
style="overflow:visible">
<path
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(0.6)"
id="path5-6-7"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round" />
</marker>
</defs>
<g
id="Terminal">
<rect
y="-1.6996995"
x="-1.6787703"
height="139.04257"
width="229.55241"
id="background"
style="opacity:1;fill:#98b5ef;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
<path
id="dialog-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613544;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 73.582026,96.010501 h 84.672244 v 5.637389 H 73.582028 Z M 158.25427,33.999698 h 5.64481 V 101.6479 l -5.64481,-1e-5 z" />
<rect
style="opacity:1;fill:#4d4dc0;fill-opacity:1;stroke:none;stroke-width:0.26458329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="titlebar"
width="81.849838"
height="5.637352"
x="76.404434"
y="28.362345"
ry="0" />
<g
transform="translate(71.692613,37.697864)"
aria-label="Dialog"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="title-bar-text">
<path
d="m 36.734547,-5.2188523 c 0.380342,0 0.645834,-0.099754 0.796479,-0.2992606 0.150644,-0.2011031 0.225967,-0.563408 0.225967,-1.0869146 0,-0.5282949 -0.07532,-0.8921958 -0.225967,-1.0917029 -0.149153,-0.2011032 -0.414646,-0.3016548 -0.796479,-0.3016548 h -0.214781 v 2.7795329 z m 0.0089,-3.176951 c 0.510105,0 0.959924,0.038483 1.201552,0.3289651 0.241628,0.2904823 0.28849,0.8489248 0.28849,1.4618107 0,0.6096937 -0.05097,1.1409181 -0.292598,1.4314005 -0.241629,0.2888862 -0.687339,0.3521929 -1.197444,0.3521929 h -0.677902 v -3.5743692 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4980" />
<path
d="m 39.416509,-7.374682 0.802684,4.768e-4 0.01072,2.1092046 0.323533,-0.00427 0.0043,0.4307556 -1.11338,0.00854 0.01281,-0.4392963 h 0.319263 l -0.0084,-1.6582097 -0.351555,6.36e-4 z m 0.372748,-1.0651357 h 0.427881 l -0.0044,0.78334 -0.425031,-4.739e-4 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4982" />
<path
d="m 43.125816,-6.0642176 h -0.27473 c -0.249596,0 -0.406952,-0.022255 -0.534076,0.066111 -0.125574,0.086816 -0.188361,0.217041 -0.188361,0.3906738 0,0.1565796 -0.0093,0.177762 0.09181,0.2675815 0.119043,0.1057463 0.200316,0.063855 0.367748,0.063855 0.235644,0 0.606933,-0.00609 0.84811,-0.022709 -0.0072,-0.223167 -0.0098,-0.3086156 -0.01715,-0.622359 v -0.1443988 z m 0.78146,-0.052714 -0.01329,1.2910685 -0.470069,0.00443 c -0.383705,0.023525 -0.613681,-0.015785 -0.877687,0.00543 -0.2651,0 -0.450139,-0.012404 -0.608269,-0.1612326 -0.15813,-0.1503784 -0.237195,-0.3511413 -0.237195,-0.6022888 0,-0.2899047 0.09689,-0.5100463 0.29068,-0.6604247 0.195337,-0.1503784 0.481366,-0.2255676 0.858087,-0.2255676 h 0.574384 v -0.067438 c -0.0015,-0.2077528 0.02628,-0.3111209 -0.0862,-0.3697529 -0.134874,-0.00598 -0.357472,-0.011877 -0.574003,-0.015059 -0.216531,-0.00318 -0.201855,-0.00432 -0.415259,-0.00808 -0.213404,-0.00376 -0.231246,-0.00347 -0.455954,-0.014158 l -0.001,-0.3673202 c 0.188279,-0.043006 0.323439,-0.05143 0.475607,-0.068437 0.152169,-0.017007 0.216267,-0.024363 0.392225,-0.024363 0.175959,0 0.545366,0.00521 0.697295,0.068767 0.153479,0.063562 0.09339,0.025958 0.258827,0.144224 0.06634,0.04776 0.147125,0.2290897 0.175883,0.3915519 0.0137,0.1385602 0.01156,0.2868772 0.01156,0.5147702 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4984" />
<path
d="m 45.900031,-5.6889027 c -1.56e-4,0.1884622 -0.0045,0.2960245 0.0014,0.4029534 0.128075,2.853e-4 0.38981,0.00676 0.325949,0.00344 l -1.39e-4,0.1054309 v 0.3556467 c 0,0 -0.204277,-1.388e-4 -0.306416,0 -0.276552,3.759e-4 -0.618616,0.00213 -0.829655,0.00226 -0.0042,-0.2397473 -0.0023,-0.4554667 4.08e-4,-0.4668341 0,0 0.0976,0.00163 0.189007,0.00197 0.183136,6.815e-4 0.166946,0.017973 0.166109,-0.027117 -0.0021,-0.1142859 0.002,-0.2795005 0.0012,-0.4269249 l -0.01118,-2.2559473 h -0.354419 l -0.0045,-0.3998272 h 0.824422 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4986" />
<path
d="m 48.501809,-7.0373667 q -0.331439,0 -0.501894,0.2391665 -0.170455,0.2391665 -0.170455,0.7087226 0,0.4673619 0.170455,0.7087226 0.170455,0.2391664 0.501894,0.2391664 0.333808,0 0.504263,-0.2391664 0.170454,-0.2413607 0.170454,-0.7087226 0,-0.4695561 -0.170454,-0.7087226 -0.170455,-0.2391665 -0.504263,-0.2391665 z m 0,-0.3422933 q 0.55161,0 0.842805,0.3313224 0.29356,0.3313223 0.29356,0.95886 0,0.6297319 -0.291193,0.9610541 -0.291194,0.3291282 -0.845172,0.3291282 -0.55161,0 -0.842803,-0.3291282 -0.291194,-0.3313222 -0.291194,-0.9610541 0,-0.6275377 0.291194,-0.95886 0.291193,-0.3313224 0.842803,-0.3313224 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
id="path4988" />
<path
d="m 51.964761,-6.1043033 c 0,-0.3153981 -0.05478,-0.554613 -0.164328,-0.7176449 -0.107941,-0.1645555 -0.439029,-0.1268362 -0.646856,-0.1268362 -0.217493,0 -0.394754,0.042656 -0.497818,0.2468332 -0.0023,0.1743523 0.0016,0.2822498 0.0016,0.5976479 0,0.3153981 0.05719,0.5561367 0.171579,0.7222158 0.115996,0.1645555 0.262038,0.1347607 0.481143,0.1347607 0.204605,0 0.382387,0.029033 0.490328,-0.1370461 0.109552,-0.1660792 0.164328,-0.406056 0.164328,-0.7199304 z m 0.444654,1.1358901 c 0,0.3839629 -0.09586,0.6749823 -0.287575,0.8730584 -0.191717,0.1980761 -0.459268,0.2076824 -0.706567,0.2076824 -0.247298,0 -0.33316,0.00858 -0.480462,0.00196 -0.147303,-0.00662 -0.39649,-0.028793 -0.530208,-0.069932 l -0.0045,-0.4386006 c 0.175997,0.00217 0.296741,0.00642 0.436946,0.00372 0.140205,-0.0027 0.242375,-0.00179 0.41637,-0.00179 0.173995,0 0.335605,0.014139 0.574211,-0.044752 0.119552,-0.1030316 0.110826,-0.1010778 0.134895,-0.3592803 -0.223716,-0.00621 -0.02265,-0.00143 -0.203956,7.318e-4 -0.141072,0.00169 -0.355235,0.010041 -0.530841,0.010041 -0.315768,0 -0.607522,-0.059609 -0.796017,-0.298824 -0.188494,-0.2392149 -0.243119,-0.6191825 -0.243119,-1.0199056 0,-0.4022468 0.06708,-0.7229777 0.255572,-0.9621926 0.188495,-0.239215 0.396232,-0.2914175 0.774508,-0.2965599 0.378275,-0.00514 0.57781,-0.00176 0.781477,0.00434 l 0.407313,0.00318 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4990" />
</g>
<rect
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="title-bar-button"
width="8.4672203"
height="5.6373534"
x="67.93721"
y="28.362345" />
<path
style="opacity:1;fill:none;stroke:#727272;stroke-width:0.40613541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="title-bar-button-line"
d="M 73.131727,31.089285 H 71.019288" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-client-area"
width="90.317062"
height="62.010803"
x="67.93721"
y="33.999699" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:0;stroke:#000000;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-border"
width="87.551292"
height="56.458969"
x="69.366524"
y="36.825737" />
<path
id="button-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 124.38536,84.735805 h 25.40168 v 2.900645 h -25.40168 z m 25.3985,-2.767792 h 2.81775 v 5.668438 h -2.81775 z" />
<rect
style="opacity:1;fill:#727272;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="button"
width="28.224081"
height="5.6373444"
x="121.56296"
y="79.098457" />
<g
transform="translate(71.692613,37.697864)"
id="button-text">
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.2473854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="Q-underline"
d="M 61.074994,46.475002 H 58.683557" />
<path
d="m 61.556895,45.081249 v -1.673628 h 0.452124 v 1.673628 q 0,0.364146 0.130232,0.535368 0.132689,0.17122 0.407894,0.17122 0.319436,0 0.488983,-0.219452 0.169546,-0.221864 0.169546,-0.634242 v -1.526522 h 0.454582 v 2.696132 H 63.205674 V 45.69861 q -0.120402,0.233922 -0.329264,0.3545 -0.206404,0.120579 -0.484068,0.120579 -0.422638,0 -0.629042,-0.270097 -0.206405,-0.272507 -0.206405,-0.822343 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4661" />
<path
d="m 64.87924,43.518911 0.785453,4.86e-4 0.01049,2.155477 0.316588,-0.0044 0.0042,0.440206 -1.08948,0.0087 0.01253,-0.448935 h 0.31241 l -0.0082,-1.694587 -0.344008,6.5e-4 z m 0.364746,-1.088502 h 0.418696 l -0.0043,0.800525 -0.415908,-4.84e-4 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.76249981px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4982-36" />
<path
d="m 68.340878,42.63592 -0.0082,0.870231 0.667564,-0.0041 0.0041,0.415134 -0.655161,-0.0041 -0.0082,1.300867 c -0.0013,0.199353 0.03618,0.338423 0.108529,0.417201 0.07235,0.07878 0.198587,0.118167 0.378699,0.118167 h 0.477992 v 0.354501 h -0.519556 c -0.318661,0 -0.543417,-0.06672 -0.674269,-0.200161 -0.130851,-0.133439 -0.196277,-0.363343 -0.196277,-0.689708 l -0.0041,-1.305001 c -0.332119,0 -0.359412,0.0041 -0.686298,0.01654 l -0.0041,-0.427537 h 0.686297 l 0.0082,-0.861963 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4665" />
<path
id="path4722"
transform="matrix(0.26458333,0,0,0.26458333,-75.17538,-41.201563)"
d="m 510.18359,316.11914 c -1.46621,0 -2.55977,0.58334 -3.28125,1.75 -0.71566,1.16667 -1.07226,2.93858 -1.07226,5.31445 0,2.36979 0.35661,4.13802 1.07226,5.30469 0.72148,1.16667 1.8091,1.75 3.26368,1.75 0.0465,0 0.10796,-0.004 0.18359,-0.01 -0.0488,0.12717 1.33074,-0.19815 1.57569,-0.41698 l 1.28368,0.84276 1.26563,-0.56055 -1.06836,-1.21875 c 0.32119,-0.33486 0.4522,-0.54975 0.64258,-0.95312 0.1363,-0.31537 0.5,-2.95183 0.5,-4.73829 0,-2.37587 -0.36056,-4.14778 -1.08203,-5.31445 -0.71565,-1.16666 -1.81117,-1.75 -3.28321,-1.75 z m 0,1.49414 c 0.89602,0 1.53987,0.42839 1.92969,1.28516 0.39565,0.85677 0.59375,2.28406 0.59375,4.2832 0,1.99913 -0.1981,3.42838 -0.59375,4.28516 -0.30165,-0.10534 -0.78096,-0.85138 -1.30469,-0.84571 l -1.45507,0.31641 1.03906,1.17969 0.4375,0.52539 c 0.0131,-7.4e-4 0.0224,-0.005 0.0351,-0.006 -0.20919,0.0651 -0.43368,0.10547 -0.68164,0.10547 -0.8902,0 -1.53209,-0.42839 -1.92773,-1.28516 -0.38983,-0.85677 -0.58398,-2.28233 -0.58398,-4.27539 -10e-6,-1.99914 0.19416,-3.42643 0.58398,-4.2832 0.39564,-0.85677 1.03753,-1.28516 1.92773,-1.28516 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
id="grid"
d="M 0.19939842,0.00358645 V 135.70594 M 3.0218084,0.00358645 V 135.70594 M 5.8442174,0.00358645 V 135.70594 M 8.6666254,0.00358645 V 135.70594 M 11.489038,0.00358645 V 135.70594 M 14.311447,0.00358645 V 135.70594 M 17.133854,0.00358645 V 135.70594 M 19.956264,0.00358645 V 135.70594 M 22.778672,0.00358645 V 135.70594 M 25.60108,0.00358645 V 135.70594 M 28.42349,0.00358645 V 135.70594 M 31.245898,0.00358645 V 135.70594 M 34.068306,0.00358645 V 135.70594 M 36.890714,0.00358645 V 135.70594 M 39.713123,0.00358645 V 135.70594 M 42.535532,0.00358645 V 135.70594 M 45.35794,0.00358645 V 135.70594 M 48.180349,0.00358645 V 135.70594 M 51.00276,0.00358645 V 135.70594 M 53.82517,0.00358645 V 135.70594 M 56.647575,0.00358645 V 135.70594 M 59.469985,0.00358645 V 135.70594 M 62.292391,0.00358645 V 135.70594 M 65.114806,0.00358645 V 135.70594 M 67.937211,0.00358645 V 135.70594 M 70.759622,0.00358645 V 135.70594 M 73.582026,0.00358645 V 135.70594 M 76.404432,0.00358645 V 135.70594 M 79.226847,0.00358645 V 135.70594 M 82.049252,0.00358645 V 135.70594 M 84.871663,0.00358645 V 135.70594 M 87.694067,0.00358645 V 135.70594 M 90.516478,0.00358645 V 135.70594 M 93.338889,0.00358645 V 135.70594 M 96.161298,0.00358645 V 135.70594 M 98.983704,0.00358645 V 135.70594 M 101.8061,0.00358645 V 135.70594 M 104.6285,0.00358645 V 135.70594 M 107.45091,0.00358645 V 135.70594 M 110.27332,0.00358645 V 135.70594 M 113.09573,0.00358645 V 135.70594 M 115.91813,0.00358645 V 135.70594 M 118.74054,0.00358645 V 135.70594 M 121.56296,0.00358645 V 135.70594 M 124.38536,0.00358645 V 135.70594 M 127.20777,0.00358645 V 135.70594 M 130.03017,0.00358645 V 135.70594 M 132.85259,0.00358645 V 135.70594 M 135.67499,0.00358645 V 135.70594 M 138.49741,0.00358645 V 135.70594 M 141.31982,0.00358645 V 135.70594 M 144.14222,0.00358645 V 135.70594 M 146.96463,0.00358645 V 135.70594 M 149.78704,0.00358645 V 135.70594 M 152.60945,0.00358645 V 135.70594 M 155.43186,0.00358645 V 135.70594 M 158.25427,0.00358645 V 135.70594 M 161.07667,0.00358645 V 135.70594 M 163.89908,0.00358645 V 135.70594 M 166.72149,0.00358645 V 135.70594 M 169.5439,0.00358645 V 135.70594 M 172.36631,0.00358645 V 135.70594 M 175.18871,0.00358645 V 135.70594 M 178.01112,0.00358645 V 135.70594 M 180.83353,0.00358645 V 135.70594 M 183.65594,0.00358645 V 135.70594 M 186.47835,0.00358645 V 135.70594 M 189.30076,0.00358645 V 135.70594 M 192.12317,0.00358645 V 135.70594 M 194.94557,0.00358645 V 135.70594 M 197.76799,0.00358645 V 135.70594 M 200.59039,0.00358645 V 135.70594 M 203.41281,0.00358645 V 135.70594 M 206.23521,0.00358645 V 135.70594 M 209.05761,0.00358645 V 135.70594 M 211.88003,0.00358645 V 135.70594 M 214.70243,0.00358645 V 135.70594 M 217.52485,0.00358645 V 135.70594 M 220.34725,0.00358645 V 135.70594 M 223.16966,0.00358645 V 135.70594 M 225.99207,0.00358645 V 135.70594 M 0.19939842,0.17562045 H 226.19405 M 0.19939842,5.8129634 H 226.19405 M 0.19939842,11.450306 H 226.19405 M 0.19939842,17.087659 H 226.19405 M 0.19939842,22.725002 H 226.19405 M 0.19939842,28.362345 H 226.19405 M 0.19939842,33.999698 H 226.19405 M 0.19939842,39.637041 H 226.19405 M 0.19939842,45.274384 H 226.19405 M 0.19939842,50.911727 H 226.19405 M 0.19939842,56.54908 H 226.19405 M 0.19939842,62.186423 H 226.19405 M 0.19939842,67.823776 H 226.19405 M 0.19939842,73.461119 H 226.19405 M 0.19939842,79.098462 H 226.19405 M 0.19939842,84.735805 H 226.19405 M 0.19939842,90.373158 H 226.19405 M 0.19939842,96.010501 H 226.19405 M 0.19939842,101.64789 H 226.19405 M 0.19939842,107.28523 H 226.19405 M 0.19939842,112.92258 H 226.19405 M 0.19939842,118.55993 H 226.19405 M 0.19939842,124.19727 H 226.19405 M 0.19939842,129.83461 H 226.19405 M 0.19939842,135.47196 H 226.19405"
style="fill:none;stroke:#7c7c7c;stroke-width:0.106363;stroke-dasharray:0.212725, 0.106363, 0.053181, 0.106363;stroke-opacity:0.57478602" />
</g>
<path
style="fill:none;stroke:#4f4f4f;stroke-width:3.60800004;stroke-linejoin:round"
d="M -1.6787666,-1.6996976 H 227.87363 V 137.34287 H -1.6787666 Z"
id="path163" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055563px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="41.527641"
y="4.9554229"
id="text89">
<tspan
style="stroke-width:0.26458299"
id="tspan4726"
x="41.527641"
y="4.9554229">getSize() = FSize(32,12)</tspan>
</text>
<path
d="m 141.17255,88.237306 23.08169,15.614314"
id="path99-8"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#b-0-367)" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="57.409531"
y="15.56948"
id="text89-30">
<tspan
style="stroke-width:0.26458299"
y="15.56948"
x="57.409531"
id="tspan4726-3">= FPoint(25,6), FPoint(56,17)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="32.320133"
y="10.262449"
id="text89-30-0">
<tspan
style="stroke-width:0.26458299"
y="10.262449"
x="32.320133"
id="tspan4726-3-9">getGeometry() = FPoint(25,6), FSize(32,12)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="23.297857"
y="20.876522"
id="text89-30-2">
<tspan
style="stroke-width:0.26458299"
y="20.876522"
x="23.297857"
id="tspan4726-3-5">getTermGeometry() = FPoint(25,6), FSize(32,12)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="57.409531"
y="26.183567"
id="text89-30-4">
<tspan
style="stroke-width:0.26458299"
y="26.183567"
x="57.409531"
id="tspan4726-3-0">= FPoint(25,6), FPoint(56,17)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="35.089531"
y="107.47711"
id="text89-30-2-0">
<tspan
style="stroke-width:0.26458299"
y="107.47711"
x="35.089531"
id="tspan4726-3-5-3">getShadow() = FSize(2,1)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="10.800667"
y="112.85639"
id="text89-30-4-0">
<tspan
style="stroke-width:0.26458299"
y="112.85639"
x="10.800667"
id="tspan4726-3-0-9">getGeometryWithShadow() = FPoint(25,6), FSize(34,13)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="57.209534"
y="118.22402"
id="text89-30-4-0-2">
<tspan
style="stroke-width:0.26458299"
y="118.22402"
x="57.209534"
id="tspan4726-3-0-9-5">= FPoint(25,6), FPoint(58,18)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="1.7888864"
y="123.61495"
id="text89-30-4-0-4">
<tspan
style="stroke-width:0.26458299"
y="123.61495"
x="1.7888864"
id="tspan4726-3-0-9-0">getTermGeometryWithShadow() = FPoint(25,6), FSize(34,13)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="57.209534"
y="128.98253"
id="text89-30-4-0-2-5">
<tspan
style="stroke-width:0.26458299"
y="128.98253"
x="57.209534"
id="tspan4726-3-0-9-5-9">= FPoint(25,6), FPoint(58,18)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="157.04732"
y="4.9555144"
id="text89-7">
<tspan
style="stroke-width:0.26458299"
id="tspan4726-7"
x="157.04732"
y="4.9555144">getSize() = FSize(10,1)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="172.90981"
y="15.569555"
id="text89-30-5">
<tspan
style="stroke-width:0.26458299"
y="15.569555"
x="172.90981"
id="tspan4726-3-4">= FPoint(19,8), FPoint(28,8)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="147.83995"
y="10.262533"
id="text89-30-0-8">
<tspan
style="stroke-width:0.26458299"
y="10.262533"
x="147.83995"
id="tspan4726-3-9-1">getGeometry() = FPoint(19,8), FSize(10,1)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="138.81775"
y="20.876591"
id="text89-30-2-2">
<tspan
style="stroke-width:0.26458299"
y="20.876591"
x="138.81775"
id="tspan4726-3-5-8">getTermGeometry() = FPoint(44,15), FSize(10,1)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="172.90981"
y="26.183636"
id="text89-30-4-9">
<tspan
style="stroke-width:0.26458299"
y="26.183636"
x="172.90981"
id="tspan4726-3-0-3">= FPoint(44,15), FPoint(53,15)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="150.6093"
y="107.47724"
id="text89-30-2-0-6">
<tspan
style="stroke-width:0.26458299"
y="107.47724"
x="150.6093"
id="tspan4726-3-5-3-8">getShadow() = FSize(1,1)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="126.32072"
y="112.8565"
id="text89-30-4-0-0">
<tspan
style="stroke-width:0.26458299"
y="112.8565"
x="126.32072"
id="tspan4726-3-0-9-2">getGeometryWithShadow() = FPoint(19,8), FSize(11,2)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="172.90981"
y="118.22413"
id="text89-30-4-0-2-1">
<tspan
style="stroke-width:0.26458299"
y="118.22413"
x="172.90981"
id="tspan4726-3-0-9-5-0">= FPoint(19,8), FPoint(29,9)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="117.30885"
y="123.61508"
id="text89-30-4-0-4-5">
<tspan
style="stroke-width:0.26458299"
y="123.61508"
x="117.30885"
id="tspan4726-3-0-9-0-1">getTermGeometryWithShadow() = FPoint(44,15), FSize(11,2)</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88055587px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="172.90981"
y="128.98267"
id="text89-30-4-0-2-5-1">
<tspan
style="stroke-width:0.26458299"
y="128.98267"
x="172.90981"
id="tspan4726-3-0-9-5-9-0">= FPoint(44,15), FPoint(54,16)</tspan>
</text>
<path
d="M 72.941072,98.826256 46.406441,104.33931"
id="path99-8-7"
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#b-0-3)" />
<path
d="M 67.351122,31.942493 40.816491,21.944363"
id="path99-8-7-5"
style="fill:none;stroke:#000000;stroke-width:0.40613502;marker-start:url(#b-0-3-5)" />
<path
d="M 140.84178,77.363839 158.05881,22.058096"
id="path99-8-5"
style="fill:none;stroke:#000000;stroke-width:0.40613505;marker-start:url(#b-0-36)" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="3.8918011"
y="71.00386"
id="text89-30-2-0-6-3">
<tspan
style="stroke-width:0.26458299"
id="tspan4894"
x="3.8918011"
y="71.00386">FDialog()</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
font-size="3.88055611"
x="182.95201"
y="71.079964"
id="text89-30-2-0-6-3-4">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
y="71.079964"
x="182.95201"
id="tspan4894-0">FButton()</tspan>
</text>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

702
doc/widget-lengths.svg Normal file
View File

@ -0,0 +1,702 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
height="142.65057mm"
viewBox="-3.4827666 -3.5036988 233.1604 142.65057"
width="233.1604mm"
version="1.1"
id="svg165">
<metadata
id="metadata171">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs169">
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="i-3">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path26-6"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="h-7">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path23-5"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="k-3">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path32-5"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="j-6">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path29-2"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="r-91">
<path
style="fill:none;stroke:#000000;stroke-width:1.00000003pt"
id="path53-2"
transform="scale(0.8)"
d="M 0,5.65 V -5.65" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="c-7">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path8-0"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="a-9">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path2-3"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="s-6">
<path
style="fill:none;stroke:#000000;stroke-width:1.00000003pt"
id="path56-0"
transform="scale(0.8)"
d="M 0,5.65 V -5.65" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="b-6">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path5-2"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="e-6">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path14-1"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="d-8">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path11-7"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="g-9">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path20-2"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="f-0">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path17-2"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="m-3">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path38-7"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="l-5">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path35-9"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="o-2">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path44-2"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="n-8">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path41-9"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="q-7">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path50-3"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="p-6">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path47-1"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="t-2">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path59-9"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="u-3">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path62-1"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="v-9">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path65-4"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="w-7">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path68-8"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="e-3-4">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path14-6-5"
transform="scale(0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
<marker
style="overflow:visible"
refY="0"
refX="0"
overflow="visible"
orient="auto"
id="d-7-0">
<path
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round"
id="path11-5-3"
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" />
</marker>
</defs>
<g
id="Terminal">
<rect
y="-1.6996995"
x="-1.6787703"
height="139.04257"
width="229.55241"
id="background"
style="opacity:1;fill:#98b5ef;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
<path
id="dialog-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613544;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 73.582026,96.010501 h 84.672244 v 5.637389 H 73.582028 Z M 158.25427,33.999698 h 5.64481 V 101.6479 l -5.64481,-1e-5 z" />
<rect
style="opacity:1;fill:#4d4dc0;fill-opacity:1;stroke:none;stroke-width:0.26458329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="titlebar"
width="81.849838"
height="5.637352"
x="76.404434"
y="28.362345"
ry="0" />
<g
transform="translate(71.692613,37.697864)"
aria-label="Dialog"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="title-bar-text">
<path
d="m 36.734547,-5.2188523 c 0.380342,0 0.645834,-0.099754 0.796479,-0.2992606 0.150644,-0.2011031 0.225967,-0.563408 0.225967,-1.0869146 0,-0.5282949 -0.07532,-0.8921958 -0.225967,-1.0917029 -0.149153,-0.2011032 -0.414646,-0.3016548 -0.796479,-0.3016548 h -0.214781 v 2.7795329 z m 0.0089,-3.176951 c 0.510105,0 0.959924,0.038483 1.201552,0.3289651 0.241628,0.2904823 0.28849,0.8489248 0.28849,1.4618107 0,0.6096937 -0.05097,1.1409181 -0.292598,1.4314005 -0.241629,0.2888862 -0.687339,0.3521929 -1.197444,0.3521929 h -0.677902 v -3.5743692 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4980" />
<path
d="m 39.416509,-7.374682 0.802684,4.768e-4 0.01072,2.1092046 0.323533,-0.00427 0.0043,0.4307556 -1.11338,0.00854 0.01281,-0.4392963 h 0.319263 l -0.0084,-1.6582097 -0.351555,6.36e-4 z m 0.372748,-1.0651357 h 0.427881 l -0.0044,0.78334 -0.425031,-4.739e-4 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4982" />
<path
d="m 43.125816,-6.0642176 h -0.27473 c -0.249596,0 -0.406952,-0.022255 -0.534076,0.066111 -0.125574,0.086816 -0.188361,0.217041 -0.188361,0.3906738 0,0.1565796 -0.0093,0.177762 0.09181,0.2675815 0.119043,0.1057463 0.200316,0.063855 0.367748,0.063855 0.235644,0 0.606933,-0.00609 0.84811,-0.022709 -0.0072,-0.223167 -0.0098,-0.3086156 -0.01715,-0.622359 v -0.1443988 z m 0.78146,-0.052714 -0.01329,1.2910685 -0.470069,0.00443 c -0.383705,0.023525 -0.613681,-0.015785 -0.877687,0.00543 -0.2651,0 -0.450139,-0.012404 -0.608269,-0.1612326 -0.15813,-0.1503784 -0.237195,-0.3511413 -0.237195,-0.6022888 0,-0.2899047 0.09689,-0.5100463 0.29068,-0.6604247 0.195337,-0.1503784 0.481366,-0.2255676 0.858087,-0.2255676 h 0.574384 v -0.067438 c -0.0015,-0.2077528 0.02628,-0.3111209 -0.0862,-0.3697529 -0.134874,-0.00598 -0.357472,-0.011877 -0.574003,-0.015059 -0.216531,-0.00318 -0.201855,-0.00432 -0.415259,-0.00808 -0.213404,-0.00376 -0.231246,-0.00347 -0.455954,-0.014158 l -0.001,-0.3673202 c 0.188279,-0.043006 0.323439,-0.05143 0.475607,-0.068437 0.152169,-0.017007 0.216267,-0.024363 0.392225,-0.024363 0.175959,0 0.545366,0.00521 0.697295,0.068767 0.153479,0.063562 0.09339,0.025958 0.258827,0.144224 0.06634,0.04776 0.147125,0.2290897 0.175883,0.3915519 0.0137,0.1385602 0.01156,0.2868772 0.01156,0.5147702 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4984" />
<path
d="m 45.900031,-5.6889027 c -1.56e-4,0.1884622 -0.0045,0.2960245 0.0014,0.4029534 0.128075,2.853e-4 0.38981,0.00676 0.325949,0.00344 l -1.39e-4,0.1054309 v 0.3556467 c 0,0 -0.204277,-1.388e-4 -0.306416,0 -0.276552,3.759e-4 -0.618616,0.00213 -0.829655,0.00226 -0.0042,-0.2397473 -0.0023,-0.4554667 4.08e-4,-0.4668341 0,0 0.0976,0.00163 0.189007,0.00197 0.183136,6.815e-4 0.166946,0.017973 0.166109,-0.027117 -0.0021,-0.1142859 0.002,-0.2795005 0.0012,-0.4269249 l -0.01118,-2.2559473 h -0.354419 l -0.0045,-0.3998272 h 0.824422 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4986" />
<path
d="m 48.501809,-7.0373667 q -0.331439,0 -0.501894,0.2391665 -0.170455,0.2391665 -0.170455,0.7087226 0,0.4673619 0.170455,0.7087226 0.170455,0.2391664 0.501894,0.2391664 0.333808,0 0.504263,-0.2391664 0.170454,-0.2413607 0.170454,-0.7087226 0,-0.4695561 -0.170454,-0.7087226 -0.170455,-0.2391665 -0.504263,-0.2391665 z m 0,-0.3422933 q 0.55161,0 0.842805,0.3313224 0.29356,0.3313223 0.29356,0.95886 0,0.6297319 -0.291193,0.9610541 -0.291194,0.3291282 -0.845172,0.3291282 -0.55161,0 -0.842803,-0.3291282 -0.291194,-0.3313222 -0.291194,-0.9610541 0,-0.6275377 0.291194,-0.95886 0.291193,-0.3313224 0.842803,-0.3313224 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px"
id="path4988" />
<path
d="m 51.964761,-6.1043033 c 0,-0.3153981 -0.05478,-0.554613 -0.164328,-0.7176449 -0.107941,-0.1645555 -0.439029,-0.1268362 -0.646856,-0.1268362 -0.217493,0 -0.394754,0.042656 -0.497818,0.2468332 -0.0023,0.1743523 0.0016,0.2822498 0.0016,0.5976479 0,0.3153981 0.05719,0.5561367 0.171579,0.7222158 0.115996,0.1645555 0.262038,0.1347607 0.481143,0.1347607 0.204605,0 0.382387,0.029033 0.490328,-0.1370461 0.109552,-0.1660792 0.164328,-0.406056 0.164328,-0.7199304 z m 0.444654,1.1358901 c 0,0.3839629 -0.09586,0.6749823 -0.287575,0.8730584 -0.191717,0.1980761 -0.459268,0.2076824 -0.706567,0.2076824 -0.247298,0 -0.33316,0.00858 -0.480462,0.00196 -0.147303,-0.00662 -0.39649,-0.028793 -0.530208,-0.069932 l -0.0045,-0.4386006 c 0.175997,0.00217 0.296741,0.00642 0.436946,0.00372 0.140205,-0.0027 0.242375,-0.00179 0.41637,-0.00179 0.173995,0 0.335605,0.014139 0.574211,-0.044752 0.119552,-0.1030316 0.110826,-0.1010778 0.134895,-0.3592803 -0.223716,-0.00621 -0.02265,-0.00143 -0.203956,7.318e-4 -0.141072,0.00169 -0.355235,0.010041 -0.530841,0.010041 -0.315768,0 -0.607522,-0.059609 -0.796017,-0.298824 -0.188494,-0.2392149 -0.243119,-0.6191825 -0.243119,-1.0199056 0,-0.4022468 0.06708,-0.7229777 0.255572,-0.9621926 0.188495,-0.239215 0.396232,-0.2914175 0.774508,-0.2965599 0.378275,-0.00514 0.57781,-0.00176 0.781477,0.00434 l 0.407313,0.00318 z"
style="font-size:4.76249981px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332px"
id="path4990" />
</g>
<rect
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="title-bar-button"
width="8.4672203"
height="5.6373534"
x="67.93721"
y="28.362345" />
<path
style="opacity:1;fill:none;stroke:#727272;stroke-width:0.40613541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="title-bar-button-line"
d="M 73.131727,31.089285 H 71.019288" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-client-area"
width="90.317062"
height="62.010803"
x="67.93721"
y="33.999699" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:0;stroke:#000000;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="dialog-border"
width="87.551292"
height="56.458969"
x="69.366524"
y="36.825737" />
<path
id="button-shadow"
style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="m 124.38536,84.735805 h 25.40168 v 2.900645 h -25.40168 z m 25.3985,-2.767792 h 2.81775 v 5.668438 h -2.81775 z" />
<rect
style="opacity:1;fill:#727272;fill-opacity:1;stroke:none;stroke-width:0.40613541;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="button"
width="28.224081"
height="5.6373444"
x="121.56296"
y="79.098457" />
<g
transform="translate(71.692613,37.697864)"
id="button-text">
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.2473854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="Q-underline"
d="M 61.074994,46.475002 H 58.683557" />
<path
d="m 61.556895,45.081249 v -1.673628 h 0.452124 v 1.673628 q 0,0.364146 0.130232,0.535368 0.132689,0.17122 0.407894,0.17122 0.319436,0 0.488983,-0.219452 0.169546,-0.221864 0.169546,-0.634242 v -1.526522 h 0.454582 v 2.696132 H 63.205674 V 45.69861 q -0.120402,0.233922 -0.329264,0.3545 -0.206404,0.120579 -0.484068,0.120579 -0.422638,0 -0.629042,-0.270097 -0.206405,-0.272507 -0.206405,-0.822343 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4661" />
<path
d="m 64.87924,43.518911 0.785453,4.86e-4 0.01049,2.155477 0.316588,-0.0044 0.0042,0.440206 -1.08948,0.0087 0.01253,-0.448935 h 0.31241 l -0.0082,-1.694587 -0.344008,6.5e-4 z m 0.364746,-1.088502 h 0.418696 l -0.0043,0.800525 -0.415908,-4.84e-4 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.76249981px;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4982-36" />
<path
d="m 68.340878,42.63592 -0.0082,0.870231 0.667564,-0.0041 0.0041,0.415134 -0.655161,-0.0041 -0.0082,1.300867 c -0.0013,0.199353 0.03618,0.338423 0.108529,0.417201 0.07235,0.07878 0.198587,0.118167 0.378699,0.118167 h 0.477992 v 0.354501 h -0.519556 c -0.318661,0 -0.543417,-0.06672 -0.674269,-0.200161 -0.130851,-0.133439 -0.196277,-0.363343 -0.196277,-0.689708 l -0.0041,-1.305001 c -0.332119,0 -0.359412,0.0041 -0.686298,0.01654 l -0.0041,-0.427537 h 0.686297 l 0.0082,-0.861963 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:125%;font-family:'Bitstream Vera Sans Mono';-inkscape-font-specification:'Bitstream Vera Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4665" />
<path
id="path4722"
transform="matrix(0.26458333,0,0,0.26458333,-75.17538,-41.201563)"
d="m 510.18359,316.11914 c -1.46621,0 -2.55977,0.58334 -3.28125,1.75 -0.71566,1.16667 -1.07226,2.93858 -1.07226,5.31445 0,2.36979 0.35661,4.13802 1.07226,5.30469 0.72148,1.16667 1.8091,1.75 3.26368,1.75 0.0465,0 0.10796,-0.004 0.18359,-0.01 -0.0488,0.12717 1.33074,-0.19815 1.57569,-0.41698 l 1.28368,0.84276 1.26563,-0.56055 -1.06836,-1.21875 c 0.32119,-0.33486 0.4522,-0.54975 0.64258,-0.95312 0.1363,-0.31537 0.5,-2.95183 0.5,-4.73829 0,-2.37587 -0.36056,-4.14778 -1.08203,-5.31445 -0.71565,-1.16666 -1.81117,-1.75 -3.28321,-1.75 z m 0,1.49414 c 0.89602,0 1.53987,0.42839 1.92969,1.28516 0.39565,0.85677 0.59375,2.28406 0.59375,4.2832 0,1.99913 -0.1981,3.42838 -0.59375,4.28516 -0.30165,-0.10534 -0.78096,-0.85138 -1.30469,-0.84571 l -1.45507,0.31641 1.03906,1.17969 0.4375,0.52539 c 0.0131,-7.4e-4 0.0224,-0.005 0.0351,-0.006 -0.20919,0.0651 -0.43368,0.10547 -0.68164,0.10547 -0.8902,0 -1.53209,-0.42839 -1.92773,-1.28516 -0.38983,-0.85677 -0.58398,-2.28233 -0.58398,-4.27539 -10e-6,-1.99914 0.19416,-3.42643 0.58398,-4.2832 0.39564,-0.85677 1.03753,-1.28516 1.92773,-1.28516 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
id="grid"
d="M 0.19939842,0.00358645 V 135.70594 M 3.0218084,0.00358645 V 135.70594 M 5.8442174,0.00358645 V 135.70594 M 8.6666254,0.00358645 V 135.70594 M 11.489038,0.00358645 V 135.70594 M 14.311447,0.00358645 V 135.70594 M 17.133854,0.00358645 V 135.70594 M 19.956264,0.00358645 V 135.70594 M 22.778672,0.00358645 V 135.70594 M 25.60108,0.00358645 V 135.70594 M 28.42349,0.00358645 V 135.70594 M 31.245898,0.00358645 V 135.70594 M 34.068306,0.00358645 V 135.70594 M 36.890714,0.00358645 V 135.70594 M 39.713123,0.00358645 V 135.70594 M 42.535532,0.00358645 V 135.70594 M 45.35794,0.00358645 V 135.70594 M 48.180349,0.00358645 V 135.70594 M 51.00276,0.00358645 V 135.70594 M 53.82517,0.00358645 V 135.70594 M 56.647575,0.00358645 V 135.70594 M 59.469985,0.00358645 V 135.70594 M 62.292391,0.00358645 V 135.70594 M 65.114806,0.00358645 V 135.70594 M 67.937211,0.00358645 V 135.70594 M 70.759622,0.00358645 V 135.70594 M 73.582026,0.00358645 V 135.70594 M 76.404432,0.00358645 V 135.70594 M 79.226847,0.00358645 V 135.70594 M 82.049252,0.00358645 V 135.70594 M 84.871663,0.00358645 V 135.70594 M 87.694067,0.00358645 V 135.70594 M 90.516478,0.00358645 V 135.70594 M 93.338889,0.00358645 V 135.70594 M 96.161298,0.00358645 V 135.70594 M 98.983704,0.00358645 V 135.70594 M 101.8061,0.00358645 V 135.70594 M 104.6285,0.00358645 V 135.70594 M 107.45091,0.00358645 V 135.70594 M 110.27332,0.00358645 V 135.70594 M 113.09573,0.00358645 V 135.70594 M 115.91813,0.00358645 V 135.70594 M 118.74054,0.00358645 V 135.70594 M 121.56296,0.00358645 V 135.70594 M 124.38536,0.00358645 V 135.70594 M 127.20777,0.00358645 V 135.70594 M 130.03017,0.00358645 V 135.70594 M 132.85259,0.00358645 V 135.70594 M 135.67499,0.00358645 V 135.70594 M 138.49741,0.00358645 V 135.70594 M 141.31982,0.00358645 V 135.70594 M 144.14222,0.00358645 V 135.70594 M 146.96463,0.00358645 V 135.70594 M 149.78704,0.00358645 V 135.70594 M 152.60945,0.00358645 V 135.70594 M 155.43186,0.00358645 V 135.70594 M 158.25427,0.00358645 V 135.70594 M 161.07667,0.00358645 V 135.70594 M 163.89908,0.00358645 V 135.70594 M 166.72149,0.00358645 V 135.70594 M 169.5439,0.00358645 V 135.70594 M 172.36631,0.00358645 V 135.70594 M 175.18871,0.00358645 V 135.70594 M 178.01112,0.00358645 V 135.70594 M 180.83353,0.00358645 V 135.70594 M 183.65594,0.00358645 V 135.70594 M 186.47835,0.00358645 V 135.70594 M 189.30076,0.00358645 V 135.70594 M 192.12317,0.00358645 V 135.70594 M 194.94557,0.00358645 V 135.70594 M 197.76799,0.00358645 V 135.70594 M 200.59039,0.00358645 V 135.70594 M 203.41281,0.00358645 V 135.70594 M 206.23521,0.00358645 V 135.70594 M 209.05761,0.00358645 V 135.70594 M 211.88003,0.00358645 V 135.70594 M 214.70243,0.00358645 V 135.70594 M 217.52485,0.00358645 V 135.70594 M 220.34725,0.00358645 V 135.70594 M 223.16966,0.00358645 V 135.70594 M 225.99207,0.00358645 V 135.70594 M 0.19939842,0.17562045 H 226.19405 M 0.19939842,5.8129634 H 226.19405 M 0.19939842,11.450306 H 226.19405 M 0.19939842,17.087659 H 226.19405 M 0.19939842,22.725002 H 226.19405 M 0.19939842,28.362345 H 226.19405 M 0.19939842,33.999698 H 226.19405 M 0.19939842,39.637041 H 226.19405 M 0.19939842,45.274384 H 226.19405 M 0.19939842,50.911727 H 226.19405 M 0.19939842,56.54908 H 226.19405 M 0.19939842,62.186423 H 226.19405 M 0.19939842,67.823776 H 226.19405 M 0.19939842,73.461119 H 226.19405 M 0.19939842,79.098462 H 226.19405 M 0.19939842,84.735805 H 226.19405 M 0.19939842,90.373158 H 226.19405 M 0.19939842,96.010501 H 226.19405 M 0.19939842,101.64789 H 226.19405 M 0.19939842,107.28523 H 226.19405 M 0.19939842,112.92258 H 226.19405 M 0.19939842,118.55993 H 226.19405 M 0.19939842,124.19727 H 226.19405 M 0.19939842,129.83461 H 226.19405 M 0.19939842,135.47196 H 226.19405"
style="fill:none;stroke:#7c7c7c;stroke-width:0.106363;stroke-dasharray:0.212725, 0.106363, 0.053181, 0.106363;stroke-opacity:0.57478602" />
</g>
<path
style="fill:none;stroke:#4f4f4f;stroke-width:3.60800004;stroke-linejoin:round"
d="M -1.6787666,-1.6996976 H 227.87363 V 137.34287 H -1.6787666 Z"
id="path163" />
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#i-3);marker-end:url(#h-7)"
id="path75"
d="M 0.71750465,127.07532 H 94.653983 m 36.300447,0 h 38.31176 56.1829" />
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#k-3);marker-end:url(#j-6)"
id="path77"
d="M 217.42769,0.67868155 V 50.334198 m 0,36.70988 0.10543,47.877372" />
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.26458299"
id="text79"
y="128.09375"
x="112.81702"
font-size="3.880556">getDesktopWidth()</text>
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;text-anchor:middle;stroke-width:0.26458299"
id="text81"
y="218.60313"
x="-67.922623"
transform="rotate(-90)"
font-size="3.880556">getDesktopHeight()</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#r-91);marker-end:url(#c-7)"
id="path83"
d="M 79.195185,0.1864336 V 30.96059" />
<text
style="font-size:4.23333406px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="text89"
y="8.0025988"
x="38.52689"
font-size="4.233334">
<tspan
style="stroke-width:0.26458299"
id="tspan85"
y="8.0025988"
x="38.52689">getPos()</tspan>
<tspan
style="stroke-width:0.26458299"
id="tspan87"
y="13.294264"
x="38.52689">getTermPos()</tspan>
</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#a-9);marker-end:url(#s-6)"
id="path91"
d="M 68.659479,39.622603 H 0.22484765" />
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="text97"
y="13.109548"
x="80.360222"
font-size="3.880556">
<tspan
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="tspan93"
y="13.109548"
x="80.360222"
font-size="3.880556">getY()</tspan>
<tspan
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="tspan95"
y="17.960236"
x="80.360222"
font-size="3.880556">getTermY()</tspan>
</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#b-6)"
id="path99"
d="M 69.022514,30.892409 51.629013,15.07587" />
<text
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="text105"
y="38.16193"
x="23.507547"
font-size="3.880556">
<tspan
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="tspan101"
y="38.16193"
x="23.507547"
font-size="3.880556">getX()</tspan>
<tspan
style="font-size:3.88055611px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;stroke-width:0.26458299"
id="tspan103"
y="43.01263"
x="23.507547"
font-size="3.880556">getTermX()</tspan>
</text>
<path
id="path107"
d="m 68.517297,104.63844 c 9.778151,0 23.872888,0 33.651023,0 m 21.2908,0 h 34.11383"
style="fill:none;stroke:#000000;stroke-width:0.40613502;marker-start:url(#e-6);marker-end:url(#d-8)" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="text109"
y="105.70465"
x="113.03175"
font-size="3.880556">getWidth()</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.32675999;marker-start:url(#g-9);marker-end:url(#f-0)"
id="path111"
d="m 168.43921,28.879659 v 24.612857 m 0.0915,23.177635 0.0139,18.749915" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="text115"
y="169.59256"
x="-64.999428"
transform="rotate(-90)"
font-size="3.880556">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="tspan113"
y="169.59256"
x="-64.999428">getHeight()</tspan>
</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101"
id="path117"
d="m 158.34356,28.368476 h 22.9042" />
<path
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101"
id="path119"
d="m 158.2189,95.892736 h 23.00064" />
<path
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101"
id="path121"
d="M 158.41834,39.536952 H 181.2261" />
<path
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101"
id="path123"
d="M 158.26877,90.313866 H 181.2453" />
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#m-3);marker-end:url(#l-5)"
id="path125"
d="m 176.50913,40.100361 0.0586,8.690149 m 0.0134,32.440661 0.0334,8.550595" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="text127"
y="177.81908"
x="-64.977974"
transform="rotate(-90)"
font-size="3.880556">getClientHeight()</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="text131"
y="34.690594"
x="190.8372"
font-size="4.233333">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="tspan129"
font-size="3.527778">getTopPadding()</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="text135"
y="93.831383"
x="179.42957"
font-size="4.233334">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="tspan133"
font-size="3.527778">getBottomPadding()</tspan>
</text>
<path
d="m 176.41928,28.968776 0.1054,10.028739 m -0.1054,-10.028739 0.1054,10.028739"
id="path137"
style="fill:none;stroke:#000000;stroke-width:0.32675999;marker-start:url(#o-2);marker-end:url(#n-8)" />
<path
d="m 176.62275,91.092126 0.1054,4.33023 m -0.1054,-4.33023 0.1054,4.33023"
id="path139"
style="fill:none;stroke:#000000;stroke-width:0.32675999;marker-start:url(#q-7);marker-end:url(#p-6)" />
<path
d="M 158.21888,95.892726 V 118.53038"
id="path141"
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101" />
<path
d="M 70.730357,95.980486 V 118.54438"
id="path143"
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101" />
<path
d="M 155.39817,95.960716 V 118.53576"
id="path145"
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101" />
<path
d="M 67.900884,95.962716 V 118.5266"
id="path147"
style="fill:none;stroke:#000000;stroke-width:0.32675999;stroke-dasharray:0.98028101, 0.98028101" />
<path
d="m 158.72867,115.55793 h 3.75652 m -3.75652,0.001 h -4.25436 m -3.8031,0 h 4.10756"
id="path149"
style="fill:none;stroke:#000000;stroke-width:0.32675999;marker-start:url(#t-2);marker-end:url(#u-3)" />
<path
d="m 71.453846,115.55803 h 3.756526 m -3.756526,0.001 h -4.254372 m -3.803094,0 h 4.107552"
id="path151"
style="fill:none;stroke:#000000;stroke-width:0.32675999;marker-start:url(#v-9);marker-end:url(#w-7)" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="text157"
y="116.48471"
x="163.30989"
font-size="4.233334">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="tspan155"
font-size="3.527778">getRightPadding()</tspan>
</text>
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="text161"
y="116.32534"
x="76.057518"
font-size="4.233334">
<tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458299"
id="tspan159"
font-size="3.527778">getLeftPadding()</tspan>
</text>
<path
style="fill:none;stroke:#000000;stroke-width:0.40613499;marker-start:url(#e-3-4);marker-end:url(#d-7-0)"
id="path107-3"
d="m 71.346359,110.06317 c 9.156515,0.0101 18.313083,-0.0139 27.469578,0.0102 m 30.441293,-0.026 25.48321,0.003" />
<text
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.70416665px;font-family:FreeSans, Arial, 'Bitstream Vera Sans', 'DejaVu Sans', 'Open Sans', sans-serif;-inkscape-font-specification:'FreeSans, Arial, Bitstream Vera Sans, DejaVu Sans, Open Sans, sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458299"
id="text109-5"
y="111.1342"
x="113.27158"
font-size="3.880556">getClientWidth()</text>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

240
examples/7segment.cpp Normal file
View File

@ -0,0 +1,240 @@
/***********************************************************************
* 7segment.cpp - Seven-segment display *
* *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2012-2021 Markus Gans *
* *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <array>
#include <map>
#include <vector>
#include <final/final.h>
using finalcut::FColorPair;
using finalcut::FColor;
using finalcut::FRect;
using finalcut::FPoint;
using finalcut::FSize;
//----------------------------------------------------------------------
// class SegmentView
//----------------------------------------------------------------------
class SegmentView final : public finalcut::FDialog
{
public:
// Constructor
explicit SegmentView (finalcut::FWidget* = nullptr);
private:
struct sevenSegment
{
unsigned char a : 1;
unsigned char b : 1;
unsigned char c : 1;
unsigned char d : 1;
unsigned char e : 1;
unsigned char f : 1;
unsigned char g : 1;
unsigned char : 1; // padding bit
};
// Methods
void hexEncoding();
void get7Segment (const wchar_t);
void draw() override;
void initLayout() override;
// Data members
std::map<wchar_t, sevenSegment> code{};
std::array<finalcut::FString, 3> line{};
finalcut::FLineEdit input{"0123", this};
finalcut::FButton exit{"E&xit", this};
};
//----------------------------------------------------------------------
SegmentView::SegmentView (finalcut::FWidget* parent)
: FDialog{parent}
{
// Set encoding
hexEncoding();
// Input field
input.setLabelText (L"&Hex value");
input.setLabelText (L"&Hex-digits or (.) (:) (H) (L) (P) (U)");
input.setLabelOrientation(finalcut::FLineEdit::LabelOrientation::Above);
input.setMaxLength(9);
input.setInputFilter("[:.hHlLpPuU[:xdigit:]]");
// Add some function callbacks
input.addCallback
(
"changed",
[] (SegmentView& dialog)
{
dialog.redraw();
},
std::ref(*this)
);
exit.addCallback
(
"clicked",
finalcut::getFApplication(),
&finalcut::FApplication::cb_exitApp,
this
);
}
//----------------------------------------------------------------------
void SegmentView::hexEncoding()
{
code['0'] = sevenSegment{1, 1, 1, 1, 1, 1, 0};
code['1'] = sevenSegment{0, 1, 1, 0, 0, 0, 0};
code['2'] = sevenSegment{1, 1, 0, 1, 1, 0, 1};
code['3'] = sevenSegment{1, 1, 1, 1, 0, 0, 1};
code['4'] = sevenSegment{0, 1, 1, 0, 0, 1, 1};
code['5'] = sevenSegment{1, 0, 1, 1, 0, 1, 1};
code['6'] = sevenSegment{1, 0, 1, 1, 1, 1, 1};
code['7'] = sevenSegment{1, 1, 1, 0, 0, 0, 0};
code['8'] = sevenSegment{1, 1, 1, 1, 1, 1, 1};
code['9'] = sevenSegment{1, 1, 1, 1, 0, 1, 1};
code['A'] = sevenSegment{1, 1, 1, 0, 1, 1, 1};
code['B'] = sevenSegment{0, 0, 1, 1, 1, 1, 1};
code['C'] = sevenSegment{1, 0, 0, 1, 1, 1, 0};
code['D'] = sevenSegment{0, 1, 1, 1, 1, 0, 1};
code['E'] = sevenSegment{1, 0, 0, 1, 1, 1, 1};
code['F'] = sevenSegment{1, 0, 0, 0, 1, 1, 1};
}
//----------------------------------------------------------------------
void SegmentView::get7Segment (const wchar_t c)
{
for (std::size_t i{0}; i < 3; i++)
line[i].clear();
switch ( c )
{
case ':':
line[0] = ' ';
line[1] = '.';
line[2] = '.';
break;
case '.':
line[0] = ' ';
line[1] = ' ';
line[2] = '.';
break;
case 'H':
line[0] = " ";
line[1] = "|_|";
line[2] = "| |";
break;
case 'L':
line[0] = " ";
line[1] = "| ";
line[2] = "|_ ";
break;
case 'P':
line[0] = " _ ";
line[1] = "|_|";
line[2] = "| ";
break;
case 'U':
line[0] = " ";
line[1] = "| |";
line[2] = "|_|";
break;
default:
// Hexadecimal digit from 0 up to f
if ( code.find(c) != code.end() )
{
const sevenSegment& s = code[c];
constexpr std::array<char, 2> h{{' ', '_'}};
constexpr std::array<char, 2> v{{' ', '|'}};
line[0] << ' ' << h[s.a] << ' ';
line[1] << v[s.f] << h[s.g] << v[s.b];
line[2] << v[s.e] << h[s.d] << v[s.c];
}
}
}
//----------------------------------------------------------------------
void SegmentView::draw()
{
std::vector<finalcut::FTermBuffer> tbuffer(3);
finalcut::FTermBuffer left_space{};
FDialog::draw();
setColor(FColor::LightGray, FColor::Black);
finalcut::drawBorder(this, FRect(FPoint{3, 6}, FPoint{40, 11}));
for (auto&& ch : input.getText().toUpper())
{
const FColorPair color{FColor::LightRed, FColor::Black};
get7Segment(ch);
for (std::size_t i{0}; i < 3; i++)
tbuffer[i] << color << line[i] << " ";
}
const std::size_t length = tbuffer[0].getLength();
if ( length < 36 )
left_space << finalcut::FString(36 - length, ' ');
print() << FPoint {4, 7} << left_space << tbuffer[0]
<< FPoint {4, 8} << left_space << tbuffer[1]
<< FPoint {4, 9} << left_space << tbuffer[2]
<< FPoint {4, 10} << finalcut::FString{36, ' '};
}
//----------------------------------------------------------------------
void SegmentView::initLayout()
{
// Dialog settings
FDialog::setText ("Seven-segment display");
FDialog::setGeometry (FPoint{25, 5}, FSize{42, 15});
// Input field
input.setGeometry (FPoint(2, 2), FSize{12, 1});
// Exit button
exit.setGeometry(FPoint{28, 11}, FSize{10, 1});
FDialog::initLayout();
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
finalcut::FApplication app(argc, argv);
SegmentView dialog(&app);
finalcut::FWidget::setMainWidget(&dialog);
dialog.show();
return app.exec();
}

View File

@ -1,17 +1,21 @@
#----------------------------------------------------------------------
# Makefile.am - The Final Cut example programs
# Makefile.am - FINAL CUT example programs
#----------------------------------------------------------------------
if ! CPPUNIT_TEST
AM_LDFLAGS = -L$(top_builddir)/src/.libs -lfinal
AM_CPPFLAGS = -I$(top_srcdir)/src/include -Wall -Werror
AM_CPPFLAGS = -I$(top_srcdir)/src/include -Wall -Werror -std=c++11
noinst_PROGRAMS = \
hello \
dialog \
input-dialog \
event-log \
fullwidth-character \
7segment \
choice \
busy \
listbox \
listview \
checklist \
@ -20,9 +24,11 @@ noinst_PROGRAMS = \
termcap \
string-operations \
mandelbrot \
rotozoomer \
calculator \
watch \
term-attributes \
background-color \
transparent \
keyboard \
mouse \
@ -35,7 +41,11 @@ noinst_PROGRAMS = \
hello_SOURCES = hello.cpp
dialog_SOURCES = dialog.cpp
input_dialog_SOURCES = input-dialog.cpp
event_log_SOURCES = event-log.cpp
fullwidth_character_SOURCES = fullwidth-character.cpp
7segment_SOURCES = 7segment.cpp
choice_SOURCES = choice.cpp
busy_SOURCES = busy.cpp
listbox_SOURCES = listbox.cpp
listview_SOURCES = listview.cpp
checklist_SOURCES = checklist.cpp
@ -43,9 +53,11 @@ treeview_SOURCES = treeview.cpp
opti_move_SOURCES = opti-move.cpp
string_operations_SOURCES = string-operations.cpp
mandelbrot_SOURCES = mandelbrot.cpp
rotozoomer_SOURCES = rotozoomer.cpp
calculator_SOURCES = calculator.cpp
watch_SOURCES = watch.cpp
term_attributes_SOURCES = term-attributes.cpp
background_color_SOURCES = background-color.cpp
termcap_SOURCES = termcap.cpp
transparent_SOURCES = transparent.cpp
keyboard_SOURCES = keyboard.cpp

View File

@ -1,5 +1,5 @@
#-----------------------------------------------------------------------------
# Makefile for Final Cut
# Makefile for FINAL CUT
#-----------------------------------------------------------------------------
# This is where make install will install the executable
@ -9,14 +9,14 @@ BINDIR = /usr/local/bin
CXX = clang++
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:%.cpp=%)
CCXFLAGS = $(OPTIMIZE) $(PROFILE) $(DEBUG)
CCXFLAGS = $(OPTIMIZE) $(PROFILE) $(DEBUG) -std=c++11
MAKEFILE = -f Makefile.clang
LDFLAGS = -L../src -lfinal
INCLUDES = -I../src/include -I/usr/include/final
RM = rm -f
ifdef DEBUG
OPTIMIZE = -O0 -fsanitize=bool,bounds,enum,float-cast-overflow,function,null
OPTIMIZE = -O0 -fsanitize=undefined
else
OPTIMIZE = -O2
endif
@ -24,12 +24,12 @@ endif
# $@ = name of the targets
# $^ = all dependency (without double entries)
.cpp:
$(CXX) $(CCXFLAGS) $(INCLUDES) $(LDFLAGS) -o $@ $^
$(CXX) $^ -o $@ $(CCXFLAGS) $(INCLUDES) $(LDFLAGS)
all: $(OBJS)
debug:
$(MAKE) $(MAKEFILE) DEBUG="-g -D DEBUG -Wall -Wextra -Wpedantic -Weverything -Wpadded -Wno-reserved-id-macro"
$(MAKE) $(MAKEFILE) DEBUG="-g -D DEBUG -Wall -Wextra -Wpedantic -Weverything -Wno-padded -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-implicit-fallthrough -Wno-reserved-id-macro"
profile:
$(MAKE) $(MAKEFILE) PROFILE="-pg"

View File

@ -1,5 +1,5 @@
#-----------------------------------------------------------------------------
# Makefile for Final Cut
# Makefile for FINAL CUT
#-----------------------------------------------------------------------------
# This is where make install will install the executable
@ -9,7 +9,7 @@ BINDIR = /usr/local/bin
CXX = g++
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:%.cpp=%)
CCXFLAGS = $(OPTIMIZE) $(PROFILE) $(DEBUG)
CCXFLAGS = $(OPTIMIZE) $(PROFILE) $(DEBUG) -std=c++11
MAKEFILE = -f Makefile.gcc
LDFLAGS = -L../src -lfinal
INCLUDES = -I../src/include -I/usr/include/final
@ -24,7 +24,7 @@ endif
# $@ = name of the targets
# $^ = all dependency (without double entries)
.cpp:
$(CXX) $(CCXFLAGS) $(INCLUDES) $(LDFLAGS) -o $@ $^
$(CXX) $^ -o $@ $(CCXFLAGS) $(INCLUDES) $(LDFLAGS)
all: $(OBJS)

View File

@ -0,0 +1,233 @@
/***********************************************************************
* background-color.cpp - Sets the background color palette *
* *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2019-2021 Markus Gans *
* *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <tuple>
#include <utility>
#include <vector>
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FRect;
using finalcut::FSize;
using finalcut::FColor;
//----------------------------------------------------------------------
// class Background
//----------------------------------------------------------------------
class Background final : public finalcut::FDialog
{
public:
// Using-declaration
using RGB = std::tuple<uChar, uChar, uChar>;
// Constructor
explicit Background (finalcut::FWidget* = nullptr);
// Disable copy constructor
Background (const Background&) = delete;
// Destructor
~Background() noexcept override;
// Disable copy assignment operator (=)
Background& operator = (const Background&) = delete;
private:
// Methods
void initLayout() override;
// Callback method
void cb_changed();
void cb_choice();
// Data members
finalcut::FComboBox color_choice{this};
finalcut::FSpinBox red{this};
finalcut::FSpinBox green{this};
finalcut::FSpinBox blue{this};
finalcut::FButton quit{"&Quit", this};
std::vector<std::pair<finalcut::FString, RGB>> color_list
{
{ "Light blue" , std::make_tuple(0x80, 0xa4, 0xec) },
{ "Vivid blue" , std::make_tuple(0x37, 0x97, 0xfd) },
{ "Bright blue" , std::make_tuple(0x3c, 0x85, 0xd2) },
{ "Strong blue" , std::make_tuple(0x32, 0x64, 0x9f) },
{ "Light cyan" , std::make_tuple(0x6c, 0xfe, 0xfe) },
{ "Vivid cyan" , std::make_tuple(0x0b, 0xdd, 0xd4) },
{ "Soft cyan" , std::make_tuple(0x49, 0xa8, 0xac) },
{ "Light green" , std::make_tuple(0x81, 0xdf, 0xbb) },
{ "Vivid green" , std::make_tuple(0x5c, 0x9e, 0x4a) },
{ "Bright green" , std::make_tuple(0x0f, 0xba, 0x78) },
{ "Strong green" , std::make_tuple(0x03, 0x8f, 0x68) },
{ "Mint green" , std::make_tuple(0x4a, 0xfd, 0x91) },
{ "Green" , std::make_tuple(0x6b, 0xe8, 0x1b) },
{ "Dark green" , std::make_tuple(0x01, 0x65, 0x05) },
{ "Dark sea green", std::make_tuple(0x7d, 0xb6, 0x96) },
{ "Bright purple" , std::make_tuple(0x83, 0x76, 0xa2) },
{ "Taupe" , std::make_tuple(0xa6, 0x8c, 0x99) },
{ "Silver" , std::make_tuple(0xc1, 0xc1, 0xcb) }
};
};
//----------------------------------------------------------------------
Background::Background (finalcut::FWidget* parent)
: FDialog{parent}
{
// Combobox
color_choice.setLabelOrientation (finalcut::FLineEdit::LabelOrientation::Above);
color_choice.setLabelText ("Color choice");
color_choice.unsetEditable();
for (auto& c : color_list)
{
finalcut::FListBoxItem item (c.first, c.second);
color_choice.insert(item);
}
// Spin boxes
red.setLabelOrientation (finalcut::FLineEdit::LabelOrientation::Above);
red.setLabelText ("Red");
red.setRange (0, 255);
red.setValue (0x80);
green.setLabelOrientation (finalcut::FLineEdit::LabelOrientation::Above);
green.setLabelText ("Green");
green.setRange (0, 255);
green.setValue (0xa4);
blue.setLabelOrientation (finalcut::FLineEdit::LabelOrientation::Above);
blue.setLabelText ("Blue");
blue.setRange (0, 255);
blue.setValue (0xec);
// Set the initial palette values
if ( finalcut::FTerm::canChangeColorPalette() )
{
finalcut::FTerm::setPalette ( FColor::LightMagenta
, int(red.getValue())
, int(green.getValue())
, int(blue.getValue()) );
}
// Add some function callbacks
quit.addCallback
(
"clicked",
finalcut::getFApplication(),
&finalcut::FApplication::cb_exitApp,
this
);
for (const auto spinbox : {&red, &green, &blue})
{
spinbox->addCallback
(
"changed",
this, &Background::cb_changed
);
}
for (const auto& signal : {"row-changed", "clicked"})
{
color_choice.addCallback
(
signal,
this, &Background::cb_choice
);
}
}
//----------------------------------------------------------------------
Background::~Background() noexcept = default; // destructor
//----------------------------------------------------------------------
void Background::initLayout()
{
FDialog::setText ("Background color palette");
FDialog::setGeometry (FPoint{25, 5}, FSize{32, 12});
color_choice.setGeometry (FPoint{2, 2}, FSize{18, 1});
red.setGeometry (FPoint{2, 5}, FSize{7, 1});
green.setGeometry (FPoint{12, 5}, FSize{7, 1});
blue.setGeometry (FPoint{22, 5}, FSize{7, 1});
quit.setGeometry(FPoint{19, 8}, FSize{10, 1}); // Quit button
FDialog::initLayout();
}
//----------------------------------------------------------------------
void Background::cb_changed()
{
if ( ! finalcut::FTerm::canChangeColorPalette() )
return;
finalcut::FTerm::setPalette ( FColor::LightMagenta
, int(red.getValue())
, int(green.getValue())
, int(blue.getValue()) );
redraw();
}
//----------------------------------------------------------------------
void Background::cb_choice()
{
if ( ! finalcut::FTerm::canChangeColorPalette() )
return;
uChar r{};
uChar g{};
uChar b{};
const RGB rgb = color_choice.getItemData<RGB>();
std::tie(r, g, b) = rgb;
red.setValue(r);
green.setValue(g);
blue.setValue(b);
finalcut::FTerm::setPalette ( FColor::LightMagenta
, int(red.getValue())
, int(green.getValue())
, int(blue.getValue()) );
redraw();
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
// Create the application object
finalcut::FApplication app(argc, argv);
// Force terminal initialization without calling show()
app.initTerminal();
// The following lines require an initialized terminal
if ( finalcut::FTerm::canChangeColorPalette() )
app.setBackgroundColor(FColor::LightMagenta);
Background dialog(&app);
finalcut::FWidget::setMainWidget(&dialog);
dialog.show();
return app.exec();
}

136
examples/busy.cpp Normal file
View File

@ -0,0 +1,136 @@
/***********************************************************************
* busy.cpp - Shows the use of the FBusyIndicator *
* *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2020-2021 Markus Gans *
* *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FRect;
using finalcut::FSize;
//----------------------------------------------------------------------
// class Dialog
//----------------------------------------------------------------------
class Dialog final : public finalcut::FDialog
{
public:
explicit Dialog (FWidget* parent = nullptr);
private:
void initLayout() override;
void adjustSize() override;
// Event handler
void onTimer (finalcut::FTimerEvent*) override;
// Callback method
void cb_start();
// Data members
finalcut::FSpinBox seconds{this};
finalcut::FButton start{"&Start", this};
finalcut::FButton quit{"&Quit", this};
finalcut::FBusyIndicator busy_indicator{this};
};
//----------------------------------------------------------------------
Dialog::Dialog (FWidget* parent)
: finalcut::FDialog{parent}
{
seconds.setLabelText ("Seconds");
seconds.setRange (0, 60);
seconds.setValue (3);
// Add button callbacks
seconds.addCallback
(
"activate",
this, &Dialog::cb_start
);
start.addCallback
(
"clicked",
this, &Dialog::cb_start
);
quit.addCallback
(
"clicked",
finalcut::getFApplication(),
&finalcut::FApplication::cb_exitApp,
this
);
}
//----------------------------------------------------------------------
void Dialog::initLayout()
{
FDialog::setText ("Dialog");
FDialog::setGeometry (FPoint{26, 5}, FSize{28, 10});
seconds.setGeometry (FPoint{10, 2}, FSize{10, 1});
start.setGeometry (FPoint{2, 6}, FSize{10, 1});
quit.setGeometry (FPoint{15, 6}, FSize{10, 1});
FDialog::initLayout();
}
//----------------------------------------------------------------------
void Dialog::adjustSize()
{
finalcut::FDialog::adjustSize();
auto x = int((getDesktopWidth() - getWidth()) / 2);
const int y = 5;
if ( x < 1 )
x = 1;
setPos (FPoint{x, y}, false);
}
//----------------------------------------------------------------------
void Dialog::onTimer (finalcut::FTimerEvent*)
{
delOwnTimers();
busy_indicator.stop();
}
//----------------------------------------------------------------------
void Dialog::cb_start()
{
if ( seconds.getValue() < 1 )
return;
busy_indicator.start();
addTimer(int(seconds.getValue() * 1000));
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
finalcut::FApplication app(argc, argv);
Dialog dialog(&app);
finalcut::FWidget::setMainWidget(&dialog);
dialog.show();
return app.exec();
}

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,17 @@
/***********************************************************************
* checklist.cpp - Example for FListView widget with checkboxes *
* *
* This file is part of the Final Cut widget toolkit *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2017-2018 Markus Gans *
* Copyright 2017-2021 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
@ -20,75 +20,74 @@
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <array>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FRect;
using finalcut::FSize;
//----------------------------------------------------------------------
// class CheckList
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class CheckList : public finalcut::FDialog
class CheckList final : public finalcut::FDialog
{
public:
// Constructor
explicit CheckList (finalcut::FWidget* = 0);
explicit CheckList (finalcut::FWidget* = nullptr);
// Disable copy constructor
CheckList (const CheckList&) = delete;
// Destructor
~CheckList();
~CheckList() override = default;
// Disable copy assignment operator (=)
CheckList& operator = (const CheckList&) = delete;
private:
// Disable copy constructor
CheckList (const CheckList&);
// Disable assignment operator (=)
CheckList& operator = (const CheckList&);
// Method
void populate();
void initLayout() override;
void adjustSize() override;
// Event handlers
virtual void onKeyPress (finalcut::FKeyEvent*);
virtual void onClose (finalcut::FCloseEvent*);
void onKeyPress (finalcut::FKeyEvent*) override;
void onClose (finalcut::FCloseEvent*) override;
// Callback method
void cb_showList (finalcut::FWidget*, data_ptr);
void cb_showList();
// Data Members
finalcut::FListView listView;
finalcut::FStatusBar status_bar;
// Data members
finalcut::FListView listview{this};
finalcut::FStatusBar status_bar{this};
};
#pragma pack(pop)
//----------------------------------------------------------------------
CheckList::CheckList (finalcut::FWidget* parent)
: finalcut::FDialog(parent)
, listView(this)
, status_bar(this)
: finalcut::FDialog{parent}
{
setText (L"Shopping list");
setShadow();
setGeometry (int(1 + (parent->getWidth() - 30) / 2), 5, 30, 13);
listView.ignorePadding();
listView.setGeometry (1, 2, getWidth(), getHeight() - 1);
setShadow(); // Instead of the transparent window shadow
listview.ignorePadding();
// Add columns to the view
listView.addColumn ("Item");
listView.addColumn ("Priority", 12);
listview.addColumn ("Item");
listview.addColumn ("Priority", 9);
// Set the type of sorting
listView.setColumnSortType (1, finalcut::fc::by_name);
listView.setColumnSortType (2, finalcut::fc::by_name);
listview.setColumnSortType (1, finalcut::SortType::Name);
listview.setColumnSortType (2, finalcut::SortType::Name);
// Statusbar at the bottom
finalcut::FString separator;
separator << ' ' << wchar_t(finalcut::fc::BoxDrawingsVertical) << ' ';
listView.setStatusbarMessage ( finalcut::FString()
finalcut::FString separator{};
separator << ' ' << finalcut::UniChar::BoxDrawingsVertical << ' ';
listview.setStatusbarMessage ( finalcut::FString{}
<< "<Q> exit" << separator
<< "<Space> select an item" << separator
<< "<Enter> see your pick list");
@ -97,55 +96,66 @@ CheckList::CheckList (finalcut::FWidget* parent)
populate();
// Add callback method
listView.addCallback
listview.addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &CheckList::cb_showList)
this, &CheckList::cb_showList
);
}
//----------------------------------------------------------------------
CheckList::~CheckList() // destructor
{ }
//----------------------------------------------------------------------
void CheckList::populate()
{
std::string list[][2] =
{
{ "Milk", "Highest" },
{ "Cheese", "High" },
{ "Yoghurt", "Medium" },
{ "Bread", "Low" },
{ "Eggs", "High" },
{ "Toothpaste", "Medium" },
{ "Apples", "Lowest" },
{ "Bananas", "Medium" },
{ "Fish", "Medium" },
{ "Lemons", "Low" }
};
constexpr std::array<std::array<const char*, 2>, 10> list =
{{
{{ "Milk", "Highest" }},
{{ "Cheese", "High" }},
{{ "Yoghurt", "Medium" }},
{{ "Bread", "Low" }},
{{ "Eggs", "High" }},
{{ "Toothpaste", "Medium" }},
{{ "Apples", "Lowest" }},
{{ "Bananas", "Medium" }},
{{ "Fish", "Medium" }},
{{ "Lemons", "Low" }}
}};
const int lastItem = int(sizeof(list) / sizeof(list[0])) - 1;
for (int i = 0; i <= lastItem; i++)
for (const auto& line : list)
{
const finalcut::FStringList line (&list[i][0], &list[i][0] + 2);
finalcut::FObject::FObjectIterator iter = listView.insert (line);
finalcut::FListViewItem* item = \
static_cast<finalcut::FListViewItem*>(*iter);
const finalcut::FStringList string_line (line.begin(), line.end());
auto iter = listview.insert (string_line);
auto item = static_cast<finalcut::FListViewItem*>(*iter);
item->setCheckable(true);
}
}
//----------------------------------------------------------------------
void CheckList::initLayout()
{
FDialog::setText (L"Shopping list");
const std::size_t nf_offset = ( finalcut::FTerm::isNewFont() ) ? 1 : 0;
FDialog::setSize (FSize{28 + nf_offset, 13} );
listview.setGeometry ( FPoint{1 + int(nf_offset), 2}
, FSize{getWidth() - nf_offset, getHeight() - 1} );
FDialog::initLayout();
}
//----------------------------------------------------------------------
void CheckList::adjustSize()
{
finalcut::FDialog::adjustSize();
setPos(FPoint{int(1 + (getDesktopWidth() - getWidth()) / 2), 5});
}
//----------------------------------------------------------------------
void CheckList::onKeyPress (finalcut::FKeyEvent* ev)
{
if ( ! ev )
return;
if ( ev->key() == 'q'
|| ev->key() == finalcut::fc::Fkey_escape
|| ev->key() == finalcut::fc::Fkey_escape_mintty )
if ( ev->key() == finalcut::FKey('q')
|| ev->key() == finalcut::FKey::Escape
|| ev->key() == finalcut::FKey::Escape_mintty )
{
close();
ev->accept();
@ -161,21 +171,14 @@ void CheckList::onClose (finalcut::FCloseEvent* ev)
}
//----------------------------------------------------------------------
void CheckList::cb_showList (finalcut::FWidget*, data_ptr)
void CheckList::cb_showList()
{
finalcut::FListViewIterator iter = listView.beginOfList();
finalcut::FString shopping_list;
finalcut::FString shopping_list{};
while ( iter != listView.endOfList() )
for (auto item : listview.getData())
{
const finalcut::FListViewItem* item = \
static_cast<finalcut::FListViewItem*>(*iter);
if ( item->isChecked() )
shopping_list << wchar_t(finalcut::fc::Bullet) << ' '
<< item->getText(1) << '\n';
++iter;
shopping_list << finalcut::UniChar::Bullet << ' ' << item->getText(1) << '\n';
}
if ( shopping_list.isEmpty() )
@ -202,7 +205,7 @@ int main (int argc, char* argv[])
CheckList d(&app);
// Set dialog d as main widget
app.setMainWidget(&d);
finalcut::FWidget::setMainWidget(&d);
// Show and start the application
d.show();

View File

@ -1,17 +1,17 @@
/***********************************************************************
* choice.cpp - FButtonGroup with scroll view *
* *
* This file is part of the Final Cut widget toolkit *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2017-2018 Markus Gans *
* Copyright 2017-2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
@ -20,41 +20,46 @@
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <memory>
#include <vector>
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FSize;
// function prototypes
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr);
void populateChoice (std::vector<finalcut::FRadioButton*>&, finalcut::FButtonGroup*);
void preset (std::vector<finalcut::FRadioButton*>&);
// Using-declaration
using FRadioButtonPtr = std::shared_ptr<finalcut::FRadioButton>;
// Function prototypes
void cb_quit (finalcut::FDialog&);
void populateChoice (std::vector<FRadioButtonPtr>&, finalcut::FButtonGroup&);
void preset (std::vector<FRadioButtonPtr>&);
//----------------------------------------------------------------------
// callback functions
// Callback functions
//----------------------------------------------------------------------
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
void cb_quit (finalcut::FDialog& dlg)
{
finalcut::FDialog* dlg = static_cast<finalcut::FDialog*>(data);
dlg->close();
dlg.close();
}
//----------------------------------------------------------------------
void populateChoice ( std::vector<finalcut::FRadioButton*>& os
, finalcut::FButtonGroup* group )
void populateChoice ( std::vector<FRadioButtonPtr>& os
, finalcut::FButtonGroup& group )
{
os[0] = new finalcut::FRadioButton("AIX", group);
os[1] = new finalcut::FRadioButton("Cygwin", group);
os[2] = new finalcut::FRadioButton("FreeBSD", group);
os[3] = new finalcut::FRadioButton("HP-UX", group);
os[4] = new finalcut::FRadioButton("Linux", group);
os[5] = new finalcut::FRadioButton("Mac OS X", group);
os[6] = new finalcut::FRadioButton("NetBSD", group);
os[7] = new finalcut::FRadioButton("OpenBSD", group);
os[8] = new finalcut::FRadioButton("Solaris", group);
os[0] = std::make_shared<finalcut::FRadioButton>("AIX", &group);
os[1] = std::make_shared<finalcut::FRadioButton>("Cygwin", &group);
os[2] = std::make_shared<finalcut::FRadioButton>("FreeBSD", &group);
os[3] = std::make_shared<finalcut::FRadioButton>("HP-UX", &group);
os[4] = std::make_shared<finalcut::FRadioButton>("Linux", &group);
os[5] = std::make_shared<finalcut::FRadioButton>("Mac OS X", &group);
os[6] = std::make_shared<finalcut::FRadioButton>("NetBSD", &group);
os[7] = std::make_shared<finalcut::FRadioButton>("OpenBSD", &group);
os[8] = std::make_shared<finalcut::FRadioButton>("Solaris", &group);
}
//----------------------------------------------------------------------
void preset (std::vector<finalcut::FRadioButton*>& os)
void preset (std::vector<FRadioButtonPtr>& os)
{
#if defined(_AIX)
os[0]->setChecked();
@ -91,58 +96,58 @@ void preset (std::vector<finalcut::FRadioButton*>& os)
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
finalcut::FString label_text = "no OS";
finalcut::FString label_text{"no OS"};
// Create the application object
finalcut::FApplication app(argc, argv);
finalcut::FApplication app{argc, argv};
{ // Create a simple modal dialog box in this scope
finalcut::FDialog dgl(&app);
finalcut::FDialog dgl{&app};
dgl.setModal();
dgl.setText ("UNIX select");
std::size_t w = 20;
std::size_t h = 13;
int x = int(app.getDesktopWidth() - w) / 2;
int y = int(app.getDesktopHeight() - h) / 2;
dgl.setGeometry (x, y, w, h);
const std::size_t w{20};
const std::size_t h{13};
const int x = int(app.getDesktopWidth() - w) / 2;
const int y = int(app.getDesktopHeight() - h) / 2;
dgl.setGeometry (FPoint{x, y}, FSize{w, h});
// Create a button group
finalcut::FButtonGroup checkButtonGroup("choice", &dgl);
checkButtonGroup.setGeometry (2, 1, 16, 7);
checkButtonGroup.setGeometry (FPoint{2, 1}, FSize{16, 7});
// Create radio buttons
std::vector<finalcut::FRadioButton*> os (9);
populateChoice (os, &checkButtonGroup);
std::vector<FRadioButtonPtr> os(9);
populateChoice (os, checkButtonGroup);
// Set the radio button geometry
// => checkButtonGroup.setScrollSize(...) is not required
// because a FButtonGroup is self-adjusting
for (uInt i = 0; i < os.size(); i++)
os[i]->setGeometry(1, int(1 + i), 12, 1);
for (uInt i{0}; i < os.size(); i++)
os[i]->setGeometry(FPoint{1, int(1 + i)}, FSize{12, 1});
preset(os);
// Scroll to the focused child element
finalcut::FFocusEvent cfi (finalcut::fc::ChildFocusIn_Event);
finalcut::FApplication::sendEvent(&checkButtonGroup, &cfi);
finalcut::FFocusEvent cfi (finalcut::Event::ChildFocusIn);
app.queueEvent(&checkButtonGroup, &cfi);
// Create a OK button
finalcut::FButton ok("&OK", &dgl);
ok.setGeometry (10, 9, 8, 1);
ok.setGeometry (FPoint{10, 9}, FSize{8, 1});
// Connect the button signal "clicked" with the callback function
ok.addCallback
(
"clicked",
F_FUNCTION_CALLBACK (&cb_quit),
&dgl
&cb_quit,
std::ref(dgl)
);
// Show the dialog
dgl.show();
// Get the checked radio button text
for (int n = 1; n <= int(checkButtonGroup.getCount()); n++)
for (auto n{1}; n <= int(checkButtonGroup.getCount()); n++)
{
if ( checkButtonGroup.isChecked(n) )
{
@ -152,9 +157,8 @@ int main (int argc, char* argv[])
}
} // Hide and destroy the dialog object
// Create and show tooltip for two seconds
finalcut::FToolTip tooltip(&app);
finalcut::FToolTip tooltip{&app};
tooltip.setText ("You have chosen " + label_text);
tooltip.show();
sleep(2);

View File

@ -1,17 +1,17 @@
/***********************************************************************
* dialog.cpp - A FDialog example *
* *
* This file is part of the Final Cut widget toolkit *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2015-2018 Markus Gans *
* Copyright 2015-2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
@ -22,17 +22,19 @@
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FSize;
// function prototype
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr);
void cb_quit (const finalcut::FApplication&);
//----------------------------------------------------------------------
// callback function
//----------------------------------------------------------------------
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
void cb_quit (const finalcut::FApplication& app)
{
finalcut::FApplication* app = static_cast<finalcut::FApplication*>(data);
app->quit();
app.quit();
}
@ -42,43 +44,43 @@ void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
int main (int argc, char* argv[])
{
// Create the application object
finalcut::FApplication app(argc, argv);
finalcut::FApplication app{argc, argv};
// Create a simple dialog box
finalcut::FDialog dgl(&app);
finalcut::FDialog dgl{&app};
dgl.setText ("FDialog");
dgl.setGeometry (4, 3, 41, 11);
dgl.setGeometry (FPoint{4, 3}, FSize{41, 11});
// Create text labels
finalcut::FLabel label_1(&dgl);
finalcut::FLabel label_2(&dgl);
finalcut::FLabel label_1{&dgl};
finalcut::FLabel label_2{&dgl};
label_1 << wchar_t(finalcut::fc::BlackUpPointingTriangle)
<< std::wstring(L"\n")
<< wchar_t(finalcut::fc::BoxDrawingsUpAndRight)
<< finalcut::FString(2, wchar_t(finalcut::fc::BoxDrawingsHorizontal))
label_1 << finalcut::UniChar::BlackUpPointingTriangle
<< std::wstring{L"\n"}
<< finalcut::UniChar::BoxDrawingsUpAndRight
<< finalcut::FString{2, finalcut::UniChar::BoxDrawingsHorizontal}
<< " Double click the title bar button,";
label_2 << "press Q on the keyboard,\n"
<< "or push the button below to exit\n"
<< "the program.";
label_1.setGeometry (1, 1, 38, 2);
label_2.setGeometry (5, 3, 34, 3);
label_1.setGeometry (FPoint{1, 1}, FSize{38, 2});
label_2.setGeometry (FPoint{5, 3}, FSize{34, 3});
// Create the quit button
finalcut::FButton btn("&Quit", &dgl);
btn.setGeometry (16, 7, 9, 1);
finalcut::FButton btn{"&Quit", &dgl};
btn.setGeometry (FPoint{16, 7}, FSize{9, 1});
// Connect the button signal "clicked" with the callback function
btn.addCallback
(
"clicked",
F_FUNCTION_CALLBACK (&cb_quit),
&app
&cb_quit,
std::ref(app)
);
// Set dialog object as main widget
app.setMainWidget(&dgl);
finalcut::FWidget::setMainWidget(&dgl);
// Show and start the application
dgl.show();

357
examples/event-log.cpp Normal file
View File

@ -0,0 +1,357 @@
/***********************************************************************
* event-log.cpp - Logs events in a dialog box *
* *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2020-2021 Markus Gans *
* *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <fstream>
#include <sstream>
#include <tuple>
#include <utility>
#include <vector>
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FRect;
using finalcut::FSize;
class EventLog; // class forward declaration
//----------------------------------------------------------------------
// class EventLog::EventLog
//----------------------------------------------------------------------
class EventDialog final : public finalcut::FDialog
{
public:
// Constructor
explicit EventDialog (finalcut::FWidget* = nullptr);
// Disable copy constructor
EventDialog (const EventDialog&) = delete;
// Destructor
~EventDialog() noexcept override;
// Disable copy assignment operator (=)
EventDialog& operator = (const EventDialog&) = delete;
private:
// Methods
void initLayout() override;
finalcut::FString getMouseButtonName (const finalcut::MouseButton&) const;
void logMouseEvent ( const finalcut::FString&
, const finalcut::FMouseEvent& );
// Event handlers
void onClose (finalcut::FCloseEvent*) override;
void onShow (finalcut::FShowEvent*) override;
void onTimer (finalcut::FTimerEvent*) override;
void onKeyPress (finalcut::FKeyEvent*) override;
void onMouseDown (finalcut::FMouseEvent*) override;
void onMouseMove (finalcut::FMouseEvent*) override;
void onMouseUp (finalcut::FMouseEvent*) override;
void onMouseDoubleClick (finalcut::FMouseEvent* ev) override;
void onWindowActive (finalcut::FEvent*) override;
void onWindowInactive (finalcut::FEvent*) override;
void onWindowRaised (finalcut::FEvent*) override;
void onWindowLowered (finalcut::FEvent*) override;
// Data members
finalcut::FLog& log{*finalcut::FApplication::getLog()};
finalcut::FLabel label{this};
};
//----------------------------------------------------------------------
EventDialog::EventDialog (finalcut::FWidget* parent)
: FDialog{parent}
{
setShadow();
label.setText("\n\nUse the keyboard or mouse\n"
"in this dialog to create events");
label.setAlignment(finalcut::Align::Center);
addTimer(60000); // Starts the timer every minute
}
//----------------------------------------------------------------------
EventDialog::~EventDialog() noexcept = default; // destructor
//----------------------------------------------------------------------
void EventDialog::initLayout()
{
FDialog::setText ("Event dialog");
FDialog::setGeometry (FPoint{15, 2}, FSize{53, 12});
label.setGeometry (FPoint(1, 1), getClientSize(), false);
FDialog::initLayout();
}
//----------------------------------------------------------------------
finalcut::FString EventDialog::getMouseButtonName (const finalcut::MouseButton& btn_state) const
{
const auto& empty = finalcut::fc::emptyFString::get();
auto S = bool(btn_state & finalcut::MouseButton::Shift);
auto C = bool(btn_state & finalcut::MouseButton::Control);
auto M = bool(btn_state & finalcut::MouseButton::Meta);
auto l = bool(btn_state & finalcut::MouseButton::Left);
auto r = bool(btn_state & finalcut::MouseButton::Right);
auto m = bool(btn_state & finalcut::MouseButton::Middle);
auto prefix = (S ? finalcut::FString("Shift+") : empty)
+ (C ? finalcut::FString("Control+") : empty)
+ (M ? finalcut::FString("Meta+") : empty);
if ( l )
return prefix + "left";
else if ( r )
return prefix + "right";
else if ( m )
return prefix + "middle";
return "unknown";
}
//----------------------------------------------------------------------
void EventDialog::logMouseEvent ( const finalcut::FString& state
, const finalcut::FMouseEvent& ev )
{
const int mouse_x = ev.getX();
const int mouse_y = ev.getY();
log << finalcut::FLog::LogLevel::Info
<< getMouseButtonName(ev.getButton())
<< " mouse button " << state << " at ("
<< mouse_x << ", " << mouse_y << ")" << std::flush;
}
//----------------------------------------------------------------------
void EventDialog::onClose (finalcut::FCloseEvent* ev)
{
log.info("The event dialog was closed");
ev->accept();
}
//----------------------------------------------------------------------
void EventDialog::onShow (finalcut::FShowEvent*)
{
log.info("The event dialog is now displayed");
}
//----------------------------------------------------------------------
void EventDialog::onTimer (finalcut::FTimerEvent*)
{
log.info("-- minute marker --");
}
//----------------------------------------------------------------------
void EventDialog::onKeyPress (finalcut::FKeyEvent* ev)
{
const finalcut::FKey key_id = ev->key();
finalcut::FString key_name = finalcut::FTerm::getKeyName(key_id);
if ( key_name.isEmpty() )
key_name = wchar_t(key_id);
// std::clog redirects all stream data to FLogger
std::clog << finalcut::FLog::LogLevel::Info
<< "Key " << key_name
<< " (id " << uInt32(key_id) << ")" << std::flush;
finalcut::FDialog::onKeyPress(ev);
}
//----------------------------------------------------------------------
void EventDialog::onMouseDown (finalcut::FMouseEvent* ev)
{
logMouseEvent("down", *ev);
finalcut::FDialog::onMouseDown(ev);
}
//----------------------------------------------------------------------
void EventDialog::onMouseMove (finalcut::FMouseEvent* ev)
{
logMouseEvent("move", *ev);
finalcut::FDialog::onMouseMove(ev);
}
//----------------------------------------------------------------------
void EventDialog::onMouseUp (finalcut::FMouseEvent* ev)
{
logMouseEvent("up", *ev);
finalcut::FDialog::onMouseUp(ev);
}
//----------------------------------------------------------------------
void EventDialog::onMouseDoubleClick (finalcut::FMouseEvent* ev)
{
logMouseEvent("double click", *ev);
finalcut::FDialog::onMouseDoubleClick(ev);
}
//----------------------------------------------------------------------
void EventDialog::onWindowActive (finalcut::FEvent* ev)
{
log.info("The Event dialog is now active");
finalcut::FDialog::onWindowActive(ev);
}
//----------------------------------------------------------------------
void EventDialog::onWindowInactive (finalcut::FEvent* ev)
{
log.info("The Event dialog is now inactive");
finalcut::FDialog::onWindowInactive(ev);
}
//----------------------------------------------------------------------
void EventDialog::onWindowRaised (finalcut::FEvent* ev)
{
log.info("The dialog was raised");
finalcut::FDialog::onWindowRaised(ev);
}
//----------------------------------------------------------------------
void EventDialog::onWindowLowered (finalcut::FEvent* ev)
{
log.info("The dialog was lowered");
finalcut::FDialog::onWindowLowered(ev);
}
//----------------------------------------------------------------------
// class EventLog
//----------------------------------------------------------------------
class EventLog final : public finalcut::FDialog, public std::ostringstream
{
public:
// Constructor
explicit EventLog (finalcut::FWidget* = nullptr);
// Disable copy constructor
EventLog (const EventLog&) = delete;
// Destructor
~EventLog() noexcept override;
// Disable copy assignment operator (=)
EventLog& operator = (const EventLog&) = delete;
// Event handlers
void onTimer (finalcut::FTimerEvent*) override;
void onClose (finalcut::FCloseEvent*) override;
private:
// Method
void initLayout() override;
void adjustSize() override;
// Data members
finalcut::FTextView scrolltext{this};
EventDialog* event_dialog{new EventDialog(this)};
};
//----------------------------------------------------------------------
EventLog::EventLog (finalcut::FWidget* parent)
: FDialog{parent}
{
setMinimumSize (FSize{75, 5});
setShadow();
scrolltext.ignorePadding();
event_dialog->setFocus();
addTimer(250); // Starts the timer every 250 milliseconds
}
//----------------------------------------------------------------------
EventLog::~EventLog() noexcept = default; // destructor
//----------------------------------------------------------------------
void EventLog::onTimer (finalcut::FTimerEvent*)
{
if ( str().empty() )
return;
scrolltext.append(str());
str("");
scrolltext.scrollToEnd();
redraw();
}
//----------------------------------------------------------------------
void EventLog::onClose (finalcut::FCloseEvent* ev)
{
finalcut::FApplication::closeConfirmationDialog (this, ev);
}
//----------------------------------------------------------------------
void EventLog::initLayout()
{
FDialog::setText ("Event log");
FDialog::setGeometry (FPoint{4, 16}, FSize{75, 8});
FDialog::setResizeable();
scrolltext.setGeometry (FPoint{1, 2}, FSize{getWidth(), getHeight() - 1});
FDialog::initLayout();
}
//----------------------------------------------------------------------
void EventLog::adjustSize()
{
finalcut::FDialog::adjustSize();
scrolltext.setGeometry (FPoint{1, 2}, FSize(getWidth(), getHeight() - 1));
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
finalcut::FApplication app(argc, argv);
EventLog dialog(&app);
// Get the global logger object
finalcut::FLog& log = *finalcut::FApplication::getLog();
// Set the line endings (default = CRLF)
log.setLineEnding (finalcut::FLog::LineEnding::LF);
// Write a timestamp before each output line
log.enableTimestamp();
// Set the dialog object as output stream
log.setOutputStream(dialog);
// ----------------------------------------------
// Remove the comment characters in the following
// two lines to log the output to a file.
// ----------------------------------------------
//std::ofstream file_stream("test.log", std::ofstream::out | std::ofstream::app);
//log.setOutputStream(file_stream);
// Sets the dialog as main widget
finalcut::FWidget::setMainWidget(&dialog);
// Show the dialog
dialog.show();
// Run the application
return app.exec();
}

Some files were not shown because too many files have changed in this diff Show More