Giter VIP home page Giter VIP logo

kiwmi's People

Contributors

aareon avatar buffet avatar eepykate avatar hardy7cc avatar qazzquimby avatar rubbaboy avatar tadeokondrak avatar willeccles avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kiwmi's Issues

[FR] Xwayland support

Targeting kiwmi everyday use it's mandatory to support legacy X clients seamlessly.
thanks

No free output buffer slot, failed to render cursor buffer

When I start kiwmi, a black borderless window pops up, the cursor is glitchy and leaves a weird trail, the keybinds don't do anything and this shows up in the log:

00:00:21.399 [render/swapchain.c:97] No free output buffer slot
00:00:21.399 [types/output/cursor.c:354] Failed to render cursor buffer
00:00:41.398 [render/swapchain.c:97] No free output buffer slot
00:00:41.398 [types/output/cursor.c:354] Failed to render cursor buffer
00:00:41.398 [render/swapchain.c:97] No free output buffer slot
00:00:41.398 [types/output/cursor.c:354] Failed to render cursor buffer

(It says it a few more times)

My configuration is from https://github.com/dacyberduck/kiwmi-config/

segfault on quit due to output destroy event/listener

I have this with the scene-graph branch, but i believe it is a problem on master already, as i’m not aware of having touched anything relevant. Leaving this here mostly as a reminder for myself, though i wouldn’t mind if
it got magically resolved all by itself :-P

It happens almost consistently – that is, most of my nested sessions end with it.


Well, now that i’ve tried kiwmi on master, it crashed due to some wl_list_remove… but it’s got debug symbols stripped & it was a bit complicated to compile (coz i needed statically linked wlroots) so i can’t tell much more atm 🤷

Thread 1 "kiwmi" received signal SIGSEGV, Segmentation fault.
0x00007ffff7e75d9f in wl_list_remove () from /usr/lib/libwayland-server.so.0
+bt full
#0  0x00007ffff7e75d9f in wl_list_remove () at /usr/lib/libwayland-server.so.0
#1  0x00007ffff7e70af8 in wl_global_destroy () at /usr/lib/libwayland-server.so.0
#2  0x00005555555c42d6 in  ()
#3  0x000055555556da79 in  ()
#4  0x00005555555c65a4 in  ()
#5  0x00005555555b779f in  ()
#6  0x000055555558f06d in  ()
#7  0x000055555557d7db in  ()
#8  0x000055555558d472 in  ()
#9  0x000055555558d665 in  ()
#10 0x00007ffff7e70877 in wl_display_destroy () at /usr/lib/libwayland-server.so.0
#11 0x000055555556c87a in  ()
#12 0x000055555556c2e9 in  ()
#13 0x00007ffff7988b25 in __libc_start_main () at /usr/lib/libc.so.6
#14 0x000055555556c41e in  ()

But now back to what i can inspect (that is, the wlr-scene branch)…

It’s a kiwmi_output::events.destroy event, so it is definitely a kiwmi issue. Relevant pieces of gdb output (telling me that some listener prolly didn’t remove itself):

Thread 1 "kiwmi" received signal SIGSEGV, Segmentation fault.
0x00007ffff7e91390 in buffer_addon_impl () from /usr/lib/libwlroots.so.10
+bt full
#0  0x00007ffff7e91390 in buffer_addon_impl () at /usr/lib/libwlroots.so.10
#1  0x000055555555bf4d in wl_signal_emit (signal=0x555555b5c148, data=0x555555b5c030) at /usr/include/wayland-server-core.h:478
        l = 0x555555b94fd0
        next = 0x700000007
#2  0x000055555555c691 in output_destroy_notify (listener=0x555555b5c088, UNUSED_data=0x555555b86b00) at ../kiwmi/desktop/output.c:287
        output = 0x555555b5c030
#3  0x00007ffff7e4bf5e in wlr_signal_emit_safe (signal=<optimized out>, data=0x555555b86b00) at ../wlroots/util/signal.c:29
#4  0x00007ffff7e1ed01 in wlr_output_destroy (output=0x555555b86b00) at ../wlroots/types/output/output.c:389
#5  wlr_output_destroy (output=0x555555b86b00) at ../wlroots/types/output/output.c:377

