mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-24 01:08:10 +02:00
Wayland: Fix specifying the output name for the panel kitten not working
Fixes #7573
This commit is contained in:
@@ -323,7 +323,7 @@ def generate_wrappers(glfw_header: str) -> None:
|
||||
void glfwWaylandRunWithActivationToken(GLFWwindow *handle, GLFWactivationcallback cb, void *cb_data)
|
||||
bool glfwWaylandSetTitlebarColor(GLFWwindow *handle, uint32_t color, bool use_system_color)
|
||||
void glfwWaylandRedrawCSDWindowTitle(GLFWwindow *handle)
|
||||
void glfwWaylandSetupLayerShellForNextWindow(GLFWLayerShellConfig c)
|
||||
void glfwWaylandSetupLayerShellForNextWindow(const GLFWLayerShellConfig *c)
|
||||
pid_t glfwWaylandCompositorPID(void)
|
||||
unsigned long long glfwDBusUserNotify(const char *app_name, const char* icon, const char *summary, const char *body, \
|
||||
const char *action_text, int32_t timeout, int urgency, GLFWDBusnotificationcreatedfun callback, void *data)
|
||||
|
||||
2
glfw/glfw3.h
vendored
2
glfw/glfw3.h
vendored
@@ -1309,7 +1309,7 @@ typedef enum { GLFW_FOCUS_NOT_ALLOWED, GLFW_FOCUS_EXCLUSIVE, GLFW_FOCUS_ON_DEMAN
|
||||
typedef struct GLFWLayerShellConfig {
|
||||
GLFWLayerShellType type;
|
||||
GLFWEdge edge;
|
||||
const char *output_name;
|
||||
char output_name[64];
|
||||
GLFWFocusPolicy focus_policy;
|
||||
unsigned size_in_cells;
|
||||
void (*size_callback)(GLFWwindow *window, const struct GLFWLayerShellConfig *config, unsigned monitor_width, unsigned monitor_height, uint32_t *width, uint32_t *height);
|
||||
|
||||
21
glfw/wl_monitor.c
vendored
21
glfw/wl_monitor.c
vendored
@@ -31,7 +31,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
|
||||
|
||||
@@ -90,7 +89,6 @@ static void outputHandleDone(void* data, struct wl_output* output UNUSED)
|
||||
for (int i = 0; i < _glfw.monitorCount; i++) {
|
||||
if (_glfw.monitors[i] == monitor) return;
|
||||
}
|
||||
|
||||
_glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);
|
||||
}
|
||||
|
||||
@@ -103,11 +101,28 @@ static void outputHandleScale(void* data,
|
||||
monitor->wl.scale = factor;
|
||||
}
|
||||
|
||||
static void outputHandleName(void* data,
|
||||
struct wl_output* output UNUSED,
|
||||
const char* name) {
|
||||
struct _GLFWmonitor *monitor = data;
|
||||
if (name) strncpy(monitor->wl.friendly_name, name, sizeof(monitor->wl.friendly_name)-1);
|
||||
}
|
||||
|
||||
static void outputHandleDescription(void* data,
|
||||
struct wl_output* output UNUSED,
|
||||
const char* description) {
|
||||
struct _GLFWmonitor *monitor = data;
|
||||
if (description) strncpy(monitor->wl.description, description, sizeof(monitor->wl.description)-1);
|
||||
|
||||
}
|
||||
|
||||
static const struct wl_output_listener outputListener = {
|
||||
outputHandleGeometry,
|
||||
outputHandleMode,
|
||||
outputHandleDone,
|
||||
outputHandleScale,
|
||||
outputHandleName,
|
||||
outputHandleDescription,
|
||||
};
|
||||
|
||||
|
||||
@@ -133,7 +148,7 @@ void _glfwAddOutputWayland(uint32_t name, uint32_t version)
|
||||
output = wl_registry_bind(_glfw.wl.registry,
|
||||
name,
|
||||
&wl_output_interface,
|
||||
2);
|
||||
MIN(version, (unsigned)WL_OUTPUT_NAME_SINCE_VERSION));
|
||||
if (!output)
|
||||
{
|
||||
_glfwFreeMonitor(monitor);
|
||||
|
||||
1
glfw/wl_platform.h
vendored
1
glfw/wl_platform.h
vendored
@@ -395,6 +395,7 @@ typedef struct _GLFWmonitorWayland
|
||||
{
|
||||
struct wl_output* output;
|
||||
uint32_t name;
|
||||
char friendly_name[64], description[64];
|
||||
int currentMode;
|
||||
|
||||
int x;
|
||||
|
||||
20
glfw/wl_window.c
vendored
20
glfw/wl_window.c
vendored
@@ -953,14 +953,10 @@ void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, bool enabled UNUSED) {
|
||||
|
||||
static struct wl_output*
|
||||
find_output_by_name(const char* name) {
|
||||
if (!name) return NULL;
|
||||
int count;
|
||||
GLFWmonitor** monitors = glfwGetMonitors(&count);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
_GLFWmonitor *m = (_GLFWmonitor*)monitors + i;
|
||||
if (strcmp(m->name, name) == 0) {
|
||||
return m->wl.output;
|
||||
}
|
||||
if (!name || !name[0]) return NULL;
|
||||
for (int i = 0; i < _glfw.monitorCount; i++) {
|
||||
_GLFWmonitor *m = _glfw.monitors[i];
|
||||
if (strcmp(m->wl.friendly_name, name) == 0) return m->wl.output;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1399,7 +1395,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||
wp_viewport_destroy(window->wl.wp_viewport);
|
||||
if (window->wl.org_kde_kwin_blur)
|
||||
org_kde_kwin_blur_release(window->wl.org_kde_kwin_blur);
|
||||
if (window->wl.layer_shell.config.output_name) free((void*)window->wl.layer_shell.config.output_name);
|
||||
|
||||
if (window->context.destroy)
|
||||
window->context.destroy(window);
|
||||
@@ -2747,11 +2742,8 @@ GLFWAPI void glfwWaylandRedrawCSDWindowTitle(GLFWwindow *handle) {
|
||||
if (csd_change_title(window)) commit_window_surface_if_safe(window);
|
||||
}
|
||||
|
||||
GLFWAPI void glfwWaylandSetupLayerShellForNextWindow(GLFWLayerShellConfig c) {
|
||||
if (layer_shell_config_for_next_window.output_name) free((void*)layer_shell_config_for_next_window.output_name);
|
||||
layer_shell_config_for_next_window = c;
|
||||
if (layer_shell_config_for_next_window.output_name && !layer_shell_config_for_next_window.output_name[0]) layer_shell_config_for_next_window.output_name = NULL;
|
||||
if (layer_shell_config_for_next_window.output_name) layer_shell_config_for_next_window.output_name = strdup(layer_shell_config_for_next_window.output_name);
|
||||
GLFWAPI void glfwWaylandSetupLayerShellForNextWindow(const GLFWLayerShellConfig *c) {
|
||||
layer_shell_config_for_next_window = *c;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user