Changes in uspace/app/terminal/terminal.c [77ffa01:211fd68] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/terminal/terminal.c
r77ffa01 r211fd68 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * Copyright (c) 2012 Petr Koupy 4 4 * All rights reserved. … … 41 41 #include <fbfont/font-8x16.h> 42 42 #include <io/chargrid.h> 43 #include <fibril.h> 43 44 #include <gfx/bitmap.h> 44 45 #include <gfx/context.h> … … 87 88 static void term_set_rgb_color(con_srv_t *, pixel_t, pixel_t); 88 89 static void term_set_cursor_visibility(con_srv_t *, bool); 90 static errno_t term_set_caption(con_srv_t *, const char *); 89 91 static errno_t term_get_event(con_srv_t *, cons_event_t *); 90 92 static errno_t term_map(con_srv_t *, sysarg_t, sysarg_t, charfield_t **); … … 108 110 .set_rgb_color = term_set_rgb_color, 109 111 .set_cursor_visibility = term_set_cursor_visibility, 112 .set_caption = term_set_caption, 110 113 .get_event = term_get_event, 111 114 .map = term_map, … … 115 118 116 119 static void terminal_close_event(ui_window_t *, void *); 117 static void terminal_focus_event(ui_window_t *, void * );120 static void terminal_focus_event(ui_window_t *, void *, unsigned); 118 121 static void terminal_kbd_event(ui_window_t *, void *, kbd_event_t *); 119 122 static void terminal_pos_event(ui_window_t *, void *, pos_event_t *); 120 static void terminal_unfocus_event(ui_window_t *, void * );123 static void terminal_unfocus_event(ui_window_t *, void *, unsigned); 121 124 122 125 static ui_window_cb_t terminal_window_cb = { … … 128 131 }; 129 132 133 static errno_t terminal_wait_fibril(void *); 134 130 135 static terminal_t *srv_to_terminal(con_srv_t *srv) 131 136 { … … 133 138 } 134 139 135 static void getterm(const char *svc, const char *app)136 { 137 task_spawnl(NULL, NULL, APP_GETTERM, APP_GETTERM, svc,140 static errno_t getterm(task_wait_t *wait, const char *svc, const char *app) 141 { 142 return task_spawnl(NULL, wait, APP_GETTERM, APP_GETTERM, svc, 138 143 LOCFS_MOUNT_POINT, "--msg", "--wait", "--", app, NULL); 139 144 } … … 141 146 static pixel_t color_table[16] = { 142 147 [COLOR_BLACK] = PIXEL(255, 0, 0, 0), 143 [COLOR_BLUE] = PIXEL(255, 0, 0, 240),144 [COLOR_GREEN] = PIXEL(255, 0, 240, 0),145 [COLOR_CYAN] = PIXEL(255, 0, 240, 240),146 [COLOR_RED] = PIXEL(255, 240, 0, 0),147 [COLOR_MAGENTA] = PIXEL(255, 240, 0, 240),148 [COLOR_YELLOW] = PIXEL(255, 240, 240, 0),149 [COLOR_WHITE] = PIXEL(255, 240, 240, 240),150 151 [COLOR_BLACK + 8] = PIXEL(255, 0, 0, 0),152 [COLOR_BLUE + 8] = PIXEL(255, 0, 0, 255),153 [COLOR_GREEN + 8] = PIXEL(255, 0, 255, 0),154 [COLOR_CYAN + 8] = PIXEL(255, 0, 255, 255),155 [COLOR_RED + 8] = PIXEL(255, 255, 0, 0),156 [COLOR_MAGENTA + 8] = PIXEL(255, 255, 0, 255),157 [COLOR_YELLOW + 8] = PIXEL(255, 255, 255, 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), 158 163 [COLOR_WHITE + 8] = PIXEL(255, 255, 255, 255), 159 164 }; … … 165 170 switch (attrs.val.style) { 166 171 case STYLE_NORMAL: 167 *bgcolor = color_table[COLOR_WHITE ];172 *bgcolor = color_table[COLOR_WHITE + 8]; 168 173 *fgcolor = color_table[COLOR_BLACK]; 169 174 break; 170 175 case STYLE_EMPHASIS: 171 *bgcolor = color_table[COLOR_WHITE ];172 *fgcolor = color_table[COLOR_RED ];176 *bgcolor = color_table[COLOR_WHITE + 8]; 177 *fgcolor = color_table[COLOR_RED + 8]; 173 178 break; 174 179 case STYLE_INVERTED: 175 180 *bgcolor = color_table[COLOR_BLACK]; 176 *fgcolor = color_table[COLOR_WHITE ];181 *fgcolor = color_table[COLOR_WHITE + 8]; 177 182 break; 178 183 case STYLE_SELECTED: 179 *bgcolor = color_table[COLOR_RED ];180 *fgcolor = color_table[COLOR_WHITE ];184 *bgcolor = color_table[COLOR_RED + 8]; 185 *fgcolor = color_table[COLOR_WHITE + 8]; 181 186 break; 182 187 } 183 188 break; 184 189 case CHAR_ATTR_INDEX: 185 *bgcolor = color_table[(attrs.val.index.bgcolor & 7) | 186 ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)]; 190 *bgcolor = color_table[(attrs.val.index.bgcolor & 7)]; 187 191 *fgcolor = color_table[(attrs.val.index.fgcolor & 7) | 188 192 ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)]; … … 643 647 } 644 648 649 static errno_t term_set_caption(con_srv_t *srv, const char *caption) 650 { 651 terminal_t *term = srv_to_terminal(srv); 652 const char *cap; 653 654 fibril_mutex_lock(&term->mtx); 655 656 if (str_size(caption) > 0) 657 cap = caption; 658 else 659 cap = "Terminal"; 660 661 ui_window_set_caption(term->window, cap); 662 fibril_mutex_unlock(&term->mtx); 663 664 term_update(term); 665 gfx_update(term->gc); 666 return EOK; 667 } 668 645 669 static errno_t term_get_event(con_srv_t *srv, cons_event_t *event) 646 670 { … … 805 829 terminal_t *term = (terminal_t *) arg; 806 830 807 (void) term; 808 809 // XXX This is not really a clean way of terminating 810 exit(0); 831 ui_quit(term->ui); 811 832 } 812 833 813 834 /** Handle window focus event. */ 814 static void terminal_focus_event(ui_window_t *window, void *arg) 835 static void terminal_focus_event(ui_window_t *window, void *arg, 836 unsigned nfocus) 815 837 { 816 838 terminal_t *term = (terminal_t *) arg; 817 839 840 (void)nfocus; 818 841 term->is_focused = true; 819 842 term_update(term); … … 843 866 sysarg_t sy = -term->off.y; 844 867 845 if (event->type == POS_PRESS || event->type == POS_RELEASE) { 868 if (event->type == POS_PRESS || event->type == POS_RELEASE || 869 event->type == POS_DCLICK) { 846 870 cevent.type = CEV_POS; 847 871 cevent.ev.pos.type = event->type; … … 856 880 857 881 /** Handle window unfocus event. */ 858 static void terminal_unfocus_event(ui_window_t *window, void *arg) 882 static void terminal_unfocus_event(ui_window_t *window, void *arg, 883 unsigned nfocus) 859 884 { 860 885 terminal_t *term = (terminal_t *) arg; 861 886 862 term->is_focused = false; 863 term_update(term); 864 gfx_update(term->gc); 887 if (nfocus == 0) { 888 term->is_focused = false; 889 term_update(term); 890 gfx_update(term->gc); 891 } 865 892 } 866 893 … … 888 915 889 916 errno_t terminal_create(const char *display_spec, sysarg_t width, 890 sysarg_t height, terminal_flags_t flags, terminal_t **rterm) 917 sysarg_t height, terminal_flags_t flags, const char *command, 918 terminal_t **rterm) 891 919 { 892 920 terminal_t *term; … … 946 974 wparams.placement = ui_wnd_place_top_left; 947 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 948 982 /* 949 983 * Compute window rectangle such that application area corresponds 950 984 * to rect 951 985 */ 952 ui_wdecor_rect_from_app( wparams.style, &rect, &wrect);986 ui_wdecor_rect_from_app(term->ui, wparams.style, &rect, &wrect); 953 987 off = wrect.p0; 954 988 gfx_rect_rtranslate(&off, &wrect, &wparams.rect); 955 989 956 990 term->off = off; 957 958 rc = ui_create(display_spec, &term->ui);959 if (rc != EOK) {960 printf("Error creating UI on %s.\n", display_spec);961 goto error;962 }963 991 964 992 rc = ui_window_create(term->ui, &wparams, &term->window); … … 994 1022 term->srvs.sarg = term; 995 1023 996 rc = loc_server_register(NAME );1024 rc = loc_server_register(NAME, &term->srv); 997 1025 if (rc != EOK) { 998 1026 printf("Error registering server.\n"); … … 1005 1033 task_get_id()); 1006 1034 1007 rc = loc_service_register( vc, &term->dsid);1035 rc = loc_service_register(term->srv, vc, &term->dsid); 1008 1036 if (rc != EOK) { 1009 1037 printf("Error registering service.\n"); … … 1013 1041 1014 1042 list_append(&term->link, &terms); 1015 getterm(vc, "/app/bdsh"); 1043 rc = getterm(&term->wait, vc, command); 1044 if (rc != EOK) 1045 goto error; 1046 1047 term->wfid = fibril_create(terminal_wait_fibril, term); 1048 if (term->wfid == 0) 1049 goto error; 1050 1051 fibril_add_ready(term->wfid); 1016 1052 1017 1053 term->is_focused = true; … … 1027 1063 return EOK; 1028 1064 error: 1065 if (term->dsid != 0) 1066 loc_service_unregister(term->srv, term->dsid); 1067 if (term->srv != NULL) 1068 loc_server_unregister(term->srv); 1029 1069 if (term->window != NULL) 1030 1070 ui_window_destroy(term->window); … … 1039 1079 } 1040 1080 1081 static errno_t terminal_wait_fibril(void *arg) 1082 { 1083 terminal_t *term = (terminal_t *)arg; 1084 task_exit_t texit; 1085 int retval; 1086 1087 /* 1088 * XXX There is no way to break the sleep if the task does not 1089 * exit. 1090 */ 1091 (void) task_wait(&term->wait, &texit, &retval); 1092 ui_quit(term->ui); 1093 return EOK; 1094 } 1095 1041 1096 /** @} 1042 1097 */
Note:
See TracChangeset
for help on using the changeset viewer.