view mcabber/modules/xttitle/xttitle.c @ 2223:965e0282c128

Backed out changeset fa516ef22145 Turns out that in this hash the value pointer is the same as the key pointer, so there's no need to free both the key and the value.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 06 Nov 2015 22:31:40 +0100
parents 5d5af91a0a69
children
line wrap: on
line source

/*
 *  Module "xttitle"    -- Update X terminal title
 *
 * Copyright (C) 2010 Mikael Berthe <mikael@lilotux.net>
 *
 * The option 'xttitle_short_format' can be set to 1 to use a very
 * short terminal title.
 *
 * This module 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/>.
 */

#include <stdio.h>
#include <stdlib.h>
#include <mcabber/modules.h>
#include <mcabber/settings.h>
#include <mcabber/hooks.h>
#include <mcabber/logprint.h>

static void xttitle_init(void);
static void xttitle_uninit(void);

/* Module description */
module_info_t info_xttitle = {
        .branch         = MCABBER_BRANCH,
        .api            = MCABBER_API_VERSION,
        .version        = MCABBER_VERSION,
        .description    = "Show unread message count in X terminal title",
        .requires       = NULL,
        .init           = xttitle_init,
        .uninit         = xttitle_uninit,
        .next           = NULL,
};

// Hook handler id
static guint unread_list_hid;

// Event handler for HOOK_UNREAD_LIST_CHANGE events
static guint unread_list_hh(const gchar *hookname, hk_arg_t *args,
                            gpointer userdata)
{
  guint all_unread = 0;
  guint muc_unread = 0;
  guint muc_attention = 0;
  guint unread; // private message count
  static gchar buf[128];

  // Note: We can add "attention" string later, but it isn't used
  // yet in mcabber...
  for ( ; args->name; args++) {
    if (!g_strcmp0(args->name, "unread")) {
      all_unread = atoi(args->value);
    } else if (!g_strcmp0(args->name, "muc_unread")) {
      muc_unread = atoi(args->value);
    } else if (!g_strcmp0(args->name, "muc_attention")) {
      muc_attention = atoi(args->value);
    }
  }

  // Let's not count the MUC unread buffers that don't have the attention
  // flag (that is, MUC buffer that have no highlighted messages).
  unread = all_unread - (muc_unread - muc_attention);

  // TODO: let the user use a format string, instead of hard-coded defaults...
  if (settings_opt_get_int("xttitle_short_format") == 1) {
    // Short title message
    if (!all_unread)
      snprintf(buf, sizeof(buf), "MCabber");
    else if (unread == all_unread)
      snprintf(buf, sizeof(buf), "MCabber (%u)", unread);
    else
      snprintf(buf, sizeof(buf), "MCabber (%u/%u)", unread, all_unread);
  } else {
    // Long title message
    if (muc_unread) {
      snprintf(buf, sizeof(buf), "MCabber -- %u message%c (total:%u / MUC:%u)",
               unread, (unread > 1 ? 's' : ' '), all_unread, muc_unread);
    } else {
      if (unread)
        snprintf(buf, sizeof(buf), "MCabber -- %u message%c", unread,
                 (unread > 1 ? 's' : ' '));
      else
        snprintf(buf, sizeof(buf), "MCabber -- No message");
    }
  }

  // Update the terminal title
  printf("\033]0;%s\007", buf);

  return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
}

// Initialization
static void xttitle_init(void)
{
  // Add hook handler for unread message data
  unread_list_hid = hk_add_handler(unread_list_hh, HOOK_UNREAD_LIST_CHANGE,
                                   G_PRIORITY_DEFAULT_IDLE, NULL);
  // Default title
  printf("\033]0;MCabber\007");
}

// Uninitialization
static void xttitle_uninit(void)
{
  // Unregister handler
  hk_del_handler(HOOK_UNREAD_LIST_CHANGE, unread_list_hid);
  // Reset title
  printf("\033]0;MCabber\007");
}

/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */