Skip to content

Commit

Permalink
add opencode 5, 9, 117 to xserver
Browse files Browse the repository at this point in the history
  • Loading branch information
longjunyu2 committed Jul 17, 2024
1 parent 14bbdad commit 9a65008
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
3 changes: 3 additions & 0 deletions app/src/main/java/com/winlator/xserver/ClientOpcodes.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ public abstract class ClientOpcodes {
public static final byte CHANGE_WINDOW_ATTRIBUTES = 2;
public static final byte GET_WINDOW_ATTRIBUTES = 3;
public static final byte DESTROY_WINDOW = 4;
public static final byte DESTROY_SUB_WINDOWS = 5;
public static final byte REPARENT_WINDOW = 7;
public static final byte MAP_WINDOW = 8;
public static final byte MAP_SUB_WINDOWS = 9;
public static final byte UNMAP_WINDOW = 10;
public static final byte CONFIGURE_WINDOW = 12;
public static final byte GET_GEOMETRY = 14;
Expand Down Expand Up @@ -51,6 +53,7 @@ public abstract class ClientOpcodes {
public static final byte SET_SCREEN_SAVER = 107;
public static final byte GET_SCREEN_SAVER = 108;
public static final byte FORCE_SCREEN_SAVER = 115;
public static final byte GET_POINTER_MAPPING = 117;
public static final byte GET_MODIFIER_MAPPING = 119;
public static final byte NO_OPERATION = 127;
}
12 changes: 12 additions & 0 deletions app/src/main/java/com/winlator/xserver/XClientRequestHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,10 @@ else if (inputStream.available() < 4) {
WindowRequests.destroyWindow(client, inputStream, outputStream);
}
break;
case ClientOpcodes.DESTROY_SUB_WINDOWS:
try (XLock lock = client.xServer.lock(XServer.Lockable.WINDOW_MANAGER, XServer.Lockable.DRAWABLE_MANAGER, XServer.Lockable.INPUT_DEVICE)) {
WindowRequests.destroySubWindows(client, inputStream, outputStream);
}
case ClientOpcodes.REPARENT_WINDOW:
try (XLock lock = client.xServer.lock(XServer.Lockable.WINDOW_MANAGER)) {
WindowRequests.reparentWindow(client, inputStream, outputStream);
Expand All @@ -198,6 +202,11 @@ else if (inputStream.available() < 4) {
WindowRequests.mapWindow(client, inputStream, outputStream);
}
break;
case ClientOpcodes.MAP_SUB_WINDOWS:
try (XLock lock = client.xServer.lock(XServer.Lockable.WINDOW_MANAGER, XServer.Lockable.INPUT_DEVICE)) {
WindowRequests.mapSubWindows(client, inputStream, outputStream);
}
break;
case ClientOpcodes.UNMAP_WINDOW:
try (XLock lock = client.xServer.lock(XServer.Lockable.WINDOW_MANAGER, XServer.Lockable.INPUT_DEVICE)) {
WindowRequests.unmapWindow(client, inputStream, outputStream);
Expand Down Expand Up @@ -396,6 +405,9 @@ else if (inputStream.available() < 4) {
case ClientOpcodes.NO_OPERATION:
client.skipRequest();
break;
case ClientOpcodes.GET_POINTER_MAPPING:
CursorRequests.getPointerMaping(client, inputStream, outputStream);
break;
default:
if (opcode < 0) {
Extension extension = client.xServer.extensions.get(opcode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.winlator.xconnector.XInputStream;
import com.winlator.xconnector.XOutputStream;
import com.winlator.xconnector.XStreamLock;
import com.winlator.xserver.Cursor;
import com.winlator.xserver.Pixmap;
import com.winlator.xserver.XClient;
Expand All @@ -10,6 +11,8 @@
import com.winlator.xserver.errors.BadPixmap;
import com.winlator.xserver.errors.XRequestError;

import java.io.IOException;

public abstract class CursorRequests {
public static void createCursor(XClient client, XInputStream inputStream, XOutputStream outputStream) throws XRequestError {
int cursorId = inputStream.readInt();
Expand Down Expand Up @@ -47,4 +50,22 @@ public static void createCursor(XClient client, XInputStream inputStream, XOutpu
public static void freeCursor(XClient client, XInputStream inputStream, XOutputStream outputStream) throws XRequestError {
client.xServer.cursorManager.freeCursor(inputStream.readInt());
}

public static void getPointerMaping(XClient client, XInputStream inputStream, XOutputStream outputStream) throws IOException, XRequestError {
try (XStreamLock lock = outputStream.lock()) {
byte[] buttonsMap = {1, 2, 3};
byte n = (byte) buttonsMap.length;
int padLen = -n & 3;

outputStream.writeByte((byte) 1);
outputStream.writeByte(n);
outputStream.writeShort(client.getSequenceNumber());
outputStream.writeInt((n + padLen) / 4);
outputStream.writePad(24);

for (byte b: buttonsMap)
outputStream.writeByte(b);
outputStream.writePad(padLen);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ public static void destroyWindow(XClient client, XInputStream inputStream, XOutp
client.xServer.windowManager.destroyWindow(inputStream.readInt());
}

public static void destroySubWindows(XClient client, XInputStream inputStream, XOutputStream outputStream) {
client.xServer.windowManager.destroyWindow(inputStream.readInt());
}

public static void reparentWindow(XClient client, XInputStream inputStream, XOutputStream outputStream) throws XRequestError {
int windowId = inputStream.readInt();
int parentId = inputStream.readInt();
Expand All @@ -132,6 +136,23 @@ public static void mapWindow(XClient client, XInputStream inputStream, XOutputSt
client.xServer.windowManager.mapWindow(window);
}

public static void mapSubWindows(XClient client, XInputStream inputStream, XOutputStream outputStream) throws XRequestError {
int windowId = inputStream.readInt();
Window window = client.xServer.windowManager.getWindow(windowId);
if (window == null) throw new BadWindow(windowId);
for (Window child : window.getChildren())
mapSubWindows(client, child.id);
client.xServer.windowManager.mapWindow(window);
}

private static void mapSubWindows(XClient client, int windowId) throws XRequestError {
Window window = client.xServer.windowManager.getWindow(windowId);
if (window == null) throw new BadWindow(windowId);
for (Window child : window.getChildren())
mapSubWindows(client, child.id);
client.xServer.windowManager.mapWindow(window);
}

public static void unmapWindow(XClient client, XInputStream inputStream, XOutputStream outputStream) throws XRequestError {
int windowId = inputStream.readInt();
Window window = client.xServer.windowManager.getWindow(windowId);
Expand Down

0 comments on commit 9a65008

Please sign in to comment.