This commit is contained in:
Adam D. Ruppe 2022-03-28 11:53:26 -04:00
parent 213c441059
commit d3841ee50f
2 changed files with 27 additions and 6 deletions

View File

@ -11158,7 +11158,7 @@ class TextLabel : Widget {
override int minWidth() { return 32; }
override int flexBasisHeight() { return minHeight(); }
override int flexBasisWidth() { return cast(int) label_.length * 7; }
override int flexBasisWidth() { return defaultTextWidth(label); }
string label_;
@ -11216,9 +11216,10 @@ class TextLabel : Widget {
TextAlignment alignment;
version(custom_widgets)
override void paint(WidgetPainter painter) {
override Rectangle paintContent(WidgetPainter painter, const Rectangle bounds) {
painter.outlineColor = getComputedStyle().foregroundColor;
painter.drawText(Point(0, 0), this.label, Point(width, height), alignment);
return bounds;
}
}

View File

@ -1851,7 +1851,7 @@ class SimpleWindow : CapableOfHandlingNativeEvent, CapableOfBeingDrawnUpon {
);
+/
}
// import std.stdio; writeln("Here", MonitorInfo.info);
// import std.stdio; writeln("Here", MonitorInfo.info);
}
}
@ -1894,6 +1894,7 @@ class SimpleWindow : CapableOfHandlingNativeEvent, CapableOfBeingDrawnUpon {
static MonitorInfo[] info;
}
bool screenPositionKnown;
int screenPositionX;
int screenPositionY;
void updateActualDpi(bool loadingNow = false) {
@ -14811,9 +14812,28 @@ version(X11) {
if(auto win = event.window in SimpleWindow.nativeMapping) {
//version(sdddd) { import std.stdio; writeln(" w=", event.width, "; h=", event.height); }
win.screenPositionX = event.x;
win.screenPositionY = event.y;
win.updateActualDpi();
/+
The ICCCM says window managers must send a synthetic event when the window
is moved but NOT when it is resized. In the resize case, an event is sent
with position (0, 0) which can be wrong and break the dpi calculations.
So we only consider the synthetic events from the WM and otherwise
need to wait for some other event to get the position which... sucks.
I'd rather not have windows changing their layout on mouse motion after
switching monitors... might be forced to but for now just ignoring it.
Easiest way to switch monitors without sending a size position is by
maximize or fullscreen in a setup like mine, but on most setups those
work on the monitor it is already living on, so it should be ok most the
time.
+/
if(event.send_event) {
win.screenPositionKnown = true;
win.screenPositionX = event.x;
win.screenPositionY = event.y;
win.updateActualDpi();
}
recordX11ResizeAsync(display, *win, event.width, event.height);
}