File: functions.c

package info (click to toggle)
neomutt 20251211%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 23,164 kB
  • sloc: ansic: 172,058; sh: 5,357; perl: 1,121; tcl: 1,065; python: 443; makefile: 48
file content (109 lines) | stat: -rw-r--r-- 2,973 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * @file
 * Pattern functions
 *
 * @authors
 * Copyright (C) 2022-2023 Richard Russon <rich@flatcap.org>
 *
 * @copyright
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 2 of the License, or (at your option) any later
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @page pattern_functions Pattern functions
 *
 * Pattern functions
 */

#include "config.h"
#include <stdbool.h>
#include <stdio.h>
#include "mutt/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "functions.h"
#include "menu/lib.h"
#include "pattern_data.h"

/**
 * op_generic_select_entry - Select the current entry - Implements ::pattern_function_t - @ingroup pattern_function_api
 */
static int op_generic_select_entry(struct PatternData *pd, int op)
{
  const int index = menu_get_index(pd->menu);
  struct PatternEntry *entry = ARRAY_GET(&pd->entries, index);

  if (entry)
    buf_strcpy(pd->buf, entry->tag);

  pd->done = true;
  pd->selection = true;
  return FR_SUCCESS;
}

/**
 * op_quit - Quit this menu - Implements ::pattern_function_t - @ingroup pattern_function_api
 */
static int op_quit(struct PatternData *pd, int op)
{
  pd->done = true;
  pd->selection = false;
  return FR_SUCCESS;
}

// -----------------------------------------------------------------------------

/**
 * PatternFunctions - All the NeoMutt functions that the Pattern supports
 */
static const struct PatternFunction PatternFunctions[] = {
  // clang-format off
  { OP_GENERIC_SELECT_ENTRY,   op_generic_select_entry },
  { OP_QUIT,                   op_quit },
  { 0, NULL },
  // clang-format on
};

/**
 * pattern_function_dispatcher - Perform a Pattern function - Implements ::function_dispatcher_t - @ingroup dispatcher_api
 */
int pattern_function_dispatcher(struct MuttWindow *win, int op)
{
  // The Dispatcher may be called on any Window in the Dialog
  struct MuttWindow *dlg = dialog_find(win);
  if (!dlg || !dlg->wdata)
    return FR_ERROR;

  struct Menu *menu = dlg->wdata;
  struct PatternData *pd = menu->mdata;

  int rc = FR_UNKNOWN;
  for (size_t i = 0; PatternFunctions[i].op != OP_NULL; i++)
  {
    const struct PatternFunction *fn = &PatternFunctions[i];
    if (fn->op == op)
    {
      rc = fn->function(pd, op);
      break;
    }
  }

  if (rc == FR_UNKNOWN) // Not our function
    return rc;

  const char *result = dispatcher_get_retval_name(rc);
  mutt_debug(LL_DEBUG1, "Handled %s (%d) -> %s\n", opcodes_get_name(op), op, NONULL(result));

  return rc;
}