Разве приложение Gtk не может показать SDL_RenderDrawRect с прямоугольником? - PullRequest
0 голосов
/ 07 октября 2019

Я написал пример на C # из ссылка

sdl_renderer показывает цвет фона = Это нормально. Я действительно не понимаю, почему это не работает, если SDL2-CS встраивается в GtkSharp3 и не видит никаких фигур, текстов или изображений. Я не могу вспомнить, что MonoGame также имеет SDL2, но показывает только картинку. Я действительно хочу знать, как мне решить, если я использую SDL2-CS или мой собственный SDL2Sharp (это работает в процессе)

Я попробовал любые возможности делегата или дескриптора GLib.Idle.Add() Если я использую GLib.Idle.Add(myIdle, 0);, чем этоне будет показывать Gtk Window. Почему это не работает так, как будто это будет невидимо.

using System;
using System.Runtime.InteropServices;
using static SDL2.SDL;

namespace Gtk3_SDL2
{
    class MainClass
    {
        private static IntPtr sdl_window;
        private static IntPtr sdl_renderer;

        private static Gtk.Window gtk_window;
        private static Gtk.DrawingArea gtk_da;

        private static IntPtr gdk_window;
        private static IntPtr window_id;

        // Pick 2 important public methods of libgtk-3.so and libgdk-3.so
        [DllImport("libgtk-3.so.0")]
        private extern static IntPtr gtk_widget_get_window(IntPtr widget);
        [DllImport("libgdk-3.so.0")] // Window ( from X11/XLib or #XLibSHarp ) gdk_x11_window_get_xid(GDWindow window);
        internal extern static IntPtr gdk_x11_window_get_xid(IntPtr window);

        // #define GDK_WINDOW_XID() Make public in C#
        private static IntPtr GDK_WINDOW_XID(IntPtr window)
        {
            return gdk_x11_window_get_xid(window);
        }

        static bool idle()
        {
            if (sdl_window.ToInt32() == 0)
            {
                sdl_window = SDL_CreateWindowFrom(window_id);
                if(sdl_window == IntPtr.Zero)
                {
                    Environment.Exit(0);
                }

                sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RendererFlags.SDL_RENDERER_ACCELERATED);
                if(sdl_renderer == IntPtr.Zero)
                {
                    Environment.Exit(0);
                }
            }
            else
            {
                SDL_SetRenderDrawColor(sdl_renderer, 255, 80, 0, 255);
                SDL_RenderClear(sdl_renderer);

                SDL_Rect rect = new SDL_Rect
                {
                    x = 100, y = 100, w = 200, h = 200
                };

                IntPtr rectPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rect));
                Marshal.StructureToPtr(rect, rectPtr, false);
                SDL_RenderDrawRect(sdl_renderer, rectPtr);
                SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 255, 255);

                SDL_RenderPresent(sdl_renderer);
            }

            return true;
        }

        static int Main(string[] args)
        {
            // Create Gtk+3

            Gtk.Application.Init(string.Empty, ref args);
            gtk_window = new Gtk.Window(Gtk.WindowType.Toplevel)
            {
                Title = "SDL2 in GtkSharp 3.x"
            };
            gtk_window.SetDefaultSize(400, 300);
            gtk_da = new Gtk.DrawingArea
            {
                Margin = 10,
                AppPaintable = true
            };
            gtk_da.Events = Gdk.EventMask.AllEventsMask;
            gtk_window.Add(gtk_da);
            gtk_window.DeleteEvent += delegate
            {            
                Gtk.Application.Quit();
            }; 
            gtk_window.ShowAll();

            // Embedding SDL2 in Gtk+3
            gdk_window = gtk_widget_get_window(gtk_da.Handle);
            window_id = GDK_WINDOW_XID(gdk_window);

            /// Create SDL2
            SDL_Init(SDL_INIT_EVERYTHING);
            GLib.Idle.Add(idle);

            Gtk.Application.Run();
            SDL_Quit();
            return 0;
        }
    }
}

Я ожидаю, что вывод sdl_renderer будет ничем, никаких фигур и текстов в sdl_renderer, пока Gtk Window показывает и внедряет окно sdl (SDL_CreateWindowFrom() в Gtk.DrawingArea или Gtk.GLArea

Обновление :

Я пытался вернуться вперед и назад, как Adobe Fireworks CS5 с уровнями, такими как фон, означает конец до настоящего средства отображения переднего плана, средства после очистки после рендеринга.

                // Clean up renderer!
                SDL_RenderClear(sdl_renderer);

                // Draw Fillrect or shape Now It works . Yay. I am really stupid because
                // I don't know before like back or front.
                SDL_SetRenderDrawColor(sdl_renderer, 24, 24, 24, 255);
                SDL_Rect rect = new SDL_Rect
                {
                    x = 100, y = 100, w = 100, h = 100
                };
                IntPtr rectPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rect));
                Marshal.StructureToPtr(rect, rectPtr, false);
                SDL_RenderFillRect(sdl_renderer, rectPtr);

                // Background color
                SDL_SetRenderDrawColor(sdl_renderer, 255, 80, 0, 255);

                // Present renderer!
                SDL_RenderPresent(sdl_renderer);

Показать результат

Он отлично работает как шарм. А как он работает с функциями GL или Vulkan? Вы уверены, что?

// Плохие новости: GtkSharp 2 и 3 аварийно завершают работу, когда вы добавляете кнопку в свое приложение. Это очень печально. Мне нужно переписать завершенный XLibSharp (это значит лучше, чем библиотека Steffen Bloetz X11, потому что нас не волнует TInt, TUintили TPixel и т. д.). И я покажу, что мой XLibSharp закончен, чем SDL2 Window, встраивается в окно XLib как SDL_CreateWindowFrom (draw_area), это draw_area позади Window -> window = windo X11w - -> draw_area является родителем дочернего элемента окна X11. Я попробую. Спасибо!

...