From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Andy Moreton Newsgroups: gmane.emacs.bugs Subject: bug#21173: 25.0.50; New frames positioned off screen with multiple monitors Date: Tue, 08 Sep 2015 23:26:41 +0100 Message-ID: <86k2s0v97i.fsf@gmail.com> References: <874mkjadqx.fsf@gmail.com> <55BCA4B1.8030103@gmx.at> <55BCEAA5.9020406@gmx.at> <55BF0E7D.1070007@gmx.at> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1441751310 21162 80.91.229.3 (8 Sep 2015 22:28:30 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 8 Sep 2015 22:28:30 +0000 (UTC) To: 21173@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Sep 09 00:28:14 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZZRN6-0004Aw-B8 for geb-bug-gnu-emacs@m.gmane.org; Wed, 09 Sep 2015 00:28:12 +0200 Original-Received: from localhost ([::1]:38254 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRN6-00021k-0c for geb-bug-gnu-emacs@m.gmane.org; Tue, 08 Sep 2015 18:28:12 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42753) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRN1-00021d-0a for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:28:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZRMw-0001aR-1J for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:28:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:60904) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRMv-0001aN-VR for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:28:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1ZZRMv-0005ZG-PQ for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:28:01 -0400 X-Loop: help-debbugs@gnu.org In-Reply-To: <874mkjadqx.fsf@gmail.com> Resent-From: Andy Moreton Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 08 Sep 2015 22:28:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21173 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.144175124621359 (code B ref -1); Tue, 08 Sep 2015 22:28:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 8 Sep 2015 22:27:26 +0000 Original-Received: from localhost ([127.0.0.1]:53114 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZZRMM-0005YR-0R for submit@debbugs.gnu.org; Tue, 08 Sep 2015 18:27:26 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:60807) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZZRMI-0005YI-RY for submit@debbugs.gnu.org; Tue, 08 Sep 2015 18:27:23 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZRMH-0001OX-6I for submit@debbugs.gnu.org; Tue, 08 Sep 2015 18:27:22 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:51485) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRMH-0001OT-1z for submit@debbugs.gnu.org; Tue, 08 Sep 2015 18:27:21 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42575) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRMF-0001jD-VX for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:27:21 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZRMA-0001Ni-UG for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:27:19 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:33326) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZRMA-0001NZ-N8 for bug-gnu-emacs@gnu.org; Tue, 08 Sep 2015 18:27:14 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1ZZRM4-0003Az-7O for bug-gnu-emacs@gnu.org; Wed, 09 Sep 2015 00:27:08 +0200 Original-Received: from 82-69-64-228.dsl.in-addr.zen.co.uk ([82.69.64.228]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 09 Sep 2015 00:27:08 +0200 Original-Received: from andrewjmoreton by 82-69-64-228.dsl.in-addr.zen.co.uk with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 09 Sep 2015 00:27:08 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 108 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 82-69-64-228.dsl.in-addr.zen.co.uk User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (windows-nt) Cancel-Lock: sha1:dfby8BR2smslXuONuW+FA4ixGoM= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:106277 Archived-At: On Tue 04 Aug 2015, Fran Litterio wrote: > Glenn Morris gnu.org> writes: > >> BTW, if it's just the lack of two physical monitors that's stopping >> anyone working on such things, note that you can simulate such a setup >> in software. Eg something like >> >> Xephyr +xinerama -screen 800x600 -origin 800,0 -screen 800x600 :1 & >> DISPLAY=:1.0 gnome-session # or whatever you prefer > > Interesting, thanks. If frame 'left parameters are always > non-negative under X, then this problem only happens on Windows, > because the root cause is a failure to account for negative > 'left values in certain monitor arrangements. > > Does anyone with multiple monitors and X see negative 'left > parameters for frames on the leftmost monitor? Yes. Arranging the monitors like this, so the desktop extends to both monitors: +----------+ | | | DISPLAY2 | | |+----------+ +----------+| | | DISPLAY1 | | (primary)| +----------+ (display-monitor-attributes-list) ;; ==> '(((geometry 0 0 1920 1080) (workarea 0 0 1920 1050) (mm-size 677 381) (name . "\\\\.\\DISPLAY1") (frames ...)) ((geometry -1680 -1050 1680 1050) (workarea -1680 -1050 1680 1050) (mm-size 593 370) (name . "\\\\.\\DISPLAY2") (frames ...))) ;; For a frame on DISPLAY2: (frame-parameter (window-frame) 'left) ;; ==> (+ -1668) (frame-parameter (window-frame) 'top) ;; ==> (+ -1046) The patch below fixes the problem for me on a Mingw64 build, and creates frames at the correct position. Please try it and report the results. (Copyright papers are not yet on file, but I mailed them today). diff --git a/src/w32term.c b/src/w32term.c index 82b05bffffec..ac55c6f73d32 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5931,16 +5931,48 @@ x_calc_absolute_position (struct frame *f) top_bottom_borders_height = 32; } + /* If the desktop extends to multiple monitors then monitors to + the left of (or above) the primary monitor may use negative + coordinates. Find the X and Y offsets of the display origin. */ + int display_left = 0; + int display_top = 0; + if (flags & (XNegative | YNegative)) + { + Lisp_Object list; + + list = Fw32_display_monitor_attributes_list (FRAME_X_DISPLAY (f)); + while (CONSP (list)) + { + Lisp_Object attributes = CAR(list); + Lisp_Object geometry; + Lisp_Object monitor_left, monitor_top; + + list = CDR(list); + + geometry = Fassoc (Qgeometry, attributes); + if (!NILP (geometry)) + { + monitor_left = Fnth (make_number (1), geometry); + monitor_top = Fnth (make_number (2), geometry); + + display_left = min (display_left, XINT (monitor_left)); + display_top = min (display_top, XINT (monitor_top)); + } + } + } + /* Treat negative positions as relative to the rightmost bottommost position that fits on the screen. */ if (flags & XNegative) f->left_pos = (x_display_pixel_width (FRAME_DISPLAY_INFO (f)) + + display_left - FRAME_PIXEL_WIDTH (f) + f->left_pos - (left_right_borders_width - 1)); if (flags & YNegative) f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f)) + + display_top - FRAME_PIXEL_HEIGHT (f) + f->top_pos - (top_bottom_borders_height - 1));