/*
*
* ProLinga-Run
*
* Copyright (C) 2002-2008 Xobas Software.
* All rights reserved.
*
* This file is part of ProLinga-Run.
*
* ProLinga-Run 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-Run 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-Run. If not, see .
*
* More information is available at the following addresses:
*
* Website : http://www.prolinga.org
*
* Email : prolinga-list@prolinga.org
*
*
*/
#include "RunCommon.h"
#include
#include
#include
#include
#include "RunShare.hpp"
#include "DataRef.hpp"
#include "ScreenRef.hpp"
/* Screens open on Desktop Ptr */
extern DesktopScreenPtr desktopScreenPtr;
char *getWidgetValue(GtkWidget *wdg, bool isMainThread, char *retValue, bool allocate_mem)
{
GtkTextBuffer *textBuffer;
GtkTextIter start, end;
GSList *list = NULL;
GtkObject *tmpObject;
const gchar *signalName, *dataRef;
gchar signalNameNCB[32];
gboolean toggle;
int i,j, listCount;
char sigKey[80], *signalData, *status;
GtkTreeModel *model;
GtkTreeIter iter;
gchar *selValue;
/* Init */
status = NULL;
if (allocate_mem == true)
retValue = NULL;
else
retValue[0]='\0';
/* GtkEntry */
if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkEntry") == 0)
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
if (allocate_mem == true)
retValue = new char[strlen((char *)gtk_entry_get_text(GTK_ENTRY(wdg)))+1];
strcpy(retValue, (char *)gtk_entry_get_text(GTK_ENTRY(wdg)));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
/* GtkSpinButton */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkSpinButton") == 0)
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
gtk_spin_button_update(GTK_SPIN_BUTTON(wdg));
if (allocate_mem == true)
retValue = new char[32];
sprintf(retValue, "%g", gtk_spin_button_get_value(GTK_SPIN_BUTTON(wdg)));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
/* GtkTextView */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkTextView") == 0)
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
textBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wdg));
gtk_text_buffer_get_bounds(textBuffer, &start, &end);
if (allocate_mem == true)
retValue = new char[strlen((char *)gtk_text_buffer_get_text(textBuffer, &start, &end, FALSE))+1];
strcpy(retValue, (char *)gtk_text_buffer_get_text(textBuffer, &start, &end, FALSE));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
/* GtkLabel */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkLabel") == 0)
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
if (allocate_mem == true)
retValue = new char[strlen((char *)gtk_label_get_text(GTK_LABEL(wdg)))+1];
strcpy(retValue, (char *)gtk_label_get_text(GTK_LABEL(wdg)));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
/* GtkToggleButton or GtkCheckButton */
else if ((strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkToggleButton") == 0) || (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkToggleButton") == 0))
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
toggle = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wdg));
if (allocate_mem == true)
retValue = new char[6];
if (toggle == TRUE)
strcpy(retValue, "True");
else
strcpy(retValue, "False");
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
/* GtkRadioButton */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkRadioButton") == 0)
{
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
toggle = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wdg));
if (allocate_mem == true)
retValue = new char[6];
if (toggle == TRUE)
strcpy(retValue, "True");
else
strcpy(retValue, "False");
/* Get and set all radio buttons in group */
/* focus_out_event not automatically triggered */
list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(wdg));
listCount = g_slist_length(list);
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
for (i=0; ichild)))+1];
strcpy(retValue, gtk_entry_get_text(GTK_ENTRY(GTK_BIN(wdg)->child)));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
}
else
printf("Data move for %s not implemented (yet)\n", G_OBJECT_TYPE_NAME(G_OBJECT(wdg)));
/* Return NULL if all fails */
return retValue;
}
int putWidgetValue(GtkWidget *wdg, const char *value, const bool isMainThread)
{
GtkTextBuffer *textBuffer;
GtkTreeModel *model;
GtkTreeIter iter;
gchar *selValue;
int i, listCount, status;
char tmpValue[255];
/* Init */
status = 0;
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
/* GtkEntry */
if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkEntry") == 0)
gtk_entry_set_text(GTK_ENTRY(wdg), value);
/* GtkSpinButton */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkSpinButton") == 0)
{
if (strcmp(value, "") == 0)
gtk_spin_button_set_value(GTK_SPIN_BUTTON(wdg), 0);
else
gtk_spin_button_set_value(GTK_SPIN_BUTTON(wdg), (gdouble)atof(value));
}
/* GtkTextView */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkTextView") == 0)
{
textBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wdg));
gtk_text_buffer_set_text(textBuffer, value, -1);
}
/* GtkLabel */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkLabel") == 0)
gtk_label_set_text(GTK_LABEL(wdg), value);
/* GtkToggleButton or GtkCheckButton or GtkRadioButton */
else if ((strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkToggleButton") == 0) || \
(strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkCheckButton") == 0) ||
(strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkRadioButton") == 0))
{
if (strcmp(value, "True") == 0)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wdg), TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wdg), FALSE);
}
/* GtkComboBox */
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkComboBox") == 0)
{
/* Get data model/source linked to box */
model = gtk_combo_box_get_model(GTK_COMBO_BOX(wdg));
/* Get number of rows in list */
listCount = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model),NULL);
/* Loop through all entries until value found */
for (i=0; ichild), value);
else if (strcmp(G_OBJECT_TYPE_NAME(G_OBJECT(wdg)), "GtkTreeView") == 0)
{
if (strlen(value) == 0)
gtk_tree_view_set_model(GTK_TREE_VIEW(wdg), NULL);
}
else
printf("Data move for %s not implemented (yet)\n", G_OBJECT_TYPE_NAME(G_OBJECT(wdg)));
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
/* Return */
return 0;
}
char *getWidgetData(GtkWidget *wdg, const char *wdgName, const bool isMainThread, char *retValue, bool allocate_mem)
{
GtkWidget *curWdg;
GList *wdgList;
int i, lengthWdgList;
/* Init */
if (allocate_mem == true)
retValue = NULL;
else
retValue[0]='\0';
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
wdgList = gtk_container_get_children(GTK_CONTAINER(wdg));
lengthWdgList = g_list_length(wdgList);
for (i = 0; i < lengthWdgList; i++)
{
curWdg = GTK_WIDGET(g_list_nth_data(wdgList, i));
// printf("WIDGET : %s NAME : %s\n", G_OBJECT_TYPE_NAME(G_OBJECT(curWdg)), gtk_widget_get_name(curWdg));
if (strcmp(wdgName, (char *)gtk_widget_get_name(curWdg)) == 0)
{
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
if (allocate_mem == true)
retValue = getWidgetValue(curWdg, isMainThread, retValue, allocate_mem);
else
getWidgetValue(curWdg, isMainThread, retValue, allocate_mem);
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
/* Return */
return retValue;
}
if (GTK_IS_CONTAINER(curWdg))
{
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
if (allocate_mem == true)
retValue = getWidgetData(curWdg, wdgName, isMainThread, retValue, allocate_mem);
else
getWidgetData(curWdg, wdgName, isMainThread, retValue, allocate_mem);
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
if (strlen(retValue) > 0)
return retValue;
}
}
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
/* Return NULL if all fails */
return retValue;
}
char *getScreenWidgetData(const char *name, bool isMainThread, GtkWidget *outputScreen, char *retValue, bool allocate_mem)
{
char tmpValue[255], *token, *dataName, *screenName;
int i;
GtkWidget *screenWdgPtr;
/* Init */
if (allocate_mem == true)
retValue = NULL;
else
retValue[0] = '\0';
/* If no widget name given, return NULL */
if (name[0] == '.')
return retValue;
/* Get widget and screen Name (last one optional) */
strcpy(tmpValue, name);
token = strtok((char *)tmpValue, ".");
i = 1;
dataName = NULL;
screenName = NULL;
while (token != NULL)
{
if (i == 1)
dataName = token;
if (i == 2)
screenName = token;
token = strtok(NULL, ".");
i++;
}
/* If invalid number of argument parts, return NULL */
if ((i < 2) || (i > 3))
return retValue;
/* If no data name, return NULL */
if (dataName == NULL)
return retValue;
/* If screen name entered, check */
if (screenName != NULL)
{
/* Get pointer to widget on screenName */
//desktopScreenPtr->printList(desktopScreenPtr);
/* Find out if Screen already on desktop */
if (desktopScreenPtr->isOnDesktop(desktopScreenPtr, screenName) == 0)
return retValue;
else
{
/* Grab Screen widget Ptr */
screenWdgPtr = desktopScreenPtr->getOneValue(&desktopScreenPtr, screenName);
}
}
else
{
/* Get pointer to widget on outputScreen */
screenWdgPtr = outputScreen;
}
/* Get value from widget and return */
if (allocate_mem == true)
retValue = getWidgetData(screenWdgPtr, dataName, isMainThread, retValue, allocate_mem);
else
getWidgetData(screenWdgPtr, dataName, isMainThread, retValue, allocate_mem);
return retValue;
}
void putWidgetData(GtkWidget *wdg, const char *wdgName, const char *value, const bool isMainThread)
{
GtkWidget *curWdg;
GList *wdgList;
int i, lengthWdgList;
/* get GTK thread lock */
if (isMainThread == false)
gdk_threads_enter();
wdgList = gtk_container_get_children(GTK_CONTAINER(wdg));
lengthWdgList = g_list_length(wdgList);
if (isMainThread == false)
{
/* Sync with X server */
gdk_flush();
/* release GTK thread lock */
gdk_threads_leave();
}
for (i = 0; i < lengthWdgList; i++)
{
curWdg = GTK_WIDGET(g_list_nth_data(wdgList, i));
//printf("WIDGET : %s NAME : %s\n", G_OBJECT_TYPE_NAME(G_OBJECT(curWdg)), gtk_widget_get_name(curWdg));
if (strcmp(wdgName, (char *)gtk_widget_get_name(curWdg)) == 0)
putWidgetValue(curWdg, value, isMainThread);
if (GTK_IS_CONTAINER(curWdg))
putWidgetData(curWdg, wdgName, value, isMainThread);
}
}
void putScreenWidgetData(const char *name, char *value, bool isMainThread, GtkWidget *outputScreen)
{
char tmpValue[255], *token, *dataName, *screenName;
int i;
GtkWidget *screenWdgPtr;
/* If no widget name given, return NULL */
if (name[0] == '.')
return;
/* Get widget and screen Name (last one optional) */
strcpy(tmpValue, name);
token = strtok((char *)tmpValue, ".");
i = 1;
dataName = NULL;
screenName = NULL;
while (token != NULL)
{
if (i == 1)
dataName = token;
if (i == 2)
screenName = token;
token = strtok(NULL, ".");
i++;
}
/* If invalid number of argument parts, return NULL */
if ((i < 2) || (i > 3))
return;
/* If no data name, return NULL */
if (dataName == NULL)
return;
/* If screen name entered, check */
if (screenName != NULL)
{
/* Get pointer to widget on screenName */
//desktopScreenPtr->printList(desktopScreenPtr);
/* Find out if Screen already on desktop */
if (desktopScreenPtr->isOnDesktop(desktopScreenPtr, screenName) == 0)
return;
else
{
/* Grab Screen widget Ptr */
screenWdgPtr = desktopScreenPtr->getOneValue(&desktopScreenPtr, screenName);
}
}
else
{
/* Get pointer to widget on outputScreen */
screenWdgPtr = outputScreen;
}
/* Get value from widget and return */
putWidgetData(screenWdgPtr, dataName, value, isMainThread);
}