Skip to content

Commit bb47939

Browse files
committed
feat: add a method for capturing Hyprland clients
feat: improve project's structure
1 parent 52e8199 commit bb47939

19 files changed

+846
-373
lines changed

examples/simple/simple.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
/* cc simple.c `pkg-config --libs --cflags libglace` */
2-
#include <libglace/libglace.h>
1+
/* cc simple.c `pkg-config --libs --cflags glace` */
2+
#include <glace/glace.h>
33

44
static void on_client_chagend(GlaceClient* client) {
55
printf(

libglace/libglace-client-private.h renamed to glace/glace-client-private.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
#pragma once
2+
13
#ifndef __LIBGLACE_CLIENT_PRIVATE_H__
24
#define __LIBGLACE_CLIENT_PRIVATE_H__
35

4-
#include "libglace-client.h"
5-
#include "libglace-manager-private.h"
6+
#include "glace-client.h"
7+
#include "glace-manager-private.h"
68

79
#define CLIENT_SET_CURRENT_PROP(client, prop, value) \
810
(client->priv->current_properties.prop = value)

libglace/libglace-client-private.c renamed to glace/glace-client.c

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "libglace-private.h"
1+
#include "glace-private.h"
22

33
static guint glace_client_signals[GLACE_CLIENT_N_SIGNALS] = {0};
44
static GParamSpec* glace_client_properties[GLACE_CLIENT_N_PROPERTIES] = {
@@ -324,4 +324,122 @@ GlaceClient* glace_client_new(
324324
return self;
325325
}
326326

327+
// client getters
328+
guint glace_client_get_id(GlaceClient* self) {
329+
return (guint)self->priv->id;
330+
}
331+
332+
const gchar* glace_client_get_app_id(GlaceClient* self) {
333+
return CLIENT_GET_CURRENT_PROP(self, app_id);
334+
}
335+
336+
const gchar* glace_client_get_title(GlaceClient* self) {
337+
return CLIENT_GET_CURRENT_PROP(self, title);
338+
}
339+
340+
gboolean glace_client_get_maximized(GlaceClient* self) {
341+
return CLIENT_GET_CURRENT_PROP(self, maximized);
342+
}
343+
344+
gboolean glace_client_get_minimized(GlaceClient* self) {
345+
return CLIENT_GET_CURRENT_PROP(self, minimized);
346+
}
347+
348+
gboolean glace_client_get_activated(GlaceClient* self) {
349+
return CLIENT_GET_CURRENT_PROP(self, activated);
350+
}
351+
352+
gboolean glace_client_get_fullscreen(GlaceClient* self) {
353+
return CLIENT_GET_CURRENT_PROP(self, fullscreen);
354+
}
355+
356+
gboolean glace_client_get_closed(GlaceClient* self) {
357+
return self->priv->closed;
358+
}
359+
360+
// client methods
361+
void glace_client_maximize(GlaceClient* self) {
362+
// replacing EMPTY_TOKEN with a trailing comma
363+
// will do the trick as well
364+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
365+
366+
zwlr_foreign_toplevel_handle_v1_set_maximized(self->priv->wlr_handle);
367+
}
368+
369+
void glace_client_unmaximize(GlaceClient* self) {
370+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
371+
372+
zwlr_foreign_toplevel_handle_v1_unset_maximized(self->priv->wlr_handle);
373+
}
374+
375+
void glace_client_minimize(GlaceClient* self) {
376+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
377+
378+
zwlr_foreign_toplevel_handle_v1_set_minimized(self->priv->wlr_handle);
379+
}
380+
381+
void glace_client_unminimize(GlaceClient* self) {
382+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
383+
384+
zwlr_foreign_toplevel_handle_v1_unset_minimized(self->priv->wlr_handle);
385+
}
386+
387+
void glace_client_close(GlaceClient* self) {
388+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
389+
390+
zwlr_foreign_toplevel_handle_v1_close(self->priv->wlr_handle);
391+
}
392+
393+
void glace_client_activate(GlaceClient* self) {
394+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
395+
396+
GdkSeat* gdk_seat = gdk_display_get_default_seat(self->priv->gdk_display);
397+
struct wl_seat* seat = gdk_wayland_seat_get_wl_seat(gdk_seat);
398+
399+
zwlr_foreign_toplevel_handle_v1_activate(
400+
self->priv->wlr_handle,
401+
seat
402+
);
403+
}
404+
405+
void glace_client_move(
406+
GlaceClient* self,
407+
GdkWindow* window,
408+
const GdkRectangle* rectangle
409+
) {
410+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
411+
412+
if (window == NULL) {
413+
zwlr_foreign_toplevel_handle_v1_set_rectangle(
414+
self->priv->wlr_handle,
415+
NULL,
416+
rectangle->x,
417+
rectangle->y,
418+
rectangle->width,
419+
rectangle->height
420+
);
421+
return;
422+
}
423+
424+
zwlr_foreign_toplevel_handle_v1_set_rectangle(
425+
self->priv->wlr_handle,
426+
gdk_wayland_window_get_wl_surface(window),
427+
rectangle->x,
428+
rectangle->y,
429+
rectangle->width,
430+
rectangle->height
431+
);
432+
}
433+
434+
void glace_client_fullscreen(GlaceClient* self) {
435+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
436+
437+
zwlr_foreign_toplevel_handle_v1_set_fullscreen(self->priv->wlr_handle, self->priv->output);
438+
}
439+
440+
void glace_client_unfullscreen(GlaceClient* self) {
441+
RETURN_IF_INVALID_CLIENT(self, EMPTY_TOKEN);
442+
443+
zwlr_foreign_toplevel_handle_v1_unset_fullscreen(self->priv->wlr_handle);
444+
}
327445
G_DEFINE_TYPE(GlaceClient, glace_client, G_TYPE_OBJECT);

libglace/libglace-client.h renamed to glace/glace-client.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
#pragma once
2+
13
#ifndef __LIBGLACE_CLIENT_H__
24
#define __LIBGLACE_CLIENT_H__
35

4-
#include "libglace-manager.h"
6+
#include <assert.h>
7+
#include <gdk/gdkwayland.h>
8+
#include <glib-object.h>
9+
#include <gtk-3.0/gtk/gtk.h>
10+
#include <stdbool.h>
11+
#include <string.h>
512

613
G_BEGIN_DECLS
714

libglace/libglace-manager-private.h renamed to glace/glace-manager-private.h

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
#pragma once
2+
13
#ifndef __LIBGLACE_MANAGER_PRIVATE_H__
24
#define __LIBGLACE_MANAGER_PRIVATE_H__
35

4-
#include "libglace-client-private.h"
5-
#include "libglace-manager.h"
6-
#include "wlr-foreign-toplevel-management-unstable-v1.h"
6+
#include "glace-client-private.h"
7+
#include "glace-client.h"
8+
#include "glace-manager.h"
79

810
#define max(a, b) (a > b ? a : b)
911
#define min(x, y) ((x) < (y) ? (x) : (y))
@@ -21,6 +23,32 @@
2123

2224
#define G_LIST_FOREACH(item, list) for (GList* __glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
2325

26+
typedef struct _GlaceFrameData GlaceFrameData;
27+
typedef struct _GlaceFrameBuffer GlaceFrameBuffer;
28+
29+
struct _GlaceFrameBuffer {
30+
struct wl_buffer* wl_buffer;
31+
void* raw_buffer;
32+
33+
size_t size;
34+
uint32_t width;
35+
uint32_t height;
36+
uint32_t stride;
37+
uint32_t format;
38+
};
39+
40+
struct _GlaceFrameData {
41+
GlaceManager* manager;
42+
GlaceClient* client;
43+
44+
GlaceFrameBuffer* buffer;
45+
46+
GlaceManagerCaptureClientCallback callback;
47+
gpointer callback_data;
48+
};
49+
50+
const static struct hyprland_toplevel_export_frame_v1_listener export_manager_frame_listener;
51+
2452
// static void glace_manager_init(GlaceManager* self);
2553
// static void glace_manager_class_init(GlaceManagerClass* klass);
2654

0 commit comments

Comments
 (0)