如何将SDL2纹理渲染到GTK3+窗口中?

2023-12-15

我正在创建一个音乐播放器并尝试使用 GTK3+ 来创建用户界面。我正在使用 SDL_CreateWindowFrom 函数让 SDL2 使用 GTK3+ 窗口而不是创建一个窗口,但无法弄清楚将 SDL2 纹理渲染到 GTK3+ 窗口中需要遵循的步骤。

获取 GTK3 窗口 ID 的代码

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "---");
gtk_widget_show(window);
gdkWin = gtk_widget_get_window(GTK_WIDGET(window));
data->playContext->winID = GDK_WINDOW_XID(gdkWin);
gtk_main(); 

代码设置SDL2窗口

playContext->display->window = SDL_CreateWindowFrom((const void *)playContext->winID);
playContext->display->renderer = SDL_CreateRenderer(playContext->display->window, -1, playContext->display->render_flags);

代码渲染SDL2纹理

SDL_RenderClear(playContext->display->renderer);
SDL_RenderCopy(playContext->display->renderer, playContext->textureQ.head->bmp, NULL, NULL);
SDL_RenderPresent(playContext->display->renderer);

由于即使在最重要的位(例如渲染器创建标志)上,您放置的示例实际上也是不完整的,并且您没有指定哪个部分给您带来了问题,所以这是我的示例(在我的系统上,它适用于 gtk2 和 gtk3 -但我不能保证它完全没问题):

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <SDL.h>
#include <stdbool.h>

static SDL_Window *sdl_window;
static SDL_Renderer *sdl_renderer;
static SDL_Surface *sdl_surface;
static GtkWindow *gtk_window;
static GtkWidget *gtk_da;
static void *gdk_window;
static void *window_id;

static gboolean idle(void *ud) {
    (void)ud;
    if(!sdl_window) {
        printf("creating SDL window for window id %p\n", window_id);
        sdl_window = SDL_CreateWindowFrom(window_id);
        printf("sdl_window=%p\n", sdl_window);
        if(!sdl_window) {
            printf("%s\n", SDL_GetError());
        }
        sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
        printf("sdl_renderer=%p\n", sdl_renderer);
        if(!sdl_renderer) {
            printf("%s\n", SDL_GetError());
        }
    } else {
        SDL_SetRenderDrawColor(sdl_renderer, 255, 0, 0, 255);
        SDL_RenderClear(sdl_renderer);
        SDL_RenderPresent(sdl_renderer);
    }
    return true;
}

