Skip to content
Snippets Groups Projects
Commit 901cef17 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

More improvements for Black Flag...

Pretend we are RipTel v3.
Implement $PCB$
Implement click actions
Fix M areas.
parent b9d43a4c
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #2084 passed
...@@ -1194,8 +1194,8 @@ void bitmap_clrscr(void) ...@@ -1194,8 +1194,8 @@ void bitmap_clrscr(void)
pthread_mutex_lock(&blinker_lock); pthread_mutex_lock(&blinker_lock);
pthread_mutex_lock(&vstatlock); pthread_mutex_lock(&vstatlock);
vmem_ptr = get_vmem(&vstat); vmem_ptr = get_vmem(&vstat);
for(y=cio_textinfo.wintop-1; y<cio_textinfo.winbottom; y++) { for(y = cio_textinfo.wintop-1; y < cio_textinfo.winbottom && y < vstat.rows; y++) {
for(x=cio_textinfo.winleft-1; x<cio_textinfo.winright; x++) { for(x=cio_textinfo.winleft-1; x<cio_textinfo.winright && x < vstat.cols; x++) {
set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, fill, ciolib_fg, ciolib_bg); set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, fill, ciolib_fg, ciolib_bg);
bitmap_draw_one_char(x+1, y+1); bitmap_draw_one_char(x+1, y+1);
} }
......
...@@ -264,6 +264,8 @@ static struct { ...@@ -264,6 +264,8 @@ static struct {
int *yunmap; int *yunmap;
bool text_disabled; bool text_disabled;
enum ansi_state ansi_state; enum ansi_state ansi_state;
int clipx;
int clipy;
} rip = { } rip = {
RIP_STATE_BOL, RIP_STATE_BOL,
RIP_STATE_FLUSHING, RIP_STATE_FLUSHING,
...@@ -295,6 +297,7 @@ static struct { ...@@ -295,6 +297,7 @@ static struct {
NULL, NULL, NULL, NULL,
false, false,
ANSI_STATE_NONE, ANSI_STATE_NONE,
0, 0,
}; };
   
static const uint16_t rip_line_patterns[4] = { static const uint16_t rip_line_patterns[4] = {
...@@ -7197,7 +7200,20 @@ static void draw_line(int x1, int y1, int x2, int y2); ...@@ -7197,7 +7200,20 @@ static void draw_line(int x1, int y1, int x2, int y2);
static void reinit_screen(enum text_modes mode, uint8_t *font, int fontx, int fonty); static void reinit_screen(enum text_modes mode, uint8_t *font, int fontx, int fonty);
static bool no_viewport(void); static bool no_viewport(void);
   
static const char ripver[] = "RIPSCRIP015410"; //static const char ripver[] = "RIPSCRIP015410";
static const char ripver[] = "RIPSCRIP030001";
#define RIP_MOUSE_EVENT_NONE 0
#define RIP_MOUSE_EVENT_TEXT 1
#define RIP_MOUSE_EVENT_GRAPHICS 2
struct rip_mouse_event {
int x;
int y;
uint8_t buttons;
uint8_t type;
};
static struct rip_mouse_event rip_mouse_event;
   
static const struct builtin_rip_variable builtins[] = { static const struct builtin_rip_variable builtins[] = {
{"ADOW", rv_date, NULL}, // Abbreviated Day of Week {"ADOW", rv_date, NULL}, // Abbreviated Day of Week
...@@ -7335,7 +7351,7 @@ get_text_variable(const char * const var) ...@@ -7335,7 +7351,7 @@ get_text_variable(const char * const var)
} }
vardef = bsearch(var, builtins, sizeof(builtins) / sizeof(builtins[0]), sizeof(builtins[0]), bicmp); vardef = bsearch(var, builtins, sizeof(builtins) / sizeof(builtins[0]), sizeof(builtins[0]), bicmp);
if (vardef == NULL) { if (vardef == NULL) {
puts("TODO: User variables"); printf("TODO: User variables (%s)\n", var);
return(calloc(1, 1)); return(calloc(1, 1));
} }
return vardef->func(var, vardef->data); return vardef->func(var, vardef->data);
...@@ -7469,7 +7485,7 @@ rv_time(const char * const var, const void * const data) ...@@ -7469,7 +7485,7 @@ rv_time(const char * const var, const void * const data)
return strdup(str); return strdup(str);
} }
} }
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
...@@ -7520,54 +7536,57 @@ rv_sound(const char * const var, const void * const data) ...@@ -7520,54 +7536,57 @@ rv_sound(const char * const var, const void * const data)
xptone(i, 2, WAVE_SHAPE_SINE); xptone(i, 2, WAVE_SHAPE_SINE);
return NULL; return NULL;
} }
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
static char * static char *
rv_mouse(const char * const var, const void * const data) rv_mouse(const char * const var, const void * const data)
{ {
int x,y;
uint8_t but;
char str[128]; char str[128];
int fwidth = 4;
switch (rip_mouse_event.type) {
case RIP_MOUSE_EVENT_NONE:
mousestate_res(&rip_mouse_event.x, &rip_mouse_event.y, &rip_mouse_event.buttons);
break;
case RIP_MOUSE_EVENT_TEXT:
fwidth = 2;
break;
}
   
switch (var[0]) { switch (var[0]) {
case 'X': case 'X':
switch(var[1]) { switch(var[1]) {
case 0: case 0:
mousestate_res(&x, NULL, NULL); snprintf(str, sizeof(str), "%0*d", fwidth, rip_mouse_event.x);
snprintf(str, sizeof(str), "%04d", x);
return strdup(str); return strdup(str);
case 'Y': case 'Y':
switch(var[2]) { switch(var[2]) {
case 0: case 0:
mousestate_res(&x, &y, NULL); snprintf(str, sizeof(str), "%0*x:%0*x", fwidth, rip_mouse_event.x, fwidth, rip_mouse_event.y);
snprintf(str, sizeof(str), "%04x:%04x", x, y);
return strdup(str); return strdup(str);
case 'M': case 'M':
mousestate_res(&x, &y, &but); snprintf(str, sizeof(str), "%0*x:%0*x:%d%d%d", fwidth, rip_mouse_event.x, fwidth, rip_mouse_event.y, rip_mouse_event.buttons & 1, rip_mouse_event.buttons >> 1 & 1, rip_mouse_event.buttons >> 2 & 1);
snprintf(str, sizeof(str), "%04x:%04x:%d%d%d", x, y, but & 1, but >> 1 & 1, but >> 2 & 1);
return strdup(str); return strdup(str);
} }
break; break;
} }
break; break;
case 'Y': case 'Y':
mousestate_res(NULL, &y, NULL); snprintf(str, sizeof(str), "%0*d", fwidth, rip_mouse_event.y);
snprintf(str, sizeof(str), "%04d", y);
return strdup(str); return strdup(str);
case 'M': case 'M':
switch(var[1]) { switch(var[1]) {
case 0: case 0:
mousestate_res(NULL, NULL, &but); snprintf(str, sizeof(str), "%d%d%d", rip_mouse_event.buttons & 1, rip_mouse_event.buttons >> 1 & 1, rip_mouse_event.buttons >> 2 & 1);
snprintf(str, sizeof(str), "%d%d%d", but & 1, but >> 1 & 1, but >> 2 & 1);
return strdup(str); return strdup(str);
case 'S': case 'S':
return strdup("YES"); return strdup("YES");
} }
break; break;
} }
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
...@@ -7619,14 +7638,20 @@ rv_reset(const char * const var, const void * const data) ...@@ -7619,14 +7638,20 @@ rv_reset(const char * const var, const void * const data)
static char * static char *
rv_save(const char * const var, const void * const data) rv_save(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); if (strcmp(var, "SMF")) {
// Save mouse fields...
}
printf("TODO: Save RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
static char * static char *
rv_restore(const char * const var, const void * const data) rv_restore(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); if (strcmp(var, "RMF")) {
// Restore mouse fields...
}
printf("TODO: Restore RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
...@@ -7769,7 +7794,7 @@ rv_erase(const char * const var, const void * const data) ...@@ -7769,7 +7794,7 @@ rv_erase(const char * const var, const void * const data)
cterm_gotoxy(cterm, 1, 1); cterm_gotoxy(cterm, 1, 1);
return NULL; return NULL;
} }
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
...@@ -7783,14 +7808,14 @@ rv_mouse_kill(const char * const var, const void * const data) ...@@ -7783,14 +7808,14 @@ rv_mouse_kill(const char * const var, const void * const data)
static char * static char *
rv_disable(const char * const var, const void * const data) rv_disable(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
static char * static char *
rv_termstat(const char * const var, const void * const data) rv_termstat(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
...@@ -7876,21 +7901,22 @@ rv_termset(const char * const var, const void * const data) ...@@ -7876,21 +7901,22 @@ rv_termset(const char * const var, const void * const data)
static char * static char *
rv_hotkey(const char * const var, const void * const data) rv_hotkey(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
static char * static char *
rv_exploit(const char * const var, const void * const data) rv_exploit(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); printf("TODO: RIP Variables (%s)\n", var);
return NULL; return NULL;
} }
   
static char * static char *
rv_paste(const char * const var, const void * const data) rv_paste(const char * const var, const void * const data)
{ {
puts("TODO: RIP Variables"); if (rip.clipboard)
setpixels(rip.clipx, rip.clipy, rip.clipx + rip.clipboard->width - 1, rip.clipy + rip.clipboard->height - 1, 0, 0, rip.clipboard, NULL);
return NULL; return NULL;
} }
   
...@@ -10928,13 +10954,18 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10928,13 +10954,18 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
handle_command_str(&args[4]); handle_command_str(&args[4]);
break; break;
case 1: case 1:
free(rip.graphics_click); FREE_AND_NULL(rip.graphics_click);
if (strcmp(&args[4], "$OFF$"))
rip.graphics_click = strdup(&args[4]); rip.graphics_click = strdup(&args[4]);
break; break;
case 2: case 2:
free(rip.text_click); FREE_AND_NULL(rip.text_click);
if (strcmp(&args[4], "$OFF$"))
rip.text_click = strdup(&args[4]); rip.text_click = strdup(&args[4]);
break; break;
default:
printf("Unhandled QUERY type %d\n", arg1);
break;
} }
break; break;
case 'B': // RIP_BUTTON_STYLE !|1B <wid> <hgt> <orient> <flags> <bevsize> <dfore> <dback> <bright> <dark> <surface> <grp_no> <flags2> <uline_col> <corner_col> <res> case 'B': // RIP_BUTTON_STYLE !|1B <wid> <hgt> <orient> <flags> <bevsize> <dfore> <dback> <bright> <dark> <surface> <grp_no> <flags2> <uline_col> <corner_col> <res>
...@@ -11564,6 +11595,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -11564,6 +11595,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
freepixels(rip.clipboard); freepixels(rip.clipboard);
gettextinfo(&ti); gettextinfo(&ti);
rip.clipboard = getpixels(x1 + rip.viewport.sx, y1 + rip.viewport.sy, x2 + rip.viewport.sx, y2 + rip.viewport.sy, false); rip.clipboard = getpixels(x1 + rip.viewport.sx, y1 + rip.viewport.sy, x2 + rip.viewport.sx, y2 + rip.viewport.sy, false);
rip.clipx = x1 + rip.viewport.sx;
rip.clipy = y1 + rip.viewport.sy;
break; break;
case 'D': // RIP_DEFINE !|1D <flags> <res> <text> case 'D': // RIP_DEFINE !|1D <flags> <res> <text>
/* This command is used to create a text variable on the Client system /* This command is used to create a text variable on the Client system
...@@ -11959,14 +11992,14 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -11959,14 +11992,14 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
x1 = parse_mega(&args[2], 2); x1 = parse_mega(&args[2], 2);
if (x1 < 0) if (x1 < 0)
break; break;
x2 = parse_mega(&args[4], 2); y1 = parse_mega(&args[4], 2);
if (y1 < 0)
break;
x2 = parse_mega(&args[6], 2);
if (x2 < 0) if (x2 < 0)
break; break;
if (x2 > rip.viewport.ex - rip.viewport.sx) if (x2 > rip.viewport.ex - rip.viewport.sx)
break; break;
y1 = parse_mega(&args[6], 2);
if (y1 < 0)
break;
y2 = parse_mega(&args[8], 2); y2 = parse_mega(&args[8], 2);
if (y2 < 0) if (y2 < 0)
break; break;
...@@ -13668,7 +13701,30 @@ rip_getch(void) ...@@ -13668,7 +13701,30 @@ rip_getch(void)
} }
} }
else { else {
puts("TODO: Check graphics/text clicks"); 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;
}
}
} }
} }
} }
......
...@@ -756,6 +756,7 @@ BOOL xptone_close_locked(void) ...@@ -756,6 +756,7 @@ BOOL xptone_close_locked(void)
#ifdef WITH_PULSEAUDIO #ifdef WITH_PULSEAUDIO
if(handle_type==SOUND_DEVICE_PULSEAUDIO) { if(handle_type==SOUND_DEVICE_PULSEAUDIO) {
if (pu_handle)
pu_api->simple_free(pu_handle); pu_api->simple_free(pu_handle);
pu_handle = NULL; pu_handle = NULL;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment