1 /*
2 * Copyright 2021-2022 The OSHI Project Contributors
3 * SPDX-License-Identifier: MIT
4 */
5 package oshi.software.os;
6
7 import java.awt.Rectangle;
8
9 import com.sun.jna.platform.win32.WinDef.HWND;
10
11 import oshi.annotation.concurrent.Immutable;
12
13 /**
14 * This class encapsulates information about a window on the operating system's GUI desktop
15 */
16 @Immutable
17 public class OSDesktopWindow {
18 private final long windowId;
19 private final String title;
20 private final String command;
21 private final Rectangle locAndSize;
22 private final long owningProcessId;
23 private final int order;
24 private final boolean visible;
25
26 public OSDesktopWindow(long windowId, String title, String command, Rectangle locAndSize, long owningProcessId,
27 int order, boolean visible) {
28 super();
29 this.windowId = windowId;
30 this.title = title;
31 this.command = command;
32 this.locAndSize = locAndSize;
33 this.owningProcessId = owningProcessId;
34 this.order = order;
35 this.visible = visible;
36 }
37
38 /**
39 * Gets the operating system's handle, window ID, or other unique identifier for this window.
40 * <p>
41 * On Winodws, this can be converted to a {@link HWND} using {@code new HWND(new Pointer(windowId))}. On macOS, this
42 * is the Core Graphics Window ID. On Unix-like systems, this is the X11 Window ID.
43 *
44 * @return the windowId
45 */
46 public long getWindowId() {
47 return windowId;
48 }
49
50 /**
51 * Gets the Window title, if any.
52 *
53 * @return the title, which may be an empty string if the window has no title.
54 */
55 public String getTitle() {
56 return title;
57 }
58
59 /**
60 * Gets the command name (possibly the full file path) of the window's executable program, if known.
61 *
62 * @return the command
63 */
64 public String getCommand() {
65 return command;
66 }
67
68 /**
69 * Gets a {@link Rectangle} representing the window's location and size.
70 *
71 * @return the location and size
72 */
73 public Rectangle getLocAndSize() {
74 return locAndSize;
75 }
76
77 /**
78 * Gets the process ID of the process which owns this window, if known.
79 *
80 * @return the owningProcessId
81 */
82 public long getOwningProcessId() {
83 return owningProcessId;
84 }
85
86 /**
87 * Makes a best effort to get the order in which this window appears on the desktop. Higher values are more in the
88 * foreground.
89 * <p>
90 * On Windows, this represents the Z Order of the window, and is not guaranteed to be atomic, as it could be
91 * impacted by race conditions.
92 * <p>
93 * On macOS this is the window layer. Note that multiple windows may share the same layer.
94 * <p>
95 * On X11 this represents the stacking order of the windows.
96 *
97 * @return a best effort identification of the window's Z order relative to other windows
98 */
99 public int getOrder() {
100 return order;
101 }
102
103 /**
104 * Makes a best effort to report whether the window is visible to the user. A "visible" window may be completely
105 * transparent.
106 *
107 * @return {@code true} if the window is visible to users or if visibility can not be determined, {@code false}
108 * otherwise.
109 */
110 public boolean isVisible() {
111 return visible;
112 }
113
114 @Override
115 public String toString() {
116 return "OSDesktopWindow [windowId=" + windowId + ", title=" + title + ", command=" + command + ", locAndSize="
117 + locAndSize.toString() + ", owningProcessId=" + owningProcessId + ", order=" + order + ", visible="
118 + visible + "]";
119 }
120 }