extsay-ng/extsayng.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 03 Apr 2010 12:19:14 +0200
changeset 24 81cbb47f1aa6
parent 23 cf95a475825c
child 25 a98004eb58cd
permissions -rw-r--r--
[extsay] Add options to split the screen window
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
/*
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
   Copyright 2010 Mikael Berthe
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
  Module "extsayng"   -- adds a /extsay command
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
                         Spawns an external editor, using screen
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
This module is free software: you can redistribute it and/or modify
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
it under the terms of the GNU General Public License as published by
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
the Free Software Foundation, either version 2 of the License, or
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
(at your option) any later version.
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
This program is distributed in the hope that it will be useful,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
but WITHOUT ANY WARRANTY; without even the implied warranty of
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
GNU General Public License for more details.
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
You should have received a copy of the GNU General Public License
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
along with this program.  If not, see <http://www.gnu.org/licenses/>.
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
*/
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
#include <unistd.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
#include <stdlib.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
#include <sys/wait.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
#include <glib/gstdio.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
#include <mcabber/modules.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
#include <mcabber/commands.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
#include <mcabber/settings.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
#include <mcabber/compl.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
#include <mcabber/logprint.h>
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
static void extsayng_init(void);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
static void extsayng_uninit(void);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
/* Module description */
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
module_info_t info_extsayng = {
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
        .branch         = MCABBER_BRANCH,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
        .api            = MCABBER_API_VERSION,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
        .version        = "0.01",
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
        .description    = "Use external editor to send a message",
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
        .requires       = NULL,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
        .init           = extsayng_init,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
        .uninit         = extsayng_uninit,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
        .next           = NULL,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
};
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    47
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    48
// Run the external helper script with parameters
23
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    49
static void screen_run_script(const gchar *args)
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
{
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
  GError *err = NULL;
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    52
  gchar *argv[] = { "screen", "-r", "-X", "screen", NULL,
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    53
                    NULL, NULL, NULL, NULL };
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
  gboolean ret;
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    55
  gchar strwinheight[32];
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    56
  gboolean winsplit = settings_opt_get_int("extsay_split_win");
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    58
  // screen -r -X screen $path/extsay.sh [jid [winsplit [height]]]
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
  argv[4] = (gchar*)settings_opt_get("extsay_script_path");
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    61
  // Helper script path
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
  if (!argv[4] || !argv[4][0]) {
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
    scr_log_print(LPRINT_NORMAL, "Please set option 'extsay_script_path'.");
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
    return;
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
  }
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    67
  // Helper script parameter #1
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
  if (args && *args)
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
    argv[5] = (gchar*)args;
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
  else
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
    argv[5] = ".";
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
24
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    73
  // Update environment variables for the helper script
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    74
  if (winsplit) {
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    75
    gint winheight = settings_opt_get_int("extsay_win_height");
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    76
    argv[6] = "winsplit";       // Helper script parameter #2
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    77
    if (winheight > 0 && winheight < 256) {
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    78
      snprintf(strwinheight, sizeof strwinheight, "%d", winheight);
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    79
      argv[7] = strwinheight;   // Helper script parameter #3
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    80
    }
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    81
  }
81cbb47f1aa6 [extsay] Add options to split the screen window
Mikael Berthe <mikael@lilotux.net>
parents: 23
diff changeset
    82
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
  ret = g_spawn_async(NULL, argv, NULL,
23
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    84
                      G_SPAWN_SEARCH_PATH |
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    85
                        G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL,
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
                      NULL, NULL, NULL, &err);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
  if (!ret)
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
    scr_LogPrint(LPRINT_NORMAL, err->message);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
}
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
23
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    92
static void do_extsayng(gchar *args)
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
{
23
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    94
  gpointer bud;
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    95
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    96
  if (!args || !*args || !g_strcmp0(args, ".")) {
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    97
    if (!current_buddy) {
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    98
      scr_LogPrint(LPRINT_NORMAL, "Please select a buddy.");
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
    99
      return;
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   100
    }
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   101
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   102
    bud = BUDDATA(current_buddy);
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   103
    if (!(buddy_gettype(bud) &
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   104
          (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_ROOM))) {
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   105
      scr_LogPrint(LPRINT_NORMAL, "This is not a user.");
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   106
      return;
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   107
    }
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   108
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   109
    args = (gchar*)buddy_getjid(bud);
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   110
  }
cf95a475825c [extsay] Multiple improvements
Mikael Berthe <mikael@lilotux.net>
parents: 21
diff changeset
   111
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
  screen_run_script(args);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
}
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
static void extsayng_init(void)
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
{
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
  cmd_add("extsay", "Use external editor to write a message",
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
          COMPL_JID, 0, do_extsayng, NULL);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
}
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   121
static void extsayng_uninit(void)
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   122
{
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   123
  cmd_del("extsay");
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   124
}
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   125
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   126
/* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */