Skip to content

Commit

Permalink
fix flickering on macOS, version 2.5.5
Browse files Browse the repository at this point in the history
  • Loading branch information
LabyStudio committed Jun 28, 2022
1 parent 988c701 commit 4ea1f14
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 36 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -37,7 +37,7 @@ repositories {
}
dependencies {
implementation 'com.github.LabyStudio:desktopmodules:2.5.3:all'
implementation 'com.github.LabyStudio:desktopmodules:2.5.5:all'
}
```

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group 'com.github.LabyStudio'
version '2.5.4'
version '2.5.5'

compileJava {
sourceCompatibility = '1.8'
Expand Down
@@ -0,0 +1,43 @@
package de.labystudio.desktopmodules.core.renderer.swing;

import de.labystudio.desktopmodules.core.module.render.IRenderCallback;
import de.labystudio.desktopmodules.core.renderer.IRenderContext;

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;

/**
* Canvas implementation to render the actual module inside the window frame.
*
* @author LabyStudio
*/
public class SwingCanvasRender extends JPanel {

private final SwingModuleRenderer moduleRenderer;
protected final IRenderContext renderContext = new SwingRenderContext();
private final IRenderCallback renderCallback;

public SwingCanvasRender(SwingModuleRenderer moduleRenderer) {
this.moduleRenderer = moduleRenderer;
this.renderCallback = moduleRenderer.getRenderCallback();
}

@Override
public void paint(Graphics g) {
super.paint(g);

int width = this.moduleRenderer.getWidth();
int height = this.moduleRenderer.getHeight();

int mouseX = this.moduleRenderer.getMouseX();
int mouseY = this.moduleRenderer.getMouseY();

// Update graphics instance
((SwingRenderContext) this.renderContext).updateGraphics((Graphics2D) g);

// Call render callback
this.renderCallback.onRender(this.renderContext, width, height, mouseX, mouseY);
this.renderCallback.onRender(this.renderContext, width, height);
}
}
Expand Up @@ -2,13 +2,10 @@

import de.labystudio.desktopmodules.core.module.render.IModuleRenderer;
import de.labystudio.desktopmodules.core.module.render.IRenderCallback;
import de.labystudio.desktopmodules.core.renderer.IRenderContext;
import de.labystudio.desktopmodules.core.renderer.IScreenBounds;

import javax.swing.JDialog;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
Expand All @@ -29,7 +26,7 @@ public class SwingModuleRenderer extends JDialog implements IModuleRenderer,
protected final int width;
protected final int height;

protected final IRenderContext renderContext = new SwingRenderContext();
private final SwingCanvasRender canvas;
private final IRenderCallback renderCallback;

private long lastToFontCall = -1L;
Expand All @@ -50,54 +47,45 @@ public SwingModuleRenderer(IRenderCallback renderCallback, int width, int height
this.width = width;
this.height = height;

// Canvas
this.setContentPane(this.canvas = new SwingCanvasRender(this));

// Init
setSize(width, height);
setUndecorated(true);
setResizable(false);
this.setSize(width, height);
this.setUndecorated(true);
this.setResizable(false);

// Overlay
setType(Type.UTILITY);
setBackground(new Color(255, 255, 255, 0));
setAlwaysOnTop(true);
setFocusableWindowState(false);
setAutoRequestFocus(false);
this.setType(Type.UTILITY);
this.setBackground(new Color(255, 255, 255, 0));
this.setAlwaysOnTop(true);
this.setFocusableWindowState(false);
this.setAutoRequestFocus(false);

// Show
toFront();
this.toFront();

// Listener
addMouseListener(this);
addMouseMotionListener(this);
addMouseWheelListener(this);
}

@Override
public void paint(Graphics g) {
super.paint(g);

// Update graphics instance
((SwingRenderContext) this.renderContext).updateGraphics((Graphics2D) g);

// Call render callback
this.renderCallback.onRender(this.renderContext, this.width, this.height, this.mouseX, this.mouseY);
this.renderCallback.onRender(this.renderContext, this.width, this.height);
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.addMouseWheelListener(this);
}

@Override
public void requestFrame() {
repaint();
this.canvas.repaint();

// Make visible
if (!isVisible()) {
setVisible(true);
if (!this.isVisible()) {
this.setVisible(true);
}

// The window will no longer be on top of you click on the taskbar
if (this.lastToFontCall + TO_FONT_PERIOD_MS < System.currentTimeMillis()) {
this.lastToFontCall = System.currentTimeMillis();

// Keep it over the taskbar
toFront();
this.toFront();
}
}

Expand All @@ -106,7 +94,9 @@ public void setLocation(int x, int y) {
super.setLocation(x, y);

// Repaint on position change
repaint();
if (this.canvas != null) {
this.canvas.repaint();
}
}

@Override
Expand All @@ -116,7 +106,7 @@ public IScreenBounds getScreenBounds() {

@Override
public IScreenBounds getScreenBoundsOfTargetMonitor() {
return new SwingScreenBounds(getX() + getWidth() / 2, getY());
return new SwingScreenBounds(this.getX() + this.getWidth() / 2, this.getY());
}

@Override
Expand Down Expand Up @@ -168,4 +158,16 @@ public void mouseMoved(MouseEvent event) {
this.mouseX = event.getX();
this.mouseY = event.getY();
}

public IRenderCallback getRenderCallback() {
return this.renderCallback;
}

public int getMouseX() {
return this.mouseX;
}

public int getMouseY() {
return this.mouseY;
}
}

0 comments on commit 4ea1f14

Please sign in to comment.