Skip to content

Commit bddde79

Browse files
committed
feat: Added box showing select on selection mode
1 parent 98de957 commit bddde79

File tree

4 files changed

+115
-16
lines changed

4 files changed

+115
-16
lines changed

cgo/mouse.c

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#include <stdio.h>
22
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <unistd.h>
35
#include <X11/Xlib.h>
46
#include <X11/Xutil.h>
57
#include <X11/X.h>
68
#include <X11/cursorfont.h>
9+
#include <cairo/cairo.h>
10+
#include <cairo/cairo-xlib.h>
711

812
struct MousePosition {
913
int x1,
@@ -38,7 +42,7 @@ struct MousePosition *getMouse(void) {
3842
mousePosition->y2 = event.xbutton.y_root;
3943

4044
}
41-
45+
4246
break;
4347
}
4448

@@ -49,6 +53,52 @@ struct MousePosition *getMouse(void) {
4953
}
5054
}
5155

56+
XVisualInfo vinfo;
57+
if (!XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo)) {
58+
printf("No visual found supporting 32 bit color, terminating\n");
59+
exit(EXIT_FAILURE);
60+
}
61+
62+
attrs.colormap = XCreateColormap(display, root, vinfo.visual, AllocNone);
63+
attrs.background_pixel = 0;
64+
attrs.border_pixel = 0;
65+
66+
Window overlay;
67+
68+
if (mousePosition->x1 < mousePosition->x2) {
69+
overlay = XCreateWindow (
70+
display, root,
71+
mousePosition->x1, mousePosition->y1, mousePosition->x2 - mousePosition->x1, mousePosition->y2 - mousePosition->y1, 0,
72+
vinfo.depth, InputOutput,
73+
vinfo.visual,
74+
CWOverrideRedirect | CWColormap | CWBackPixel | CWBorderPixel, &attrs
75+
);
76+
77+
} else {
78+
overlay = XCreateWindow (
79+
display, root,
80+
mousePosition->x2, mousePosition->y2, mousePosition->x1 - mousePosition->x2, mousePosition->y1 - mousePosition->y2, 0,
81+
vinfo.depth, InputOutput,
82+
vinfo.visual,
83+
CWOverrideRedirect | CWColormap | CWBackPixel | CWBorderPixel, &attrs
84+
);
85+
}
86+
87+
XMapWindow(display, overlay);
88+
89+
cairo_surface_t* surf = cairo_xlib_surface_create(display, overlay, vinfo.visual, 0, 0);
90+
cairo_t* cr = cairo_create(surf);
91+
92+
XFlush(display);
93+
94+
sleep(1);
95+
96+
cairo_destroy(cr);
97+
cairo_surface_destroy(surf);
98+
99+
XUnmapWindow(display, overlay);
100+
XCloseDisplay(display);
101+
52102
XUngrabPointer(display, CurrentTime);
53103

54104
return mousePosition;
@@ -59,6 +109,9 @@ struct MousePosition *getMouseAndKeyboard(void) {
59109
Window root = XRootWindow(display, 0);
60110
XEvent event;
61111

112+
XSetWindowAttributes attrs;
113+
attrs.override_redirect = true;
114+
62115
Cursor cursor = XCreateFontCursor(display, XC_crosshair);
63116
XGrabPointer(display, root, False, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime);
64117
XGrabKeyboard(display, root, KeyPressMask, GrabModeAsync, GrabModeAsync, CurrentTime);
@@ -98,6 +151,52 @@ struct MousePosition *getMouseAndKeyboard(void) {
98151
}
99152
}
100153