int main(int argc, char **argv) {
    gtk_init(&argc, &argv);
    gtk_window = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(gtk_window, "test");

    gtk_da = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(gtk_window), gtk_da);
    gtk_widget_show_all(GTK_WIDGET(gtk_window));

    gdk_window = gtk_widget_get_window(GTK_WIDGET(gtk_da));
    window_id = (void*)(intptr_t)GDK_WINDOW_XID(gdk_window);

    SDL_Init(SDL_INIT_VIDEO);

    g_idle_add(&idle, 0);
    gtk_main();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将SDL2纹理渲染到GTK3+窗口中? 的相关文章

  • 如何真正使 GTK+ 3 GtkLayout 透明/绘制主题背景?

    如果我创建一个内部没有任何内容的普通 GtkWindow 或一个内部有 GtkDrawingArea 的 GtkWindow 或 GtkScrolledWindow 内部的 GtkWindow 我会得到一个带有主题背景的窗口 如下所示这张照
  • 如何在 Haskell 的 GI-Gtk 中将 Widget 转换为 Label?

    我有这个示例代码 其中有一个包含 ListBoxRows 的 ListBox 而 ListBoxRows 又包含一个 Label 当我单击 ListBox 时 我得到一个 ListBoxRow 到目前为止 一切都很好 当我想与 ListBo
  • 阅读动画 GIF SDL 2

    我希望能够加载 GIF 动画 而不是在我正在开发的游戏中使用精灵表和网格 我相信这会让我做的事情比现在容易得多 我在 Google 上查了一下 但我发现的只是一个使用 Win32 调用的库 因此仅限于 Windows 我相信 如果我弄清楚如
  • 如何使用Gtk.events_pending?

    我有这个基本的 测试 应用程序 我想在其中显示一个旋转器 而它正在长时间运行发射进程 带有数据库请求的函数 让用户知道它不是在调试而是正在启动 我在其他帖子中读到可以这样做Gtk events pending 功能 但我不知道如何 在哪里使
  • 获取 Gtk.Grid 中的列数?

    下面的示例代码创建了一个 2 行 x 10 列的网格 Grid 的 len 似乎打印其中的小部件数量 而不是行数或列数 如何获得列数 import gi gi require version Gtk 3 0 from gi reposito
  • glewInit() 因“缺少 GL 版本”、SDL2 OpenGL 上下文、cygwin 编译器而失败

    下面的程序创建一个窗口 该窗口除了按 esc 关闭外不执行任何操作 当我用cygwin编译它时 没有错误 我使用的GLEW来自CYGWIN 端口 http cygwinports org SDL2 是版本 2 0 3 来自他们的websit
  • SDL2硬件渲染的奇怪行为

    我想制作我的第一个游戏 没什么特别的 只是按下 WASD 键时蓝色矩形会移动 问题是 当我运行游戏时 矩形存在错误 见下图 错误仅在水平移动时出现 而不是垂直移动时出现 有趣的是 当我换行时 renderer SDL CreateRende
  • Gtk ComboBox 宽度基于内容

    我正在动态地将选项填充到具有条目的 GTK3 ComboBox 有些选项可能会很长 如果我的模型中有宽的项目 我希望能够使组合框更宽 有没有办法做到这一点 如果组合框可以自动扩展但可以设置上限 那就太好了 None
  • “未定义引用‘FT_Load_Glyph’”和其他使用 CMAKE 的 SDL2_ttf 函数

    在 Windows 10 上的 Clion 中使用此 CMAKE 文件 使用 MinGW 5 0 cmake minimum required VERSION 3 3 project ClionProjects configure the
  • SDL2 主游戏循环

    我的问题是在阅读lazyfoo net上的SDL2教程时出现的 代码是从这一页 http lazyfoo net tutorials SDL 07 texture loading and rendering index php int ma
  • 如何在SDL2中渲染文本?

    我正在使用一个SDL Window and SDL Renderer 是否可以使用SDL TTF with SDL Render SDL Window 如果是这样 怎么办 是的 这是可能的 鉴于您有一个渲染器和一个窗口 加上您实际上没有任何
  • 如何用SDL 2.0画正方形?

    我想做一些简单的事情 比如使用 C 和 SDL 在屏幕上画一个正方形 我复制的例子不起作用 Get window surface SDL Surface screenSurface SDL GetWindowSurface window F
  • 如何读出 gtk3 对象的“空地 ID”

    在 Glade 中 可以为对象设置唯一的 ID 在代码中 我们可以通过搜索它的 glade ID 来获取指向该对象的指针gtk builder get object https developer gnome org gtk3 stable
  • SDL2 - 垂直同步不起作用

    我在程序中使用垂直同步 在我最小化窗口之前它工作正常 我在创建渲染器时这样做了 renderer SDL CreateRenderer window 1 SDL RENDERER ACCELERATED SDL RENDERER PRESE
  • 更改 GdkPixbuf (GTK3) 中像素的颜色

    我在用着Gtk StatusIcon 并且想要改变某些像素的颜色 我有一段工作代码 它加载一个带有我想要设置的颜色的 1x1 像素 PNG 文件 然后将其复制到图标 Pixbuf 虽然这种方法有效 但它有一个明显的缺点 即必须为每种颜色创建
  • 为什么仅当我在 SDL2 中设置非零 Alpha 大小时才获得 sRGB 帧缓冲区?

    我正在尝试通过以下方式以伽玛正确的方式渲染典型的 OpenGL 颜色三角形本指南 https learnopengl com Advanced Lighting Gamma Correction并查阅 SDL2 文档 了解如何在默认帧缓冲区
  • GTK+ CSS 一键式

    如何在 GTK 中为一个按钮设置颜色 GtkButton button8 border radius 20 border width 1 1 1 1 font Sans 16 color black background image gtk
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 尝试渲染 SDL_Texture 时 C++ SDL2 错误:无效纹理

    我正在尝试制作一个简单的游戏 当我尝试渲染我的SDL Texture 我收到一个莫名其妙的错误 我已经将一切设置正确 我能够成功地清除屏幕SDL RenderClear 并且我的纹理不为空 因此它应该已正确创建 但是当我尝试打电话给rend
  • 如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰

    我正在尝试将我的应用程序从 Linux 移植到 Windows 但我遇到主题设置问题 在 Linux 中 这是开箱即用的 只需编译它 应用程序就会使用良好的主题并且看起来很原生 我已经在 MSYS2 中安装了 gtkmm3 和 gtk3 并

随机推荐

  • Spring Boot 中的 Hystrix 仪表板问题

    我是 Hystrix 仪表板的新手 我已经用 Hystrix 编写了示例应用程序 我想查看 Hystrix 图表 命令指标流 但我收到以下错误 Circuit Unable to connect to Command Metric Stre
  • PDF 中的 JavaScript?

    我制作了一个可编辑的 PDF 供学生索取成绩单 现在 我想限制输入 例如 我只想要他们的 ID 号为数字 并且我只想要姓名字段中的字母 无特殊字符 等 此外 还有一个名为 最后就读年份 的输入 其中输入用户的最后一个学年上大学了 如果输入的
  • 从元素最小值的元组列表中提取元组的优雅方法

    我有一个元组列表 我希望从中得到索引处最小值的元组1 例如 如果我的列表如下 a a 2 ee 3 mm 4 x 1 我希望返回的元组是 x 1 目前我正在使用sorted函数得到这样的结果 min sorted a key lambda
  • 查找图中的连通分量[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如果我有一个无向图 作为顶点列表实现 如何找到它的连通分量 如何使用快速联盟 使用深度优先搜索 DFS 将所有单独的连接组件标记为已访问 dfs node u for each
  • 删除字符串中连续重复的单词

    我正在尝试编写一个函数来删除字符串中连续的重复单词 保留正则表达式找到的任何匹配项至关重要 换句话说 一只非常非常非常肮脏的狗 应该成为 一只非常脏的狗 我有一个似乎运行良好的正则表达式 基于这篇文章 b S b s 1 但是我不确定如何使
  • 如何从javascript中的值获取对象值的路径

    Example var someObject part1 name Part 1 txt example part2 name Part 2 size 15 qty 60 part3 name Part 3A size 10 qty 20
  • 使用 find 和 iconv 更改文件名

    我尝试使用以下脚本更改文件名 find dir type f exec mv echo iconv f UTF8 t ASCII TRANSLIT 为什么不起作用 我的意思是 当我有一个带有 这样的字符的文件时 它应该将其转换为 a ech
  • 如何在ListView中处理多个倒计时器?

    我有一个列表视图 带有自定义列表适配器 我需要在每一行上显示倒计时 例如 如果我的列表包含 4 个项目 则我将有 4 行 此时 我需要处理 4 个不同的倒计时 每行一个 因为时间不同 到目前为止 我按以下方式处理它 在自定义列表适配器中 在
  • 使用Python保留关键字作为变量名[重复]

    这个问题在这里已经有答案了 我正在尝试使用网络服务发送短信 这是网络服务文档的建议 response client service SendSMS fromNum 09999999 toNum 0666666666666 messageCo
  • Websockets 使用 asio c++ 库作为服务器,使用 javascript 作为客户端

    我使用 C 编写了服务器代码asio图书馆 我知道服务器代码可以工作 因为我使用同样用 C 编写并使用的客户端对其进行了测试asio 问题是 使用以下客户端 javascript 代码 连接不会被接受 我立即看到消息框Connection
  • TensorFlow:评估恢复图

    我正在尝试从检查点恢复图表 检查点是由创建的tf Supervisor 两者都有meta文件和检查点 我试图实现的是从单独的应用程序加载此图以运行某些操作 即重用现有模型 我按如下方式执行此操作 如此处所述 https www tensor
  • 在 ggplot2 中的 aes() 函数中使用颜色

    我是新来的ggplot2 我想了解如何使用ggplot 我正在读 Wickham 的书 但仍在尝试如何使用aes 功能 在相关的线程中 我们讨论了我们应该尽量避免在内部使用变量aes 即 不要将常量放入aes 仅将映射映射到实际数据列 我的
  • 使用 GCM Token 在 FCM 中推送消息

    目前我们有使用旧 GCM 实现的设备 有谁知道在使用 firebase 云消息 API 发送推送消息时是否可以使用旧的现有 GCM 令牌 或者应用程序是否需要新的 FCM sdk 实现 有谁知道在使用 firebase 云消息 API 发送
  • 在同一个应用程序中切换 Google Maps SDK 和 Mapkit 会导致崩溃

    我创建了一个非常简单的应用程序 它使用 MapKit 和 GoogleMaps 框架 并尝试在两个地图之间切换 我正在使用 ARC ios 6 1 和 Google Maps SDK for iOS 版本 1 1 1 2311 几次切换后
  • Schema.org 的丰富片段通过 JSON+LD 实现,但未被爬虫抓取

    我们已经为产品类型实现了丰富的摘要 也为组织类型实现了丰富的摘要 两种类型的属性都传递到 JSON LD 类型脚本包装器中 请在此处查看标记和验证 结构化数据测试工具 Google 选择组织类型 这是可以验证的 因为我们实际上更改了组织卡上
  • 处理加速度计数据

    我想知道是否有一些库 算法 技术可以帮助从加速度计数据 从任何智能手机中提取 中提取用户上下文 步行 站立 例如 我会在一段时间内每 5 秒收集一次加速度计数据 然后识别用户上下文 例如 前 5 分钟 用户在走路 然后用户站立一分钟 然后他
  • 如何在 lambda 层中本地调试依赖项?

    我正在从 dockerfile 创建一个 lambda 层 它将 python 包安装到一个目录并压缩结果 FROM amazonlinux WORKDIR RUN yum update y Install Python 3 7 RUN y
  • 在字符集之间转换文本文件的最佳方法?

    在字符集之间转换文本文件的最快 最简单的工具或方法是什么 具体来说 我需要从 UTF 8 转换为 ISO 8859 15 反之亦然 一切顺利 用您最喜欢的脚本语言 命令行工具或操作系统 网站等的其他实用程序编写单行代码 迄今为止最好的解决方
  • 有没有办法在单个 npmrc 文件中配置多个注册表

    这是我的问题 我们有一个私人 NPM 注册表 仅适用于 VPN 我想要一个后备注册表https registry npmjs org这样当我退出 VPN 时 它就能无缝运行 P S 目前我正在使用npmrc这在之间的切换方面做得很好 npm
  • 如何将SDL2纹理渲染到GTK3+窗口中?

    我正在创建一个音乐播放器并尝试使用 GTK3 来创建用户界面 我正在使用 SDL CreateWindowFrom 函数让 SDL2 使用 GTK3 窗口而不是创建一个窗口 但无法弄清楚将 SDL2 纹理渲染到 GTK3 窗口中需要遵循的步