2020-02-26 13:10:59 +00:00
|
|
|
/*
|
|
|
|
#FILENAME#
|
|
|
|
|
|
|
|
#DESCRIPTION#
|
|
|
|
|
|
|
|
Copyright (C) 2001 #AUTHOR#
|
|
|
|
|
|
|
|
Author: #AUTHOR#
|
|
|
|
Date: #DATE#
|
|
|
|
|
|
|
|
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 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, write to:
|
|
|
|
|
|
|
|
Free Software Foundation, Inc.
|
|
|
|
59 Temple Place - Suite 330
|
|
|
|
Boston, MA 02111-1307, USA
|
|
|
|
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
#include <sys/time.h>
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
#include <curses.h>
|
2020-03-19 23:48:40 +00:00
|
|
|
#include <errno.h>
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
#include <panel.h>
|
2020-03-19 23:48:40 +00:00
|
|
|
#include <pthread.h>
|
2020-02-26 16:18:38 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2020-02-27 12:22:10 +00:00
|
|
|
#include <unistd.h>
|
2020-02-26 16:18:38 +00:00
|
|
|
|
|
|
|
#include "QF/dstring.h"
|
2020-02-26 13:10:59 +00:00
|
|
|
#include "QF/progs.h"
|
2020-03-19 14:53:54 +00:00
|
|
|
#include "QF/ringbuffer.h"
|
2020-02-26 13:10:59 +00:00
|
|
|
#include "QF/sys.h"
|
|
|
|
|
|
|
|
#include "qwaq.h"
|
2020-02-27 12:01:09 +00:00
|
|
|
#include "event.h"
|
2020-03-05 15:31:29 +00:00
|
|
|
#include "qwaq-curses.h"
|
2020-03-06 04:54:46 +00:00
|
|
|
#include "qwaq-rect.h"
|
|
|
|
#include "qwaq-textcontext.h"
|
2020-02-26 13:10:59 +00:00
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
#define always_inline inline __attribute__((__always_inline__))
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
#define QUEUE_SIZE 16
|
2020-02-29 07:36:23 +00:00
|
|
|
#define MOUSE_MOVES_ON "\033[?1003h"// Make the terminal report mouse movements
|
|
|
|
#define MOUSE_MOVES_OFF "\033[?1003l"// Make the terminal report mouse movements
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
#define STRING_ID_QUEUE_SIZE 8 // must be > 1
|
2020-03-02 09:30:58 +00:00
|
|
|
#define COMMAND_QUEUE_SIZE 1280
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
#define CMD_SIZE(x) sizeof(x)/sizeof(x[0])
|
|
|
|
|
|
|
|
typedef enum qwaq_commands_e {
|
2020-02-29 03:46:25 +00:00
|
|
|
qwaq_cmd_newwin,
|
|
|
|
qwaq_cmd_delwin,
|
2020-02-29 15:40:55 +00:00
|
|
|
qwaq_cmd_getwrect,
|
2020-02-29 03:46:25 +00:00
|
|
|
qwaq_cmd_new_panel,
|
|
|
|
qwaq_cmd_del_panel,
|
2020-02-29 04:06:58 +00:00
|
|
|
qwaq_cmd_hide_panel,
|
|
|
|
qwaq_cmd_show_panel,
|
|
|
|
qwaq_cmd_top_panel,
|
|
|
|
qwaq_cmd_bottom_panel,
|
|
|
|
qwaq_cmd_move_panel,
|
2020-02-29 15:40:55 +00:00
|
|
|
qwaq_cmd_panel_window,
|
|
|
|
qwaq_cmd_update_panels,
|
|
|
|
qwaq_cmd_doupdate,
|
2020-02-29 03:46:25 +00:00
|
|
|
qwaq_cmd_mvwaddstr,
|
2020-02-29 15:40:55 +00:00
|
|
|
qwaq_cmd_waddstr,
|
2020-03-02 09:24:45 +00:00
|
|
|
qwaq_cmd_mvwaddch,
|
2020-03-06 08:57:33 +00:00
|
|
|
qwaq_cmd_waddch,
|
2020-02-29 05:43:08 +00:00
|
|
|
qwaq_cmd_wrefresh,
|
2020-02-29 05:48:18 +00:00
|
|
|
qwaq_cmd_init_pair,
|
|
|
|
qwaq_cmd_wbkgd,
|
2020-03-19 09:36:15 +00:00
|
|
|
qwaq_cmd_werase,
|
2020-03-03 12:30:47 +00:00
|
|
|
qwaq_cmd_scrollok,
|
2020-03-05 06:44:53 +00:00
|
|
|
qwaq_cmd_move,
|
|
|
|
qwaq_cmd_curs_set,
|
2020-03-05 15:31:29 +00:00
|
|
|
qwaq_cmd_wborder,
|
2020-03-10 09:21:06 +00:00
|
|
|
qwaq_cmd_mvwblit_line,
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
} qwaq_commands;
|
2020-02-26 16:18:38 +00:00
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
static const char *qwaq_command_names[]= {
|
2020-03-05 15:30:11 +00:00
|
|
|
"newwin",
|
|
|
|
"delwin",
|
|
|
|
"getwrect",
|
|
|
|
"new_panel",
|
|
|
|
"del_panel",
|
|
|
|
"hide_panel",
|
|
|
|
"show_panel",
|
|
|
|
"top_panel",
|
|
|
|
"bottom_panel",
|
|
|
|
"move_panel",
|
|
|
|
"panel_window",
|
|
|
|
"update_panels",
|
|
|
|
"doupdate",
|
|
|
|
"mvwaddstr",
|
|
|
|
"waddstr",
|
|
|
|
"mvwaddch",
|
2020-03-08 13:20:46 +00:00
|
|
|
"waddch",
|
2020-03-05 15:30:11 +00:00
|
|
|
"wrefresh",
|
|
|
|
"init_pair",
|
|
|
|
"wbkgd",
|
2020-03-19 09:36:15 +00:00
|
|
|
"werase",
|
2020-03-05 15:30:11 +00:00
|
|
|
"scrollok",
|
|
|
|
"move",
|
|
|
|
"curs_set",
|
2020-03-05 15:31:29 +00:00
|
|
|
"wborder",
|
2020-03-10 09:21:06 +00:00
|
|
|
"mvwblit_line",
|
2020-03-05 15:31:29 +00:00
|
|
|
};
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
typedef struct window_s {
|
|
|
|
WINDOW *win;
|
|
|
|
} window_t;
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
typedef struct panel_s {
|
|
|
|
PANEL *panel;
|
2020-02-29 15:40:55 +00:00
|
|
|
int window_id;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
} panel_t;
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
typedef struct cond_s {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_t rcond;
|
|
|
|
pthread_cond_t wcond;
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_t mut;
|
|
|
|
} cond_t;
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
typedef struct qwaq_resources_s {
|
|
|
|
progs_t *pr;
|
|
|
|
int initialized;
|
2020-02-29 05:38:54 +00:00
|
|
|
window_t stdscr;
|
2020-02-26 16:18:38 +00:00
|
|
|
PR_RESMAP (window_t) window_map;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
PR_RESMAP (panel_t) panel_map;
|
2020-03-19 23:48:40 +00:00
|
|
|
cond_t event_cond;
|
2020-02-28 13:27:29 +00:00
|
|
|
RING_BUFFER (qwaq_event_t, QUEUE_SIZE) event_queue;
|
2020-03-19 23:48:40 +00:00
|
|
|
cond_t command_cond;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
RING_BUFFER (int, COMMAND_QUEUE_SIZE) command_queue;
|
2020-03-19 23:48:40 +00:00
|
|
|
cond_t results_cond;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
RING_BUFFER (int, COMMAND_QUEUE_SIZE) results;
|
2020-03-19 23:48:40 +00:00
|
|
|
cond_t string_id_cond;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
RING_BUFFER (int, STRING_ID_QUEUE_SIZE) string_ids;
|
|
|
|
dstring_t strings[STRING_ID_QUEUE_SIZE - 1];
|
2020-02-26 16:18:38 +00:00
|
|
|
} qwaq_resources_t;
|
|
|
|
|
|
|
|
static window_t *
|
|
|
|
window_new (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
PR_RESNEW (window_t, res->window_map);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
window_free (qwaq_resources_t *res, window_t *win)
|
|
|
|
{
|
|
|
|
PR_RESFREE (window_t, res->window_map, win);
|
|
|
|
}
|
2020-02-26 13:10:59 +00:00
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
static void
|
|
|
|
window_reset (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
PR_RESRESET (window_t, res->window_map);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline window_t *
|
|
|
|
window_get (qwaq_resources_t *res, unsigned index)
|
|
|
|
{
|
|
|
|
PR_RESGET(res->window_map, index);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
window_index (qwaq_resources_t *res, window_t *win)
|
|
|
|
{
|
|
|
|
PR_RESINDEX (res->window_map, win);
|
|
|
|
}
|
|
|
|
|
2020-02-28 13:27:29 +00:00
|
|
|
static always_inline window_t * __attribute__((pure))
|
2020-02-26 16:18:38 +00:00
|
|
|
get_window (qwaq_resources_t *res, const char *name, int handle)
|
|
|
|
{
|
2020-02-29 05:38:54 +00:00
|
|
|
if (handle == 1) {
|
|
|
|
return &res->stdscr;
|
|
|
|
}
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
window_t *window = window_get (res, handle);
|
|
|
|
|
|
|
|
if (!window || !window->win) {
|
|
|
|
PR_RunError (res->pr, "invalid window passed to %s", name + 3);
|
|
|
|
}
|
|
|
|
return window;
|
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static panel_t *
|
|
|
|
panel_new (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
PR_RESNEW (panel_t, res->panel_map);
|
|
|
|
}
|
|
|
|
|
2020-02-26 13:10:59 +00:00
|
|
|
static void
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
panel_free (qwaq_resources_t *res, panel_t *win)
|
2020-02-26 13:10:59 +00:00
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
PR_RESFREE (panel_t, res->panel_map, win);
|
2020-02-26 13:10:59 +00:00
|
|
|
}
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
static void
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
panel_reset (qwaq_resources_t *res)
|
2020-02-26 16:18:38 +00:00
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
PR_RESRESET (panel_t, res->panel_map);
|
|
|
|
}
|
2020-02-26 16:18:38 +00:00
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static inline panel_t *
|
|
|
|
panel_get (qwaq_resources_t *res, unsigned index)
|
|
|
|
{
|
|
|
|
PR_RESGET(res->panel_map, index);
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static inline int
|
|
|
|
panel_index (qwaq_resources_t *res, panel_t *win)
|
2020-02-26 16:18:38 +00:00
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
PR_RESINDEX (res->panel_map, win);
|
|
|
|
}
|
|
|
|
|
|
|
|
static always_inline panel_t * __attribute__((pure))
|
|
|
|
get_panel (qwaq_resources_t *res, const char *name, int handle)
|
|
|
|
{
|
|
|
|
panel_t *panel = panel_get (res, handle);
|
|
|
|
|
|
|
|
if (!panel || !panel->panel) {
|
|
|
|
PR_RunError (res->pr, "invalid panel passed to %s", name + 3);
|
|
|
|
}
|
|
|
|
return panel;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
acquire_string (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int string_id = -1;
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->string_id_cond.mut);
|
|
|
|
while (!RB_DATA_AVAILABLE (res->string_ids)) {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_wait (&res->string_id_cond.rcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->string_id_cond.mut);
|
2020-03-12 17:09:55 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
RB_READ_DATA (res->string_ids, &string_id, 1);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->string_id_cond.wcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->string_id_cond.mut);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
return string_id;
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
release_string (qwaq_resources_t *res, int string_id)
|
2020-02-26 16:18:38 +00:00
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->string_id_cond.mut);
|
|
|
|
while (RB_SPACE_AVAILABLE (res->string_ids)) {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_wait (&res->string_id_cond.wcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->string_id_cond.mut);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
RB_WRITE_DATA (res->string_ids, &string_id, 1);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->string_id_cond.rcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->string_id_cond.mut);
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
2020-03-02 09:15:31 +00:00
|
|
|
static void
|
|
|
|
qwaq_submit_command (qwaq_resources_t *res, const int *cmd)
|
|
|
|
{
|
|
|
|
unsigned len = cmd[1];
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->command_cond.mut);
|
|
|
|
while (RB_SPACE_AVAILABLE (res->command_queue) < len) {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_wait (&res->command_cond.wcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->command_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
RB_WRITE_DATA (res->command_queue, cmd, len);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->command_cond.rcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->command_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_submit_result (qwaq_resources_t *res, const int *result, unsigned len)
|
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->results_cond.mut);
|
|
|
|
while (RB_SPACE_AVAILABLE (res->results) < len) {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_wait (&res->results_cond.wcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->results_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
RB_WRITE_DATA (res->results, result, len);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->results_cond.rcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->results_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_wait_result (qwaq_resources_t *res, int *result, int cmd, unsigned len)
|
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->results_cond.mut);
|
|
|
|
while (RB_DATA_AVAILABLE (res->results) < len
|
2020-03-21 02:36:24 +00:00
|
|
|
|| RB_PEEK_DATA (res->results, 0) != cmd) {
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_wait (&res->results_cond.rcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->results_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
RB_READ_DATA (res->results, result, len);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->results_cond.wcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->results_cond.mut);
|
2020-03-02 09:15:31 +00:00
|
|
|
}
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
cmd_newwin (qwaq_resources_t *res)
|
2020-02-26 16:18:38 +00:00
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
int xpos = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int ypos = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int xlen = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
int ylen = RB_PEEK_DATA (res->command_queue, 5);
|
2020-02-26 16:18:38 +00:00
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
window_t *window = window_new (res);
|
|
|
|
window->win = newwin (ylen, xlen, ypos, xpos);
|
|
|
|
keypad (window->win, TRUE);
|
|
|
|
|
|
|
|
int window_id = window_index (res, window);
|
2020-02-29 03:46:25 +00:00
|
|
|
int cmd_result[] = { qwaq_cmd_newwin, window_id };
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_result (res, cmd_result, CMD_SIZE (cmd_result));
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 02:44:43 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
cmd_delwin (qwaq_resources_t *res)
|
2020-02-29 02:44:43 +00:00
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
delwin (window->win);
|
|
|
|
window_free (res, window);
|
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
|
|
|
cmd_getwrect (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int xpos, ypos;
|
|
|
|
int xlen, ylen;
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
getparyx (window->win, ypos, xpos);
|
|
|
|
if (xpos == -1 && ypos ==-1) {
|
|
|
|
getbegyx (window->win, ypos, xpos);
|
|
|
|
}
|
|
|
|
getmaxyx (window->win, ylen, xlen);
|
|
|
|
|
|
|
|
int cmd_result[] = { qwaq_cmd_getwrect, xpos, ypos, xlen, ylen };
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_result (res, cmd_result, CMD_SIZE (cmd_result));
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 02:44:43 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
cmd_new_panel (qwaq_resources_t *res)
|
2020-02-29 02:44:43 +00:00
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
panel_t *panel = panel_new (res);
|
|
|
|
panel->panel = new_panel (window->win);
|
2020-02-29 15:40:55 +00:00
|
|
|
panel->window_id = window_id;
|
2020-02-29 02:44:43 +00:00
|
|
|
|
|
|
|
int panel_id = panel_index (res, panel);
|
2020-02-29 03:46:25 +00:00
|
|
|
int cmd_result[] = { qwaq_cmd_new_panel, panel_id };
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_result (res, cmd_result, CMD_SIZE (cmd_result));
|
2020-02-29 02:44:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
cmd_del_panel (qwaq_resources_t *res)
|
2020-02-29 02:44:43 +00:00
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
del_panel (panel->panel);
|
|
|
|
panel_free (res, panel);
|
|
|
|
}
|
|
|
|
|
2020-02-29 04:06:58 +00:00
|
|
|
static void
|
|
|
|
cmd_hide_panel (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
hide_panel (panel->panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_show_panel (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
show_panel (panel->panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_top_panel (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
top_panel (panel->panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_bottom_panel (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
bottom_panel (panel->panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_move_panel (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int x = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int y = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
move_panel (panel->panel, y, x);
|
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
|
|
|
cmd_panel_window (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int panel_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
panel_t *panel = get_panel (res, __FUNCTION__, panel_id);
|
|
|
|
|
|
|
|
int window_id = panel->window_id;
|
|
|
|
int cmd_result[] = { qwaq_cmd_panel_window, window_id, };
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_result (res, cmd_result, CMD_SIZE (cmd_result));
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_update_panels (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
update_panels ();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_doupdate (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
doupdate ();
|
|
|
|
}
|
|
|
|
|
2020-02-27 12:22:10 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
cmd_mvwaddstr (qwaq_resources_t *res)
|
2020-02-27 12:22:10 +00:00
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int x = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int y = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
int string_id = RB_PEEK_DATA (res->command_queue, 5);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
mvwaddstr (window->win, y, x, res->strings[string_id].str);
|
|
|
|
release_string (res, string_id);
|
2020-02-29 05:43:08 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
|
|
|
cmd_waddstr (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int string_id = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
waddstr (window->win, res->strings[string_id].str);
|
|
|
|
release_string (res, string_id);
|
|
|
|
}
|
|
|
|
|
2020-03-02 09:24:45 +00:00
|
|
|
static void
|
|
|
|
cmd_mvwaddch (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int x = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int y = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
int ch = RB_PEEK_DATA (res->command_queue, 5);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
mvwaddch (window->win, y, x, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-06 08:57:33 +00:00
|
|
|
static void
|
|
|
|
cmd_waddch (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int ch = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
waddch (window->win, ch);
|
|
|
|
}
|
|
|
|
|
2020-02-29 05:43:08 +00:00
|
|
|
static void
|
|
|
|
cmd_wrefresh (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
2020-02-27 12:22:10 +00:00
|
|
|
wrefresh (window->win);
|
|
|
|
}
|
|
|
|
|
2020-02-29 05:48:18 +00:00
|
|
|
static void
|
|
|
|
cmd_init_pair (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int pair = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int f = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int b = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
|
|
|
|
init_pair (pair, f, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_wbkgd (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int ch = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
wbkgd (window->win, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-19 09:36:15 +00:00
|
|
|
static void
|
|
|
|
cmd_werase (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
werase (window->win);
|
|
|
|
}
|
|
|
|
|
2020-03-03 12:30:47 +00:00
|
|
|
static void
|
|
|
|
cmd_scrollok (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int flag = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
scrollok (window->win, flag);
|
|
|
|
}
|
|
|
|
|
2020-03-05 06:44:53 +00:00
|
|
|
static void
|
|
|
|
cmd_move (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int x = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int y = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
|
|
|
|
move (y, x);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
cmd_curs_set (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int visibility = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
|
|
|
|
curs_set (visibility);
|
|
|
|
}
|
|
|
|
|
2020-03-05 15:31:29 +00:00
|
|
|
static void
|
|
|
|
cmd_wborder (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int ls = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int rs = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
int ts = RB_PEEK_DATA (res->command_queue, 5);
|
|
|
|
int bs = RB_PEEK_DATA (res->command_queue, 6);
|
|
|
|
int tl = RB_PEEK_DATA (res->command_queue, 7);
|
|
|
|
int tr = RB_PEEK_DATA (res->command_queue, 8);
|
|
|
|
int bl = RB_PEEK_DATA (res->command_queue, 9);
|
|
|
|
int br = RB_PEEK_DATA (res->command_queue, 10);
|
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
|
|
|
wborder (window->win, ls, rs, ts, bs, tl, tr, bl, br);
|
|
|
|
}
|
|
|
|
|
2020-03-10 09:21:06 +00:00
|
|
|
static void
|
|
|
|
cmd_mvwblit_line (qwaq_resources_t *res)
|
|
|
|
{
|
|
|
|
int window_id = RB_PEEK_DATA (res->command_queue, 2);
|
|
|
|
int x = RB_PEEK_DATA (res->command_queue, 3);
|
|
|
|
int y = RB_PEEK_DATA (res->command_queue, 4);
|
|
|
|
int chs_id = RB_PEEK_DATA (res->command_queue, 5);
|
|
|
|
int len = RB_PEEK_DATA (res->command_queue, 6);
|
|
|
|
int *chs = (int *) res->strings[chs_id].str;
|
2020-03-12 17:09:55 +00:00
|
|
|
int save_x;
|
|
|
|
int save_y;
|
2020-03-10 09:21:06 +00:00
|
|
|
|
|
|
|
window_t *window = get_window (res, __FUNCTION__, window_id);
|
2020-03-12 17:09:55 +00:00
|
|
|
getyx (window->win, save_y, save_x);
|
2020-03-10 09:21:06 +00:00
|
|
|
for (int i = 0; i < len; i++) {
|
2020-03-19 10:53:32 +00:00
|
|
|
if (chs[i] & 0xff) {
|
|
|
|
mvwaddch (window->win, y, x + i, chs[i]);
|
|
|
|
}
|
2020-03-10 09:21:06 +00:00
|
|
|
}
|
2020-03-12 17:09:55 +00:00
|
|
|
wmove (window->win, save_y, save_x);
|
|
|
|
release_string (res, chs_id);
|
2020-03-10 09:21:06 +00:00
|
|
|
}
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
static void
|
|
|
|
dump_command (qwaq_resources_t *res, int len)
|
|
|
|
{
|
|
|
|
if (0) {
|
|
|
|
qwaq_commands cmd = RB_PEEK_DATA (res->command_queue, 0);
|
|
|
|
Sys_Printf ("%s[%d]", qwaq_command_names[cmd], len);
|
|
|
|
for (int i = 2; i < len; i++) {
|
|
|
|
Sys_Printf (" %d", RB_PEEK_DATA (res->command_queue, i));
|
|
|
|
}
|
|
|
|
Sys_Printf ("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
init_timeout (struct timespec *timeout, long time)
|
|
|
|
{
|
|
|
|
#define SEC 1000000000
|
|
|
|
struct timeval now;
|
|
|
|
gettimeofday(&now, 0);
|
|
|
|
timeout->tv_sec = now.tv_sec;
|
|
|
|
timeout->tv_nsec = now.tv_usec * 1000 + time;
|
|
|
|
if (timeout->tv_nsec > SEC) {
|
|
|
|
timeout->tv_sec += timeout->tv_nsec / SEC;
|
|
|
|
timeout->tv_nsec %= SEC;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
static void
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
process_commands (qwaq_resources_t *res)
|
2020-02-26 16:18:38 +00:00
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
struct timespec timeout;
|
|
|
|
int avail;
|
|
|
|
int len;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
pthread_mutex_lock (&res->command_cond.mut);
|
|
|
|
init_timeout (&timeout, 20 * 1000000);
|
|
|
|
while (RB_DATA_AVAILABLE (res->command_queue) < 2 && ret != ETIMEDOUT) {
|
2020-03-21 02:39:55 +00:00
|
|
|
ret = pthread_cond_timedwait (&res->command_cond.rcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->command_cond.mut, &timeout);
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock (&res->command_cond.mut);
|
|
|
|
|
|
|
|
while ((avail = RB_DATA_AVAILABLE (res->command_queue)) >= 2
|
|
|
|
&& avail >= (len = RB_PEEK_DATA (res->command_queue, 1))) {
|
|
|
|
dump_command (res, len);
|
2020-03-05 15:30:11 +00:00
|
|
|
qwaq_commands cmd = RB_PEEK_DATA (res->command_queue, 0);
|
|
|
|
switch (cmd) {
|
2020-02-29 03:46:25 +00:00
|
|
|
case qwaq_cmd_newwin:
|
|
|
|
cmd_newwin (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
break;
|
2020-02-29 03:46:25 +00:00
|
|
|
case qwaq_cmd_delwin:
|
|
|
|
cmd_delwin (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
break;
|
2020-02-29 15:40:55 +00:00
|
|
|
case qwaq_cmd_getwrect:
|
|
|
|
cmd_getwrect (res);
|
|
|
|
break;
|
2020-02-29 03:46:25 +00:00
|
|
|
case qwaq_cmd_new_panel:
|
|
|
|
cmd_new_panel (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
break;
|
2020-02-29 03:46:25 +00:00
|
|
|
case qwaq_cmd_del_panel:
|
|
|
|
cmd_del_panel (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
break;
|
2020-02-29 04:06:58 +00:00
|
|
|
case qwaq_cmd_hide_panel:
|
|
|
|
cmd_hide_panel (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_show_panel:
|
|
|
|
cmd_show_panel (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_top_panel:
|
|
|
|
cmd_top_panel (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_bottom_panel:
|
|
|
|
cmd_bottom_panel (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_move_panel:
|
|
|
|
cmd_move_panel (res);
|
|
|
|
break;
|
2020-02-29 15:40:55 +00:00
|
|
|
case qwaq_cmd_panel_window:
|
|
|
|
cmd_panel_window (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_update_panels:
|
|
|
|
cmd_update_panels (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_doupdate:
|
|
|
|
cmd_doupdate (res);
|
|
|
|
break;
|
2020-02-29 03:46:25 +00:00
|
|
|
case qwaq_cmd_mvwaddstr:
|
|
|
|
cmd_mvwaddstr (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
break;
|
2020-02-29 15:40:55 +00:00
|
|
|
case qwaq_cmd_waddstr:
|
|
|
|
cmd_waddstr (res);
|
|
|
|
break;
|
2020-03-02 09:24:45 +00:00
|
|
|
case qwaq_cmd_mvwaddch:
|
|
|
|
cmd_mvwaddch (res);
|
|
|
|
break;
|
2020-03-06 08:57:33 +00:00
|
|
|
case qwaq_cmd_waddch:
|
|
|
|
cmd_waddch (res);
|
|
|
|
break;
|
2020-02-29 05:43:08 +00:00
|
|
|
case qwaq_cmd_wrefresh:
|
|
|
|
cmd_wrefresh (res);
|
|
|
|
break;
|
2020-02-29 05:48:18 +00:00
|
|
|
case qwaq_cmd_init_pair:
|
|
|
|
cmd_init_pair (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_wbkgd:
|
|
|
|
cmd_wbkgd (res);
|
|
|
|
break;
|
2020-03-19 09:36:15 +00:00
|
|
|
case qwaq_cmd_werase:
|
|
|
|
cmd_werase (res);
|
|
|
|
break;
|
2020-03-03 12:30:47 +00:00
|
|
|
case qwaq_cmd_scrollok:
|
|
|
|
cmd_scrollok (res);
|
|
|
|
break;
|
2020-03-05 06:44:53 +00:00
|
|
|
case qwaq_cmd_move:
|
|
|
|
cmd_move (res);
|
|
|
|
break;
|
|
|
|
case qwaq_cmd_curs_set:
|
|
|
|
cmd_curs_set (res);
|
|
|
|
break;
|
2020-03-05 15:31:29 +00:00
|
|
|
case qwaq_cmd_wborder:
|
|
|
|
cmd_wborder (res);
|
|
|
|
break;
|
2020-03-10 09:21:06 +00:00
|
|
|
case qwaq_cmd_mvwblit_line:
|
|
|
|
cmd_mvwblit_line (res);
|
|
|
|
break;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->command_cond.mut);
|
|
|
|
RB_DROP_DATA (res->command_queue, len);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->command_cond.wcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->command_cond.mut);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
2020-02-27 12:01:09 +00:00
|
|
|
static void
|
|
|
|
add_event (qwaq_resources_t *res, qwaq_event_t *event)
|
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
struct timespec timeout;
|
|
|
|
int merged = 0;
|
|
|
|
int ret = 0;
|
|
|
|
|
2020-03-04 13:09:40 +00:00
|
|
|
// merge motion events
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->event_cond.mut);
|
2020-03-04 13:09:40 +00:00
|
|
|
unsigned last = RB_DATA_AVAILABLE (res->event_queue);
|
|
|
|
if (event->what == qe_mousemove && last > 1
|
|
|
|
&& RB_PEEK_DATA(res->event_queue, last - 1).what == qe_mousemove) {
|
|
|
|
RB_POKE_DATA(res->event_queue, last - 1, *event);
|
2020-03-19 23:48:40 +00:00
|
|
|
merged = 1;
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->event_cond.rcond);
|
2020-03-04 13:09:40 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_unlock (&res->event_cond.mut);
|
|
|
|
if (merged) {
|
|
|
|
return;
|
2020-02-27 12:01:09 +00:00
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
|
|
|
|
pthread_mutex_lock (&res->event_cond.mut);
|
|
|
|
init_timeout (&timeout, 5000 * 1000000L);
|
|
|
|
while (RB_SPACE_AVAILABLE (res->event_queue) < 1 && ret != ETIMEDOUT) {
|
2020-03-21 02:39:55 +00:00
|
|
|
ret = pthread_cond_timedwait (&res->event_cond.wcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->event_cond.mut, &timeout);
|
|
|
|
}
|
|
|
|
RB_WRITE_DATA (res->event_queue, event, 1);
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->event_cond.rcond);
|
2020-03-21 02:37:08 +00:00
|
|
|
pthread_mutex_unlock (&res->event_cond.mut);
|
2020-02-27 12:01:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
get_event (qwaq_resources_t *res, qwaq_event_t *event)
|
|
|
|
{
|
2020-03-19 23:48:40 +00:00
|
|
|
struct timespec timeout;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
pthread_mutex_lock (&res->event_cond.mut);
|
|
|
|
init_timeout (&timeout, 20 * 1000000);
|
|
|
|
while (RB_DATA_AVAILABLE (res->event_queue) < 1 && ret != ETIMEDOUT) {
|
2020-03-21 02:39:55 +00:00
|
|
|
ret = pthread_cond_timedwait (&res->event_cond.rcond,
|
2020-03-19 23:48:40 +00:00
|
|
|
&res->event_cond.mut, &timeout);
|
|
|
|
}
|
|
|
|
if (event) {
|
|
|
|
if (ret != ETIMEDOUT) {
|
2020-02-28 13:27:29 +00:00
|
|
|
RB_READ_DATA (res->event_queue, event, 1);
|
2020-03-19 23:48:40 +00:00
|
|
|
} else {
|
|
|
|
event->what = qe_none;
|
2020-02-27 12:01:09 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_broadcast (&res->event_cond.wcond);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_lock (&res->event_cond.mut);
|
|
|
|
return ret != ETIMEDOUT;
|
2020-02-27 12:01:09 +00:00
|
|
|
}
|
|
|
|
|
2020-03-04 13:09:40 +00:00
|
|
|
#define M_MOVE REPORT_MOUSE_POSITION
|
|
|
|
#define M_PRESS ( BUTTON1_PRESSED \
|
|
|
|
| BUTTON2_PRESSED \
|
|
|
|
| BUTTON3_PRESSED \
|
|
|
|
| BUTTON4_PRESSED \
|
|
|
|
| BUTTON5_PRESSED)
|
|
|
|
#define M_RELEASE ( BUTTON1_RELEASED \
|
|
|
|
| BUTTON2_RELEASED \
|
|
|
|
| BUTTON3_RELEASED \
|
|
|
|
| BUTTON4_RELEASED \
|
|
|
|
| BUTTON5_RELEASED)
|
|
|
|
#define M_CLICK ( BUTTON1_CLICKED \
|
|
|
|
| BUTTON2_CLICKED \
|
|
|
|
| BUTTON3_CLICKED \
|
|
|
|
| BUTTON4_CLICKED \
|
|
|
|
| BUTTON5_CLICKED)
|
|
|
|
#define M_DCLICK ( BUTTON1_DOUBLE_CLICKED \
|
|
|
|
| BUTTON2_DOUBLE_CLICKED \
|
|
|
|
| BUTTON3_DOUBLE_CLICKED \
|
|
|
|
| BUTTON4_DOUBLE_CLICKED \
|
|
|
|
| BUTTON5_DOUBLE_CLICKED)
|
|
|
|
#define M_TCLICK ( BUTTON1_TRIPLE_CLICKED \
|
|
|
|
| BUTTON2_TRIPLE_CLICKED \
|
|
|
|
| BUTTON3_TRIPLE_CLICKED \
|
|
|
|
| BUTTON4_TRIPLE_CLICKED \
|
|
|
|
| BUTTON5_TRIPLE_CLICKED)
|
|
|
|
|
|
|
|
static void
|
|
|
|
mouse_event (qwaq_resources_t *res, const MEVENT *mevent)
|
|
|
|
{
|
|
|
|
int mask = mevent->bstate;
|
2020-02-27 12:01:09 +00:00
|
|
|
qwaq_event_t event = {};
|
2020-03-04 13:09:40 +00:00
|
|
|
|
2020-03-04 10:10:09 +00:00
|
|
|
event.mouse.x = mevent->x;
|
|
|
|
event.mouse.y = mevent->y;
|
|
|
|
event.mouse.buttons = mevent->bstate;
|
2020-03-04 13:09:40 +00:00
|
|
|
if (mask & M_MOVE) {
|
|
|
|
event.what = qe_mousemove;
|
|
|
|
mask &= ~M_MOVE;
|
|
|
|
}
|
|
|
|
if (mask & M_PRESS) {
|
|
|
|
event.what = qe_mousedown;
|
|
|
|
mask &= ~M_PRESS;
|
|
|
|
}
|
|
|
|
if (mask & M_RELEASE) {
|
|
|
|
event.what = qe_mouseup;
|
|
|
|
mask &= ~M_RELEASE;
|
|
|
|
}
|
|
|
|
if (mask & M_CLICK) {
|
|
|
|
event.what = qe_mouseclick;
|
|
|
|
mask &= ~M_CLICK;
|
|
|
|
event.mouse.click = 1;
|
|
|
|
}
|
|
|
|
if (mask & M_DCLICK) {
|
|
|
|
event.what = qe_mouseclick;
|
|
|
|
mask &= ~M_DCLICK;
|
|
|
|
event.mouse.click = 2;
|
|
|
|
}
|
|
|
|
if (mask & M_TCLICK) {
|
|
|
|
event.what = qe_mouseclick;
|
|
|
|
mask &= ~M_TCLICK;
|
|
|
|
event.mouse.click = 3;
|
|
|
|
}
|
2020-02-27 12:01:09 +00:00
|
|
|
add_event (res, &event);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
key_event (qwaq_resources_t *res, int key)
|
|
|
|
{
|
|
|
|
qwaq_event_t event = {};
|
2020-03-04 13:09:40 +00:00
|
|
|
event.what = qe_keydown;
|
2020-03-04 10:10:09 +00:00
|
|
|
event.key = key;
|
2020-02-27 12:01:09 +00:00
|
|
|
add_event (res, &event);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
process_input (qwaq_resources_t *res)
|
2020-02-27 12:01:09 +00:00
|
|
|
{
|
|
|
|
if (Sys_CheckInput (1, -1)) {
|
|
|
|
int ch;
|
|
|
|
while ((ch = getch ()) != ERR && ch) {
|
|
|
|
fflush (stderr);
|
|
|
|
if (ch == KEY_MOUSE) {
|
|
|
|
MEVENT mevent;
|
|
|
|
getmouse (&mevent);
|
|
|
|
mouse_event (res, &mevent);
|
|
|
|
} else {
|
|
|
|
key_event (res, ch);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static int need_endwin;
|
|
|
|
static void
|
|
|
|
bi_shutdown (void)
|
|
|
|
{
|
|
|
|
if (need_endwin) {
|
2020-02-29 07:36:23 +00:00
|
|
|
write(1, MOUSE_MOVES_OFF, sizeof (MOUSE_MOVES_OFF) - 1);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
endwin ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
bi_newwin (progs_t *pr)
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
int xpos = P_INT (pr, 0);
|
|
|
|
int ypos = P_INT (pr, 1);
|
|
|
|
int xlen = P_INT (pr, 2);
|
|
|
|
int ylen = P_INT (pr, 3);
|
|
|
|
int command[] = {
|
2020-02-29 03:46:25 +00:00
|
|
|
qwaq_cmd_newwin, 0,
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
xpos, ypos, xlen, ylen,
|
|
|
|
};
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
|
2020-03-02 09:15:31 +00:00
|
|
|
int cmd_result[2];
|
|
|
|
qwaq_wait_result (res, cmd_result, qwaq_cmd_newwin, CMD_SIZE (cmd_result));
|
|
|
|
R_INT (pr) = cmd_result[1];
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
bi_delwin (progs_t *pr)
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-02-29 02:44:43 +00:00
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
2020-02-29 03:46:25 +00:00
|
|
|
int command[] = { qwaq_cmd_delwin, 0, window_id, };
|
2020-02-29 02:44:43 +00:00
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 02:44:43 +00:00
|
|
|
}
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_getwrect (progs_t *pr, int window_id)
|
2020-02-29 15:40:55 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_getwrect, 0, window_id, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
|
|
|
|
int cmd_result[5];
|
|
|
|
qwaq_wait_result (res, cmd_result, qwaq_cmd_getwrect,
|
|
|
|
CMD_SIZE (cmd_result));
|
|
|
|
// return xpos, ypos, xlen, ylen
|
|
|
|
(&R_INT (pr))[0] = cmd_result[1];
|
|
|
|
(&R_INT (pr))[1] = cmd_result[2];
|
|
|
|
(&R_INT (pr))[2] = cmd_result[3];
|
|
|
|
(&R_INT (pr))[3] = cmd_result[4];
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_getwrect (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_getwrect (pr, P_INT (pr, 0));
|
|
|
|
}
|
2020-02-29 15:40:55 +00:00
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
bi_new_panel (progs_t *pr)
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-02-29 02:44:43 +00:00
|
|
|
int window_id = P_INT (pr, 0);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
|
2020-02-29 02:44:43 +00:00
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
2020-02-29 03:46:25 +00:00
|
|
|
int command[] = { qwaq_cmd_new_panel, 0, window_id, };
|
2020-02-29 02:44:43 +00:00
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 02:44:43 +00:00
|
|
|
|
2020-03-02 09:15:31 +00:00
|
|
|
int cmd_result[2];
|
|
|
|
qwaq_wait_result (res, cmd_result, qwaq_cmd_new_panel,
|
|
|
|
CMD_SIZE (cmd_result));
|
|
|
|
R_INT (pr) = cmd_result[1];
|
2020-02-29 02:44:43 +00:00
|
|
|
}
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 04:06:58 +00:00
|
|
|
static void
|
|
|
|
panel_command (progs_t *pr, qwaq_commands cmd)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
int panel_id = P_INT (pr, 0);
|
|
|
|
|
|
|
|
if (get_panel (res, __FUNCTION__, panel_id)) {
|
|
|
|
int command[] = { cmd, 0, panel_id, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 04:06:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static void
|
2020-02-29 03:46:25 +00:00
|
|
|
bi_del_panel (progs_t *pr)
|
2020-02-29 04:06:58 +00:00
|
|
|
{
|
|
|
|
panel_command (pr, qwaq_cmd_del_panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_hide_panel (progs_t *pr)
|
|
|
|
{
|
|
|
|
panel_command (pr, qwaq_cmd_hide_panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_show_panel (progs_t *pr)
|
|
|
|
{
|
|
|
|
panel_command (pr, qwaq_cmd_show_panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_top_panel (progs_t *pr)
|
|
|
|
{
|
|
|
|
panel_command (pr, qwaq_cmd_top_panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_bottom_panel (progs_t *pr)
|
|
|
|
{
|
|
|
|
panel_command (pr, qwaq_cmd_bottom_panel);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_move_panel (progs_t *pr)
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-02-29 02:44:43 +00:00
|
|
|
int panel_id = P_INT (pr, 0);
|
2020-02-29 04:06:58 +00:00
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
2020-02-29 02:44:43 +00:00
|
|
|
|
|
|
|
if (get_panel (res, __FUNCTION__, panel_id)) {
|
2020-02-29 04:06:58 +00:00
|
|
|
int command[] = { qwaq_cmd_move_panel, 0, panel_id, x, y, };
|
2020-02-29 02:44:43 +00:00
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 02:44:43 +00:00
|
|
|
}
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
|
|
|
bi_panel_window (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
int panel_id = P_INT (pr, 0);
|
|
|
|
|
|
|
|
if (get_panel (res, __FUNCTION__, panel_id)) {
|
|
|
|
int command[] = { qwaq_cmd_panel_window, 0, panel_id, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 15:40:55 +00:00
|
|
|
|
2020-03-02 09:15:31 +00:00
|
|
|
int cmd_result[2];
|
|
|
|
qwaq_wait_result (res, cmd_result, qwaq_cmd_panel_window,
|
|
|
|
CMD_SIZE (cmd_result));
|
|
|
|
(&R_INT (pr))[0] = cmd_result[1];
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-03-12 17:43:01 +00:00
|
|
|
qwaq_update_panels (progs_t *pr)
|
2020-02-29 15:40:55 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
int command[] = { qwaq_cmd_update_panels, 0, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
2020-03-12 17:43:01 +00:00
|
|
|
static void
|
|
|
|
bi_update_panels (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_update_panels (pr);
|
|
|
|
}
|
2020-02-29 15:40:55 +00:00
|
|
|
|
|
|
|
static void
|
2020-03-12 17:43:01 +00:00
|
|
|
qwaq_doupdate (progs_t *pr)
|
2020-02-29 15:40:55 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
int command[] = { qwaq_cmd_doupdate, 0, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
2020-03-12 17:43:01 +00:00
|
|
|
static void
|
|
|
|
bi_doupdate (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_doupdate (pr);
|
|
|
|
}
|
2020-02-29 15:40:55 +00:00
|
|
|
|
2020-03-17 05:05:31 +00:00
|
|
|
static void
|
|
|
|
qwaq_waddstr (progs_t *pr, int window_id, const char *str)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
|
|
|
qwaq_cmd_waddstr, 0,
|
|
|
|
window_id, string_id
|
|
|
|
};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_copystr (print_buffer, str);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_waddstr (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
const char *str = P_GSTRING (pr, 1);
|
|
|
|
|
|
|
|
qwaq_waddstr (pr, window_id, str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_mvwaddstr (progs_t *pr, int window_id, int x, int y, const char *str)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
|
|
|
qwaq_cmd_mvwaddstr, 0,
|
|
|
|
window_id, x, y, string_id
|
|
|
|
};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_copystr (print_buffer, str);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_mvwaddstr (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
|
|
|
const char *str = P_GSTRING (pr, 3);
|
|
|
|
|
|
|
|
qwaq_mvwaddstr (pr, window_id, x, y, str);
|
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_mvwprintf (progs_t *pr, int window_id, int x, int y, const char *fmt,
|
|
|
|
int count, pr_type_t **args)
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-03-06 04:54:46 +00:00
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
|
|
|
qwaq_cmd_mvwaddstr, 0,
|
|
|
|
window_id, x, y, string_id
|
|
|
|
};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_clearstr (print_buffer);
|
|
|
|
PR_Sprintf (pr, print_buffer, "mvwaddstr", fmt, count, args);
|
|
|
|
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_mvwprintf (progs_t *pr)
|
|
|
|
{
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
|
|
|
const char *fmt = P_GSTRING (pr, 3);
|
|
|
|
int count = pr->pr_argc - 4;
|
|
|
|
pr_type_t **args = pr->pr_params + 4;
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_mvwprintf (pr, window_id, x, y, fmt, count, args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_wprintf (progs_t *pr, int window_id, const char *fmt,
|
|
|
|
int count, pr_type_t **args)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
2020-02-29 03:33:45 +00:00
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_cmd_waddstr, 0,
|
|
|
|
window_id, string_id
|
2020-02-29 03:33:45 +00:00
|
|
|
};
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_clearstr (print_buffer);
|
2020-03-06 04:54:46 +00:00
|
|
|
PR_Sprintf (pr, print_buffer, "waddstr", fmt, count, args);
|
2020-03-02 09:15:31 +00:00
|
|
|
|
|
|
|
qwaq_submit_command (res, command);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
}
|
2020-02-29 15:40:55 +00:00
|
|
|
static void
|
|
|
|
bi_wprintf (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
const char *fmt = P_GSTRING (pr, 1);
|
|
|
|
int count = pr->pr_argc - 2;
|
|
|
|
pr_type_t **args = pr->pr_params + 2;
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_wprintf (pr, window_id, fmt, count, args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_wvprintf (progs_t *pr, int window_id, const char *fmt, pr_va_list_t *args)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
pr_type_t *list_start = PR_GetPointer (pr, args->list);
|
|
|
|
pr_type_t **list = alloca (args->count * sizeof (*list));
|
|
|
|
|
|
|
|
for (int i = 0; i < args->count; i++) {
|
|
|
|
list[i] = list_start + i * pr->pr_param_size;
|
|
|
|
}
|
|
|
|
|
2020-02-29 15:40:55 +00:00
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
|
|
|
qwaq_cmd_waddstr, 0,
|
|
|
|
window_id, string_id
|
|
|
|
};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_clearstr (print_buffer);
|
2020-03-06 04:54:46 +00:00
|
|
|
PR_Sprintf (pr, print_buffer, "waddstr", fmt, args->count, list);
|
2020-03-02 09:15:31 +00:00
|
|
|
|
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 15:40:55 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-03 12:30:47 +00:00
|
|
|
static void
|
|
|
|
bi_wvprintf (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
const char *fmt = P_GSTRING (pr, 1);
|
|
|
|
__auto_type args = (pr_va_list_t *) &P_POINTER (pr, 2);
|
2020-03-06 04:54:46 +00:00
|
|
|
|
|
|
|
qwaq_wvprintf (pr, window_id, fmt, args);
|
|
|
|
}
|
|
|
|
|
2020-03-06 08:57:33 +00:00
|
|
|
static void
|
|
|
|
qwaq_waddch (progs_t *pr, int window_id, int ch)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_waddch, 0, window_id, ch };
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_waddch (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int ch = P_INT (pr, 0);
|
|
|
|
|
|
|
|
qwaq_waddch (pr, window_id, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
qwaq_mvwvprintf (progs_t *pr, int window_id, int x, int y,
|
|
|
|
const char *fmt, pr_va_list_t *args)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-03-03 12:30:47 +00:00
|
|
|
pr_type_t *list_start = PR_GetPointer (pr, args->list);
|
2020-03-04 12:17:17 +00:00
|
|
|
pr_type_t **list = alloca (args->count * sizeof (*list));
|
2020-03-03 12:30:47 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < args->count; i++) {
|
|
|
|
list[i] = list_start + i * pr->pr_param_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int string_id = acquire_string (res);
|
|
|
|
dstring_t *print_buffer = res->strings + string_id;
|
|
|
|
int command[] = {
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_cmd_mvwaddstr, 0,
|
|
|
|
window_id, x, y, string_id
|
2020-03-03 12:30:47 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
dstring_clearstr (print_buffer);
|
|
|
|
PR_Sprintf (pr, print_buffer, "waddstr", fmt, args->count, list);
|
|
|
|
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
2020-03-02 09:24:45 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
bi_mvwvprintf (progs_t *pr)
|
2020-03-02 09:24:45 +00:00
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
2020-03-06 04:54:46 +00:00
|
|
|
const char *fmt = P_GSTRING (pr, 2);
|
|
|
|
__auto_type args = (pr_va_list_t *) &P_POINTER (pr, 3);
|
|
|
|
|
|
|
|
qwaq_mvwvprintf (pr, x, y, window_id, fmt, args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
qwaq_mvwaddch (progs_t *pr, int window_id, int x, int y, int ch)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
2020-03-02 09:24:45 +00:00
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = {
|
|
|
|
qwaq_cmd_mvwaddch, 0,
|
|
|
|
window_id, x, y, ch
|
|
|
|
};
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_mvwaddch (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
|
|
|
int ch = P_INT (pr, 3);
|
|
|
|
|
|
|
|
qwaq_mvwaddch (pr, window_id, x, y, ch);
|
|
|
|
}
|
2020-03-02 09:24:45 +00:00
|
|
|
|
2020-02-29 05:43:08 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_wrefresh (progs_t *pr, int window_id)
|
2020-02-29 05:43:08 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_wrefresh, 0, window_id, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 05:43:08 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_wrefresh (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
|
|
|
|
qwaq_wrefresh (pr, window_id);
|
|
|
|
}
|
2020-02-29 05:43:08 +00:00
|
|
|
|
2020-02-27 12:01:09 +00:00
|
|
|
static void
|
|
|
|
bi_get_event (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
qwaq_event_t *event = &G_STRUCT (pr, qwaq_event_t, P_INT (pr, 0));
|
|
|
|
|
|
|
|
R_INT (pr) = get_event (res, event);
|
|
|
|
}
|
|
|
|
|
2020-02-29 05:48:18 +00:00
|
|
|
static void
|
|
|
|
bi_max_colors (progs_t *pr)
|
|
|
|
{
|
|
|
|
R_INT (pr) = COLORS;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_max_color_pairs (progs_t *pr)
|
|
|
|
{
|
|
|
|
R_INT (pr) = COLOR_PAIRS;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_init_pair (progs_t *pr, int pair, int f, int b)
|
2020-02-29 05:48:18 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
int command[] = { qwaq_cmd_init_pair, 0, pair, f, b, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-02-29 05:48:18 +00:00
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_init_pair (progs_t *pr)
|
|
|
|
{
|
|
|
|
int pair = P_INT (pr, 0);
|
|
|
|
int f = P_INT (pr, 1);
|
|
|
|
int b = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_init_pair (pr, pair, f, b);
|
|
|
|
}
|
2020-02-29 05:48:18 +00:00
|
|
|
|
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_wbkgd (progs_t *pr, int window_id, int ch)
|
2020-02-29 05:48:18 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_wbkgd, 0, window_id, ch, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
2020-03-02 09:15:31 +00:00
|
|
|
qwaq_submit_command (res, command);
|
2020-03-02 09:24:45 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_wbkgd (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int ch = P_INT (pr, 1);
|
|
|
|
|
|
|
|
qwaq_wbkgd (pr, window_id, ch);
|
|
|
|
}
|
2020-02-29 05:48:18 +00:00
|
|
|
|
2020-03-19 09:36:15 +00:00
|
|
|
static void
|
|
|
|
qwaq_werase (progs_t *pr, int window_id, int ch)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_werase, 0, window_id, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_werase (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int ch = P_INT (pr, 1);
|
|
|
|
|
|
|
|
qwaq_werase (pr, window_id, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-03 12:30:47 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_scrollok (progs_t *pr, int window_id, int flag)
|
2020-03-03 12:30:47 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_scrollok, 0, window_id, flag, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_scrollok (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int flag = P_INT (pr, 1);
|
|
|
|
|
|
|
|
qwaq_scrollok (pr, window_id, flag);
|
|
|
|
}
|
2020-03-03 12:30:47 +00:00
|
|
|
|
2020-03-02 09:24:45 +00:00
|
|
|
static const char qwaq_acs_char_map[] = "lmkjtuvwqxnos`afg~,+.-hi0pryz{|}";
|
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_acs_char (progs_t *pr, unsigned acs)
|
2020-03-02 09:24:45 +00:00
|
|
|
{
|
|
|
|
if (acs < 256) {
|
|
|
|
R_INT (pr) = NCURSES_ACS(acs);
|
|
|
|
} else if (acs - 256 < sizeof (qwaq_acs_char_map)) {
|
|
|
|
R_INT (pr) = NCURSES_ACS(qwaq_acs_char_map[acs - 256]);
|
|
|
|
} else {
|
|
|
|
R_INT (pr) = 0;
|
2020-02-29 05:48:18 +00:00
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_acs_char (progs_t *pr)
|
|
|
|
{
|
|
|
|
int acs = P_INT (pr, 0);
|
|
|
|
|
|
|
|
qwaq_acs_char (pr, acs);
|
|
|
|
}
|
2020-02-29 05:48:18 +00:00
|
|
|
|
2020-03-05 06:44:53 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_move (progs_t *pr, int x, int y)
|
2020-03-05 06:44:53 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
int command[] = { qwaq_cmd_move, 0, x, y, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_move (progs_t *pr)
|
|
|
|
{
|
|
|
|
int x = P_INT (pr, 0);
|
|
|
|
int y = P_INT (pr, 1);
|
|
|
|
|
|
|
|
qwaq_move (pr, x, y);
|
|
|
|
}
|
2020-03-05 06:44:53 +00:00
|
|
|
|
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_curs_set (progs_t *pr, int visibility)
|
2020-03-05 06:44:53 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
int command[] = { qwaq_cmd_curs_set, 0, visibility, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_curs_set (progs_t *pr)
|
|
|
|
{
|
|
|
|
int visibility = P_INT (pr, 0);
|
|
|
|
|
|
|
|
qwaq_curs_set (pr, visibility);
|
|
|
|
}
|
2020-03-05 06:44:53 +00:00
|
|
|
|
2020-03-05 15:31:29 +00:00
|
|
|
static void
|
2020-03-06 04:54:46 +00:00
|
|
|
qwaq_wborder (progs_t *pr, int window_id,
|
|
|
|
box_sides_t sides, box_corners_t corns)
|
2020-03-05 15:31:29 +00:00
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int command[] = { qwaq_cmd_wborder, 0, window_id,
|
|
|
|
sides.ls, sides.rs, sides.ts, sides.bs,
|
|
|
|
corns.tl, corns.tr, corns.bl, corns.br, };
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_wborder (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
__auto_type sides = P_PACKED (pr, box_sides_t, 1);
|
|
|
|
__auto_type corns = P_PACKED (pr, box_corners_t, 2);
|
|
|
|
|
|
|
|
qwaq_wborder (pr, window_id, sides, corns);
|
|
|
|
}
|
2020-03-05 15:31:29 +00:00
|
|
|
|
2020-03-10 09:21:06 +00:00
|
|
|
static void
|
|
|
|
qwaq__mvwblit_line (progs_t *pr, int window_id, int x, int y,
|
|
|
|
int *chs, int len)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
if (get_window (res, __FUNCTION__, window_id)) {
|
|
|
|
int chs_id = acquire_string (res);
|
|
|
|
dstring_t *chs_buf = res->strings + chs_id;
|
|
|
|
int command[] = { qwaq_cmd_mvwblit_line, 0, window_id,
|
|
|
|
x, y, chs_id, len,};
|
|
|
|
|
|
|
|
command[1] = CMD_SIZE(command);
|
|
|
|
|
|
|
|
chs_buf->size = len * sizeof (int);
|
|
|
|
dstring_adjust (chs_buf);
|
|
|
|
memcpy (chs_buf->str, chs, len * sizeof (int));
|
|
|
|
|
|
|
|
qwaq_submit_command (res, command);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void
|
|
|
|
bi_mvwblit_line (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_INT (pr, 0);
|
|
|
|
int x = P_INT (pr, 1);
|
|
|
|
int y = P_INT (pr, 2);
|
|
|
|
int *chs = (int *) P_GPOINTER (pr, 3);
|
|
|
|
int len = P_INT (pr, 4);
|
|
|
|
qwaq__mvwblit_line (pr, window_id, x, y, chs, len);
|
|
|
|
}
|
|
|
|
|
2020-03-20 15:01:36 +00:00
|
|
|
static void *
|
2020-03-20 15:14:33 +00:00
|
|
|
qwaq_curses_thread (qwaq_thread_t *thread)
|
2020-03-20 15:01:36 +00:00
|
|
|
{
|
2020-03-20 15:14:33 +00:00
|
|
|
qwaq_resources_t *res = thread->data;
|
2020-03-20 15:01:36 +00:00
|
|
|
|
|
|
|
while (1) {
|
|
|
|
process_commands (res);
|
|
|
|
process_input (res);
|
|
|
|
}
|
|
|
|
thread->return_code = 0;
|
|
|
|
return thread;
|
|
|
|
}
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static void
|
|
|
|
bi_initialize (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
|
|
|
|
initscr ();
|
|
|
|
need_endwin = 1;
|
|
|
|
res->initialized = 1;
|
2020-02-29 05:48:18 +00:00
|
|
|
start_color ();
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
raw ();
|
|
|
|
keypad (stdscr, TRUE);
|
|
|
|
noecho ();
|
|
|
|
nonl ();
|
|
|
|
nodelay (stdscr, TRUE);
|
|
|
|
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
|
2020-02-29 07:36:23 +00:00
|
|
|
write(1, MOUSE_MOVES_ON, sizeof (MOUSE_MOVES_ON) - 1);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
refresh();
|
2020-02-29 05:38:54 +00:00
|
|
|
|
|
|
|
res->stdscr.win = stdscr;
|
2020-03-20 15:01:36 +00:00
|
|
|
|
2020-03-20 15:14:33 +00:00
|
|
|
create_thread (qwaq_curses_thread, res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
2020-03-12 17:37:25 +00:00
|
|
|
static void
|
|
|
|
bi_printf (progs_t *pr)
|
|
|
|
{
|
|
|
|
const char *fmt = P_GSTRING (pr, 0);
|
|
|
|
int count = pr->pr_argc - 1;
|
|
|
|
pr_type_t **args = pr->pr_params + 1;
|
|
|
|
dstring_t *dstr = dstring_new ();
|
|
|
|
|
|
|
|
PR_Sprintf (pr, dstr, "bi_printf", fmt, count, args);
|
|
|
|
if (dstr->str)
|
|
|
|
Sys_Printf (dstr->str, stdout);
|
|
|
|
dstring_delete (dstr);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_c_TextContext__is_initialized (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_resources_t *res = PR_Resources_Find (pr, "qwaq");
|
|
|
|
R_INT (pr) = res->initialized;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__max_colors (progs_t *pr)
|
|
|
|
{
|
|
|
|
bi_max_colors (pr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__max_color_pairs (progs_t *pr)
|
|
|
|
{
|
|
|
|
bi_max_color_pairs (pr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__init_pair_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int pair = P_INT (pr, 2);
|
|
|
|
int f = P_INT (pr, 3);
|
|
|
|
int b = P_INT (pr, 4);
|
|
|
|
|
|
|
|
qwaq_init_pair (pr, pair, f, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__acs_char_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int acs = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_acs_char (pr, acs);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__move_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
Point *pos = &P_PACKED (pr, Point, 2);
|
|
|
|
|
|
|
|
qwaq_move (pr, pos->x, pos->y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__curs_set_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int visibility = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_curs_set (pr, visibility);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_c_TextContext__doupdate (progs_t *pr)
|
|
|
|
{
|
|
|
|
bi_doupdate (pr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_i_TextContext__mvprintf_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
Point *pos = &P_PACKED (pr, Point, 2);
|
|
|
|
const char *fmt = P_GSTRING (pr, 3);
|
|
|
|
int count = pr->pr_argc - 4;
|
|
|
|
pr_type_t **args = pr->pr_params + 4;
|
|
|
|
|
|
|
|
qwaq_mvwprintf (pr, window_id, pos->x, pos->y, fmt, count, args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_i_TextContext__printf_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
const char *fmt = P_GSTRING (pr, 2);
|
|
|
|
int count = pr->pr_argc - 3;
|
|
|
|
pr_type_t **args = pr->pr_params + 3;
|
|
|
|
|
|
|
|
qwaq_wprintf (pr, window_id, fmt, count, args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2020-03-08 13:21:15 +00:00
|
|
|
bi_i_TextContext__vprintf_ (progs_t *pr)
|
2020-03-06 04:54:46 +00:00
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
const char *fmt = P_GSTRING (pr, 2);
|
|
|
|
__auto_type args = (pr_va_list_t *) &P_POINTER (pr, 3);
|
|
|
|
|
|
|
|
qwaq_wvprintf (pr, window_id, fmt, args);
|
|
|
|
}
|
|
|
|
|
2020-03-06 08:57:33 +00:00
|
|
|
static void
|
2020-03-08 13:21:15 +00:00
|
|
|
bi_i_TextContext__addch_ (progs_t *pr)
|
2020-03-06 08:57:33 +00:00
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
2020-03-17 05:05:31 +00:00
|
|
|
int ch = P_INT (pr, 2);
|
2020-03-06 08:57:33 +00:00
|
|
|
|
|
|
|
qwaq_waddch (pr, window_id, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-17 05:05:31 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__addstr_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
const char *str = P_GSTRING (pr, 2);
|
|
|
|
|
|
|
|
qwaq_waddstr (pr, window_id, str);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__mvvprintf_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
Point *pos = &P_PACKED (pr, Point, 2);
|
|
|
|
const char *fmt = P_GSTRING (pr, 3);
|
|
|
|
__auto_type args = (pr_va_list_t *) &P_POINTER (pr, 4);
|
|
|
|
|
|
|
|
qwaq_mvwvprintf (pr, pos->x, pos->y, window_id, fmt, args);
|
|
|
|
}
|
|
|
|
|
2020-03-12 17:43:01 +00:00
|
|
|
static void
|
|
|
|
bi_c_TextContext__refresh (progs_t *pr)
|
|
|
|
{
|
|
|
|
qwaq_update_panels (pr);
|
|
|
|
qwaq_doupdate (pr);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__refresh (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
|
2020-03-12 17:43:01 +00:00
|
|
|
//qwaq_wrefresh (pr, window_id);
|
|
|
|
qwaq_update_panels (pr);
|
|
|
|
if (window_id == 1) {
|
|
|
|
qwaq_doupdate (pr);
|
|
|
|
}
|
2020-03-06 04:54:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_i_TextContext__mvaddch_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
Point *pos = &P_PACKED (pr, Point, 2);
|
|
|
|
int ch = P_INT (pr, 3);
|
|
|
|
|
|
|
|
qwaq_mvwaddch (pr, window_id, pos->x, pos->y, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-17 05:05:31 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__mvaddstr_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
Point *pos = &P_PACKED (pr, Point, 2);
|
|
|
|
const char *str = P_GSTRING (pr, 3);
|
|
|
|
|
|
|
|
qwaq_mvwaddstr (pr, window_id, pos->x, pos->y, str);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__bkgd_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
int ch = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_wbkgd (pr, window_id, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-19 09:36:15 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__clear (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
int ch = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_werase (pr, window_id, ch);
|
|
|
|
}
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
static void
|
|
|
|
bi_i_TextContext__scrollok_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
int flag = P_INT (pr, 2);
|
|
|
|
|
|
|
|
qwaq_scrollok (pr, window_id, flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bi_i_TextContext__border_ (progs_t *pr)
|
|
|
|
{
|
|
|
|
int window_id = P_STRUCT (pr, qwaq_textcontext_t, 0).window;
|
|
|
|
__auto_type sides = P_PACKED (pr, box_sides_t, 2);
|
|
|
|
__auto_type corns = P_PACKED (pr, box_corners_t, 3);
|
|
|
|
|
|
|
|
qwaq_wborder (pr, window_id, sides, corns);
|
|
|
|
}
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
static void
|
|
|
|
bi_qwaq_clear (progs_t *pr, void *data)
|
|
|
|
{
|
|
|
|
__auto_type res = (qwaq_resources_t *) data;
|
|
|
|
|
|
|
|
if (res->initialized) {
|
2020-02-29 07:36:23 +00:00
|
|
|
write(1, MOUSE_MOVES_OFF, sizeof (MOUSE_MOVES_OFF) - 1);
|
2020-02-26 16:18:38 +00:00
|
|
|
endwin ();
|
|
|
|
}
|
|
|
|
need_endwin = 0;
|
|
|
|
window_reset (res);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
panel_reset (res);
|
2020-02-26 16:18:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static builtin_t builtins[] = {
|
|
|
|
{"initialize", bi_initialize, -1},
|
2020-02-29 03:46:25 +00:00
|
|
|
{"create_window", bi_newwin, -1},
|
|
|
|
{"destroy_window", bi_delwin, -1},
|
2020-02-29 15:40:55 +00:00
|
|
|
{"getwrect", bi_getwrect, -1},
|
2020-02-29 03:46:25 +00:00
|
|
|
{"create_panel", bi_new_panel, -1},
|
|
|
|
{"destroy_panel", bi_del_panel, -1},
|
2020-02-29 04:06:58 +00:00
|
|
|
{"hide_panel", bi_hide_panel, -1},
|
|
|
|
{"show_panel", bi_show_panel, -1},
|
|
|
|
{"top_panel", bi_top_panel, -1},
|
|
|
|
{"bottom_panel", bi_bottom_panel, -1},
|
|
|
|
{"move_panel", bi_move_panel, -1},
|
2020-02-29 15:40:55 +00:00
|
|
|
{"panel_window", bi_panel_window, -1},
|
|
|
|
{"update_panels", bi_update_panels, -1},
|
|
|
|
{"doupdate", bi_doupdate, -1},
|
2020-02-27 12:22:10 +00:00
|
|
|
{"mvwprintf", bi_mvwprintf, -1},
|
2020-02-29 15:40:55 +00:00
|
|
|
{"wprintf", bi_wprintf, -1},
|
2020-03-03 12:30:47 +00:00
|
|
|
{"wvprintf", bi_wvprintf, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
{"mvwvprintf", bi_mvwvprintf, -1},
|
2020-03-02 09:24:45 +00:00
|
|
|
{"mvwaddch", bi_mvwaddch, -1},
|
2020-03-06 08:57:33 +00:00
|
|
|
{"waddch", bi_waddch, -1},
|
2020-03-17 05:05:31 +00:00
|
|
|
{"mvwaddstr", bi_mvwaddstr, -1},
|
|
|
|
{"waddstr", bi_waddstr, -1},
|
2020-02-29 05:43:08 +00:00
|
|
|
{"wrefresh", bi_wrefresh, -1},
|
2020-02-27 12:01:09 +00:00
|
|
|
{"get_event", bi_get_event, -1},
|
2020-02-29 05:48:18 +00:00
|
|
|
{"max_colors", bi_max_colors, -1},
|
|
|
|
{"max_color_pairs", bi_max_color_pairs, -1},
|
|
|
|
{"init_pair", bi_init_pair, -1},
|
|
|
|
{"wbkgd", bi_wbkgd, -1},
|
2020-03-19 09:36:15 +00:00
|
|
|
{"werase", bi_werase, -1},
|
2020-03-03 12:30:47 +00:00
|
|
|
{"scrollok", bi_scrollok, -1},
|
2020-03-02 09:24:45 +00:00
|
|
|
{"acs_char", bi_acs_char, -1},
|
2020-03-05 06:44:53 +00:00
|
|
|
{"move", bi_move, -1},
|
|
|
|
{"curs_set", bi_curs_set, -1},
|
2020-03-05 15:31:29 +00:00
|
|
|
{"wborder", bi_wborder, -1},
|
2020-03-10 09:21:06 +00:00
|
|
|
{"mvwblit_line", bi_mvwblit_line, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
|
2020-03-12 17:37:25 +00:00
|
|
|
{"printf", bi_printf, -1},
|
|
|
|
|
2020-03-06 04:54:46 +00:00
|
|
|
{"_c_TextContext__is_initialized", bi_c_TextContext__is_initialized, -1},
|
|
|
|
{"_c_TextContext__max_colors", bi_c_TextContext__max_colors, -1},
|
|
|
|
{"_c_TextContext__max_color_pairs", bi_c_TextContext__max_color_pairs, -1},
|
|
|
|
{"_c_TextContext__init_pair_", bi_c_TextContext__init_pair_, -1},
|
|
|
|
{"_c_TextContext__acs_char_", bi_c_TextContext__acs_char_, -1},
|
|
|
|
{"_c_TextContext__move_", bi_c_TextContext__move_, -1},
|
|
|
|
{"_c_TextContext__curs_set_", bi_c_TextContext__curs_set_, -1},
|
|
|
|
{"_c_TextContext__doupdate", bi_c_TextContext__doupdate, -1},
|
|
|
|
{"_i_TextContext__mvprintf_", bi_i_TextContext__mvprintf_, -1},
|
|
|
|
{"_i_TextContext__printf_", bi_i_TextContext__printf_, -1},
|
|
|
|
{"_i_TextContext__vprintf_", bi_i_TextContext__vprintf_, -1},
|
2020-03-06 08:57:33 +00:00
|
|
|
{"_i_TextContext__addch_", bi_i_TextContext__addch_, -1},
|
2020-03-17 05:05:31 +00:00
|
|
|
{"_i_TextContext__addstr_", bi_i_TextContext__addstr_, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
{"_i_TextContext__mvvprintf_", bi_i_TextContext__mvvprintf_, -1},
|
2020-03-12 17:43:01 +00:00
|
|
|
{"_c_TextContext__refresh", bi_c_TextContext__refresh, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
{"_i_TextContext__refresh", bi_i_TextContext__refresh, -1},
|
|
|
|
{"_i_TextContext__mvaddch_", bi_i_TextContext__mvaddch_, -1},
|
2020-03-17 05:05:31 +00:00
|
|
|
{"_i_TextContext__mvaddstr_", bi_i_TextContext__mvaddstr_, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
{"_i_TextContext__bkgd_", bi_i_TextContext__bkgd_, -1},
|
2020-03-19 09:36:15 +00:00
|
|
|
{"_i_TextContext__clear", bi_i_TextContext__clear, -1},
|
2020-03-06 04:54:46 +00:00
|
|
|
{"_i_TextContext__scrollok_", bi_i_TextContext__scrollok_, -1},
|
|
|
|
{"_i_TextContext__border_", bi_i_TextContext__border_, -1},
|
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
{0}
|
|
|
|
};
|
|
|
|
|
2020-03-06 09:29:16 +00:00
|
|
|
static FILE *logfile;
|
|
|
|
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
static __attribute__((format(printf, 1, 0))) void
|
|
|
|
qwaq_print (const char *fmt, va_list args)
|
|
|
|
{
|
2020-03-06 09:29:16 +00:00
|
|
|
vfprintf (logfile, fmt, args);
|
|
|
|
fflush (logfile);
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
}
|
|
|
|
|
2020-03-19 23:48:40 +00:00
|
|
|
static void
|
|
|
|
qwaq_init_cond (cond_t *cond)
|
|
|
|
{
|
2020-03-21 02:39:55 +00:00
|
|
|
pthread_cond_init (&cond->rcond, 0);
|
|
|
|
pthread_cond_init (&cond->wcond, 0);
|
2020-03-19 23:48:40 +00:00
|
|
|
pthread_mutex_init (&cond->mut, 0);
|
|
|
|
}
|
|
|
|
|
2020-02-26 13:10:59 +00:00
|
|
|
void
|
|
|
|
BI_Init (progs_t *pr)
|
|
|
|
{
|
2020-02-26 16:18:38 +00:00
|
|
|
qwaq_resources_t *res = calloc (sizeof (*res), 1);
|
|
|
|
res->pr = pr;
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
for (int i = 0; i < STRING_ID_QUEUE_SIZE - 1; i++) {
|
|
|
|
RB_WRITE_DATA (res->string_ids, &i, 1);
|
|
|
|
res->strings[i].mem = &dstring_default_mem;
|
|
|
|
}
|
2020-03-19 23:48:40 +00:00
|
|
|
qwaq_init_cond (&res->event_cond);
|
|
|
|
qwaq_init_cond (&res->command_cond);
|
|
|
|
qwaq_init_cond (&res->results_cond);
|
|
|
|
qwaq_init_cond (&res->string_id_cond);
|
2020-02-26 13:10:59 +00:00
|
|
|
|
2020-02-26 16:18:38 +00:00
|
|
|
PR_Resources_Register (pr, "qwaq", res, bi_qwaq_clear);
|
|
|
|
PR_RegisterBuiltins (pr, builtins);
|
2020-02-26 13:10:59 +00:00
|
|
|
Sys_RegisterShutdown (bi_shutdown);
|
2020-03-06 09:29:16 +00:00
|
|
|
logfile = fopen ("qwaq-curses.log", "wt");
|
[qwaq] Prepare for threading
So far, no threading has been set up, and only window creation and
printing have been updated, but the basics of the design seem to be
sound.
The builtin functions now no longer call ncurses directly: the build
commands and write them to a command buffer.
Commands that have return values (eg, window creation) write their
results to a results buffer that the originating builtin function
reads. Builtin functions that expect a result "poll" the results buffer
for the correct result (marked by the same command). In a single
UI-thread environment, the results should always be in the same order as
the commands, and in a multi-UI-thread environment, things should
(fingers crossed) sort themselves out as ONE of the threads will be the
originator of the next available result.
Strings in commands (eg, for printing) are handled by acquiring a string
id (index into an array of dstring_t) and including the string id in the
written command. The string id is released upon completion of the
command.
Builtin functions write commands, acquire string ids, and read results.
The command processor reads commands, releases string ids, and writes
results.
Since commands, string ids, and results are all in ring buffers, and
assuming there is only one thread running the builtin functions and only
one thread processing commands (there can be only one because ncurses is
not thread-safe), then there should never be any contention on the
buffers. Of course, if there are multiple threads running the builtin
functions, then locking will be required on the builtin function side.
2020-02-28 16:45:33 +00:00
|
|
|
Sys_SetStdPrintf (qwaq_print);
|
2020-02-26 13:10:59 +00:00
|
|
|
}
|