标签: glib

如何使用GLib强制命令行选项?

我使用GLib来解析一些命令行选项.问题是我想要强制选择其中两个选项,以便在用户省略它们时程序终止于帮助屏幕.

我的代码看起来像这样:

static gint line   = -1;
static gint column = -1;

static GOptionEntry options[] =
{
    {"line", 'l', 0, G_OPTION_ARG_INT, &line, "The line", "L"},
    {"column", 'c', 0, G_OPTION_ARG_INT, &column, "The column", "C"},
    {NULL}
};

...

int main(int argc, char** argv)
{
    GError *error = NULL;
    GOptionContext *context;

    context = g_option_context_new ("- test");
    g_option_context_add_main_entries (context, options, NULL);

    if (!g_option_context_parse(context, &argc, &argv, &error))
    {
        usage(error->message, context);
    }

    ...

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在命令行中省略了其中一个参数或两者都没有,那么g_option_context_parse()仍然成功,并且有问题的值(行和/或列)仍为-1.如果用户没有在命令行上传递这两个选项,我怎么能告诉GLib解析失败?也许我只是盲目但我找不到我可以放入GOptionEntry数据结构的标志,告诉它要强制使用这些字段.

当然我可以检查其中一个变量是否仍为-1但是用户可能只是在命令行上传递了这个值,如果值超出范围,我想打印一个单独的错误消息.

c glib optional-parameters

5
推荐指数
1
解决办法
3667
查看次数

g_object_new应该匹配g_object_unref吗?

我正在使用libnotify在我的应用程序中显示桌面通知; notify_notification_new() 返回a NotifyNotification*,应作为第一个参数传递给通知库的进一步函数调用.

没有notify_notification_free()哪个可以释放它返回的指针.我查找源代码notify_notification_new()并在内部执行a g_object_new(),获取GObject*并将其作为a返回NotfiyNotification*,因此当我的应用程序执行清理时,是否应该调用g_object_unref()返回的指针notify_notification_new()

c memory gobject glib

5
推荐指数
1
解决办法
3738
查看次数

可以检索一个油嘴'事件留下的时间吗?'

我正在创建一个带有g_timeout_addg_timeout_add_seconds返回事件ID的事件; 我可以通过电话取消活动g_source_remove.

但是,在某些时候我想做的是看看在事件发生之前还剩多少时间.有没有一种简单的方法可以使用glib api执行此操作,还是需要手动存储和比较时间戳g_source_get_current_time

c linux timer glib

5
推荐指数
1
解决办法
138
查看次数

如何在g_main_loop中添加Xorg事件

我有一个轻量级的应用程序,可以捕获Xorg和dbus事件.为了做到这一点,我初始化了dbus循环并启动了g_main_loop,但我不知道如何以自然的方式添加Xorg事件处理:

GMainLoop * mainloop = NULL;
mainloop = g_main_loop_new(NULL,FALSE);
dbus_g_thread_init ();
dbus_init();
// <<<<<<<<<<<<<<<<<<<<<<<<<
//1 way using timeout 
//g_timeout_add(100, kbdd_default_iter, mainloop);
//2nd way using pthread
//GThread * t = g_thread_create(kbdd_default_loop, NULL, FALSE, NULL);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>
g_main_loop_run(mainloop);
Run Code Online (Sandbox Code Playgroud)

默认情况下,我正在检查是否有等待X事件并处理它们.

两种方式看起来都很糟糕,首先是因为我不需要检查事件的调用,其次是因为我创建了一个额外的线程并且必须进行额外的锁定.

PS我知道我可以使用gtk lib,但我不想依赖任何工具包.

c glib

5
推荐指数
1
解决办法
1590
查看次数

glib gunichar和wchar_t之间有什么区别,哪个更适合跨平台解决方案?

我正在尝试编写一些只有用户可以移植的C代码gcc,并且已glib安装.

从我的所有研究中,我发现gcca,a wchar_t总是定义为4个字节,gliba gunichar也是4个字节.

想到的是,如果像a gunichar,a wchar_t也被编码为UCS4.是这样的吗?如果是这样,我应该能够简单地转换gunichar*为a wchar_t*并使用这些stdc wcs*函数,对吗?

c unicode cross-platform wchar-t glib

5
推荐指数
1
解决办法
1061
查看次数

如何忽视valgrind中的"可能丢失"

我最近使用valgrind与glib(与gobject),它不能很好地工作.

我已经G_SLICE=always-malloc G_DEBUG=gc-friendly在命令行中添加了,但valgrind报告仍然有很多"可能丢失".

因为我在自动化测试中使用valgrind,所以我添加--error-exitcode=1,但那些"可能丢失"将使valgrind退出1,这将使我的测试失败.

有谁知道如何让valgrind不把"可能丢失"视为错误.

valgrind glib

5
推荐指数
2
解决办法
2378
查看次数

如何在Microsoft Visual Studio 2010上配置Glib?

我正在尝试移植到Windows一个C项目写在Linux上工作.这是一个依赖CUDA和Glib图书馆的简单项目.

我相信最好的方法是使用Microsoft Visual Studio 2010进行编译,但我不知道如何将Glib链接到此项目.CUDA代码进展顺利,但每次调用Glib方法都会产生"未解析的外部符号"错误.

windows glib visual-studio-2010

5
推荐指数
1
解决办法
5451
查看次数

为什么GLib在这些函数中不使用'const'?

我有一个关于GLib的简单问题.

我有以下代码:

static const char *words[] = { "one", "two", "three", NULL };

void main() {
  puts(g_strjoinv("+", words));
}
Run Code Online (Sandbox Code Playgroud)

此代码打印one+two+three.它使用连接字符串的GLib函数.

该功能的签名是:

char *g_strjoinv (const char *separator, char **str_array);
Run Code Online (Sandbox Code Playgroud)

(确切地说,GLib使用的gchar不是char,但让我们忽略它.)

现在,我想知道为什么参数是char **str_array和不const char **str_array.它迫使我做一个显式的强制转换来摆脱编译器的警告("期望'char**'但参数类型为'const char**'"):

  puts(g_strjoinv("+", (char **)words));
Run Code Online (Sandbox Code Playgroud)

我查看了GLib的参考资料,我发现所有函数都是这样定义的:它们接受char **,而不是const char **.

这是为什么?为什么GLib不使用const char **

需要使用显式转换来摆脱const使得我的代码不那么安全(因为编译器不再检查参数的兼容性).这也让我感到紧张,因为GLib没有"签订合同",说它不会改变我的数据.

c const glib

5
推荐指数
1
解决办法
221
查看次数

如何使用gdk_device_get_position()?

我试图在Gdk屏幕上找到指针位置并找到gdk_display_get_pointer(),它工作正常,但它被标记为已弃用并且gdk_device_get_position()现在指的是.

但是我该如何使用这个功能呢?我不能得到一个GdkDevice,因为没有工厂,也没有构造函数.

gtk position glib cursor gdk

5
推荐指数
2
解决办法
926
查看次数

Gnome Shell扩展:如何使用管道运行命令

所以我正在做一个Gnome Shell扩展。我希望能够使用管道运行某些命令。(该命令实际上是"xrandr --query | awk 'something'",但这不是主题)

所以,到目前为止我所做的是

GLib.spawn_async_with_pipes(null,
                            ['/usr/bin/xrandr', '--query', '|', 'awk...'], null,
                            GLib.SpawnFlags.DO_NOT_REAP_CHILD, null);
Run Code Online (Sandbox Code Playgroud)

但这不起作用!我找不到在带有管道的gnome扩展中运行命令的任何示例。

我是否必须"|"像以前一样在命令中编写代码?

javascript gnome glib gnome-3 gnome-shell-extensions

5
推荐指数
1
解决办法
1654
查看次数