mcabber/modules/xttitle/xttitle.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 27 Mar 2010 11:35:49 +0100
changeset 1827 a2642e56e0de
child 1832 48b265f8c5cb
permissions -rw-r--r--
Add xttitle module
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1827
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
/*
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
 *  Module "xttitle"    -- Update X terminal tittle
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
 *
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
 * Copyright (C) 2010 Mikael Berthe <mikael@lilotux.net>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
 *
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
 * This module is free software; you can redistribute it and/or modify
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
 * your option) any later version.
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
 *
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
 * General Public License for more details.
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
 *
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
 */
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
#include <stdlib.h>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
#include <mcabber/modules.h>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
#include <mcabber/settings.h>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
#include <mcabber/hooks.h>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
#include <mcabber/logprint.h>
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
static void xttitle_init(void);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
static void xttitle_uninit(void);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
/* Module description */
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
module_info_t info_xttitle = {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
        .branch         = MCABBER_BRANCH,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
        .api            = MCABBER_API_VERSION,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
        .version        = MCABBER_VERSION,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
        .description    = "Show unread message count in X terminal title",
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
        .requires       = NULL,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
        .init           = xttitle_init,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
        .uninit         = xttitle_uninit,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
        .next           = NULL,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
};
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
// Hook handler id
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
static guint unread_list_hid;
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
// Event handler for HOOK_UNREAD_LIST_CHANGE events
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
static guint unread_list_hh(const gchar *hookname, hk_arg_t *args,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
                            gpointer userdata)
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
{
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
  guint all_unread = 0;
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
  guint muc_unread = 0;
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
  guint muc_attention = 0;
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
  guint unread; // private message count
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
  // Note: We can add "attention" string later, but it isn't used
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
  // yet in mcabber...
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
  for ( ; args->name; args++) {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
    if (!g_strcmp0(args->name, "unread")) {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
      all_unread = atoi(args->value);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
    } else if (!g_strcmp0(args->name, "muc_unread")) {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
      muc_unread = atoi(args->value);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
    } else if (!g_strcmp0(args->name, "muc_attention")) {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
      muc_attention = atoi(args->value);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
    }
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
  }
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
  // Let's not count the MUC unread buffers that don't have the attention
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
  // flag (that is, MUC buffer that have no highlighted messages).
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
  unread = all_unread - (muc_unread - muc_attention);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
  // Update the terminal tittle
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
  if (muc_unread) {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
    printf("\033]0;MCabber -- %d message%c (total:%d / MUC:%d)\007",
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
           unread, (unread > 1 ? 's' : ' '), all_unread, muc_unread);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
  } else {
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
    if (unread)
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
      printf("\033]0;MCabber -- %d message%c\007", unread,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
             (unread > 1 ? 's' : ' '));
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
    else
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
      printf("\033]0;MCabber -- No message\007");
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
  }
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
  return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
}
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
// Initialization
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
static void xttitle_init(void)
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
{
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
  // Add hook handler for unread message data
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
  unread_list_hid = hk_add_handler(unread_list_hh, HOOK_UNREAD_LIST_CHANGE,
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
                                   G_PRIORITY_DEFAULT_IDLE, NULL);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
}
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
// Uninitialization
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
static void xttitle_uninit(void)
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
{
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
  // Unregister handler
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
  hk_del_handler(HOOK_UNREAD_LIST_CHANGE, unread_list_hid);
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
}
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
a2642e56e0de Add xttitle module
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */