extsay-old/extsay_old.c
author Mikael Berthe <mikael@lilotux.net>
Fri, 02 Apr 2010 23:23:58 +0200
changeset 21 9798e3aaa851
parent 8 extsay/extsay.c@53b0091ecd47
permissions -rw-r--r--
Add module extsayng, rename previous one to extsay_old This new module is based on the screen utility, but it should be much safer to use.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
/*
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
   Copyright 2009,2010 Andreas Fett
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
   Copyright 2010 Mikael Berthe
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
     5
  Module "extsay_old" -- adds a /extsay_old command
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
                         Spawns an external editor
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
  Original code from Andreas Fett.
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
This module is free software: you can redistribute it and/or modify
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
it under the terms of the GNU General Public License as published by
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
the Free Software Foundation, either version 2 of the License, or
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
(at your option) any later version.
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
This program is distributed in the hope that it will be useful,
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
but WITHOUT ANY WARRANTY; without even the implied warranty of
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
GNU General Public License for more details.
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
You should have received a copy of the GNU General Public License
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
along with this program.  If not, see <http://www.gnu.org/licenses/>.
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
*/
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
#include <unistd.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
#include <stdlib.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
#include <sys/wait.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
#include <glib/gstdio.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
#include <mcabber/modules.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
#include <mcabber/commands.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
#include <mcabber/screen.h>
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    32
static void extsay_old_init(void);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    33
static void extsay_old_uninit(void);
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
/* Module description */
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    36
module_info_t info_extsay_old = {
8
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    37
        .branch         = MCABBER_BRANCH,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    38
        .api            = MCABBER_API_VERSION,
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    39
        .version        = "0.01",
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    40
        .description    = "Use external editor to send a message\n"
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    41
                          "WARNING: use at your own risk - "
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    42
                          "mcabber is stuck while you write a message, "
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    43
                          "this is not recommended!",
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    44
        .requires       = NULL,
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    45
        .init           = extsay_old_init,
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    46
        .uninit         = extsay_old_uninit,
8
53b0091ecd47 Update modules to the new API scheme
Mikael Berthe <mikael@lilotux.net>
parents: 7
diff changeset
    47
        .next           = NULL,
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
};
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
// XXX Not very clean, internal function...
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
char *load_message_from_file(const char *filename);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
static char* spawn_editor() {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
  GError *err = NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
  gchar *argv[] = { NULL, NULL };
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
  gchar *tmpfile = NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
  gchar *tmpl = "mcabber-XXXXXX";
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
  gchar *msg;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
  gboolean ret;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
  gint fd;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
  gint exit_status = 0;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
  argv[0] = (gchar*)g_getenv("EDITOR");
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
  if (argv[0] == NULL) {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
    scr_LogPrint(LPRINT_NORMAL, "Environment variable EDITOR not set.");
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
    return NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
  }
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
  fd = g_file_open_tmp(tmpl, &tmpfile, &err);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
  if ( fd < 0 ) {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
    scr_LogPrint(LPRINT_NORMAL, err->message);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
    g_error_free(err);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
    return NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
  }
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
  close(fd);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
  argv[1] = tmpfile;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
5
fbfc64c5d6be [extsay] Fix ncurses reinitialization
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
    79
  endwin();
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
  ret = g_spawn_sync(NULL, argv, NULL,
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
                     G_SPAWN_CHILD_INHERITS_STDIN|G_SPAWN_SEARCH_PATH,
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
                     NULL, NULL, NULL, NULL, &exit_status, &err);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
5
fbfc64c5d6be [extsay] Fix ncurses reinitialization
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
    84
  raw();
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
  readline_refresh_screen();
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
  if (!ret) {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
    scr_LogPrint(LPRINT_NORMAL, err->message);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
    return NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
  }
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
  if (WEXITSTATUS(exit_status) != EXIT_SUCCESS) {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
    scr_LogPrint(LPRINT_NORMAL,
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
                 "Editor exited with error, discarding message.");
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
    return NULL;
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
  }
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
  msg = load_message_from_file(tmpfile);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
7
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   100
  if (g_unlink(tmpfile) != 0)
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   101
    scr_LogPrint(LPRINT_NORMAL, "Warning, could not remove temp file.");
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
7
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   103
  return msg;
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
}
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   106
static void do_extsay_old(char *args)
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
{
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
  char *msg = spawn_editor();
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
  if (msg) {
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
    say_cmd(msg, 0);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
    g_free(msg);
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
  }
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
}
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
/* Initialization */
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   116
static void extsay_old_init(void)
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
{
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
  /* Add command */
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   119
  cmd_add("extsay_old", "Use external editor to write a message",
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   120
          0, 0, do_extsay_old, NULL);
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   121
  scr_LogPrint(LPRINT_NORMAL, "Loading module extsay_old...\n"
7
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   122
               "** Be careful, everything is on hold while you run the "
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   123
               "external editor.\n"
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   124
               "** Do not run it for too long!"
ad87c711de84 Add a warning when loading module extsay
Mikael Berthe <mikael@lilotux.net>
parents: 5
diff changeset
   125
               );
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   126
}
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   127
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   128
/* Deinitialization */
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   129
static void extsay_old_uninit(void)
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
{
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
  /* Unregister command */
21
9798e3aaa851 Add module extsayng, rename previous one to extsay_old
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   132
  cmd_del("extsay_old");
0
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   133
}
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   134
d6d9e95a4ae5 Initial module repository
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   135
/* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */