# HG changeset patch # User Mikael Berthe # Date 1270243438 -7200 # Node ID 9798e3aaa85158a48b6af389bf9e234b5054050a # Parent 4fbed301c014cf710f60453d14567ac273e50157 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. diff -r 4fbed301c014 -r 9798e3aaa851 Makefile.am --- a/Makefile.am Wed Mar 31 23:01:39 2010 +0200 +++ b/Makefile.am Fri Apr 02 23:23:58 2010 +0200 @@ -1,1 +1,1 @@ -SUBDIRS = clock comment extsay info_msgcount killpresence lastmsg +SUBDIRS = clock comment extsay-ng extsay-old info_msgcount killpresence lastmsg diff -r 4fbed301c014 -r 9798e3aaa851 configure.ac --- a/configure.ac Wed Mar 31 23:01:39 2010 +0200 +++ b/configure.ac Fri Apr 02 23:23:58 2010 +0200 @@ -98,14 +98,21 @@ enable_all_modules=$enableval) AC_ARG_ENABLE(module-clock, - AC_HELP_STRING([--enable-module-clock], [enable module clock]), + AC_HELP_STRING([--enable-module-clock], + [enable module clock]), enable_module_clock=$enableval) AC_ARG_ENABLE(module-comment, - AC_HELP_STRING([--enable-module-comment], [enable module comment]), + AC_HELP_STRING([--enable-module-comment], + [enable module comment]), enable_module_comment=$enableval) -AC_ARG_ENABLE(module-extsay, - AC_HELP_STRING([--enable-module-extsay], [enable module extsay]), - enable_module_extsay=$enableval) +AC_ARG_ENABLE(module-extsayng, + AC_HELP_STRING([--enable-module-extsayng], + [enable module extsayng]), + enable_module_extsayng=$enableval) +AC_ARG_ENABLE(module-extsay_old, + AC_HELP_STRING([--enable-module-extsay_old], + [enable module extsay_old]), + enable_module_extsay_old=$enableval) AC_ARG_ENABLE(module-info_msgcount, AC_HELP_STRING([--enable-module-info_msgcount], [enable module info_msgcount]), @@ -115,7 +122,8 @@ [enable module killpresence]), enable_module_lastmsg=$enableval) AC_ARG_ENABLE(module-lastmsg, - AC_HELP_STRING([--enable-module-lastmsg], [enable module lastmsg]), + AC_HELP_STRING([--enable-module-lastmsg], + [enable module lastmsg]), enable_module_lastmsg=$enableval) AM_CONDITIONAL([INSTALL_MODULE_CLOCK], @@ -126,9 +134,13 @@ [test x"${enable_all_modules}" = x"yes" -o \ x"${enable_module_comment}" = x"yes"]) -AM_CONDITIONAL([INSTALL_MODULE_EXTSAY], +AM_CONDITIONAL([INSTALL_MODULE_EXTSAYNG], [test x"${enable_all_modules}" = x"yes" -o \ - x"${enable_module_extsay}" = x"yes"]) + x"${enable_module_extsayng}" = x"yes"]) + +AM_CONDITIONAL([INSTALL_MODULE_EXTSAY_OLD], + [test x"${enable_all_modules}" = x"yes" -o \ + x"${enable_module_extsay_old}" = x"yes"]) AM_CONDITIONAL([INSTALL_MODULE_INFO_MSGCOUNT], [test x"${enable_all_modules}" = x"yes" -o \ @@ -144,7 +156,8 @@ AC_CONFIG_FILES([clock/Makefile comment/Makefile - extsay/Makefile + extsay-ng/Makefile + extsay-old/Makefile info_msgcount/Makefile killpresence/Makefile lastmsg/Makefile diff -r 4fbed301c014 -r 9798e3aaa851 extsay-ng/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-ng/Makefile.am Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,11 @@ + +if INSTALL_MODULE_EXTSAYNG + +pkglib_LTLIBRARIES = libextsayng.la +libextsayng_la_SOURCES = extsayng.c +libextsayng_la_LDFLAGS = -module -avoid-version -shared + +LDADD = $(GLIB_LIBS) $(MCABBER_LIBS) +AM_CPPFLAGS = -I$(top_srcdir) $(GLIB_CFLAGS) $(MCABBER_CFLAGS) + +endif diff -r 4fbed301c014 -r 9798e3aaa851 extsay-ng/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-ng/README Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,22 @@ + + ** Module extsay-ng ** + +To use this module, you have to be running the screen utility. + +Copy the script extsay.sh to some place on your system and set the mcabber +option 'extsay_script_path' to the file path. You can set it in your mcabber +configuration file. + + /EXTSAY [jid] + +When you type /extsay, the module will send a command to screen to open a +new window and run the helper script in it. + +WARNING: If you do not provide a JID, the selected user _at the time you +close the editor_ will be used. Be careful not to select another contact +while you're editing your message! + +Hope you find this module useful, do not hesitate to send patches for +improvements! + +Mikael diff -r 4fbed301c014 -r 9798e3aaa851 extsay-ng/extsay.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-ng/extsay.sh Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,34 @@ +#! /bin/sh +# +# Copyright (C) 2010 Mikael Berthe +# +# Copy this script on your system and specify the path for mcabber +# by setting the 'extsay_script_path' option. +# +# This script is free software. +# MiKael, 2010-04-02 + +FIFOPATH="$HOME/.mcabber/mcabber.fifo" +tmpdir=${TMPDIR:="/tmp"} +editor=${EDITOR:="vi"} +jid="." + +# Use argument as a recipient JID, if it is provided +[ $# -eq 1 ] && jid=$1 + +# Leave if the FIFO is not available +[ -p $FIFOPATH ] || exit 255 + +tf=$(mktemp --tmpdir=$tmpdir extsay-XXXXXX) || exit 255 + +# This will not work if the editor runs in the background! +$editor $tf + +# Send the message using MCabber's pipe +if [ -s $tf ]; then + cmd="say_to -f $tf $jid" + echo $cmd >> $FIFOPATH +fi + +rm $tf +exit 0 diff -r 4fbed301c014 -r 9798e3aaa851 extsay-ng/extsayng.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-ng/extsayng.c Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,95 @@ +/* + Copyright 2010 Mikael Berthe + + Module "extsayng" -- adds a /extsay command + Spawns an external editor, using screen + +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 . +*/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static void extsayng_init(void); +static void extsayng_uninit(void); + +/* Module description */ +module_info_t info_extsayng = { + .branch = MCABBER_BRANCH, + .api = MCABBER_API_VERSION, + .version = "0.01", + .description = "Use external editor to send a message", + .requires = NULL, + .init = extsayng_init, + .uninit = extsayng_uninit, + .next = NULL, +}; + +// Forks and run the external helper script +static void screen_run_script(const char *args) +{ + GError *err = NULL; + gchar *argv[] = { "screen", "-r", "-X", "screen", NULL, NULL, NULL }; + gboolean ret; + + // screen -r -X screen $path/extsay.sh + argv[4] = (gchar*)settings_opt_get("extsay_script_path"); + + if (!argv[4] || !argv[4][0]) { + scr_log_print(LPRINT_NORMAL, "Please set option 'extsay_script_path'."); + return; + } + + if (args && *args) + argv[5] = (gchar*)args; + else + argv[5] = "."; + + ret = g_spawn_async(NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, //| + // G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, NULL, &err); + + if (!ret) + scr_LogPrint(LPRINT_NORMAL, err->message); +} + +static void do_extsayng(char *args) +{ + // TODO - check the selected item is a real contact + // (not a special buffer, nor a group...) + // TODO provide JID if it isn't provided + screen_run_script(args); +} + +static void extsayng_init(void) +{ + cmd_add("extsay", "Use external editor to write a message", + COMPL_JID, 0, do_extsayng, NULL); +} + +static void extsayng_uninit(void) +{ + cmd_del("extsay"); +} + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 4fbed301c014 -r 9798e3aaa851 extsay-old/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-old/Makefile.am Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,11 @@ + +if INSTALL_MODULE_EXTSAY_OLD + +pkglib_LTLIBRARIES = libextsay_old.la +libextsay_old_la_SOURCES = extsay_old.c +libextsay_old_la_LDFLAGS = -module -avoid-version -shared + +LDADD = $(GLIB_LIBS) $(MCABBER_LIBS) +AM_CPPFLAGS = -I$(top_srcdir) $(GLIB_CFLAGS) $(MCABBER_CFLAGS) + +endif diff -r 4fbed301c014 -r 9798e3aaa851 extsay-old/extsay_old.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extsay-old/extsay_old.c Fri Apr 02 23:23:58 2010 +0200 @@ -0,0 +1,135 @@ +/* + Copyright 2009,2010 Andreas Fett + Copyright 2010 Mikael Berthe + + Module "extsay_old" -- adds a /extsay_old command + Spawns an external editor + Original code from Andreas Fett. + +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 . +*/ + +#include +#include +#include +#include + +#include +#include +#include + +static void extsay_old_init(void); +static void extsay_old_uninit(void); + +/* Module description */ +module_info_t info_extsay_old = { + .branch = MCABBER_BRANCH, + .api = MCABBER_API_VERSION, + .version = "0.01", + .description = "Use external editor to send a message\n" + "WARNING: use at your own risk - " + "mcabber is stuck while you write a message, " + "this is not recommended!", + .requires = NULL, + .init = extsay_old_init, + .uninit = extsay_old_uninit, + .next = NULL, +}; + +// XXX Not very clean, internal function... +char *load_message_from_file(const char *filename); + +static char* spawn_editor() { + GError *err = NULL; + gchar *argv[] = { NULL, NULL }; + gchar *tmpfile = NULL; + gchar *tmpl = "mcabber-XXXXXX"; + gchar *msg; + gboolean ret; + gint fd; + gint exit_status = 0; + + argv[0] = (gchar*)g_getenv("EDITOR"); + if (argv[0] == NULL) { + scr_LogPrint(LPRINT_NORMAL, "Environment variable EDITOR not set."); + return NULL; + } + + fd = g_file_open_tmp(tmpl, &tmpfile, &err); + if ( fd < 0 ) { + scr_LogPrint(LPRINT_NORMAL, err->message); + g_error_free(err); + return NULL; + } + close(fd); + + argv[1] = tmpfile; + + endwin(); + ret = g_spawn_sync(NULL, argv, NULL, + G_SPAWN_CHILD_INHERITS_STDIN|G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, NULL, &exit_status, &err); + + raw(); + readline_refresh_screen(); + + if (!ret) { + scr_LogPrint(LPRINT_NORMAL, err->message); + return NULL; + } + + if (WEXITSTATUS(exit_status) != EXIT_SUCCESS) { + scr_LogPrint(LPRINT_NORMAL, + "Editor exited with error, discarding message."); + return NULL; + } + + msg = load_message_from_file(tmpfile); + + if (g_unlink(tmpfile) != 0) + scr_LogPrint(LPRINT_NORMAL, "Warning, could not remove temp file."); + + return msg; +} + +static void do_extsay_old(char *args) +{ + char *msg = spawn_editor(); + if (msg) { + say_cmd(msg, 0); + g_free(msg); + } +} + +/* Initialization */ +static void extsay_old_init(void) +{ + /* Add command */ + cmd_add("extsay_old", "Use external editor to write a message", + 0, 0, do_extsay_old, NULL); + scr_LogPrint(LPRINT_NORMAL, "Loading module extsay_old...\n" + "** Be careful, everything is on hold while you run the " + "external editor.\n" + "** Do not run it for too long!" + ); +} + +/* Deinitialization */ +static void extsay_old_uninit(void) +{ + /* Unregister command */ + cmd_del("extsay_old"); +} + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 4fbed301c014 -r 9798e3aaa851 extsay/Makefile.am --- a/extsay/Makefile.am Wed Mar 31 23:01:39 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - -if INSTALL_MODULE_EXTSAY - -pkglib_LTLIBRARIES = libextsay.la -libextsay_la_SOURCES = extsay.c -libextsay_la_LDFLAGS = -module -avoid-version -shared - -LDADD = $(GLIB_LIBS) $(MCABBER_LIBS) -AM_CPPFLAGS = -I$(top_srcdir) $(GLIB_CFLAGS) $(MCABBER_CFLAGS) - -endif diff -r 4fbed301c014 -r 9798e3aaa851 extsay/extsay.c --- a/extsay/extsay.c Wed Mar 31 23:01:39 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -/* - Copyright 2009,2010 Andreas Fett - Copyright 2010 Mikael Berthe - - Module "extsay" -- adds a /extsay command - Spawns an external editor - Original code from Andreas Fett. - -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 . -*/ - -#include -#include -#include -#include - -#include -#include -#include - -static void extsay_init(void); -static void extsay_uninit(void); - -/* Module description */ -module_info_t info_extsay = { - .branch = MCABBER_BRANCH, - .api = MCABBER_API_VERSION, - .version = "0.01", - .description = "Use external editor to send a message\n" - "WARNING: use at your own risk - " - "mcabber is stuck while you write a message, " - "this is not recommended!", - .requires = NULL, - .init = extsay_init, - .uninit = extsay_uninit, - .next = NULL, -}; - -// XXX Not very clean, internal function... -char *load_message_from_file(const char *filename); - -static char* spawn_editor() { - GError *err = NULL; - gchar *argv[] = { NULL, NULL }; - gchar *tmpfile = NULL; - gchar *tmpl = "mcabber-XXXXXX"; - gchar *msg; - gboolean ret; - gint fd; - gint exit_status = 0; - - argv[0] = (gchar*)g_getenv("EDITOR"); - if (argv[0] == NULL) { - scr_LogPrint(LPRINT_NORMAL, "Environment variable EDITOR not set."); - return NULL; - } - - fd = g_file_open_tmp(tmpl, &tmpfile, &err); - if ( fd < 0 ) { - scr_LogPrint(LPRINT_NORMAL, err->message); - g_error_free(err); - return NULL; - } - close(fd); - - argv[1] = tmpfile; - - endwin(); - ret = g_spawn_sync(NULL, argv, NULL, - G_SPAWN_CHILD_INHERITS_STDIN|G_SPAWN_SEARCH_PATH, - NULL, NULL, NULL, NULL, &exit_status, &err); - - raw(); - readline_refresh_screen(); - - if (!ret) { - scr_LogPrint(LPRINT_NORMAL, err->message); - return NULL; - } - - if (WEXITSTATUS(exit_status) != EXIT_SUCCESS) { - scr_LogPrint(LPRINT_NORMAL, - "Editor exited with error, discarding message."); - return NULL; - } - - msg = load_message_from_file(tmpfile); - - if (g_unlink(tmpfile) != 0) - scr_LogPrint(LPRINT_NORMAL, "Warning, could not remove temp file."); - - return msg; -} - -static void do_extsay(char *args) -{ - char *msg = spawn_editor(); - if (msg) { - say_cmd(msg, 0); - g_free(msg); - } -} - -/* Initialization */ -static void extsay_init(void) -{ - /* Add command */ - cmd_add("extsay", "Use external editor to write a message", - 0, 0, do_extsay, NULL); - scr_LogPrint(LPRINT_NORMAL, "Loading module extsay...\n" - "** Be careful, everything is on hold while you run the " - "external editor.\n" - "** Do not run it for too long!" - ); -} - -/* Deinitialization */ -static void extsay_uninit(void) -{ - /* Unregister command */ - cmd_del("extsay"); -} - -/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */