Beispiel #1
0
void hook_add(char *group, char *event, char *pattern, char *expr, int id)
{
  log_msg("HOOK", "ADD");
  log_msg("HOOK", "<%s> %s `%s`", event, pattern, expr);

  EventHandler *evh = get_event(event_idx(event));
  if (!evh)
    return;

  expr = strip_quotes(expr);

  Pattern *pat = NULL;
  if (pattern)
    pat = regex_pat_new(pattern);

  Hook hook = { id, HK_CMD, NULL, NULL, NULL, pat, .data.cmd = expr };
  augroup_insert(group, &hook);
  utarray_push_back(evh->hooks, &hook);
}

static void hook_delete(EventHandler *evh, Augroup *aug)
{
  for (int i = 0; i < utarray_len(evh->hooks); i++) {
    Hook *it = (Hook*)utarray_eltptr(evh->hooks, i);
    if (it->type == HK_CMD && it->aug == aug) {
      free(it->data.cmd);
      utarray_erase(evh->hooks, i, 1);
    }
  }
}

void hook_remove(char *group, char *event, char *pattern)
{
  log_msg("HOOK", "REMOVE");
  log_msg("HOOK", "<%s> %s `%s`", event, pattern, group);

  Augroup *aug = NULL;
  if (group)
    HASH_FIND_STR(aug_tbl, group, aug);

  if (event) {
    EventHandler *evh = get_event(event_idx(event));
    if (!evh)
      return;
    return hook_delete(evh, aug);
  }

  EventHandler *it;
  for (it = default_events; it != NULL; it = it->hh.next)
    hook_delete(it, aug);
}
Beispiel #2
0
static TAG_FREE(Hooks)
{
  hook_delete(tag->any);
}