154+
XVisualInfo vinfo;
155+
if (!XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo)) {
156+
printf("No visual found supporting 32 bit color, terminating\n");
157+
exit(EXIT_FAILURE);
158+
}
159+
160+
attrs.colormap = XCreateColormap(display, root, vinfo.visual, AllocNone);
161+
attrs.background_pixel = 0;
162+
attrs.border_pixel = 0;
163+
164+
Window overlay;
165+
166+
if (mousePosition->x1 < mousePosition->x2) {
167+
overlay = XCreateWindow (
168+
display, root,
169+
mousePosition->x1, mousePosition->y1, mousePosition->x2 - mousePosition->x1, mousePosition->y2 - mousePosition->y1, 0,
170+
vinfo.depth, InputOutput,
171+
vinfo.visual,
172+
CWOverrideRedirect | CWColormap | CWBackPixel | CWBorderPixel, &attrs
173+
);
174+
175+
} else {
176+
overlay = XCreateWindow (
177+
display, root,
178+
mousePosition->x2, mousePosition->y2, mousePosition->x1 - mousePosition->x2, mousePosition->y1 - mousePosition->y2, 0,
179+
vinfo.depth, InputOutput,
180+
vinfo.visual,
181+
CWOverrideRedirect | CWColormap | CWBackPixel | CWBorderPixel, &attrs
182+
);
183+
}
184+
185+
XMapWindow(display, overlay);
186+
187+
cairo_surface_t* surf = cairo_xlib_surface_create(display, overlay, vinfo.visual, 0, 0);
188+
cairo_t* cr = cairo_create(surf);
189+
190+
XFlush(display);
191+
192+
sleep(1);
193+
194+
cairo_destroy(cr);
195+
cairo_surface_destroy(surf);
196+
197+
XUnmapWindow(display, overlay);
198+
XCloseDisplay(display);
199+
101200
XUngrabPointer(display, CurrentTime);
102201
XUngrabKeyboard(display, CurrentTime);
103202

get/getMouse.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package get
22

33
/*
4-
#cgo LDFLAGS: -lX11
4+
#cgo LDFLAGS: -lX11 -lcairo
55
66
#include "../cgo/mouse.c"
77
*/
@@ -32,16 +32,16 @@ func GetMouse() MousePosition {
3232
}
3333

3434
func GetMouseAndKeyboard() MousePosition {
35-
var mousePos MousePosition
35+
var mousePos MousePosition;
3636

37-
getMousePos := (*[1 << 1]C.struct_MousePosition)(unsafe.Pointer(C.getMouseAndKeyboard()))[0:1]
37+
getMousePos := (*[1 << 1]C.struct_MousePosition)(unsafe.Pointer(C.getMouseAndKeyboard()))[0:1];
3838

39-
m := getMousePos[0]
39+
m := getMousePos[0];
4040

41-
mousePos.X1 = int(m.x1)
42-
mousePos.X2 = int(m.x2)
43-
mousePos.Y1 = int(m.y1)
44-
mousePos.Y2 = int(m.y2)
41+
mousePos.X1 = int(m.x1);
42+
mousePos.X2 = int(m.x2);
43+
mousePos.Y1 = int(m.y1);
44+
mousePos.Y2 = int(m.y2);
4545

46-
return mousePos
46+
return mousePos;
4747
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/imf4ll/ghost
22

3-
go 1.17
3+
go 1.19
44

55
require fyne.io/fyne/v2 v2.1.4
66

modes/selection.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
)
1010

1111
func Selection(filename string, clipboard, output, upload, file bool) {
12-
var screenshot image.Image
12+
var screenshot image.Image;
1313

14-
m := get.GetMouseAndKeyboard()
14+
m := get.GetMouseAndKeyboard();
1515

1616
if m.X1 < m.X2 {
1717
screenshot = utils.CaptureRect (
@@ -20,7 +20,7 @@ func Selection(filename string, clipboard, output, upload, file bool) {
2020
m.X2 - m.X1,
2121
m.Y2 - m.Y1,
2222
filename,
23-
)
23+
);
2424

2525
} else {
2626
screenshot = utils.CaptureRect (
@@ -29,9 +29,9 @@ func Selection(filename string, clipboard, output, upload, file bool) {
2929
m.X1 - m.X2,
3030
m.Y1 - m.Y2,
3131
filename,
32-
)
32+
);
3333

3434
}
3535

36-
save.SaveHandler(clipboard, output, upload, file, screenshot)
36+
save.SaveHandler(clipboard, output, upload, file, screenshot);
3737
}

0 commit comments

Comments
 (0)