From 48d85a42b48050cf64e296868c5faffeb62d4094 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Thu, 31 Aug 2017 16:10:47 +0300 Subject: [PATCH] achown: add callback for permission buttons ...to change behaviour of WButton objects. Signed-off-by: Andrew Borodin --- lib/widget/button.c | 19 ++++++++++++------- lib/widget/button.h | 4 ++++ src/filemanager/achown.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/lib/widget/button.c b/lib/widget/button.c index 249837dd8..fe69493b5 100644 --- a/lib/widget/button.c +++ b/lib/widget/button.c @@ -50,10 +50,16 @@ /*** file scope variables ************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ /*** file scope functions ************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ -static cb_ret_t -button_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) +/* --------------------------------------------------------------------------------------------- */ +/*** public functions ****************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ + +cb_ret_t +button_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { WButton *b = BUTTON (w); WDialog *h = w->owner; @@ -173,8 +179,8 @@ button_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void * /* --------------------------------------------------------------------------------------------- */ -static void -button_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) +void +button_mouse_default_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) { (void) event; @@ -195,8 +201,6 @@ button_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) } /* --------------------------------------------------------------------------------------------- */ -/*** public functions ****************************************************************************/ -/* --------------------------------------------------------------------------------------------- */ WButton * button_new (int y, int x, int action, button_flags_t flags, const char *text, bcback_fn callback) @@ -210,7 +214,8 @@ button_new (int y, int x, int action, button_flags_t flags, const char *text, bc b->action = action; b->flags = flags; b->text = parse_hotkey (text); - widget_init (w, y, x, 1, button_get_len (b), button_callback, button_mouse_callback); + widget_init (w, y, x, 1, button_get_len (b), button_default_callback, + button_mouse_default_callback); w->options |= WOP_SELECTABLE | WOP_WANT_CURSOR | WOP_WANT_HOTKEY; b->callback = callback; b->hotpos = (b->text.hotkey != NULL) ? str_term_width1 (b->text.start) : -1; diff --git a/lib/widget/button.h b/lib/widget/button.h index 96d0702a6..5f21e1ef9 100644 --- a/lib/widget/button.h +++ b/lib/widget/button.h @@ -49,6 +49,10 @@ char *button_get_text (const WButton * b); void button_set_text (WButton * b, const char *text); int button_get_len (const WButton * b); +cb_ret_t button_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, + void *data); +void button_mouse_default_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event); + /*** inline functions ****************************************************************************/ #endif /* MC__WIDGET_BUTTON_H */ diff --git a/src/filemanager/achown.c b/src/filemanager/achown.c index c24168ff7..555f06b12 100644 --- a/src/filemanager/achown.c +++ b/src/filemanager/achown.c @@ -341,6 +341,44 @@ b_setpos (int f_pos) /* --------------------------------------------------------------------------------------------- */ static cb_ret_t +perm_button_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) +{ + return button_default_callback (w, sender, msg, parm, data); +} + +/* --------------------------------------------------------------------------------------------- */ + +static void +perm_button_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) +{ + button_mouse_default_callback (w, msg, event); +} + +/* --------------------------------------------------------------------------------------------- */ + +static WButton * +perm_button_new (int y, int x, int action, button_flags_t flags, const char *text, + bcback_fn callback) +{ + WButton *b; + Widget *w; + + /* create base button using native API */ + b = button_new (y, x, action, flags, text, callback); + w = WIDGET (b); + + /* we don't want HOTKEY */ + widget_want_hotkey (w, FALSE); + + w->callback = perm_button_callback; + w->mouse_callback = perm_button_mouse_callback; + + return b; +} + +/* --------------------------------------------------------------------------------------------- */ + +static cb_ret_t chl_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { switch (msg) @@ -709,11 +747,11 @@ advanced_chown_init (void) #define XTRACT(i,y,cb) y, BX+advanced_chown_but[i].x, \ advanced_chown_but[i].ret_cmd, advanced_chown_but[i].flags, \ (advanced_chown_but[i].text), cb - b_att[0] = button_new (XTRACT (0, BY, NULL)); + b_att[0] = perm_button_new (XTRACT (0, BY, NULL)); advanced_chown_but[0].id = add_widget (ch_dlg, b_att[0]); - b_att[1] = button_new (XTRACT (1, BY, NULL)); + b_att[1] = perm_button_new (XTRACT (1, BY, NULL)); advanced_chown_but[1].id = add_widget (ch_dlg, b_att[1]); - b_att[2] = button_new (XTRACT (2, BY, NULL)); + b_att[2] = perm_button_new (XTRACT (2, BY, NULL)); advanced_chown_but[2].id = add_widget (ch_dlg, b_att[2]); b_user = button_new (XTRACT (3, BY, user_group_button_cb)); advanced_chown_but[3].id = add_widget (ch_dlg, b_user); -- 2.11.4.GIT