Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
2a912510
Commit
2a912510
authored
2 months ago
by
Deucе
Browse files
Options
Downloads
Patches
Plain Diff
Just because we're *compiled* with graphics support doesn't mean
we support them in the current mode. Fixes issue 175
parent
f7f91ac7
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/syncterm/ripper.c
+469
-462
469 additions, 462 deletions
src/syncterm/ripper.c
with
469 additions
and
462 deletions
src/syncterm/ripper.c
+
469
−
462
View file @
2a912510
...
...
@@ -15870,297 +15870,299 @@ size_t
parse_rip(BYTE *origbuf, unsigned blen, unsigned maxlen)
{
#ifdef HAS_VSTAT
unsigned pos = 0;
size_t rip_start = maxlen + 1;
bool copy = false;
BYTE *buf = origbuf;
/*
* TODO: Downloads are broken when RIP is enabled...
* This should certainly be fixed someday.
*/
if ((rip.enabled == false) || rip_suspended)
return blen;
if (cio_api.options & CONIO_OPT_SET_PIXEL) {
unsigned pos = 0;
size_t rip_start = maxlen + 1;
bool copy = false;
BYTE *buf = origbuf;
/*
* TODO: Downloads are broken when RIP is enabled...
* This should certainly be fixed someday.
*/
if ((rip.enabled == false) || rip_suspended)
return blen;
shadow_palette();
switch (rip.state) {
case RIP_STATE_BOL:
case RIP_STATE_MOL:
break;
default:
rip_start = 0;
break;
}
if (blen == 0) {
if (rip_start == 0) {
unsigned zer = 0;
handle_rip_line(origbuf, &zer, &pos, &rip_start, maxlen, RIP_STATE_FLUSHING);
copy = true;
blen = moredata_len;
if (blen == 0) {
shadow_palette();
switch (rip.state) {
case RIP_STATE_BOL:
case RIP_STATE_MOL:
break;
default:
rip_start = 0;
break;
}
if (blen == 0) {
if (rip_start == 0) {
unsigned zer = 0;
handle_rip_line(origbuf, &zer, &pos, &rip_start, maxlen, RIP_STATE_FLUSHING);
copy = true;
blen = moredata_len;
if (blen == 0) {
normal_palette();
return blen;
}
buf = moredata;
moredata = NULL;
moredata_len = 0;
moredata_size = 0;
}
else {
normal_palette();
return blen;
}
buf = moredata;
moredata = NULL;
moredata_len = 0;
moredata_size = 0;
}
else {
normal_palette();
return blen;
}
}
else {
if ((rip.state == RIP_STATE_CR) && (buf[0] != '\n'))
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_BOL);
}
for (pos = 0; pos < blen; pos++) {
// TODO: \n handling could likely be moved into main switch
if ((rip.state == RIP_STATE_CR) && (buf[pos] != '\n')) {
if (pos > 0) {
pos--;
if ((rip.state == RIP_STATE_CR) && (buf[0] != '\n'))
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_BOL);
rip.lchars = 0;
continue;
}
}
if (buf[pos] == '\n') {
switch (rip.state) {
// Normal ending to a RIP line...
case RIP_STATE_CR:
for (pos = 0; pos < blen; pos++) {
// TODO: \n handling could likely be moved into main switch
if ((rip.state == RIP_STATE_CR) && (buf[pos] != '\n')) {
if (pos > 0) {
pos--;
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_BOL);
rip.lchars = 0;
continue;
}
}
if (buf[pos] == '\n') {
switch (rip.state) {
// Normal ending to a RIP line...
case RIP_STATE_CR:
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_BOL);
rip.lchars = 0;
continue;
// Continuation of line ending in CRLF
case RIP_STATE_CONT_PIPE:
case RIP_STATE_CONT_LEVEL:
case RIP_STATE_CONT_SUBLEVEL:
case RIP_STATE_CONT_CMD:
case RIP_STATE_CONT_ENDED:
rip.state -= (RIP_STATE_CONT_PIPE - RIP_STATE_PIPE);
continue;
break;
// Continuation of line ending in CRLF
case RIP_STATE_CONT_PIPE:
case RIP_STATE_CONT_LEVEL:
case RIP_STATE_CONT_SUBLEVEL:
case RIP_STATE_CONT_CMD:
case RIP_STATE_CONT_ENDED:
rip.state -= (RIP_STATE_CONT_PIPE - RIP_STATE_PIPE);
continue;
break;
// Not a RIP line...
case RIP_STATE_ESC:
case RIP_STATE_CSI:
case RIP_STATE_CSINUM:
case RIP_STATE_BANG:
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
continue;
// Not a RIP line...
case RIP_STATE_ESC:
case RIP_STATE_CSI:
case RIP_STATE_CSINUM:
case RIP_STATE_BANG:
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
continue;
// No change in state
case RIP_STATE_BOL:
case RIP_STATE_MOL:
continue;
// No change in state
case RIP_STATE_BOL:
case RIP_STATE_MOL:
continue;
// (TODO: Incorrectly?) Interpreted as a parameter byte (or whatever)
default:
break;
// (TODO: Incorrectly?) Interpreted as a parameter byte (or whatever)
default:
break;
}
}
else if (buf[pos] == '\r') {
switch (rip.state) {
case RIP_STATE_BACKSLASH_PIPE:
case RIP_STATE_BACKSLASH_LEVEL:
case RIP_STATE_BACKSLASH_SUBLEVEL:
case RIP_STATE_BACKSLASH_CMD:
case RIP_STATE_BACKSLASH_ENDED:
break;
case RIP_STATE_ESC:
case RIP_STATE_CSI:
case RIP_STATE_CSINUM:
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_BOL;
rip.lchars = 0;
continue;
case RIP_STATE_BOL:
case RIP_STATE_MOL:
rip.state = RIP_STATE_BOL;
rip.lchars = 0;
continue;
default:
rip.state = RIP_STATE_CR;
continue;
}
}
}
else if (buf[pos] == '\r') {
switch (rip.state) {
case RIP_STATE_BACKSLASH_PIPE:
case RIP_STATE_BACKSLASH_LEVEL:
case RIP_STATE_BACKSLASH_SUBLEVEL:
case RIP_STATE_BACKSLASH_CMD:
case RIP_STATE_BACKSLASH_ENDED:
break;
case RIP_STATE_ESC:
case RIP_STATE_CSI:
case RIP_STATE_CSINUM:
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_BOL;
rip.lchars = 0;
continue;
case RIP_STATE_BOL:
case RIP_STATE_MOL:
rip.state = RIP_STATE_BOL;
rip.lchars = 0;
continue;
default:
rip.state = RIP_STATE_CR;
continue;
}
}
switch (rip.state) {
case RIP_STATE_BOL:
case RIP_STATE_MOL:
switch (buf[pos]) {
case '!':
if (rip.state == RIP_STATE_MOL)
switch (buf[pos]) {
case '!':
if (rip.state == RIP_STATE_MOL)
break;
case '\x01':
case '\x02':
if (rip.enabled) {
rip_start = pos;
rip.state = RIP_STATE_BANG;
}
break;
case '\x01':
case '\x02':
if (rip.enabled) {
case '\x1b':
rip_start = pos;
rip.state = RIP_STATE_BANG;
}
break;
case '\x1b':
rip_start = pos;
rip.state = RIP_STATE_ESC;
break;
default:
if (buf[pos] == '\b') {
if (rip.lchars > 0)
rip.lchars--;
if (rip.lchars == 0) {
rip.state = RIP_STATE_BOL;
break;
rip.state = RIP_STATE_ESC;
break;
default:
if (buf[pos] == '\b') {
if (rip.lchars > 0)
rip.lchars--;
if (rip.lchars == 0) {
rip.state = RIP_STATE_BOL;
break;
}
}
}
else if (buf[pos] < 32) {
rip.lchars = -1;
}
else {
rip.lchars++;
}
rip.state = RIP_STATE_MOL;
break;
}
break;
case RIP_STATE_BANG:
if (buf[pos] == '|') {
rip.state = RIP_STATE_PIPE;
else if (buf[pos] < 32) {
rip.lchars = -1;
}
else {
rip.lchars++;
}
rip.state = RIP_STATE_MOL;
break;
}
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_
MOL
;
break;
case RIP_STATE_PIPE:
if ((buf[pos] >= '1') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_
LEVE
L;
case RIP_STATE_BANG:
if (buf[pos] == '|') {
rip.state = RIP_STATE_
PIPE
;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_
MO
L;
break;
}
rip.state = RIP_STATE_CMD;
break
;
case RIP_STATE_LEVEL:
if ((buf[pos] >= '1') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_
SUBLEVEL
;
case RIP_STATE_PIPE:
if ((buf[pos] >= '1') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_LEVEL
;
break;
}
rip.state = RIP_STATE_
CMD
;
break;
}
rip.state = RIP_STATE_CMD;
break;
case RIP_STATE_SUBLEVEL:
rip.state = RIP_STATE_CMD;
break;
case RIP_STATE_CMD:
if (buf[pos] == '\\') {
rip.state = RIP_STATE_BACKSLASH_CMD;
case RIP_STATE_LEVEL:
if ((buf[pos] >= '1') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_SUBLEVEL;
break;
}
rip.state = RIP_STATE_CMD;
break;
}
if (buf[pos] == '|') {
rip.state = RIP_STATE_PIPE;
case RIP_STATE_SUBLEVEL:
rip.state = RIP_STATE_CMD;
break;
}
break;
case
RIP_STATE_BACKSLASH_
PIPE:
case RIP_STATE_BACKSLASH_LEVEL:
case RIP_STATE_BACKSLASH_SUBLEVEL:
case RIP_STATE_BACKSLASH_CMD:
case RIP_STATE_BACKSLASH_ENDED:
if (buf[pos] == '\r') {
rip.state += (RIP_STATE_CONT_PIPE - RIP_STATE_BACKSLASH_PIPE);
case RIP_STATE_CMD:
if (buf[pos] == '\\') {
rip.state =
RIP_STATE_BACKSLASH_
CMD;
break;
}
if (buf[pos] == '|') {
rip.state = RIP_STATE_PIPE;
break;
}
break;
}
rip.state -= (
RIP_STATE_BACKSLASH_
PIPE - RIP_STATE_PIPE);
break;
case RIP_STATE_
CR
:
// TODO: This is likely broken...
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break
;
case RIP_STATE_ESC:
if (buf[pos] == '[') {
rip.state = RIP_STATE_
CSI
;
case RIP_STATE_BACKSLASH_PIPE:
case
RIP_STATE_BACKSLASH_
LEVEL:
case RIP_STATE_BACKSLASH_SUBLEVEL:
case RIP_STATE_
BACKSLASH_CMD
:
case RIP_STATE_BACKSLASH_ENDED:
if (buf[pos] == '\r') {
rip.state += (RIP_STATE_CONT_PIPE - RIP_STATE_BACKSLASH_PIPE)
;
break;
}
rip.state
-
=
(
RIP_STATE_
BACKSLASH_PIPE - RIP_STATE_PIPE)
;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
case RIP_STATE_CSI:
if (buf[pos] == '!') {
case RIP_STATE_CR:
// TODO: This is likely broken...
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
if ((buf[pos] >= '0') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_CSINUM;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
case RIP_STATE_CSINUM:
if (buf[pos] == '!') {
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
case RIP_STATE_ESC:
if (buf[pos] == '[') {
rip.state = RIP_STATE_CSI;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
}
if (((buf[pos] >= '0') && (buf[pos] <= '9')) || (buf[pos] == ';')) {
rip.state = RIP_STATE_SKYPIX;
case RIP_STATE_CSI:
if (buf[pos] == '!') {
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
if ((buf[pos] >= '0') && (buf[pos] <= '9')) {
rip.state = RIP_STATE_CSINUM;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
case RIP_STATE_SKYPIX:
if (((buf[pos] >= '0') && (buf[pos] <= '9')) || (buf[pos] == ';'))
case RIP_STATE_CSINUM:
if (buf[pos] == '!') {
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
if (((buf[pos] >= '0') && (buf[pos] <= '9')) || (buf[pos] == ';')) {
rip.state = RIP_STATE_SKYPIX;
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
if (buf[pos] == '!') {
if (pendingcmp("\x1b[10;", &buf[rip_start]) == 0) {
// This seems to be how Reign of Fire is resetting the font...
if (pendingcmp("\x1b[10;0!", &buf[rip_start]) != 0) {
case RIP_STATE_SKYPIX:
if (((buf[pos] >= '0') && (buf[pos] <= '9')) || (buf[pos] == ';'))
break;
if (buf[pos] == '!') {
if (pendingcmp("\x1b[10;", &buf[rip_start]) == 0) {
// This seems to be how Reign of Fire is resetting the font...
if (pendingcmp("\x1b[10;0!", &buf[rip_start]) != 0) {
rip.state = RIP_STATE_SKYPIX_STR;
break;
}
}
if (pendingcmp("\x1b[16;", &buf[rip_start]) == 0) {
rip.state = RIP_STATE_SKYPIX_STR;
break;
}
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
if (pendingcmp("\x1b[16;", &buf[rip_start]) == 0) {
rip.state = RIP_STATE_SKYPIX_STR;
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
case RIP_STATE_SKYPIX_STR:
if (buf[pos] == '!') {
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
break;
}
unrip_line(buf, &blen, &pos, &rip_start, maxlen);
rip.state = RIP_STATE_MOL;
break;
case RIP_STATE_SKYPIX_STR:
if (buf[pos] == '!') {
handle_rip_line(buf, &blen, &pos, &rip_start, maxlen, RIP_STATE_MOL);
default:
rip.state = RIP_STATE_ENDED;
break;
}
break;
default:
rip.state = RIP_STATE_ENDED;
break;
}
}
}
// We have some RIP, add to buffer...
normal_palette();
if (rip_start <= maxlen) {
buffer_rip(&buf[rip_start], blen - rip_start);
// We have some RIP, add to buffer...
normal_palette();
if (rip_start <= maxlen) {
buffer_rip(&buf[rip_start], blen - rip_start);
if (copy) {
memcpy(origbuf, buf, rip_start);
free(buf);
}
if (rip.text_disabled)
return ansi_only(origbuf, rip_start);
return rip_start;
}
// Everything is fine...
if (copy) {
memcpy(origbuf, buf,
rip_start
);
memcpy(origbuf, buf,
blen
);
free(buf);
}
if (rip.text_disabled)
return ansi_only(origbuf, rip_start);
return rip_start;
return ansi_only(origbuf, blen);
}
// Everything is fine...
if (copy) {
memcpy(origbuf, buf, blen);
free(buf);
}
if (rip.text_disabled)
return ansi_only(origbuf, blen);
#endif
return blen;
}
...
...
@@ -16169,13 +16171,15 @@ void
suspend_rip(bool suspend)
{
#ifdef HAS_VSTAT
if (suspend) {
if (rip.enabled)
rip_suspended = true;
}
else {
if (rip.enabled)
rip_suspended = false;
if (cio_api.options & CONIO_OPT_SET_PIXEL) {
if (suspend) {
if (rip.enabled)
rip_suspended = true;
}
else {
if (rip.enabled)
rip_suspended = false;
}
}
#endif
}
...
...
@@ -16184,67 +16188,69 @@ void
init_rip(struct bbslist *bbs)
{
#ifdef HAS_VSTAT
FREE_AND_NULL(rip.xmap);
FREE_AND_NULL(rip.ymap);
FREE_AND_NULL(rip.xunmap);
FREE_AND_NULL(rip.yunmap);
memset(&rip, 0, sizeof(rip));
rip.state = RIP_STATE_BOL;
rip.newstate = RIP_STATE_FLUSHING;
rip.enabled = (bbs->rip != RIP_VERSION_NONE) && (cio_api.options & CONIO_OPT_SET_PIXEL);
rip.version = bbs->rip;
rip.x = 0;
rip.y = 0;
rip.viewport.sx = 0;
rip.viewport.sy = 0;
rip.color = 7;
rip.font.num = 0;
rip.font.vertical = 0;
rip.font.size = 1;
rip.xor = false;
rip.fill_color = 7;
memcpy(rip.fill_pattern, "\xff\xff\xff\xff\xff\xff\xff\xff", 8);
rip.line_pattern = 0xffff;
rip.line_width = 1;
rip.x_dim = 640;
if (cio_api.options & CONIO_OPT_SET_PIXEL) {
pthread_mutex_lock(&vstatlock);
rip.x_max = vstat.scrnwidth;
rip.y_max = vstat.scrnheight;
pthread_mutex_unlock(&vstatlock);
if (rip.x_max > rip.x_dim)
rip.x_max = rip.x_dim;
rip.y_dim = 350;
if (rip.y_max > rip.y_dim)
rip.y_max = rip.y_dim;
}
rip.viewport.ex = rip.x_dim - 1;
rip.viewport.ey = rip.y_dim - 1;
rip.bbs = bbs;
if (rip.version == RIP_VERSION_1) {
rip.default_font = conio_fontdata[0].eight_by_eight;
rip.default_font_width = 8;
rip.default_font_height = 8;
}
else {
pthread_mutex_lock(&vstatlock);
rip.default_font = vstat.forced_font;
rip.default_font_width = vstat.charwidth;
rip.default_font_height = vstat.charheight;
pthread_mutex_unlock(&vstatlock);
}
FREE_AND_NULL(rip.xmap);
FREE_AND_NULL(rip.ymap);
FREE_AND_NULL(rip.xunmap);
FREE_AND_NULL(rip.yunmap);
memset(&rip, 0, sizeof(rip));
rip.state = RIP_STATE_BOL;
rip.newstate = RIP_STATE_FLUSHING;
rip.enabled = (bbs->rip != RIP_VERSION_NONE) && (cio_api.options & CONIO_OPT_SET_PIXEL);
rip.version = bbs->rip;
rip.x = 0;
rip.y = 0;
rip.viewport.sx = 0;
rip.viewport.sy = 0;
rip.color = 7;
rip.font.num = 0;
rip.font.vertical = 0;
rip.font.size = 1;
rip.xor = false;
rip.fill_color = 7;
memcpy(rip.fill_pattern, "\xff\xff\xff\xff\xff\xff\xff\xff", 8);
rip.line_pattern = 0xffff;
rip.line_width = 1;
rip.x_dim = 640;
if (cio_api.options & CONIO_OPT_SET_PIXEL) {
pthread_mutex_lock(&vstatlock);
rip.x_max = vstat.scrnwidth;
rip.y_max = vstat.scrnheight;
pthread_mutex_unlock(&vstatlock);
if (rip.x_max > rip.x_dim)
rip.x_max = rip.x_dim;
rip.y_dim = 350;
if (rip.y_max > rip.y_dim)
rip.y_max = rip.y_dim;
}
rip.viewport.ex = rip.x_dim - 1;
rip.viewport.ey = rip.y_dim - 1;
rip.bbs = bbs;
if (rip.version == RIP_VERSION_1) {
rip.default_font = conio_fontdata[0].eight_by_eight;
rip.default_font_width = 8;
rip.default_font_height = 8;
}
else {
pthread_mutex_lock(&vstatlock);
rip.default_font = vstat.forced_font;
rip.default_font_width = vstat.charwidth;
rip.default_font_height = vstat.charheight;
pthread_mutex_unlock(&vstatlock);
}
pending_len = 0;
if (pending)
pending[0] = 0;
moredata_len = 0;
if (moredata)
moredata[0] = 0;
if (bbs->rip) {
shadow_palette();
memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette));
set_ega_palette();
normal_palette();
pending_len = 0;
if (pending)
pending[0] = 0;
moredata_len = 0;
if (moredata)
moredata[0] = 0;
if (bbs->rip) {
shadow_palette();
memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette));
set_ega_palette();
normal_palette();
}
}
#endif
}
...
...
@@ -16253,7 +16259,7 @@ int
rip_kbhit(void)
{
#ifdef HAS_VSTAT
if (rip.enabled)
if (rip.enabled
&& cio_api.options & CONIO_OPT_SET_PIXEL
)
if (ripbuf)
return 1;
#endif
...
...
@@ -16264,181 +16270,183 @@ int
rip_getch(void)
{
#ifdef HAS_VSTAT
int ch;
struct mouse_event mevent;
int oldhold = hold_update;
hold_update = false;
struct mouse_field *pressed;
if (ripbuf) {
ch = ripbuf[ripbufpos++];
if (ripbufpos == ripbuf_pos) {
free(ripbuf);
ripbuf = NULL;
ripbuf_size = 0;
ripbuf_pos = 0;
ripbufpos = 0;
if (cio_api.options & CONIO_OPT_SET_PIXEL) {
int ch;
struct mouse_event mevent;
int oldhold = hold_update;
hold_update = false;
struct mouse_field *pressed;
if (ripbuf) {
ch = ripbuf[ripbufpos++];
if (ripbufpos == ripbuf_pos) {
free(ripbuf);
ripbuf = NULL;
ripbuf_size = 0;
ripbuf_pos = 0;
ripbufpos = 0;
}
return ch;
}
return ch;
}
if ((rip.enabled == false) || rip_suspended) {
if ((rip.enabled == false) || rip_suspended) {
ch = getch();
if ((ch == 0) || (ch == 0xe0)) {
ch |= getch() << 8;
if (ch == CIO_KEY_LITERAL_E0)
ch = 0xe0;
}
return ch;
}
struct mouse_state *ms = cterm->mouse_state_change_cbdata;
gotoxy(wherex(), wherey());
ch = getch();
if ((ch == 0) || (ch == 0xe0)) {
ch |= getch() << 8;
if (ch == CIO_KEY_LITERAL_E0)
ch = 0xe0;
}
return ch;
}
struct mouse_state *ms = cterm->mouse_state_change_cbdata;
gotoxy(wherex(), wherey());
ch = getch();
if ((ch == 0) || (ch == 0xe0)) {
ch |= getch() << 8;
if (ch == CIO_KEY_LITERAL_E0)
ch = 0xe0;
}
shadow_palette();
if (ch == CIO_KEY_MOUSE && (!(ms->flags & MS_FLAGS_DISABLED))) {
ch = -1;
getmouse(&mevent);
mevent.startx_res = unmap_rip_x(mevent.startx_res);
mevent.starty_res = unmap_rip_y(mevent.starty_res);
mevent.endx_res = unmap_rip_x(mevent.endx_res);
mevent.endy_res = unmap_rip_y(mevent.endy_res);
if (mevent.event == CIOLIB_BUTTON_1_PRESS) {
for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if ((mevent.endx_res >= rip_pressed->data.button->box.x1)
&& (mevent.endx_res <= rip_pressed->data.button->box.x2)
&& (mevent.endy_res >= rip_pressed->data.button->box.y1)
&& (mevent.endy_res <= rip_pressed->data.button->box.y2))
break;
}
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if ((mevent.endx_res >= rip_pressed->data.hot->box.x1)
&& (mevent.endx_res <= rip_pressed->data.hot->box.x2)
&& (mevent.endy_res >= rip_pressed->data.hot->box.y1)
&& (mevent.endy_res <= rip_pressed->data.hot->box.y2))
break;
}
}
if (rip_pressed) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (rip_pressed->data.button->flags.invertable) {
// draw_button(rip_pressed->data.button, true);
invert_rect(rip_pressed->data.button->box.x1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.x2 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y2
- rip_pressed->data.button->bevel_size);
}
}
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if (rip_pressed->data.hot->invertable) {
// draw_button(rip_pressed->data.button, true);
invert_rect(rip_pressed->data.hot->box.x1,
rip_pressed->data.hot->box.y1,
rip_pressed->data.hot->box.x2,
rip_pressed->data.hot->box.y2);
shadow_palette();
if (ch == CIO_KEY_MOUSE && (!(ms->flags & MS_FLAGS_DISABLED))) {
ch = -1;
getmouse(&mevent);
mevent.startx_res = unmap_rip_x(mevent.startx_res);
mevent.starty_res = unmap_rip_y(mevent.starty_res);
mevent.endx_res = unmap_rip_x(mevent.endx_res);
mevent.endy_res = unmap_rip_y(mevent.endy_res);
if (mevent.event == CIOLIB_BUTTON_1_PRESS) {
for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if ((mevent.endx_res >= rip_pressed->data.button->box.x1)
&& (mevent.endx_res <= rip_pressed->data.button->box.x2)
&& (mevent.endy_res >= rip_pressed->data.button->box.y1)
&& (mevent.endy_res <= rip_pressed->data.button->box.y2))
break;
}
}
}
}
else if (mevent.event == CIOLIB_BUTTON_1_RELEASE) {
if (rip_pressed) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (rip_pressed->data.button->flags.invertable) {
// draw_button(rip_pressed->data.button, false);
invert_rect(rip_pressed->data.button->box.x1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.x2 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y2
- rip_pressed->data.button->bevel_size);
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if ((mevent.endx_res >= rip_pressed->data.hot->box.x1)
&& (mevent.endx_res <= rip_pressed->data.hot->box.x2)
&& (mevent.endy_res >= rip_pressed->data.hot->box.y1)
&& (mevent.endy_res <= rip_pressed->data.hot->box.y2))
break;
}
pressed = rip_pressed;
rip_pressed = NULL;
handle_mouse_button(pressed->data.button);
}
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if (rip_pressed->data.hot->invertable) {
// draw_button(rip_pressed->data.button, false);
invert_rect(rip_pressed->data.hot->box.x1,
rip_pressed->data.hot->box.y1,
rip_pressed->data.hot->box.x2,
rip_pressed->data.hot->box.y2);
if (rip_pressed) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (rip_pressed->data.button->flags.invertable) {
// draw_button(rip_pressed->data.button, true);
invert_rect(rip_pressed->data.button->box.x1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.x2 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y2
- rip_pressed->data.button->bevel_size);
}
}
pressed = rip_pressed;
rip_pressed = NULL;
handle_command_str(pressed->data.hot->command);
if (rip.mfields) {
if (pressed->data.hot->resetafter)
rv_reset("RESET", NULL);
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if (rip_pressed->data.hot->invertable) {
// draw_button(rip_pressed->data.button, true);
invert_rect(rip_pressed->data.hot->box.x1,
rip_pressed->data.hot->box.y1,
rip_pressed->data.hot->box.x2,
rip_pressed->data.hot->box.y2);
}
}
}
}
else {
if (rip.text_click) {
if ((mevent.endx >= cterm->left_margin - 1)
&& (mevent.endx <= cterm->right_margin - 1)
&& (mevent.endy >= cterm->top_margin - 1)
&& (mevent.endy <= cterm->bottom_margin - 1)) {
rip_mouse_event.x = mevent.endx;
rip_mouse_event.y = mevent.endy;
rip_mouse_event.buttons = mevent.bstate | 1;
mousestate(&rip_mouse_event.x,
&rip_mouse_event.y,
&rip_mouse_event.buttons);
rip_mouse_event.type = RIP_MOUSE_EVENT_TEXT;
handle_command_str(rip.text_click);
rip_mouse_event.type = RIP_MOUSE_EVENT_NONE;
else if (mevent.event == CIOLIB_BUTTON_1_RELEASE) {
if (rip_pressed) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (rip_pressed->data.button->flags.invertable) {
// draw_button(rip_pressed->data.button, false);
invert_rect(rip_pressed->data.button->box.x1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y1 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.x2 - rip_pressed->data.button->bevel_size
,
rip_pressed->data.button->box.y2
- rip_pressed->data.button->bevel_size);
}
pressed = rip_pressed;
rip_pressed = NULL;
handle_mouse_button(pressed->data.button);
}
else if (rip_pressed->type == MOUSE_FIELD_HOT) {
if (rip_pressed->data.hot->invertable) {
// draw_button(rip_pressed->data.button, false);
invert_rect(rip_pressed->data.hot->box.x1,
rip_pressed->data.hot->box.y1,
rip_pressed->data.hot->box.x2,
rip_pressed->data.hot->box.y2);
}
pressed = rip_pressed;
rip_pressed = NULL;
handle_command_str(pressed->data.hot->command);
if (rip.mfields) {
if (pressed->data.hot->resetafter)
rv_reset("RESET", NULL);
}
}
}
if (rip.graphics_click) {
if ((mevent.endx_res >= rip.viewport.sx) && (mevent.endx_res <= rip.viewport.ex)
&& (mevent.endy_res >= rip.viewport.sy)
&& (mevent.endy_res <= rip.viewport.ey)) {
rip_mouse_event.x = mevent.endx_res;
rip_mouse_event.y = mevent.endy_res;
rip_mouse_event.buttons = mevent.bstate | 1;
mousestate_res(&rip_mouse_event.x,
&rip_mouse_event.y,
&rip_mouse_event.buttons);
rip_mouse_event.type = RIP_MOUSE_EVENT_GRAPHICS;
handle_command_str(rip.graphics_click);
rip_mouse_event.type = RIP_MOUSE_EVENT_NONE;
else {
if (rip.text_click) {
if ((mevent.endx >= cterm->left_margin - 1)
&& (mevent.endx <= cterm->right_margin - 1)
&& (mevent.endy >= cterm->top_margin - 1)
&& (mevent.endy <= cterm->bottom_margin - 1)) {
rip_mouse_event.x = mevent.endx;
rip_mouse_event.y = mevent.endy;
rip_mouse_event.buttons = mevent.bstate | 1;
mousestate(&rip_mouse_event.x,
&rip_mouse_event.y,
&rip_mouse_event.buttons);
rip_mouse_event.type = RIP_MOUSE_EVENT_TEXT;
handle_command_str(rip.text_click);
rip_mouse_event.type = RIP_MOUSE_EVENT_NONE;
}
}
if (rip.graphics_click) {
if ((mevent.endx_res >= rip.viewport.sx) && (mevent.endx_res <= rip.viewport.ex)
&& (mevent.endy_res >= rip.viewport.sy)
&& (mevent.endy_res <= rip.viewport.ey)) {
rip_mouse_event.x = mevent.endx_res;
rip_mouse_event.y = mevent.endy_res;
rip_mouse_event.buttons = mevent.bstate | 1;
mousestate_res(&rip_mouse_event.x,
&rip_mouse_event.y,
&rip_mouse_event.buttons);
rip_mouse_event.type = RIP_MOUSE_EVENT_GRAPHICS;
handle_command_str(rip.graphics_click);
rip_mouse_event.type = RIP_MOUSE_EVENT_NONE;
}
}
}
}
}
}
else {
for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (toupper(rip_pressed->data.button->hotkey) == toupper(ch))
break;
else {
for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
if (toupper(rip_pressed->data.button->hotkey) == toupper(ch))
break;
}
}
if (rip_pressed) {
ch = -1;
handle_mouse_button(rip_pressed->data.button);
rip_pressed = NULL;
}
}
if (rip_pressed) {
ch = -1;
handle_mouse_button(rip_pressed->data.button);
rip_pressed = NULL;
}
normal_palette();
hold_update = oldhold;
return ch;
}
normal_palette();
hold_update = oldhold;
return ch;
#else
#endif
int ch;
ch = getch();
...
...
@@ -16448,5 +16456,4 @@ rip_getch(void)
ch = 0xe0;
}
return ch;
#endif
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment