Changeset ebb1489 in mainline for uspace/app
- Timestamp:
- 2024-10-13T08:23:40Z (18 months ago)
- Parents:
- 2a0c827c (diff), b3b79981 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - git-author:
- boba-buba <120932204+boba-buba@…> (2024-10-13 08:23:40)
- git-committer:
- GitHub <noreply@…> (2024-10-13 08:23:40)
- Location:
- uspace/app
- Files:
-
- 2 added
- 2 deleted
- 36 edited
-
bdsh/cmds/modules/help/help.c (modified) (1 diff)
-
blkdump/blkdump.c (modified) (2 diffs)
-
contacts/contacts.c (deleted)
-
contacts/doc/doxygroups.h (deleted)
-
dltest/dltest.c (modified) (4 diffs)
-
download/main.c (modified) (1 diff)
-
edit/edit.c (modified) (30 diffs)
-
edit/sheet.c (modified) (2 diffs)
-
edit/sheet.h (modified) (2 diffs)
-
getterm/welcome.c (modified) (1 diff)
-
gfxdemo/gfxdemo.c (modified) (9 diffs)
-
hbench/benchlist.c (modified) (2 diffs)
-
hbench/disk/randread.c (added)
-
hbench/disk/seqread.c (added)
-
hbench/hbench.h (modified) (2 diffs)
-
hbench/meson.build (modified) (3 diffs)
-
init/init.c (modified) (10 diffs)
-
init/meson.build (modified) (1 diff)
-
init/untar.c (modified) (2 diffs)
-
meson.build (modified) (1 diff)
-
mkexfat/mkexfat.c (modified) (2 diffs)
-
mkfat/mkfat.c (modified) (6 diffs)
-
mkmfs/mkmfs.c (modified) (2 diffs)
-
pkg/pkg.c (modified) (1 diff)
-
sysinst/meson.build (modified) (1 diff)
-
sysinst/sysinst.c (modified) (10 diffs)
-
taskbar-cfg/main.c (modified) (2 diffs)
-
taskbar-cfg/smeedit.c (modified) (2 diffs)
-
taskbar-cfg/startmenu.c (modified) (8 diffs)
-
taskbar/taskbar.c (modified) (1 diff)
-
taskbar/taskbar.sif (modified) (1 diff)
-
terminal/meson.build (modified) (1 diff)
-
terminal/terminal.c (modified) (38 diffs)
-
terminal/terminal.h (modified) (4 diffs)
-
tester/print/print2.c (modified) (1 diff)
-
tetris/screen.c (modified) (7 diffs)
-
tetris/screen.h (modified) (1 diff)
-
tetris/tetris.c (modified) (1 diff)
-
uidemo/uidemo.c (modified) (1 diff)
-
viewer/viewer.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/cmds/modules/help/help.c
r2a0c827c rebb1489 154 154 "This is but a small glimpse of what you can do with HelenOS. " 155 155 "To learn more please point your browser to the HelenOS User's " 156 "Guide: http ://trac.helenos.org/wiki/UsersGuide\n\n",156 "Guide: https://www.helenos.org/wiki/UsersGuide\n\n", 157 157 ALIGN_LEFT); 158 158 } -
uspace/app/blkdump/blkdump.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2011 Martin Sucha 3 * Copyright (c) 2013 Jiri Svoboda4 4 * All rights reserved. 5 5 * … … 150 150 } 151 151 152 rc = block_init(service_id , 2048);152 rc = block_init(service_id); 153 153 if (rc != EOK) { 154 154 printf(NAME ": Error initializing libblock.\n"); -
uspace/app/dltest/dltest.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 20 16Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 571 571 #ifdef DLTEST_LINKED 572 572 573 /** Test if we can read the correct value of a public pointer variable. 574 * 575 * dl_public_ptr_var is initialized in libdltest to point to dl_public_var. 576 * This is done using a relocation. The main program (unless compiled with 577 * PIC or PIE) will contain a copy of dl_public_ptr_var. This needs 578 * to be copied using a COPY relocation. The relocations in the main 579 * program need to be processed after the relocations in the shared 580 * libraries (so that we copy the correct value). 581 */ 582 static bool test_public_ptr_var(void) 583 { 584 int *ptr; 585 586 printf("Read dl_public_ptr_var directly...\n"); 587 ptr = dl_public_ptr_var; 588 589 if (ptr != &dl_public_var) { 590 printf("FAILED\n"); 591 return false; 592 } 593 594 printf("Passed\n"); 595 return true; 596 } 597 573 598 /** Test directly calling function that returns a constant */ 574 599 static bool test_lnk_dl_get_constant(void) … … 920 945 921 946 #ifndef STATIC_EXE 947 922 948 if (!test_dlfcn_dl_get_private_fib_var()) 923 949 return 1; … … 974 1000 975 1001 if (!test_lnk_read_public_uvar()) 1002 return 1; 1003 1004 if (!test_public_ptr_var()) 976 1005 return 1; 977 1006 -
uspace/app/download/main.c
r2a0c827c rebb1489 61 61 fprintf(stderr, " to redirect the output, e.g.\n"); 62 62 fprintf(stderr, "\n"); 63 fprintf(stderr, " download http:// helenos.org/ | to helenos.html\n\n");63 fprintf(stderr, " download http://test-ipv4.helenos.org/ | to test.html\n\n"); 64 64 } 65 65 -
uspace/app/edit/edit.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2012 Martin Sucha 4 4 * All rights reserved. … … 177 177 static void pos_handle(pos_event_t *ev); 178 178 179 static errno_t file_new(void); 180 static void file_open(void); 181 static errno_t file_open_file(const char *fname); 179 182 static errno_t file_save(char const *fname); 180 183 static void file_save_as(void); 181 static errno_t file_insert(c har *fname);184 static errno_t file_insert(const char *fname); 182 185 static errno_t file_save_range(char const *fname, spt_t const *spos, 183 186 spt_t const *epos); … … 238 241 239 242 static void edit_wnd_close(ui_window_t *, void *); 243 static void edit_wnd_focus(ui_window_t *, void *, unsigned); 240 244 static void edit_wnd_kbd_event(ui_window_t *, void *, kbd_event_t *); 245 static void edit_wnd_unfocus(ui_window_t *, void *, unsigned); 241 246 242 247 static ui_window_cb_t edit_window_cb = { 243 248 .close = edit_wnd_close, 244 .kbd = edit_wnd_kbd_event 249 .focus = edit_wnd_focus, 250 .kbd = edit_wnd_kbd_event, 251 .unfocus = edit_wnd_unfocus 245 252 }; 246 253 254 static void edit_menubar_activate(ui_menu_bar_t *, void *); 255 static void edit_menubar_deactivate(ui_menu_bar_t *, void *); 256 257 static ui_menu_bar_cb_t edit_menubar_cb = { 258 .activate = edit_menubar_activate, 259 .deactivate = edit_menubar_deactivate 260 }; 261 262 static void edit_file_new(ui_menu_entry_t *, void *); 263 static void edit_file_open(ui_menu_entry_t *, void *); 247 264 static void edit_file_save(ui_menu_entry_t *, void *); 248 265 static void edit_file_save_as(ui_menu_entry_t *, void *); … … 269 286 }; 270 287 288 static void open_dialog_bok(ui_file_dialog_t *, void *, const char *); 289 static void open_dialog_bcancel(ui_file_dialog_t *, void *); 290 static void open_dialog_close(ui_file_dialog_t *, void *); 291 292 static ui_file_dialog_cb_t open_dialog_cb = { 293 .bok = open_dialog_bok, 294 .bcancel = open_dialog_bcancel, 295 .close = open_dialog_close 296 }; 297 271 298 static void save_as_dialog_bok(ui_file_dialog_t *, void *, const char *); 272 299 static void save_as_dialog_bcancel(ui_file_dialog_t *, void *); … … 301 328 int main(int argc, char *argv[]) 302 329 { 303 bool new_file;304 330 errno_t rc; 305 331 … … 307 333 pane.sh_column = 1; 308 334 309 /* Start with an empty sheet. */ 310 rc = sheet_create(&doc.sh); 311 if (rc != EOK) { 312 printf("Out of memory.\n"); 313 return -1; 314 } 315 316 /* Place caret at the beginning of file. */ 317 spt_t sof; 318 pt_get_sof(&sof); 319 sheet_place_tag(doc.sh, &sof, &pane.caret_pos); 320 pane.ideal_column = 1; 335 /* Create UI */ 336 rc = edit_ui_create(&edit); 337 if (rc != EOK) 338 return 1; 321 339 322 340 if (argc == 2) { 323 341 doc.file_name = str_dup(argv[1]); 342 rc = file_open_file(argv[1]); 343 if (rc != EOK) { 344 status_display("File not found. Starting empty file."); 345 rc = file_new(); 346 } 324 347 } else if (argc > 1) { 325 348 printf("Invalid arguments.\n"); 326 349 return -2; 327 350 } else { 328 doc.file_name = NULL; 329 } 330 331 new_file = false; 332 333 if (doc.file_name == NULL || file_insert(doc.file_name) != EOK) 334 new_file = true; 335 336 /* Place selection start tag. */ 337 sheet_place_tag(doc.sh, &sof, &pane.sel_start); 338 339 /* Move to beginning of file. */ 340 pt_get_sof(&sof); 341 342 /* Create UI */ 343 rc = edit_ui_create(&edit); 344 if (rc != EOK) 345 return 1; 346 347 caret_move(sof, true, true); 351 rc = file_new(); 352 } 348 353 349 354 /* Initial display */ … … 353 358 return rc; 354 359 } 355 356 pane_status_display(&pane);357 if (new_file && doc.file_name != NULL)358 status_display("File not found. Starting empty file.");359 pane_caret_display(&pane);360 cursor_setvis(true);361 360 362 361 ui_run(edit.ui); … … 378 377 ui_menu_t *mfile = NULL; 379 378 ui_menu_t *medit = NULL; 379 ui_menu_entry_t *mnew = NULL; 380 ui_menu_entry_t *mopen = NULL; 380 381 ui_menu_entry_t *msave = NULL; 381 382 ui_menu_entry_t *msaveas = NULL; … … 431 432 } 432 433 434 ui_menu_bar_set_cb(edit->menubar, &edit_menubar_cb, (void *) edit); 435 433 436 rc = ui_menu_dd_create(edit->menubar, "~F~ile", NULL, &mfile); 434 437 if (rc != EOK) { … … 437 440 } 438 441 442 rc = ui_menu_entry_create(mfile, "~N~ew", "Ctrl-N", &mnew); 443 if (rc != EOK) { 444 printf("Error creating menu.\n"); 445 return rc; 446 } 447 448 ui_menu_entry_set_cb(mnew, edit_file_new, (void *) edit); 449 450 rc = ui_menu_entry_create(mfile, "~O~pen", "Ctrl-O", &mopen); 451 if (rc != EOK) { 452 printf("Error creating menu.\n"); 453 return rc; 454 } 455 456 ui_menu_entry_set_cb(mopen, edit_file_open, (void *) edit); 457 439 458 rc = ui_menu_entry_create(mfile, "~S~ave", "Ctrl-S", &msave); 440 459 if (rc != EOK) { … … 541 560 ui_menu_entry_set_cb(mfindr, edit_search_reverse_find, (void *) edit); 542 561 543 rc = ui_menu_entry_create(msearch, "Find ~N~ext", "Ctrl- N", &mfindn);562 rc = ui_menu_entry_create(msearch, "Find ~N~ext", "Ctrl-R", &mfindn); 544 563 if (rc != EOK) { 545 564 printf("Error creating menu.\n"); … … 727 746 ui_quit(edit.ui); 728 747 break; 748 case KC_N: 749 file_new(); 750 break; 751 case KC_O: 752 file_open(); 753 break; 729 754 case KC_S: 730 755 if (doc.file_name != NULL) … … 760 785 search_prompt(false); 761 786 break; 762 case KC_ N:787 case KC_R: 763 788 search_repeat(); 764 789 break; … … 899 924 } 900 925 901 /** Save the document. */ 902 static errno_t file_save(char const *fname) 903 { 904 spt_t sp, ep; 926 /** Create new document. */ 927 static errno_t file_new(void) 928 { 905 929 errno_t rc; 906 907 status_display("Saving..."); 908 pt_get_sof(&sp); 909 pt_get_eof(&ep); 910 911 rc = file_save_range(fname, &sp, &ep); 912 913 switch (rc) { 914 case EINVAL: 915 status_display("Error opening file!"); 916 break; 917 case EIO: 918 status_display("Error writing data!"); 919 break; 920 default: 921 status_display("File saved."); 922 break; 923 } 924 925 return rc; 926 } 927 928 /** Open Save As dialog. */ 929 static void file_save_as(void) 930 sheet_t *sh; 931 932 /* Create empty sheet. */ 933 rc = sheet_create(&sh); 934 if (rc != EOK) { 935 printf("Out of memory.\n"); 936 return ENOMEM; 937 } 938 939 if (doc.sh != NULL) 940 sheet_destroy(doc.sh); 941 942 doc.sh = sh; 943 944 /* Place caret at the beginning of file. */ 945 spt_t sof; 946 pt_get_sof(&sof); 947 sheet_place_tag(doc.sh, &sof, &pane.caret_pos); 948 pane.ideal_column = 1; 949 950 doc.file_name = NULL; 951 952 /* Place selection start tag. */ 953 sheet_place_tag(doc.sh, &sof, &pane.sel_start); 954 955 /* Move to beginning of file. */ 956 pt_get_sof(&sof); 957 958 caret_move(sof, true, true); 959 960 pane_status_display(&pane); 961 pane_caret_display(&pane); 962 pane_text_display(&pane); 963 cursor_setvis(true); 964 965 return EOK; 966 } 967 968 /** Open Open File dialog. */ 969 static void file_open(void) 930 970 { 931 971 const char *old_fname = (doc.file_name != NULL) ? doc.file_name : ""; … … 935 975 936 976 ui_file_dialog_params_init(&fdparams); 977 fdparams.caption = "Open File"; 978 fdparams.ifname = old_fname; 979 980 rc = ui_file_dialog_create(edit.ui, &fdparams, &dialog); 981 if (rc != EOK) { 982 printf("Error creating message dialog.\n"); 983 return; 984 } 985 986 ui_file_dialog_set_cb(dialog, &open_dialog_cb, &edit); 987 } 988 989 /** Open exising document. */ 990 static errno_t file_open_file(const char *fname) 991 { 992 errno_t rc; 993 sheet_t *sh; 994 char *fn; 995 996 /* Create empty sheet. */ 997 rc = sheet_create(&sh); 998 if (rc != EOK) { 999 printf("Out of memory.\n"); 1000 return ENOMEM; 1001 } 1002 1003 fn = str_dup(fname); 1004 if (fn == NULL) { 1005 sheet_destroy(sh); 1006 return ENOMEM; 1007 } 1008 1009 if (doc.sh != NULL) 1010 sheet_destroy(doc.sh); 1011 1012 doc.sh = sh; 1013 1014 /* Place caret at the beginning of file. */ 1015 spt_t sof; 1016 pt_get_sof(&sof); 1017 sheet_place_tag(doc.sh, &sof, &pane.caret_pos); 1018 pane.ideal_column = 1; 1019 1020 rc = file_insert(fname); 1021 if (rc != EOK) 1022 return rc; 1023 1024 doc.file_name = fn; 1025 1026 /* Place selection start tag. */ 1027 sheet_place_tag(doc.sh, &sof, &pane.sel_start); 1028 1029 /* Move to beginning of file. */ 1030 pt_get_sof(&sof); 1031 1032 caret_move(sof, true, true); 1033 1034 pane_status_display(&pane); 1035 pane_caret_display(&pane); 1036 pane_text_display(&pane); 1037 cursor_setvis(true); 1038 1039 return EOK; 1040 } 1041 1042 /** Save the document. */ 1043 static errno_t file_save(char const *fname) 1044 { 1045 spt_t sp, ep; 1046 errno_t rc; 1047 1048 status_display("Saving..."); 1049 pt_get_sof(&sp); 1050 pt_get_eof(&ep); 1051 1052 rc = file_save_range(fname, &sp, &ep); 1053 1054 switch (rc) { 1055 case EINVAL: 1056 status_display("Error opening file!"); 1057 break; 1058 case EIO: 1059 status_display("Error writing data!"); 1060 break; 1061 default: 1062 status_display("File saved."); 1063 break; 1064 } 1065 1066 return rc; 1067 } 1068 1069 /** Open Save As dialog. */ 1070 static void file_save_as(void) 1071 { 1072 const char *old_fname = (doc.file_name != NULL) ? doc.file_name : ""; 1073 ui_file_dialog_params_t fdparams; 1074 ui_file_dialog_t *dialog; 1075 errno_t rc; 1076 1077 ui_file_dialog_params_init(&fdparams); 937 1078 fdparams.caption = "Save As"; 938 1079 fdparams.ifname = old_fname; … … 952 1093 * of the caret. 953 1094 */ 954 static errno_t file_insert(c har *fname)1095 static errno_t file_insert(const char *fname) 955 1096 { 956 1097 FILE *f; … … 2221 2362 } 2222 2363 2364 /** Window focus event 2365 * 2366 * @param window Window 2367 * @param arg Argument (edit_t *) 2368 * @param focus Focus number 2369 */ 2370 static void edit_wnd_focus(ui_window_t *window, void *arg, unsigned focus) 2371 { 2372 edit_t *edit = (edit_t *)arg; 2373 2374 (void)edit; 2375 pane_caret_display(&pane); 2376 cursor_setvis(true); 2377 } 2378 2223 2379 /** Window keyboard event 2224 2380 * … … 2242 2398 } 2243 2399 2400 /** Window unfocus event 2401 * 2402 * @param window Window 2403 * @param arg Argument (edit_t *) 2404 * @param focus Focus number 2405 */ 2406 static void edit_wnd_unfocus(ui_window_t *window, void *arg, unsigned focus) 2407 { 2408 edit_t *edit = (edit_t *) arg; 2409 2410 (void)edit; 2411 cursor_setvis(false); 2412 } 2413 2414 /** Menu bar activate event 2415 * 2416 * @param mbar Menu bar 2417 * @param arg Argument (edit_t *) 2418 */ 2419 static void edit_menubar_activate(ui_menu_bar_t *mbar, void *arg) 2420 { 2421 edit_t *edit = (edit_t *)arg; 2422 2423 (void)edit; 2424 cursor_setvis(false); 2425 } 2426 2427 /** Menu bar deactivate event 2428 * 2429 * @param mbar Menu bar 2430 * @param arg Argument (edit_t *) 2431 */ 2432 static void edit_menubar_deactivate(ui_menu_bar_t *mbar, void *arg) 2433 { 2434 edit_t *edit = (edit_t *)arg; 2435 2436 (void)edit; 2437 pane_caret_display(&pane); 2438 cursor_setvis(true); 2439 } 2440 2441 /** File / New menu entry selected. 2442 * 2443 * @param mentry Menu entry 2444 * @param arg Argument (edit_t *) 2445 */ 2446 static void edit_file_new(ui_menu_entry_t *mentry, void *arg) 2447 { 2448 edit_t *edit = (edit_t *) arg; 2449 2450 (void)edit; 2451 file_new(); 2452 (void) gfx_update(ui_window_get_gc(edit->window)); 2453 } 2454 2455 /** File / Open menu entry selected. 2456 * 2457 * @param mentry Menu entry 2458 * @param arg Argument (edit_t *) 2459 */ 2460 static void edit_file_open(ui_menu_entry_t *mentry, void *arg) 2461 { 2462 edit_t *edit = (edit_t *) arg; 2463 2464 (void)edit; 2465 file_open(); 2466 } 2467 2244 2468 /** File / Save menu entry selected. 2245 2469 * … … 2397 2621 } 2398 2622 2399 /** Save Asdialog OK button press.2400 * 2401 * @param dialog Save Asdialog2623 /** Open File dialog OK button press. 2624 * 2625 * @param dialog Open File dialog 2402 2626 * @param arg Argument (ui_demo_t *) 2403 2627 * @param fname File name 2404 2628 */ 2405 static void save_as_dialog_bok(ui_file_dialog_t *dialog, void *arg,2629 static void open_dialog_bok(ui_file_dialog_t *dialog, void *arg, 2406 2630 const char *fname) 2407 2631 { 2408 2632 edit_t *edit = (edit_t *)arg; 2409 gfx_context_t *gc = ui_window_get_gc(edit->window);2410 2633 char *cname; 2411 2634 errno_t rc; 2412 2635 2636 (void)edit; 2413 2637 ui_file_dialog_destroy(dialog); 2414 // TODO Smarter cursor management2415 pane.rflags |= REDRAW_CARET;2416 (void) pane_update(&pane);2417 gfx_cursor_set_visible(gc, true);2418 2638 2419 2639 cname = str_dup(fname); … … 2423 2643 } 2424 2644 2645 rc = file_open_file(fname); 2646 if (rc != EOK) 2647 return; 2648 2649 if (doc.file_name != NULL) 2650 free(doc.file_name); 2651 doc.file_name = cname; 2652 2653 (void) gfx_update(ui_window_get_gc(edit->window)); 2654 } 2655 2656 /** Open File dialog cancel button press. 2657 * 2658 * @param dialog File dialog 2659 * @param arg Argument (ui_demo_t *) 2660 */ 2661 static void open_dialog_bcancel(ui_file_dialog_t *dialog, void *arg) 2662 { 2663 edit_t *edit = (edit_t *)arg; 2664 2665 (void)edit; 2666 ui_file_dialog_destroy(dialog); 2667 } 2668 2669 /** Open File dialog close request. 2670 * 2671 * @param dialog File dialog 2672 * @param arg Argument (ui_demo_t *) 2673 */ 2674 static void open_dialog_close(ui_file_dialog_t *dialog, void *arg) 2675 { 2676 edit_t *edit = (edit_t *)arg; 2677 2678 (void)edit; 2679 ui_file_dialog_destroy(dialog); 2680 } 2681 2682 /** Save As dialog OK button press. 2683 * 2684 * @param dialog Save As dialog 2685 * @param arg Argument (ui_demo_t *) 2686 * @param fname File name 2687 */ 2688 static void save_as_dialog_bok(ui_file_dialog_t *dialog, void *arg, 2689 const char *fname) 2690 { 2691 edit_t *edit = (edit_t *)arg; 2692 char *cname; 2693 errno_t rc; 2694 2695 (void)edit; 2696 ui_file_dialog_destroy(dialog); 2697 2698 cname = str_dup(fname); 2699 if (cname == NULL) { 2700 printf("Out of memory.\n"); 2701 return; 2702 } 2703 2425 2704 rc = file_save(fname); 2426 2705 if (rc != EOK) … … 2441 2720 { 2442 2721 edit_t *edit = (edit_t *)arg; 2443 gfx_context_t *gc = ui_window_get_gc(edit->window); 2444 2722 2723 (void)edit; 2445 2724 ui_file_dialog_destroy(dialog); 2446 // TODO Smarter cursor management2447 pane.rflags |= REDRAW_CARET;2448 (void) pane_update(&pane);2449 gfx_cursor_set_visible(gc, true);2450 2725 } 2451 2726 … … 2458 2733 { 2459 2734 edit_t *edit = (edit_t *)arg; 2460 gfx_context_t *gc = ui_window_get_gc(edit->window); 2461 2735 2736 (void)edit; 2462 2737 ui_file_dialog_destroy(dialog); 2463 // TODO Smarter cursor management2464 pane.rflags |= REDRAW_CARET;2465 (void) pane_update(&pane);2466 gfx_cursor_set_visible(gc, true);2467 2738 } 2468 2739 … … 2477 2748 { 2478 2749 edit_t *edit = (edit_t *) arg; 2479 gfx_context_t *gc = ui_window_get_gc(edit->window);2480 2750 char *endptr; 2481 2751 int line; … … 2489 2759 2490 2760 caret_move_absolute(line, pane.ideal_column, dir_before, false); 2491 // TODO Smarter cursor management2761 (void)edit; 2492 2762 (void) pane_update(&pane); 2493 gfx_cursor_set_visible(gc, true);2494 (void) gfx_update(gc);2495 2763 } 2496 2764 … … 2503 2771 { 2504 2772 edit_t *edit = (edit_t *) arg; 2505 gfx_context_t *gc = ui_window_get_gc(edit->window); 2506 2773 2774 (void)edit; 2507 2775 ui_prompt_dialog_destroy(dialog); 2508 // TODO Smarter cursor management2509 pane.rflags |= REDRAW_CARET;2510 (void) pane_update(&pane);2511 gfx_cursor_set_visible(gc, true);2512 2776 } 2513 2777 … … 2520 2784 { 2521 2785 edit_t *edit = (edit_t *) arg; 2522 gfx_context_t *gc = ui_window_get_gc(edit->window); 2523 2786 2787 (void)edit; 2524 2788 ui_prompt_dialog_destroy(dialog); 2525 // TODO Smarter cursor management2526 pane.rflags |= REDRAW_CARET;2527 (void) pane_update(&pane);2528 gfx_cursor_set_visible(gc, true);2529 2789 } 2530 2790 … … 2539 2799 { 2540 2800 edit_t *edit = (edit_t *) arg; 2541 gfx_context_t *gc = ui_window_get_gc(edit->window);2542 2801 char *pattern; 2543 2802 bool reverse; 2544 2803 2804 (void)edit; 2545 2805 ui_prompt_dialog_destroy(dialog); 2546 2806 … … 2559 2819 search(pattern, reverse); 2560 2820 2561 // TODO Smarter cursor management2562 2821 (void) pane_update(&pane); 2563 gfx_cursor_set_visible(gc, true);2564 (void) gfx_update(gc);2565 2822 } 2566 2823 … … 2573 2830 { 2574 2831 edit_t *edit = (edit_t *) arg; 2575 gfx_context_t *gc = ui_window_get_gc(edit->window); 2576 2832 2833 (void)edit; 2577 2834 ui_prompt_dialog_destroy(dialog); 2578 // TODO Smarter cursor management2579 pane.rflags |= REDRAW_CARET;2580 (void) pane_update(&pane);2581 gfx_cursor_set_visible(gc, true);2582 2835 } 2583 2836 … … 2590 2843 { 2591 2844 edit_t *edit = (edit_t *) arg; 2592 gfx_context_t *gc = ui_window_get_gc(edit->window); 2593 2845 2846 (void)edit; 2594 2847 ui_prompt_dialog_destroy(dialog); 2595 // TODO Smarter cursor management2596 pane.rflags |= REDRAW_CARET;2597 (void) pane_update(&pane);2598 gfx_cursor_set_visible(gc, true);2599 2848 } 2600 2849 -
uspace/app/edit/sheet.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 20 09Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 90 90 } 91 91 92 /** Destroy sheet. */ 93 void sheet_destroy(sheet_t *sh) 94 { 95 free(sh->data); 96 free(sh); 97 } 98 92 99 /** Insert text into sheet. 93 100 * -
uspace/app/edit/sheet.h
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 20 09Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 91 91 92 92 extern errno_t sheet_create(sheet_t **); 93 extern void sheet_destroy(sheet_t *); 93 94 extern errno_t sheet_insert(sheet_t *, spt_t *, enum dir_spec, char *); 94 95 extern errno_t sheet_delete(sheet_t *, spt_t *, spt_t *); -
uspace/app/getterm/welcome.c
r2a0c827c rebb1489 41 41 { 42 42 printf("Welcome to HelenOS!\n"); 43 printf("http ://www.helenos.org/\n\n");43 printf("https://www.helenos.org/\n\n"); 44 44 printf("Type 'help' [Enter] to see a few survival tips.\n\n"); 45 45 } -
uspace/app/gfxdemo/gfxdemo.c
r2a0c827c rebb1489 78 78 static gfx_coord_t vpad; 79 79 static console_ctrl_t *con = NULL; 80 static bool textmode; 80 81 static ui_t *ui; 81 82 82 83 /** Determine if we are running in text mode. 83 84 * 84 * @param w Screen width85 * @param h Screen height86 85 * @return @c true iff we are running in text mode 87 86 */ 88 static bool demo_is_text(gfx_coord_t w, gfx_coord_t h) 89 { 90 // XXX Need a proper way to determine text mode 91 return w <= 80; 87 static bool demo_is_text(void) 88 { 89 return textmode; 92 90 } 93 91 … … 181 179 182 180 /* XXX Crude way of detecting text mode */ 183 if ( w < 256) {181 if (demo_is_text()) { 184 182 /* Create dummy font for text mode */ 185 183 rc = gfx_typeface_create(gc, &tface); … … 270 268 271 269 if (font != NULL) { 272 if (demo_is_text( w, h)) {270 if (demo_is_text()) { 273 271 rc = gfx_color_new_ega(0x1e, &color); 274 272 if (rc != EOK) … … 719 717 gfx_color_delete(color); 720 718 721 if (demo_is_text( w, h)) {719 if (demo_is_text()) { 722 720 rc = gfx_color_new_ega(0x1f, &color); 723 721 if (rc != EOK) … … 807 805 808 806 for (i = 0; i < 8; i++) { 809 if (demo_is_text( w, h)) {807 if (demo_is_text()) { 810 808 rc = gfx_color_new_ega(i != 0 ? i : 0x10, &color); 811 809 if (rc != EOK) … … 884 882 gfx_color_delete(color); 885 883 886 if (demo_is_text( w, h)) {884 if (demo_is_text()) { 887 885 rc = gfx_color_new_ega(0x1f, &color); 888 886 if (rc != EOK) … … 1093 1091 1094 1092 gc = console_gc_get_ctx(cgc); 1093 1094 /* Currently console is always text. */ 1095 textmode = true; 1095 1096 1096 1097 rc = demo_loop(gc, cols, rows); … … 1192 1193 task_retval(0); 1193 1194 1195 textmode = ui_is_textmode(ui); 1196 1194 1197 args.gc = gc; 1195 1198 args.dims = dims; … … 1252 1255 1253 1256 task_retval(0); 1257 1258 /* FIXME Assuming display service is not text mode. */ 1259 textmode = false; 1254 1260 1255 1261 rc = demo_loop(gc, 400, 300); -
uspace/app/hbench/benchlist.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2018 Vojtech Horky 4 4 * All rights reserved. … … 42 42 &benchmark_fibril_mutex, 43 43 &benchmark_file_read, 44 &benchmark_rand_read, 45 &benchmark_seq_read, 44 46 &benchmark_malloc1, 45 47 &benchmark_malloc2, -
uspace/app/hbench/hbench.h
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2019 Vojtech Horky 4 4 * All rights reserved. … … 135 135 extern benchmark_t benchmark_fibril_mutex; 136 136 extern benchmark_t benchmark_file_read; 137 extern benchmark_t benchmark_rand_read; 138 extern benchmark_t benchmark_seq_read; 137 139 extern benchmark_t benchmark_malloc1; 138 140 extern benchmark_t benchmark_malloc2; -
uspace/app/hbench/meson.build
r2a0c827c rebb1489 1 1 # 2 # Copyright (c) 202 3Jiri Svoboda2 # Copyright (c) 2024 Jiri Svoboda 3 3 # All rights reserved. 4 4 # … … 27 27 # 28 28 29 deps = [ ' math', 'ipctest' ]29 deps = [ 'block', 'math', 'ipctest' ] 30 30 src = files( 31 31 'benchlist.c', … … 34 34 'main.c', 35 35 'utils.c', 36 'disk/randread.c', 37 'disk/seqread.c', 36 38 'fs/dirread.c', 37 39 'fs/fileread.c', -
uspace/app/init/init.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2005 Martin Decky 3 4 * All rights reserved. … … 35 36 36 37 #include <fibril.h> 38 #include <futil.h> 37 39 #include <stdio.h> 38 40 #include <stdarg.h> … … 78 80 static const char *sys_dirs[] = { 79 81 "/w/cfg", 80 "/w/data" 82 "/w/data", 83 NULL, 81 84 }; 82 85 … … 351 354 vol_info_t vinfo; 352 355 volume_id_t *volume_ids = NULL; 356 service_id_t *part_ids = NULL; 357 vol_part_info_t pinfo; 353 358 size_t nvols; 359 size_t nparts; 360 bool sv_mounted; 354 361 size_t i; 355 362 errno_t rc; … … 385 392 } 386 393 387 vol_destroy(vol);388 394 free(volume_ids); 395 volume_ids = NULL; 389 396 390 397 if (!found_cfg) { … … 397 404 printf("%s: Error creating directory '%s'.\n", 398 405 NAME, *cp); 399 return rc;406 goto error; 400 407 } 401 408 402 409 ++cp; 403 410 } 411 412 /* Copy initial configuration files */ 413 rc = futil_rcopy_contents("/cfg", "/w/cfg"); 414 if (rc != EOK) 415 goto error; 404 416 } else { 405 417 printf("%s: System volume is configured.\n", NAME); 406 } 407 418 419 /* Wait until system volume is mounted */ 420 sv_mounted = false; 421 422 while (true) { 423 rc = vol_get_parts(vol, &part_ids, &nparts); 424 if (rc != EOK) { 425 printf("Error getting list of volumes.\n"); 426 goto error; 427 } 428 429 for (i = 0; i < nparts; i++) { 430 rc = vol_part_info(vol, part_ids[i], &pinfo); 431 if (rc != EOK) { 432 printf("Error getting partition " 433 "information.\n"); 434 rc = EIO; 435 goto error; 436 } 437 438 if (str_cmp(pinfo.cur_mp, "/w") == 0) { 439 sv_mounted = true; 440 break; 441 } 442 } 443 444 if (sv_mounted) 445 break; 446 447 free(part_ids); 448 part_ids = NULL; 449 450 fibril_sleep(1); 451 printf("Sleeping(1) for system volume.\n"); 452 } 453 } 454 455 vol_destroy(vol); 408 456 return EOK; 409 457 error: … … 411 459 if (volume_ids != NULL) 412 460 free(volume_ids); 461 if (part_ids != NULL) 462 free(part_ids); 413 463 414 464 return rc; … … 438 488 srv_start("/srv/klog"); 439 489 srv_start("/srv/fs/locfs"); 440 srv_start("/srv/taskmon");441 490 442 491 if (!mount_locfs()) { … … 454 503 srv_start("/srv/volsrv"); 455 504 505 init_sysvol(); 506 507 srv_start("/srv/taskmon"); 508 456 509 srv_start("/srv/net/loopip"); 457 510 srv_start("/srv/net/ethip"); 511 srv_start("/srv/net/dhcp"); 458 512 srv_start("/srv/net/inetsrv"); 459 513 srv_start("/srv/net/tcp"); 460 514 srv_start("/srv/net/udp"); 461 515 srv_start("/srv/net/dnsrsrv"); 462 srv_start("/srv/net/dhcp");463 srv_start("/srv/net/nconfsrv");464 516 465 517 srv_start("/srv/clipboard"); … … 469 521 srv_start("/srv/hid/output", HID_OUTPUT); 470 522 srv_start("/srv/audio/hound"); 471 472 init_sysvol();473 523 474 524 #ifdef CONFIG_WINSYS -
uspace/app/init/meson.build
r2a0c827c rebb1489 28 28 # 29 29 30 deps = [ ' untar', 'block' ]30 deps = [ 'block', 'futil', 'untar' ] 31 31 link_args += '-static' 32 32 src = files('init.c', 'untar.c') -
uspace/app/init/untar.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2018 Martin Decky 3 4 * All rights reserved. … … 59 60 return ret; 60 61 61 ret = block_init(state->sid , 4096);62 ret = block_init(state->sid); 62 63 if (ret != EOK) 63 64 return ret; -
uspace/app/meson.build
r2a0c827c rebb1489 34 34 'blkdump', 35 35 'calculator', 36 'contacts',37 36 'corecfg', 38 37 'cpptest', -
uspace/app/mkexfat/mkexfat.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2012 Maurizio Lombardi 3 4 * All rights reserved. … … 858 859 } 859 860 860 rc = block_init(service_id , 2048);861 rc = block_init(service_id); 861 862 if (rc != EOK) { 862 863 printf(NAME ": Error initializing libblock.\n"); -
uspace/app/mkfat/mkfat.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 20 10Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 66 66 default_fat_count = 2, 67 67 default_reserved_clusters = 2, 68 default_media_descriptor = 0xF8 /**< fixed disk */ 68 default_media_descriptor = 0xF8 /**< fixed disk */, 69 fat32_root_cluster = 2 69 70 }; 70 71 … … 198 199 } 199 200 200 rc = block_init(service_id , 2048);201 rc = block_init(service_id); 201 202 if (rc != EOK) { 202 203 printf(NAME ": Error initializing libblock.\n"); … … 313 314 cfg->reserved_sectors = 1 + cfg->addt_res_sectors; 314 315 315 /* Only correct for FAT12/16 (FAT32 has root dir stored in clusters */316 /* Only correct for FAT12/16 (FAT32 has root dir stored in clusters) */ 316 317 rd_sectors = div_round_up(cfg->root_ent_max * DIRENT_SIZE, 317 318 cfg->sector_size); … … 434 435 } 435 436 437 if (cfg->fat_type == FAT32) { 438 /* Root dir is stored in cluster fat32_root_cluster */ 439 addr += fat32_root_cluster * cfg->sectors_per_cluster; 440 } 441 436 442 /* Root directory */ 437 443 printf("Writing root directory.\n"); … … 529 535 bs->fat32.ebs = 0x29; 530 536 bs->fat32.id = host2uint32_t_be(vsn); 531 bs->fat32.root_cluster = 2;537 bs->fat32.root_cluster = fat32_root_cluster; 532 538 533 539 (void) fat_label_encode(&bs->fat32.label, bs_label); -
uspace/app/mkmfs/mkmfs.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2011 Maurizio Lombardi 3 4 * All rights reserved. … … 211 212 } 212 213 213 rc = block_init(service_id , 2048);214 rc = block_init(service_id); 214 215 if (rc != EOK) { 215 216 printf(NAME ": Error initializing libblock.\n"); -
uspace/app/pkg/pkg.c
r2a0c827c rebb1489 116 116 pkg_name = argv[2]; 117 117 118 ret = asprintf(&src_uri, "http://ci .helenos.org/latest/" STRING(UARCH)118 ret = asprintf(&src_uri, "http://ci-ipv4.helenos.org/latest/" STRING(UARCH) 119 119 "/%s-for-helenos-" STRING(UARCH) ".tar.gz", 120 120 pkg_name); -
uspace/app/sysinst/meson.build
r2a0c827c rebb1489 27 27 # 28 28 29 deps = [ 'block', 'fdisk', ' sif' ]29 deps = [ 'block', 'fdisk', 'futil', 'sif' ] 30 30 src = files( 31 'futil.c',32 31 'rdimg.c', 33 32 'sysinst.c', -
uspace/app/sysinst/sysinst.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 20 18Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <errno.h> 42 42 #include <fdisk.h> 43 #include <futil.h> 43 44 #include <loc.h> 44 45 #include <stdio.h> … … 49 50 #include <vol.h> 50 51 51 #include "futil.h"52 52 #include "grub.h" 53 53 #include "rdimg.h" … … 62 62 * in Grub notation). 63 63 */ 64 #define DEFAULT_DEV "devices/\\hw\\sys\\00:01.0\\ata-c1\\d0" 64 #define DEFAULT_DEV_0 "devices/\\hw\\sys\\00:01.1\\c0d0" 65 #define DEFAULT_DEV_1 "devices/\\hw\\sys\\00:01.0\\ata1\\c0d0" 65 66 //#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0" 66 67 /** Volume label for the new file system */ … … 79 80 #define BOOT_BLOCK_IDX 0 /* MBR */ 80 81 82 #define CFG_FILES_SRC "/cfg" 83 #define CFG_FILES_DEST MOUNT_POINT "/cfg" 84 85 static const char *default_devs[] = { 86 DEFAULT_DEV_0, 87 DEFAULT_DEV_1, 88 NULL 89 }; 90 81 91 static const char *sys_dirs[] = { 82 92 "/cfg", 83 "/data" 93 "/data", 94 NULL 84 95 }; 96 97 /** Check the if the destination device exists. 98 * 99 * @param dev Disk device 100 * 101 * @return EOK on success or an error code 102 */ 103 static errno_t sysinst_check_dev(const char *dev) 104 { 105 service_id_t sid; 106 errno_t rc; 107 108 rc = loc_service_get_id(dev, &sid, 0); 109 if (rc != EOK) 110 return rc; 111 112 (void)sid; 113 return EOK; 114 } 85 115 86 116 /** Label the destination device. … … 200 230 path = NULL; 201 231 232 /* Copy initial configuration files */ 233 rc = futil_rcopy_contents(CFG_FILES_SRC, CFG_FILES_DEST); 234 if (rc != EOK) 235 return rc; 236 202 237 return EOK; 203 238 error: … … 244 279 } 245 280 246 rv = asprintf(&path, "%s%s", rdpath, "/cfg/ volsrv.sif");281 rv = asprintf(&path, "%s%s", rdpath, "/cfg/initvol.sif"); 247 282 if (rv < 0) { 248 283 rc = ENOMEM; … … 271 306 printf("Error creating system partition configuration.\n"); 272 307 rc = EIO; 308 goto error; 309 } 310 311 rc = vol_volumes_sync(volumes); 312 if (rc != EOK) { 313 printf("Error saving volume confiuration.\n"); 273 314 goto error; 274 315 } … … 361 402 362 403 printf("sysinst_copy_boot_blocks: block_init.\n"); 363 rc = block_init(sid , 512);404 rc = block_init(sid); 364 405 if (rc != EOK) 365 406 return rc; … … 490 531 int main(int argc, char *argv[]) 491 532 { 492 const char *dev = DEFAULT_DEV; 493 return sysinst_install(dev); 533 unsigned i; 534 errno_t rc; 535 536 i = 0; 537 while (default_devs[i] != NULL) { 538 rc = sysinst_check_dev(default_devs[i]); 539 if (rc == EOK) 540 break; 541 } 542 543 if (default_devs[i] == NULL) { 544 printf("Cannot determine installation device.\n"); 545 return 1; 546 } 547 548 return sysinst_install(default_devs[i]); 494 549 } 495 550 -
uspace/app/taskbar-cfg/main.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 77 77 return 1; 78 78 79 rc = taskbar_cfg_open(tbcfg, "/ cfg/taskbar.sif");79 rc = taskbar_cfg_open(tbcfg, "/w/cfg/taskbar.sif"); 80 80 if (rc != EOK) 81 81 return 1; -
uspace/app/taskbar-cfg/smeedit.c
r2a0c827c rebb1489 403 403 404 404 startmenu_repaint(smee->startmenu); 405 (void)tbarcfg_sync(smee->startmenu->tbarcfg->tbarcfg); 405 406 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 406 407 } else { … … 418 419 return; 419 420 420 (void) smenu_entry_save(smee->smentry->entry);421 (void)tbarcfg_sync(smee->startmenu->tbarcfg->tbarcfg); 421 422 startmenu_entry_update(smee->smentry); 423 (void)tbarcfg_sync(smee->startmenu->tbarcfg->tbarcfg); 422 424 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 423 425 } -
uspace/app/taskbar-cfg/startmenu.c
r2a0c827c rebb1489 515 515 516 516 (void)smee; 517 (void)tbarcfg_sync(smenu->tbarcfg->tbarcfg); 517 518 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 518 519 } … … 534 535 (void)startmenu_insert(smenu, entry, &smentry); 535 536 (void)ui_control_paint(ui_list_ctl(smenu->entries_list)); 537 (void)tbarcfg_sync(smenu->tbarcfg->tbarcfg); 536 538 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 537 539 } … … 620 622 startmenu_t *smenu = (startmenu_t *)arg; 621 623 startmenu_entry_t *smentry; 622 errno_t rc;623 624 624 625 (void)pbutton; … … 628 629 return; 629 630 630 rc = smenu_entry_destroy(smentry->entry); 631 if (rc != EOK) 632 return; 633 631 smenu_entry_destroy(smentry->entry); 634 632 ui_list_entry_delete(smentry->lentry); 635 633 free(smentry); 634 636 635 (void)ui_control_paint(ui_list_ctl(smenu->entries_list)); 636 (void)tbarcfg_sync(smenu->tbarcfg->tbarcfg); 637 637 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 638 638 } … … 673 673 startmenu_t *smenu = (startmenu_t *)arg; 674 674 startmenu_entry_t *smentry; 675 errno_t rc;676 675 677 676 (void)pbutton; … … 681 680 return; 682 681 683 rc = smenu_entry_move_up(smentry->entry); 684 if (rc != EOK) 685 return; 686 682 smenu_entry_move_up(smentry->entry); 687 683 ui_list_entry_move_up(smentry->lentry); 688 684 689 685 (void)ui_control_paint(ui_list_ctl(smenu->entries_list)); 686 (void)tbarcfg_sync(smenu->tbarcfg->tbarcfg); 690 687 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 691 688 } … … 700 697 startmenu_t *smenu = (startmenu_t *)arg; 701 698 startmenu_entry_t *smentry; 702 errno_t rc;703 699 704 700 (void)pbutton; … … 708 704 return; 709 705 710 rc = smenu_entry_move_down(smentry->entry); 711 if (rc != EOK) 712 return; 713 706 smenu_entry_move_down(smentry->entry); 714 707 ui_list_entry_move_down(smentry->lentry); 715 708 716 709 (void)ui_control_paint(ui_list_ctl(smenu->entries_list)); 710 (void)tbarcfg_sync(smenu->tbarcfg->tbarcfg); 717 711 (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT); 718 712 } -
uspace/app/taskbar/taskbar.c
r2a0c827c rebb1489 48 48 #include "wndlist.h" 49 49 50 #define TASKBAR_CONFIG_FILE "/ cfg/taskbar.sif"50 #define TASKBAR_CONFIG_FILE "/w/cfg/taskbar.sif" 51 51 52 52 static void taskbar_wnd_close(ui_window_t *, void *); -
uspace/app/taskbar/taskbar.sif
r2a0c827c rebb1489 1 [sif](){[entries](){[entry]([caption]=[~N~avigator][cmd]=[/app/nav][terminal]=[y]){}[entry]([caption]=[Text ~E~ditor][cmd]=[/app/edit][terminal]=[y]){}[entry]([caption]=[Co~m~mand Line][cmd]=[/app/bdsh][terminal]=[y]){}[entry]([caption]=[~C~alculator][cmd]=[/app/calculator -d %d][terminal]=[n]){}[entry]([caption]=[~I~mage Viewer][cmd]=[/app/viewer -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[~U~I Demo][cmd]=[/app/uidemo -d %d][terminal]=[n]){}[entry]([caption]=[~G~FX Demo][cmd]=[/app/gfxdemo -d %d ui][terminal]=[n]){}[entry]([caption]=[~B~arber Pole][cmd]=[/app/barber -d %d][terminal]=[n]){}[entry]([caption]=[~T~etris][cmd]=[/app/tetris][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~D~isplay Configuration][cmd]=[/app/display-cfg -d %d][terminal]=[n]){}[entry]([caption]=[Ta~s~kbar Configuration][cmd]=[/app/taskbar-cfg -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[Tas~k~ Monitor (top)][cmd]=[/app/top][terminal]=[y]){}[entry]([caption]=[~F~disk Disk Editor][cmd]=[/app/fdisk][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~A~bout HelenOS][cmd]=[/app/aboutos -d %d][terminal]=[n]){}}} 1 <sif> 2 <entries> 3 <entry caption="~N~avigator" cmd="/app/nav" terminal="y"> 4 </entry> 5 <entry caption="Text ~E~ditor" cmd="/app/edit" terminal="y"> 6 </entry> 7 <entry caption="Co~m~mand Line" cmd="/app/bdsh" terminal="y"> 8 </entry> 9 <entry caption="~C~alculator" cmd="/app/calculator -d %d" terminal="n"> 10 </entry> 11 <entry caption="~I~mage Viewer" cmd="/app/viewer -d %d" terminal="n"> 12 </entry> 13 <entry separator="y"> 14 </entry> 15 <entry caption="~U~I Demo" cmd="/app/uidemo -d %d" terminal="n"> 16 </entry> 17 <entry caption="~G~FX Demo" cmd="/app/gfxdemo -d %d ui" terminal="n"> 18 </entry> 19 <entry caption="~B~arber Pole" cmd="/app/barber -d %d" terminal="n"> 20 </entry> 21 <entry caption="~T~etris" cmd="/app/tetris" terminal="y"> 22 </entry> 23 <entry separator="y"> 24 </entry> 25 <entry caption="~D~isplay Configuration" cmd="/app/display-cfg -d %d" terminal="n"> 26 </entry> 27 <entry caption="Ta~s~kbar Configuration" cmd="/app/taskbar-cfg -d %d" terminal="n"> 28 </entry> 29 <entry separator="y"> 30 </entry> 31 <entry caption="Tas~k~ Monitor (top)" cmd="/app/top" terminal="y"> 32 </entry> 33 <entry caption="~F~disk Disk Editor" cmd="/app/fdisk" terminal="y"> 34 </entry> 35 <entry separator="y"> 36 </entry> 37 <entry caption="~A~bout HelenOS" cmd="/app/aboutos -d %d" terminal="n"> 38 </entry> 39 </entries> 40 </sif> -
uspace/app/terminal/meson.build
r2a0c827c rebb1489 27 27 # 28 28 29 deps = [ 'fbfont', 'display', 'ui' ]29 deps = [ 'fbfont', 'display', 'ui', 'termui' ] 30 30 src = files( 31 31 'main.c', -
uspace/app/terminal/terminal.c
r2a0c827c rebb1489 40 40 #include <errno.h> 41 41 #include <fbfont/font-8x16.h> 42 #include <io/chargrid.h>43 42 #include <fibril.h> 44 43 #include <gfx/bitmap.h> … … 49 48 #include <io/console.h> 50 49 #include <io/pixelmap.h> 51 #include < task.h>50 #include <macros.h> 52 51 #include <stdarg.h> 53 52 #include <stdio.h> 54 53 #include <stdlib.h> 54 #include <str_error.h> 55 55 #include <str.h> 56 #include <task.h> 56 57 #include <ui/resource.h> 57 58 #include <ui/ui.h> … … 69 70 70 71 #define TERM_CAPS \ 71 (CONSOLE_CAP_STYLE | CONSOLE_CAP_INDEXED | CONSOLE_CAP_RGB) 72 (CONSOLE_CAP_CURSORCTL | CONSOLE_CAP_STYLE | CONSOLE_CAP_INDEXED | \ 73 CONSOLE_CAP_RGB) 74 75 #define SCROLLBACK_MAX_LINES 1000 76 #define MIN_WINDOW_COLS 8 77 #define MIN_WINDOW_ROWS 4 72 78 73 79 static LIST_INITIALIZE(terms); 80 81 #define COLOR_BRIGHT 8 82 83 static const pixel_t _basic_colors[16] = { 84 [COLOR_BLACK] = PIXEL(255, 0, 0, 0), 85 [COLOR_RED] = PIXEL(255, 170, 0, 0), 86 [COLOR_GREEN] = PIXEL(255, 0, 170, 0), 87 [COLOR_YELLOW] = PIXEL(255, 170, 85, 0), 88 [COLOR_BLUE] = PIXEL(255, 0, 0, 170), 89 [COLOR_MAGENTA] = PIXEL(255, 170, 0, 170), 90 [COLOR_CYAN] = PIXEL(255, 0, 170, 170), 91 [COLOR_WHITE] = PIXEL(255, 170, 170, 170), 92 93 [COLOR_BLACK | COLOR_BRIGHT] = PIXEL(255, 85, 85, 85), 94 [COLOR_RED | COLOR_BRIGHT] = PIXEL(255, 255, 85, 85), 95 [COLOR_GREEN | COLOR_BRIGHT] = PIXEL(255, 85, 255, 85), 96 [COLOR_YELLOW | COLOR_BRIGHT] = PIXEL(255, 255, 255, 85), 97 [COLOR_BLUE | COLOR_BRIGHT] = PIXEL(255, 85, 85, 255), 98 [COLOR_MAGENTA | COLOR_BRIGHT] = PIXEL(255, 255, 85, 255), 99 [COLOR_CYAN | COLOR_BRIGHT] = PIXEL(255, 85, 255, 255), 100 [COLOR_WHITE | COLOR_BRIGHT] = PIXEL(255, 255, 255, 255), 101 }; 74 102 75 103 static errno_t term_open(con_srvs_t *, con_srv_t *); … … 119 147 static void terminal_close_event(ui_window_t *, void *); 120 148 static void terminal_focus_event(ui_window_t *, void *, unsigned); 149 static void terminal_resize_event(ui_window_t *, void *); 121 150 static void terminal_kbd_event(ui_window_t *, void *, kbd_event_t *); 122 151 static void terminal_pos_event(ui_window_t *, void *, pos_event_t *); 123 152 static void terminal_unfocus_event(ui_window_t *, void *, unsigned); 153 static void terminal_maximize_event(ui_window_t *, void *); 154 static void terminal_unmaximize_event(ui_window_t *, void *); 124 155 125 156 static ui_window_cb_t terminal_window_cb = { 126 157 .close = terminal_close_event, 127 158 .focus = terminal_focus_event, 159 .resize = terminal_resize_event, 128 160 .kbd = terminal_kbd_event, 129 161 .pos = terminal_pos_event, 130 .unfocus = terminal_unfocus_event 162 .unfocus = terminal_unfocus_event, 163 .maximize = terminal_maximize_event, 164 .unmaximize = terminal_unmaximize_event, 131 165 }; 132 166 … … 144 178 } 145 179 146 static pixel_t color_table[16] = { 147 [COLOR_BLACK] = PIXEL(255, 0, 0, 0), 148 [COLOR_BLUE] = PIXEL(255, 0, 0, 170), 149 [COLOR_GREEN] = PIXEL(255, 0, 170, 0), 150 [COLOR_CYAN] = PIXEL(255, 0, 170, 170), 151 [COLOR_RED] = PIXEL(255, 170, 0, 0), 152 [COLOR_MAGENTA] = PIXEL(255, 170, 0, 170), 153 [COLOR_YELLOW] = PIXEL(255, 170, 85, 0), 154 [COLOR_WHITE] = PIXEL(255, 170, 170, 170), 155 156 [COLOR_BLACK + 8] = PIXEL(255, 85, 85, 85), 157 [COLOR_BLUE + 8] = PIXEL(255, 85, 85, 255), 158 [COLOR_GREEN + 8] = PIXEL(255, 85, 255, 85), 159 [COLOR_CYAN + 8] = PIXEL(255, 85, 255, 255), 160 [COLOR_RED + 8] = PIXEL(255, 255, 85, 85), 161 [COLOR_MAGENTA + 8] = PIXEL(255, 255, 85, 255), 162 [COLOR_YELLOW + 8] = PIXEL(255, 255, 255, 85), 163 [COLOR_WHITE + 8] = PIXEL(255, 255, 255, 255), 164 }; 165 166 static inline void attrs_rgb(char_attrs_t attrs, pixel_t *bgcolor, pixel_t *fgcolor) 167 { 168 switch (attrs.type) { 180 static pixel_t termui_color_to_pixel(termui_color_t c) 181 { 182 uint8_t r, g, b; 183 termui_color_to_rgb(c, &r, &g, &b); 184 return PIXEL(255, r, g, b); 185 } 186 187 static termui_color_t termui_color_from_pixel(pixel_t pixel) 188 { 189 return termui_color_from_rgb(RED(pixel), GREEN(pixel), BLUE(pixel)); 190 } 191 192 static termui_cell_t charfield_to_termui_cell(terminal_t *term, const charfield_t *cf) 193 { 194 termui_cell_t cell = { }; 195 196 cell.glyph_idx = fb_font_glyph(cf->ch, NULL); 197 198 switch (cf->attrs.type) { 169 199 case CHAR_ATTR_STYLE: 170 switch ( attrs.val.style) {200 switch (cf->attrs.val.style) { 171 201 case STYLE_NORMAL: 172 *bgcolor = color_table[COLOR_WHITE + 8];173 *fgcolor = color_table[COLOR_BLACK];202 cell.bgcolor = term->default_bgcolor; 203 cell.fgcolor = term->default_fgcolor; 174 204 break; 175 205 case STYLE_EMPHASIS: 176 *bgcolor = color_table[COLOR_WHITE + 8];177 *fgcolor = color_table[COLOR_RED + 8];206 cell.bgcolor = term->emphasis_bgcolor; 207 cell.fgcolor = term->emphasis_fgcolor; 178 208 break; 179 209 case STYLE_INVERTED: 180 *bgcolor = color_table[COLOR_BLACK]; 181 *fgcolor = color_table[COLOR_WHITE + 8]; 210 cell.bgcolor = term->default_bgcolor; 211 cell.fgcolor = term->default_fgcolor; 212 cell.inverted = 1; 182 213 break; 183 214 case STYLE_SELECTED: 184 *bgcolor = color_table[COLOR_RED + 8];185 *fgcolor = color_table[COLOR_WHITE + 8];215 cell.bgcolor = term->selection_bgcolor; 216 cell.fgcolor = term->selection_fgcolor; 186 217 break; 187 218 } 188 219 break; 220 189 221 case CHAR_ATTR_INDEX: 190 *bgcolor = color_table[(attrs.val.index.bgcolor & 7)]; 191 *fgcolor = color_table[(attrs.val.index.fgcolor & 7) | 192 ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)]; 222 char_attr_index_t index = cf->attrs.val.index; 223 224 int bright = (index.attr & CATTR_BRIGHT) ? COLOR_BRIGHT : 0; 225 pixel_t bgcolor = _basic_colors[index.bgcolor]; 226 pixel_t fgcolor = _basic_colors[index.fgcolor | bright]; 227 cell.bgcolor = termui_color_from_pixel(bgcolor); 228 cell.fgcolor = termui_color_from_pixel(fgcolor); 229 230 if (index.attr & CATTR_BLINK) 231 cell.blink = 1; 232 193 233 break; 234 194 235 case CHAR_ATTR_RGB: 195 *bgcolor = 0xff000000 | attrs.val.rgb.bgcolor;196 *fgcolor = 0xff000000 | attrs.val.rgb.fgcolor;236 cell.bgcolor = termui_color_from_pixel(cf->attrs.val.rgb.bgcolor); 237 cell.fgcolor = termui_color_from_pixel(cf->attrs.val.rgb.fgcolor); 197 238 break; 198 239 } 240 241 return cell; 199 242 } 200 243 … … 214 257 } 215 258 216 static void term_update_char(terminal_t *term, pixelmap_t *pixelmap, 217 sysarg_t sx, sysarg_t sy, sysarg_t col, sysarg_t row) 218 { 219 charfield_t *field = 220 chargrid_charfield_at(term->backbuf, col, row); 221 222 bool inverted = chargrid_cursor_at(term->backbuf, col, row); 223 224 sysarg_t bx = sx + (col * FONT_WIDTH); 225 sysarg_t by = sy + (row * FONT_SCANLINES); 226 227 pixel_t bgcolor = 0; 228 pixel_t fgcolor = 0; 229 230 if (inverted) 231 attrs_rgb(field->attrs, &fgcolor, &bgcolor); 232 else 233 attrs_rgb(field->attrs, &bgcolor, &fgcolor); 234 235 // FIXME: Glyph type should be actually uint32_t 236 // for full UTF-32 coverage. 237 238 uint16_t glyph = fb_font_glyph(field->ch, NULL); 259 static void term_draw_cell(terminal_t *term, pixelmap_t *pixelmap, int col, int row, const termui_cell_t *cell) 260 { 261 termui_color_t bg = cell->bgcolor; 262 if (bg == TERMUI_COLOR_DEFAULT) 263 bg = term->default_bgcolor; 264 265 termui_color_t fg = cell->fgcolor; 266 if (fg == TERMUI_COLOR_DEFAULT) 267 fg = term->default_fgcolor; 268 269 pixel_t bgcolor = termui_color_to_pixel(bg); 270 pixel_t fgcolor = termui_color_to_pixel(fg); 271 272 int bx = col * FONT_WIDTH; 273 int by = row * FONT_SCANLINES; 274 275 // TODO: support bold/italic/underline/strike/blink styling 276 277 if (cell->inverted ^ cell->cursor) { 278 pixel_t tmp = bgcolor; 279 bgcolor = fgcolor; 280 fgcolor = tmp; 281 } 282 283 uint32_t glyph = cell->glyph_idx; 284 assert(glyph < FONT_GLYPHS); 285 286 if (glyph == 0) 287 glyph = fb_font_glyph(U' ', NULL); 239 288 240 289 for (unsigned int y = 0; y < FONT_SCANLINES; y++) { … … 248 297 } 249 298 } 299 250 300 term_update_region(term, bx, by, FONT_WIDTH, FONT_SCANLINES); 251 301 } 252 302 253 static bool term_update_scroll(terminal_t *term, pixelmap_t *pixelmap, 254 sysarg_t sx, sysarg_t sy) 255 { 256 sysarg_t top_row = chargrid_get_top_row(term->frontbuf); 257 258 if (term->top_row == top_row) { 259 return false; 260 } 261 262 term->top_row = top_row; 263 264 for (sysarg_t row = 0; row < term->rows; row++) { 265 for (sysarg_t col = 0; col < term->cols; col++) { 266 charfield_t *front_field = 267 chargrid_charfield_at(term->frontbuf, col, row); 268 charfield_t *back_field = 269 chargrid_charfield_at(term->backbuf, col, row); 270 bool update = false; 271 272 if (front_field->ch != back_field->ch) { 273 back_field->ch = front_field->ch; 274 update = true; 275 } 276 277 if (!attrs_same(front_field->attrs, back_field->attrs)) { 278 back_field->attrs = front_field->attrs; 279 update = true; 280 } 281 282 front_field->flags &= ~CHAR_FLAG_DIRTY; 283 284 if (update) { 285 term_update_char(term, pixelmap, sx, sy, col, row); 286 } 287 } 288 } 289 290 return true; 291 } 292 293 static bool term_update_cursor(terminal_t *term, pixelmap_t *pixelmap, 294 sysarg_t sx, sysarg_t sy) 295 { 296 bool update = false; 297 298 sysarg_t front_col; 299 sysarg_t front_row; 300 chargrid_get_cursor(term->frontbuf, &front_col, &front_row); 301 302 sysarg_t back_col; 303 sysarg_t back_row; 304 chargrid_get_cursor(term->backbuf, &back_col, &back_row); 305 306 bool front_visibility = 307 chargrid_get_cursor_visibility(term->frontbuf) && 308 term->is_focused; 309 bool back_visibility = 310 chargrid_get_cursor_visibility(term->backbuf); 311 312 if (front_visibility != back_visibility) { 313 chargrid_set_cursor_visibility(term->backbuf, 314 front_visibility); 315 term_update_char(term, pixelmap, sx, sy, back_col, back_row); 316 update = true; 317 } 318 319 if ((front_col != back_col) || (front_row != back_row)) { 320 chargrid_set_cursor(term->backbuf, front_col, front_row); 321 term_update_char(term, pixelmap, sx, sy, back_col, back_row); 322 term_update_char(term, pixelmap, sx, sy, front_col, front_row); 323 update = true; 324 } 325 326 return update; 327 } 328 329 static void term_update(terminal_t *term) 330 { 331 pixelmap_t pixelmap; 303 static void term_render(terminal_t *term) 304 { 305 (void) gfx_bitmap_render(term->bmp, &term->update, &term->off); 306 307 term->update.p0.x = 0; 308 term->update.p0.y = 0; 309 term->update.p1.x = 0; 310 term->update.p1.y = 0; 311 } 312 313 static void termui_refresh_cb(void *userdata) 314 { 315 terminal_t *term = userdata; 316 317 termui_force_viewport_update(term->termui, 0, termui_get_rows(term->termui)); 318 } 319 320 static void termui_scroll_cb(void *userdata, int delta) 321 { 322 (void) delta; 323 324 // Until we have support for hardware accelerated scrolling, just redraw everything. 325 termui_refresh_cb(userdata); 326 } 327 328 static pixelmap_t term_get_pixelmap(terminal_t *term) 329 { 330 pixelmap_t pixelmap = { }; 332 331 gfx_bitmap_alloc_t alloc; 333 gfx_coord2_t pos; 334 errno_t rc; 335 336 rc = gfx_bitmap_get_alloc(term->bmp, &alloc); 337 if (rc != EOK) { 338 return; 339 } 340 341 fibril_mutex_lock(&term->mtx); 332 333 errno_t rc = gfx_bitmap_get_alloc(term->bmp, &alloc); 334 if (rc != EOK) 335 return pixelmap; 336 342 337 pixelmap.width = term->w; 343 338 pixelmap.height = term->h; 344 339 pixelmap.data = alloc.pixels; 345 346 bool update = false; 347 sysarg_t sx = 0; 348 sysarg_t sy = 0; 349 350 if (term_update_scroll(term, &pixelmap, sx, sy)) { 351 update = true; 352 } else { 353 for (sysarg_t y = 0; y < term->rows; y++) { 354 for (sysarg_t x = 0; x < term->cols; x++) { 355 charfield_t *front_field = 356 chargrid_charfield_at(term->frontbuf, x, y); 357 charfield_t *back_field = 358 chargrid_charfield_at(term->backbuf, x, y); 359 bool cupdate = false; 360 361 if ((front_field->flags & CHAR_FLAG_DIRTY) == 362 CHAR_FLAG_DIRTY) { 363 if (front_field->ch != back_field->ch) { 364 back_field->ch = front_field->ch; 365 cupdate = true; 366 } 367 368 if (!attrs_same(front_field->attrs, 369 back_field->attrs)) { 370 back_field->attrs = front_field->attrs; 371 cupdate = true; 372 } 373 374 front_field->flags &= ~CHAR_FLAG_DIRTY; 375 } 376 377 if (cupdate) { 378 term_update_char(term, &pixelmap, sx, sy, x, y); 379 update = true; 380 } 381 } 382 } 383 } 384 385 if (term_update_cursor(term, &pixelmap, sx, sy)) 386 update = true; 387 388 if (update) { 389 pos.x = 4; 390 pos.y = 26; 391 (void) gfx_bitmap_render(term->bmp, &term->update, &pos); 392 393 term->update.p0.x = 0; 394 term->update.p0.y = 0; 395 term->update.p1.x = 0; 396 term->update.p1.y = 0; 397 } 398 399 fibril_mutex_unlock(&term->mtx); 400 } 401 402 static void term_repaint(terminal_t *term) 403 { 404 pixelmap_t pixelmap; 405 gfx_bitmap_alloc_t alloc; 406 errno_t rc; 407 408 rc = gfx_bitmap_get_alloc(term->bmp, &alloc); 409 if (rc != EOK) { 410 printf("Error getting bitmap allocation info.\n"); 340 return pixelmap; 341 } 342 343 static void term_clear_bitmap(terminal_t *term, pixel_t color) 344 { 345 pixelmap_t pixelmap = term_get_pixelmap(term); 346 if (pixelmap.data == NULL) 411 347 return; 412 } 413 414 fibril_mutex_lock(&term->mtx); 415 416 pixelmap.width = term->w; 417 pixelmap.height = term->h; 418 pixelmap.data = alloc.pixels; 419 420 sysarg_t sx = 0; 421 sysarg_t sy = 0; 422 423 if (!term_update_scroll(term, &pixelmap, sx, sy)) { 424 for (sysarg_t y = 0; y < term->rows; y++) { 425 for (sysarg_t x = 0; x < term->cols; x++) { 426 charfield_t *front_field = 427 chargrid_charfield_at(term->frontbuf, x, y); 428 charfield_t *back_field = 429 chargrid_charfield_at(term->backbuf, x, y); 430 431 back_field->ch = front_field->ch; 432 back_field->attrs = front_field->attrs; 433 front_field->flags &= ~CHAR_FLAG_DIRTY; 434 435 term_update_char(term, &pixelmap, sx, sy, x, y); 436 } 437 } 438 } 439 440 term_update_cursor(term, &pixelmap, sx, sy); 441 442 fibril_mutex_unlock(&term->mtx); 348 349 sysarg_t pixels = pixelmap.height * pixelmap.width; 350 for (sysarg_t i = 0; i < pixels; i++) 351 pixelmap.data[i] = color; 352 353 term_update_region(term, 0, 0, pixelmap.width, pixelmap.height); 354 } 355 356 static void termui_update_cb(void *userdata, int col, int row, const termui_cell_t *cell, int len) 357 { 358 terminal_t *term = userdata; 359 360 pixelmap_t pixelmap = term_get_pixelmap(term); 361 if (pixelmap.data == NULL) 362 return; 363 364 for (int i = 0; i < len; i++) 365 term_draw_cell(term, &pixelmap, col + i, row, &cell[i]); 443 366 } 444 367 … … 480 403 if (pos < size) { 481 404 link_t *link = prodcons_consume(&term->input_pc); 482 cons_event_t *event = list_get_instance(link, cons_event_t, link); 405 terminal_event_t *qevent = list_get_instance(link, 406 terminal_event_t, link); 407 cons_event_t *event = &qevent->ev; 483 408 484 409 /* Accept key presses of printable chars only. */ … … 494 419 } 495 420 496 free( event);421 free(qevent); 497 422 } 498 423 } … … 504 429 static void term_write_char(terminal_t *term, wchar_t ch) 505 430 { 506 sysarg_t updated = 0;507 508 fibril_mutex_lock(&term->mtx);509 510 431 switch (ch) { 511 case '\n':512 updated = chargrid_newline(term->frontbuf);432 case L'\n': 433 termui_put_crlf(term->termui); 513 434 break; 514 case '\r': 435 case L'\r': 436 termui_put_cr(term->termui); 515 437 break; 516 case '\t':517 updated = chargrid_tabstop(term->frontbuf, 8);438 case L'\t': 439 termui_put_tab(term->termui); 518 440 break; 519 case '\b':520 updated = chargrid_backspace(term->frontbuf);441 case L'\b': 442 termui_put_backspace(term->termui); 521 443 break; 522 444 default: 523 updated = chargrid_putuchar(term->frontbuf, ch, true); 524 } 525 526 fibril_mutex_unlock(&term->mtx); 527 528 if (updated > 1) 529 term_update(term); 445 // TODO: For some languages, we might need support for combining 446 // characters. Currently, we assume every unicode code point is 447 // an individual printed character, which is not always the case. 448 termui_put_glyph(term->termui, fb_font_glyph(ch, NULL), 1); 449 break; 450 } 530 451 } 531 452 … … 533 454 { 534 455 terminal_t *term = srv_to_terminal(srv); 456 457 fibril_mutex_lock(&term->mtx); 535 458 536 459 size_t off = 0; … … 538 461 term_write_char(term, str_decode(data, &off, size)); 539 462 463 fibril_mutex_unlock(&term->mtx); 464 465 term_render(term); 540 466 gfx_update(term->gc); 541 467 *nwritten = size; 468 542 469 return EOK; 543 470 } … … 547 474 terminal_t *term = srv_to_terminal(srv); 548 475 549 term_ update(term);476 term_render(term); 550 477 gfx_update(term->gc); 551 478 } … … 556 483 557 484 fibril_mutex_lock(&term->mtx); 558 chargrid_clear(term->frontbuf);559 fibril_mutex_unlock(&term->mtx); 560 561 term_ update(term);485 termui_clear_screen(term->termui); 486 fibril_mutex_unlock(&term->mtx); 487 488 term_render(term); 562 489 gfx_update(term->gc); 563 490 } … … 568 495 569 496 fibril_mutex_lock(&term->mtx); 570 chargrid_set_cursor(term->frontbuf, col, row);571 fibril_mutex_unlock(&term->mtx); 572 573 term_ update(term);497 termui_set_pos(term->termui, col, row); 498 fibril_mutex_unlock(&term->mtx); 499 500 term_render(term); 574 501 gfx_update(term->gc); 575 502 } … … 580 507 581 508 fibril_mutex_lock(&term->mtx); 582 chargrid_get_cursor(term->frontbuf, col, row); 583 fibril_mutex_unlock(&term->mtx); 509 int irow, icol; 510 termui_get_pos(term->termui, &icol, &irow); 511 fibril_mutex_unlock(&term->mtx); 512 513 *col = icol; 514 *row = irow; 584 515 585 516 return EOK; … … 591 522 592 523 fibril_mutex_lock(&term->mtx); 593 *cols = term ->cols;594 *rows = term ->rows;524 *cols = termui_get_cols(term->termui); 525 *rows = termui_get_rows(term->termui); 595 526 fibril_mutex_unlock(&term->mtx); 596 527 … … 610 541 terminal_t *term = srv_to_terminal(srv); 611 542 612 fibril_mutex_lock(&term->mtx); 613 chargrid_set_style(term->frontbuf, style); 543 termui_cell_t cellstyle = { }; 544 545 switch (style) { 546 case STYLE_NORMAL: 547 cellstyle.bgcolor = term->default_bgcolor; 548 cellstyle.fgcolor = term->default_fgcolor; 549 break; 550 case STYLE_EMPHASIS: 551 cellstyle.bgcolor = term->emphasis_bgcolor; 552 cellstyle.fgcolor = term->emphasis_fgcolor; 553 break; 554 case STYLE_INVERTED: 555 cellstyle.bgcolor = term->default_bgcolor; 556 cellstyle.fgcolor = term->default_fgcolor; 557 cellstyle.inverted = 1; 558 break; 559 case STYLE_SELECTED: 560 cellstyle.bgcolor = term->selection_bgcolor; 561 cellstyle.fgcolor = term->selection_fgcolor; 562 break; 563 } 564 565 fibril_mutex_lock(&term->mtx); 566 termui_set_style(term->termui, cellstyle); 614 567 fibril_mutex_unlock(&term->mtx); 615 568 } … … 620 573 terminal_t *term = srv_to_terminal(srv); 621 574 622 fibril_mutex_lock(&term->mtx); 623 chargrid_set_color(term->frontbuf, bgcolor, fgcolor, attr); 575 int bright = (attr & CATTR_BRIGHT) ? COLOR_BRIGHT : 0; 576 577 termui_cell_t cellstyle = { }; 578 cellstyle.bgcolor = termui_color_from_pixel(_basic_colors[bgcolor]); 579 cellstyle.fgcolor = termui_color_from_pixel(_basic_colors[fgcolor | bright]); 580 581 if (attr & CATTR_BLINK) 582 cellstyle.blink = 1; 583 584 fibril_mutex_lock(&term->mtx); 585 termui_set_style(term->termui, cellstyle); 624 586 fibril_mutex_unlock(&term->mtx); 625 587 } … … 629 591 { 630 592 terminal_t *term = srv_to_terminal(srv); 631 632 fibril_mutex_lock(&term->mtx); 633 chargrid_set_rgb_color(term->frontbuf, bgcolor, fgcolor); 593 termui_cell_t cellstyle = { 594 .bgcolor = termui_color_from_pixel(bgcolor), 595 .fgcolor = termui_color_from_pixel(fgcolor), 596 }; 597 598 fibril_mutex_lock(&term->mtx); 599 termui_set_style(term->termui, cellstyle); 634 600 fibril_mutex_unlock(&term->mtx); 635 601 } … … 640 606 641 607 fibril_mutex_lock(&term->mtx); 642 chargrid_set_cursor_visibility(term->frontbuf, visible);643 fibril_mutex_unlock(&term->mtx); 644 645 term_ update(term);608 termui_set_cursor_visibility(term->termui, visible); 609 fibril_mutex_unlock(&term->mtx); 610 611 term_render(term); 646 612 gfx_update(term->gc); 647 613 } … … 662 628 fibril_mutex_unlock(&term->mtx); 663 629 664 term_ update(term);630 term_render(term); 665 631 gfx_update(term->gc); 666 632 return EOK; … … 671 637 terminal_t *term = srv_to_terminal(srv); 672 638 link_t *link = prodcons_consume(&term->input_pc); 673 cons_event_t *ev = list_get_instance(link, cons_event_t, link);674 675 *event = *ev;639 terminal_event_t *ev = list_get_instance(link, terminal_event_t, link); 640 641 *event = ev->ev; 676 642 free(ev); 677 643 return EOK; … … 710 676 term->urows = rows; 711 677 term->ubuf = buf; 678 679 /* Scroll back to active screen. */ 680 termui_history_scroll(term->termui, INT_MAX); 681 712 682 fibril_mutex_unlock(&term->mtx); 713 683 … … 730 700 term->ubuf = NULL; 731 701 702 termui_wipe_screen(term->termui, 0); 703 704 fibril_mutex_unlock(&term->mtx); 705 706 /* Update terminal */ 707 term_render(term); 708 gfx_update(term->gc); 709 732 710 if (buf != NULL) 733 711 as_area_destroy(buf); 734 735 fibril_mutex_unlock(&term->mtx);736 712 } 737 713 … … 748 724 { 749 725 terminal_t *term = srv_to_terminal(srv); 750 charfield_t *ch;751 sysarg_t col, row;752 726 753 727 fibril_mutex_lock(&term->mtx); … … 759 733 760 734 /* Make sure we have meaningful coordinates, within bounds */ 761 762 if (c1 > term->ucols)763 c1 = term->ucols;764 if (c1 > term->cols)765 c1 = term->cols; 766 if (c0 >= c1 ) {735 c1 = min(c1, term->ucols); 736 c1 = min(c1, (sysarg_t) termui_get_cols(term->termui)); 737 r1 = min(r1, term->urows); 738 r1 = min(r1, (sysarg_t) termui_get_rows(term->termui)); 739 740 if (c0 >= c1 || r0 >= r1) { 767 741 fibril_mutex_unlock(&term->mtx); 768 742 return; 769 743 } 770 if (r1 > term->urows)771 r1 = term->urows;772 if (r1 > term->rows)773 r1 = term->rows;774 if (r0 >= r1) {775 fibril_mutex_unlock(&term->mtx);776 return;777 }778 744 779 745 /* Update front buffer from user buffer */ 780 746 781 for (row = r0; row < r1; row++) { 782 for (col = c0; col < c1; col++) { 783 ch = chargrid_charfield_at(term->frontbuf, col, row); 784 *ch = term->ubuf[row * term->ucols + col]; 747 for (sysarg_t row = r0; row < r1; row++) { 748 termui_cell_t *cells = termui_get_active_row(term->termui, row); 749 750 for (sysarg_t col = c0; col < c1; col++) { 751 cells[col] = charfield_to_termui_cell(term, &term->ubuf[row * term->ucols + col]); 785 752 } 753 754 termui_update_cb(term, c0, row, &cells[c0], c1 - c0); 786 755 } 787 756 … … 789 758 790 759 /* Update terminal */ 791 term_ update(term);760 term_render(term); 792 761 gfx_update(term->gc); 793 762 } 794 763 795 static void deinit_terminal(terminal_t *term) 764 static errno_t terminal_window_resize(terminal_t *term) 765 { 766 gfx_rect_t rect; 767 ui_window_get_app_rect(term->window, &rect); 768 769 int width = rect.p1.x - rect.p0.x; 770 int height = rect.p1.y - rect.p0.y; 771 772 if (!term->gc) 773 term->gc = ui_window_get_gc(term->window); 774 else 775 assert(term->gc == ui_window_get_gc(term->window)); 776 777 if (!term->ui_res) 778 term->ui_res = ui_window_get_res(term->window); 779 else 780 assert(term->ui_res == ui_window_get_res(term->window)); 781 782 gfx_bitmap_t *new_bmp; 783 gfx_bitmap_params_t params; 784 gfx_bitmap_params_init(¶ms); 785 params.rect.p0.x = 0; 786 params.rect.p0.y = 0; 787 params.rect.p1.x = width; 788 params.rect.p1.y = height; 789 790 errno_t rc = gfx_bitmap_create(term->gc, ¶ms, NULL, &new_bmp); 791 if (rc != EOK) { 792 fprintf(stderr, "Error allocating new screen bitmap: %s\n", str_error(rc)); 793 return rc; 794 } 795 796 if (term->bmp) { 797 rc = gfx_bitmap_destroy(term->bmp); 798 if (rc != EOK) 799 fprintf(stderr, "Error deallocating old screen bitmap: %s\n", str_error(rc)); 800 } 801 802 term->bmp = new_bmp; 803 term->w = width; 804 term->h = height; 805 806 term_clear_bitmap(term, termui_color_to_pixel(term->default_bgcolor)); 807 808 return EOK; 809 } 810 811 void terminal_destroy(terminal_t *term) 796 812 { 797 813 list_remove(&term->link); 798 814 799 if (term->frontbuf) 800 chargrid_destroy(term->frontbuf); 801 802 if (term->backbuf) 803 chargrid_destroy(term->backbuf); 804 } 805 806 void terminal_destroy(terminal_t *term) 807 { 808 deinit_terminal(term); 815 termui_destroy(term->termui); 816 817 if (term->ubuf) 818 as_area_destroy(term->ubuf); 819 820 ui_destroy(term->ui); 809 821 free(term); 810 822 } … … 813 825 { 814 826 /* Got key press/release event */ 815 cons_event_t *event =816 ( cons_event_t *) malloc(sizeof(cons_event_t));827 terminal_event_t *event = 828 (terminal_event_t *) malloc(sizeof(terminal_event_t)); 817 829 if (event == NULL) 818 830 return; 819 831 820 *event= *ev;832 event->ev = *ev; 821 833 link_initialize(&event->link); 822 834 … … 840 852 (void)nfocus; 841 853 term->is_focused = true; 842 term_ update(term);854 term_render(term); 843 855 gfx_update(term->gc); 856 } 857 858 static void terminal_resize_handler(ui_window_t *window, void *arg) 859 { 860 terminal_t *term = (terminal_t *) arg; 861 862 fibril_mutex_lock(&term->mtx); 863 864 errno_t rc = terminal_window_resize(term); 865 if (rc == EOK) { 866 (void) termui_resize(term->termui, term->w / FONT_WIDTH, term->h / FONT_SCANLINES, SCROLLBACK_MAX_LINES); 867 termui_refresh_cb(term); 868 term_render(term); 869 gfx_update(term->gc); 870 871 cons_event_t event = { .type = CEV_RESIZE }; 872 terminal_queue_cons_event(term, &event); 873 } 874 875 fibril_mutex_unlock(&term->mtx); 876 } 877 878 static void terminal_resize_event(ui_window_t *window, void *arg) 879 { 880 ui_window_def_resize(window); 881 terminal_resize_handler(window, arg); 882 } 883 884 static void terminal_maximize_event(ui_window_t *window, void *arg) 885 { 886 ui_window_def_maximize(window); 887 terminal_resize_handler(window, arg); 888 } 889 890 static void terminal_unmaximize_event(ui_window_t *window, void *arg) 891 { 892 ui_window_def_unmaximize(window); 893 terminal_resize_handler(window, arg); 844 894 } 845 895 … … 854 904 event.ev.key = *kbd_event; 855 905 856 terminal_queue_cons_event(term, &event); 906 const int PAGE_ROWS = (termui_get_rows(term->termui) * 2) / 3; 907 908 fibril_mutex_lock(&term->mtx); 909 910 if (!term->ubuf && kbd_event->type == KEY_PRESS && 911 (kbd_event->key == KC_PAGE_UP || kbd_event->key == KC_PAGE_DOWN)) { 912 913 termui_history_scroll(term->termui, 914 (kbd_event->key == KC_PAGE_UP) ? -PAGE_ROWS : PAGE_ROWS); 915 916 term_render(term); 917 gfx_update(term->gc); 918 } else { 919 terminal_queue_cons_event(term, &event); 920 } 921 922 fibril_mutex_unlock(&term->mtx); 857 923 } 858 924 … … 863 929 terminal_t *term = (terminal_t *) arg; 864 930 865 sysarg_t sx = -term->off.x; 866 sysarg_t sy = -term->off.y; 867 868 if (event->type == POS_PRESS || event->type == POS_RELEASE || 869 event->type == POS_DCLICK) { 870 cevent.type = CEV_POS; 871 cevent.ev.pos.type = event->type; 872 cevent.ev.pos.pos_id = event->pos_id; 873 cevent.ev.pos.btn_num = event->btn_num; 874 875 cevent.ev.pos.hpos = (event->hpos - sx) / FONT_WIDTH; 876 cevent.ev.pos.vpos = (event->vpos - sy) / FONT_SCANLINES; 931 switch (event->type) { 932 case POS_UPDATE: 933 return; 934 935 case POS_PRESS: 936 case POS_RELEASE: 937 case POS_DCLICK: 938 } 939 940 /* Ignore mouse events when we're in scrollback mode. */ 941 if (termui_scrollback_is_active(term->termui)) 942 return; 943 944 sysarg_t sx = term->off.x; 945 sysarg_t sy = term->off.y; 946 947 if (event->hpos < sx || event->vpos < sy) 948 return; 949 950 cevent.type = CEV_POS; 951 cevent.ev.pos.type = event->type; 952 cevent.ev.pos.pos_id = event->pos_id; 953 cevent.ev.pos.btn_num = event->btn_num; 954 955 cevent.ev.pos.hpos = (event->hpos - sx) / FONT_WIDTH; 956 cevent.ev.pos.vpos = (event->vpos - sy) / FONT_SCANLINES; 957 958 /* Filter out events outside the terminal area. */ 959 int cols = termui_get_cols(term->termui); 960 int rows = termui_get_rows(term->termui); 961 962 if (cevent.ev.pos.hpos < (sysarg_t) cols && cevent.ev.pos.vpos < (sysarg_t) rows) 877 963 terminal_queue_cons_event(term, &cevent); 878 }879 964 } 880 965 … … 887 972 if (nfocus == 0) { 888 973 term->is_focused = false; 889 term_ update(term);974 term_render(term); 890 975 gfx_update(term->gc); 891 976 } … … 909 994 910 995 if (!atomic_flag_test_and_set(&term->refcnt)) 911 chargrid_set_cursor_visibility(term->frontbuf, true);996 termui_set_cursor_visibility(term->termui, true); 912 997 913 998 con_conn(icall, &term->srvs); 999 } 1000 1001 static errno_t term_init_window(terminal_t *term, const char *display_spec, 1002 gfx_coord_t width, gfx_coord_t height, 1003 gfx_coord_t min_width, gfx_coord_t min_height, 1004 terminal_flags_t flags) 1005 { 1006 gfx_rect_t min_rect = { { 0, 0 }, { min_width, min_height } }; 1007 gfx_rect_t wmin_rect; 1008 gfx_rect_t wrect; 1009 1010 errno_t rc = ui_create(display_spec, &term->ui); 1011 if (rc != EOK) { 1012 printf("Error creating UI on %s.\n", display_spec); 1013 return rc; 1014 } 1015 1016 ui_wnd_params_t wparams; 1017 ui_wnd_params_init(&wparams); 1018 wparams.caption = "Terminal"; 1019 wparams.style |= ui_wds_maximize_btn | ui_wds_resizable; 1020 1021 if ((flags & tf_topleft) != 0) 1022 wparams.placement = ui_wnd_place_top_left; 1023 1024 if (ui_is_fullscreen(term->ui)) { 1025 wparams.placement = ui_wnd_place_full_screen; 1026 wparams.style &= ~ui_wds_decorated; 1027 } 1028 1029 /* Compute wrect such that application area corresponds to rect. */ 1030 ui_wdecor_rect_from_app(term->ui, wparams.style, &min_rect, &wrect); 1031 gfx_rect_rtranslate(&wrect.p0, &wrect, &wmin_rect); 1032 wparams.min_size = wmin_rect.p1; 1033 1034 gfx_rect_t rect = { { 0, 0 }, { width, height } }; 1035 ui_wdecor_rect_from_app(term->ui, wparams.style, &rect, &rect); 1036 term->off.x = -rect.p0.x; 1037 term->off.y = -rect.p0.y; 1038 printf("off=%d,%d\n", term->off.x, term->off.y); 1039 gfx_rect_translate(&term->off, &rect, &wparams.rect); 1040 printf("wparams.rect=%d,%d,%d,%d\n", 1041 wparams.rect.p0.x, 1042 wparams.rect.p1.x, 1043 wparams.rect.p0.y, 1044 wparams.rect.p1.y); 1045 1046 rc = ui_window_create(term->ui, &wparams, &term->window); 1047 if (rc != EOK) 1048 return rc; 1049 1050 ui_window_set_cb(term->window, &terminal_window_cb, (void *) term); 1051 return terminal_window_resize(term); 914 1052 } 915 1053 … … 918 1056 terminal_t **rterm) 919 1057 { 920 terminal_t *term;921 gfx_bitmap_params_t params;922 ui_wnd_params_t wparams;923 gfx_rect_t rect;924 gfx_coord2_t off;925 gfx_rect_t wrect;926 1058 errno_t rc; 927 1059 928 term = calloc(1, sizeof(terminal_t));1060 terminal_t *term = calloc(1, sizeof(terminal_t)); 929 1061 if (term == NULL) { 930 1062 printf("Out of memory.\n"); … … 939 1071 term->char_remains_len = 0; 940 1072 941 term->w = width; 942 term->h = height; 943 944 term->cols = width / FONT_WIDTH; 945 term->rows = height / FONT_SCANLINES; 946 947 term->frontbuf = NULL; 948 term->backbuf = NULL; 949 950 term->frontbuf = chargrid_create(term->cols, term->rows, 951 CHARGRID_FLAG_NONE); 952 if (!term->frontbuf) { 953 printf("Error creating front buffer.\n"); 1073 term->default_bgcolor = termui_color_from_pixel(_basic_colors[COLOR_WHITE | COLOR_BRIGHT]); 1074 term->default_fgcolor = termui_color_from_pixel(_basic_colors[COLOR_BLACK]); 1075 1076 term->emphasis_bgcolor = termui_color_from_pixel(_basic_colors[COLOR_WHITE | COLOR_BRIGHT]); 1077 term->emphasis_fgcolor = termui_color_from_pixel(_basic_colors[COLOR_RED | COLOR_BRIGHT]); 1078 1079 term->selection_bgcolor = termui_color_from_pixel(_basic_colors[COLOR_RED | COLOR_BRIGHT]); 1080 term->selection_fgcolor = termui_color_from_pixel(_basic_colors[COLOR_WHITE | COLOR_BRIGHT]); 1081 1082 rc = term_init_window(term, display_spec, width, height, 1083 MIN_WINDOW_COLS * FONT_WIDTH, MIN_WINDOW_ROWS * FONT_SCANLINES, flags); 1084 if (rc != EOK) { 1085 printf("Error creating window (%s).\n", str_error(rc)); 1086 goto error; 1087 } 1088 1089 term->termui = termui_create(term->w / FONT_WIDTH, 1090 term->h / FONT_SCANLINES, SCROLLBACK_MAX_LINES); 1091 if (!term->termui) { 1092 printf("Error creating terminal UI.\n"); 954 1093 rc = ENOMEM; 955 1094 goto error; 956 1095 } 957 1096 958 term->backbuf = chargrid_create(term->cols, term->rows, 959 CHARGRID_FLAG_NONE); 960 if (!term->backbuf) { 961 printf("Error creating back buffer.\n"); 962 rc = ENOMEM; 963 goto error; 964 } 965 966 rect.p0.x = 0; 967 rect.p0.y = 0; 968 rect.p1.x = width; 969 rect.p1.y = height; 970 971 ui_wnd_params_init(&wparams); 972 wparams.caption = "Terminal"; 973 if ((flags & tf_topleft) != 0) 974 wparams.placement = ui_wnd_place_top_left; 975 976 rc = ui_create(display_spec, &term->ui); 977 if (rc != EOK) { 978 printf("Error creating UI on %s.\n", display_spec); 979 goto error; 980 } 981 982 /* 983 * Compute window rectangle such that application area corresponds 984 * to rect 985 */ 986 ui_wdecor_rect_from_app(term->ui, wparams.style, &rect, &wrect); 987 off = wrect.p0; 988 gfx_rect_rtranslate(&off, &wrect, &wparams.rect); 989 990 term->off = off; 991 992 rc = ui_window_create(term->ui, &wparams, &term->window); 993 if (rc != EOK) { 994 printf("Error creating window.\n"); 995 goto error; 996 } 997 998 term->gc = ui_window_get_gc(term->window); 999 term->ui_res = ui_window_get_res(term->window); 1000 1001 ui_window_set_cb(term->window, &terminal_window_cb, (void *) term); 1002 1003 gfx_bitmap_params_init(¶ms); 1004 params.rect.p0.x = 0; 1005 params.rect.p0.y = 0; 1006 params.rect.p1.x = width; 1007 params.rect.p1.y = height; 1008 1009 rc = gfx_bitmap_create(term->gc, ¶ms, NULL, &term->bmp); 1010 if (rc != EOK) { 1011 printf("Error allocating screen bitmap.\n"); 1012 goto error; 1013 } 1014 1015 chargrid_clear(term->frontbuf); 1016 chargrid_clear(term->backbuf); 1017 term->top_row = 0; 1097 termui_set_refresh_cb(term->termui, termui_refresh_cb, term); 1098 termui_set_scroll_cb(term->termui, termui_scroll_cb, term); 1099 termui_set_update_cb(term->termui, termui_update_cb, term); 1018 1100 1019 1101 async_set_fallback_port_handler(term_connection, NULL); … … 1053 1135 term->is_focused = true; 1054 1136 1055 term->update.p0.x = 0; 1056 term->update.p0.y = 0; 1057 term->update.p1.x = 0; 1058 term->update.p1.y = 0; 1059 1060 term_repaint(term); 1137 termui_refresh_cb(term); 1061 1138 1062 1139 *rterm = term; … … 1071 1148 if (term->ui != NULL) 1072 1149 ui_destroy(term->ui); 1073 if (term->frontbuf != NULL) 1074 chargrid_destroy(term->frontbuf); 1075 if (term->backbuf != NULL) 1076 chargrid_destroy(term->backbuf); 1150 if (term->termui != NULL) 1151 termui_destroy(term->termui); 1077 1152 free(term); 1078 1153 return rc; -
uspace/app/terminal/terminal.h
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2012 Petr Koupy 4 4 * All rights reserved. … … 45 45 #include <gfx/context.h> 46 46 #include <gfx/coord.h> 47 #include <io/chargrid.h>48 47 #include <io/con_srv.h> 48 #include <io/cons_event.h> 49 49 #include <loc.h> 50 50 #include <stdatomic.h> 51 51 #include <str.h> 52 52 #include <task.h> 53 #include <termui.h> 53 54 #include <ui/ui.h> 54 55 #include <ui/window.h> … … 81 82 size_t char_remains_len; 82 83 83 sysarg_t cols; 84 sysarg_t rows; 85 chargrid_t *frontbuf; 86 chargrid_t *backbuf; 87 sysarg_t top_row; 84 termui_t *termui; 85 86 termui_color_t default_bgcolor; 87 termui_color_t default_fgcolor; 88 termui_color_t emphasis_bgcolor; 89 termui_color_t emphasis_fgcolor; 90 termui_color_t selection_bgcolor; 91 termui_color_t selection_fgcolor; 88 92 89 93 sysarg_t ucols; … … 99 103 } terminal_t; 100 104 105 /** Terminal event */ 106 typedef struct { 107 /** Link to list of events */ 108 link_t link; 109 /** Console event */ 110 cons_event_t ev; 111 } terminal_event_t; 112 101 113 extern errno_t terminal_create(const char *, sysarg_t, sysarg_t, 102 114 terminal_flags_t, const char *, terminal_t **); -
uspace/app/tester/print/print2.c
r2a0c827c rebb1489 62 62 TPRINTF("Real output: [%td] [%tu] [%tx] [%ti] [%to]\n\n", d, neg_d, neg_d, d, neg_d); 63 63 64 TPRINTF("Testing printf(\"%%lf\", 768.0):\n"); 65 TPRINTF("Expected output: [768.000000]\n"); 66 TPRINTF("Real output: [%lf]\n", 768.0); 67 64 68 return NULL; 65 69 } -
uspace/app/tetris/screen.c
r2a0c827c rebb1489 1 1 /* 2 * Copyright (c) 2024 Jiri Svoboda 2 3 * Copyright (c) 2011 Martin Decky 3 4 * All rights reserved. … … 79 80 static usec_t timeleft = 0; 80 81 82 bool size_changed; 81 83 console_ctrl_t *console; 82 84 … … 142 144 console_cursor_visibility(console, 0); 143 145 resume_normal(); 144 scr_ clear();146 scr_set(); 145 147 } 146 148 … … 169 171 } 170 172 173 if ((ccap & CONSOLE_CAP_CURSORCTL) == 0) { 174 stop("Your screen does not support cursor control.\n"); 175 return; 176 } 171 177 *rgb = ((ccap & CONSOLE_CAP_RGB) == CONSOLE_CAP_RGB); 172 178 *color = ((ccap & CONSOLE_CAP_INDEXED) == CONSOLE_CAP_INDEXED); … … 194 200 195 201 snprintf(smallscr, sizeof(smallscr), 196 "the screen is too small (must be at least %dx%d) ",202 "the screen is too small (must be at least %dx%d)\n", 197 203 MINROWS, MINCOLS); 198 204 stop(smallscr); … … 217 223 218 224 fprintf(stderr, "aborting: %s", why); 219 abort();225 exit(1); 220 226 } 221 227 … … 410 416 exit(1); 411 417 418 if (event.type == CEV_RESIZE) 419 size_changed = true; 420 412 421 if (event.type == CEV_KEY && event.ev.key.type == KEY_PRESS) 413 422 c = event.ev.key.c; -
uspace/app/tetris/screen.h
r2a0c827c rebb1489 67 67 extern console_ctrl_t *console; 68 68 extern winsize_t winsize; 69 extern bool size_changed; 69 70 70 71 extern void moveto(sysarg_t r, sysarg_t c); -
uspace/app/tetris/tetris.c
r2a0c827c rebb1489 330 330 331 331 while (true) { 332 if (size_changed) { 333 size_changed = false; 334 scr_set(); 335 scr_msg(key_msg, 1); 336 } 337 332 338 place(curshape, pos, 1); 333 339 scr_update(); -
uspace/app/uidemo/uidemo.c
r2a0c827c rebb1489 741 741 } 742 742 743 /* Only allow making the window larger */ 744 gfx_rect_dims(¶ms.rect, ¶ms.min_size); 745 743 746 rc = ui_window_create(ui, ¶ms, &window); 744 747 if (rc != EOK) { -
uspace/app/viewer/viewer.c
r2a0c827c rebb1489 517 517 if (viewer != NULL && viewer->imgs != NULL) { 518 518 for (u = 0; u < viewer->imgs_count; u++) { 519 if (viewer->imgs[ i] != NULL)520 free(viewer->imgs[ i]);519 if (viewer->imgs[u] != NULL) 520 free(viewer->imgs[u]); 521 521 } 522 522 free(viewer->imgs);
Note:
See TracChangeset
for help on using the changeset viewer.
