clock/clock.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 13 Oct 2012 14:34:18 +0200
changeset 44 3f94f3522960
parent 37 a05815df848c
permissions -rw-r--r--
[killpresence] Add a command /probe to send a presence probe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
/*
37
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     2
 *  Module "clock"      -- Displays date and time
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     3
 *
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     4
 *  Options:
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     5
 *  - clock_precision_onesec: boolean (default: 0)
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     6
 *    If true, the clock will be updated every second,
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     7
 *    if false, the clock is updated once per minute.
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     8
 *  - clock_strfmt: string (default: "%Y-%m-%d %H:%M")
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
     9
 *    strftime format string.
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    10
 *
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    11
 * Copyright (C) 2010 Mikael Berthe <mikael@lilotux.net>
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    12
 *
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    13
 * This module is free software: you can redistribute it and/or modify
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    14
 * it under the terms of the GNU General Public License as published by
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    15
 * the Free Software Foundation, either version 2 of the License, or
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    16
 * (at your option) any later version.
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    17
 *
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    18
 * This program is distributed in the hope that it will be useful,
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    21
 * GNU General Public License for more details.
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    22
 *
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    23
 * You should have received a copy of the GNU General Public License
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    24
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
a05815df848c Update headers
Mikael Berthe <mikael@lilotux.net>
parents: 9
diff changeset
    25
 */
6
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
#include <time.h>
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
#include <mcabber/modules.h>
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
#include <mcabber/settings.h>
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
#include <mcabber/screen.h>
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
static void clock_init(void);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
static void clock_uninit(void);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
/* Module description */
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
module_info_t info_clock = {
8
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    38
        .branch         = MCABBER_BRANCH,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    39
        .api            = MCABBER_API_VERSION,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    40
        .version        = "1.00",
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    41
        .description    = "Simple clock module\n"
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    42
                          "Uses the 'info' option to display the time.",
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    43
        .requires       = NULL,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    44
        .init           = clock_init,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    45
        .uninit         = clock_uninit,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 6
diff changeset
    46
        .next           = NULL,
6
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
};
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
static guint srcno = 0;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
static gboolean precision_onesec;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
static gchar *backup_info;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
static gchar *strfmt;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
static const gchar dfltstrfmt[] = "%Y-%m-%d %H:%M"; // Default string format
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
static gboolean clock_cb(void)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
{
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
  char buf[256];
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
  time_t now_t;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
  struct tm *now;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
  time(&now_t);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
  now = localtime(&now_t);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
  strftime(buf, sizeof(buf), strfmt, now);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
  settings_set(SETTINGS_TYPE_OPTION, "info", buf);
9
3a4ddded06f2 Update to API dev:4
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    65
  scr_update_chat_status(TRUE);
6
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
  if (precision_onesec)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
    return TRUE;  // Let's be called again in 1 second
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
  // Set up new timeout event
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
  srcno = g_timeout_add_seconds((now->tm_sec < 60 ? 60 - now->tm_sec : 1),
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
                                (GSourceFunc)clock_cb, NULL);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
  return FALSE;   // Destroy the old timeout
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
}
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
static void clock_setup_timer(gboolean activate)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
{
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
  if ((activate && srcno) || (!activate && !srcno))
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
    return;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
  if (activate) {
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
    srcno = g_timeout_add_seconds(1, (GSourceFunc)clock_cb, NULL);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
  } else {
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
    g_source_remove(srcno);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
    srcno = 0;
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
  }
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
}
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
//static void do_clock(char *args)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
//{
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
//}
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
/* Initialization */
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
static void clock_init(void)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
{
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
  backup_info = g_strdup(settings_opt_get("info"));
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
  precision_onesec = settings_opt_get_int("clock_precision_onesec");
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
  strfmt = g_strdup(settings_opt_get("clock_strfmt"));
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
  if (!strfmt)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
    strfmt = g_strdup(dfltstrfmt);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
  clock_setup_timer(TRUE);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
}
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
/* Deinitialization */
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
static void clock_uninit(void)
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
{
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
  clock_setup_timer(FALSE);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
  settings_set(SETTINGS_TYPE_OPTION, "info", backup_info);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
  g_free(backup_info);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
  g_free(strfmt);
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
  backup_info = strfmt = NULL; // probably useless...
9
3a4ddded06f2 Update to API dev:4
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   112
  scr_update_chat_status(TRUE);
6
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
}
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
c2ad0b151a5e New module: clock
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
/* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */