• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • superkaramba
 

superkaramba

karamba_python.cpp

00001 /****************************************************************************
00002 *  karamba_python.cpp  -  Functions for calling python scripts
00003 *
00004 *  Copyright (C) 2003 Hans Karlsson <karlsson.h@home.se>
00005 *  Copyright (C) 2003-2004 Adam Geitgey <adam@rootnode.org>
00006 *  Copyright (c) 2004 Petri Damstén <damu@iki.fi>
00007 *  Copyright (c) 2004 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
00008 *
00009 *  This file is part of SuperKaramba.
00010 *
00011 *  SuperKaramba is free software; you can redistribute it and/or modify
00012 *  it under the terms of the GNU General Public License as published by
00013 *  the Free Software Foundation; either version 2 of the License, or
00014 *  (at your option) any later version.
00015 *
00016 *  SuperKaramba is distributed in the hope that it will be useful,
00017 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 *  GNU General Public License for more details.
00020 *
00021 *  You should have received a copy of the GNU General Public License
00022 *  along with SuperKaramba; if not, write to the Free Software
00023 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00024 ****************************************************************************/
00025 
00026 #ifdef _XOPEN_SOURCE
00027 #undef _XOPEN_SOURCE
00028 #endif
00029 
00030 #include <Python.h>
00031 #include "karambaapp.h"
00032 #include "themefile.h"
00033 
00034 #include "karamba_python.h"
00035 #include "meter_python.h"
00036 #include "bar_python.h"
00037 #include "graph_python.h"
00038 #include "textlabel_python.h"
00039 #include "richtextlabel_python.h"
00040 #include "imagelabel_python.h"
00041 #include "widget_python.h"
00042 #include "menu_python.h"
00043 #include "config_python.h"
00044 #include "task_python.h"
00045 #include "systray_python.h"
00046 #include "svcgrp_python.h"
00047 #include "misc_python.h"
00048 #include "input_python.h"
00049 
00050 struct module_state {
00051     PyObject *error;
00052 };
00053 
00054 #if PY_MAJOR_VERSION >= 3
00055 #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
00056 #else
00057 #define GETSTATE(m) (&_state)
00058 static struct module_state _state;
00059 #endif
00060 
00061 static PyObject *
00062 error_out(PyObject *m) {
00063     struct module_state *st = GETSTATE(m);
00064     PyErr_SetString(st->error, "something bad happened in karamba_python.cpp");
00065     return NULL;
00066 }
00067 
00068 /*******************************************
00069  * Python methods are defined here.
00070  *   Each method accessible from python should have:
00071  *     - A wrapper function that returns a PyObject or appropriate python type
00072  *     - A C++ implementation of the python method, named the same as the python call
00073  *     - An entry in the python methods array so the call is accessible from python
00074  *
00075  *   Example:
00076  *     py_move_systay - wrapper function
00077  *     moveSystray - actual implementation of method
00078  *     {"moveSystray", py_move_systray, METH_VARARGS, "Move the Systray"} - array entry
00079  */
00080 
00081 static PyMethodDef karamba_methods[] = {
00082     // Bar - bar_python.cpp
00083     {(char*)"createBar", py_createBar, METH_VARARGS, (char*)"Create new Bar."},
00084     {(char*)"deleteBar", py_deleteBar, METH_VARARGS, (char*)"Delete Bar."},
00085     {(char*)"getThemeBar", py_getThemeBar, METH_VARARGS, (char*)"Get Bar from .theme using it's name."},
00086     {(char*)"getBarSize", py_getBarSize, METH_VARARGS, (char*)"Get Bar size."},
00087     {(char*)"resizeBar", py_resizeBar, METH_VARARGS, (char*)"Resize Bar."},
00088     {(char*)"getBarPos", py_getBarPos, METH_VARARGS, (char*)"Get Bar position."},
00089     {(char*)"moveBar", py_moveBar, METH_VARARGS, (char*)"Move Bar."},
00090     {(char*)"hideBar", py_hideBar, METH_VARARGS, (char*)"Hide Bar."},
00091     {(char*)"showBar", py_showBar, METH_VARARGS, (char*)"Show Bar."},
00092     {(char*)"getBarSensor", py_getBarSensor, METH_VARARGS, (char*)"Get Bar sensor."},
00093     {(char*)"setBarSensor", py_setBarSensor, METH_VARARGS, (char*)"Set Bar sensor."},
00094     {(char*)"setBarImage", py_setBarImage, METH_VARARGS, (char*)"Set bar image"},
00095     {(char*)"getBarImage", py_getBarImage, METH_VARARGS, (char*)"Get bar image"},
00096     {(char*)"setBarVertical", py_setBarVertical, METH_VARARGS, (char*)"Set bar orientation"},
00097     {(char*)"getBarVertical", py_getBarVertical, METH_VARARGS, (char*)"Get bar orientation"},
00098     {(char*)"setBarValue", py_setBarValue, METH_VARARGS, (char*)"Set bar value"},
00099     {(char*)"getBarValue", py_getBarValue, METH_VARARGS, (char*)"Get bar value"},
00100     {(char*)"setBarMinMax", py_setBarMinMax, METH_VARARGS, (char*)"Set bar min & max"},
00101     {(char*)"getBarMinMax", py_getBarMinMax, METH_VARARGS, (char*)"Get bar min & max"},
00102     {(char*)"getIncomingData", py_get_incoming_data, METH_VARARGS, (char*)"Get incoming data passed from another theme"},
00103     {(char*)"setIncomingData", py_set_incoming_data, METH_VARARGS, (char*)"Set incoming data passed in another theme"},
00104 
00105     // Graph - graph_python.cpp
00106     {(char*)"createGraph", py_createGraph, METH_VARARGS, (char*)"Create new Graph."},
00107     {(char*)"deleteGraph", py_deleteGraph, METH_VARARGS, (char*)"Delete Graph."},
00108     {(char*)"getThemeGraph", py_getThemeGraph, METH_VARARGS, (char*)"Get Graph from .theme using it's name."},
00109     {(char*)"getGraphSize", py_getGraphSize, METH_VARARGS, (char*)"Get Graph size."},
00110     {(char*)"resizeGraph", py_resizeGraph, METH_VARARGS, (char*)"Resize Graph."},
00111     {(char*)"getGraphPos", py_getGraphPos, METH_VARARGS, (char*)"Get Graph position."},
00112     {(char*)"moveGraph", py_moveGraph, METH_VARARGS, (char*)"Move Graph."},
00113     {(char*)"hideGraph", py_hideGraph, METH_VARARGS, (char*)"Hide Graph."},
00114     {(char*)"showGraph", py_showGraph, METH_VARARGS, (char*)"Show Graph."},
00115     {(char*)"getGraphSensor", py_getGraphSensor, METH_VARARGS, (char*)"Get Graph sensor."},
00116     {(char*)"setGraphSensor", py_setGraphSensor, METH_VARARGS, (char*)"Set Graph sensor."},
00117     {(char*)"setGraphValue", py_setGraphValue, METH_VARARGS, (char*)"Set graph value"},
00118     {(char*)"getGraphValue", py_getGraphValue, METH_VARARGS, (char*)"Get graph value"},
00119     {(char*)"setGraphMinMax", py_setGraphMinMax, METH_VARARGS, (char*)"Set graph min & max"},
00120     {(char*)"getGraphMinMax", py_getGraphMinMax, METH_VARARGS, (char*)"Get graph min & max"},
00121     {(char*)"setGraphColor", py_setGraphColor, METH_VARARGS, (char*)"Change a Graph Sensor's Color"},
00122     {(char*)"getGraphColor", py_getGraphColor, METH_VARARGS, (char*)"Get a Graph Sensor's Color"},
00123 
00124     // TextLabel - textlabel_python.cpp
00125     {(char*)"createText", py_createText, METH_VARARGS, (char*)"Create new Text."},
00126     {(char*)"deleteText", py_deleteText, METH_VARARGS, (char*)"Delete Text."},
00127     {(char*)"getThemeText", py_getThemeText, METH_VARARGS, (char*)"Get Text from .theme using it's name."},
00128     {(char*)"getTextSize", py_getTextSize, METH_VARARGS, (char*)"Get Text size."},
00129     {(char*)"resizeText", py_resizeText, METH_VARARGS, (char*)"Resize Text."},
00130     {(char*)"getTextPos", py_getTextPos, METH_VARARGS, (char*)"Get Text position."},
00131     {(char*)"moveText", py_moveText, METH_VARARGS, (char*)"Move Text."},
00132     {(char*)"hideText", py_hideText, METH_VARARGS, (char*)"Hide Text."},
00133     {(char*)"showText", py_showText, METH_VARARGS, (char*)"Show Text."},
00134     {(char*)"getTextSensor", py_getTextSensor, METH_VARARGS, (char*)"Get Text sensor."},
00135     {(char*)"setTextSensor", py_setTextSensor, METH_VARARGS, (char*)"Set Text sensor."},
00136     {(char*)"changeText", py_setTextValue, METH_VARARGS, (char*)"Change a Text Sensor's Text"},
00137     {(char*)"getTextValue", py_getTextValue, METH_VARARGS, (char*)"Get Text value"},
00138     {(char*)"changeTextShadow", py_setTextShadow, METH_VARARGS, (char*)"Change a Text Shadow size"},
00139     {(char*)"getTextShadow", py_getTextShadow, METH_VARARGS, (char*)"Get a Text Shadow size"},
00140     {(char*)"changeTextFont", py_setTextFont, METH_VARARGS, (char*)"Change a Text Sensor's Font"},
00141     {(char*)"getTextFont", py_getTextFont, METH_VARARGS, (char*)"Get a Text Sensor's Font"},
00142     {(char*)"changeTextColor", py_setTextColor, METH_VARARGS, (char*)"Change a Text Sensor's Color"},
00143     {(char*)"getTextColor", py_getTextColor, METH_VARARGS, (char*)"Get a Text Sensor's Color"},
00144     {(char*)"changeTextSize", py_setTextFontSize, METH_VARARGS, (char*)"Change a Text Sensor's Font Size"},
00145     {(char*)"getTextFontSize", py_getTextFontSize, METH_VARARGS, (char*)"Get a Text Sensor's Font Size"},
00146     {(char*)"getTextAlign", py_getTextAlign, METH_VARARGS, (char*)"Get Text alignment."},
00147     {(char*)"setTextAlign", py_setTextAlign, METH_VARARGS, (char*)"Set Text alignment."},
00148     {(char*)"setTextScroll", py_setTextScroll, METH_VARARGS, (char*)"Set Text scroll."},
00149 
00150     // RichTextLabel - richtextlabel_python.cpp
00151     {(char*)"createRichText", py_createRichText, METH_VARARGS, (char*)"Create a Rich Text Sensor"},
00152     {(char*)"deleteRichText", py_deleteRichText, METH_VARARGS, (char*)"Deletes a Rich Text Sensor"},
00153     {(char*)"getThemeRichText", py_getThemeRichText, METH_VARARGS, (char*)"Get Rich Text from .theme using it's name."},
00154     {(char*)"getRichTextSize", py_getRichTextSize, METH_VARARGS, (char*)"Get the (width, height) of a Rich Text Sensor"},
00155     {(char*)"resizeRichText", py_resizeRichText, METH_VARARGS, (char*)"Resize Rich Text."},
00156     {(char*)"setRichTextWidth", py_set_rich_text_width, METH_VARARGS, (char*)"Sets the width of a Rich Text Sensor"},
00157     {(char*)"getRichTextPos", py_getRichTextPos, METH_VARARGS, (char*)"Get Rich Text position."},
00158     {(char*)"moveRichText", py_moveRichText, METH_VARARGS, (char*)"Moves a Rich Text Sensor"},
00159     {(char*)"hideRichText", py_hideRichText, METH_VARARGS, (char*)"hides a Rich Text Sensor"},
00160     {(char*)"showRichText", py_showRichText, METH_VARARGS, (char*)"shows a Rich Text Sensor"},
00161     {(char*)"getRichTextSensor", py_getRichTextSensor, METH_VARARGS, (char*)"Get Rich Text sensor."},
00162     {(char*)"setRichTextSensor", py_setRichTextSensor, METH_VARARGS, (char*)"Set Rich Text sensor."},
00163     {(char*)"changeRichText", py_setRichTextValue, METH_VARARGS, (char*)"Change the content of a Rich Text Sensor"},
00164     {(char*)"getRichTextValue", py_getRichTextValue, METH_VARARGS, (char*)"Get Rich Text value"},
00165     {(char*)"changeRichTextFont", py_setRichTextFont, METH_VARARGS, (char*)"Change a Rich Text Sensor's Font"},
00166     {(char*)"getRichTextFont", py_getRichTextFont, METH_VARARGS, (char*)"Get a Rich Text Sensor's Font"},
00167     {(char*)"changeRichTextSize", py_setRichTextFontSize, METH_VARARGS, (char*)"Change a Rich Text Sensor's Font Size"},
00168     {(char*)"getRichTextFontSize", py_getRichTextFontSize, METH_VARARGS, (char*)"Get a Rich Text Sensor's Font Size"},
00169 
00170     // ImageLabel - imagelabel_python.cpp
00171     {(char*)"createImage", py_createImage, METH_VARARGS, (char*)"Create an Image"},
00172     {(char*)"createTaskIcon", py_createTaskIcon, METH_VARARGS, (char*)"Create an Image of the Icon for a Task"},
00173     {(char*)"createBackgroundImage", py_createBackgroundImage, METH_VARARGS, (char*)"Create an Image (only redraw it when background changes)"},
00174     {(char*)"deleteImage", py_deleteImage, METH_VARARGS, (char*)"Delete an Image"},
00175     {(char*)"getThemeImage", py_getThemeImage, METH_VARARGS, (char*)"Get image meter from .theme using it's name"},
00176     {(char*)"getImageSize", py_getImageSize, METH_VARARGS, (char*)"Get Image size."},
00177     {(char*)"getImageWidth", py_getImageWidth, METH_VARARGS, (char*)"Get the width of an Image"},
00178     {(char*)"getImageHeight", py_getImageHeight, METH_VARARGS, (char*)"Get the height of an Image"},
00179     {(char*)"getImagePos", py_getImagePos, METH_VARARGS, (char*)"Get Image position."},
00180     {(char*)"moveImage", py_moveImage, METH_VARARGS, (char*)"Move an Image"},
00181     {(char*)"hideImage", py_hideImage, METH_VARARGS, (char*)"Hide an Image"},
00182     {(char*)"showImage", py_showImage, METH_VARARGS, (char*)"Show an Image"},
00183     {(char*)"getImagePath", py_getImageValue, METH_VARARGS, (char*)"Get Image path."},
00184     {(char*)"setImagePath", py_setImageValue, METH_VARARGS, (char*)"Set Image path."},
00185     {(char*)"getImageSensor", py_getImageSensor, METH_VARARGS, (char*)"Get Image sensor."},
00186     {(char*)"setImageSensor", py_setImageSensor, METH_VARARGS, (char*)"Set Image sensor."},
00187     {(char*)"addImageTooltip", py_addImageTooltip, METH_VARARGS, (char*)"Create a Tooltip for an Image"},
00188     {(char*)"resizeImage", py_resizeImage, METH_VARARGS, (char*)"Scale an Image"},
00189     {(char*)"resizeImageSmooth", py_resizeImageSmooth, METH_VARARGS, (char*)"Scale an Image (slower, better looking)"},
00190     {(char*)"rotateImage", py_rotateImage, METH_VARARGS, (char*)"Rotate an Image"},
00191     {(char*)"removeImageTransformations", py_removeImageTransformations, METH_VARARGS, (char*)"Restore original size and orientation of an Image"},
00192     {(char*)"removeImageEffects", py_removeImageEffects, METH_VARARGS, (char*)"Remove Effects of an Image"},
00193     {(char*)"changeImageIntensity", py_changeImageIntensity, METH_VARARGS, (char*)"Change Intensity of an Image"},
00194     {(char*)"changeImageChannelIntensity", py_changeImageChannelIntensity, METH_VARARGS, (char*)"Change Intensity of an Image Channel"},
00195     {(char*)"changeImageToGray", py_changeImageToGray, METH_VARARGS, (char*)"Converts an Image to Grayscale"},
00196 
00197     // Menu - menu_python.cpp
00198     {(char*)"createMenu", py_create_menu, METH_VARARGS, (char*)"Create a popup menu"},
00199     {(char*)"deleteMenu", py_delete_menu, METH_VARARGS, (char*)"Delete a popup menu"},
00200     {(char*)"addMenuItem", py_add_menu_item, METH_VARARGS, (char*)"Add a popup menu entry"},
00201     {(char*)"addMenuSeparator", py_add_menu_separator, METH_VARARGS, (char*)"Add a popup menu seperator item"},
00202     {(char*)"removeMenuItem", py_remove_menu_item, METH_VARARGS, (char*)"Remove a popup menu entry"},
00203     {(char*)"popupMenu", py_popup_menu, METH_VARARGS, (char*)"Popup a menu at a specified location"},
00204 
00205     // Config - config_python.cpp
00206     {(char*)"addMenuConfigOption", py_add_menu_config_option, METH_VARARGS, (char*)"Add a configuration entry to the menu"},
00207     {(char*)"setMenuConfigOption", py_set_menu_config_option, METH_VARARGS, (char*)"Set a configuration entry in the menu"},
00208     {(char*)"readMenuConfigOption", py_read_menu_config_option, METH_VARARGS, (char*)"Read a configuration entry in the menu"},
00209     {(char*)"readConfigEntry", py_read_config_entry, METH_VARARGS, (char*)"Read a configuration entry"},
00210     {(char*)"writeConfigEntry", py_write_config_entry, METH_VARARGS, (char*)"Writes a configuration entry"},
00211 
00212     // Widget - widget_python.cpp
00213     {(char*)"moveWidget", py_move_widget, METH_VARARGS, (char*)"Move Widget to x,y"},
00214     {(char*)"resizeWidget", py_resize_widget, METH_VARARGS, (char*)"Resize Widget to width,height"},
00215     {(char*)"createWidgetMask", py_create_widget_mask, METH_VARARGS, (char*)"Create a clipping mask for this widget"},
00216     {(char*)"redrawWidget", py_redraw_widget, METH_VARARGS, (char*)"Update Widget to reflect your changes"},
00217     {(char*)"redrawWidgetBackground", py_redraw_widget_background, METH_VARARGS, (char*)"Update Widget to reflect background image changes"},
00218     {(char*)"getWidgetPosition", py_get_widget_position, METH_VARARGS, (char*)"Get Widget Position"},
00219     {(char*)"toggleWidgetRedraw", py_toggle_widget_redraw, METH_VARARGS, (char*)"Toggle Widget redrawing"},
00220 
00221     // Task - task_python.cpp
00222     {(char*)"getStartupList", py_get_startup_list, METH_VARARGS, (char*)"Get the system startup list"},
00223     {(char*)"getStartupInfo", py_get_startup_info, METH_VARARGS, (char*)"Get all the info for a startup"},
00224     {(char*)"getTaskList", py_get_task_list, METH_VARARGS, (char*)"Get the system task list"},
00225     {(char*)"getTaskNames", py_get_task_names, METH_VARARGS, (char*)"Get the system task list in name form"},
00226     {(char*)"getTaskInfo", py_get_task_info, METH_VARARGS, (char*)"Get all the info for a task"},
00227     {(char*)"performTaskAction", py_perform_task_action, METH_VARARGS, (char*)"Do something with a task, such as minimize it"},
00228 
00229     // System Tray - systray_python.cpp
00230     {(char*)"createSystray", py_create_systray, METH_VARARGS, (char*)"Create a Systray"},
00231     {(char*)"hideSystray", py_hide_systray, METH_VARARGS, (char*)"Hide the Systray"},
00232     {(char*)"showSystray", py_show_systray, METH_VARARGS, (char*)"Show the Systray"},
00233     {(char*)"moveSystray", py_move_systray, METH_VARARGS, (char*)"Move the Systray"},
00234     {(char*)"getCurrentWindowCount", py_get_current_window_count, METH_VARARGS, (char*)"Get current Window count"},
00235     {(char*)"updateSystrayLayout", py_update_systray_layout, METH_VARARGS, (char*)"Update Systray layout"},
00236 
00237     // Misc - misc_python.cpp
00238     {(char*)"getThemePath", py_get_theme_path, METH_VARARGS,  (char*)"Get the file path of the theme"},
00239     {(char*)"readThemeFile", py_read_theme_file, METH_VARARGS,
00240         (char*)"Read file from theme."},
00241     {(char*)"language", py_language, METH_VARARGS,
00242         (char*)"Return default language of a translation file."},
00243     {(char*)"userLanguage", py_userLanguage, METH_VARARGS,
00244         (char*)"Return user language."},
00245     {(char*)"userLanguages", py_userLanguages, METH_VARARGS,
00246         (char*)"Return preferred user languages."},
00247     {(char*)"openTheme", py_open_theme, METH_VARARGS,
00248         (char*)"Open a new theme"},
00249     {(char*)"reloadTheme", py_reload_theme, METH_VARARGS,
00250             (char*)"Reload current theme"},
00251     {(char*)"acceptDrops", py_accept_drops, METH_VARARGS,
00252             (char*)"Allows widget to receive Drop (I.E. Drag and Drop) events"},
00253     {(char*)"toggleShowDesktop", py_toggle_show_desktop, METH_VARARGS,
00254             (char*)"Show/Hide the desktop"},
00255     {(char*)"execute", py_execute_command, METH_VARARGS, (char*)"Execute a command"},
00256     {(char*)"executeInteractive", py_execute_command_interactive, METH_VARARGS, (char*)"Execute a command and get it's output (stdout)"},
00257     {(char*)"attachClickArea", (PyCFunction)py_attach_clickArea, METH_VARARGS|METH_KEYWORDS, (char*)"Add a clickArea to the given text or image"},
00258     {(char*)"createClickArea", py_create_click_area, METH_VARARGS, (char*)"Create a Click Area Sensor"},
00259     {(char*)"getNumberOfDesktops", py_get_number_of_desktops, METH_VARARGS, (char*)"Get current number of virtual desktops"},
00260     {(char*)"getIp", py_get_ip, METH_VARARGS, (char*)"Get current host's IP address"},
00261     {(char*)"translateAll", py_translate_all, METH_VARARGS, (char*)"Translate all widgets in a theme"},
00262     {(char*)"show", py_show, METH_VARARGS, (char*)"Show theme"},
00263     {(char*)"hide", py_hide, METH_VARARGS, (char*)"Hide theme"},
00264 
00265     // Input Box - input_python.cpp
00266     {(char*)"createInputBox", py_createInputBox, METH_VARARGS,
00267         (char*)"Create new Input Box."},
00268     {(char*)"deleteInputBox", py_deleteInputBox, METH_VARARGS,
00269         (char*)"Delete Input Box."},
00270     {(char*)"getThemeInputBox", py_getThemeInputBox, METH_VARARGS,
00271         (char*)"Get Input Box from .theme using it's name."},
00272     {(char*)"getInputBoxValue", py_getInputBoxValue, METH_VARARGS,
00273         (char*)"Get Input Box value"},
00274     {(char*)"changeInputBox", py_setInputBoxValue, METH_VARARGS,
00275         (char*)"Change a Input Box Text"},
00276     {(char*)"hideInputBox", py_hideInputBox, METH_VARARGS,
00277         (char*)"Hide Input Box."},
00278     {(char*)"showInputBox", py_showInputBox, METH_VARARGS,
00279         (char*)"Show Input Box."},
00280     {(char*)"getInputBoxPos", py_getInputBoxPos, METH_VARARGS,
00281         (char*)"Get InputBox position."},
00282     {(char*)"moveInputBox", py_moveInputBox, METH_VARARGS,
00283         (char*)"Moves a Input Box"},
00284     {(char*)"getInputBoxSize", py_getInputBoxSize, METH_VARARGS,
00285         (char*)"Get the (width, height) of a Input Box"},
00286     {(char*)"resizeInputBox", py_resizeInputBox, METH_VARARGS,
00287         (char*)"Resize Input Box."},
00288     {(char*)"changeInputBoxFont", py_setInputBoxFont, METH_VARARGS,
00289         (char*)"Change a Input Box Font"},
00290     {(char*)"getInputBoxFont", py_getInputBoxFont, METH_VARARGS,
00291         (char*)"Get a Input Box Font"},
00292     {(char*)"changeInputBoxFontColor", py_setInputBoxFontColor, METH_VARARGS,
00293         (char*)"Change a Input Box Font Color"},
00294     {(char*)"getInputBoxFontColor", py_getInputBoxFontColor, METH_VARARGS,
00295         (char*)"Get a Input Box Font Color"},
00296     {(char*)"changeInputBoxSelectionColor", py_setInputBoxSelectionColor,
00297         METH_VARARGS, (char*)"Change a Input Box Selection Color"},
00298     {(char*)"getInputBoxSelectionColor", py_getInputBoxSelectionColor,
00299         METH_VARARGS, (char*)"Get a Input Box Selection Color"},
00300     {(char*)"changeInputBoxBackgroundColor", py_setInputBoxBGColor,
00301         METH_VARARGS, (char*)"Change a Input Box Background Color"},
00302     {(char*)"getInputBoxBackgroundColor", py_getInputBoxBGColor, METH_VARARGS,
00303         (char*)"Get a Input Box Background Color"},
00304     {(char*)"changeInputBoxFrameColor", py_setInputBoxFrameColor, METH_VARARGS,
00305         (char*)"Change a Input Box Frame Color"},
00306     {(char*)"getInputBoxFrameColor", py_getInputBoxFrameColor, METH_VARARGS,
00307         (char*)"Get a Input Box Frame Color"},
00308     {(char*)"changeInputBoxSelectedTextColor", py_setInputBoxSelectedTextColor,
00309         METH_VARARGS, (char*)"Change a Input Box Selected Text Color"},
00310     {(char*)"getInputBoxSelectedTextColor", py_getInputBoxSelectedTextColor,
00311         METH_VARARGS, (char*)"Get a Input Box Selected Text Color"},
00312     {(char*)"changeInputBoxFontSize", py_setInputBoxFontSize, METH_VARARGS,
00313         (char*)"Change a Input Box Font Size"},
00314     {(char*)"getInputBoxFontSize", py_getInputBoxFontSize, METH_VARARGS,
00315         (char*)"Get a Input Box Font Size"},
00316     {(char*)"setInputFocus", py_setInputFocus, METH_VARARGS,
00317         (char*)"Set the Input Focus to the Input Box"},
00318     {(char*)"clearInputFocus", py_clearInputFocus, METH_VARARGS,
00319         (char*)"Clear the Input Focus of the Input Box"},
00320     {(char*)"getInputFocus", py_getInputFocus, METH_VARARGS,
00321         (char*)"Get the Input Box currently focused"},
00322 
00323     {(char*)"setWidgetOnTop", py_set_widget_on_top, METH_VARARGS,
00324       (char*)"changes 'on top' status"},
00325     {(char*)"getSystraySize", py_get_systray_size, METH_VARARGS, 
00326       (char*)"Get the size of the Systray"},
00327     {(char*)"getPrettyThemeName", py_get_pretty_name, METH_VARARGS,  
00328       (char*)"Get the pretty name of the theme"},
00329     {(char*)"openNamedTheme", py_open_named_theme, METH_VARARGS, 
00330       (char*)"Open a new theme giving it a new name"},
00331     {(char*)"callTheme", py_call_theme, METH_VARARGS, 
00332       (char*)"Pass a string to another theme"},
00333     {(char*)"changeInterval", py_change_interval, METH_VARARGS, 
00334       (char*)"Change the refresh interval"},
00335     {(char*)"run", py_run_command, METH_VARARGS, 
00336       (char*)"Execute a command with KRun"},
00337     {(char*)"createServiceClickArea", py_create_service_click_area, METH_VARARGS, 
00338       (char*)"Create a Service-named Click Area Sensor"},
00339     {(char*)"removeClickArea", py_remove_click_area, METH_VARARGS, 
00340       (char*)"Remove a Click Area Sensor"},
00341     {(char*)"setUpdateTime", py_set_update_time, METH_VARARGS, 
00342       (char*)"Set last updated time"},
00343     {(char*)"getUpdateTime", py_get_update_time, METH_VARARGS, 
00344       (char*)"Get last updated time"},
00345     {(char*)"setWantRightButton", py_want_right_button, METH_VARARGS, 
00346       (char*)"Set to 1 to deactivate management popups"},
00347     {(char*)"setWantMeterWheelEvent", py_want_wheel_event, METH_VARARGS, 
00348       (char*)"Enables wheel events over meters."},
00349     {(char*)"managementPopup", py_management_popup, METH_VARARGS, 
00350       (char*)"Activates the Management Popup menu"},
00351 
00352   // service groups
00353     {(char*)"getServiceGroups", py_get_service_groups, METH_VARARGS, 
00354       (char*)"Get KDE Service Groups"},
00355 
00356     {NULL, NULL, 0 ,NULL}
00357 };
00358 
00359 #if PY_MAJOR_VERSION >= 3
00360 
00361 static int karamba_traverse(PyObject *m, visitproc visit, void *arg) {
00362     Py_VISIT(GETSTATE(m)->error);
00363     return 0;
00364 }
00365 
00366 static int karamba_clear(PyObject *m) {
00367     Py_CLEAR(GETSTATE(m)->error);
00368     return 0;
00369 }
00370 
00371 static struct PyModuleDef karambadef = {
00372         PyModuleDef_HEAD_INIT,
00373         "karamba",
00374         NULL,
00375         sizeof(struct module_state),
00376         karamba_methods,
00377         NULL,
00378         karamba_traverse,
00379         karamba_clear,
00380         NULL
00381 };
00382 
00383 #define INITERROR return NULL
00384 
00385 #else
00386 
00387 #define INITERROR return
00388 
00389 #endif
00390 
00391 PyThreadState* KarambaPython::mainThreadState = 0;
00392 
00393 KarambaPython::KarambaPython(const ThemeFile& theme, bool reloading):
00394   pythonThemeExtensionLoaded(false), pName(0), pModule(0), pDict(0)
00395 {
00396   PyThreadState* myThreadState;
00397   char pypath[1024];
00398 
00399   getLock(&myThreadState);
00400 
00401   // load the .py file for this .theme
00402   PyRun_SimpleString((char*)"import sys");
00403   //Add theme path to python path so that we can find the python file
00404   snprintf(pypath, 1023, "sys.path.insert(0, '%s')", theme.path().ascii());
00405   PyRun_SimpleString(pypath);
00406   PyRun_SimpleString((char*)"sys.path.insert(0, '')");
00407 
00408   PyImport_AddModule((char*)"karamba");
00409 #if PY_MAJOR_VERSION >= 3
00410   PyModule_Create(&karambadef);
00411 #else
00412   Py_InitModule((char*)"karamba", karamba_methods);
00413 #endif
00414   pName = PyBytes_FromString(theme.pythonModule().ascii());
00415   pModule = PyImport_Import(pName);
00416   
00417   fprintf(stderr, "%s\n", pypath);
00418   
00419   //Make sure the module is up to date.
00420   if (reloading)
00421     PyImport_ReloadModule(pModule);
00422 
00423   if (pModule != NULL)
00424   {
00425     pDict = PyModule_GetDict(pModule);
00426     if (pDict != NULL)
00427     {
00428       pythonThemeExtensionLoaded = true;
00429     }
00430   }
00431   else
00432   {
00433     PyErr_Print();
00434     fprintf(stderr,
00435             "------------------------------------------------------\n");
00436     fprintf(stderr, "What does ImportError mean?\n");
00437     fprintf(stderr, "\n");
00438     fprintf(stderr,
00439             "It means that I couldn't load a python add-on %s.py\n",
00440             theme.pythonModule().ascii());
00441     fprintf(stderr, "If this is a regular theme and doesn't use python\n");
00442     fprintf(stderr, "extensions, then nothing is wrong.\n");
00443     fprintf(stderr,
00444             "------------------------------------------------------\n");
00445   }
00446   releaseLock(myThreadState);
00447 }
00448 
00449 KarambaPython::~KarambaPython()
00450 {
00451   //Clean up Python references
00452   if (pythonThemeExtensionLoaded) {
00453     PyThreadState* myThreadState;
00454     getLock(&myThreadState);
00455 
00456     //Displose of current python module so we can reload in constructor.
00457     Py_DECREF(pModule);
00458     Py_DECREF(pName);
00459 
00460     releaseLock(myThreadState);
00461   }
00462 }
00463 
00464 void KarambaPython::initPython()
00465 {
00466   // initialize Python
00467   Py_Initialize();
00468 
00469   // initialize thread support
00470   PyEval_InitThreads();
00471 
00472   // save a pointer to the main PyThreadState object
00473   mainThreadState = PyThreadState_Get();
00474 
00475   // release the lock
00476   PyEval_ReleaseLock();
00477 }
00478 
00479 void KarambaPython::shutdownPython()
00480 {
00481   // shut down the interpreter
00482   PyInterpreterState * mainInterpreterState = mainThreadState->interp;
00483   // create a thread state object for this thread
00484   PyThreadState * myThreadState = PyThreadState_New(mainInterpreterState);
00485   PyThreadState_Swap(myThreadState);
00486   PyEval_AcquireLock();
00487   Py_Finalize();
00488 }
00489 
00490 void KarambaPython::getLock(PyThreadState** myThreadState)
00491 {
00492   // get the global lock
00493   PyEval_AcquireLock();
00494 
00495   // create a thread state object for this thread
00496   *myThreadState = PyThreadState_New(mainThreadState->interp);
00497   PyThreadState_Swap(*myThreadState);
00498 }
00499 
00500 void KarambaPython::releaseLock(PyThreadState* myThreadState)
00501 {
00502   // swap my thread state out of the interpreter
00503   PyThreadState_Swap(NULL);
00504   // clear out any cruft from thread state object
00505   PyThreadState_Clear(myThreadState);
00506   // delete my thread state object
00507   PyThreadState_Delete(myThreadState);
00508   // release the lock
00509   PyEval_ReleaseLock();
00510 }
00511 
00512 PyObject* KarambaPython::getFunc(const char* function)
00513 {
00514   PyObject* pFunc = PyDict_GetItemString(pDict, (char*)function);
00515   if (pFunc && PyCallable_Check(pFunc))
00516     return pFunc;
00517   return NULL;
00518 }
00519 
00520 bool KarambaPython::callObject(const char* func, PyObject* pArgs, bool lock)
00521 {
00522   bool result = false;
00523   PyThreadState* myThreadState;
00524 
00525   //tqDebug("Calling %s", func);
00526 
00527   if (lock)
00528     getLock(&myThreadState);
00529   PyObject* pFunc = getFunc(func);
00530 
00531   if (pFunc != NULL)
00532   {
00533     PyObject* pValue = PyObject_CallObject(pFunc, pArgs);
00534 
00535     if (pValue != NULL)
00536     {
00537       Py_DECREF(pValue);
00538       result = true;
00539     }
00540     else
00541     {
00542       tqWarning("Call to %s failed", func);
00543       PyErr_Print();
00544     }
00545   }
00546   Py_DECREF(pArgs);
00547   if (lock)
00548     releaseLock(myThreadState);
00549   return result;
00550 }
00551 
00552 bool KarambaPython::initWidget(karamba* k)
00553 {
00554   PyObject* pArgs = Py_BuildValue((char*)"(l)", k);
00555   return callObject("initWidget", pArgs);
00556 }
00557 
00558 bool KarambaPython::widgetUpdated(karamba* k)
00559 {
00560   PyObject* pArgs = Py_BuildValue((char*)"(l)", k);
00561   return callObject("widgetUpdated", pArgs);
00562 }
00563 
00564 bool KarambaPython::widgetClosed(karamba* k)
00565 {
00566   PyObject* pArgs = Py_BuildValue((char*)"(l)", k);
00567   return callObject("widgetClosed", pArgs);
00568 }
00569 
00570 bool KarambaPython::menuOptionChanged(karamba* k, TQString key, bool value)
00571 {
00572   PyObject* pArgs = Py_BuildValue((char*)"(lsi)", k, key.ascii(), (int)value);
00573   return callObject("menuOptionChanged", pArgs);
00574 }
00575 
00576 bool KarambaPython::menuItemClicked(karamba* k, TDEPopupMenu* menu, long id)
00577 {
00578   PyObject* pArgs = Py_BuildValue((char*)"(lll)", k, menu, id);
00579   return callObject("menuItemClicked", pArgs);
00580 }
00581 
00582 bool KarambaPython::meterClicked(karamba* k, Meter* meter, int button)
00583 {
00584   PyObject* pArgs = Py_BuildValue((char*)"(lli)", k, meter, button);
00585   return callObject("meterClicked", pArgs);
00586 }
00587 
00588 bool KarambaPython::meterClicked(karamba* k, TQString anchor, int button)
00589 {
00590   PyObject* pArgs = Py_BuildValue((char*)"(lsi)", k, anchor.ascii(), button);
00591   return callObject("meterClicked", pArgs);
00592 }
00593 
00594 bool KarambaPython::widgetClicked(karamba* k, int x, int y, int button)
00595 {
00596   PyObject* pArgs = Py_BuildValue((char*)"(liii)", k, x, y, button);
00597   return callObject("widgetClicked", pArgs);
00598 }
00599 
00600 bool KarambaPython::keyPressed(karamba* k, const Meter* meter,
00601                                const TQString& text)
00602 {
00603   PyObject* pArgs = Py_BuildValue((char*)"(lls)", k, meter, text.ucs2());
00604   return callObject("keyPressed", pArgs);
00605 }
00606 
00607 bool KarambaPython::widgetMouseMoved(karamba* k, int x, int y, int button)
00608 {
00609   PyObject* pArgs = Py_BuildValue((char*)"(liii)", k, x, y, button);
00610   return callObject("widgetMouseMoved", pArgs);
00611 }
00612 
00613 bool KarambaPython::activeTaskChanged(karamba* k, Task* t)
00614 {
00615   PyObject* pArgs = Py_BuildValue((char*)"(ll)", k, t);
00616   return callObject("activeTaskChanged", pArgs);
00617 }
00618 
00619 bool KarambaPython::taskAdded(karamba* k, Task* t)
00620 {
00621   PyObject* pArgs = Py_BuildValue((char*)"(ll)", k, t);
00622   return callObject("taskAdded", pArgs);
00623 }
00624 
00625 bool KarambaPython::taskRemoved(karamba* k, Task* t)
00626 {
00627   PyObject* pArgs = Py_BuildValue((char*)"(ll)", k, t);
00628   return callObject("taskRemoved", pArgs);
00629 }
00630 
00631 bool KarambaPython::startupAdded(karamba* k, Startup* t)
00632 {
00633   PyObject* pArgs = Py_BuildValue((char*)"(ll)", k, t);
00634   return callObject("startupAdded", pArgs);
00635 }
00636 
00637 bool KarambaPython::startupRemoved(karamba* k, Startup* t)
00638 {
00639   PyObject* pArgs = Py_BuildValue((char*)"(ll)", k, t);
00640   return callObject("startupRemoved", pArgs);
00641 }
00642 
00643 bool KarambaPython::commandOutput(karamba* k, int pid, char *buffer)
00644 {
00645   PyObject* pArgs = Py_BuildValue((char*)"(lis)", k, pid, buffer);
00646   return callObject("commandOutput", pArgs);
00647 }
00648 
00649 bool KarambaPython::commandFinished(karamba* k, int pid)
00650 {
00651   PyObject* pArgs = Py_BuildValue((char*)"(li)", k, pid);
00652   return callObject("commandFinished", pArgs);
00653 }
00654 
00655 bool KarambaPython::itemDropped(karamba* k, TQString text, int x, int y)
00656 {
00657   PyObject* pArgs = Py_BuildValue((char*)"(lOii)", k, TQString2PyString(text), x, y);
00658   return callObject("itemDropped", pArgs);
00659 }
00660 
00661 bool KarambaPython::themeNotify(karamba* k, const char *from, const char *str)
00662 {
00663   // WARNING WARNING WARNING i had to switch off thread locking to get
00664   // this to work.  callNotify is called from INSIDE another locked thread,
00665   // so can never complete because themeNotify will expect locking to be
00666   // released...
00667   //
00668   PyObject* pArgs = Py_BuildValue((char*)"(lss)", k, from, str);
00669   return callObject("themeNotify", pArgs, false);
00670 }
00671 
00672 bool KarambaPython::systrayUpdated(karamba* k)
00673 {
00674   PyObject* pArgs = Py_BuildValue((char*)"(l)", k);
00675   return callObject("systrayUpdated", pArgs);
00676 }
00677 
00678 bool KarambaPython::desktopChanged(karamba* k, int desktop)
00679 {
00680   PyObject* pArgs = Py_BuildValue((char*)"(li)", k, desktop);
00681   return callObject("desktopChanged", pArgs);
00682 }
00683 
00684 bool KarambaPython::wallpaperChanged(karamba* k, int desktop)
00685 {
00686   PyObject* pArgs = Py_BuildValue((char*)"(li)", k, desktop);
00687   return callObject("wallpaperChanged", pArgs);
00688 }

superkaramba

Skip menu "superkaramba"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

superkaramba

Skip menu "superkaramba"
  • kcalc
  •   knumber
  • superkaramba
Generated for superkaramba by doxygen 1.7.1
This website is maintained by Timothy Pearson.