* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen @ 2018-06-21 3:12 Jonathan Kyle Mitchell 2018-06-21 7:16 ` martin rudalics 0 siblings, 1 reply; 13+ messages in thread From: Jonathan Kyle Mitchell @ 2018-06-21 3:12 UTC (permalink / raw) To: 31920 1. save a frameset with an unmaximized frame start from emacs -Q create a second window with `C-x 2' use the mouse to move the frame to the right side of the desktop save the split window frame with `C-x r f a' 2. save a frameset with a maximized/fullscreen frame delete one of the windows with `C-x 1' press `f11' to make the frame fullscreen save the fullscreen frame with `C-x r f b' 3. restore the unmaximized frameset with `C-x r j a' After jumping between framesets from register b to register a, the non-fullscreen frame appears on the opposite (left) side of the desktop than it was originally. Typing `C-x r j a' a second time moves the frame to its original location. I've reproduced this using Emacs 26.1 in both Windows 10 and Fedora 28 KDE desktop environments. In GNU Emacs 26.1 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.22.30) of 2018-06-04 built on buildvm-10.phx2.fedoraproject.org Windowing system distributor 'Fedora Project', version 11.0.11906000 Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. C-x C-g is undefined Quit funcall-interactively: End of buffer Configured using: 'configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-dbus --with-gif --with-jpeg --with-png --with-rsvg --with-tiff --with-xft --with-xpm --with-x-toolkit=gtk3 --with-gpm=no --with-xwidgets --with-modules build_alias=x86_64-redhat-linux-gnu host_alias=x86_64-redhat-linux-gnu 'CFLAGS=-DMAIL_USE_LOCKF -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' LDFLAGS=-Wl,-z,relro PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' Configured features: XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND DBUS GSETTINGS NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 MODULES THREADS XWIDGETS LCMS2 Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv bytecomp byte-compile cconv dired dired-loaddefs format-spec rfc822 mml mml-sec password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils cl-extra help-mode easymenu cl-seq frameset cl-loaddefs cl-lib elec-pair time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting xwidget-internal move-toolbar gtk x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 98781 10240) (symbols 48 20607 1) (miscs 40 49 104) (strings 32 28810 1074) (string-bytes 1 760814) (vectors 16 15071) (vector-slots 8 500054 6618) (floats 8 56 318) (intervals 56 275 0) (buffers 992 11)) ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-21 3:12 bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen Jonathan Kyle Mitchell @ 2018-06-21 7:16 ` martin rudalics 2018-06-21 10:25 ` Robert Pluim 2018-06-21 15:54 ` Eli Zaretskii 0 siblings, 2 replies; 13+ messages in thread From: martin rudalics @ 2018-06-21 7:16 UTC (permalink / raw) To: Jonathan Kyle Mitchell, 31920 > 1. save a frameset with an unmaximized frame > start from emacs -Q > create a second window with `C-x 2' > use the mouse to move the frame to the right side of the desktop > save the split window frame with `C-x r f a' > > 2. save a frameset with a maximized/fullscreen frame > delete one of the windows with `C-x 1' > press `f11' to make the frame fullscreen > save the fullscreen frame with `C-x r f b' > > 3. restore the unmaximized frameset with `C-x r j a' > After jumping between framesets from register b to register a, the > non-fullscreen frame appears on the opposite (left) side of the desktop > than it was originally. Typing `C-x r j a' a second time moves the frame > to its original location. > > I've reproduced this using Emacs 26.1 in both Windows 10 and Fedora 28 > KDE desktop environments. > > In GNU Emacs 26.1 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.22.30) > of 2018-06-04 built on buildvm-10.phx2.fedoraproject.org Thanks for the report. Here I can't reproduce the behavior you observe on Windows XP even if I modify your recipe in various ways. Maybe someone else can give it a try. Do you really have to split the window in step 1 and delete a window in step 2 to produce the bug? These actions appear unrelated to the behavior you observe since window managers pretty much ignore Emacs windows. Also what happens if, in step 2, you maximize the window instead of making it fullscreen? frameset.el has (modify-frame-parameters frame (if (eq (frame-parameter frame 'fullscreen) fullscreen) ;; Workaround for bug#14949 (assq-delete-all 'fullscreen filtered-cfg) filtered-cfg)) which might affect the behavior on your system. Can you take out this form, reevaluate 'frameset--restore-frame' and see whether anything changes? And maybe you could also try with (when (and force-onscreen ;; FIXME: iconified frames should be checked too, ;; but it is impossible without deiconifying them. (not (eq (frame-parameter frame 'visibility) 'icon))) (frameset-move-onscreen frame force-onscreen)) removed from 'frameset--restore-frame'. martin ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-21 7:16 ` martin rudalics @ 2018-06-21 10:25 ` Robert Pluim 2018-06-22 8:55 ` martin rudalics 2018-06-21 15:54 ` Eli Zaretskii 1 sibling, 1 reply; 13+ messages in thread From: Robert Pluim @ 2018-06-21 10:25 UTC (permalink / raw) To: martin rudalics; +Cc: 31920, Jonathan Kyle Mitchell martin rudalics <rudalics@gmx.at> writes: >> In GNU Emacs 26.1 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.22.30) >> of 2018-06-04 built on buildvm-10.phx2.fedoraproject.org > > Thanks for the report. Here I can't reproduce the behavior you > observe on Windows XP even if I modify your recipe in various ways. > Maybe someone else can give it a try. > I see this on my Ubuntu 16.04 box, also running KDE, but only if I go through the restore cycle twice. Also, if I restore frameset a again, the frame ends up in the right place, ie: restore a -> OK restore b -> OK restore a -> NOK restore a -> OK > Do you really have to split the window in step 1 and delete a window > in step 2 to produce the bug? These actions appear unrelated to the > behavior you observe since window managers pretty much ignore Emacs > windows. I donʼt need to split the window. > Also what happens if, in step 2, you maximize the window instead of > making it fullscreen? frameset.el has > > (modify-frame-parameters frame > (if (eq (frame-parameter frame 'fullscreen) fullscreen) > ;; Workaround for bug#14949 > (assq-delete-all 'fullscreen filtered-cfg) > filtered-cfg)) > > which might affect the behavior on your system. Can you take out this > form, reevaluate 'frameset--restore-frame' and see whether anything > changes? > > And maybe you could also try with > > (when (and force-onscreen > ;; FIXME: iconified frames should be checked too, > ;; but it is impossible without deiconifying them. > (not (eq (frame-parameter frame 'visibility) 'icon))) > (frameset-move-onscreen frame force-onscreen)) > > removed from 'frameset--restore-frame'. Neither of those make any difference for me, nor does using toggle-frame-maximized. Regards Robert ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-21 10:25 ` Robert Pluim @ 2018-06-22 8:55 ` martin rudalics 2018-06-22 11:19 ` Robert Pluim 0 siblings, 1 reply; 13+ messages in thread From: martin rudalics @ 2018-06-22 8:55 UTC (permalink / raw) To: Robert Pluim; +Cc: 31920, Jonathan Kyle Mitchell > I see this on my Ubuntu 16.04 box, also running KDE, but only if I go > through the restore cycle twice. Also, if I restore frameset a again, > the frame ends up in the right place, ie: > > restore a -> OK > restore b -> OK > restore a -> NOK > restore a -> OK Confirmed. The transition from b to a via C-x r j a always moves the frame to the top/left corner of the screen here. IIUC C-x r f runs the command 'frameset-to-register' which stores a "framset" in a register. C-x r j runs the command 'jump-to-register' which does _not_ restore a frame's state via 'frameset--restore-frame' but goes to 'set-frame-configuration' instead. Apparently, framesets and frame configurations differ in a couple of minor aspects and the fullscreen state is one of them. We probably should replace (set-frame-configuration (car val) (not delete)) by something like (frameset-restore (car val)) but my knowledge of constructs like 'cl-defmethod' and 'cl-defun' is too limited to play around with such a change. Maybe someone wants to give it at try, it should be a rather low-hanging fruit. > Neither of those make any difference for me, nor does using > toggle-frame-maximized. Obviously so because 'frameset--restore-frame' does not get called in the first place. Thanks for investigating, martin ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-22 8:55 ` martin rudalics @ 2018-06-22 11:19 ` Robert Pluim 2018-06-22 12:17 ` martin rudalics 0 siblings, 1 reply; 13+ messages in thread From: Robert Pluim @ 2018-06-22 11:19 UTC (permalink / raw) To: martin rudalics; +Cc: 31920, Jonathan Kyle Mitchell martin rudalics <rudalics@gmx.at> writes: >> I see this on my Ubuntu 16.04 box, also running KDE, but only if I go >> through the restore cycle twice. Also, if I restore frameset a again, >> the frame ends up in the right place, ie: >> >> restore a -> OK >> restore b -> OK >> restore a -> NOK >> restore a -> OK > > Confirmed. The transition from b to a via C-x r j a always moves the > frame to the top/left corner of the screen here. > > IIUC C-x r f runs the command 'frameset-to-register' which stores a > "framset" in a register. C-x r j runs the command 'jump-to-register' > which does _not_ restore a frame's state via 'frameset--restore-frame' > but goes to 'set-frame-configuration' instead. Apparently, framesets > and frame configurations differ in a couple of minor aspects and the > fullscreen state is one of them. They do, but when edebugging jump-to-register, I end up in this branch of the cond: ((registerv-p val) (cl-assert (registerv-jump-func val) nil "Don't know how to jump to register %s" (single-key-description register)) (funcall (registerv-jump-func val) (registerv-data val))) Which ends up calling frameset--restore-frame, so the problem is elsewhere. >> Neither of those make any difference for me, nor does using >> toggle-frame-maximized. > > Obviously so because 'frameset--restore-frame' does not get called in > the first place. I think I tested the wrong thing, probably because I forgot an 'eval-defun' somewhere. The code that causes the frame to be restored in the wrong place is this: (modify-frame-parameters frame (if (eq (frame-parameter frame 'fullscreen) fullscreen) ;; Workaround for bug#14949 (assq-delete-all 'fullscreen filtered-cfg) filtered-cfg)) in framset--restore-frame, which means Iʼm going to have to break out gdb and/or printf. (Iʼm surprised Eli is seeing this on MS-Windows though, I thought the low-level frame implementation was completely separate) Robert ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-22 11:19 ` Robert Pluim @ 2018-06-22 12:17 ` martin rudalics 2018-06-22 13:50 ` Robert Pluim 0 siblings, 1 reply; 13+ messages in thread From: martin rudalics @ 2018-06-22 12:17 UTC (permalink / raw) To: Robert Pluim; +Cc: 31920, Jonathan Kyle Mitchell >> IIUC C-x r f runs the command 'frameset-to-register' which stores a >> "framset" in a register. C-x r j runs the command 'jump-to-register' >> which does _not_ restore a frame's state via 'frameset--restore-frame' >> but goes to 'set-frame-configuration' instead. Apparently, framesets >> and frame configurations differ in a couple of minor aspects and the >> fullscreen state is one of them. > > They do, but when edebugging jump-to-register, I end up in this branch > of the cond: > > ((registerv-p val) > (cl-assert (registerv-jump-func val) nil > "Don't know how to jump to register %s" > (single-key-description register)) > (funcall (registerv-jump-func val) (registerv-data val))) > > Which ends up calling frameset--restore-frame, so the problem is elsewhere. Aha. I have no idea how to debug these cl-forms so I usually end up in some sort of nirvana. On Windows I call WM_EMACS_SETWINDOWPOS (in my_set_window_pos) with x = 902, y = 18, cx = 0, cy = 0, and Windows gets back to me with a WM_MOVE for (0, 0) - the values offered by GetWindowRect being left = 0, top = 0, right = 680, bottom = 658 I have no idea what to learn from this: (902, 18) is the correct request and I see no intervening action from there until Windows returns (0, 0). > The code that causes the frame to be restored in the wrong place is > this: > > (modify-frame-parameters frame > (if (eq (frame-parameter frame 'fullscreen) fullscreen) > ;; Workaround for bug#14949 > (assq-delete-all 'fullscreen filtered-cfg) > filtered-cfg)) > > in framset--restore-frame, which means Iʼm going to have to break out > gdb and/or printf. And removing the special fullsreen handling doesn't change anything? Maybe we _should_ do something special when a fullscreen frame is restored to a non-fullscreen one. Basically, Emacs has been doing something inherently wrong all the time: It asks to resize a frame while that frame is in fullscreen (or maximized) state. The correct interpretation on behalf of the window manager would be to store the new sizes and apply them when the frame is returned to its normal (non-fullscreen/non-maximized) state, IMHO. For some reason, the approach chosen by Emacs has worked so I never tried to fiddle with it. But maybe it bites us this time. >(Iʼm surprised Eli is seeing this on MS-Windows > though, I thought the low-level frame implementation was completely > separate) I see this on Windows too. Normally, buggy behavior consistent across platforms is an asset. For some reason, this doesn't apply here yet. martin ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-22 12:17 ` martin rudalics @ 2018-06-22 13:50 ` Robert Pluim 2018-06-23 8:40 ` martin rudalics 2019-07-01 6:08 ` Spenser Truex 0 siblings, 2 replies; 13+ messages in thread From: Robert Pluim @ 2018-06-22 13:50 UTC (permalink / raw) To: martin rudalics; +Cc: 31920, Jonathan Kyle Mitchell martin rudalics <rudalics@gmx.at> writes: >> Which ends up calling frameset--restore-frame, so the problem is elsewhere. > > Aha. I have no idea how to debug these cl-forms so I usually end up > in some sort of nirvana. On Windows I call WM_EMACS_SETWINDOWPOS (in > my_set_window_pos) with > > x = 902, > y = 18, > cx = 0, > cy = 0, > > and Windows gets back to me with a WM_MOVE for (0, 0) - the values > offered by GetWindowRect being > > left = 0, > top = 0, > right = 680, > bottom = 658 > > I have no idea what to learn from this: (902, 18) is the correct > request and I see no intervening action from there until Windows > returns (0, 0). > Thatʼs similar to what Iʼm seeing. gtk_window_move is called with the right parameters, but the frame ends up in the wrong place. >> The code that causes the frame to be restored in the wrong place is >> this: >> >> (modify-frame-parameters frame >> (if (eq (frame-parameter frame 'fullscreen) fullscreen) >> ;; Workaround for bug#14949 >> (assq-delete-all 'fullscreen filtered-cfg) >> filtered-cfg)) >> >> in framset--restore-frame, which means Iʼm going to have to break out >> gdb and/or printf. > > And removing the special fullsreen handling doesn't change anything? > Maybe we _should_ do something special when a fullscreen frame is > restored to a non-fullscreen one. If I understand that code, it says "if the old and new fullscreen states are the same, donʼt pass fullscreen to modify-frame-parameters" (itʼs Friday afternoon, I may be wrong, and the fullscreen variable there has an unhelpful name :-) ) > Basically, Emacs has been doing something inherently wrong all the > time: It asks to resize a frame while that frame is in fullscreen (or > maximized) state. The correct interpretation on behalf of the window > manager would be to store the new sizes and apply them when the frame > is returned to its normal (non-fullscreen/non-maximized) state, IMHO. > For some reason, the approach chosen by Emacs has worked so I never > tried to fiddle with it. But maybe it bites us this time. So youʼre saying we should un-maximize, and then set the frame size afterwards? The patch below tries that, it works for me, although it does of course cause the frame to resize and then move in two steps. >>(Iʼm surprised Eli is seeing this on MS-Windows >> though, I thought the low-level frame implementation was completely >> separate) > > I see this on Windows too. Normally, buggy behavior consistent across > platforms is an asset. For some reason, this doesn't apply here yet. It turns our that most of the code is common, only the implementations of things like x_set_offset and x_calc_absolute_position are platform-specific. Iʼm still surprised they share the same bugs. Robert diff --git i/lisp/frame.el w/lisp/frame.el index 29c31f41cb..a58fad6481 100644 --- i/lisp/frame.el +++ w/lisp/frame.el @@ -2413,7 +2413,7 @@ toggle-frame-maximized (t (set-frame-parameter nil 'fullscreen 'maximized))))) -(defun toggle-frame-fullscreen () +(defun toggle-frame-fullscreen (&optional frame) "Toggle fullscreen state of selected frame. Make selected frame fullscreen or restore its previous size if it is already fullscreen. @@ -2431,14 +2431,14 @@ toggle-frame-fullscreen See also `toggle-frame-maximized'." (interactive) - (let ((fullscreen (frame-parameter nil 'fullscreen))) + (let ((fullscreen (frame-parameter frame 'fullscreen))) (if (memq fullscreen '(fullscreen fullboth)) - (let ((fullscreen-restore (frame-parameter nil 'fullscreen-restore))) + (let ((fullscreen-restore (frame-parameter frame 'fullscreen-restore))) (if (memq fullscreen-restore '(maximized fullheight fullwidth)) - (set-frame-parameter nil 'fullscreen fullscreen-restore) - (set-frame-parameter nil 'fullscreen nil))) + (set-frame-parameter frame 'fullscreen fullscreen-restore) + (set-frame-parameter frame 'fullscreen nil))) (modify-frame-parameters - nil `((fullscreen . fullboth) (fullscreen-restore . ,fullscreen)))) + frame `((fullscreen . fullboth) (fullscreen-restore . ,fullscreen)))) ;; Manipulating a frame without waiting for the fullscreen ;; animation to complete can cause a crash, or other unexpected ;; behavior, on macOS (bug#28496). diff --git i/lisp/frameset.el w/lisp/frameset.el index 0e3363d7ae..ffbf6722a7 100644 --- i/lisp/frameset.el +++ w/lisp/frameset.el @@ -1085,6 +1085,11 @@ frameset--restore-frame (when (frame-live-p parent-frame) (set-frame-parameter frame 'parent-frame parent-frame))) + (let ((old-fullscreen (frame-parameter frame 'fullscreen))) + (and (not (eq old-fullscreen fullscreen)) + (memq old-fullscreen '(fullscreen fullboth)) + (not fullscreen) + (toggle-frame-fullscreen frame))) (modify-frame-parameters frame (if (eq (frame-parameter frame 'fullscreen) fullscreen) ;; Workaround for bug#14949 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-22 13:50 ` Robert Pluim @ 2018-06-23 8:40 ` martin rudalics 2018-06-27 9:07 ` Robert Pluim 2019-07-01 6:08 ` Spenser Truex 1 sibling, 1 reply; 13+ messages in thread From: martin rudalics @ 2018-06-23 8:40 UTC (permalink / raw) To: Robert Pluim; +Cc: 31920, Jonathan Kyle Mitchell I found a simpler scenario: With emacs -Q do C-x r f a, drag the frame somewhere else on your screen and do C-x r j a. Here the registered position is restored. Now do C-x r f a, drag the frame somewhere else, do F11 and C-x r j a. Here the frame is restored to the position it had before F11 and not to the one registered by C-x r f a. So this time it seems that I have the right explanation: We first position the frame according to the position from the register and then demaximize it. But we should first demaximize and then reposition it. Can you confirm? martin ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-23 8:40 ` martin rudalics @ 2018-06-27 9:07 ` Robert Pluim 2018-06-28 8:03 ` martin rudalics 0 siblings, 1 reply; 13+ messages in thread From: Robert Pluim @ 2018-06-27 9:07 UTC (permalink / raw) To: martin rudalics; +Cc: 31920, Jonathan Kyle Mitchell martin rudalics <rudalics@gmx.at> writes: > I found a simpler scenario: With emacs -Q do C-x r f a, drag the frame > somewhere else on your screen and do C-x r j a. Here the registered > position is restored. Now do C-x r f a, drag the frame somewhere > else, do F11 and C-x r j a. Here the frame is restored to the > position it had before F11 and not to the one registered by C-x r f a. > I confirm this exact behaviour under GTK. > So this time it seems that I have the right explanation: We first > position the frame according to the position from the register and > then demaximize it. But we should first demaximize and then > reposition it. Can you confirm? That looks like it. The patch I sent earlier fixes it for me, but Iʼm not sure itʼs the right solution, it feels very heavyweight. Robert ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-27 9:07 ` Robert Pluim @ 2018-06-28 8:03 ` martin rudalics 0 siblings, 0 replies; 13+ messages in thread From: martin rudalics @ 2018-06-28 8:03 UTC (permalink / raw) To: Robert Pluim; +Cc: 31920, Jonathan Kyle Mitchell > That looks like it. The patch I sent earlier fixes it for me, but Iʼm > not sure itʼs the right solution, it feels very heavyweight. I think so too (note that we already have 'x-frame-normalize-before-maximize' to achieve a similar effect). The fix should be probably in 'frameset-restore' but so far I'm still too silly to even debug that function. martin ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-22 13:50 ` Robert Pluim 2018-06-23 8:40 ` martin rudalics @ 2019-07-01 6:08 ` Spenser Truex 1 sibling, 0 replies; 13+ messages in thread From: Spenser Truex @ 2019-07-01 6:08 UTC (permalink / raw) To: Robert Pluim; +Cc: 31920, Jonathan Kyle Mitchell Robert Pluim <rpluim@gmail.com> writes: > diff --git i/lisp/frame.el w/lisp/frame.el > index 29c31f41cb..a58fad6481 100644 > --- i/lisp/frame.el > +++ w/lisp/frame.el > @@ -2413,7 +2413,7 @@ toggle-frame-maximized > (t > (set-frame-parameter nil 'fullscreen 'maximized))))) > > -(defun toggle-frame-fullscreen () > +(defun toggle-frame-fullscreen (&optional frame) > "Toggle fullscreen state of selected frame. > Make selected frame fullscreen or restore its previous size if it > is already fullscreen. > @@ -2431,14 +2431,14 @@ toggle-frame-fullscreen > > See also `toggle-frame-maximized'." > (interactive) > - (let ((fullscreen (frame-parameter nil 'fullscreen))) > + (let ((fullscreen (frame-parameter frame 'fullscreen))) > (if (memq fullscreen '(fullscreen fullboth)) > - (let ((fullscreen-restore (frame-parameter nil 'fullscreen-restore))) > + (let ((fullscreen-restore (frame-parameter frame 'fullscreen-restore))) > (if (memq fullscreen-restore '(maximized fullheight fullwidth)) > - (set-frame-parameter nil 'fullscreen fullscreen-restore) > - (set-frame-parameter nil 'fullscreen nil))) > + (set-frame-parameter frame 'fullscreen fullscreen-restore) > + (set-frame-parameter frame 'fullscreen nil))) > (modify-frame-parameters > - nil `((fullscreen . fullboth) (fullscreen-restore . ,fullscreen)))) > + frame `((fullscreen . fullboth) (fullscreen-restore . ,fullscreen)))) > ;; Manipulating a frame without waiting for the fullscreen > ;; animation to complete can cause a crash, or other unexpected > ;; behavior, on macOS (bug#28496). > diff --git i/lisp/frameset.el w/lisp/frameset.el > index 0e3363d7ae..ffbf6722a7 100644 > --- i/lisp/frameset.el > +++ w/lisp/frameset.el > @@ -1085,6 +1085,11 @@ frameset--restore-frame > (when (frame-live-p parent-frame) > (set-frame-parameter frame 'parent-frame parent-frame))) > > + (let ((old-fullscreen (frame-parameter frame 'fullscreen))) > + (and (not (eq old-fullscreen fullscreen)) > + (memq old-fullscreen '(fullscreen fullboth)) > + (not fullscreen) > + (toggle-frame-fullscreen frame))) > (modify-frame-parameters frame > (if (eq (frame-parameter frame 'fullscreen) fullscreen) > ;; Workaround for bug#14949 > > > > I've just discovered this bug for myself, without any register manipulation. Here is the recipe (almost the same as the original): 1) Make a window and use the WM to make it 1/2 the screen size. I usually grab the window with the mouse and hit it against the right side of the screen. 2) F11 to toggle fullscreen. 3) do #2 again. Now the window isn't perfectly 1/2 the window. Checking the value of (frame-parameter nil 'fullscreen) produces the symbol fullheight, which indicates the problem: the emacs restore procedure (fullscreen-restore) only stores *some* information about the previous window configuration. The following diff shows the workaround I was using so I could happily use f11 with my emacs: --- lisp/frame.el 2019-06-30 21:42:29.257939995 -0700 +++ lisp/frame.el 2019-06-30 21:41:34.239940756 -0700 @@ -2621,21 +2621,21 @@ `frame-resize-pixelwise' to non-nil in order to make a frame appear truly fullscreen. In addition, you may have to set `x-frame-normalize-before-maximize' in order to enable transitions from one fullscreen state to another. See also `toggle-frame-maximized'." (interactive) (let ((fullscreen (frame-parameter frame 'fullscreen))) (if (memq fullscreen '(fullscreen fullboth)) (let ((fullscreen-restore (frame-parameter frame 'fullscreen-restore))) - (if (memq fullscreen-restore '(maximized fullheight fullwidth)) + (if (memq fullscreen-restore '(maximized)) (set-frame-parameter frame 'fullscreen fullscreen-restore) (set-frame-parameter frame 'fullscreen nil))) (modify-frame-parameters frame `((fullscreen . fullboth) (fullscreen-restore . ,fullscreen)))) ;; Manipulating a frame without waiting for the fullscreen ;; animation to complete can cause a crash, or other unexpected ;; behavior, on macOS (bug#28496). (when (featurep 'cocoa) (sleep-for 0.5)))) \f So I just threw out all width and height information. To do a proper fix, I think Emacs needs to keep track of sufficient information about the window. Window height, width, and location must be stored. The current one only stores height or width. This way the window manager seems to be able to make all the decisions about window size, though I actually have no idea what is going on. For toggle-frame-maximized the problem still exists though, and I have not found any workaround. -- Spenser Truex ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-21 7:16 ` martin rudalics 2018-06-21 10:25 ` Robert Pluim @ 2018-06-21 15:54 ` Eli Zaretskii 2018-06-22 8:55 ` martin rudalics 1 sibling, 1 reply; 13+ messages in thread From: Eli Zaretskii @ 2018-06-21 15:54 UTC (permalink / raw) To: martin rudalics; +Cc: 31920, kyle > Date: Thu, 21 Jun 2018 09:16:24 +0200 > From: martin rudalics <rudalics@gmx.at> > > > 1. save a frameset with an unmaximized frame > > start from emacs -Q > > create a second window with `C-x 2' > > use the mouse to move the frame to the right side of the desktop > > save the split window frame with `C-x r f a' > > > > 2. save a frameset with a maximized/fullscreen frame > > delete one of the windows with `C-x 1' > > press `f11' to make the frame fullscreen > > save the fullscreen frame with `C-x r f b' > > > > 3. restore the unmaximized frameset with `C-x r j a' > > After jumping between framesets from register b to register a, the > > non-fullscreen frame appears on the opposite (left) side of the desktop > > than it was originally. Typing `C-x r j a' a second time moves the frame > > to its original location. > > > > I've reproduced this using Emacs 26.1 in both Windows 10 and Fedora 28 > > KDE desktop environments. > > > > In GNU Emacs 26.1 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.22.30) > > of 2018-06-04 built on buildvm-10.phx2.fedoraproject.org > > Thanks for the report. Here I can't reproduce the behavior you > observe on Windows XP even if I modify your recipe in various ways. > Maybe someone else can give it a try. I can reproduce here if I do "C-x r j a" then "C-x r j b", then "C-x r j a" again. The second time the frame split into two windows appears at the left side of the desktop. ^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen 2018-06-21 15:54 ` Eli Zaretskii @ 2018-06-22 8:55 ` martin rudalics 0 siblings, 0 replies; 13+ messages in thread From: martin rudalics @ 2018-06-22 8:55 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 31920, kyle > I can reproduce here if I do "C-x r j a" then "C-x r j b", then "C-x r > j a" again. The second time the frame split into two windows appears > at the left side of the desktop. Indeed. Splitting the window is not needed, BTW. martin ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2019-07-01 6:08 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-06-21 3:12 bug#31920: 26.1; frame appears in wrong part of desktop after restoring frameset from fullscreen Jonathan Kyle Mitchell 2018-06-21 7:16 ` martin rudalics 2018-06-21 10:25 ` Robert Pluim 2018-06-22 8:55 ` martin rudalics 2018-06-22 11:19 ` Robert Pluim 2018-06-22 12:17 ` martin rudalics 2018-06-22 13:50 ` Robert Pluim 2018-06-23 8:40 ` martin rudalics 2018-06-27 9:07 ` Robert Pluim 2018-06-28 8:03 ` martin rudalics 2019-07-01 6:08 ` Spenser Truex 2018-06-21 15:54 ` Eli Zaretskii 2018-06-22 8:55 ` martin rudalics
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).