diff --git a/12to11.c b/12to11.c index 08e840e..5e4839a 100644 --- a/12to11.c +++ b/12to11.c @@ -245,6 +245,7 @@ XLMain (int argc, char **argv) XLInitKeyboardShortcutsInhibit (); XLInitIdleInhibit (); XLInitPointerGestures (); + XLInitTest (); /* This has to come after the rest of the initialization. */ DetermineServerTime (); diff --git a/12to11.conf b/12to11.conf index 220e48f..588ead1 100644 --- a/12to11.conf +++ b/12to11.conf @@ -17,6 +17,13 @@ WAYLAND_SCANNER = wayland-scanner XSHMFENCELIB = -lxshmfence +/* The following libraries are used for tests. */ + + WAYLAND_CLIENT = -lwayland-client + PNG = -lpng + +XCOMM #define BuildTests + /* Uncomment the following code if building with EGL support. */ XCOMM #define HaveEglSupport diff --git a/Imakefile b/Imakefile index 798ebe6..b99b519 100644 --- a/Imakefile +++ b/Imakefile @@ -4,47 +4,30 @@ #error "Posix threads are required" #endif -SYS_LIBRARIES = MathLibrary ThreadsLibraries -DEPLIBS = $(DEPXLIB) $(DEPEXTENSIONLIB) $(DEPXRANDRLIB) $(DEPXRENDERLIB) \ - $(DEPXFIXESLIB) $(DEPXILIB) $(DEPXKBFILELIB) + SYS_LIBRARIES = MathLibrary ThreadsLibraries + DEPLIBS = $(DEPXLIB) $(DEPEXTENSIONLIB) $(DEPXRANDRLIB) $(DEPXRENDERLIB) $(DEPXFIXESLIB) $(DEPXILIB) $(DEPXKBFILELIB) + LOCAL_LIBRARIES = $(XLIB) $(EXTENSIONLIB) $(XCBLIB) $(XCB) $(XCB_SHM) $(XRANDRLIB) $(PIXMAN) $(XRENDERLIB) $(XILIB) $(XKBFILELIB) $(XFIXESLIB) $(XCB_DRI3) $(XCB_SHAPE) $(WAYLAND_SERVER) $(XCB_RANDR) $(DRM) $(XPRESENTLIB) $(XSHMFENCELIB) + INCLUDES := $(DRMINCLUDES) $(PIXMANINCLUDES) -LOCAL_LIBRARIES = $(XLIB) $(EXTENSIONLIB) $(XCBLIB) $(XCB) $(XCB_SHM) \ - $(XRANDRLIB) $(PIXMAN) $(XRENDERLIB) $(XILIB) $(XKBFILELIB) $(XFIXESLIB) \ - $(XCB_DRI3) $(XCB_SHAPE) $(WAYLAND_SERVER) $(XCB_RANDR) $(DRM) \ - $(XPRESENTLIB) $(XSHMFENCELIB) +#ifdef BuildTests +# define IHaveSubdirs +# define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' + SUBDIRS = tests -INCLUDES := $(DRMINCLUDES) $(PIXMANINCLUDES) +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +#endif -SRCS = 12to11.c run.c alloc.c fns.c output.c compositor.c \ - surface.c region.c shm.c atoms.c subcompositor.c positioner.c \ - xdg_wm.c xdg_surface.c xdg_toplevel.c frame_clock.c xerror.c \ - ewmh.c timer.c subsurface.c seat.c data_device.c xdg_popup.c \ - dmabuf.c buffer.c select.c xdata.c xsettings.c dnd.c \ - icon_surface.c primary_selection.c renderer.c \ - picture_renderer.c explicit_synchronization.c transform.c \ - wp_viewporter.c decoration.c text_input.c \ - single_pixel_buffer.c drm_lease.c pointer_constraints.c \ - time.c relative_pointer.c keyboard_shortcuts_inhibit.c \ - idle_inhibit.c process.c fence_ring.c pointer_gestures.c - -OBJS = 12to11.o run.o alloc.o fns.o output.o compositor.o \ - surface.o region.o shm.o atoms.o subcompositor.o positioner.o \ - xdg_wm.o xdg_surface.o xdg_toplevel.o frame_clock.o xerror.o \ - ewmh.o timer.o subsurface.o seat.o data_device.o xdg_popup.o \ - dmabuf.o buffer.o select.o xdata.o xsettings.o dnd.o \ - icon_surface.o primary_selection.o renderer.o \ - picture_renderer.o explicit_synchronization.o transform.o \ - wp_viewporter.o decoration.o text_input.o \ - single_pixel_buffer.o drm_lease.o pointer_constraints.o \ - time.o relative_pointer.o keyboard_shortcuts_inhibit.o \ - idle_inhibit.o process.o fence_ring.o pointer_gestures.o - -GENHEADERS = transfer_atoms.h drm_modifiers.h + SRCS = 12to11.c run.c alloc.c fns.c output.c compositor.c surface.c region.c shm.c atoms.c subcompositor.c positioner.c xdg_wm.c xdg_surface.c xdg_toplevel.c frame_clock.c xerror.c ewmh.c timer.c subsurface.c seat.c data_device.c xdg_popup.c dmabuf.c buffer.c select.c xdata.c xsettings.c dnd.c icon_surface.c primary_selection.c renderer.c picture_renderer.c explicit_synchronization.c transform.c wp_viewporter.c decoration.c text_input.c single_pixel_buffer.c drm_lease.c pointer_constraints.c time.c relative_pointer.c keyboard_shortcuts_inhibit.c idle_inhibit.c process.c fence_ring.c pointer_gestures.c test.c buffer_release.c + OBJS = 12to11.o run.o alloc.o fns.o output.o compositor.o surface.o region.o shm.o atoms.o subcompositor.o positioner.o xdg_wm.o xdg_surface.o xdg_toplevel.o frame_clock.o xerror.o ewmh.o timer.o subsurface.o seat.o data_device.o xdg_popup.o dmabuf.o buffer.o select.o xdata.o xsettings.o dnd.o icon_surface.o primary_selection.o renderer.o picture_renderer.o explicit_synchronization.o transform.o wp_viewporter.o decoration.o text_input.o single_pixel_buffer.o drm_lease.o pointer_constraints.o time.o relative_pointer.o keyboard_shortcuts_inhibit.o idle_inhibit.o process.o fence_ring.o pointer_gestures.o test.o buffer_release.o + GENHEADERS = transfer_atoms.h drm_modifiers.h + HEADER = $(GENHEADERS) compositor.h + EXTRA_DEFINES := -D_GNU_SOURCE -U_BSD_SOURCE -U_SVID_SOURCE #ifdef HaveEglSupport - EGL_SRCS = egl.c - EGL_OBJS = egl.o + EGL_SRCS = egl.c + EGL_OBJS = egl.o LOCAL_LIBRARIES ::= $(LOCAL_LIBRARIES) $(EGL) $(GLES) SRCS ::= $(SRCS) $(EGL_SRCS) OBJS ::= $(OBJS) $(EGL_OBJS) @@ -62,27 +45,9 @@ cleandir:: #endif -OPTIMIZE = -O0 -ANALYZE = -fanalyzer - -CDEBUGFLAGS := -fno-common -Wall -Warith-conversion -Wdate-time \ - -Wdisabled-optimization -Wdouble-promotion -Wduplicated-cond \ - -Wextra -Wformat-signedness -Winit-self -Winvalid-pch \ - -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs \ - -Wmissing-prototypes -Wnested-externs -Wnull-dereference \ - -Wold-style-definition -Wopenmp-simd -Wpacked -Wpointer-arith \ - -Wstrict-prototypes -Wsuggest-attribute=format \ - -Wsuggest-attribute=noreturn -Wsuggest-final-methods \ - -Wsuggest-final-types -Wuninitialized -Wunknown-pragmas \ - -Wunused-macros -Wvariadic-macros \ - -Wvector-operation-performance -Wwrite-strings \ - -Warray-bounds=2 -Wattribute-alias=2 -Wformat=2 \ - -Wformat-truncation=2 -Wimplicit-fallthrough=5 \ - -Wshift-overflow=2 -Wuse-after-free=3 -Wvla-larger-than=4031 \ - -Wredundant-decls -Wno-missing-field-initializers \ - -Wno-override-init -Wno-sign-compare -Wno-type-limits \ - -Wno-unused-parameter -Wno-format-nonliteral -g3 $(OPTIMIZE) \ - $(ANALYZE) + OPTIMIZE = -O0 + ANALYZE = -fanalyzer + CDEBUGFLAGS := -fno-common -Wall -Warith-conversion -Wdate-time -Wdisabled-optimization -Wdouble-promotion -Wduplicated-cond -Wextra -Wformat-signedness -Winit-self -Winvalid-pch -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wmissing-prototypes -Wnested-externs -Wnull-dereference -Wold-style-definition -Wopenmp-simd -Wpacked -Wpointer-arith -Wstrict-prototypes -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wuninitialized -Wunknown-pragmas -Wunused-macros -Wvariadic-macros -Wvector-operation-performance -Wwrite-strings -Warray-bounds=2 -Wattribute-alias=2 -Wformat=2 -Wformat-truncation=2 -Wimplicit-fallthrough=5 -Wshift-overflow=2 -Wuse-after-free=3 -Wvla-larger-than=4031 -Wredundant-decls -Wno-missing-field-initializers -Wno-override-init -Wno-sign-compare -Wno-type-limits -Wno-unused-parameter -Wno-format-nonliteral -g3 $(OPTIMIZE) $(ANALYZE) short_types.txt: media_types.txt XCOMM Remove all data types starting with application/vnd. @@ -129,6 +94,7 @@ ScannerTarget(relative-pointer-unstable-v1) ScannerTarget(keyboard-shortcuts-inhibit-unstable-v1) ScannerTarget(idle-inhibit-unstable-v1) ScannerTarget(pointer-gestures-unstable-v1) +ScannerTarget(12to11-test) /* Make OBJS depend on scanner headers, and depend on both them and SRCS. */ $(OBJS): $(GENHEADERS) @@ -140,18 +106,12 @@ depend:: $(GENHEADERS) $(SRCS) cleandir:: $(RM) $(GENHEADERS) $(GENSRCS) short_types.txt 12to11.tar.gz -/* Undefine _BSD_SOURCE and _SVID_SOURCE, since both are deprecated - and are also superseeded by _GNU_SOURCE. */ - -EXTRA_DEFINES := -D_GNU_SOURCE -U_BSD_SOURCE -U_SVID_SOURCE - ComplexProgramTarget(12to11) .PHONY: dist dist: 12to11.tar.gz -DIST_FILES = Imakefile $(SRCS) media_types.txt shaders.txt *.awk *.xml \ - 12to11.man README libraries.def *.h +DIST_FILES = Imakefile $(SRCS) media_types.txt shaders.txt *.awk *.xml 12to11.man README libraries.def *.h /* Include files generated by wayland-scanner, so the target does not need to have it installed. */ diff --git a/compositor.c b/compositor.c index 6765be9..18f0a15 100644 --- a/compositor.c +++ b/compositor.c @@ -19,9 +19,6 @@ along with 12to11. If not, see . */ #include "compositor.h" -/* List of all resources for our compositor global. */ -static XLList *all_compositors; - /* The compositor global. */ static struct wl_global *global_compositor; @@ -41,12 +38,6 @@ CreateRegion (struct wl_client *client, XLCreateRegion (client, resource, id); } -static void -HandleResourceDestroy (struct wl_resource *resource) -{ - all_compositors = XLListRemove (all_compositors, resource); -} - static const struct wl_compositor_interface wl_compositor_impl = { .create_surface = CreateSurface, @@ -69,8 +60,7 @@ HandleBind (struct wl_client *client, void *data, } wl_resource_set_implementation (resource, &wl_compositor_impl, - NULL, HandleResourceDestroy); - all_compositors = XLListPrepend (all_compositors, resource); + NULL, NULL); } void diff --git a/compositor.h b/compositor.h index 903e7ba..9f25cb8 100644 --- a/compositor.h +++ b/compositor.h @@ -875,6 +875,7 @@ enum _RoleType XdgType, CursorType, DndIconType, + TestSurfaceType, }; #define RotatesDimensions(transform) \ @@ -1795,6 +1796,22 @@ extern XSyncFence FenceToXFence (Fence *); extern void XLInitPointerGestures (void); +/* Defined in test.c. */ + +extern void XLInitTest (void); +extern Bool XLHandleOneXEventForTest (XEvent *); + +/* Defined in buffer_release.c. */ + +typedef void (*AllReleasedCallback) (void *); +typedef struct _BufferReleaseHelper BufferReleaseHelper; + +extern BufferReleaseHelper *MakeBufferReleaseHelper (AllReleasedCallback, + void *); +extern void FreeBufferReleaseHelper (BufferReleaseHelper *); +extern void ReleaseBufferWithHelper (BufferReleaseHelper *, ExtBuffer *, + RenderTarget); + /* Utility functions that don't belong in a specific file. */ #define ArrayElements(arr) (sizeof (arr) / sizeof (arr)[0]) diff --git a/run.c b/run.c index d3e60fd..ca9bf03 100644 --- a/run.c +++ b/run.c @@ -154,11 +154,6 @@ HandleOneXEvent (XEvent *event) if (XLHandleOneXEventForIconSurfaces (event)) return; -#if 0 - if (XLHandleOneXEventForDmabuf (event)) - return; -#endif - if (XLHandleOneXEventForXData (event)) return; @@ -170,6 +165,9 @@ HandleOneXEvent (XEvent *event) if (HandleOneXEventForTime (event)) return; + + if (XLHandleOneXEventForTest (event)) + return; } static void diff --git a/xdg_surface.c b/xdg_surface.c index cd5c1af..0389233 100644 --- a/xdg_surface.c +++ b/xdg_surface.c @@ -223,6 +223,10 @@ FreeRecords (ReleaseLaterRecord *records) last = tem; tem = tem->next; + /* Cancel the idle callback if it already exists. */ + if (last->key) + RenderCancelIdleCallback (last->key); + /* Release the buffer now. */ XLReleaseBuffer (last->buffer); @@ -360,7 +364,6 @@ BufferIdleCallback (RenderBuffer buffer, void *data) record = data; role = record->role; - XLReleaseBuffer (record->buffer); DeleteRecord (record); @@ -1574,8 +1577,7 @@ XLGetXdgSurface (struct wl_client *client, struct wl_resource *resource, attrs.border_pixel = border_pixel; attrs.event_mask = DefaultEventMask; attrs.cursor = InitDefaultCursor (); - flags = (CWColormap | CWBorderPixel | CWEventMask - | CWCursor); + flags = CWColormap | CWBorderPixel | CWEventMask | CWCursor; /* Sentinel node. */ role->release_records->next = role->release_records;