Browse Source

achown: add callback for permission buttons

...to change behaviour of WButton objects.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 7 years ago
parent
commit
48d85a42b4
3 changed files with 57 additions and 10 deletions
  1. 12 7
      lib/widget/button.c
  2. 4 0
      lib/widget/button.h
  3. 41 3
      src/filemanager/achown.c

+ 12 - 7
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;
 
@@ -194,8 +200,6 @@ button_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event)
     }
 }
 
-/* --------------------------------------------------------------------------------------------- */
-/*** public functions ****************************************************************************/
 /* --------------------------------------------------------------------------------------------- */
 
 WButton *
@@ -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;

+ 4 - 0
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 */

+ 41 - 3
src/filemanager/achown.c

@@ -340,6 +340,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)
 {
@@ -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);