mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-02 08:57:19 -04:00
"Resize terminal" tries to use the window size increment.
Previously, the window sizes computed for xterm were a few pixels off, and this could result in too few character cells being displayed. This new version tries to read the window size increment from the WM_NORMAL_HINTS property set by xterm, and base the computations on that.
This commit is contained in:
parent
15a5d91d2b
commit
d1fb65120d
@ -570,13 +570,41 @@ resize_window(int width, int height, int old_width, int old_height)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!x_error && status) {
|
if (!x_error && status) {
|
||||||
|
XSizeHints *size_hints;
|
||||||
|
long mask;
|
||||||
|
int px_width = 0;
|
||||||
|
int px_height = 0;
|
||||||
|
|
||||||
|
/* With xterm 210, a window with 80x24 characters at
|
||||||
|
* a 6x13 font appears to have 484x316 pixels; both
|
||||||
|
* the width and height include four extra pixels.
|
||||||
|
* Computing a new size by scaling these values often
|
||||||
|
* results in windows that cannot display as many
|
||||||
|
* characters as was intended. We can do better if we
|
||||||
|
* can find out the actual size of character cells.
|
||||||
|
* If the terminal emulator has set a window size
|
||||||
|
* increment, assume that is the cell size. */
|
||||||
|
size_hints = XAllocSizeHints();
|
||||||
|
if (size_hints != NULL
|
||||||
|
&& XGetWMNormalHints(display, window, size_hints, &mask)
|
||||||
|
&& (mask & PResizeInc) != 0) {
|
||||||
|
px_width = attributes.width
|
||||||
|
+ (width - old_width) * size_hints->width_inc;
|
||||||
|
px_height = attributes.height
|
||||||
|
+ (height - old_height) * size_hints->height_inc;
|
||||||
|
}
|
||||||
|
if (px_width <= 0 || px_height <= 0) {
|
||||||
double ratio_width = (double) attributes.width / old_width;
|
double ratio_width = (double) attributes.width / old_width;
|
||||||
double ratio_height = (double) attributes.height / old_height;
|
double ratio_height = (double) attributes.height / old_height;
|
||||||
|
|
||||||
width = (int) ((double) width * ratio_width);
|
px_width = (int) ((double) width * ratio_width);
|
||||||
height = (int) ((double) height * ratio_height);
|
px_height = (int) ((double) height * ratio_height);
|
||||||
|
}
|
||||||
|
|
||||||
status = XResizeWindow(display, window, width, height);
|
if (size_hints)
|
||||||
|
XFree(size_hints);
|
||||||
|
|
||||||
|
status = XResizeWindow(display, window, px_width, px_height);
|
||||||
while (!x_error && !status) {
|
while (!x_error && !status) {
|
||||||
Window root, parent, *children;
|
Window root, parent, *children;
|
||||||
unsigned int num_children;
|
unsigned int num_children;
|
||||||
@ -588,7 +616,7 @@ resize_window(int width, int height, int old_width, int old_height)
|
|||||||
if (parent == root || parent == 0)
|
if (parent == root || parent == 0)
|
||||||
break;
|
break;
|
||||||
window = parent;
|
window = parent;
|
||||||
status = XResizeWindow(display, window, width, height);
|
status = XResizeWindow(display, window, px_width, px_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user