mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-03 18:14:25 +03:00
83e3945c24
Currently, dialog itself doesn't handle mouse events. It just resends mouse event to each its widget. If we can several overlapped widgets (especially, menu bar), there is some problem to decide which widget must get event at first. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
240 lines
8.3 KiB
C
240 lines
8.3 KiB
C
/*
|
|
Dialog box features module for the Midnight Commander
|
|
*/
|
|
|
|
/** \file dialog.h
|
|
* \brief Header: dialog box features module
|
|
*/
|
|
|
|
#ifndef MC__DIALOG_H
|
|
#define MC__DIALOG_H
|
|
|
|
#include <sys/types.h> /* size_t */
|
|
|
|
#include "lib/global.h"
|
|
#include "lib/hook.h" /* hook_t */
|
|
#include "lib/keybind.h" /* global_keymap_t */
|
|
#include "lib/tty/mouse.h" /* mouse_h */
|
|
|
|
/*** defined constants ***************************************************************************/
|
|
|
|
/* Common return values */
|
|
#define B_EXIT 0
|
|
#define B_CANCEL 1
|
|
#define B_ENTER 2
|
|
#define B_HELP 3
|
|
#define B_USER 100
|
|
|
|
#define dlg_move(h, _y, _x) tty_gotoyx (((Dlg_head *)(h))->y + _y, ((Dlg_head *)(h))->x + _x)
|
|
|
|
/*** enums ***************************************************************************************/
|
|
|
|
/* Dialog messages */
|
|
typedef enum
|
|
{
|
|
DLG_INIT = 0, /* Initialize dialog */
|
|
DLG_IDLE = 1, /* The idle state is active */
|
|
DLG_DRAW = 2, /* Draw dialog on screen */
|
|
DLG_FOCUS = 3, /* A widget has got focus */
|
|
DLG_UNFOCUS = 4, /* A widget has been unfocused */
|
|
DLG_RESIZE = 5, /* Window size has changed */
|
|
DLG_KEY = 6, /* Key before sending to widget */
|
|
DLG_HOTKEY_HANDLED = 7, /* A widget has got the hotkey */
|
|
DLG_POST_KEY = 8, /* The key has been handled */
|
|
DLG_UNHANDLED_KEY = 9, /* Key that no widget handled */
|
|
DLG_ACTION = 10, /* State of check- and radioboxes has changed
|
|
* and listbox current entry has changed */
|
|
DLG_VALIDATE = 11, /* Dialog is to be closed */
|
|
DLG_END = 12 /* Shut down dialog */
|
|
} dlg_msg_t;
|
|
|
|
/* Flags for create_dlg */
|
|
typedef enum
|
|
{
|
|
DLG_REVERSE = (1 << 5), /* Tab order is opposite to the add order */
|
|
DLG_WANT_TAB = (1 << 4), /* Should the tab key be sent to the dialog? */
|
|
DLG_WANT_IDLE = (1 << 3), /* Dialog wants idle events */
|
|
DLG_COMPACT = (1 << 2), /* Suppress spaces around the frame */
|
|
DLG_TRYUP = (1 << 1), /* Try to move two lines up the dialog */
|
|
DLG_CENTER = (1 << 0), /* Center the dialog */
|
|
DLG_NONE = 0 /* No options */
|
|
} dlg_flags_t;
|
|
|
|
/* Dialog state */
|
|
typedef enum
|
|
{
|
|
DLG_CONSTRUCT = 0, /* DIalog has been constructed but bot run yet */
|
|
DLG_ACTIVE = 1, /* Dialog is visible and active */
|
|
DLG_SUSPENDED = 2, /* Dialog is suspended */
|
|
DLG_CLOSED = 3 /* Dialog is closed */
|
|
} dlg_state_t;
|
|
|
|
/* Dialog color constants */
|
|
typedef enum
|
|
{
|
|
DLG_COLOR_NORMAL,
|
|
DLG_COLOR_FOCUS,
|
|
DLG_COLOR_HOT_NORMAL,
|
|
DLG_COLOR_HOT_FOCUS,
|
|
DLG_COLOR_TITLE,
|
|
DLG_COLOR_COUNT
|
|
} dlg_colors_enum_t;
|
|
|
|
/*** typedefs(not structures) ********************************************************************/
|
|
|
|
/* get string representation of shortcut assigned with command */
|
|
/* as menu is a widget of dialog, ask dialog about shortcut string */
|
|
typedef char *(*dlg_shortcut_str) (unsigned long command);
|
|
|
|
/* get dialog name to show in dialog list */
|
|
typedef char *(*dlg_title_str) (const Dlg_head * h, size_t len);
|
|
|
|
typedef int dlg_colors_t[DLG_COLOR_COUNT];
|
|
|
|
/* Dialog callback */
|
|
typedef cb_ret_t (*dlg_cb_fn) (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data);
|
|
|
|
/* menu command execution */
|
|
typedef cb_ret_t (*menu_exec_fn) (int command);
|
|
|
|
/*** structures declarations (and typedefs of structures)*****************************************/
|
|
|
|
struct Dlg_head
|
|
{
|
|
/* Set by the user */
|
|
gboolean modal; /* type of dialog: modal or not */
|
|
dlg_flags_t flags; /* User flags */
|
|
const char *help_ctx; /* Name of the help entry */
|
|
dlg_colors_t color; /* Color set. Unused in viewer and editor */
|
|
char *title; /* Title of the dialog */
|
|
|
|
/* Set and received by the user */
|
|
int ret_value; /* Result of run_dlg() */
|
|
|
|
/* Geometry */
|
|
int x, y; /* Position relative to screen origin */
|
|
int cols, lines; /* Width and height of the window */
|
|
|
|
/* Internal flags */
|
|
dlg_state_t state;
|
|
gboolean fullscreen; /* Parents dialogs don't need refresh */
|
|
gboolean winch_pending; /* SIGWINCH signal has been got. Resize dialog after rise */
|
|
int mouse_status; /* For the autorepeat status of the mouse */
|
|
|
|
/* Internal variables */
|
|
GList *widgets; /* widgets list */
|
|
GList *current; /* Curently active widget */
|
|
unsigned long widget_id; /* maximum id of all widgets */
|
|
void *data; /* Data can be passed to dialog */
|
|
char *event_group; /* Name of event group for this dialog */
|
|
|
|
dlg_cb_fn callback;
|
|
mouse_h mouse;
|
|
dlg_shortcut_str get_shortcut; /* Shortcut string */
|
|
dlg_title_str get_title; /* useless for modal dialogs */
|
|
};
|
|
|
|
/*** global variables defined in .c file *********************************************************/
|
|
|
|
/* Color styles for normal and error dialogs */
|
|
extern dlg_colors_t dialog_colors;
|
|
extern dlg_colors_t alarm_colors;
|
|
|
|
extern GList *top_dlg;
|
|
|
|
/* A hook list for idle events */
|
|
extern hook_t *idle_hook;
|
|
|
|
extern int fast_refresh;
|
|
extern int mouse_close_dialog;
|
|
|
|
extern const global_keymap_t *dialog_map;
|
|
|
|
/*** declarations of public functions ************************************************************/
|
|
|
|
/* draw box in window */
|
|
void draw_box (Dlg_head * h, int y, int x, int ys, int xs, gboolean single);
|
|
|
|
/* Creates a dialog head */
|
|
Dlg_head *create_dlg (gboolean modal, int y1, int x1, int lines, int cols,
|
|
const int *colors, dlg_cb_fn callback, mouse_h mouse_handler,
|
|
const char *help_ctx, const char *title, dlg_flags_t flags);
|
|
|
|
void dlg_set_default_colors (void);
|
|
|
|
unsigned long add_widget_autopos (Dlg_head * dest, void *w, widget_pos_flags_t pos_flags,
|
|
const void *before);
|
|
unsigned long add_widget (Dlg_head * dest, void *w);
|
|
unsigned long add_widget_before (Dlg_head * h, void *w, void *before);
|
|
void del_widget (void *w);
|
|
|
|
/* sets size of dialog, leaving positioning to automatic mehtods
|
|
according to dialog flags */
|
|
void dlg_set_size (Dlg_head * h, int lines, int cols);
|
|
/* this function allows to set dialog position */
|
|
void dlg_set_position (Dlg_head * h, int y1, int x1, int y2, int x2);
|
|
|
|
void init_dlg (Dlg_head * h);
|
|
int run_dlg (Dlg_head * d);
|
|
void destroy_dlg (Dlg_head * h);
|
|
|
|
void dlg_run_done (Dlg_head * h);
|
|
void dlg_save_history (Dlg_head * h);
|
|
void dlg_process_event (Dlg_head * h, int key, Gpm_Event * event);
|
|
|
|
char *dlg_get_title (const Dlg_head * h, size_t len);
|
|
|
|
/* To activate/deactivate the idle message generation */
|
|
void set_idle_proc (Dlg_head * d, int enable);
|
|
|
|
void dlg_redraw (Dlg_head * h);
|
|
|
|
void dlg_broadcast_msg (Dlg_head * h, widget_msg_t message, gboolean reverse);
|
|
|
|
/* Default callback for dialogs */
|
|
cb_ret_t default_dlg_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data);
|
|
|
|
/* Default paint routine for dialogs */
|
|
void common_dialog_repaint (Dlg_head * h);
|
|
|
|
void dlg_replace_widget (Widget * old, Widget * new);
|
|
int dlg_overlap (Widget * a, Widget * b);
|
|
void dlg_erase (Dlg_head * h);
|
|
void dlg_stop (Dlg_head * h);
|
|
|
|
/* Widget selection */
|
|
void dlg_select_widget (void *w);
|
|
void dlg_set_top_widget (void *w);
|
|
void dlg_one_up (Dlg_head * h);
|
|
void dlg_one_down (Dlg_head * h);
|
|
gboolean dlg_focus (Dlg_head * h);
|
|
Widget *find_widget_type (const Dlg_head * h, callback_fn callback);
|
|
Widget *dlg_find_by_id (const Dlg_head * h, unsigned long id);
|
|
void dlg_select_by_id (const Dlg_head * h, unsigned long id);
|
|
|
|
/* Redraw all dialogs */
|
|
void do_refresh (void);
|
|
|
|
/* Used in load_prompt() */
|
|
void update_cursor (Dlg_head * h);
|
|
|
|
/*** inline functions ****************************************************************************/
|
|
|
|
/* Return TRUE if the widget is active, FALSE otherwise */
|
|
static inline gboolean
|
|
dlg_widget_active (void *w)
|
|
{
|
|
Widget *w1 = (Widget *) w;
|
|
return ((Widget *) w1->owner->current->data == w1);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------- */
|
|
|
|
static inline unsigned long
|
|
dlg_get_current_widget_id (const struct Dlg_head *h)
|
|
{
|
|
return ((Widget *) h->current->data)->id;
|
|
}
|
|
|
|
#endif /* MC__DIALOG_H */
|