1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 01:02:24 +00:00

Support for all the server-side window configuration requests,

including server-controlled resizing. Irritatingly I've had to use a
deprecated option to gtk_window_set_policy() to make this work,
resulting in me raising GNOME bug #95818 to ask for it to be un-
deprecated again...

[originally from svn r2061]
This commit is contained in:
Simon Tatham 2002-10-15 14:31:06 +00:00
parent 0c011dcbe0
commit c15a6ada0c

View File

@ -42,6 +42,7 @@ struct gui_data {
guint term_paste_idle_id; guint term_paste_idle_id;
GdkAtom compound_text_atom; GdkAtom compound_text_atom;
char wintitle[sizeof(((Config *)0)->wintitle)]; char wintitle[sizeof(((Config *)0)->wintitle)];
char icontitle[sizeof(((Config *)0)->wintitle)];
}; };
static struct gui_data the_inst; static struct gui_data the_inst;
@ -104,7 +105,15 @@ Mouse_Button translate_button(Mouse_Button button)
*/ */
void set_iconic(int iconic) void set_iconic(int iconic)
{ {
/* FIXME: currently ignored */ /*
* GTK 1.2 doesn't know how to do this.
*/
#if GTK_CHECK_VERSION(2,0,0)
if (iconic)
gtk_window_iconify(GTK_WINDOW(inst->window));
else
gtk_window_deiconify(GTK_WINDOW(inst->window));
#endif
} }
/* /*
@ -112,7 +121,16 @@ void set_iconic(int iconic)
*/ */
void move_window(int x, int y) void move_window(int x, int y)
{ {
/* FIXME: currently ignored */ /*
* 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,
* though.
*/
#if GTK_CHECK_VERSION(2,0,0)
gtk_window_move(GTK_WINDOW(inst->window), x, y);
#else
gdk_window_move(inst->window->window, x, y);
#endif
} }
/* /*
@ -121,7 +139,10 @@ void move_window(int x, int y)
*/ */
void set_zorder(int top) void set_zorder(int top)
{ {
/* FIXME: currently ignored */ if (top)
gdk_window_raise(inst->window->window);
else
gdk_window_lower(inst->window->window);
} }
/* /*
@ -129,7 +150,7 @@ void set_zorder(int top)
*/ */
void refresh_window(void) void refresh_window(void)
{ {
/* FIXME: currently ignored */ term_invalidate();
} }
/* /*
@ -138,7 +159,15 @@ void refresh_window(void)
*/ */
void set_zoomed(int zoomed) void set_zoomed(int zoomed)
{ {
/* FIXME: currently ignored */ /*
* GTK 1.2 doesn't know how to do this.
*/
#if GTK_CHECK_VERSION(2,0,0)
if (iconic)
gtk_window_maximize(GTK_WINDOW(inst->window));
else
gtk_window_unmaximize(GTK_WINDOW(inst->window));
#endif
} }
/* /*
@ -146,7 +175,7 @@ void set_zoomed(int zoomed)
*/ */
int is_iconic(void) int is_iconic(void)
{ {
return 0; /* FIXME */ return !gdk_window_is_viewable(inst->window->window);
} }
/* /*
@ -154,7 +183,16 @@ int is_iconic(void)
*/ */
void get_window_pos(int *x, int *y) void get_window_pos(int *x, int *y)
{ {
*x = 3; *y = 4; /* FIXME */ /*
* 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,
* though.
*/
#if GTK_CHECK_VERSION(2,0,0)
gtk_window_get_position(GTK_WINDOW(inst->window), x, y);
#else
gdk_window_get_position(inst->window->window, x, y);
#endif
} }
/* /*
@ -162,7 +200,16 @@ void get_window_pos(int *x, int *y)
*/ */
void get_window_pixels(int *x, int *y) void get_window_pixels(int *x, int *y)
{ {
*x = 1; *y = 2; /* FIXME */ /*
* 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,
* though.
*/
#if GTK_CHECK_VERSION(2,0,0)
gtk_window_get_size(GTK_WINDOW(inst->window), x, y);
#else
gdk_window_get_size(inst->window->window, x, y);
#endif
} }
/* /*
@ -170,7 +217,7 @@ void get_window_pixels(int *x, int *y)
*/ */
char *get_window_title(int icon) char *get_window_title(int icon)
{ {
return inst->wintitle; return icon ? inst->wintitle : inst->icontitle;
} }
gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data) gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data)
@ -198,13 +245,10 @@ gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
struct gui_data *inst = (struct gui_data *)data; struct gui_data *inst = (struct gui_data *)data;
int w, h, need_size = 0; int w, h, need_size = 0;
/* printf("configure %d x %d\n", event->width, event->height);
* Set up the colour map.
*/
palette_reset();
w = (event->width - 2*cfg.window_border) / inst->font_width; w = (event->width - 2*cfg.window_border) / inst->font_width;
h = (event->height - 2*cfg.window_border) / inst->font_height; h = (event->height - 2*cfg.window_border) / inst->font_height;
printf(" = %d x %d\n", w, h);
if (w != cfg.width || h != cfg.height) { if (w != cfg.width || h != cfg.height) {
if (inst->pixmap) { if (inst->pixmap) {
@ -214,6 +258,7 @@ gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
cfg.width = w; cfg.width = w;
cfg.height = h; cfg.height = h;
need_size = 1; need_size = 1;
printf("need size\n");
} }
if (!inst->pixmap) { if (!inst->pixmap) {
GdkGC *gc; GdkGC *gc;
@ -808,7 +853,9 @@ void set_raw_mouse_mode(int activate)
void request_resize(int w, int h) void request_resize(int w, int h)
{ {
/* FIXME: currently ignored */ gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area),
inst->font_width * w + 2*cfg.window_border,
inst->font_height * h + 2*cfg.window_border);
} }
void real_palette_set(int n, int r, int g, int b) void real_palette_set(int n, int r, int g, int b)
@ -972,7 +1019,9 @@ void set_title(char *title)
void set_icon(char *title) void set_icon(char *title)
{ {
/* FIXME: currently ignored */ 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(int total, int start, int page)
@ -1356,6 +1405,11 @@ int main(int argc, char **argv)
else else
set_title("pterm"); set_title("pterm");
/*
* Set up the colour map.
*/
palette_reset();
inst->area = gtk_drawing_area_new(); inst->area = gtk_drawing_area_new();
gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area),
inst->font_width * cfg.width + 2*cfg.window_border, inst->font_width * cfg.width + 2*cfg.window_border,
@ -1366,6 +1420,8 @@ int main(int argc, char **argv)
gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRUE, 0); gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRUE, 0);
gtk_box_pack_end(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_box_pack_end(inst->hbox, inst->sbar, FALSE, FALSE, 0);
gtk_window_set_policy(GTK_WINDOW(inst->window), FALSE, TRUE, TRUE);
gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox)); gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox));
{ {
@ -1435,7 +1491,7 @@ int main(int argc, char **argv)
gdk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input_func, inst); gdk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input_func, inst);
term_init(); term_init();
term_size(24, 80, 2000); term_size(cfg.height, cfg.width, cfg.savelines);
gtk_main(); gtk_main();