Put global mouse coordinates to widgets.
Now each widget gets absolute coordinates of mouse pointer and decides itself how to handle them. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Этот коммит содержится в:
родитель
7956b64e54
Коммит
33d25a0c8f
@ -63,6 +63,7 @@ enum Gpm_Etype
|
|||||||
/* Constants returned from the mouse callback */
|
/* Constants returned from the mouse callback */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
MOU_UNHANDLED = 0,
|
||||||
MOU_NORMAL,
|
MOU_NORMAL,
|
||||||
MOU_REPEAT
|
MOU_REPEAT
|
||||||
};
|
};
|
||||||
|
@ -182,20 +182,21 @@ button_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
button_event (Gpm_Event * event, void *data)
|
button_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WButton *b = data;
|
Widget *w = (Widget *) data;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
||||||
{
|
{
|
||||||
Dlg_head *h = b->widget.owner;
|
dlg_select_widget (w);
|
||||||
|
|
||||||
dlg_select_widget (b);
|
|
||||||
if ((event->type & GPM_UP) != 0)
|
if ((event->type & GPM_UP) != 0)
|
||||||
{
|
{
|
||||||
button_callback (&b->widget, WIDGET_KEY, ' ');
|
button_callback (w, WIDGET_KEY, ' ');
|
||||||
h->callback (h, &b->widget, DLG_POST_KEY, ' ', NULL);
|
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL);
|
||||||
return MOU_NORMAL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,16 +218,23 @@ buttonbar_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
buttonbar_event (Gpm_Event * event, void *data)
|
buttonbar_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WButtonBar *bb = data;
|
Widget *w = (Widget *) data;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
|
if ((event->type & GPM_UP) != 0)
|
||||||
|
{
|
||||||
|
WButtonBar *bb = (WButtonBar *) data;
|
||||||
|
Gpm_Event local;
|
||||||
int button;
|
int button;
|
||||||
|
|
||||||
if (!(event->type & GPM_UP))
|
local = mouse_get_local (event, w);
|
||||||
return MOU_NORMAL;
|
button = buttonbar_get_button_by_x_coord (bb, local.x - 1);
|
||||||
if (event->y == 2)
|
|
||||||
return MOU_NORMAL;
|
|
||||||
button = buttonbar_get_button_by_x_coord (bb, event->x - 1);
|
|
||||||
if (button >= 0)
|
if (button >= 0)
|
||||||
buttonbar_call (bb, button);
|
buttonbar_call (bb, button);
|
||||||
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,22 +108,22 @@ check_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
check_event (Gpm_Event * event, void *data)
|
check_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WCheck *c = data;
|
Widget *w = (Widget *) data;
|
||||||
Widget *w = data;
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
||||||
{
|
{
|
||||||
Dlg_head *h = c->widget.owner;
|
dlg_select_widget (w);
|
||||||
|
if ((event->type & GPM_UP) != 0)
|
||||||
dlg_select_widget (c);
|
|
||||||
if (event->type & GPM_UP)
|
|
||||||
{
|
{
|
||||||
check_callback (w, WIDGET_KEY, ' ');
|
check_callback (w, WIDGET_KEY, ' ');
|
||||||
check_callback (w, WIDGET_FOCUS, 0);
|
check_callback (w, WIDGET_FOCUS, 0);
|
||||||
h->callback (h, w, DLG_POST_KEY, ' ', NULL);
|
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL);
|
||||||
return MOU_NORMAL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,12 +357,12 @@ dlg_mouse_event (Dlg_head * h, Gpm_Event * event)
|
|||||||
{
|
{
|
||||||
GList *item;
|
GList *item;
|
||||||
GList *starting_widget = h->current;
|
GList *starting_widget = h->current;
|
||||||
Gpm_Event new_event;
|
|
||||||
int x = event->x;
|
int x = event->x;
|
||||||
int y = event->y;
|
int y = event->y;
|
||||||
|
|
||||||
/* close the dialog by mouse click out of dialog area */
|
/* close the dialog by mouse click out of dialog area */
|
||||||
if (mouse_close_dialog && !h->fullscreen && ((event->buttons & GPM_B_LEFT) != 0) && ((event->type & GPM_DOWN) != 0) /* left click */
|
if (mouse_close_dialog && !h->fullscreen && ((event->buttons & GPM_B_LEFT) != 0)
|
||||||
|
&& ((event->type & GPM_DOWN) != 0) /* left click */
|
||||||
&& !((x > h->x) && (x <= h->x + h->cols) && (y > h->y) && (y <= h->y + h->lines)))
|
&& !((x > h->x) && (x <= h->x + h->cols) && (y > h->y) && (y <= h->y + h->lines)))
|
||||||
{
|
{
|
||||||
h->ret_value = B_CANCEL;
|
h->ret_value = B_CANCEL;
|
||||||
@ -380,21 +380,19 @@ dlg_mouse_event (Dlg_head * h, Gpm_Event * event)
|
|||||||
else
|
else
|
||||||
item = dlg_widget_next (h, item);
|
item = dlg_widget_next (h, item);
|
||||||
|
|
||||||
if (((widget->options & W_DISABLED) == 0)
|
if ((widget->options & W_DISABLED) == 0 && widget->mouse != NULL)
|
||||||
&& (x > widget->x) && (x <= widget->x + widget->cols)
|
|
||||||
&& (y > widget->y) && (y <= widget->y + widget->lines))
|
|
||||||
{
|
{
|
||||||
new_event = *event;
|
/* put global cursor position to the widget */
|
||||||
new_event.x -= widget->x;
|
int ret;
|
||||||
new_event.y -= widget->y;
|
|
||||||
|
|
||||||
if (widget->mouse != NULL)
|
ret = widget->mouse (event, widget);
|
||||||
return widget->mouse (&new_event, widget);
|
if (ret != MOU_UNHANDLED)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (item != starting_widget);
|
while (item != starting_widget);
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_UNHANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -775,7 +773,7 @@ create_dlg (gboolean modal, int y1, int x1, int lines, int cols,
|
|||||||
new_d->fullscreen = (new_d->x == 0 && new_d->y == 0
|
new_d->fullscreen = (new_d->x == 0 && new_d->y == 0
|
||||||
&& new_d->cols == COLS && new_d->lines == LINES);
|
&& new_d->cols == COLS && new_d->lines == LINES);
|
||||||
|
|
||||||
new_d->mouse_status = MOU_NORMAL;
|
new_d->mouse_status = MOU_UNHANDLED;
|
||||||
|
|
||||||
/* Strip existing spaces, add one space before and after the title */
|
/* Strip existing spaces, add one space before and after the title */
|
||||||
if (title != NULL)
|
if (title != NULL)
|
||||||
|
@ -902,6 +902,10 @@ static int
|
|||||||
input_event (Gpm_Event * event, void *data)
|
input_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WInput *in = (WInput *) data;
|
WInput *in = (WInput *) data;
|
||||||
|
Widget *w = (Widget *) data;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
if ((event->type & GPM_DOWN) != 0)
|
if ((event->type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
@ -911,19 +915,25 @@ input_event (Gpm_Event * event, void *data)
|
|||||||
|
|
||||||
if ((event->type & (GPM_DOWN | GPM_DRAG)) != 0)
|
if ((event->type & (GPM_DOWN | GPM_DRAG)) != 0)
|
||||||
{
|
{
|
||||||
dlg_select_widget (in);
|
Gpm_Event local;
|
||||||
|
|
||||||
if (event->x >= in->field_width - HISTORY_BUTTON_WIDTH + 1
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
|
dlg_select_widget (w);
|
||||||
|
|
||||||
|
if (local.x >= in->field_width - HISTORY_BUTTON_WIDTH + 1
|
||||||
&& should_show_history_button (in))
|
&& should_show_history_button (in))
|
||||||
do_show_hist (in);
|
do_show_hist (in);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
in->point = str_length (in->buffer);
|
in->point = str_length (in->buffer);
|
||||||
if (event->x + in->term_first_shown - 1 < str_term_width1 (in->buffer))
|
if (local.x + in->term_first_shown - 1 < str_term_width1 (in->buffer))
|
||||||
in->point = str_column_to_pos (in->buffer, event->x + in->term_first_shown - 1);
|
in->point = str_column_to_pos (in->buffer, local.x + in->term_first_shown - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
input_update (in, TRUE);
|
input_update (in, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A lone up mustn't do anything */
|
/* A lone up mustn't do anything */
|
||||||
if (in->highlight && (event->type & (GPM_UP | GPM_DRAG)) != 0)
|
if (in->highlight && (event->type & (GPM_UP | GPM_DRAG)) != 0)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
@ -434,43 +434,44 @@ listbox_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
listbox_event (Gpm_Event * event, void *data)
|
listbox_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WListbox *l = data;
|
WListbox *l = (WListbox *) data;
|
||||||
int i;
|
Widget *w = (Widget *) data;
|
||||||
|
|
||||||
Dlg_head *h = l->widget.owner;
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
/* Single click */
|
/* Single click */
|
||||||
if (event->type & GPM_DOWN)
|
if ((event->type & GPM_DOWN) != 0)
|
||||||
dlg_select_widget (l);
|
dlg_select_widget (l);
|
||||||
|
|
||||||
if (l->list == NULL)
|
if (l->list == NULL)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
if (event->type & (GPM_DOWN | GPM_DRAG))
|
if ((event->type & (GPM_DOWN | GPM_DRAG)) != 0)
|
||||||
{
|
{
|
||||||
int ret = MOU_REPEAT;
|
int ret = MOU_REPEAT;
|
||||||
|
Gpm_Event local;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (event->x < 0 || event->x > l->widget.cols)
|
local = mouse_get_local (event, w);
|
||||||
return ret;
|
if (local.y < 1)
|
||||||
|
for (i = -local.y; i >= 0; i--)
|
||||||
if (event->y < 1)
|
|
||||||
for (i = -event->y; i >= 0; i--)
|
|
||||||
listbox_back (l);
|
listbox_back (l);
|
||||||
else if (event->y > l->widget.lines)
|
else if (local.y > w->lines)
|
||||||
for (i = event->y - l->widget.lines; i > 0; i--)
|
for (i = local.y - w->lines; i > 0; i--)
|
||||||
listbox_fwd (l);
|
listbox_fwd (l);
|
||||||
else if (event->buttons & GPM_B_UP)
|
else if ((local.buttons & GPM_B_UP) != 0)
|
||||||
{
|
{
|
||||||
listbox_back (l);
|
listbox_back (l);
|
||||||
ret = MOU_NORMAL;
|
ret = MOU_NORMAL;
|
||||||
}
|
}
|
||||||
else if (event->buttons & GPM_B_DOWN)
|
else if ((local.buttons & GPM_B_DOWN) != 0)
|
||||||
{
|
{
|
||||||
listbox_fwd (l);
|
listbox_fwd (l);
|
||||||
ret = MOU_NORMAL;
|
ret = MOU_NORMAL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
listbox_select_entry (l, listbox_select_pos (l, l->top, event->y - 1));
|
listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1));
|
||||||
|
|
||||||
/* We need to refresh ourselves since the dialog manager doesn't */
|
/* We need to refresh ourselves since the dialog manager doesn't */
|
||||||
/* know about this event */
|
/* know about this event */
|
||||||
@ -481,14 +482,12 @@ listbox_event (Gpm_Event * event, void *data)
|
|||||||
/* Double click */
|
/* Double click */
|
||||||
if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE))
|
if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE))
|
||||||
{
|
{
|
||||||
|
Gpm_Event local;
|
||||||
int action;
|
int action;
|
||||||
|
|
||||||
if (event->x < 0 || event->x >= l->widget.cols
|
local = mouse_get_local (event, w);
|
||||||
|| event->y < 1 || event->y > l->widget.lines)
|
|
||||||
return MOU_NORMAL;
|
|
||||||
|
|
||||||
dlg_select_widget (l);
|
dlg_select_widget (l);
|
||||||
listbox_select_entry (l, listbox_select_pos (l, l->top, event->y - 1));
|
listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1));
|
||||||
|
|
||||||
if (l->callback != NULL)
|
if (l->callback != NULL)
|
||||||
action = l->callback (l);
|
action = l->callback (l);
|
||||||
@ -497,11 +496,11 @@ listbox_event (Gpm_Event * event, void *data)
|
|||||||
|
|
||||||
if (action == LISTBOX_DONE)
|
if (action == LISTBOX_DONE)
|
||||||
{
|
{
|
||||||
h->ret_value = B_ENTER;
|
w->owner->ret_value = B_ENTER;
|
||||||
dlg_stop (h);
|
dlg_stop (w->owner);
|
||||||
return MOU_NORMAL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,10 +589,15 @@ menubar_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
menubar_event (Gpm_Event * event, void *data)
|
menubar_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WMenuBar *menubar = data;
|
WMenuBar *menubar = (WMenuBar *) data;
|
||||||
|
Widget *w = (Widget *) data;
|
||||||
gboolean was_active = TRUE;
|
gboolean was_active = TRUE;
|
||||||
int left_x, right_x, bottom_y;
|
int left_x, right_x, bottom_y;
|
||||||
Menu *menu;
|
Menu *menu;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
/* ignore unsupported events */
|
/* ignore unsupported events */
|
||||||
if ((event->type & (GPM_UP | GPM_DOWN | GPM_DRAG)) == 0)
|
if ((event->type & (GPM_UP | GPM_DOWN | GPM_DRAG)) == 0)
|
||||||
@ -604,22 +609,24 @@ menubar_event (Gpm_Event * event, void *data)
|
|||||||
|
|
||||||
if (!menubar->is_dropped)
|
if (!menubar->is_dropped)
|
||||||
{
|
{
|
||||||
menubar->previous_widget = dlg_get_current_widget_id (menubar->widget.owner);
|
menubar->previous_widget = dlg_get_current_widget_id (w->owner);
|
||||||
menubar->is_active = TRUE;
|
menubar->is_active = TRUE;
|
||||||
menubar->is_dropped = TRUE;
|
menubar->is_dropped = TRUE;
|
||||||
was_active = FALSE;
|
was_active = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
/* Mouse operations on the menubar */
|
/* Mouse operations on the menubar */
|
||||||
if (event->y == 1 || !was_active)
|
if (local.y == 1 || !was_active)
|
||||||
{
|
{
|
||||||
if ((event->type & GPM_UP) != 0)
|
if ((local.type & GPM_UP) != 0)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
/* wheel events on menubar */
|
/* wheel events on menubar */
|
||||||
if (event->buttons & GPM_B_UP)
|
if ((local.buttons & GPM_B_UP) != 0)
|
||||||
menubar_left (menubar);
|
menubar_left (menubar);
|
||||||
else if (event->buttons & GPM_B_DOWN)
|
else if ((local.buttons & GPM_B_DOWN) != 0)
|
||||||
menubar_right (menubar);
|
menubar_right (menubar);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -627,7 +634,7 @@ menubar_event (Gpm_Event * event, void *data)
|
|||||||
unsigned int new_selection = 0;
|
unsigned int new_selection = 0;
|
||||||
|
|
||||||
while ((new_selection < len)
|
while ((new_selection < len)
|
||||||
&& (event->x > ((Menu *) g_list_nth_data (menubar->menu,
|
&& (local.x > ((Menu *) g_list_nth_data (menubar->menu,
|
||||||
new_selection))->start_x))
|
new_selection))->start_x))
|
||||||
new_selection++;
|
new_selection++;
|
||||||
|
|
||||||
@ -649,11 +656,11 @@ menubar_event (Gpm_Event * event, void *data)
|
|||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!menubar->is_dropped || (event->y < 2))
|
if (!menubar->is_dropped || (local.y < 2))
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
/* middle click -- everywhere */
|
/* middle click -- everywhere */
|
||||||
if (((event->buttons & GPM_B_MIDDLE) != 0) && ((event->type & GPM_DOWN) != 0))
|
if (((local.buttons & GPM_B_MIDDLE) != 0) && ((local.type & GPM_DOWN) != 0))
|
||||||
{
|
{
|
||||||
menubar_execute (menubar);
|
menubar_execute (menubar);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
@ -671,18 +678,18 @@ menubar_event (Gpm_Event * event, void *data)
|
|||||||
|
|
||||||
bottom_y = g_list_length (menu->entries) + 3;
|
bottom_y = g_list_length (menu->entries) + 3;
|
||||||
|
|
||||||
if ((event->x >= left_x) && (event->x <= right_x) && (event->y <= bottom_y))
|
if ((local.x >= left_x) && (local.x <= right_x) && (local.y <= bottom_y))
|
||||||
{
|
{
|
||||||
int pos = event->y - 3;
|
int pos = local.y - 3;
|
||||||
const menu_entry_t *entry = g_list_nth_data (menu->entries, pos);
|
const menu_entry_t *entry = g_list_nth_data (menu->entries, pos);
|
||||||
|
|
||||||
/* mouse wheel */
|
/* mouse wheel */
|
||||||
if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
menubar_up (menubar);
|
menubar_up (menubar);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
if ((event->buttons & GPM_B_DOWN) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
menubar_down (menubar);
|
menubar_down (menubar);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
@ -702,10 +709,11 @@ menubar_event (Gpm_Event * event, void *data)
|
|||||||
menubar_execute (menubar);
|
menubar_execute (menubar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (((local.type & GPM_DOWN) != 0) && ((local.buttons & (GPM_B_UP | GPM_B_DOWN)) == 0))
|
||||||
|
{
|
||||||
/* use click not wheel to close menu */
|
/* use click not wheel to close menu */
|
||||||
if (((event->type & GPM_DOWN) != 0) && ((event->buttons & (GPM_B_UP | GPM_B_DOWN)) == 0))
|
|
||||||
menubar_finish (menubar);
|
menubar_finish (menubar);
|
||||||
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
@ -147,22 +147,27 @@ radio_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
radio_event (Gpm_Event * event, void *data)
|
radio_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WRadio *r = data;
|
Widget *w = (Widget *) data;
|
||||||
Widget *w = data;
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
|
||||||
{
|
{
|
||||||
Dlg_head *h = r->widget.owner;
|
WRadio *r = (WRadio *) data;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
r->pos = event->y - 1;
|
local = mouse_get_local (event, w);
|
||||||
dlg_select_widget (r);
|
|
||||||
|
r->pos = local.y - 1;
|
||||||
|
dlg_select_widget (w);
|
||||||
if ((event->type & GPM_UP) != 0)
|
if ((event->type & GPM_UP) != 0)
|
||||||
{
|
{
|
||||||
radio_callback (w, WIDGET_KEY, ' ');
|
radio_callback (w, WIDGET_KEY, ' ');
|
||||||
h->callback (h, w, DLG_POST_KEY, ' ', NULL);
|
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL);
|
||||||
return MOU_NORMAL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,3 +227,28 @@ widget_erase (Widget * w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* get mouse pointer location within widget */
|
||||||
|
Gpm_Event
|
||||||
|
mouse_get_local (const Gpm_Event * global, const Widget * w)
|
||||||
|
{
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
local.buttons = global->buttons;
|
||||||
|
local.x = global->x - w->x;
|
||||||
|
local.y = global->y - w->y;
|
||||||
|
local.type = global->type;
|
||||||
|
|
||||||
|
return local;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
mouse_global_in_widget (const Gpm_Event * event, const Widget * w)
|
||||||
|
{
|
||||||
|
return (event->x > w->x) && (event->y > w->y) && (event->x <= w->x + w->cols)
|
||||||
|
&& (event->y <= w->y + w->lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#ifndef MC__WIDGET_INTERNAL_H
|
#ifndef MC__WIDGET_INTERNAL_H
|
||||||
#define MC__WIDGET_INTERNAL_H
|
#define MC__WIDGET_INTERNAL_H
|
||||||
|
|
||||||
#include "lib/tty/mouse.h" /* mouse_h */
|
#include "lib/tty/mouse.h"
|
||||||
|
|
||||||
/*** typedefs(not structures) and defined constants **********************************************/
|
/*** typedefs(not structures) and defined constants **********************************************/
|
||||||
|
|
||||||
@ -124,6 +124,10 @@ void widget_set_size (Widget * widget, int y, int x, int lines, int cols);
|
|||||||
void widget_selectcolor (struct Widget *w, gboolean focused, gboolean hotkey);
|
void widget_selectcolor (struct Widget *w, gboolean focused, gboolean hotkey);
|
||||||
void widget_erase (Widget * w);
|
void widget_erase (Widget * w);
|
||||||
|
|
||||||
|
/* get mouse pointer location within widget */
|
||||||
|
Gpm_Event mouse_get_local (const Gpm_Event * global, const Widget * w);
|
||||||
|
gboolean mouse_global_in_widget (const Gpm_Event * event, const Widget * w);
|
||||||
|
|
||||||
/*** inline functions ****************************************************************************/
|
/*** inline functions ****************************************************************************/
|
||||||
|
|
||||||
static inline cb_ret_t
|
static inline cb_ret_t
|
||||||
|
@ -2847,16 +2847,16 @@ dview_labels (WDiff * dview)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dview_event (Gpm_Event * event, void *x)
|
dview_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WDiff *dview = (WDiff *) x;
|
WDiff *dview = (WDiff *) data;
|
||||||
int result = MOU_NORMAL;
|
|
||||||
|
|
||||||
/* We are not interested in the release events */
|
if (!mouse_global_in_widget (event, data))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
|
/* We are not interested in release events */
|
||||||
if ((event->type & (GPM_DOWN | GPM_DRAG)) == 0)
|
if ((event->type & (GPM_DOWN | GPM_DRAG)) == 0)
|
||||||
{
|
return MOU_NORMAL;
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wheel events */
|
/* Wheel events */
|
||||||
if ((event->buttons & GPM_B_UP) != 0 && (event->type & GPM_DOWN) != 0)
|
if ((event->buttons & GPM_B_UP) != 0 && (event->type & GPM_DOWN) != 0)
|
||||||
@ -2872,7 +2872,7 @@ dview_event (Gpm_Event * event, void *x)
|
|||||||
dview_update (dview);
|
dview_update (dview);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -118,86 +118,88 @@ static int
|
|||||||
edit_event (Gpm_Event * event, void *data)
|
edit_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WEdit *edit = (WEdit *) data;
|
WEdit *edit = (WEdit *) data;
|
||||||
|
Widget *w = (Widget *) data;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
/* Unknown event type */
|
/* Unknown event type */
|
||||||
if (!(event->type & (GPM_DOWN | GPM_DRAG | GPM_UP)))
|
if ((event->type & (GPM_DOWN | GPM_DRAG | GPM_UP)) == 0)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
edit_update_curs_row (edit);
|
edit_update_curs_row (edit);
|
||||||
edit_update_curs_col (edit);
|
edit_update_curs_col (edit);
|
||||||
|
|
||||||
/* Outside editor window */
|
local = mouse_get_local (event, w);
|
||||||
if (event->y < 1 || event->x < 1
|
|
||||||
|| event->x > edit->widget.cols || event->y > edit->widget.lines)
|
|
||||||
return MOU_NORMAL;
|
|
||||||
|
|
||||||
/* Double click */
|
/* Double click */
|
||||||
if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE))
|
if ((local.type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE))
|
||||||
{
|
{
|
||||||
edit_mark_current_word_cmd (edit);
|
edit_mark_current_word_cmd (edit);
|
||||||
goto update;
|
goto update;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
/* Triple click */
|
/* Triple click */
|
||||||
if ((event->type & (GPM_TRIPLE | GPM_UP)) == (GPM_UP | GPM_TRIPLE))
|
if ((local.type & (GPM_TRIPLE | GPM_UP)) == (GPM_UP | GPM_TRIPLE))
|
||||||
{
|
{
|
||||||
edit_mark_current_line_cmd (edit);
|
edit_mark_current_line_cmd (edit);
|
||||||
goto update;
|
goto update;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Wheel events */
|
/* Wheel events */
|
||||||
if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
edit_move_up (edit, 2, 1);
|
edit_move_up (edit, 2, 1);
|
||||||
goto update;
|
goto update;
|
||||||
}
|
}
|
||||||
if ((event->buttons & GPM_B_DOWN) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
edit_move_down (edit, 2, 1);
|
edit_move_down (edit, 2, 1);
|
||||||
goto update;
|
goto update;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A lone up mustn't do anything */
|
/* A lone up mustn't do anything */
|
||||||
if (edit->mark2 != -1 && event->type & (GPM_UP | GPM_DRAG))
|
if (edit->mark2 != -1 && (local.type & (GPM_UP | GPM_DRAG)) != 0)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
if (event->type & (GPM_DOWN | GPM_UP))
|
if ((local.type & (GPM_DOWN | GPM_UP)) != 0)
|
||||||
edit_push_key_press (edit);
|
edit_push_key_press (edit);
|
||||||
|
|
||||||
if (!option_cursor_beyond_eol)
|
if (!option_cursor_beyond_eol)
|
||||||
edit->prev_col = event->x - edit->start_col - option_line_state_width - 1;
|
edit->prev_col = local.x - edit->start_col - option_line_state_width - 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
long line_len = edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0,
|
long line_len = edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0,
|
||||||
edit_eol (edit, edit->curs1));
|
edit_eol (edit, edit->curs1));
|
||||||
|
|
||||||
if (event->x > line_len)
|
if (local.x > line_len)
|
||||||
{
|
{
|
||||||
edit->over_col = event->x - line_len - edit->start_col - option_line_state_width - 1;
|
edit->over_col = local.x - line_len - edit->start_col - option_line_state_width - 1;
|
||||||
edit->prev_col = line_len;
|
edit->prev_col = line_len;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
edit->over_col = 0;
|
edit->over_col = 0;
|
||||||
edit->prev_col = event->x - option_line_state_width - edit->start_col - 1;
|
edit->prev_col = local.x - option_line_state_width - edit->start_col - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--event->y;
|
--local.y;
|
||||||
if (event->y > edit->curs_row)
|
if (local.y > edit->curs_row)
|
||||||
edit_move_down (edit, event->y - edit->curs_row, 0);
|
edit_move_down (edit, local.y - edit->curs_row, 0);
|
||||||
else if (event->y < edit->curs_row)
|
else if (local.y < edit->curs_row)
|
||||||
edit_move_up (edit, edit->curs_row - event->y, 0);
|
edit_move_up (edit, edit->curs_row - local.y, 0);
|
||||||
else
|
else
|
||||||
edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
|
edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
|
||||||
|
|
||||||
if (event->type & GPM_DOWN)
|
if ((local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
edit_mark_cmd (edit, 1); /* reset */
|
edit_mark_cmd (edit, 1); /* reset */
|
||||||
edit->highlight = 0;
|
edit->highlight = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(event->type & GPM_DRAG))
|
if ((local.type & GPM_DRAG) == 0)
|
||||||
edit_mark_cmd (edit, 0);
|
edit_mark_cmd (edit, 0);
|
||||||
|
|
||||||
update:
|
update:
|
||||||
|
@ -321,14 +321,17 @@ info_callback (Widget * w, widget_msg_t msg, int parm)
|
|||||||
static int
|
static int
|
||||||
info_event (Gpm_Event * event, void *data)
|
info_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
Widget *w = &((WInfo *) data)->widget;
|
Widget *w = (Widget *) data;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
/* rest of the upper frame, the menu is invisible - call menu */
|
/* rest of the upper frame, the menu is invisible - call menu */
|
||||||
if (event->type & GPM_DOWN && event->y == 1 && !menubar_visible)
|
if ((local.type & GPM_DOWN) != 0 && local.y == 1 && !menubar_visible)
|
||||||
{
|
|
||||||
event->x += w->x;
|
|
||||||
return the_menubar->widget.mouse (event, the_menubar);
|
return the_menubar->widget.mouse (event, the_menubar);
|
||||||
}
|
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
@ -1896,7 +1896,6 @@ mini_status_format (WPanel * panel)
|
|||||||
|
|
||||||
switch (panel->list_type)
|
switch (panel->list_type)
|
||||||
{
|
{
|
||||||
|
|
||||||
case list_long:
|
case list_long:
|
||||||
return "full perm space nlink space owner space group space size space mtime space name";
|
return "full perm space nlink space owner space group space size space mtime space name";
|
||||||
|
|
||||||
@ -3445,18 +3444,18 @@ mouse_set_mark (WPanel * panel)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int
|
static gboolean
|
||||||
mark_if_marking (WPanel * panel, Gpm_Event * event)
|
mark_if_marking (WPanel * panel, Gpm_Event * event)
|
||||||
{
|
{
|
||||||
if (event->buttons & GPM_B_RIGHT)
|
if ((event->buttons & GPM_B_RIGHT) != 0)
|
||||||
{
|
{
|
||||||
if (event->type & GPM_DOWN)
|
if ((event->type & GPM_DOWN) != 0)
|
||||||
mouse_toggle_mark (panel);
|
mouse_toggle_mark (panel);
|
||||||
else
|
else
|
||||||
mouse_set_mark (panel);
|
mouse_set_mark (panel);
|
||||||
return 1;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -3522,43 +3521,46 @@ mouse_sort_col (Gpm_Event * event, WPanel * panel)
|
|||||||
* Mouse callback of the panel minus repainting.
|
* Mouse callback of the panel minus repainting.
|
||||||
* If the event is redirected to the menu, *redir is set to TRUE.
|
* If the event is redirected to the menu, *redir is set to TRUE.
|
||||||
*/
|
*/
|
||||||
static int
|
static inline int
|
||||||
do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
||||||
{
|
{
|
||||||
const int lines = llines (panel);
|
const int lines = llines (panel);
|
||||||
const gboolean is_active = dlg_widget_active (panel);
|
const gboolean is_active = dlg_widget_active (panel);
|
||||||
const gboolean mouse_down = (event->type & GPM_DOWN) != 0;
|
const gboolean mouse_down = (event->type & GPM_DOWN) != 0;
|
||||||
|
Widget *w = (Widget *) panel;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
*redir = FALSE;
|
*redir = FALSE;
|
||||||
|
|
||||||
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
/* 1st line */
|
/* 1st line */
|
||||||
if (mouse_down && event->y == 1)
|
if (mouse_down && local.y == 1)
|
||||||
{
|
{
|
||||||
/* "<" button */
|
/* "<" button */
|
||||||
if (event->x == 2)
|
if (local.x == 2)
|
||||||
{
|
{
|
||||||
directory_history_prev (panel);
|
directory_history_prev (panel);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "." button show/hide hidden files */
|
/* "." button show/hide hidden files */
|
||||||
if (event->x == panel->widget.cols - 5)
|
if (local.x == panel->widget.cols - 5)
|
||||||
{
|
{
|
||||||
panel->widget.owner->callback (panel->widget.owner, NULL,
|
midnight_dlg->callback (midnight_dlg, NULL, DLG_ACTION, CK_ShowHidden, NULL);
|
||||||
DLG_ACTION, CK_ShowHidden, NULL);
|
|
||||||
repaint_screen ();
|
repaint_screen ();
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ">" button */
|
/* ">" button */
|
||||||
if (event->x == panel->widget.cols - 1)
|
if (local.x == panel->widget.cols - 1)
|
||||||
{
|
{
|
||||||
directory_history_next (panel);
|
directory_history_next (panel);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "^" button */
|
/* "^" button */
|
||||||
if (event->x >= panel->widget.cols - 4 && event->x <= panel->widget.cols - 2)
|
if (local.x >= panel->widget.cols - 4 && local.x <= panel->widget.cols - 2)
|
||||||
{
|
{
|
||||||
directory_history_list (panel);
|
directory_history_list (panel);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
@ -3568,7 +3570,6 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
if (!menubar_visible)
|
if (!menubar_visible)
|
||||||
{
|
{
|
||||||
*redir = TRUE;
|
*redir = TRUE;
|
||||||
event->x += panel->widget.x;
|
|
||||||
return the_menubar->widget.mouse (event, the_menubar);
|
return the_menubar->widget.mouse (event, the_menubar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3577,14 +3578,14 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* sort on clicked column; don't handle wheel events */
|
/* sort on clicked column; don't handle wheel events */
|
||||||
if (mouse_down && (event->buttons & (GPM_B_UP | GPM_B_DOWN)) == 0 && event->y == 2)
|
if (mouse_down && (local.buttons & (GPM_B_UP | GPM_B_DOWN)) == 0 && local.y == 2)
|
||||||
{
|
{
|
||||||
mouse_sort_col (event, panel);
|
mouse_sort_col (event, panel);
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mouse wheel events */
|
/* Mouse wheel events */
|
||||||
if (mouse_down && (event->buttons & GPM_B_UP))
|
if (mouse_down && (local.buttons & GPM_B_UP) != 0)
|
||||||
{
|
{
|
||||||
if (is_active)
|
if (is_active)
|
||||||
{
|
{
|
||||||
@ -3596,7 +3597,7 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse_down && (event->buttons & GPM_B_DOWN))
|
if (mouse_down && (local.buttons & GPM_B_DOWN) != 0)
|
||||||
{
|
{
|
||||||
if (is_active)
|
if (is_active)
|
||||||
{
|
{
|
||||||
@ -3608,20 +3609,20 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
event->y -= 2;
|
local.y -= 2;
|
||||||
if ((event->type & (GPM_DOWN | GPM_DRAG)))
|
if ((local.type & (GPM_DOWN | GPM_DRAG)) != 0)
|
||||||
{
|
{
|
||||||
int my_index;
|
int my_index;
|
||||||
|
|
||||||
if (!is_active)
|
if (!is_active)
|
||||||
change_panel ();
|
change_panel ();
|
||||||
|
|
||||||
if (panel->top_file + event->y > panel->count)
|
if (panel->top_file + local.y > panel->count)
|
||||||
my_index = panel->count - 1;
|
my_index = panel->count - 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
my_index = panel->top_file + event->y - 1;
|
my_index = panel->top_file + local.y - 1;
|
||||||
if (panel->split && (event->x > ((panel->widget.cols - 2) / 2)))
|
if (panel->split && (local.x > ((panel->widget.cols - 2) / 2)))
|
||||||
my_index += llines (panel);
|
my_index += llines (panel);
|
||||||
|
|
||||||
if (my_index >= panel->count)
|
if (my_index >= panel->count)
|
||||||
@ -3636,13 +3637,14 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This one is new */
|
/* This one is new */
|
||||||
mark_if_marking (panel, event);
|
mark_if_marking (panel, &local);
|
||||||
}
|
}
|
||||||
else if ((event->type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE))
|
else if ((local.type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE))
|
||||||
{
|
{
|
||||||
if (event->y > 0 && event->y <= lines)
|
if (local.y > 0 && local.y <= lines)
|
||||||
do_enter (panel);
|
do_enter (panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3652,10 +3654,13 @@ do_panel_event (Gpm_Event * event, WPanel * panel, gboolean * redir)
|
|||||||
static int
|
static int
|
||||||
panel_event (Gpm_Event * event, void *data)
|
panel_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WPanel *panel = data;
|
WPanel *panel = (WPanel *) data;
|
||||||
int ret;
|
int ret;
|
||||||
gboolean redir;
|
gboolean redir;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, (Widget *) data))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
ret = do_panel_event (event, panel, &redir);
|
ret = do_panel_event (event, panel, &redir);
|
||||||
if (!redir)
|
if (!redir)
|
||||||
send_message ((Widget *) panel, WIDGET_DRAW, 0);
|
send_message ((Widget *) panel, WIDGET_DRAW, 0);
|
||||||
|
@ -580,10 +580,10 @@ tree_move_to_bottom (WTree * tree)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/** Handle mouse click */
|
|
||||||
|
|
||||||
|
/** Handle mouse click */
|
||||||
static void
|
static void
|
||||||
tree_event (WTree * tree, int y)
|
tree_mouse_click (WTree * tree, int y)
|
||||||
{
|
{
|
||||||
if (tree->tree_shown[y])
|
if (tree->tree_shown[y])
|
||||||
{
|
{
|
||||||
@ -630,46 +630,49 @@ maybe_chdir (WTree * tree)
|
|||||||
/** Mouse callback */
|
/** Mouse callback */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
event_callback (Gpm_Event * event, void *data)
|
tree_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
WTree *tree = data;
|
WTree *tree = (WTree *) data;
|
||||||
|
Widget *w = (Widget *) data;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
/* rest of the upper frame, the menu is invisible - call menu */
|
/* rest of the upper frame, the menu is invisible - call menu */
|
||||||
if (tree->is_panel && (event->type & GPM_DOWN) && event->y == 1 && !menubar_visible)
|
if (tree->is_panel && (local.type & GPM_DOWN) != 0 && local.y == 1 && !menubar_visible)
|
||||||
{
|
|
||||||
event->x += tree->widget.x;
|
|
||||||
return the_menubar->widget.mouse (event, the_menubar);
|
return the_menubar->widget.mouse (event, the_menubar);
|
||||||
}
|
|
||||||
|
|
||||||
if (!(event->type & GPM_UP))
|
if ((local.type & GPM_UP) == 0)
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
if (tree->is_panel)
|
if (tree->is_panel)
|
||||||
event->y--;
|
local.y--;
|
||||||
|
|
||||||
event->y--;
|
local.y--;
|
||||||
|
|
||||||
if (!tree->active)
|
if (!tree->active)
|
||||||
change_panel ();
|
change_panel ();
|
||||||
|
|
||||||
if (event->y < 0)
|
if (local.y < 0)
|
||||||
{
|
{
|
||||||
tree_move_backward (tree, tlines (tree) - 1);
|
tree_move_backward (tree, tlines (tree) - 1);
|
||||||
show_tree (tree);
|
show_tree (tree);
|
||||||
}
|
}
|
||||||
else if (event->y >= tlines (tree))
|
else if (local.y >= tlines (tree))
|
||||||
{
|
{
|
||||||
tree_move_forward (tree, tlines (tree) - 1);
|
tree_move_forward (tree, tlines (tree) - 1);
|
||||||
show_tree (tree);
|
show_tree (tree);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tree_event (tree, event->y);
|
tree_mouse_click (tree, local.y);
|
||||||
if ((event->type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE))
|
if ((local.type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE))
|
||||||
{
|
|
||||||
tree_chdir_sel (tree);
|
tree_chdir_sel (tree);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return MOU_NORMAL;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1265,7 +1268,7 @@ tree_new (int y, int x, int lines, int cols, gboolean is_panel)
|
|||||||
{
|
{
|
||||||
WTree *tree = g_new (WTree, 1);
|
WTree *tree = g_new (WTree, 1);
|
||||||
|
|
||||||
init_widget (&tree->widget, y, x, lines, cols, tree_callback, event_callback);
|
init_widget (&tree->widget, y, x, lines, cols, tree_callback, tree_event);
|
||||||
tree->is_panel = is_panel;
|
tree->is_panel = is_panel;
|
||||||
tree->selected_ptr = 0;
|
tree->selected_ptr = 0;
|
||||||
|
|
||||||
|
34
src/help.c
34
src/help.c
@ -604,17 +604,23 @@ help_show (Dlg_head * h, const char *paint_start)
|
|||||||
static int
|
static int
|
||||||
help_event (Gpm_Event * event, void *vp)
|
help_event (Gpm_Event * event, void *vp)
|
||||||
{
|
{
|
||||||
Widget *w = vp;
|
Widget *w = (Widget *) vp;
|
||||||
GSList *current_area;
|
GSList *current_area;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
|
if (!mouse_global_in_widget (event, w))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
if ((event->type & GPM_UP) == 0)
|
if ((event->type & GPM_UP) == 0)
|
||||||
return 0;
|
return MOU_NORMAL;
|
||||||
|
|
||||||
|
local = mouse_get_local (event, w);
|
||||||
|
|
||||||
/* The event is relative to the dialog window, adjust it: */
|
/* The event is relative to the dialog window, adjust it: */
|
||||||
event->x -= 2;
|
local.x -= 2;
|
||||||
event->y -= 2;
|
local.y -= 2;
|
||||||
|
|
||||||
if (event->buttons & GPM_B_RIGHT)
|
if ((local.buttons & GPM_B_RIGHT) != 0)
|
||||||
{
|
{
|
||||||
currentpoint = history[history_ptr].page;
|
currentpoint = history[history_ptr].page;
|
||||||
selected_item = history[history_ptr].link;
|
selected_item = history[history_ptr].link;
|
||||||
@ -623,24 +629,26 @@ help_event (Gpm_Event * event, void *vp)
|
|||||||
history_ptr = HISTORY_SIZE - 1;
|
history_ptr = HISTORY_SIZE - 1;
|
||||||
|
|
||||||
help_callback (w->owner, NULL, DLG_DRAW, 0, NULL);
|
help_callback (w->owner, NULL, DLG_DRAW, 0, NULL);
|
||||||
return 0;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test whether the mouse click is inside one of the link areas */
|
/* Test whether the mouse click is inside one of the link areas */
|
||||||
for (current_area = link_area; current_area != NULL; current_area = g_slist_next (current_area))
|
for (current_area = link_area; current_area != NULL; current_area = g_slist_next (current_area))
|
||||||
{
|
{
|
||||||
Link_Area *la = (Link_Area *) current_area->data;
|
Link_Area *la = (Link_Area *) current_area->data;
|
||||||
|
|
||||||
/* Test one line link area */
|
/* Test one line link area */
|
||||||
if (event->y == la->y1 && event->x >= la->x1 && event->y == la->y2 && event->x <= la->x2)
|
if (local.y == la->y1 && local.x >= la->x1 && local.y == la->y2 && local.x <= la->x2)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Test two line link area */
|
/* Test two line link area */
|
||||||
if (la->y1 + 1 == la->y2)
|
if (la->y1 + 1 == la->y2)
|
||||||
{
|
{
|
||||||
/* The first line */
|
/* The first line */
|
||||||
if (event->y == la->y1 && event->x >= la->x1)
|
if (local.y == la->y1 && local.x >= la->x1)
|
||||||
break;
|
break;
|
||||||
/* The second line */
|
/* The second line */
|
||||||
if (event->y == la->y2 && event->x <= la->x2)
|
if (local.y == la->y2 && local.x <= la->x2)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Mouse will not work with link areas of more than two lines */
|
/* Mouse will not work with link areas of more than two lines */
|
||||||
@ -658,11 +666,11 @@ help_event (Gpm_Event * event, void *vp)
|
|||||||
currentpoint = help_follow_link (currentpoint, la->link_name);
|
currentpoint = help_follow_link (currentpoint, la->link_name);
|
||||||
selected_item = NULL;
|
selected_item = NULL;
|
||||||
}
|
}
|
||||||
else if (event->y < 0)
|
else if (local.y < 0)
|
||||||
move_backward (help_lines - 1);
|
move_backward (help_lines - 1);
|
||||||
else if (event->y >= help_lines)
|
else if (local.y >= help_lines)
|
||||||
move_forward (help_lines - 1);
|
move_forward (help_lines - 1);
|
||||||
else if (event->y < help_lines / 2)
|
else if (local.y < help_lines / 2)
|
||||||
move_backward (1);
|
move_backward (1);
|
||||||
else
|
else
|
||||||
move_forward (1);
|
move_forward (1);
|
||||||
@ -670,7 +678,7 @@ help_event (Gpm_Event * event, void *vp)
|
|||||||
/* Show the new node */
|
/* Show the new node */
|
||||||
help_callback (w->owner, NULL, DLG_DRAW, 0, NULL);
|
help_callback (w->owner, NULL, DLG_DRAW, 0, NULL);
|
||||||
|
|
||||||
return 0;
|
return MOU_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -88,40 +88,44 @@ char *mcview_show_eof = NULL;
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/** Both views */
|
/** Both views */
|
||||||
|
static gboolean
|
||||||
static int
|
do_mcview_event (mcview_t * view, Gpm_Event * event, int *result)
|
||||||
mcview_event (mcview_t * view, Gpm_Event * event, int *result)
|
|
||||||
{
|
{
|
||||||
screen_dimen y, x;
|
screen_dimen y, x;
|
||||||
|
Gpm_Event local;
|
||||||
|
|
||||||
*result = MOU_NORMAL;
|
*result = MOU_NORMAL;
|
||||||
|
|
||||||
|
local = mouse_get_local (event, (Widget *) view);
|
||||||
|
|
||||||
/* rest of the upper frame, the menu is invisible - call menu */
|
/* rest of the upper frame, the menu is invisible - call menu */
|
||||||
if (mcview_is_in_panel (view) && (event->type & GPM_DOWN) && event->y == 1 && !menubar_visible)
|
if (mcview_is_in_panel (view) && (local.type & GPM_DOWN) != 0 && local.y == 1
|
||||||
|
&& !menubar_visible)
|
||||||
{
|
{
|
||||||
event->x += view->widget.x;
|
|
||||||
*result = the_menubar->widget.mouse (event, the_menubar);
|
*result = the_menubar->widget.mouse (event, the_menubar);
|
||||||
return 0; /* don't draw viewer over menu */
|
return FALSE; /* don't draw viewer over menu */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are not interested in the release events */
|
/* We are not interested in the release events */
|
||||||
if (!(event->type & (GPM_DOWN | GPM_DRAG)))
|
if ((local.type & (GPM_DOWN | GPM_DRAG)) == 0)
|
||||||
return 0;
|
return FALSE;
|
||||||
|
|
||||||
/* Wheel events */
|
/* Wheel events */
|
||||||
if ((event->buttons & GPM_B_UP) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
mcview_move_up (view, 2);
|
mcview_move_up (view, 2);
|
||||||
return 1;
|
*result = MOU_NORMAL;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
if ((event->buttons & GPM_B_DOWN) && (event->type & GPM_DOWN))
|
if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0)
|
||||||
{
|
{
|
||||||
mcview_move_down (view, 2);
|
mcview_move_down (view, 2);
|
||||||
return 1;
|
*result = MOU_NORMAL;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
x = event->x;
|
x = local.x;
|
||||||
y = event->y;
|
y = local.y;
|
||||||
|
|
||||||
/* Scrolling left and right */
|
/* Scrolling left and right */
|
||||||
if (!view->text_wrap_mode)
|
if (!view->text_wrap_mode)
|
||||||
@ -164,28 +168,30 @@ mcview_event (mcview_t * view, Gpm_Event * event, int *result)
|
|||||||
goto processed;
|
goto processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return FALSE;
|
||||||
|
|
||||||
processed:
|
processed:
|
||||||
*result = MOU_REPEAT;
|
*result = MOU_REPEAT;
|
||||||
return 1;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/** Real view only */
|
|
||||||
|
|
||||||
|
/** Real view only */
|
||||||
static int
|
static int
|
||||||
mcview_real_event (Gpm_Event * event, void *x)
|
mcview_event (Gpm_Event * event, void *data)
|
||||||
{
|
{
|
||||||
mcview_t *view = (mcview_t *) x;
|
mcview_t *view = (mcview_t *) data;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if (mcview_event (view, event, &result))
|
if (!mouse_global_in_widget (event, (Widget *) data))
|
||||||
|
return MOU_UNHANDLED;
|
||||||
|
|
||||||
|
if (do_mcview_event (view, event, &result))
|
||||||
mcview_update (view);
|
mcview_update (view);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/*** public functions ****************************************************************************/
|
/*** public functions ****************************************************************************/
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -195,7 +201,7 @@ mcview_new (int y, int x, int lines, int cols, gboolean is_panel)
|
|||||||
{
|
{
|
||||||
mcview_t *view = g_new0 (mcview_t, 1);
|
mcview_t *view = g_new0 (mcview_t, 1);
|
||||||
|
|
||||||
init_widget (&view->widget, y, x, lines, cols, mcview_callback, mcview_real_event);
|
init_widget (&view->widget, y, x, lines, cols, mcview_callback, mcview_event);
|
||||||
|
|
||||||
view->hex_mode = FALSE;
|
view->hex_mode = FALSE;
|
||||||
view->hexedit_mode = FALSE;
|
view->hexedit_mode = FALSE;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user