2013年12月

准备写一个将Glade/GtkBuilder等格式的UI文件转换成C++代码的python程序

首先完成的是将LIBGlade格式读取至内存中

#!/usr/bin/env python#-*- coding: utf-8 -*-

importos, sys, copyfrom xml.etree.ElementTree importElementTree'''result format:
[
{
"class" : "GtkWindow"
"id" : "window1"
"property" : [
{ "name" : "can_focus"
"value": "False"
}
{
}
]
"child" : [
{
"object":{
"class" : "GtkWindow"
"id" : "window1"
"property": [
{ "name" : "can_focus"
"value": "False"
}
{
}
]
"child" : [
...
]
}
"packing" :
{
"property": [
{ "name" : "expand"
"value": "True"
}
{
}
]
}
}
{
}
]
}
{
}
]

child_node_name = "child"
object_node_name = "widget"
packing_node_name = "packing"
''' defload_packing(parent_node):
packing
={}
propertys
=[]
tmp_property
={}#property list for property in parent_node.iterfind("property"):#name tmp_property["name"] = property.get("name")#value tmp_property["value"] =property.text#append to list propertys.append(copy.copy(tmp_property))#assign value packing["property"] =propertysreturnpackingdefload_object(parent_node):
result
={}#find widget widget = parent_node.find("widget")if widget !=None:
result[
"object"] =load_full_object(widget)#find packing packing = parent_node.find("packing")if packing !=None:
result[
"packing"] =load_packing(packing)returnresultdefload_full_object(self_node):
result
={}
propertys
=[]
childs
=[]
tmp_property
={}
tmp_child
={}#class result["class"] = self_node.get("class")#id result["id"] = self_node.get("id")#property list for property in self_node.iterfind("property"):#name tmp_property["name"] = property.get("name")#value tmp_property["value"] =property.text#other attribute if property.attrib.has_key("translatable"):
tmp_property[
"translatable"] = property.get("translatable")if property.attrib.has_key("context"):
tmp_property[
"context"] = property.get("context")if property.attrib.has_key("agent"):
tmp_property[
"agent"] = property.get("agent")if property.attrib.has_key("comments"):
tmp_property[
"comments"] = property.get("comments")#append to list propertys.append(copy.copy(tmp_property))#assign value result["property"] =propertys#childs for child in self_node.iterfind("child"):#recurse to load object tmp_child =load_object(child)#append it to list childs.append(copy.copy(tmp_child))#assign value result["child"] =childsreturnresultdefload_xml(xml_file):
result_lst
=[]#get root xml_root = ElementTree(file=xml_file).getroot()if(xml_root ==None):return -1, result_lst#check is libglade type? if (xml_root.tag != "glade-interface"):return -1, result_lstfor object in xml_root.iterfind("widget"):#print object result_lst.append(load_full_object(object))return0, result_lstif __name__=="__main__":
argNum
=len(sys.argv)#check param num if argNum <> 2:print "parameter number(%d) is not match" %argNum
sys.exit(0)

xml_file
= sys.argv[1]

ret, result
=load_xml(xml_file)print result

 

 

开发了一个基类,用于支持GTK2的信号回调

BaseObject.zip

为了便于快速通过glade设计界面,并生成相应的C++代码,我对glade-2 2.12.2的代码进行了修改

原始代码:glade-2.12.2.tar.gz.zip,下载后去掉zip的扩展名即可解压

相应的补丁代码为:cpp_out_1.patch.tar.xz.zip,下载后去掉zip的扩展名即可解压

目前只是将代码转换成C++的代码,由于C的语法校验比C++的语法校验简单,后续还需要对于一些场景下变量类型需要进一步处理

因此,暂时定为0.1版本

最近研究的XBMC静态链接,时常出现一些段错误,程序崩溃后还没有调用栈,坑爹的节奏啊

通过google搜索后,找到一个较好的办法解决这个问题,主要是利用glibc的backtraces接口。

就写了一个通用的文件,使用时只需要在main函数前包含这个文件,然后在main入口调用一个函数就可以捕获指定信号量并打印当时的调用栈了

#ifndef __SIG_BACK_TRACES_C__#define __SIG_BACK_TRACES_C__#include<stdio.h>#include<signal.h>#include<execinfo.h>#ifdef __cplusplusextern "C"{#endif

#define BACK_TRACES_ARRAY_SIZE          20

static void __signal_act_function(intsigno)
{
inti;int depth = 0;char** symbols =NULL;char* stack[BACK_TRACES_ARRAY_SIZE] = {0};

printf(
"Signal caught:%u, dumping backtrace...\n", signo);
depth
= backtrace( (void**)(stack), sizeof(stack)/sizeof(stack[0]));if(depth)
{
symbols
= backtrace_symbols((void**)(stack), depth);if(symbols)
{
for(i = 0; i < depth; i++)
{
printf(
"===[%u]:%s\n", (i+1), symbols[i]);
}
}
free(symbols);
}

sleep(
5);//re-throw raise(signo);
}
static void __set_signal_no_print_bt(intsigno)
{
structsigaction act;
act.sa_handler
= &__signal_act_function ;
act.sa_flags
|= SA_RESETHAND; //one-time only sigaction(SIGSEGV, &act, NULL);
}

#ifdef __cplusplus
}
#endif #endif

在main函数中调用__set_signal_no_print_bt(xxx)即可