mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-29 07:58:01 -04:00
osc: implement change window title and icon
This commit is contained in:
parent
998ce52b7e
commit
3ba1721c0f
5 changed files with 65 additions and 10 deletions
2
csi.c
2
csi.c
|
|
@ -274,7 +274,7 @@ csi_as_string(struct terminal *term, uint8_t final)
|
||||||
i == term->vt.params.idx - 1 ? "" : ";");
|
i == term->vt.params.idx - 1 ? "" : ";");
|
||||||
}
|
}
|
||||||
|
|
||||||
c += snprintf(&msg[c], sizeof(msg) - c, "%c (%d parameters)",
|
c += snprintf(&msg[c], sizeof(msg) - c, "%c (%zu parameters)",
|
||||||
final, term->vt.params.idx);
|
final, term->vt.params.idx);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
main.c
10
main.c
|
|
@ -819,6 +819,13 @@ keyboard_repeater(void *arg)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: move to a render API? */
|
||||||
|
void
|
||||||
|
render_set_title(struct renderer *renderer, const char *title)
|
||||||
|
{
|
||||||
|
xdg_toplevel_set_title(renderer->xdg_toplevel, title);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *const *argv)
|
main(int argc, char *const *argv)
|
||||||
{
|
{
|
||||||
|
|
@ -965,10 +972,11 @@ main(int argc, char *const *argv)
|
||||||
xdg_surface_add_listener(c.wl.xdg_surface, &xdg_surface_listener, &c);
|
xdg_surface_add_listener(c.wl.xdg_surface, &xdg_surface_listener, &c);
|
||||||
|
|
||||||
c.wl.xdg_toplevel = xdg_surface_get_toplevel(c.wl.xdg_surface);
|
c.wl.xdg_toplevel = xdg_surface_get_toplevel(c.wl.xdg_surface);
|
||||||
|
c.term.renderer.xdg_toplevel = c.wl.xdg_toplevel; /* TODO */
|
||||||
xdg_toplevel_add_listener(c.wl.xdg_toplevel, &xdg_toplevel_listener, &c);
|
xdg_toplevel_add_listener(c.wl.xdg_toplevel, &xdg_toplevel_listener, &c);
|
||||||
|
|
||||||
xdg_toplevel_set_app_id(c.wl.xdg_toplevel, "f00ter");
|
xdg_toplevel_set_app_id(c.wl.xdg_toplevel, "f00ter");
|
||||||
xdg_toplevel_set_title(c.wl.xdg_toplevel, "f00ter");
|
render_set_title(&c.term.renderer, "f00ter");
|
||||||
|
|
||||||
wl_surface_commit(c.wl.surface);
|
wl_surface_commit(c.wl.surface);
|
||||||
wl_display_roundtrip(c.wl.display);
|
wl_display_roundtrip(c.wl.display);
|
||||||
|
|
|
||||||
41
osc.c
41
osc.c
|
|
@ -1,12 +1,51 @@
|
||||||
#include "osc.h"
|
#include "osc.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "terminal.h"
|
||||||
|
|
||||||
#define LOG_MODULE "osc"
|
#define LOG_MODULE "osc"
|
||||||
#define LOG_ENABLE_DBG 0
|
#define LOG_ENABLE_DBG 0
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
/* TODO */
|
||||||
|
void render_set_title(struct renderer *renderer, const char *title);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
osc_dispatch(struct terminal *term)
|
osc_dispatch(struct terminal *term)
|
||||||
{
|
{
|
||||||
LOG_DBG("OCS: %.*s", (int)term->vt.osc.idx, term->vt.osc.data);
|
int param = 0;
|
||||||
|
int data_ofs = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < term->vt.osc.idx; i++) {
|
||||||
|
int c = term->vt.osc.data[i];
|
||||||
|
|
||||||
|
if (c == ';') {
|
||||||
|
data_ofs = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isdigit(c)) {
|
||||||
|
LOG_ERR("OSC: invalid parameter: %.*s",
|
||||||
|
(int)term->vt.osc.idx, term->vt.osc.data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
param += c - '0';
|
||||||
|
}
|
||||||
|
LOG_DBG("OCS: %.*s (param = %d)",
|
||||||
|
(int)term->vt.osc.idx, term->vt.osc.data, param);
|
||||||
|
|
||||||
|
const char *string = (const char *)&term->vt.osc.data[data_ofs];
|
||||||
|
|
||||||
|
switch (param) {
|
||||||
|
case 0: render_set_title(&term->renderer, string); break; /* icon + title */
|
||||||
|
case 1: break; /* icon */
|
||||||
|
case 2: render_set_title(&term->renderer, string); break; /* title */
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOG_ERR("unimplemented: OSC: %.*s",
|
||||||
|
(int)term->vt.osc.idx, term->vt.osc.data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
terminal.h
17
terminal.h
|
|
@ -74,7 +74,7 @@ struct grid {
|
||||||
|
|
||||||
struct vt_subparams {
|
struct vt_subparams {
|
||||||
unsigned value[16];
|
unsigned value[16];
|
||||||
int idx;
|
size_t idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vt_param {
|
struct vt_param {
|
||||||
|
|
@ -86,20 +86,20 @@ struct vt {
|
||||||
int state; /* enum state */
|
int state; /* enum state */
|
||||||
struct {
|
struct {
|
||||||
struct vt_param v[16];
|
struct vt_param v[16];
|
||||||
int idx;
|
size_t idx;
|
||||||
} params;
|
} params;
|
||||||
struct {
|
struct {
|
||||||
uint8_t data[2];
|
uint8_t data[2];
|
||||||
int idx;
|
size_t idx;
|
||||||
} intermediates;
|
} intermediates;
|
||||||
struct {
|
struct {
|
||||||
uint8_t data[1024];
|
uint8_t data[1024];
|
||||||
int idx;
|
size_t idx;
|
||||||
} osc;
|
} osc;
|
||||||
struct {
|
struct {
|
||||||
uint8_t data[4];
|
uint8_t data[4];
|
||||||
int idx;
|
size_t idx;
|
||||||
int left;
|
size_t left;
|
||||||
} utf8;
|
} utf8;
|
||||||
struct attributes attrs;
|
struct attributes attrs;
|
||||||
struct attributes saved_attrs;
|
struct attributes saved_attrs;
|
||||||
|
|
@ -125,6 +125,10 @@ struct kbd {
|
||||||
} repeat;
|
} repeat;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct renderer {
|
||||||
|
struct xdg_toplevel *xdg_toplevel; /* TODO: this doesn't belong here */
|
||||||
|
};
|
||||||
|
|
||||||
enum decckm { DECCKM_CSI, DECCKM_SS3 };
|
enum decckm { DECCKM_CSI, DECCKM_SS3 };
|
||||||
enum keypad_mode { KEYPAD_NUMERICAL, KEYPAD_APPLICATION };
|
enum keypad_mode { KEYPAD_NUMERICAL, KEYPAD_APPLICATION };
|
||||||
enum charset { CHARSET_ASCII, CHARSET_GRAPHIC };
|
enum charset { CHARSET_ASCII, CHARSET_GRAPHIC };
|
||||||
|
|
@ -145,6 +149,7 @@ struct terminal {
|
||||||
|
|
||||||
struct vt vt;
|
struct vt vt;
|
||||||
struct kbd kbd;
|
struct kbd kbd;
|
||||||
|
struct renderer renderer;
|
||||||
|
|
||||||
int cols;
|
int cols;
|
||||||
int rows;
|
int rows;
|
||||||
|
|
|
||||||
5
vt.c
5
vt.c
|
|
@ -799,10 +799,13 @@ action(struct terminal *term, enum action action, uint8_t c)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACTION_OSC_PUT:
|
case ACTION_OSC_PUT:
|
||||||
term->vt.osc.data[term->vt.osc.idx++] = c;
|
if (term->vt.osc.idx < (int)sizeof(term->vt.osc.data) - 1)
|
||||||
|
term->vt.osc.data[term->vt.osc.idx++] = c;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACTION_OSC_END:
|
case ACTION_OSC_END:
|
||||||
|
assert(term->vt.osc.idx < sizeof(term->vt.osc.data));
|
||||||
|
term->vt.osc.data[term->vt.osc.idx] = '\0';
|
||||||
return osc_dispatch(term);
|
return osc_dispatch(term);
|
||||||
|
|
||||||
case ACTION_HOOK:
|
case ACTION_HOOK:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue