summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2024-02-16 13:36:21 +0100
committerDave Davenport <qball@gmpclient.org>2024-02-16 13:36:21 +0100
commit3a5f95d69e0a3d2bd20a247882ba4c30cdf0b845 (patch)
tree236d486cb8b316898cc248639102312322e38787
parent831bddc68b79c58044dbfeb2be62f77948e1726b (diff)
[View] Don't use xcb surface to render to png, but create surface.
-rw-r--r--source/view.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/source/view.c b/source/view.c
index 29ca2307..fe438dae 100644
--- a/source/view.c
+++ b/source/view.c
@@ -217,13 +217,13 @@ static int lev_sort(const void *p1, const void *p2, void *arg) {
/**
* Stores a screenshot of Rofi at that point in time.
*/
-void rofi_capture_screenshot(void) {
- const char *outp = g_getenv("ROFI_PNG_OUTPUT");
- if (CacheState.edit_surf == NULL) {
- // Nothing to store.
- g_warning("There is no rofi surface to store");
+void rofi_capture_screenshot() {
+ RofiViewState *state = current_active_menu;
+ if (state == NULL || state->main_window == NULL) {
+ g_warning("Nothing to screenshot.");
return;
}
+ const char *outp = g_getenv("ROFI_PNG_OUTPUT");
const char *xdg_pict_dir = g_get_user_special_dir(G_USER_DIRECTORY_PICTURES);
if (outp == NULL && xdg_pict_dir == NULL) {
g_warning("XDG user picture directory or ROFI_PNG_OUTPUT is not set. "
@@ -254,12 +254,30 @@ void rofi_capture_screenshot(void) {
fpath = g_strdup(outp);
}
fprintf(stderr, color_green "Storing screenshot %s\n" color_reset, fpath);
- cairo_status_t status =
- cairo_surface_write_to_png(CacheState.edit_surf, fpath);
+ cairo_surface_t *surf = cairo_image_surface_create(
+ CAIRO_FORMAT_ARGB32, state->width, state->height);
+ cairo_status_t status = cairo_surface_status(surf);
if (status != CAIRO_STATUS_SUCCESS) {
g_warning("Failed to produce screenshot '%s', got error: '%s'", fpath,
cairo_status_to_string(status));
+ } else {
+ cairo_t *draw = cairo_create(surf);
+ status = cairo_status(draw);
+ if (status != CAIRO_STATUS_SUCCESS) {
+ g_warning("Failed to produce screenshot '%s', got error: '%s'", fpath,
+ cairo_status_to_string(status));
+ } else {
+ widget_draw(WIDGET(state->main_window), draw);
+ status = cairo_surface_write_to_png(surf, fpath);
+ if (status != CAIRO_STATUS_SUCCESS) {
+ g_warning("Failed to produce screenshot '%s', got error: '%s'", fpath,
+ cairo_status_to_string(status));
+ }
+ }
+ cairo_destroy(draw);
}
+ // Cleanup
+ cairo_surface_destroy(surf);
g_free(fpath);
g_free(filename);
g_free(timestmp);