static gboolean button_pressed(int x, int y) { if (menu_on && menubg && x < menubg->w && y < menubg->h) { if (handle_menu(x, y)) refresh_window(); return TRUE; } if (menuicon && x < menuicon->w && y < menuicon->h) { menu_on = TRUE; refresh_window(); return TRUE; } int t = find_box(x, y); if (t < 0) return FALSE; int tatami = point_click_areas[t].tatami; last_wins[tatami-1].cat = match_list[tatami-1][0].category; last_wins[tatami-1].num = match_list[tatami-1][0].number; refresh_window(); return TRUE; }
static void flip_pixel(int x, int y, chip_8_cpu cpu) { int scr_height, scr_width; getmaxyx(stdscr, scr_height, scr_width); int max_height = (default_window_height < scr_height) ? default_window_height : scr_height; int max_width = (default_window_width < scr_width) ? default_window_width : scr_width; int draw_x = x + 1; int draw_y = y + 1; while (draw_x >= max_width) { draw_x -= max_width; } if (draw_x == 0) { draw_x = 1; } if (draw_x == max_width) { draw_x = max_width - 1; } // https://www.mkssoftware.com/docs/man3/curs_inch.3.asp chtype char_info = mvwinch(cpu->chip_8_screen, draw_y, draw_x); char char_at = char_info & A_CHARTEXT; char new_pixel = (char_at == ACTIVE_PIXEL) ? INACTIVE_PIXEL : ACTIVE_PIXEL; mvwaddch(cpu->chip_8_screen, draw_y, draw_x, new_pixel); set_vf_if(char_at == ACTIVE_PIXEL, cpu); refresh_window(cpu->chip_8_screen); }
static WINDOW *init_ncurses(int height, int width) { initscr(); curs_set(0); cbreak(); WINDOW *window = create_window(height, width); refresh_window(window); return window; }
void EMSCRIPTEN_KEEPALIVE main_loop(void) { time_t now = time(NULL); static time_t graph_update; char url[64]; static int tatami = 1; static time_t forced_update; #if 1 SDL_Event event; while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_MOUSEBUTTONDOWN: { SDL_MouseButtonEvent *m = (SDL_MouseButtonEvent*)&event; //printf("button down: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); button_pressed(m->x, m->y); break; } } } if (now > next_update || now > forced_update + 3 || icontimer == 1) { refresh_window(); forced_update = now; } timeout_ask_for_data(NULL); if (now > graph_update+2) { graph_update = now; emscripten_async_wget_data("matchinfo?t=0", NULL, onloadabstract, onerror); } mouse_move(); if (icontimer > 0) { icontimer--; } SDL_Rect dest; dest.x = dest.y = dest.w = dest.h = 0; //dest.y = icontimer - 50; //if (dest.y > 0) dest.y = 0; if (menuicon && icontimer > 2) { SDL_BlitSurface(menuicon, NULL, darea, &dest); } if (menu_on && menubg) { icontimer = 50; show_menu(); } #endif }
void execute_loop(chip_8_cpu cpu, FILE *debug_log) { if (pthread_create(&(cpu->delay_decrement_thread), NULL, delay_thread, cpu) != 0) { shutdown_cpu(cpu, 1); } if (pthread_create(&(cpu->sound_decrement_thread), NULL, sound_thread, cpu) != 0) { fprintf(stderr, "Failed to start the sound register thread, exiting...\n"); shutdown_cpu(cpu, 1); } pthread_detach(cpu->delay_decrement_thread); pthread_detach(cpu->sound_decrement_thread); cpu->chip_8_screen = init_ncurses(default_window_height, default_window_width); refresh_window(cpu->chip_8_screen); while (1) { if (cpu->program_counter >= MEMORY_SIZE) { fprintf(stderr, "ERR - Fatal memory error: invalid access at memory cell: '%d'\n", cpu->program_counter); shutdown_cpu(cpu, 1); } if (cpu->halt) { break; } opcode instr = fetch_opcode(cpu); if (debug_log) { print_debug_info(debug_log, instr, cpu); } execute_opcode(instr, cpu); if (cpu->performed_jump) { cpu->performed_jump = false; continue; } if (cpu->skip_opcode) { cpu->program_counter = cpu->program_counter + 2; cpu->skip_opcode = false; } else { cpu->program_counter = cpu->program_counter + 1; } } // allow 0.1 seconds for the threads to clean up their memory usleep(100000); delwin(cpu->chip_8_screen); endwin(); }
void ui_stat_update(view_t *view, int lazy_redraw) { if(!cfg.display_statusline || view != curr_view) { return; } /* Don't redraw anything until :restart command is finished. */ if(curr_stats.restart_in_progress) { return; } ui_stat_job_bar_check_for_updates(); if(cfg.status_line[0] == '\0') { update_stat_window_old(view, lazy_redraw); return; } const int width = getmaxx(stdscr); wresize(stat_win, 1, width); ui_set_bg(stat_win, &cfg.cs.color[STATUS_LINE_COLOR], cfg.cs.pair[STATUS_LINE_COLOR]); werase(stat_win); checked_wmove(stat_win, 0, 0); cchar_t default_attr; setcchar(&default_attr, L" ", cfg.cs.color[STATUS_LINE_COLOR].attr, cfg.cs.pair[STATUS_LINE_COLOR], NULL); LineWithAttrs result = expand_status_line_macros(view, cfg.status_line); assert(strlen(result.attrs) == utf8_strsw(result.line) && "Broken attrs!"); result.line = break_in_two(result.line, width, "%="); result.attrs = break_in_two(result.attrs, width, "="); print_with_attrs(stat_win, result.line, result.attrs, &default_attr); free(result.line); free(result.attrs); refresh_window(stat_win, lazy_redraw); }
std::list<std::pair<int, int>> inventory_drop_selector::execute() { prepare_columns( true ); int count = 0; while( true ) { refresh_window(); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); auto entry = find_entry_by_invlet( ch ); if( ch >= '0' && ch <= '9' ) { count = std::min( count, INT_MAX / 10 - 10 ); count *= 10; count += ch - '0'; } else if( entry != nullptr ) { set_drop_count( *entry, count ); count = 0; } else if( action == "RIGHT" ) { for( const auto &entry : get_active_column().get_all_selected() ) { set_drop_count( *entry, count ); } count = 0; } else if( action == "CONFIRM" ) { break; } else if( action == "QUIT" ) { return std::list<std::pair<int, int> >(); } else { on_action( action ); count = 0; } } std::list<std::pair<int, int>> dropped_pos_and_qty; for( auto drop_pair : dropping ) { dropped_pos_and_qty.push_back( std::make_pair( u.get_item_position( drop_pair.first ), drop_pair.second ) ); } return dropped_pos_and_qty; }
void read_offline_support(void) { int c,selected=0; if (current_group<0) { /* no group selected, get all */ read_all_groups(); if (windows[1].id>0) { refresh_clear_window( windows[1].id ); } return; } if (maximum_overview>=0) { for (c=0;c<maximum_overview+1;c++) { if (overview[c].viewed==SELECT_RET) { selected++; } } } if (selected) { /* get selected articles */ read_selected_selected_group( current_group ); } else { /* get all articles */ read_all_selected_group( current_group ); } if (windows[1].id>0) { refresh_window( windows[1].id ); } }
item_location &inventory_pick_selector::execute() { prepare_columns( false ); while( true ) { refresh_window(); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); const auto entry = find_entry_by_invlet( ch ); if( entry != nullptr ) { return entry->get_location(); } else if( action == "QUIT" ) { return *null_location; } else if( action == "RIGHT" || action == "CONFIRM" ) { return get_active_column().get_selected().get_location(); } else { on_action( action ); } } }
std::pair<const item *, const item *> inventory_compare_selector::execute() { prepare_columns( true ); while(true) { refresh_window(); const std::string action = ctxt.handle_input(); const long ch = ctxt.get_raw_input().get_first_input(); const auto entry = find_entry_by_invlet( ch ); if( entry != nullptr ) { toggle_entry( entry ); } else if(action == "RIGHT") { const auto selection( get_active_column().get_all_selected() ); for( auto &entry : selection ) { if( entry->chosen_count == 0 || selection.size() == 1 ) { toggle_entry( entry ); if( compared.size() == 2 ) { break; } } } } else if( action == "QUIT" ) { return std::make_pair( nullptr, nullptr ); } else { on_action( action ); } if( compared.size() == 2 ) { const auto res = std::make_pair( &compared.back()->get_item(), &compared.front()->get_item() ); toggle_entry( compared.back() ); return res; } } }
/* Formats status line in the "old way" (before introduction of 'statusline' * option). */ static void update_stat_window_old(view_t *view, int lazy_redraw) { const dir_entry_t *const curr = get_current_entry(view); char name_buf[160*2 + 1]; char perm_buf[26]; char size_buf[64]; char id_buf[52]; int x; int cur_x; size_t print_width; char *filename; if(curr == NULL || fentry_is_fake(curr)) { werase(stat_win); refresh_window(stat_win, lazy_redraw); return; } x = getmaxx(stdscr); wresize(stat_win, 1, x); ui_set_bg(stat_win, &cfg.cs.color[STATUS_LINE_COLOR], cfg.cs.pair[STATUS_LINE_COLOR]); filename = get_current_file_name(view); print_width = utf8_strsnlen(filename, 20 + MAX(0, x - 83)); copy_str(name_buf, MIN(sizeof(name_buf), print_width + 1), filename); friendly_size_notation(fentry_get_size(view, curr), sizeof(size_buf), size_buf); get_uid_string(curr, 0, sizeof(id_buf), id_buf); if(id_buf[0] != '\0') strcat(id_buf, ":"); get_gid_string(curr, 0, sizeof(id_buf) - strlen(id_buf), id_buf + strlen(id_buf)); #ifndef _WIN32 get_perm_string(perm_buf, sizeof(perm_buf), curr->mode); #else copy_str(perm_buf, sizeof(perm_buf), attr_str_long(curr->attrs)); #endif werase(stat_win); cur_x = 2; checked_wmove(stat_win, 0, cur_x); wprint(stat_win, name_buf); cur_x += 22; if(x > 83) cur_x += x - 83; mvwaddstr(stat_win, 0, cur_x, size_buf); cur_x += 12; mvwaddstr(stat_win, 0, cur_x, perm_buf); cur_x += 11; snprintf(name_buf, sizeof(name_buf), "%d %s filtered", view->filtered, (view->filtered == 1) ? "file" : "files"); if(view->filtered > 0) mvwaddstr(stat_win, 0, x - (strlen(name_buf) + 2), name_buf); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) break_at(id_buf, ':'); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) id_buf[0] = '\0'; mvwaddstr(stat_win, 0, cur_x, id_buf); refresh_window(stat_win, lazy_redraw); }
void Csierpinski_2DView::stop_animation( ){ animation.turn_off( ); theApp.OnAppAbout( ); animation.turn_on( ); refresh_window( ); }
int main(int argc, char *argv[]) { struct arguments arguments; signal(SIGINT, finish); arguments.verbose = 0; arguments.nopy = 0; arguments.files = NULL; arguments.num_files = 0; argp_parse(&argp, argc, argv, 0, 0, &arguments); vx_py_init_python(arguments.num_files, argc, argv); init_curses(); getmaxyx(stdscr, row, col); vx_py_load_start(); clear(); refresh(); get_cursor_rowcol(focused_window->buffer->text, &screen_rows, &screen_cols); vx_py_update_vars(); vx_py_pump(); wmove(focused_window->curses_window, 0, 0); refresh_window(focused_window); clock_t last_tick = clock(); float update_every = .25; while (lets_edit) { if (lets_suspend) { endwin(); raise(SIGSTOP); lets_suspend = 0; refresh(); clear(); nonl(); raw(); noecho(); getmaxyx(stdscr, row, col); vx_py_update_vars(); vx_py_register_resize(); continue; } float delay = update_every - ((float)(clock() - last_tick))/CLOCKS_PER_SEC; timeout(delay*1000); int c = getch(); size_t bytes; int utf8q = 1; /* Handle resize */ if (c == KEY_RESIZE) { endwin(); refresh(); clear(); getmaxyx(stdscr, row, col); vx_py_update_vars(); vx_py_register_resize(); continue; } /* Handle escape and alt */ if (c != ERR) { if (c == '\033') { nodelay(stdscr, 1); c = getch(); if (c == ERR) { // got an escape c = '\033'; } else { // got an alt+key c |= 0x80; utf8q = 0; } nodelay(stdscr, 0); } /* handle utf8 */ bytes = more_bytes_utf8[c]; if (utf8q && bytes > 0) { int i; char *c_utf8 = calloc(1, bytes + 2); c_utf8[0] = c; nodelay(stdscr, 1); for (i = 0; i < bytes; ++i) { c = getch(); c_utf8[i+1] = c; } vx_py_handle_key_utf8(c_utf8); nodelay(stdscr, 0); free(c_utf8); } else { vx_py_handle_key(c); } } get_cursor_rowcol(focused_window->buffer->text, &screen_rows, &screen_cols); while (screen_rows+1 < focused_window->line && focused_window->line > 1) --focused_window->line; while (screen_rows+1 > focused_window->line + focused_window->lines - 1) ++focused_window->line; while (screen_cols < focused_window->column && focused_window->column > 1) --focused_window->column; while (screen_cols > focused_window->column + focused_window->columns - 4) ++focused_window->column; vx_py_update_vars(); vx_py_pump(); wmove(focused_window->curses_window, screen_rows - (focused_window->line - 1), screen_cols - (focused_window->column - 1)); refresh_window(focused_window); last_tick = clock(); } vx_py_deinit_python(); finish(0); }
static void refresh_graph(void) { //printf("graph update timeout\n"); refresh_window(); }
static void input_autocomplete(void) { int dx = 0, prefix_pos = pos; char *p; /* find a usable prefix */ if (prefix_pos && prefix_pos <= len) { prefix_pos = prev_pos(input_buffer, prefix_pos, encoding); dx--; while (prefix_pos && ne_isword(get_char(&input_buffer[prefix_pos], encoding), encoding)) { dx--; prefix_pos = prev_pos(input_buffer, prefix_pos, encoding); } if (! ne_isword(get_char(&input_buffer[prefix_pos], encoding), encoding)) { dx++; prefix_pos = next_pos(input_buffer, prefix_pos, encoding); } p = malloc(pos - prefix_pos + 1); if (!p) { alert(); /* OUT_OF_MEMORY */ return; } strncpy(p, &input_buffer[prefix_pos], pos - prefix_pos); } else p = malloc(1); /* no prefix left of the cursor; we'll give an empty one. */ p[pos - prefix_pos] = 0; int ac_err; if (p = autocomplete(p, NULL, true, &ac_err)) { encoding_type ac_encoding = detect_encoding(p, strlen(p)); if (ac_encoding != ENC_ASCII && encoding != ENC_ASCII && ac_encoding != encoding) { free(p); alert(); } else { encoding = ac_encoding; if (prefix_pos < pos) { memmove(&input_buffer[prefix_pos], &input_buffer[pos], len - pos + 1); len -= pos - prefix_pos; pos = prefix_pos; } int ac_len = strlen(p); if (ac_len + len >= MAX_INPUT_LINE_LEN) ac_len = MAX_INPUT_LINE_LEN - len; memmove(&input_buffer[pos + ac_len], &input_buffer[pos], len - pos + 1); memmove(&input_buffer[pos], p, ac_len); len += ac_len; while (ac_len > 0) { const int cw = get_char_width(&input_buffer[pos],encoding); pos = next_pos(input_buffer, pos, encoding); ac_len -= cw; dx++; } free(p); x += dx; if (x >= ne_columns) { dx = x - ne_columns + 1; while (dx--) { offset = next_pos(input_buffer, offset, encoding); } x = ne_columns - 1; } } } if (ac_err == AUTOCOMPLETE_COMPLETED || ac_err == AUTOCOMPLETE_CANCELLED) { do_action(cur_buffer, REFRESH_A, 0, NULL); refresh_window(cur_buffer); set_attr(0); print_prompt(NULL); } input_refresh(); }
LRESULT CALLBACK stream_WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT rect ; int cxClient, cyClient; static HMENU hMenu ; POINT point ; int ret, idx; TCHAR buf[64]; char file_name[MAX_FILE_PATH_LEN]; static int edit_iItem=-1 ; static int edit_iSubItem; LVITEM lv_item; switch (message) { case WM_CREATE: hwnd_stream= hwnd; hMenu = LoadMenu (g_hInstance, TEXT("my_popup_menu")) ; hMenu = GetSubMenu (hMenu, 0) ; hwnd_dynamic_edit=CreateWindow (TEXT("edit"), TEXT(""), WS_CHILD|ES_AUTOHSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)ID_DYNAMIC_EDIT, g_hInstance, NULL) ; SendMessage(hwnd_dynamic_edit, WM_SETFONT, (WPARAM)char_font_2, 0); hwnd_lv = CreateListView(hwnd); //InitListViewImageLists(hwnd_lv); InitListViewColumns(hwnd_lv); lv_row_color_init(); old_lv_proc = (WNDPROC) SetWindowLong (hwnd_lv, GWL_WNDPROC, (LONG)my_lv_proc) ; ShowWindow(hwnd_lv, 1) ; refresh_window(hwnd_lv) ; add_tip(hwndTip, hwnd_lv, TEXT("点击鼠标右键进行操作")); return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; MoveWindow(hwnd_lv, 0, 0, cxClient, cyClient, TRUE) ; return 0 ; case WM_NOTIFY: { NMHDR *pt_nmhdr=(void *)lParam; switch(LOWORD(wParam)) { case ID_LV: // if code == NM_CLICK - Single click on an item if(pt_nmhdr->code == NM_CLICK || pt_nmhdr->code == NM_DBLCLK) { int iItem = ((LPNMITEMACTIVATE)lParam)->iItem; int iSubItem=((LPNMITEMACTIVATE)lParam)->iSubItem; if (iItem>=0 && ((iSubItem>=3 && iSubItem<=5) || iSubItem==7)) { ListView_GetSubItemRect(hwnd_lv,iItem,iSubItem,LVIR_LABEL,&rect); ListView_GetItemText(hwnd_lv, iItem, iSubItem, buf, sizeof(buf)); MoveWindow (hwnd_dynamic_edit ,rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE); SetWindowText(hwnd_dynamic_edit, buf); ShowWindow (hwnd_dynamic_edit, 1) ; SetFocus(hwnd_dynamic_edit); SendMessage(hwnd_dynamic_edit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); edit_iItem = iItem; edit_iSubItem = iSubItem; } return 0; } else if (pt_nmhdr->code == NM_RCLICK) { point = ((LPNMITEMACTIVATE)lParam)->ptAction; ListView_GetItem(hwnd_lv, &lv_item); ClientToScreen (hwnd_lv, &point) ; TrackPopupMenu (hMenu, TPM_LEFTBUTTON, point.x, point.y, 0, hwnd_stream, NULL) ; return 0; } else if (pt_nmhdr->code == LVN_ITEMCHANGED) { if (!init_over) break; if (lv_in_op) break; //if((((LPNMLISTVIEW)lParam)->uOldState&LVIS_STATEIMAGEMASK) != // (((LPNMLISTVIEW)lParam)->uNewState&LVIS_STATEIMAGEMASK)) { int iItem = ((LPNMITEMACTIVATE)lParam)->iItem; int selected = ListView_GetCheckState(hwnd_lv, iItem); if (g_apt_streams[iItem]->selected!=selected) { doc_modified=1; g_apt_streams[iItem]->selected=selected; update_statusbar(); } } return 0; } break; } break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_STREAM_NEW: init_stream(>_edit_stream); gt_edit_stream.len=gat_sample_pkts[0].len; memcpy(gt_edit_stream.data, gat_sample_pkts[0].pkt_data, gt_edit_stream.len); ret=DialogBox(g_hInstance, TEXT("STREAM_EDIT_DLG"), hwnd, StreamEditDlgProc); if (IDOK==ret) { add_stream(>_edit_stream); re_populate_items(); } return 0 ; case IDM_STREAM_NEW_HEX: { int len; char buf[MAX_PACKET_LEN]; if (get_open_file_name(file_name, hwnd, ALL_FILE_FILTER)) return 0; len = read_file_to_buf(buf, sizeof(buf)-1, file_name); if (len>0) add_stream_from_hex_text(buf, len); else err_msg_box("读取文件内容失败"); return 0 ; } case IDM_STREAM_NEW_BIN: { int len; char buf[MAX_PACKET_LEN]; if (get_open_file_name(file_name, hwnd, ALL_FILE_FILTER)) return 0; len = read_file_to_buf(buf, sizeof(buf)-1, file_name); if (len>0) add_stream_from_raw_data(buf, len); else err_msg_box("读取文件内容失败"); return 0 ; } case IDM_STREAM_NEW_PCAP: { if (get_open_file_name(file_name, hwnd, PCAP_FILE_FILTER)) return 0; add_stream_from_pcap(file_name); return 0 ; } case IDM_STREAM_DEL: idx=GetIndex(hwnd_lv); //ListView_DeleteItem(hwnd_lv, idx); delete_stream(idx); re_populate_items(); update_statusbar(); return 0 ; case IDM_STREAM_EDIT: cur_strm_idx=GetIndex(hwnd_lv); if (cur_strm_idx<0) return 0; cpy_stream(>_edit_stream, g_apt_streams[cur_strm_idx]); ret=DialogBox(g_hInstance, TEXT("STREAM_EDIT_DLG"), hwnd, StreamEditDlgProc); if (IDOK==ret) { doc_modified=1; cpy_stream(g_apt_streams[cur_strm_idx], >_edit_stream); re_populate_items(); } //ListView_DeleteAllItems(hwnd_lv); return 0 ; case IDM_STREAM_DEL_SEL: //DelSel(hwnd_lv); delete_sel_stream(); re_populate_items(); update_statusbar(); return 0 ; case IDM_STREAM_SEL_ALL: SelAll(hwnd_lv); return 0 ; case IDM_STREAM_SEL_RVS: SelRvs(hwnd_lv); return 0 ; case IDM_STREAM_COPY: copy_idx = GetIndex(hwnd_lv); return 0 ; case IDM_STREAM_PASTE: cpy_stream(>_edit_stream, g_apt_streams[copy_idx]); add_stream(>_edit_stream); re_populate_items(); return 0 ; case IDM_STREAM_MAKE_FRAGS: { ret=DialogBox(g_hInstance, TEXT("FRAG_DLG"), hwnd, FragDlgProc); return 0 ; } case IDM_STREAM_SEL2PCAP: { ret=get_save_file_name(file_name, hwnd, PCAP_FILE_FILTER, PCAP_FILE_SUFFIX); if (ret) return 0 ; stream2dump(file_name); update_pcap_file_history(file_name); return 0 ; } case IDM_STREAM_2_BIN: { ret=get_save_file_name(file_name, hwnd, BIN_FILE_FILTER, BIN_FILE_SUFFIX); if (ret) return 0 ; stream_2_bin(file_name); return 0 ; } case IDM_STREAM_2_TEXT: { ret=get_save_file_name(file_name, hwnd, TEXT_FILE_FILTER, TEXT_FILE_SUFFIX); if (ret) return 0 ; stream_2_text(file_name); return 0 ; } case ID_DYNAMIC_EDIT: if (HIWORD(wParam)==EN_KILLFOCUS) { update_grid_from_edit(edit_iItem, edit_iSubItem); edit_iItem=-1; return 0 ; } } break; case WM_KEYDOWN: if (VK_RETURN==wParam) { SetFocus(hwnd); return 0; } break; case WM_INITMENUPOPUP: { int idx=GetIndex(hwnd_lv); t_stream *pt_stream = g_apt_streams[idx]; int sel_cnt=GetSelCnt(hwnd_lv); int item_cnt=ListView_GetItemCount(hwnd_lv); if (lParam == 0) { UINT add_stream_menu_state = nr_cur_stream<MAX_STREAM_NUM ? MF_ENABLED : MF_GRAYED; EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW, add_stream_menu_state); EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_HEX, add_stream_menu_state); EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_BIN, add_stream_menu_state); EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_PCAP, add_stream_menu_state); EnableMenuItem ((HMENU) wParam, IDM_STREAM_EDIT, idx>=0 ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_DEL, idx>=0 ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_COPY, idx>=0 ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_PASTE, copy_idx>=0 && item_cnt>copy_idx ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_DEL_SEL, sel_cnt ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL_ALL, item_cnt ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL_RVS, item_cnt ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_MAKE_FRAGS, idx>=0&&stream_fragable(pt_stream) ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL2PCAP, sel_cnt ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_2_BIN, idx>=0 ? MF_ENABLED : MF_GRAYED); EnableMenuItem ((HMENU) wParam, IDM_STREAM_2_TEXT, idx>=0 ? MF_ENABLED : MF_GRAYED); return 0; } break; } } return DefWindowProc (hwnd, message, wParam, lParam) ; }
int main(int argc, char **argv) { char *locale = setlocale(LC_ALL, ""); for(int i = 0; i < 256; i++) localised_up_case[i] = toupper(i); if (locale) { struct re_pattern_buffer re_pb; struct re_registers re_reg; memset(&re_pb, 0, sizeof re_pb); memset(&re_reg, 0, sizeof re_reg); re_pb.translate = localised_up_case; re_compile_pattern(LOCALE_REGEX, strlen(LOCALE_REGEX), &re_pb); if (re_search(&re_pb, locale, strlen(locale), 0, strlen(locale), &re_reg) >= 0) { if (re_reg.start[1] >= 0) io_utf8 = true; } free(re_reg.start); free(re_reg.end); } bool no_config = false; char *macro_name = NULL, *key_bindings_name = NULL, *menu_conf_name = NULL, *startup_prefs_name = DEF_PREFS_NAME; char * const skiplist = calloc(argc, 1); if (!skiplist) exit(1); /* We need this many flags. */ for(int i = 1; i < argc; i++) { if (argv[i][0] == '-' && (!strcmp(&argv[i][1], "h") || !strcmp(&argv[i][1], "-help" "\0" VERSION_STRING))) { puts(ARG_HELP); exit(0); } /* Special arguments start with two dashes. If we find one, we cancel its entry in argv[], so that it will be skipped when opening the specified files. The only exception is +N for skipping to the N-th line. */ if (argv[i][0] == '-' && argv[i][1] == '-') { if (!argv[i][2]) i++; /* You can use "--" to force the next token to be a filename */ else if (!strcmp(&argv[i][2], "noconfig") || !strcmp(&argv[i][2], "no-config")) { no_config = true; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "noansi") || !strcmp(&argv[i][2], "no-ansi")) { ansi = false; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "no-syntax")) { do_syntax = false; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "prefs")) { if (i < argc-1) { startup_prefs_name = argv[i+1]; skiplist[i] = skiplist[i+1] = 1; /* argv[i] = argv[i+1] = NULL; */ } } else if (!strcmp(&argv[i][2], "ansi")) { ansi = true; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "utf8")) { io_utf8 = true; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "no-utf8")) { io_utf8 = false; skiplist[i] = 1; /* argv[i] = NULL; */ } else if (!strcmp(&argv[i][2], "macro")) { if (i < argc-1) { macro_name = argv[i+1]; skiplist[i] = skiplist[i+1] = 1; /* argv[i] = argv[i+1] = NULL; */ } } else if (!strcmp(&argv[i][2], "keys")) { if (i < argc-1) { key_bindings_name = argv[i+1]; skiplist[i] = skiplist[i+1] = 1; /* argv[i] = argv[i+1] = NULL; */ } } else if (!strcmp(&argv[i][2], "menus")) { if (i < argc-1) { menu_conf_name = argv[i+1]; skiplist[i] = skiplist[i+1] = 1; /* argv[i] = argv[i+1] = NULL; */ } } } } #ifdef NE_TEST /* Dump the builtin menu and key bindings to compare to doc/default.menus and doc/default.keys. */ int dump_config(void); dump_config(); #endif /* Unless --noconfig was specified, we try to configure the menus and the keyboard. Note that these functions can exit() on error. */ if (!no_config) { get_menu_configuration(menu_conf_name); get_key_bindings(key_bindings_name); } /* If we cannot even create a buffer, better go... */ if (!new_buffer()) exit(1); /* Now that key_bindings are loaded, try to fix up the message for NOT_FOUND. */ { char *repeat_last_keystroke, *new_not_found; if ((repeat_last_keystroke = find_key_strokes(REPEATLAST_A, 1))) { if ((new_not_found = malloc(39+strlen(repeat_last_keystroke)))) { strcat(strcat(strcpy(new_not_found, "Not Found. (RepeatLast with "), repeat_last_keystroke), " to wrap.)"); error_msg[NOT_FOUND] = new_not_found; } free(repeat_last_keystroke); } } clear_buffer(cur_buffer); /* The INT_MAX clip always exists, and it is used by the Through command. */ clip_desc * const cd = alloc_clip_desc(INT_MAX, 0); if (!cd) exit(1); add_head(&clips, &cd->cd_node); /* General terminfo and cursor motion initalization. From here onwards, we cannot exit() lightly. */ term_init(); /* We will be always using the last line for the status bar. */ set_terminal_window(ne_lines-1); /* We read in all the key capabilities. */ read_key_capabilities(); /* Some initializations of other modules... */ re_set_syntax( RE_CONTEXT_INDEP_ANCHORS | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE | RE_NEWLINE_ALT | RE_NO_BK_PARENS | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES ); bool first_file = true; load_virtual_extensions(); load_auto_prefs(cur_buffer, startup_prefs_name); buffer *stdin_buffer = NULL; if (!isatty(fileno(stdin))) { first_file = false; const int error = load_fd_in_buffer(cur_buffer, fileno(stdin)); print_error(error); stdin_buffer = cur_buffer; if (!(freopen("/dev/tty", "r", stdin))) { fprintf(stderr, "Cannot reopen input tty\n"); abort(); } } /* The terminal is prepared for interactive I/O. */ set_interactive_mode(); clear_entire_screen(); /* This function sets fatal_code() as signal interrupt handler for all the dangerous signals (SIGILL, SIGSEGV etc.). */ set_fatal_code(); if (argc > 1) { /* The first file opened does not need a NEWDOC_A action. Note that file loading can be interrupted (wildcarding can sometimes produce unwanted results). */ uint64_t first_line = 0, first_col = 0; bool binary = false, skip_plus = false, read_only = false; stop = false; for(int i = 1; i < argc && !stop; i++) { if (argv[i] && !skiplist[i]) { if (argv[i][0] == '+' && !skip_plus) { /* looking for "+", or "+N" or "+N,M" */ uint64_t tmp_l = INT64_MAX, tmp_c = 0; char *d; errno = 0; if (argv[i][1]) { if (isdigit((unsigned char)argv[i][1])) { tmp_l = strtoll(argv[i]+1, &d, 10); if (!errno) { if (*d) { /* separator between N and M */ if (isdigit((unsigned char)d[1])) { tmp_c = strtoll(d+1, &d, 10); if (*d) errno = ERANGE; } else errno = ERANGE; } } } else errno = ERANGE; } if (!errno) { first_line = tmp_l; first_col = tmp_c; } else { skip_plus = true; i--; } } else if (!strcmp(argv[i], "--binary")) { binary = true; } else if (!strcmp(argv[i], "--read-only") || !strcmp(argv[i], "--readonly") || !strcmp(argv[i], "--ro")) { read_only = true; } else { if (!strcmp(argv[i], "-") && stdin_buffer) { stdin_buffer->opt.binary = binary; if (read_only) stdin_buffer->opt.read_only = read_only; if (first_line) do_action(stdin_buffer, GOTOLINE_A, first_line, NULL); if (first_col) do_action(stdin_buffer, GOTOCOLUMN_A, first_col, NULL); stdin_buffer = NULL; } else { if (!strcmp(argv[i], "--")) i++; if (!first_file) do_action(cur_buffer, NEWDOC_A, -1, NULL); else first_file = false; cur_buffer->opt.binary = binary; if (i < argc) do_action(cur_buffer, OPEN_A, 0, str_dup(argv[i])); if (first_line) do_action(cur_buffer, GOTOLINE_A, first_line, NULL); if (first_col) do_action(cur_buffer, GOTOCOLUMN_A, first_col, NULL); if (read_only) cur_buffer->opt.read_only = read_only; } first_line = first_col = 0; skip_plus = binary = read_only = false; } } } free(skiplist); /* This call makes current the first specified file. It is called only if more than one buffer exist. */ if (get_nth_buffer(1)) do_action(cur_buffer, NEXTDOC_A, -1, NULL); } /* We delay updates. In this way the macro activity does not cause display activity. */ reset_window(); delay_update(); if (macro_name) do_action(cur_buffer, MACRO_A, -1, str_dup(macro_name)); else if (first_file) { /* If there is no file to load, and no macro to execute, we display the "NO WARRANTY" message. */ about(); } while(true) { /* If we are displaying the "NO WARRANTY" info, we should not refresh the window now */ if (!displaying_info) { refresh_window(cur_buffer); if (cur_buffer->opt.automatch) automatch_bracket(cur_buffer, true); } draw_status_bar(); move_cursor(cur_buffer->cur_y, cur_buffer->cur_x); int c = get_key_code(); if (window_changed_size) { print_error(do_action(cur_buffer, REFRESH_A, 0, NULL)); window_changed_size = displaying_info = false; cur_buffer->automatch.shown = 0; } if (c == INVALID_CHAR) continue; /* Window resizing. */ const input_class ic = CHAR_CLASS(c); if (displaying_info) { refresh_window(cur_buffer); displaying_info = false; } if (cur_buffer->automatch.shown) automatch_bracket(cur_buffer, false); switch(ic) { case INVALID: print_error(INVALID_CHARACTER); break; case ALPHA: print_error(do_action(cur_buffer, INSERTCHAR_A, c, NULL)); break; case TAB: print_error(do_action(cur_buffer, INSERTTAB_A, 1, NULL)); break; case RETURN: print_error(do_action(cur_buffer, INSERTLINE_A, -1, NULL)); break; case COMMAND: if (c < 0) c = -c - 1; if (key_binding[c]) print_error(execute_command_line(cur_buffer, key_binding[c])); break; default: break; } } }