/*
*
* ProLinga-UI
*
* Copyright (C) 2002-2008 Xobas Software.
* All rights reserved.
*
* This file is part of ProLinga-UI.
*
* ProLinga-UI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ProLinga-UI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ProLinga-UI. If not, see .
*
* More information is available at the following addresses:
*
* Website : http://www.prolinga.org
*
* Email : prolinga-list@prolinga.org
*
*
*/
#include "UICommon.h"
#include
#include
#include
#include
#include
#include
#include "UIMain.hpp"
#include "UCScreen.hpp"
#include "UIConfig.hpp"
#include "UIShare.hpp"
/* Screens open on Desktop Ptr */
extern DesktopScreenPtr desktopScreenPtr;
int UCScreen(const xmlDocPtr docObj, const char *objName, char **externalError, xmlDocPtr *docReturn)
{
xmlNodePtr curReturn, curGlade;
xmlBufferPtr bufGlade;
xmlXPathContextPtr ctxObj;
xmlXPathObjectPtr resObj;
char *screen, *screenId;
GladeXML *xml;
GtkWidget *wdgScreen;
// xmlBufferPtr buf = xmlBufferCreate();
// xmlNodePtr curResponse = xmlDocGetRootElement(docObj);
// xmlNodeDump(buf, docObj, curResponse, 0, 1);
//// printf("QQQ\n%s\n", (char *)xmlBufferContent(buf));
// xmlBufferFree(buf);
/* Create XPath Environment */
ctxObj = xmlXPathNewContext(docObj);
/* Find out if Screen already on desktop */
if (desktopScreenPtr->isOnDesktop(desktopScreenPtr, objName) != 0)
{
/* Find out if screen is modal */
resObj = xmlXPathEval((const xmlChar *)"/ProLinga/Object/Screen/AllowMultipleInstances", ctxObj);
if (strcmp((char *)xmlXPathCastToString(resObj), "False") == 0)
{
/* Grab Screen widget Ptr */
wdgScreen = desktopScreenPtr->getOneValue(&desktopScreenPtr, objName);
/* get GTK thread lock */
gdk_threads_enter();
/* Bring window to foreground */
gtk_window_present(GTK_WINDOW(wdgScreen));
/* release GTK thread lock and sync with X server */
gdk_flush();
gdk_threads_leave();
/* Clean up */
xmlXPathFreeObject(resObj);
xmlXPathFreeContext(ctxObj);
/* Create return document */
*docReturn = xmlNewDoc((const xmlChar *)XML_VERSION);
(*docReturn)->children = xmlNewDocNode(*docReturn, NULL, (const xmlChar *)ROOT_ELEM, NULL);
curReturn = xmlDocGetRootElement(*docReturn);
curReturn = xmlNewTextChild(curReturn, NULL, (const xmlChar *)"Object", (const xmlChar *)"");
xmlNewProp(curReturn, (const xmlChar *)"Name", (const xmlChar *)objName);
/* Return */
return 0;
}
}
/* Get Glade string */
resObj = xmlXPathEval((const xmlChar *)"/ProLinga/Object/Screen/DisplayData/glade-interface", ctxObj);
curGlade = resObj->nodesetval->nodeTab[0];
bufGlade = xmlBufferCreate();
xmlNodeDump(bufGlade, docObj, curGlade, 0, 1);
screen = (char *)xmlBufferContent(bufGlade);
xmlXPathFreeObject(resObj);
/* Get Screen id */
resObj = xmlXPathEval((const xmlChar *)"/ProLinga/Object/Screen/DisplayData/glade-interface/widget/@id", ctxObj);
screenId = (char *)xmlXPathCastToString(resObj);
/* get GTK thread lock */
gdk_threads_enter();
/* Display Screen */
xml = glade_xml_new_from_buffer(screen, strlen(screen), NULL, NULL);
if (!xml)
return 19003;
//glade_xml_signal_autoconnect(xml);
/* Get Widget Pointer */
wdgScreen = glade_xml_get_widget(xml, screenId);
/* Add screen to list on desktop */
desktopScreenPtr->putValue(&desktopScreenPtr, objName, wdgScreen);
/* release GTK thread lock */
gdk_flush();
gdk_threads_leave();
/* Create return document */
*docReturn = xmlNewDoc((const xmlChar *)XML_VERSION);
(*docReturn)->children = xmlNewDocNode(*docReturn, NULL, (const xmlChar *)ROOT_ELEM, NULL);
curReturn = xmlDocGetRootElement(*docReturn);
curReturn = xmlNewTextChild(curReturn, NULL, (const xmlChar *)"Object", (const xmlChar *)"");
xmlNewProp(curReturn, (const xmlChar *)"Name", (const xmlChar *)objName);
// curReturn = xmlNewTextChild(curReturn, NULL, (const xmlChar *)"NonQuery", (const xmlChar *)"");
// curReturn = xmlNewTextChild(curReturn, NULL, (const xmlChar *)"RowsAffected", (const xmlChar *)tmpString);
/* Clean up */
xmlBufferFree(bufGlade);
xmlXPathFreeObject(resObj);
xmlXPathFreeContext(ctxObj);
/* Return */
return 0;
}