[...]

+up 1
#1  0x000055555555bf4d in wl_signal_emit (signal=0x555555b5c148, data=0x555555b5c030) at /usr/include/wayland-server-core.h:478
478			l->notify(l, data);
+print *signal
$1 = {
  listener_list = {
    prev = 0x555555b94fd0,
    next = 0x555555b94fd0
  }
}
+print l
$2 = (struct wl_listener *) 0x555555b94fd0
+print *l
$3 = {
  link = {
    prev = 0x555555c8db00,
    next = 0x700000007
  },
  notify = 0x7ffff7e91390 <buffer_addon_impl>
}
+print *l->link.next
Cannot access memory at address 0x700000007
+up 1
#2  0x000055555555c691 in output_destroy_notify (listener=0x555555b5c088, UNUSED_data=0x555555b86b00) at ../kiwmi/desktop/output.c:287
287	    wl_signal_emit(&output->events.destroy, output);
+print output
$4 = (struct kiwmi_output *) 0x555555b5c030
+print *output
$5 = {
  link, desktop, // removed for a shorter log
  wlr_output = 0x555555b86b00,
  scene_output, frame, commit,
  destroy = {
    link = {
      prev = 0x555555b86d28,
      next = 0x7fffffffd680
    },
    notify = 0x55555555c63c <output_destroy_notify>
  },
  mode, layers, layer_strata_subtrees, layer_popups_strata_subtrees, usable_area,
  events = {
    destroy = {
      listener_list = {
        prev = 0x555555b94fd0,
        next = 0x555555b94fd0
      }
    },
    resize = {
      listener_list = {
        prev = 0x555555b5c158,
        next = 0x555555b5c158
      }
    },
    usable_area_change = {
      listener_list = {
        prev = 0x555555b5c168,
        next = 0x555555b5c168
      }
    }
  }
}
Thread 1 "kiwmi" received signal SIGSEGV, Segmentation fault.
0x00005555555b8600 in ?? ()
+bt full
#0  0x00005555555b8600 in  ()
#1  0x000055555555bf4d in wl_signal_emit (signal=0x555555b5c278, data=0x555555b5c160) at /usr/include/wayland-server-core.h:478
#2  0x000055555555c691 in output_destroy_notify (listener=0x555555b5c1b8, UNUSED_data=0x555555b86c30) at ../kiwmi/desktop/output.c:287
#3  0x00007ffff7e4bf5e in wlr_signal_emit_safe (signal=<optimized out>, data=0x555555b86c30) at ../wlroots/util/signal.c:29
#4  0x00007ffff7e1ed01 in wlr_output_destroy (output=0x555555b86c30) at ../wlroots/types/output/output.c:389
#5  wlr_output_destroy (output=0x555555b86c30) at ../wlroots/types/output/output.c:377

[...]

+up 1
#1  0x000055555555bf4d in wl_signal_emit (signal=0x555555b5c278, data=0x555555b5c160) at /usr/include/wayland-server-core.h:478
478			l->notify(l, data);
+print *l
$6 = {
  link = {
    prev = 0x555555b8d270,
    next = 0x0
  },
  notify = 0x5555555b8600
}

Doesn't build

OS: Arch GNU/Linux
Lua: Lua 5.4.3 Copyright (C) 1994-2021 Lua.org, PUC-Rio)
Error:

Build targets in project: 12

