1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +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;
GdkAtom compound_text_atom;
char wintitle[sizeof(((Config *)0)->wintitle)];
char icontitle[sizeof(((Config *)0)->wintitle)];
};
static struct gui_data the_inst;
@ -104,7 +105,15 @@ Mouse_Button translate_button(Mouse_Button button)
*/
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)
{
/* 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)
{
/* 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)
{
/* FIXME: currently ignored */
term_invalidate();
}
/*
@ -138,7 +159,15 @@ void refresh_window(void)
*/
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)
{
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)
{
*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)
{
*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)
{
return inst->wintitle;
return icon ? inst->wintitle : inst->icontitle;
}
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;
int w, h, need_size = 0;
/*
* Set up the colour map.
*/
palette_reset();
printf("configure %d x %d\n", event->width, event->height);
w = (event->width - 2*cfg.window_border) / inst->font_width;
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 (inst->pixmap) {
@ -214,6 +258,7 @@ gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
cfg.width = w;
cfg.height = h;
need_size = 1;
printf("need size\n");
}
if (!inst->pixmap) {
GdkGC *gc;
@ -808,7 +853,9 @@ void set_raw_mouse_mode(int activate)
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)
@ -972,7 +1019,9 @@ void set_title(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)
@ -1356,6 +1405,11 @@ int main(int argc, char **argv)
else
set_title("pterm");
/*
* Set up the colour map.
*/
palette_reset();
inst->area = gtk_drawing_area_new();
gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area),
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_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));
{
@ -1435,7 +1491,7 @@ int main(int argc, char **argv)
gdk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input_func, inst);
term_init();
term_size(24, 80, 2000);
term_size(cfg.height, cfg.width, cfg.savelines);
gtk_main();