Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8205204

[Ubuntu] Can't move an undecorated window outside the screen bounds

XMLWordPrintable

    • x86_64
    • linux_ubuntu

      ADDITIONAL SYSTEM INFORMATION :
      $ lsb_release -a
      No LSB modules are available.
      Distributor ID: Ubuntu
      Description: Ubuntu 16.04.4 LTS
      Release: 16.04
      Codename: xenial


      A DESCRIPTION OF THE PROBLEM :
      In Ubuntu Mate desktop I can't move an undecorated java window outside the screen. It seems to be because of marco window manager:
        gsettings get org.mate.session.required-components windowmanager --> 'marco'

      If I change the window manager to Compiz I can move the window out of the screen but it makes a strange movement.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Build and run the JFrameBug code.

      When the window appears try to drag the window outside the screen.


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The windows must be moved outside the screen.
      ACTUAL -
       The window keeps inside the screen and the following messages appears on console:

      Component moved: 1704, 539
      Component moved: 1520, 539
      Mouse dragged (347, 118)
      setLocation (1705, 539)
      Component moved: 1705, 539
      Component moved: 1520, 539
      Mouse dragged (348, 118)
      setLocation (1706, 539)
      Component moved: 1706, 539
      Component moved: 1520, 539
      Mouse released


      It seems that the Window is moved automatically to fit on screen. For example you can see: "Component moved: 1520, 539".

      ---------- BEGIN SOURCE ----------
      package com.example;

      import java.awt.Color;
      import java.awt.Graphics;
      import java.awt.event.ComponentEvent;
      import java.awt.event.ComponentListener;
      import java.awt.event.MouseEvent;
      import java.awt.event.MouseListener;
      import java.awt.event.MouseMotionListener;

      import javax.swing.JFrame;

      public class JFrameBug extends JFrame implements MouseListener, MouseMotionListener, ComponentListener {

      /**
      * Serial version UUID.
      */
      private static final long serialVersionUID = 1514585336232663488L;


      private int startX = 0;
      private int startY = 0;
      private int startMouseX = 0;
      private int startMouseY = 0;
      private int startMouseXdraw = 0;
      private int startMouseYdraw = 0;
      private boolean clicked = false;


      public JFrameBug() {
      this.setSize(400, 300);
      this.setUndecorated(true);
      this.addMouseListener(this);
      this.addMouseMotionListener(this);
      this.addComponentListener(this);

      this.setBackground(Color.WHITE);
      }

      public void paint(Graphics g) {
      super.paint(g);
      g.drawString("Drag this window!", 100, 100);

      if (clicked) {
      g.drawLine(startMouseXdraw-10, startMouseYdraw, startMouseXdraw+10, startMouseYdraw);
      g.drawLine(startMouseXdraw, startMouseYdraw-10, startMouseXdraw, startMouseYdraw+10);
      }

      }



      public static void main(String[] args) {
      JFrameBug bugtest= new JFrameBug();
      bugtest.setVisible(true);

      }


      @Override
      public void mouseDragged(MouseEvent evt) {
      if (clicked) {
      System.out.println("Mouse dragged ("+evt.getX()+", "+evt.getY()+")");
      int diffX = (evt.getX() + this.getX() - startMouseX);
      int diffY = (evt.getY() + this.getY() - startMouseY);

      int newX = startX + diffX;
      int newY = startY + diffY;


      System.out.println("setLocation ("+newX+", "+newY+")");
      this.setLocation(newX, newY);
      this.repaint();
      }

      }


      @Override
      public void mouseMoved(MouseEvent arg0) {
      // TODO Auto-generated method stub

      }


      @Override
      public void mouseClicked(MouseEvent evt) {


      }


      @Override
      public void mouseEntered(MouseEvent arg0) {
      // TODO Auto-generated method stub

      }


      @Override
      public void mouseExited(MouseEvent arg0) {
      // TODO Auto-generated method stub

      }


      @Override
      public void mousePressed(MouseEvent evt) {
      System.out.println("Mouse pressed ("+evt.getX()+", "+evt.getY()+")");
      startX = this.getX();
      startY = this.getY();
      startMouseX = evt.getX() + this.getX();
      startMouseY = evt.getY() + this.getY();

      startMouseXdraw = evt.getX();
      startMouseYdraw = evt.getY();

      System.out.println("Start ("+startX+", "+startY+")");
      clicked = true;
      this.repaint();

      }


      @Override
      public void mouseReleased(MouseEvent arg0) {
      System.out.println("Mouse released");
      clicked = false;
      this.repaint();
      }

      @Override
      public void componentResized(ComponentEvent e) {
      // TODO Auto-generated method stub

      }

      @Override
      public void componentMoved(ComponentEvent e) {
      // TODO Auto-generated method stub
      System.out.println("Component moved: "+this.getX()+", "+this.getY());
      }

      @Override
      public void componentShown(ComponentEvent e) {
      // TODO Auto-generated method stub

      }

      @Override
      public void componentHidden(ComponentEvent e) {
      // TODO Auto-generated method stub

      }




      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      A workaround for this is to change the window manager to Compiz by using the MATE Tweak tool.
       gsettings get org.mate.session.required-components windowmanager --> 'compiz'

      FREQUENCY : always


            Unassigned Unassigned
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: