mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 11:02:48 -05:00
Yet more global-removal. The static variables in logging.c are now
absent, and also (I think) all the frontend request functions (such as request_resize) take a context pointer, so that multiple windows can be handled sensibly. I wouldn't swear to this, but I _think_ that only leaves the Unicode stuff as the last stubborn holdout. [originally from svn r2147]
This commit is contained in:
184
unix/pterm.c
184
unix/pterm.c
@ -57,10 +57,14 @@ struct gui_data {
|
||||
Backend *back;
|
||||
void *backhandle;
|
||||
Terminal *term;
|
||||
void *logctx;
|
||||
};
|
||||
|
||||
struct draw_ctx {
|
||||
GdkGC *gc;
|
||||
struct gui_data *inst;
|
||||
};
|
||||
|
||||
static struct gui_data the_inst;
|
||||
static struct gui_data *inst = &the_inst; /* so we always write `inst->' */
|
||||
static int send_raw_mouse;
|
||||
|
||||
void ldisc_update(void *frontend, int echo, int edit)
|
||||
@ -73,7 +77,7 @@ void ldisc_update(void *frontend, int echo, int edit)
|
||||
*/
|
||||
}
|
||||
|
||||
int askappend(char *filename)
|
||||
int askappend(void *frontend, char *filename)
|
||||
{
|
||||
/*
|
||||
* Logging in an xterm-alike is liable to be something you only
|
||||
@ -84,7 +88,7 @@ int askappend(char *filename)
|
||||
return 2;
|
||||
}
|
||||
|
||||
void logevent(char *string)
|
||||
void logevent(void *frontend, char *string)
|
||||
{
|
||||
/*
|
||||
* This is not a very helpful function: events are logged
|
||||
@ -93,8 +97,10 @@ void logevent(char *string)
|
||||
*/
|
||||
}
|
||||
|
||||
int font_dimension(int which) /* 0 for width, 1 for height */
|
||||
int font_dimension(void *frontend, int which)/* 0 for width, 1 for height */
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
|
||||
if (which)
|
||||
return inst->font_height;
|
||||
else
|
||||
@ -110,8 +116,10 @@ int font_dimension(int which) /* 0 for width, 1 for height */
|
||||
* mouse or a means of faking it, and there is no need to switch
|
||||
* buttons around at all.
|
||||
*/
|
||||
Mouse_Button translate_button(Mouse_Button button)
|
||||
Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
{
|
||||
/* struct gui_data *inst = (struct gui_data *)frontend; */
|
||||
|
||||
if (button == MBT_LEFT)
|
||||
return MBT_SELECT;
|
||||
if (button == MBT_MIDDLE)
|
||||
@ -125,12 +133,13 @@ Mouse_Button translate_button(Mouse_Button button)
|
||||
* Minimise or restore the window in response to a server-side
|
||||
* request.
|
||||
*/
|
||||
void set_iconic(int iconic)
|
||||
void set_iconic(void *frontend, int iconic)
|
||||
{
|
||||
/*
|
||||
* GTK 1.2 doesn't know how to do this.
|
||||
*/
|
||||
#if GTK_CHECK_VERSION(2,0,0)
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
if (iconic)
|
||||
gtk_window_iconify(GTK_WINDOW(inst->window));
|
||||
else
|
||||
@ -141,8 +150,9 @@ void set_iconic(int iconic)
|
||||
/*
|
||||
* Move the window in response to a server-side request.
|
||||
*/
|
||||
void move_window(int x, int y)
|
||||
void move_window(void *frontend, int x, int y)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
/*
|
||||
* I assume that when the GTK version of this call is available
|
||||
* we should use it. Not sure how it differs from the GDK one,
|
||||
@ -159,8 +169,9 @@ void move_window(int x, int y)
|
||||
* Move the window to the top or bottom of the z-order in response
|
||||
* to a server-side request.
|
||||
*/
|
||||
void set_zorder(int top)
|
||||
void set_zorder(void *frontend, int top)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
if (top)
|
||||
gdk_window_raise(inst->window->window);
|
||||
else
|
||||
@ -170,8 +181,9 @@ void set_zorder(int top)
|
||||
/*
|
||||
* Refresh the window in response to a server-side request.
|
||||
*/
|
||||
void refresh_window(void)
|
||||
void refresh_window(void *frontend)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
term_invalidate(inst->term);
|
||||
}
|
||||
|
||||
@ -179,12 +191,13 @@ void refresh_window(void)
|
||||
* Maximise or restore the window in response to a server-side
|
||||
* request.
|
||||
*/
|
||||
void set_zoomed(int zoomed)
|
||||
void set_zoomed(void *frontend, int zoomed)
|
||||
{
|
||||
/*
|
||||
* GTK 1.2 doesn't know how to do this.
|
||||
*/
|
||||
#if GTK_CHECK_VERSION(2,0,0)
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
if (iconic)
|
||||
gtk_window_maximize(GTK_WINDOW(inst->window));
|
||||
else
|
||||
@ -195,16 +208,18 @@ void set_zoomed(int zoomed)
|
||||
/*
|
||||
* Report whether the window is iconic, for terminal reports.
|
||||
*/
|
||||
int is_iconic(void)
|
||||
int is_iconic(void *frontend)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
return !gdk_window_is_viewable(inst->window->window);
|
||||
}
|
||||
|
||||
/*
|
||||
* Report the window's position, for terminal reports.
|
||||
*/
|
||||
void get_window_pos(int *x, int *y)
|
||||
void get_window_pos(void *frontend, int *x, int *y)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
/*
|
||||
* I assume that when the GTK version of this call is available
|
||||
* we should use it. Not sure how it differs from the GDK one,
|
||||
@ -220,8 +235,9 @@ void get_window_pos(int *x, int *y)
|
||||
/*
|
||||
* Report the window's pixel size, for terminal reports.
|
||||
*/
|
||||
void get_window_pixels(int *x, int *y)
|
||||
void get_window_pixels(void *frontend, int *x, int *y)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
/*
|
||||
* I assume that when the GTK version of this call is available
|
||||
* we should use it. Not sure how it differs from the GDK one,
|
||||
@ -237,8 +253,9 @@ void get_window_pixels(int *x, int *y)
|
||||
/*
|
||||
* Return the window or icon title.
|
||||
*/
|
||||
char *get_window_title(int icon)
|
||||
char *get_window_title(void *frontend, int icon)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
return icon ? inst->wintitle : inst->icontitle;
|
||||
}
|
||||
|
||||
@ -251,7 +268,7 @@ gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void show_mouseptr(int show)
|
||||
static void show_mouseptr(struct gui_data *inst, int show)
|
||||
{
|
||||
if (!cfg.hide_mouseptr)
|
||||
show = 1;
|
||||
@ -305,7 +322,7 @@ gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
|
||||
|
||||
gint expose_area(GtkWidget *widget, GdkEventExpose *event, gpointer data)
|
||||
{
|
||||
/* struct gui_data *inst = (struct gui_data *)data; */
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
|
||||
/*
|
||||
* Pass the exposed rectangle to terminal.c, which will call us
|
||||
@ -327,7 +344,7 @@ gint expose_area(GtkWidget *widget, GdkEventExpose *event, gpointer data)
|
||||
|
||||
gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
{
|
||||
/* struct gui_data *inst = (struct gui_data *)data; */
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
char output[32];
|
||||
int start, end;
|
||||
|
||||
@ -433,7 +450,7 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
* Neither does Shift-Ins.
|
||||
*/
|
||||
if (event->keyval == GDK_Insert && (event->state & GDK_SHIFT_MASK)) {
|
||||
request_paste();
|
||||
request_paste(inst);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -797,7 +814,7 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
#endif
|
||||
|
||||
ldisc_send(inst->ldisc, output+start, end-start, 1);
|
||||
show_mouseptr(0);
|
||||
show_mouseptr(inst, 0);
|
||||
term_seen_key_event(inst->term);
|
||||
term_out(inst->term);
|
||||
}
|
||||
@ -810,7 +827,7 @@ gint button_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
int shift, ctrl, alt, x, y, button, act;
|
||||
|
||||
show_mouseptr(1);
|
||||
show_mouseptr(inst, 1);
|
||||
|
||||
if (event->button == 4 && event->type == GDK_BUTTON_PRESS) {
|
||||
term_scroll(inst->term, 0, -5);
|
||||
@ -858,7 +875,7 @@ gint motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
int shift, ctrl, alt, x, y, button;
|
||||
|
||||
show_mouseptr(1);
|
||||
show_mouseptr(inst, 1);
|
||||
|
||||
shift = event->state & GDK_SHIFT_MASK;
|
||||
ctrl = event->state & GDK_CONTROL_MASK;
|
||||
@ -993,29 +1010,32 @@ void destroy(GtkWidget *widget, gpointer data)
|
||||
|
||||
gint focus_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
inst->term->has_focus = event->in;
|
||||
term_out(inst->term);
|
||||
term_update(inst->term);
|
||||
show_mouseptr(1);
|
||||
show_mouseptr(inst, 1);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* set or clear the "raw mouse message" mode
|
||||
*/
|
||||
void set_raw_mouse_mode(int activate)
|
||||
void set_raw_mouse_mode(void *frontend, int activate)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
activate = activate && !cfg.no_mouse_rep;
|
||||
send_raw_mouse = activate;
|
||||
if (send_raw_mouse)
|
||||
inst->currcursor = inst->rawcursor;
|
||||
else
|
||||
inst->currcursor = inst->textcursor;
|
||||
show_mouseptr(inst->mouseptr_visible);
|
||||
show_mouseptr(inst, inst->mouseptr_visible);
|
||||
}
|
||||
|
||||
void request_resize(int w, int h)
|
||||
void request_resize(void *frontend, int w, int h)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
int large_x, large_y;
|
||||
int offset_x, offset_y;
|
||||
int area_x, area_y;
|
||||
@ -1041,7 +1061,7 @@ void request_resize(int w, int h)
|
||||
* bogus size request which guarantees to be bigger than the
|
||||
* current size of the drawing area.
|
||||
*/
|
||||
get_window_pixels(&large_x, &large_y);
|
||||
get_window_pixels(inst, &large_x, &large_y);
|
||||
large_x += 32;
|
||||
large_y += 32;
|
||||
|
||||
@ -1080,7 +1100,7 @@ void request_resize(int w, int h)
|
||||
#endif
|
||||
}
|
||||
|
||||
void real_palette_set(int n, int r, int g, int b)
|
||||
static void real_palette_set(struct gui_data *inst, int n, int r, int g, int b)
|
||||
{
|
||||
gboolean success[1];
|
||||
|
||||
@ -1095,7 +1115,7 @@ void real_palette_set(int n, int r, int g, int b)
|
||||
n, r, g, b);
|
||||
}
|
||||
|
||||
void set_window_background(void)
|
||||
void set_window_background(struct gui_data *inst)
|
||||
{
|
||||
if (inst->area && inst->area->window)
|
||||
gdk_window_set_background(inst->area->window, &inst->cols[18]);
|
||||
@ -1103,22 +1123,24 @@ void set_window_background(void)
|
||||
gdk_window_set_background(inst->window->window, &inst->cols[18]);
|
||||
}
|
||||
|
||||
void palette_set(int n, int r, int g, int b)
|
||||
void palette_set(void *frontend, int n, int r, int g, int b)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
static const int first[21] = {
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
1, 3, 5, 7, 9, 11, 13, 15,
|
||||
16, 17, 18, 20, 22
|
||||
};
|
||||
real_palette_set(first[n], r, g, b);
|
||||
real_palette_set(inst, first[n], r, g, b);
|
||||
if (first[n] >= 18)
|
||||
real_palette_set(first[n] + 1, r, g, b);
|
||||
real_palette_set(inst, first[n] + 1, r, g, b);
|
||||
if (first[n] == 18)
|
||||
set_window_background();
|
||||
set_window_background(inst);
|
||||
}
|
||||
|
||||
void palette_reset(void)
|
||||
void palette_reset(void *frontend)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
/* This maps colour indices in cfg to those used in inst->cols. */
|
||||
static const int ww[] = {
|
||||
6, 7, 8, 9, 10, 11, 12, 13,
|
||||
@ -1150,11 +1172,12 @@ void palette_reset(void)
|
||||
i, cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]);
|
||||
}
|
||||
|
||||
set_window_background();
|
||||
set_window_background(inst);
|
||||
}
|
||||
|
||||
void write_clip(wchar_t * data, int len, int must_deselect)
|
||||
void write_clip(void *frontend, wchar_t * data, int len, int must_deselect)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
if (inst->pasteout_data)
|
||||
sfree(inst->pasteout_data);
|
||||
inst->pasteout_data = smalloc(len);
|
||||
@ -1174,6 +1197,7 @@ void write_clip(wchar_t * data, int len, int must_deselect)
|
||||
void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
|
||||
guint info, guint time_stamp, gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
gtk_selection_data_set(seldata, GDK_SELECTION_TYPE_STRING, 8,
|
||||
inst->pasteout_data, inst->pasteout_data_len);
|
||||
}
|
||||
@ -1181,6 +1205,7 @@ void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
|
||||
gint selection_clear(GtkWidget *widget, GdkEventSelection *seldata,
|
||||
gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
term_deselect(inst->term);
|
||||
if (inst->pasteout_data)
|
||||
sfree(inst->pasteout_data);
|
||||
@ -1189,8 +1214,9 @@ gint selection_clear(GtkWidget *widget, GdkEventSelection *seldata,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void request_paste(void)
|
||||
void request_paste(void *frontend)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
/*
|
||||
* In Unix, pasting is asynchronous: all we can do at the
|
||||
* moment is to call gtk_selection_convert(), and when the data
|
||||
@ -1205,6 +1231,8 @@ gint idle_paste_func(gpointer data); /* forward ref */
|
||||
void selection_received(GtkWidget *widget, GtkSelectionData *seldata,
|
||||
gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
|
||||
if (seldata->length <= 0 ||
|
||||
seldata->type != GDK_SELECTION_TYPE_STRING)
|
||||
return; /* Nothing happens. */
|
||||
@ -1236,30 +1264,35 @@ gint idle_paste_func(gpointer data)
|
||||
}
|
||||
|
||||
|
||||
void get_clip(wchar_t ** p, int *len)
|
||||
void get_clip(void *frontend, wchar_t ** p, int *len)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
|
||||
if (p) {
|
||||
*p = inst->pastein_data;
|
||||
*len = inst->pastein_data_len;
|
||||
}
|
||||
}
|
||||
|
||||
void set_title(char *title)
|
||||
void set_title(void *frontend, char *title)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
strncpy(inst->wintitle, title, lenof(inst->wintitle));
|
||||
inst->wintitle[lenof(inst->wintitle)-1] = '\0';
|
||||
gtk_window_set_title(GTK_WINDOW(inst->window), inst->wintitle);
|
||||
}
|
||||
|
||||
void set_icon(char *title)
|
||||
void set_icon(void *frontend, char *title)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
strncpy(inst->icontitle, title, lenof(inst->icontitle));
|
||||
inst->icontitle[lenof(inst->icontitle)-1] = '\0';
|
||||
gdk_window_set_icon_name(inst->window->window, inst->icontitle);
|
||||
}
|
||||
|
||||
void set_sbar(int total, int start, int page)
|
||||
void set_sbar(void *frontend, int total, int start, int page)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
if (!cfg.scrollbar)
|
||||
return;
|
||||
inst->sbar_adjust->lower = 0;
|
||||
@ -1275,20 +1308,22 @@ void set_sbar(int total, int start, int page)
|
||||
|
||||
void scrollbar_moved(GtkAdjustment *adj, gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
|
||||
if (!cfg.scrollbar)
|
||||
return;
|
||||
if (!inst->ignore_sbar)
|
||||
term_scroll(inst->term, 1, (int)adj->value);
|
||||
}
|
||||
|
||||
void sys_cursor(int x, int y)
|
||||
void sys_cursor(void *frontend, int x, int y)
|
||||
{
|
||||
/*
|
||||
* This is meaningless under X.
|
||||
*/
|
||||
}
|
||||
|
||||
void beep(int mode)
|
||||
void beep(void *frontend, int mode)
|
||||
{
|
||||
gdk_beep();
|
||||
}
|
||||
@ -1303,19 +1338,27 @@ int CharWidth(Context ctx, int uc)
|
||||
return 1;
|
||||
}
|
||||
|
||||
Context get_ctx(void)
|
||||
Context get_ctx(void *frontend)
|
||||
{
|
||||
GdkGC *gc;
|
||||
struct gui_data *inst = (struct gui_data *)frontend;
|
||||
struct draw_ctx *dctx;
|
||||
|
||||
if (!inst->area->window)
|
||||
return NULL;
|
||||
gc = gdk_gc_new(inst->area->window);
|
||||
return gc;
|
||||
|
||||
dctx = smalloc(sizeof(*dctx));
|
||||
dctx->inst = inst;
|
||||
dctx->gc = gdk_gc_new(inst->area->window);
|
||||
return dctx;
|
||||
}
|
||||
|
||||
void free_ctx(Context ctx)
|
||||
{
|
||||
GdkGC *gc = (GdkGC *)ctx;
|
||||
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
||||
/* struct gui_data *inst = dctx->inst; */
|
||||
GdkGC *gc = dctx->gc;
|
||||
gdk_gc_unref(gc);
|
||||
sfree(dctx);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1327,8 +1370,11 @@ void free_ctx(Context ctx)
|
||||
void do_text_internal(Context ctx, int x, int y, char *text, int len,
|
||||
unsigned long attr, int lattr)
|
||||
{
|
||||
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
||||
struct gui_data *inst = dctx->inst;
|
||||
GdkGC *gc = dctx->gc;
|
||||
|
||||
int nfg, nbg, t, fontid, shadow;
|
||||
GdkGC *gc = (GdkGC *)ctx;
|
||||
|
||||
/*
|
||||
* NYI:
|
||||
@ -1437,7 +1483,9 @@ void do_text_internal(Context ctx, int x, int y, char *text, int len,
|
||||
void do_text(Context ctx, int x, int y, char *text, int len,
|
||||
unsigned long attr, int lattr)
|
||||
{
|
||||
GdkGC *gc = (GdkGC *)ctx;
|
||||
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
||||
struct gui_data *inst = dctx->inst;
|
||||
GdkGC *gc = dctx->gc;
|
||||
|
||||
do_text_internal(ctx, x, y, text, len, attr, lattr);
|
||||
|
||||
@ -1461,8 +1509,11 @@ void do_text(Context ctx, int x, int y, char *text, int len,
|
||||
void do_cursor(Context ctx, int x, int y, char *text, int len,
|
||||
unsigned long attr, int lattr)
|
||||
{
|
||||
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
||||
struct gui_data *inst = dctx->inst;
|
||||
GdkGC *gc = dctx->gc;
|
||||
|
||||
int passive;
|
||||
GdkGC *gc = (GdkGC *)ctx;
|
||||
|
||||
if (attr & TATTR_PASCURS) {
|
||||
attr &= ~TATTR_PASCURS;
|
||||
@ -1551,7 +1602,7 @@ void do_cursor(Context ctx, int x, int y, char *text, int len,
|
||||
len*inst->font_width, inst->font_height);
|
||||
}
|
||||
|
||||
GdkCursor *make_mouse_ptr(int cursor_val)
|
||||
GdkCursor *make_mouse_ptr(struct gui_data *inst, int cursor_val)
|
||||
{
|
||||
/*
|
||||
* Truly hideous hack: GTK doesn't allow us to set the mouse
|
||||
@ -1654,7 +1705,7 @@ void modalfatalbox(char *p, ...)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *get_x_display(void)
|
||||
char *get_x_display(void *frontend)
|
||||
{
|
||||
return gdk_get_display();
|
||||
}
|
||||
@ -1827,6 +1878,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
extern int pty_master_fd; /* declared in pty.c */
|
||||
extern void pty_pre_init(void); /* declared in pty.c */
|
||||
struct gui_data *inst;
|
||||
|
||||
pty_pre_init();
|
||||
|
||||
@ -1839,8 +1891,9 @@ int main(int argc, char **argv)
|
||||
exit(1);
|
||||
|
||||
/*
|
||||
* Initialise the whole instance structure to zeroes
|
||||
* Create an instance structure and initialise to zeroes
|
||||
*/
|
||||
inst = smalloc(sizeof(*inst));
|
||||
memset(inst, 0, sizeof(*inst));
|
||||
|
||||
inst->fonts[0] = gdk_font_load(cfg.font);
|
||||
@ -1868,14 +1921,14 @@ int main(int argc, char **argv)
|
||||
inst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
|
||||
if (cfg.wintitle[0])
|
||||
set_title(cfg.wintitle);
|
||||
set_title(inst, cfg.wintitle);
|
||||
else
|
||||
set_title("pterm");
|
||||
set_title(inst, "pterm");
|
||||
|
||||
/*
|
||||
* Set up the colour map.
|
||||
*/
|
||||
palette_reset();
|
||||
palette_reset(inst);
|
||||
|
||||
inst->area = gtk_drawing_area_new();
|
||||
gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area),
|
||||
@ -1954,19 +2007,22 @@ int main(int argc, char **argv)
|
||||
gtk_widget_show(GTK_WIDGET(inst->hbox));
|
||||
gtk_widget_show(inst->window);
|
||||
|
||||
set_window_background();
|
||||
set_window_background(inst);
|
||||
|
||||
inst->textcursor = make_mouse_ptr(GDK_XTERM);
|
||||
inst->rawcursor = make_mouse_ptr(GDK_LEFT_PTR);
|
||||
inst->blankcursor = make_mouse_ptr(-1);
|
||||
make_mouse_ptr(-2); /* clean up cursor font */
|
||||
inst->textcursor = make_mouse_ptr(inst, GDK_XTERM);
|
||||
inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR);
|
||||
inst->blankcursor = make_mouse_ptr(inst, -1);
|
||||
make_mouse_ptr(inst, -2); /* clean up cursor font */
|
||||
inst->currcursor = inst->textcursor;
|
||||
show_mouseptr(1);
|
||||
show_mouseptr(inst, 1);
|
||||
|
||||
inst->term = term_init();
|
||||
inst->term = term_init(inst);
|
||||
inst->logctx = log_init(inst);
|
||||
term_provide_logctx(inst->term, inst->logctx);
|
||||
|
||||
inst->back = &pty_backend;
|
||||
inst->back->init((void *)inst->term, &inst->backhandle, NULL, 0, NULL, 0);
|
||||
inst->back->provide_logctx(inst->backhandle, inst->logctx);
|
||||
|
||||
term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle);
|
||||
|
||||
|
16
unix/pty.c
16
unix/pty.c
@ -68,6 +68,7 @@
|
||||
#endif
|
||||
|
||||
int pty_master_fd;
|
||||
static void *pty_frontend;
|
||||
static char pty_name[FILENAME_MAX];
|
||||
static int pty_stamped_utmp = 0;
|
||||
static int pty_child_pid;
|
||||
@ -388,6 +389,7 @@ static char *pty_init(void *frontend, void **backend_handle,
|
||||
int slavefd;
|
||||
pid_t pid, pgrp;
|
||||
|
||||
pty_frontend = frontend;
|
||||
*backend_handle = NULL; /* we can't sensibly use this, sadly */
|
||||
|
||||
pty_term_width = cfg.width;
|
||||
@ -414,7 +416,7 @@ static char *pty_init(void *frontend, void **backend_handle,
|
||||
if (!cfg.stamp_utmp)
|
||||
close(pty_utmp_helper_pipe); /* just let the child process die */
|
||||
else {
|
||||
char *location = get_x_display();
|
||||
char *location = get_x_display(pty_frontend);
|
||||
int len = strlen(location)+1, pos = 0; /* +1 to include NUL */
|
||||
while (pos < len) {
|
||||
int ret = write(pty_utmp_helper_pipe, location+pos, len - pos);
|
||||
@ -554,8 +556,10 @@ static void pty_size(void *handle, int width, int height)
|
||||
|
||||
size.ws_row = (unsigned short)pty_term_height;
|
||||
size.ws_col = (unsigned short)pty_term_width;
|
||||
size.ws_xpixel = (unsigned short) pty_term_width * font_dimension(0);
|
||||
size.ws_ypixel = (unsigned short) pty_term_height * font_dimension(1);
|
||||
size.ws_xpixel = (unsigned short) pty_term_width *
|
||||
font_dimension(pty_frontend, 0);
|
||||
size.ws_ypixel = (unsigned short) pty_term_height *
|
||||
font_dimension(pty_frontend, 1);
|
||||
ioctl(pty_master_fd, TIOCSWINSZ, (void *)&size);
|
||||
return;
|
||||
}
|
||||
@ -594,6 +598,11 @@ static void pty_provide_ldisc(void *handle, void *ldisc)
|
||||
/* This is a stub. */
|
||||
}
|
||||
|
||||
static void pty_provide_logctx(void *handle, void *logctx)
|
||||
{
|
||||
/* This is a stub. */
|
||||
}
|
||||
|
||||
static int pty_exitcode(void *handle)
|
||||
{
|
||||
if (!pty_child_dead)
|
||||
@ -613,6 +622,7 @@ Backend pty_backend = {
|
||||
pty_sendok,
|
||||
pty_ldisc,
|
||||
pty_provide_ldisc,
|
||||
pty_provide_logctx,
|
||||
pty_unthrottle,
|
||||
1
|
||||
};
|
||||
|
@ -31,8 +31,8 @@ unsigned long getticks(void); /* based on gettimeofday(2) */
|
||||
#define BYTE unsigned char
|
||||
|
||||
/* Things pty.c needs from pterm.c */
|
||||
char *get_x_display(void);
|
||||
int font_dimension(int which); /* 0 for width, 1 for height */
|
||||
char *get_x_display(void *frontend);
|
||||
int font_dimension(void *frontend, int which);/* 0 for width, 1 for height */
|
||||
|
||||
/* Things uxstore.c needs from pterm.c */
|
||||
char *app_name; /* for doing resource lookups */
|
||||
|
Reference in New Issue
Block a user