/*
* Copyright (C) 2012-2023 Robin Haberkorn
*
* This program 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 3 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 .
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include
#include
#include
#include "sciteco.h"
#include "string-utils.h"
#include "undo.h"
#include "view.h"
#include "interface.h"
//#define DEBUG
teco_view_t *teco_interface_current_view = NULL;
TECO_DEFINE_UNDO_CALL(teco_interface_show_view, teco_view_t *);
TECO_DEFINE_UNDO_CALL(teco_interface_ssm, unsigned int, uptr_t, sptr_t);
TECO_DEFINE_UNDO_CALL(teco_interface_info_update_qreg, const teco_qreg_t *);
TECO_DEFINE_UNDO_CALL(teco_interface_info_update_buffer, const teco_buffer_t *);
typedef struct {
teco_string_t str;
gchar name[];
} teco_undo_set_clipboard_t;
static void
teco_undo_set_clipboard_action(teco_undo_set_clipboard_t *ctx, gboolean run)
{
if (run)
teco_interface_set_clipboard(ctx->name, ctx->str.data, ctx->str.len, NULL);
teco_string_clear(&ctx->str);
}
/**
* Set the clipboard upon rubout.
*
* This passes ownership of the clipboard content string
* to the undo token object.
*/
void
teco_interface_undo_set_clipboard(const gchar *name, gchar *str, gsize len)
{
teco_undo_set_clipboard_t *ctx;
ctx = teco_undo_push_size((teco_undo_action_t)teco_undo_set_clipboard_action,
sizeof(*ctx) + strlen(name) + 1);
if (ctx) {
ctx->str.data = str;
ctx->str.len = len;
strcpy(ctx->name, name);
} else {
g_free(str);
}
}
/**
* Print a message to the appropriate stdio streams.
*
* This method has similar semantics to `vprintf`, i.e.
* it leaves `ap` undefined. Therefore to pass the format
* string and arguments to another `vprintf`-like function,
* you have to copy the arguments via `va_copy`.
*/
void
teco_interface_stdio_vmsg(teco_msg_t type, const gchar *fmt, va_list ap)
{
FILE *stream = stdout;
switch (type) {
case TECO_MSG_USER:
break;
case TECO_MSG_INFO:
fputs("Info: ", stream);
break;
case TECO_MSG_WARNING:
stream = stderr;
fputs("Warning: ", stream);
break;
case TECO_MSG_ERROR:
stream = stderr;
fputs("Error: ", stream);
break;
}
g_vfprintf(stream, fmt, ap);
fputc('\n', stream);
}
void
teco_interface_process_notify(SCNotification *notify)
{
#ifdef DEBUG
g_printf("SCINTILLA NOTIFY: code=%d\n", notify->nmhdr.code);
#endif
}