我使用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但是用户可能只是在命令行上传递了这个值,如果值超出范围,我想打印一个单独的错误消息.
我正在使用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()?
我正在创建一个带有g_timeout_add或g_timeout_add_seconds返回事件ID的事件; 我可以通过电话取消活动g_source_remove.
但是,在某些时候我想做的是看看在事件发生之前还剩多少时间.有没有一种简单的方法可以使用glib api执行此操作,还是需要手动存储和比较时间戳g_source_get_current_time?
我有一个轻量级的应用程序,可以捕获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代码gcc,并且已glib安装.
从我的所有研究中,我发现gcca,a wchar_t总是定义为4个字节,gliba gunichar也是4个字节.
我没想到的是,如果像a gunichar,a wchar_t也被编码为UCS4.是这样的吗?如果是这样,我应该能够简单地转换gunichar*为a wchar_t*并使用这些stdc wcs*函数,对吗?
我最近使用valgrind与glib(与gobject),它不能很好地工作.
我已经G_SLICE=always-malloc G_DEBUG=gc-friendly在命令行中添加了,但valgrind报告仍然有很多"可能丢失".
因为我在自动化测试中使用valgrind,所以我添加--error-exitcode=1,但那些"可能丢失"将使valgrind退出1,这将使我的测试失败.
有谁知道如何让valgrind不把"可能丢失"视为错误.
我正在尝试移植到Windows一个C项目写在Linux上工作.这是一个依赖CUDA和Glib图书馆的简单项目.
我相信最好的方法是使用Microsoft Visual Studio 2010进行编译,但我不知道如何将Glib链接到此项目.CUDA代码进展顺利,但每次调用Glib方法都会产生"未解析的外部符号"错误.
我有一个关于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没有"签订合同",说它不会改变我的数据.
我试图在Gdk屏幕上找到指针位置并找到gdk_display_get_pointer(),它工作正常,但它被标记为已弃用并且gdk_device_get_position()现在指的是.
但是我该如何使用这个功能呢?我不能得到一个GdkDevice,因为没有工厂,也没有构造函数.
所以我正在做一个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扩展中运行命令的任何示例。
我是否必须"|"像以前一样在命令中编写代码?