mirror of
https://github.com/profanity-im/profanity.git
synced 2025-07-26 12:14:28 -04:00
Editor command: filename / sensible-editor
* Generating a unique file name in tmp_dir folder * Changed exec of vim to exec of sensible-editor * Test file exists and create file with "private" rights * Send a preview of the message in the window * Delete temp file
This commit is contained in:
parent
8be8f75b87
commit
35b0b0f194
@ -9314,33 +9314,74 @@ cmd_change_password(ProfWin* window, const char* const command, gchar** args)
|
|||||||
gboolean
|
gboolean
|
||||||
cmd_editor(ProfWin* window, const char* const command, gchar** args)
|
cmd_editor(ProfWin* window, const char* const command, gchar** args)
|
||||||
{
|
{
|
||||||
const char* filename = "/tmp/profanity.txt";
|
/* Build temp file name */
|
||||||
|
GString * tempfile = g_string_new(g_get_tmp_dir());
|
||||||
|
g_string_append(tempfile, "/profanity-");
|
||||||
|
xmpp_ctx_t* const ctx = connection_get_ctx();
|
||||||
|
if(!ctx) {
|
||||||
|
cons_show("Editor: Not connection");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
char* uuid = xmpp_uuid_gen(ctx);
|
||||||
|
g_string_append(tempfile, uuid);
|
||||||
|
if (uuid) {
|
||||||
|
xmpp_free(ctx, uuid);
|
||||||
|
}
|
||||||
|
g_string_append(tempfile, ".txt");
|
||||||
|
|
||||||
|
// tempfile should be something like
|
||||||
|
// /tmp/profanity-f2f271dd-98c8-4118-8d47-3bd49c8e2e63.txt
|
||||||
|
const char* filename = tempfile->str;
|
||||||
|
|
||||||
|
// Check if file exists and create file
|
||||||
|
if (g_file_test(filename, G_FILE_TEST_EXISTS)) {
|
||||||
|
cons_show("Editor: The temp file exists");
|
||||||
|
g_string_free (tempfile, TRUE);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GError* creation_error = NULL;
|
||||||
|
GFile* file = g_file_new_for_path(filename);
|
||||||
|
GFileOutputStream* fos = g_file_create (file,
|
||||||
|
G_FILE_CREATE_PRIVATE, NULL,
|
||||||
|
&creation_error);
|
||||||
|
if ( creation_error ) {
|
||||||
|
cons_show("Editor: Error during file creation");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
g_object_unref(fos);
|
||||||
|
|
||||||
|
// Fork / exec
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if( pid == 0 ) {
|
if( pid == 0 ) {
|
||||||
int x = execl("/usr/bin/vim", "/usr/bin/vim", filename, (char *) NULL);
|
int x = execl("/usr/bin/sensible-editor", "/usr/bin/sensible-editor", g_file_get_path(file), (char *) NULL);
|
||||||
if ( x == -1 ) {
|
if ( x == -1 ) {
|
||||||
cons_show_error("Failed to exec vim");
|
cons_show_error("Failed to exec sensible-editor");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int status = 0;
|
int status = 0;
|
||||||
waitpid(pid, &status, 0);
|
waitpid(pid, &status, 0);
|
||||||
ui_redraw();
|
int fd_input_file = open(g_file_get_path(file), O_RDONLY);
|
||||||
|
|
||||||
int fd_input_file = open(filename, O_RDONLY);
|
|
||||||
const size_t COUNT = 8192;
|
const size_t COUNT = 8192;
|
||||||
char buf[COUNT];
|
char buf[COUNT];
|
||||||
ssize_t size_read = read(fd_input_file, buf, COUNT);
|
ssize_t size_read = read(fd_input_file, buf, COUNT);
|
||||||
if(size_read > 0 && size_read <= COUNT ) {
|
if(size_read > 0 && size_read <= COUNT ) {
|
||||||
buf[size_read-1] = '\0';
|
buf[size_read-1] = '\0';
|
||||||
GString* text = g_string_new(buf);
|
GString* text = g_string_new(buf);
|
||||||
//ProfWin* window = wins_get_current();
|
ProfWin* win = wins_get_current();
|
||||||
//cmd_process_input(window, text->str);
|
win_println(win, THEME_DEFAULT, "!", "EDITOR PREVIEW: %s", text->str);
|
||||||
rl_insert_text(text->str);
|
rl_insert_text(text->str);
|
||||||
g_string_free(text, TRUE);
|
g_string_free(text, TRUE);
|
||||||
}
|
}
|
||||||
close(fd_input_file);
|
close(fd_input_file);
|
||||||
ui_redraw();
|
ui_redraw();
|
||||||
|
GError* deletion_error = NULL;
|
||||||
|
g_file_delete (file, NULL, &deletion_error);
|
||||||
|
if ( deletion_error ) {
|
||||||
|
cons_show("Editor: Error during file deletion");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
g_object_unref(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user