static int edit_dialog_event (Gpm_Event * event, void *data) { WDialog *h = DIALOG (data); Widget *w; Widget *wh = WIDGET (h); int ret = MOU_UNHANDLED; w = WIDGET (find_menubar (h)); if (event->y == wh->y + 1 && (event->type & GPM_DOWN) != 0 && !MENUBAR (w)->is_active) { /* menubar */ GList *l; GList *top = NULL; int x; /* Try find top fullscreen window */ for (l = h->widgets; l != NULL; l = g_list_next (l)) if (edit_widget_is_editor (WIDGET (l->data)) && ((WEdit *) l->data)->fullscreen) top = l; /* Handle fullscreen/close buttons in the top line */ x = wh->x + wh->cols + 1 - 6; if (top != NULL && event->x >= x) { WEdit *e; e = (WEdit *) top->data; x = event->x - x; if (top != h->current) { /* Window is not active. Activate it */ dlg_set_top_widget (e); } /* Handle buttons */ if (x <= 2) edit_toggle_fullscreen (e); else send_message (h, NULL, MSG_ACTION, CK_Close, NULL); ret = MOU_NORMAL; } if (ret == MOU_UNHANDLED) dlg_select_widget (w); } return ret; }
static int edit_dialog_event (Gpm_Event * event, void *data) { Dlg_head *h = (Dlg_head *) data; Widget *w; int ret = MOU_UNHANDLED; w = (Widget *) find_menubar (h); if (event->y == h->y + 1 && (event->type & GPM_DOWN) != 0 && !((WMenuBar *) w)->is_active) { /* menubar */ GList *l; GList *top = NULL; int x; /* Try find top fullscreen window */ for (l = h->widgets; l != NULL; l = g_list_next (l)) if (edit_widget_is_editor ((Widget *) l->data) && ((WEdit *) l->data)->fullscreen) top = l; /* Handle fullscreen/close buttons in the top line */ x = h->x + h->cols + 1 - 6; if (top != NULL && event->x >= x) { WEdit *e; e = (WEdit *) top->data; x = event->x - x; if (top != h->current) { /* Window is not active. Activate it */ dlg_set_top_widget (e); } /* Handle buttons */ if (x <= 2) edit_toggle_fullscreen (e); else edit_dialog_callback (h, NULL, DLG_ACTION, CK_Close, NULL); ret = MOU_NORMAL; } if (ret == MOU_UNHANDLED) dlg_select_widget (w); } return ret; }
static void edit_window_list (const Dlg_head * h) { const size_t offset = 2; /* skip menu and buttonbar */ const size_t dlg_num = g_list_length (h->widgets) - offset; int lines, cols; Listbox *listbox; GList *w; int i = 0; int rv; lines = min ((size_t) (LINES * 2 / 3), dlg_num); cols = COLS * 2 / 3; listbox = create_listbox_window (lines, cols, _("Open files"), "[Open files]"); for (w = h->widgets; w != NULL; w = g_list_next (w)) if (edit_widget_is_editor ((Widget *) w->data)) { WEdit *e = (WEdit *) w->data; char *fname; if (e->filename_vpath == NULL) fname = g_strdup_printf ("%c [%s]", e->modified ? '*' : ' ', _("NoName")); else { char *fname2; fname2 = vfs_path_to_str (e->filename_vpath); fname = g_strdup_printf ("%c%s", e->modified ? '*' : ' ', fname2); g_free (fname2); } listbox_add_item (listbox->list, LISTBOX_APPEND_AT_END, get_hotkey (i++), str_term_trim (fname, listbox->list->widget.cols - 2), NULL); g_free (fname); } rv = g_list_position (h->widgets, h->current) - offset; listbox_select_entry (listbox->list, rv); rv = run_listbox (listbox); if (rv >= 0) { w = g_list_nth (h->widgets, rv + offset); dlg_set_top_widget (w->data); } }
static cb_ret_t edit_dialog_command_execute (WDialog * h, long command) { Widget *wh = WIDGET (h); gboolean ret = MSG_HANDLED; switch (command) { case CK_EditNew: edit_add_window (h, wh->y + 1, wh->x, wh->lines - 2, wh->cols, NULL, 0); break; case CK_EditFile: edit_load_cmd (h); break; case CK_EditSyntaxFile: edit_load_syntax_file (h); break; case CK_EditUserMenu: edit_load_menu_file (h); break; case CK_Close: /* if there are no opened files anymore, close MC editor */ if (edit_widget_is_editor (WIDGET (h->current->data)) && edit_close_cmd ((WEdit *) h->current->data) && find_editor (h) == NULL) dlg_stop (h); break; case CK_Help: edit_help (); /* edit->force |= REDRAW_COMPLETELY; */ break; case CK_Menu: edit_menu_cmd (h); break; case CK_Quit: case CK_Cancel: { Widget *w = WIDGET (h->current->data); if (!edit_widget_is_editor (w) || ((WEdit *) w)->drag_state == MCEDIT_DRAG_NORMAL) dlg_stop (h); else edit_restore_size ((WEdit *) w); } break; case CK_About: edit_about (); break; case CK_SyntaxOnOff: edit_syntax_onoff_cmd (h); break; case CK_ShowTabTws: edit_show_tabs_tws_cmd (h); break; case CK_ShowMargin: edit_show_margin_cmd (h); break; case CK_ShowNumbers: edit_show_numbers_cmd (h); break; case CK_Refresh: edit_refresh_cmd (); break; case CK_Shell: view_other_cmd (); break; case CK_LearnKeys: learn_keys (); break; case CK_WindowMove: case CK_WindowResize: if (edit_widget_is_editor (WIDGET (h->current->data))) edit_handle_move_resize ((WEdit *) h->current->data, command); break; case CK_WindowList: edit_window_list (h); break; case CK_WindowNext: dlg_one_down (h); dlg_set_top_widget (h->current->data); break; case CK_WindowPrev: dlg_one_up (h); dlg_set_top_widget (h->current->data); break; case CK_Options: edit_options_dialog (h); break; case CK_OptionsSaveMode: edit_save_mode_cmd (); break; case CK_SaveSetup: save_setup_cmd (); break; default: ret = MSG_NOT_HANDLED; break; } return ret; }
static int edit_event (Gpm_Event * event, void *data) { WEdit *edit = (WEdit *) data; Widget *w = WIDGET (data); Gpm_Event local; if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; local = mouse_get_local (event, w); /* Unknown event type */ if ((event->type & (GPM_DOWN | GPM_DRAG | GPM_UP)) == 0) return MOU_NORMAL; dlg_set_top_widget (w); edit_update_curs_row (edit); edit_update_curs_col (edit); if (edit->fullscreen || (local.buttons & GPM_B_LEFT) == 0 || (local.type & GPM_UP) != 0) edit->drag_state = MCEDIT_DRAG_NORMAL; else if (local.y == 1 && edit->drag_state != MCEDIT_DRAG_RESIZE) { /* click on the top line (move) */ int dx = edit->fullscreen ? 0 : 2; if (local.x == w->cols - dx - 1) { send_message (w->owner, NULL, MSG_ACTION, CK_Close, NULL); return MOU_NORMAL; } if (local.x == w->cols - dx - 4) { edit_toggle_fullscreen (edit); return MOU_NORMAL; } if ((local.type & (GPM_DOWN | GPM_DRAG)) != 0) { /* move if not fullscreen */ edit->drag_state_start = local.x; edit->drag_state = MCEDIT_DRAG_MOVE; edit->force |= REDRAW_COMPLETELY; edit_update_screen (edit); } } else if (!edit->fullscreen && local.y == w->lines && local.x == w->cols) { /* click on bottom-right corner (resize) */ if ((local.type & (GPM_DOWN | GPM_DRAG)) != 0) { edit->drag_state = MCEDIT_DRAG_RESIZE; edit->force |= REDRAW_COMPLETELY; edit_update_screen (edit); } } if (edit->drag_state == MCEDIT_DRAG_NORMAL) { gboolean done = TRUE; /* Double click */ if ((local.type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE)) { edit_mark_current_word_cmd (edit); goto update; } #if 0 /* Triple click */ if ((local.type & (GPM_TRIPLE | GPM_UP)) == (GPM_UP | GPM_TRIPLE)) { edit_mark_current_line_cmd (edit); goto update; } #endif /* Wheel events */ if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0) { edit_move_up (edit, 2, 1); goto update; } if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0) { edit_move_down (edit, 2, 1); goto update; } /* continue handle current event */ goto cont; /* handle DRAG mouse event, don't use standard way to continue * event handling outside of widget */ do { int c; c = tty_get_event (event, FALSE, TRUE); if (c == EV_NONE || c != EV_MOUSE) break; local = mouse_get_local (event, w); cont: /* A lone up mustn't do anything */ if (edit->mark2 != -1 && (local.type & (GPM_UP | GPM_DRAG)) != 0) return MOU_NORMAL; if ((local.type & (GPM_DOWN | GPM_UP)) != 0) edit_push_key_press (edit); if (!edit->fullscreen) local.x--; if (!option_cursor_beyond_eol) edit->prev_col = local.x - edit->start_col - option_line_state_width - 1; else { long line_len; line_len = edit_move_forward3 (edit, edit_buffer_get_current_bol (&edit->buffer), 0, edit_buffer_get_current_eol (&edit->buffer)); if (local.x > line_len) { edit->over_col = local.x - line_len - edit->start_col - option_line_state_width - 1; edit->prev_col = line_len; } else { edit->over_col = 0; edit->prev_col = local.x - option_line_state_width - edit->start_col - 1; } } if (!edit->fullscreen) local.y--; if (local.y > (edit->curs_row + 1)) edit_move_down (edit, local.y - (edit->curs_row + 1), 0); else if (local.y < (edit->curs_row + 1)) edit_move_up (edit, (edit->curs_row + 1) - local.y, 0); else edit_move_to_prev_col (edit, edit_buffer_get_current_bol (&edit->buffer)); if ((local.type & GPM_DOWN) != 0) { edit_mark_cmd (edit, TRUE); /* reset */ edit->highlight = 0; } done = (local.type & GPM_DRAG) == 0; if (done) edit_mark_cmd (edit, FALSE); update: edit_find_bracket (edit); edit->force |= REDRAW_COMPLETELY; edit_update_curs_row (edit); edit_update_curs_col (edit); edit_update_screen (edit); } while (!edit->fullscreen && !done); } else while (edit->drag_state != MCEDIT_DRAG_NORMAL) { int c; int y; c = tty_get_event (event, FALSE, TRUE); y = event->y - 1; if (c == EV_NONE || c != EV_MOUSE) { /* redraw frame */ edit->drag_state = MCEDIT_DRAG_NORMAL; edit->force |= REDRAW_COMPLETELY; edit_update_screen (edit); } else if (y == w->y && (event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_DOUBLE | GPM_UP)) { /* double click on top line (toggle fullscreen) */ edit_toggle_fullscreen (edit); edit->drag_state = MCEDIT_DRAG_NORMAL; edit->force |= REDRAW_COMPLETELY; edit_update_screen (edit); } else if ((event->type & (GPM_DRAG | GPM_DOWN)) == 0) { /* redraw frame */ edit->drag_state = MCEDIT_DRAG_NORMAL; edit->force |= REDRAW_COMPLETELY; edit_update_screen (edit); } else if (!edit->fullscreen) { Widget *h = WIDGET (w->owner); if (edit->drag_state == MCEDIT_DRAG_MOVE) { int x = event->x - 1; y = max (y, h->y + 1); /* status line */ y = min (y, h->y + h->lines - 2); /* buttonbar */ x = max (x, h->x); x = min (x, h->x + h->cols - 1); /* don't use widget_set_size() here to avoid double draw */ w->y = y; w->x = x - edit->drag_state_start; edit->force |= REDRAW_COMPLETELY; } else if (edit->drag_state == MCEDIT_DRAG_RESIZE) { event->y = min (event->y, h->y + h->lines - 1); /* buttonbar */ event->x = min (event->x, h->x + h->cols); local = mouse_get_local (event, w); /* don't use widget_set_size() here to avoid double draw */ w->lines = max (WINDOW_MIN_LINES, local.y); w->cols = max (WINDOW_MIN_COLS, local.x); edit->force |= REDRAW_COMPLETELY; } dlg_redraw (w->owner); } } return MOU_NORMAL; }