mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Added PROCESS_REC to fe-exec.h and perl support for it. "exec new" and
"exec remove" sends PROCESS_REC as first argument. Added "exec input" signal to perl. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1212 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
ea4dea38c0
commit
f4aef7c706
@ -28,48 +28,13 @@
|
|||||||
#include "levels.h"
|
#include "levels.h"
|
||||||
|
|
||||||
#include "printtext.h"
|
#include "printtext.h"
|
||||||
|
#include "fe-exec.h"
|
||||||
#include "fe-windows.h"
|
#include "fe-windows.h"
|
||||||
#include "window-items.h"
|
#include "window-items.h"
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#define EXEC_WI(query) \
|
|
||||||
MODULE_CHECK_CAST_MODULE(query, EXEC_WI_REC, type, \
|
|
||||||
"WINDOW ITEM TYPE", "EXEC")
|
|
||||||
|
|
||||||
#define IS_EXEC_WI(query) \
|
|
||||||
(EXEC_WI(query) ? TRUE : FALSE)
|
|
||||||
|
|
||||||
typedef struct PROCESS_REC PROCESS_REC;
|
|
||||||
|
|
||||||
#define STRUCT_SERVER_REC void
|
|
||||||
typedef struct {
|
|
||||||
#include "window-item-rec.h"
|
|
||||||
PROCESS_REC *process;
|
|
||||||
unsigned int destroying:1;
|
|
||||||
} EXEC_WI_REC;
|
|
||||||
|
|
||||||
struct PROCESS_REC {
|
|
||||||
int id;
|
|
||||||
char *name;
|
|
||||||
char *args;
|
|
||||||
|
|
||||||
int pid;
|
|
||||||
GIOChannel *in;
|
|
||||||
NET_SENDBUF_REC *out;
|
|
||||||
LINEBUF_REC *databuf;
|
|
||||||
int read_tag;
|
|
||||||
|
|
||||||
char *target; /* send text with /msg <target> ... */
|
|
||||||
WINDOW_REC *target_win; /* print text to this window */
|
|
||||||
EXEC_WI_REC *target_item; /* print text to this exec window item */
|
|
||||||
|
|
||||||
unsigned int shell:1; /* start the program via /bin/sh */
|
|
||||||
unsigned int notice:1; /* send text with /notice, not /msg if target is set */
|
|
||||||
unsigned int silent:1; /* don't print "process exited with level xx" */
|
|
||||||
};
|
|
||||||
|
|
||||||
static GSList *processes;
|
static GSList *processes;
|
||||||
static int signal_exec_input;
|
static int signal_exec_input;
|
||||||
|
|
||||||
@ -198,8 +163,7 @@ static void process_destroy(PROCESS_REC *rec, int status)
|
|||||||
{
|
{
|
||||||
processes = g_slist_remove(processes, rec);
|
processes = g_slist_remove(processes, rec);
|
||||||
|
|
||||||
signal_emit("exec remove", 4, GINT_TO_POINTER(rec->id), rec->name,
|
signal_emit("exec remove", 2, rec, GINT_TO_POINTER(status));
|
||||||
GINT_TO_POINTER(rec->pid), GINT_TO_POINTER(status));
|
|
||||||
|
|
||||||
if (rec->read_tag != -1)
|
if (rec->read_tag != -1)
|
||||||
g_source_remove(rec->read_tag);
|
g_source_remove(rec->read_tag);
|
||||||
@ -535,8 +499,7 @@ static void handle_exec(const char *args, GHashTable *optlist,
|
|||||||
if (rec->target == NULL && interactive)
|
if (rec->target == NULL && interactive)
|
||||||
rec->target_item = exec_wi_create(active_win, rec);
|
rec->target_item = exec_wi_create(active_win, rec);
|
||||||
|
|
||||||
signal_emit("exec new", 4, GINT_TO_POINTER(rec->id), rec->name,
|
signal_emit("exec new", 1, rec);
|
||||||
GINT_TO_POINTER(rec->pid), rec->args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SYNTAX: EXEC [-] [-nosh] [-out | -msg <target> | -notice <target>]
|
/* SYNTAX: EXEC [-] [-nosh] [-out | -msg <target> | -notice <target>]
|
||||||
|
45
src/fe-common/core/fe-exec.h
Normal file
45
src/fe-common/core/fe-exec.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#ifndef __FE_EXEC_H
|
||||||
|
#define __FE_EXEC_H
|
||||||
|
|
||||||
|
#include "fe-windows.h"
|
||||||
|
|
||||||
|
#define EXEC_WI(query) \
|
||||||
|
MODULE_CHECK_CAST_MODULE(query, EXEC_WI_REC, type, \
|
||||||
|
"WINDOW ITEM TYPE", "EXEC")
|
||||||
|
|
||||||
|
#define IS_EXEC_WI(query) \
|
||||||
|
(EXEC_WI(query) ? TRUE : FALSE)
|
||||||
|
|
||||||
|
typedef struct PROCESS_REC PROCESS_REC;
|
||||||
|
|
||||||
|
#define STRUCT_SERVER_REC void
|
||||||
|
typedef struct {
|
||||||
|
#include "window-item-rec.h"
|
||||||
|
PROCESS_REC *process;
|
||||||
|
unsigned int destroying:1;
|
||||||
|
} EXEC_WI_REC;
|
||||||
|
|
||||||
|
struct PROCESS_REC {
|
||||||
|
int id;
|
||||||
|
char *name;
|
||||||
|
char *args;
|
||||||
|
|
||||||
|
int pid;
|
||||||
|
GIOChannel *in;
|
||||||
|
NET_SENDBUF_REC *out;
|
||||||
|
LINEBUF_REC *databuf;
|
||||||
|
int read_tag;
|
||||||
|
|
||||||
|
char *target; /* send text with /msg <target> ... */
|
||||||
|
WINDOW_REC *target_win; /* print text to this window */
|
||||||
|
EXEC_WI_REC *target_item; /* print text to this exec window item */
|
||||||
|
|
||||||
|
unsigned int shell:1; /* start the program via /bin/sh */
|
||||||
|
unsigned int notice:1; /* send text with /notice, not /msg if target is set */
|
||||||
|
unsigned int silent:1; /* don't print "process exited with level xx" */
|
||||||
|
};
|
||||||
|
|
||||||
|
void fe_exec_init(void);
|
||||||
|
void fe_exec_deinit(void);
|
||||||
|
|
||||||
|
#endif
|
@ -43,6 +43,7 @@ while (<STDIN>) {
|
|||||||
# fe-common
|
# fe-common
|
||||||
s/THEME_REC[^,]*/Irssi::Theme/g;
|
s/THEME_REC[^,]*/Irssi::Theme/g;
|
||||||
s/KEYINFO_REC[^,]*/Irssi::Keyinfo/g;
|
s/KEYINFO_REC[^,]*/Irssi::Keyinfo/g;
|
||||||
|
s/PROCESS_REC[^,]*/Irssi::Process/g;
|
||||||
s/WINDOW_REC[^,]*/Irssi::Window/g;
|
s/WINDOW_REC[^,]*/Irssi::Window/g;
|
||||||
s/WI_ITEM_REC[^,]*/iobject/g;
|
s/WI_ITEM_REC[^,]*/iobject/g;
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
#include "perl-common.h"
|
#include "perl-common.h"
|
||||||
|
|
||||||
|
#include "fe-common/core/fe-exec.h"
|
||||||
#include "fe-common/core/formats.h"
|
#include "fe-common/core/formats.h"
|
||||||
#include "fe-common/core/printtext.h"
|
#include "fe-common/core/printtext.h"
|
||||||
|
|
||||||
@ -390,6 +391,25 @@ void perl_reconnect_fill_hash(HV *hv, RECONNECT_REC *reconnect)
|
|||||||
hv_store(hv, "next_connect", 12, newSViv(reconnect->next_connect), 0);
|
hv_store(hv, "next_connect", 12, newSViv(reconnect->next_connect), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void perl_process_fill_hash(HV *hv, PROCESS_REC *process)
|
||||||
|
{
|
||||||
|
HV *stash;
|
||||||
|
|
||||||
|
hv_store(hv, "id", 2, newSViv(process->id), 0);
|
||||||
|
hv_store(hv, "name", 4, new_pv(process->name), 0);
|
||||||
|
hv_store(hv, "args", 4, new_pv(process->args), 0);
|
||||||
|
|
||||||
|
hv_store(hv, "pid", 3, newSViv(process->pid), 0);
|
||||||
|
hv_store(hv, "target", 6, new_pv(process->target), 0);
|
||||||
|
if (process->target_win != NULL) {
|
||||||
|
stash = gv_stashpv("Irssi::Window", 0);
|
||||||
|
hv_store(hv, "target_win", 10, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(process->target_win))), stash), 0);
|
||||||
|
}
|
||||||
|
hv_store(hv, "shell", 5, newSViv(process->shell), 0);
|
||||||
|
hv_store(hv, "notice", 6, newSViv(process->notice), 0);
|
||||||
|
hv_store(hv, "silent", 6, newSViv(process->silent), 0);
|
||||||
|
}
|
||||||
|
|
||||||
void perl_window_fill_hash(HV *hv, WINDOW_REC *window)
|
void perl_window_fill_hash(HV *hv, WINDOW_REC *window)
|
||||||
{
|
{
|
||||||
hv_store(hv, "refnum", 6, newSViv(window->refnum), 0);
|
hv_store(hv, "refnum", 6, newSViv(window->refnum), 0);
|
||||||
@ -567,6 +587,7 @@ void perl_common_init(void)
|
|||||||
{ "Irssi::Logitem", (PERL_OBJECT_FUNC) perl_log_item_fill_hash },
|
{ "Irssi::Logitem", (PERL_OBJECT_FUNC) perl_log_item_fill_hash },
|
||||||
{ "Irssi::Rawlog", (PERL_OBJECT_FUNC) perl_rawlog_fill_hash },
|
{ "Irssi::Rawlog", (PERL_OBJECT_FUNC) perl_rawlog_fill_hash },
|
||||||
{ "Irssi::Reconnect", (PERL_OBJECT_FUNC) perl_rawlog_fill_hash },
|
{ "Irssi::Reconnect", (PERL_OBJECT_FUNC) perl_rawlog_fill_hash },
|
||||||
|
{ "Irssi::Process", (PERL_OBJECT_FUNC) perl_process_fill_hash },
|
||||||
{ "Irssi::Window", (PERL_OBJECT_FUNC) perl_window_fill_hash },
|
{ "Irssi::Window", (PERL_OBJECT_FUNC) perl_window_fill_hash },
|
||||||
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
Loading…
Reference in New Issue
Block a user