/* * * 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; }