Found ninja-1.10.2 at /usr/bin/ninja
➜  kiwmi git:(master) ninja -C build
ninja: Entering directory `build'
[11/39] Compiling C object kiwmi/kiwmi.p/desktop_layer_shell.c.o
FAILED: kiwmi/kiwmi.p/desktop_layer_shell.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_layer_shell.c.o -MF kiwmi/kiwmi.p/desktop_layer_shell.c.o.d -o kiwmi/kiwmi.p/desktop_layer_shell.c.o -c ../kiwmi/desktop/layer_shell.c
In file included from ../kiwmi/desktop/layer_shell.c:8:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[13/39] Compiling C object kiwmi/kiwmi.p/desktop_output.c.o
FAILED: kiwmi/kiwmi.p/desktop_output.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_output.c.o -MF kiwmi/kiwmi.p/desktop_output.c.o.d -o kiwmi/kiwmi.p/desktop_output.c.o -c ../kiwmi/desktop/output.c
In file included from ../kiwmi/desktop/output.c:8:
../include/desktop/output.h:12:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   12 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[16/39] Compiling C object kiwmi/kiwmi.p/input_seat.c.o
FAILED: kiwmi/kiwmi.p/input_seat.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/input_seat.c.o -MF kiwmi/kiwmi.p/input_seat.c.o.d -o kiwmi/kiwmi.p/input_seat.c.o -c ../kiwmi/input/seat.c
In file included from ../include/input/seat.h:14,
                 from ../kiwmi/input/seat.c:8:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[18/39] Compiling C object kiwmi/kiwmi.p/input_keyboard.c.o
FAILED: kiwmi/kiwmi.p/input_keyboard.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/input_keyboard.c.o -MF kiwmi/kiwmi.p/input_keyboard.c.o.d -o kiwmi/kiwmi.p/input_keyboard.c.o -c ../kiwmi/input/keyboard.c
In file included from ../include/input/seat.h:14,
                 from ../kiwmi/input/keyboard.c:21:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[19/39] Compiling C object kiwmi/kiwmi.p/desktop_desktop.c.o
FAILED: kiwmi/kiwmi.p/desktop_desktop.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_desktop.c.o -MF kiwmi/kiwmi.p/desktop_desktop.c.o.d -o kiwmi/kiwmi.p/desktop_desktop.c.o -c ../kiwmi/desktop/desktop.c
In file included from ../kiwmi/desktop/desktop.c:24:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[20/39] Compiling C object kiwmi/kiwmi.p/input_input.c.o
FAILED: kiwmi/kiwmi.p/input_input.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSE                                  D(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/input_input.c.o -MF kiwmi/kiwmi.p/input_input.c.o.d -o kiwmi/kiwmi.p/input_input.c.o -c ../kiwmi/input/input.c
In file included from ../include/input/seat.h:14,
                 from ../kiwmi/input/input.c:22:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[21/39] Compiling C object kiwmi/kiwmi.p/desktop_xdg_shell.c.o
FAILED: kiwmi/kiwmi.p/desktop_xdg_shell.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_xdg_shell.c.o -MF kiwmi/kiwmi.p/desktop_xdg_shell.c.o.d -o kiwmi/kiwmi.p/desktop_xdg_shell.c.o -c ../kiwmi/desktop/xdg_shell.c
In file included from ../kiwmi/desktop/xdg_shell.c:20:
../include/desktop/output.h:12:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   12 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[22/39] Compiling C object kiwmi/kiwmi.p/desktop_view.c.o
FAILED: kiwmi/kiwmi.p/desktop_view.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_view.c.o -MF kiwmi/kiwmi.p/desktop_view.c.o.d -o kiwmi/kiwmi.p/desktop_view.c.o -c../kiwmi/desktop/view.c
In file included from ../kiwmi/desktop/view.c:13:
../include/desktop/output.h:12:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   12 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[23/39] Compiling C object kiwmi/kiwmi.p/input_cursor.c.o
FAILED: kiwmi/kiwmi.p/input_cursor.c.o
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/pixman-1 -I/usr/include/libdrm -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="86e0f5b (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/input_cursor.c.o -MF kiwmi/kiwmi.p/input_cursor.c.o.d -o kiwmi/kiwmi.p/input_cursor.c.o -c../kiwmi/input/cursor.c
In file included from ../kiwmi/input/cursor.c:22:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_box.h: No such file or directory
   14 | #include <wlr/types/wlr_box.h>
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
[26/39] Compiling C object kiwmi/kiwmi.p/server.c.o
../kiwmi/server.c: In function ‘server_init’:
../kiwmi/server.c:46:37: warning: implicit declaration of function ‘wlr_backend_get_renderer’; did you mean ‘wlr_backend_get_session’? [-Wimplicit-function-declaration]
   46 |     struct wlr_renderer *renderer = wlr_backend_get_renderer(server->backend);
      |                                     ^~~~~~~~~~~~~~~~~~~~~~~~
      |                                     wlr_backend_get_session
../kiwmi/server.c:46:37: warning: initialization of ‘struct wlr_renderer *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
[28/39] Compiling C object kiwmi/kiwmi.p/luak_kiwmi_cursor.c.o
ninja: build stopped: subcommand failed.

Documentation

Some documentation would be really nice, the project looks interesting but I have no idea how to run or use it.

  • How to execute kiwmi?
  • How do I send commands from kiwmc to kiwmi?
  • How can I configure kiwmi and what options are available?

Init.lua

[..kiwmi/luak/luak.c:238] error running config cannot open /home/build/.config/kiwmi/init.lua no such file or directory
[..kiwmi/main.c:90] fail to run server

[FR] support input inhibit protocol

$  waylock 
thread 'main' panicked at '[SCTK] A missing global was required: zwlr_input_inhibit_manager_v1', /usr/src/RPM/BUILD/waylock-0.3.3/vendor/smithay-client-toolkit/src/environment.rs:149:21

thanks

[FR] allow spawning process via `execv(argv)` rather than `sh -c`

The spawn method already uses execl(2) under the hood, it would be nice to expose that interface to Lua, to allow spawning of processes without arduous shell escaping.

static int
l_kiwmi_server_spawn(lua_State *L)
{
luaL_checkudata(L, 1, "kiwmi_server");
luaL_checktype(L, 2, LUA_TSTRING);
const char *command = lua_tostring(L, 2);
pid_t pid = fork();
if (pid < 0) {
return luaL_error(L, "Failed to run command (fork)");
}
if (pid == 0) {
execl("/bin/sh", "/bin/sh", "-c", command, NULL);
_exit(EXIT_FAILURE);
}
lua_pushinteger(L, pid);
return 1;
}

I'm not familiar with the C interfaces of Lua, but considering Lua is dynamically typed, would it be possible (or idiomatic) to reuse the same method and distinguish based on type (i.e. string vs. list of string) and based on that call the appropriate method?
Something along those lines:

if (is_string(arg))
{
  // fork off
  execl("sh", "-c", arg);
}
else
{
  assert_list(arg);
  assert_not_empty(arg);
  assert_all_elements_string(arg);

  // fork off

  unsigned int length = len(arg);
  const char *argv = malloc(sizeof(char *) * (length + 1));
  if(!argv) { err(1, "malloc for argv"); }
  argv[length] = NULL;
  for(int i = 0;i < length; i++)
  {
    argv[i] = lua_tostring(lua_index(arg, i));
  }
  execv(argv[0], argv);
}

That was a lot more verbose than I intended, and the lua functions are definitely not what they should be, also err(3) is from libbsd, and my C is generally rusty so I'm not at all sure whether this resembles modern coding style.
Considering that all the heavy lifting would be done after the fork (to avoid (de)allocations in the parent) at least the cleanup is cheap thanks to the exec-or-err handling.

If squashing the functionality into the same method is not an idiomatic thing then a separate kiwmi:exec([command]) would be nice.

View IDs

I need a simple way to identify views in my config. Can you please add something like view IDs?

I've tried to do this 'little change' myself, but can't seem to get it right.

Edit: It seems I just had an awful error in my init.lua, otherwise it could (or could not) have worked.

"Failed to run server"

Is init.lua not found, fatal? Because kikmi fails to launch (from virtual console) for me:

Using kiwmi v1781497 (Dec  8 2022, branch 'master')
00:00:00.000 [DEBUG] [../kiwmi/server.c:31] Initializing Wayland server
00:00:00.000 [INFO] [libseat] [libseat/backend/seatd.c:64] Could not connect to socket /run/seatd.sock: No such file or directory
00:00:00.000 [INFO] [libseat] [libseat/libseat.c:76] Backend 'seatd' failed to open seat, skipping
00:00:00.011 [INFO] [libseat] [libseat/libseat.c:73] Seat opened with backend 'logind'
00:00:00.011 [INFO] [backend/session/session.c:110] Successfully loaded libseat session
00:00:00.014 [INFO] [backend/backend.c:220] Found 1 GPUs
00:00:00.014 [INFO] [backend/drm/backend.c:183] Initializing DRM backend for /dev/dri/card0 (i915)
00:00:00.014 [DEBUG] [backend/drm/drm.c:85] Using atomic DRM interface
00:00:00.014 [DEBUG] [backend/drm/drm.c:98] ADDFB2 modifiers supported
00:00:00.014 [INFO] [backend/drm/drm.c:259] Found 4 DRM CRTCs
00:00:00.015 [INFO] [backend/drm/drm.c:186] Found 24 DRM planes
00:00:00.016 [INFO] [render/egl.c:180] Supported EGL client extensions: EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_EXT_client_extensions EGL_KHR_debug EGL_EXT_platform_device EGL_EXT_platform_wayland EGL_KHR_platform_wayland EGL_EXT_platform_x11 EGL_KHR_platform_x11 EGL_EXT_platform_xcb EGL_MESA_platform_gbm EGL_KHR_platform_gbm EGL_MESA_platform_surfaceless
00:00:00.016 [DEBUG] [render/egl.c:437] Using EGL device /dev/dri/card0
00:00:00.033 [INFO] [render/egl.c:326] Using EGL 1.5
00:00:00.033 [INFO] [render/egl.c:327] Supported EGL display extensions: EGL_ANDROID_blob_cache EGL_ANDROID_native_fence_sync EGL_EXT_create_context_robustness EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_IMG_context_priority EGL_KHR_cl_event2 EGL_KHR_config_attribs EGL_KHR_context_flush_control EGL_KHR_create_context EGL_KHR_create_context_no_error EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses EGL_KHR_gl_colorspace EGL_KHR_gl_renderbuffer_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_image_base EGL_KHR_no_config_context EGL_KHR_reusable_sync EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_drm_image EGL_MESA_image_dma_buf_export EGL_MESA_query_driver EGL_WL_bind_wayland_display 
00:00:00.033 [INFO] [render/egl.c:329] Supported EGL device extensions: EGL_EXT_device_drm EGL_EXT_device_drm_render_node
00:00:00.033 [INFO] [render/egl.c:331] EGL vendor: Mesa Project
00:00:00.033 [DEBUG] [render/egl.c:158] Supported DMA-BUF formats: AB4H XB4H AB48 XB48 AR30 XR30 AB30 AR24 AB24 XR24 XB24 AR15 RG16 R8   R16  GR88 GR32 YUV9 YU11 YU12 YU16 YU24 YVU9 YV11 YV12 YV16 YV24 NV12 P010 P012 P016 NV16 AYUV XYUV Y410 Y412 Y416 YUYV UYVY Y210 Y212 Y216 
00:00:00.033 [DEBUG] [render/egl.c:159] EGL DMA-BUF format modifiers supported
00:00:00.034 [DEBUG] [render/egl.c:388] Obtained high priority context
00:00:00.034 [DEBUG] [render/egl.c:485] Using EGL_PLATFORM_DEVICE_EXT
00:00:00.035 [INFO] [render/gles2/renderer.c:737] Creating GLES2 renderer
00:00:00.035 [INFO] [render/gles2/renderer.c:738] Using OpenGL ES 3.2 Mesa 22.2.1
00:00:00.035 [INFO] [render/gles2/renderer.c:739] GL vendor: Intel
00:00:00.035 [INFO] [render/gles2/renderer.c:740] GL renderer: Mesa Intel(R) UHD Graphics 770 (ADL-S GT1)
00:00:00.035 [INFO] [render/gles2/renderer.c:741] Supported GLES2 extensions: GL_EXT_blend_minmax GL_EXT_multi_draw_arrays GL_EXT_texture_filter_anisotropic GL_EXT_texture_compression_s3tc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_format_BGRA8888 GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_stencil8 GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float GL_EXT_draw_instanced GL_EXT_texture_sRGB_decode GL_OES_EGL_image GL_OES_depth_texture GL_AMD_performance_monitor GL_OES_packed_depth_stencil GL_EXT_texture_type_2_10_10_10_REV GL_NV_conditional_render GL_OES_get_program_binary GL_APPLE_texture_max_level GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_NV_pack_subimage GL_EXT_frag_depth GL_NV_fbo_color_attachments GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_array_object GL_OES_viewport_array GL_ANGLE_pack_reverse_row_order GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_EXT_occlusion_query_boolean GL_EXT_robustness GL_EXT_texture_rg GL_EXT_unpack_subimage GL_NV_draw_buffers GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_EXT_draw_buffers GL_EXT_map_buffer_range GL_KHR_debug GL_KHR_robustness GL_KHR_texture_compression_astc_ldr GL_NV_pixel_buffer_object GL_OES_depth_texture_cube_map GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_color_buffer_float GL_EXT_sRGB_write_control GL_EXT_separate_shader_objects GL_EXT_shader_framebuffer_fetch GL_EXT_shader_group_vote GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_INTEL_conservative_rasterization GL_INTEL_performance_query GL_ANDROID_extension_pack_es31a GL_EXT_base_instance GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_copy_image GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_EXT_gpu_shader5 GL_EXT_polygon_offset_clamp GL_EXT_primitive_bounding_box GL_EXT_render_snorm GL_EXT_shader_io_blocks GL_EXT_texture_border_clamp GL_EXT_texture_buffer GL_EXT_texture_cube_map_array GL_EXT_texture_norm16 GL_EXT_texture_view GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_KHR_context_flush_control GL_KHR_robust_buffer_access_behavior GL_NV_image_formats GL_OES_copy_image GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_gpu_shader5 GL_OES_primitive_bounding_box GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_io_blocks GL_OES_shader_multisample_interpolation GL_OES_tessellation_point_size GL_OES_tessellation_shader GL_OES_texture_border_clamp GL_OES_texture_buffer GL_OES_texture_cube_map_array GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_texture_view GL_EXT_blend_func_extended GL_EXT_buffer_storage GL_EXT_float_blend GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_shader_samples_identical GL_EXT_texture_sRGB_R8 GL_KHR_no_error GL_KHR_texture_compression_astc_sliced_3d GL_NV_fragment_shader_interlock GL_OES_EGL_image_external_essl3 GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_shader_image_atomic GL_EXT_clear_texture GL_EXT_clip_cull_distance GL_EXT_disjoint_timer_query GL_EXT_texture_compression_s3tc_srgb GL_MESA_shader_integer_functions GL_EXT_clip_control GL_EXT_color_buffer_half_float GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_semaphore GL_EXT_semaphore_fd GL_EXT_texture_compression_bptc GL_EXT_texture_mirror_clamp_to_edge GL_KHR_parallel_shader_compile GL_EXT_EGL_image_storage GL_EXT_shader_framebuffer_fetch_non_coherent GL_EXT_texture_shadow_lod GL_INTEL_blackhole_render GL_MESA_framebuffer_flip_y GL_NV_compute_shader_derivatives GL_EXT_demote_to_helper_invocation GL_EXT_depth_clamp GL_EXT_texture_query_lod GL_MESA_bgra 
00:00:00.039 [DEBUG] [render/allocator/allocator.c:98] Trying to create gbm allocator
00:00:00.042 [DEBUG] [render/allocator/gbm.c:203] Created GBM allocator with backend drm
00:00:00.042 [DEBUG] [render/allocator/gbm.c:206] Using DRM node /dev/dri/card0
00:00:00.042 [DEBUG] [../kiwmi/input/cursor.c:217] Creating cursor
00:00:00.042 [INFO] [wayland] unable to lock lockfile /run/user/1000/wayland-0.lock, maybe another compositor is running
00:00:00.042 [DEBUG] [../kiwmi/server.c:117] Running Wayland server on display 'wayland-1'
00:00:00.042 [ERROR] [../kiwmi/luak/luak.c:296] Error running config: cannot open /home/stolk/.config/kiwmi/init.lua: No such file or directory
00:00:00.088 [ERROR] [../kiwmi/main.c:90] Failed to run server

Note: the repo does not contain lua files, and no lua files are created in the install directory. So I am not sure where this lua should come from?

wlroots: 0.15.1

kiwmi: HEAD

OS: Ubuntu 22.10

GPU: Intel

wlroots compatibility

I suspect this needs a specific version of wlroots?
Because building against latest (v0.17), gives me:

$ meson setup --prefix=/opt/kiwmi build
The Meson build system
Version: 0.63.2
Source dir: /usr/src/kiwmi
Build dir: /usr/src/kiwmi/build
Build type: native build
Project name: kiwmi
Project version: undefined
C compiler for the host machine: cc (gcc 12.2.0 "cc (Ubuntu 12.2.0-3ubuntu1) 12.2.0")
C linker for the host machine: cc ld.bfd 2.39
Host machine cpu family: x86_64
Host machine cpu: x86_64
Program git found: YES (/usr/bin/git)
Found pkg-config: /usr/bin/pkg-config (1.8.0)
Run-time dependency lua found: YES 5.4.4
Run-time dependency pixman-1 found: YES 0.42.2
Run-time dependency wayland-client found: YES 1.21.0
Run-time dependency wayland-protocols found: YES 1.31
Run-time dependency wayland-scanner found: YES 1.21.0
Run-time dependency wayland-server found: YES 1.21.0
Run-time dependency wlroots found: YES 0.17.0-dev
Run-time dependency xkbcommon found: YES 1.4.1
Build targets in project: 12

kiwmi undefined

  User defined options
    prefix: /opt/kiwmi

Found ninja-1.11.0 at /usr/bin/ninja
stolk@workpc:/usr/src/kiwmi$ cd build/                                                              
stolk@workpc:/usr/src/kiwmi/build$ meson compile
[12/42] Compiling C object kiwmi/kiwmi.p/desktop_layer_shell.c.o
FAILED: kiwmi/kiwmi.p/desktop_layer_shell.c.o 
cc -Ikiwmi/kiwmi.p -Ikiwmi -I../kiwmi -I../include -Iprotocols -I/usr/include/lua5.4 -I/usr/local/include/pixman-1 -I/usr/local/include -I/usr/local/include/libdrm -I/usr/include/valgrind -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c11 -O0 -g -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L '-DKIWMI_VERSION="1781497 (" __DATE__ ", branch '"'"'master'"'"')"' '-DUNUSED(x)=UNUSED_ ## x __attribute__((__unused__))' -MD -MQ kiwmi/kiwmi.p/desktop_layer_shell.c.o -MF kiwmi/kiwmi.p/desktop_layer_shell.c.o.d -o kiwmi/kiwmi.p/desktop_layer_shell.c.o -c ../kiwmi/desktop/layer_shell.c
In file included from ../kiwmi/desktop/layer_shell.c:8:
../include/desktop/layer_shell.h:14:10: fatal error: wlr/types/wlr_surface.h: No such file or directory
   14 | #include <wlr/types/wlr_surface.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Implement rendering from lua with the new scene-graph API

I think the main question here is the shape of the API we want to expose to lua.

As a conversation starter, here is my PoC implementation that mostly just maps the scene-graph API one-to-one to lua: kuruczgy@e83bc5b

The API exposed to lua looks like this:

---@meta

---Represents a view (a window in kiwmi terms).
---@class kiwmi_view
local view = {}

---@return scene_tree The scene tree for this view.
function view:scene_tree() end

---A scene node.
---@class scene_node
local node = {}

---Set the position of this node.
---@param x number
---@param y number
function node:set_position(x, y) end

---Only valid if created through tree:add_rect.
---@param width number
---@param height number
function node:set_size(width, height) end

---Only valid if created through tree:add_rect.
---@param color string
function node:set_color(color) end

---@class scene_tree
local tree = {}

---Add a new rectangle node to this tree.
---@param color string The color in the format #rrggbb.
---@return scene_node node The created node.
function tree:add_rect(width, height, color) end

---Add a new text node to this tree.
---@return scene_node node The created node.
function tree:add_text(text, color) end

This API should already be quite powerful. Most decorations we want to draw (window borders, title bars, highlighting the active view) can be done with just rectangles, and window titles (with any other kind of information we want) can be added with text nodes.

Expose wlr_scene to the config

Once #50 is merged, the next logical step is letting the config manipulate the scene: if for nothing else, at least for decorations. These are some possibilities how to do it; however, none seems ideal. Which is the least bad? Any better suggestions?

permission-wise:

  • only allow adding and manipulating view decoration
    • pros: simple for both kiwmi and config, one cannot get lost there
    • cons: very limited
  • let the config manipulate some certain nodes in some certain ways
    • pros: lets us make assumptions; fairly powerful
    • cons: would need to create a permission system or something of that kind
  • don’t restrict the config
    • pros: powerful; quite simple luak_*
    • cons: i’m not quite sure how kiwmi and wlroots would cope with it

api-wise:

  • copy the wlroots api: type-specific functions on the specific type; generic functions on specific_type:node()
    • pros: little code duplication
    • cons: unintuitive for a high-level language like lua
  • copy all generic functions for every specific node type
    • pros: feels normal on the lua side; simple to understand
    • cons: code and docs duplication, gets out of hand when making changes
  • smash the type system and have specific types calling generic functions (which then check that they’re called on one of the types) [otoh, isn’t this sort of how OOP works? 😆]
    • pros: feels normal on the lua side; less code duplication
    • cons: seems quite complicated to get it right

Also, should kiwmi_view be treated like a scene node (which could be terrible kiwmi-side with some implementations), or should it have :scene_tree() (which could feel unintuitive)?

Tools for an ‘inspect mode’

This is just an idea, but I’d like to know what you think about it and if you would support it. The goal would be to allow users to create something like the element picker in web browsers’ devtools, but I suppose it could be used in other ways.

I also have no idea when I would be able to do it, so it’s possible that this ticket would be hanging here forever.


I think it would mean something like this:

  • a surface_at function, or maybe surfaces_at (giving all, not just the topmost one)
  • a kiwmi_surface or kiwmi_surface_info type to transfer the properties to lua
    • since there are many surface extensions, it wouldn’t be so simple
  • a way to render before/after each surface, not just each view
  • changing the cursor shape?

I haven’t gone much further than to this rough draft.

Damage tracking issues

I don’t expect damage tracking to be perfect yet, just leaving here some early feedback.

  • screenshots, only applicable very soon after starting kiwmi (although I’m writing about two outputs, it’s reproducible with one as well)
    • they have one or both outputs filled with black
    • after taking a screenshot and until new damage, some outputs flicker between black and their ‘normal’ buffer
  • layer shell updates seem to be ignored
  • popups (and subsurfaces?) are mostly ignored (I have a PR (edit: #39) in the works that targets them, so if it doesn’t take me too long I’ll try to add the damage tracking bits to it)

from later comments:

  • nothing is drawn after switching to a tty and back

testcases:

  • screenshots
    1. start kiwmi anew
    2. take a screenshot (I have Print bound to something like grim ~/grim.png, in case it matters)
    3. all outputs start flickering (because they haven’t been updated many times yet?)
    4. spawn something (in case it’s layer-shell, only its output will be affected, as you can expect)
    5. all outputs are okay
    6. check the screenshot – it’s black
  • layer shell
    1. open an app that reacts to mouse movement
    2. spawn wofi
    3. type something
    4. the list is still as initially
    5. move the mouse so that the app updates
    6. wofi finally updates
  • popups/subsurfaces
    1. open an app that has a menu
    2. open the menu with the keyboard
    3. the menu either doesn’t show, flickers, or shows 🤷
    4. navigate the menu with the up/down arrow keys
    5. it doesn’t update
    6. move the mouse over the menu
    7. it updates

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.