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