/* * Generic Monitor plugin for the Xfce4 panel * Main file for the Genmon plugin * Copyright (c) 2004 Roger Seguin * * Copyright (c) 2006 Julien Devemy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config_gui.h" #include "cmdspawn.h" #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #define PLUGIN_NAME "GenMon" #define BORDER 2 typedef GtkWidget *Widget_t; typedef struct param_t { /* Configurable parameters */ char acCmd[128]; /* Commandline to spawn */ int fTitleDisplayed; char acTitle[16]; uint32_t iPeriod_ms; char acFont[128]; } param_t; typedef struct conf_t { Widget_t wTopLevel; struct gui_t oGUI; /* Configuration/option dialog */ struct param_t oParam; } conf_t; typedef struct monitor_t { /* Plugin monitor */ Widget_t wEventBox; Widget_t wBox; Widget_t wImgBox; Widget_t wTitle; Widget_t wValue; Widget_t wImage; Widget_t wBar; Widget_t wButton; Widget_t wImgButton; char onClickCmd[256]; } monitor_t; typedef struct genmon_t { XfcePanelPlugin *plugin; unsigned int iTimerId; /* Cyclic update */ struct conf_t oConf; struct monitor_t oMonitor; char acValue[256]; /* Commandline resulting string */ } genmon_t; /**************************************************************/ static void ExecOnClickCmd (Widget_t p_wSc, void *p_pvPlugin) /* Execute the onClick Command */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct monitor_t *poMonitor = &(poPlugin->oMonitor); char result[256]; genmon_SpawnCmd (poMonitor->onClickCmd, result, sizeof (poMonitor->onClickCmd), 0); } /**************************************************************/ static int DisplayCmdOutput (struct genmon_t *p_poPlugin) /* Launch the command, get its output and display it in the panel-docked text field */ { static GtkTooltips *s_poToolTips = 0; struct param_t *poConf = &(p_poPlugin->oConf.oParam); struct monitor_t *poMonitor = &(p_poPlugin->oMonitor); char acToolTips[256]; int status; char *begin; char *end; int newVersion=0; if (!s_poToolTips) s_poToolTips = gtk_tooltips_new (); status = genmon_SpawnCmd (poConf->acCmd, p_poPlugin->acValue, sizeof (p_poPlugin->acValue), 1); if (status == -1) return (-1); /* Normally it's impossible to overflow the buffer because p_poPlugin->acValue is < 256 */ /* Test if the result is an Image or a Text */ begin=strstr(p_poPlugin->acValue, ""); end=strstr(p_poPlugin->acValue, ""); if ((begin != NULL) && (end != NULL) && (begin < end) && (end-begin < 256*sizeof(char))) { char buf[256]; /* Get the image path */ strncpy(buf, begin+5*sizeof(char), end-begin-5*sizeof(char)); buf[end-begin-5*sizeof(char)]='\0'; gtk_image_set_from_file (GTK_IMAGE (poMonitor->wImage), buf); gtk_image_set_from_file (GTK_IMAGE (poMonitor->wImgButton), buf); /* Test if the result has a clickable Image (button) */ begin=strstr(p_poPlugin->acValue, ""); end=strstr(p_poPlugin->acValue, ""); if ((begin != NULL) && (end != NULL) && (begin < end) && (end-begin < 256*sizeof(char))) { char buf[256]; /* Get the command path */ strncpy(buf, begin+7*sizeof(char), end-begin-7*sizeof(char)); buf[end-begin-7*sizeof(char)]='\0'; strcpy(poMonitor->onClickCmd, buf); gtk_widget_show (poMonitor->wButton); gtk_widget_show (poMonitor->wImgButton); gtk_widget_hide (poMonitor->wImage); } else { gtk_widget_hide (poMonitor->wButton); gtk_widget_hide (poMonitor->wImgButton); gtk_widget_show (poMonitor->wImage); } newVersion=1; } else gtk_widget_hide (poMonitor->wImage); /* Test if the result is a Text */ begin=strstr(p_poPlugin->acValue, ""); end=strstr(p_poPlugin->acValue, ""); if ((begin != NULL) && (end != NULL) && (begin < end) && (end-begin < 256*sizeof(char))) { char buf[256]; /* Get the text */ strncpy(buf, begin+5*sizeof(char), end-begin-5*sizeof(char)); buf[end-begin-5*sizeof(char)]='\0'; gtk_label_set_text (GTK_LABEL (poMonitor->wValue), buf); gtk_widget_show (poMonitor->wValue); newVersion=1; } else gtk_widget_hide (poMonitor->wValue); /* Test if the result is a Bar */ begin=strstr(p_poPlugin->acValue, ""); end=strstr(p_poPlugin->acValue, ""); if ((begin != NULL) && (end != NULL) && (begin < end) && (end-begin < 256*sizeof(char))) { char buf[256]; int value; /* Get the text */ strncpy(buf, begin+5*sizeof(char), end-begin-5*sizeof(char)); buf[end-begin-5*sizeof(char)]='\0'; value=atoi(buf); if (value>100) value=100; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(poMonitor->wBar), (float)value/100.0); gtk_widget_show (poMonitor->wBar); newVersion=1; } else gtk_widget_hide (poMonitor->wBar); if (newVersion == 0) { gtk_widget_show (poMonitor->wValue); gtk_label_set_text (GTK_LABEL (poMonitor->wValue), p_poPlugin->acValue); } /* Test if a ToolTip is given */ begin=strstr(p_poPlugin->acValue, ""); end=strstr(p_poPlugin->acValue, ""); if ((begin != NULL) && (end != NULL) && (begin < end) && (end-begin < 256*sizeof(char))) { strncpy(acToolTips, begin+6, end-begin-6); acToolTips[end-begin-6]='\0'; } else sprintf (acToolTips, "%s\n" "----------------\n" "%s\n" "Period (s): %d", poConf->acTitle, poConf->acCmd, poConf->iPeriod_ms / 1000); gtk_tooltips_set_tip (s_poToolTips, GTK_WIDGET (poMonitor->wEventBox), acToolTips, 0); return (0); }/* DisplayCmdOutput() */ /**************************************************************/ static gboolean SetTimer (void *p_pvPlugin) /* Recurrently update the panel-docked monitor through a timer */ /* Warning : should not be called directly (except the 1st time) */ /* To avoid multiple timers */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); DisplayCmdOutput (poPlugin); if (poPlugin->iTimerId == 0) { poPlugin->iTimerId = g_timeout_add (poConf->iPeriod_ms, (GSourceFunc) SetTimer, poPlugin); return FALSE; } return TRUE; }/* SetTimer() */ /**************************************************************/ static genmon_t *genmon_create_control (XfcePanelPlugin *plugin) /* Plugin API */ /* Create the plugin */ { struct genmon_t *poPlugin; struct param_t *poConf; struct monitor_t *poMonitor; int size = xfce_panel_plugin_get_size (plugin); poPlugin = g_new (genmon_t, 1); memset (poPlugin, 0, sizeof (genmon_t)); poConf = &(poPlugin->oConf.oParam); poMonitor = &(poPlugin->oMonitor); poPlugin->plugin = plugin; strcpy (poConf->acCmd, ""); strcpy (poConf->acTitle, "(genmon)"); poConf->fTitleDisplayed = 1; poConf->iPeriod_ms = 30 * 1000; poPlugin->iTimerId = 0; strcpy (poConf->acFont, "(default)"); poMonitor->wEventBox = gtk_event_box_new (); gtk_widget_show (poMonitor->wEventBox); xfce_panel_plugin_add_action_widget (plugin, poMonitor->wEventBox); if (xfce_panel_plugin_get_orientation (plugin) == GTK_ORIENTATION_HORIZONTAL) poMonitor->wBox = gtk_hbox_new (FALSE, 0); else poMonitor->wBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (poMonitor->wBox); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wBox), BORDER); gtk_container_add (GTK_CONTAINER (poMonitor->wEventBox), poMonitor->wBox); poMonitor->wTitle = gtk_label_new (poConf->acTitle); if (poConf->fTitleDisplayed) gtk_widget_show (poMonitor->wTitle); gtk_box_pack_start (GTK_BOX (poMonitor->wBox), GTK_WIDGET (poMonitor->wTitle), FALSE, FALSE, 0); /* Create a Box to put image and text * If panel size less < 25 place icon near the text */ if (size < 25) poMonitor->wImgBox = gtk_hbox_new (FALSE, 0); else poMonitor->wImgBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (poMonitor->wImgBox); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wImgBox), 0); gtk_container_add (GTK_CONTAINER (poMonitor->wBox), poMonitor->wImgBox); /* Add Image */ poMonitor->wImage = gtk_image_new (); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wImage), TRUE, FALSE, 0); /* Add Button */ /* * xfce_create_panel_button() look better instead of gtk_button_new () * poMonitor->wButton = gtk_button_new (); */ poMonitor->wButton = (Widget_t) xfce_create_panel_button (); gtk_widget_set_size_request (poMonitor->wButton, size, size); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wButton), TRUE, FALSE, 0); /* Add Image Button*/ poMonitor->wImgButton = gtk_image_new (); gtk_widget_set_size_request (poMonitor->wImgButton, size-1, size-1); gtk_container_add (GTK_CONTAINER (poMonitor->wButton), poMonitor->wImgButton); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wButton), 0); /* Add Value */ poMonitor->wValue = gtk_label_new (""); gtk_widget_show (poMonitor->wValue); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wValue), TRUE, FALSE, 0); /* Add Bar */ poMonitor->wBar = gtk_progress_bar_new(); gtk_box_pack_start (GTK_BOX (poMonitor->wBox), GTK_WIDGET (poMonitor->wBar), FALSE, FALSE, 0); /*gtk_widget_show (poMonitor->wBar);*/ if (xfce_panel_plugin_get_orientation (plugin) == GTK_ORIENTATION_HORIZONTAL) gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(poMonitor->wBar), GTK_PROGRESS_BOTTOM_TO_TOP); else gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(poMonitor->wBar), GTK_PROGRESS_LEFT_TO_RIGHT); return poPlugin; }/* genmon_create_control() */ /**************************************************************/ static void genmon_free (XfcePanelPlugin *plugin, genmon_t *poPlugin) /* Plugin API */ { TRACE ("genmon_free()\n"); if (poPlugin->iTimerId) g_source_remove (poPlugin->iTimerId); g_free (poPlugin); }/* genmon_free() */ /**************************************************************/ static int SetMonitorFont (void *p_pvPlugin) { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct monitor_t *poMonitor = &(poPlugin->oMonitor); struct param_t *poConf = &(poPlugin->oConf.oParam); const char *pcFont = poConf->acFont; PangoFontDescription *poFont; if (*pcFont == '(') /* Default font */ return (1); poFont = pango_font_description_from_string (poConf->acFont); if (!poFont) return (-1); gtk_widget_modify_font (poMonitor->wTitle, poFont); gtk_widget_modify_font (poMonitor->wValue, poFont); return (0); }/* SetMonitorFont() */ /**************************************************************/ /* Configuration Keywords */ #define CONF_USE_LABEL "UseLabel" #define CONF_LABEL_TEXT "Text" #define CONF_CMD "Command" #define CONF_UPDATE_PERIOD "UpdatePeriod" #define CONF_FONT "Font" /**************************************************************/ static void genmon_read_config (XfcePanelPlugin *plugin, genmon_t *poPlugin) /* Plugin API */ /* Executed when the panel is started - Read the configuration previously stored in xml file */ { struct param_t *poConf = &(poPlugin->oConf.oParam); struct monitor_t *poMonitor = &(poPlugin->oMonitor); const char *pc; char *file; XfceRc *rc; if (!(file = xfce_panel_plugin_lookup_rc_file (plugin))) return; rc = xfce_rc_simple_open (file, TRUE); g_free (file); if (!rc) return; if ((pc = xfce_rc_read_entry (rc, (CONF_CMD), NULL))) { memset (poConf->acCmd, 0, sizeof (poConf->acCmd)); strncpy (poConf->acCmd, pc, sizeof (poConf->acCmd) - 1); } poConf->fTitleDisplayed = xfce_rc_read_int_entry (rc, (CONF_USE_LABEL), 1); if (poConf->fTitleDisplayed) gtk_widget_show (GTK_WIDGET (poMonitor->wTitle)); else gtk_widget_hide (GTK_WIDGET (poMonitor->wTitle)); if ((pc = xfce_rc_read_entry (rc, (CONF_LABEL_TEXT), NULL))) { memset (poConf->acTitle, 0, sizeof (poConf->acTitle)); strncpy (poConf->acTitle, pc, sizeof (poConf->acTitle) - 1); gtk_label_set_text (GTK_LABEL (poMonitor->wTitle), poConf->acTitle); } poConf->iPeriod_ms = xfce_rc_read_int_entry (rc, (CONF_UPDATE_PERIOD), 30 * 1000); if ((pc = xfce_rc_read_entry (rc, (CONF_FONT), NULL))) { memset (poConf->acFont, 0, sizeof (poConf->acFont)); strncpy (poConf->acFont, pc, sizeof (poConf->acFont) - 1); } xfce_rc_close (rc); }/* genmon_read_config() */ /**************************************************************/ static void genmon_write_config (XfcePanelPlugin *plugin, genmon_t *poPlugin) /* Plugin API */ /* Write plugin configuration into xml file */ { struct param_t *poConf = &(poPlugin->oConf.oParam); XfceRc *rc; char *file; if (!(file = xfce_panel_plugin_save_location (plugin, TRUE))) return; rc = xfce_rc_simple_open (file, FALSE); g_free (file); if (!rc) return; TRACE ("genmon_write_config()\n"); xfce_rc_write_entry (rc, CONF_CMD, poConf->acCmd); xfce_rc_write_int_entry (rc, CONF_USE_LABEL, poConf->fTitleDisplayed); xfce_rc_write_entry (rc, CONF_LABEL_TEXT, poConf->acTitle); xfce_rc_write_int_entry (rc, CONF_UPDATE_PERIOD, poConf->iPeriod_ms); xfce_rc_write_entry (rc, CONF_FONT, poConf->acFont); xfce_rc_close (rc); }/* genmon_write_config() */ /**************************************************************/ static void SetCmd (Widget_t p_wTF, void *p_pvPlugin) /* GUI callback setting the command to be spawn, whose output will be displayed using the panel-docked monitor */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); const char *pcCmd = gtk_entry_get_text (GTK_ENTRY (p_wTF)); memset (poConf->acCmd, 0, sizeof (poConf->acCmd)); strncpy (poConf->acCmd, pcCmd, sizeof (poConf->acCmd) - 1); }/* SetCmd() */ /**************************************************************/ static void ToggleTitle (Widget_t p_w, void *p_pvPlugin) /* GUI callback turning on/off the monitor bar legend */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); struct gui_t *poGUI = &(poPlugin->oConf.oGUI); struct monitor_t *poMonitor = &(poPlugin->oMonitor); poConf->fTitleDisplayed = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (p_w)); gtk_widget_set_sensitive (GTK_WIDGET (poGUI->wTF_Title), poConf->fTitleDisplayed); if (poConf->fTitleDisplayed) gtk_widget_show (GTK_WIDGET (poMonitor->wTitle)); else gtk_widget_hide (GTK_WIDGET (poMonitor->wTitle)); }/* ToggleTitle() */ /**************************************************************/ static void SetLabel (Widget_t p_wTF, void *p_pvPlugin) /* GUI callback setting the legend of the monitor */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); struct monitor_t *poMonitor = &(poPlugin->oMonitor); const char *acTitle = gtk_entry_get_text (GTK_ENTRY (p_wTF)); memset (poConf->acTitle, 0, sizeof (poConf->acTitle)); strncpy (poConf->acTitle, acTitle, sizeof (poConf->acTitle) - 1); gtk_label_set_text (GTK_LABEL (poMonitor->wTitle), poConf->acTitle); }/* SetLabel() */ /**************************************************************/ static void SetPeriod (Widget_t p_wSc, void *p_pvPlugin) /* Set the update period - To be used by the timer */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); float r; TRACE ("SetPeriod()\n"); r = gtk_spin_button_get_value (GTK_SPIN_BUTTON (p_wSc)); poConf->iPeriod_ms = (r * 1000); }/* SetPeriod() */ /**************************************************************/ static void UpdateConf (void *p_pvPlugin) /* Called back when the configuration/options window is closed */ { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct conf_t *poConf = &(poPlugin->oConf); struct gui_t *poGUI = &(poConf->oGUI); TRACE ("UpdateConf()\n"); SetCmd (poGUI->wTF_Cmd, poPlugin); SetLabel (poGUI->wTF_Title, poPlugin); SetMonitorFont (poPlugin); /* Force to regenerate a timer */ poPlugin->iTimerId = 0; }/* UpdateConf() */ /**************************************************************/ static void About (Widget_t w, void *unused) /* Called back when the About button in clicked */ { xfce_info (_("%s %s - Generic Monitor\n" "Cyclically spawns a script/program, captures its output " "and displays the resulting string in the panel\n\n" "(c) 2004 Roger Seguin \n" "(c) 2006 Julien Devemy "), PACKAGE, VERSION); }/* About() */ /**************************************************************/ static void ChooseFont (Widget_t p_wPB, void *p_pvPlugin) { struct genmon_t *poPlugin = (genmon_t *) p_pvPlugin; struct param_t *poConf = &(poPlugin->oConf.oParam); Widget_t wDialog; const char *pcFont = poConf->acFont; int iResponse; wDialog = gtk_font_selection_dialog_new (_("Font Selection")); gtk_window_set_transient_for (GTK_WINDOW (wDialog), GTK_WINDOW (poPlugin->oConf.wTopLevel)); if (*pcFont != '(') /* Default font */ gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG (wDialog), pcFont); iResponse = gtk_dialog_run (GTK_DIALOG (wDialog)); if (iResponse == GTK_RESPONSE_OK) { pcFont = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG (wDialog)); if (pcFont && (strlen (pcFont) < sizeof (poConf->acFont) - 1)) { strcpy (poConf->acFont, pcFont); gtk_button_set_label (GTK_BUTTON (p_wPB), poConf->acFont); } } gtk_widget_destroy (wDialog); }/* ChooseFont() */ /**************************************************************/ static void genmon_dialog_response (GtkWidget *dlg, int response, genmon_t *genmon) { UpdateConf (genmon); gtk_widget_destroy (dlg); xfce_panel_plugin_unblock_menu (genmon->plugin); genmon_write_config (genmon->plugin, genmon); /* Do not wait the next timer to update display */ DisplayCmdOutput (genmon); } static void genmon_create_options (XfcePanelPlugin *plugin, genmon_t *poPlugin) /* Plugin API */ /* Create/pop up the configuration/options GUI */ { GtkWidget *dlg, *header, *vbox; struct param_t *poConf = &(poPlugin->oConf.oParam); struct gui_t *poGUI = &(poPlugin->oConf.oGUI); const char *pcFont = poConf->acFont; TRACE ("genmon_create_options()\n"); xfce_panel_plugin_block_menu (plugin); dlg = gtk_dialog_new_with_buttons (_("Configuration"), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL); g_signal_connect (dlg, "response", G_CALLBACK (genmon_dialog_response), poPlugin); gtk_container_set_border_width (GTK_CONTAINER (dlg), 2); header = xfce_create_header (NULL, _("Generic Monitor")); gtk_widget_set_size_request (GTK_BIN (header)->child, -1, 32); gtk_container_set_border_width (GTK_CONTAINER (header), BORDER - 2); gtk_widget_show (header); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), header, FALSE, TRUE, 0); vbox = gtk_vbox_new(FALSE, BORDER); gtk_container_set_border_width (GTK_CONTAINER (vbox), BORDER - 2); gtk_widget_show(vbox); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, TRUE, TRUE, 0); poPlugin->oConf.wTopLevel = dlg; (void) genmon_CreateConfigGUI (GTK_WIDGET (vbox), poGUI); g_signal_connect (GTK_WIDGET (poGUI->wPB_About), "clicked", G_CALLBACK (About), 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (poGUI->wTB_Title), poConf->fTitleDisplayed); gtk_widget_set_sensitive (GTK_WIDGET (poGUI->wTF_Title), poConf->fTitleDisplayed); g_signal_connect (GTK_WIDGET (poGUI->wTB_Title), "toggled", G_CALLBACK (ToggleTitle), poPlugin); gtk_entry_set_text (GTK_ENTRY (poGUI->wTF_Cmd), poConf->acCmd); g_signal_connect (GTK_WIDGET (poGUI->wTF_Cmd), "activate", G_CALLBACK (SetCmd), poPlugin); gtk_entry_set_text (GTK_ENTRY (poGUI->wTF_Title), poConf->acTitle); g_signal_connect (GTK_WIDGET (poGUI->wTF_Title), "activate", G_CALLBACK (SetLabel), poPlugin); gtk_spin_button_set_value (GTK_SPIN_BUTTON (poGUI->wSc_Period), ((double) poConf->iPeriod_ms / 1000)); g_signal_connect (GTK_WIDGET (poGUI->wSc_Period), "value_changed", G_CALLBACK (SetPeriod), poPlugin); if (*pcFont != '(') /* Default font */ gtk_button_set_label (GTK_BUTTON (poGUI->wPB_Font), poConf->acFont); g_signal_connect (G_OBJECT (poGUI->wPB_Font), "clicked", G_CALLBACK (ChooseFont), poPlugin); gtk_widget_show (dlg); }/* genmon_create_options() */ /**************************************************************/ static void genmon_set_orientation (XfcePanelPlugin *plugin, GtkOrientation p_iOrientation, genmon_t *poPlugin) /* Plugin API */ /* Invoked when the panel changes orientation */ { struct param_t *poConf = &(poPlugin->oConf.oParam); struct monitor_t *poMonitor = &(poPlugin->oMonitor); TRACE ("genmon_set_orientation()\n"); gtk_container_remove (GTK_CONTAINER (poMonitor->wEventBox), GTK_WIDGET (poMonitor->wBox)); if (p_iOrientation == GTK_ORIENTATION_HORIZONTAL) poMonitor->wBox = gtk_hbox_new (FALSE, 0); else poMonitor->wBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (poMonitor->wBox); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wBox), BORDER); gtk_container_add (GTK_CONTAINER (poMonitor->wEventBox), poMonitor->wBox); poMonitor->wTitle = gtk_label_new (poConf->acTitle); if (poConf->fTitleDisplayed) gtk_widget_show (poMonitor->wTitle); gtk_box_pack_start (GTK_BOX (poMonitor->wBox), GTK_WIDGET (poMonitor->wTitle), FALSE, FALSE, 0); /* Create a VBox to put image and text */ poMonitor->wImgBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (poMonitor->wImgBox); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wImgBox), 0); gtk_container_add (GTK_CONTAINER (poMonitor->wBox), poMonitor->wImgBox); /* Add Image */ poMonitor->wImage = gtk_image_new (); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wImage), TRUE, FALSE, 0); /* Add Button */ poMonitor->wButton = gtk_button_new (); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wButton), TRUE, FALSE, 0); /* Add Image Button*/ poMonitor->wImgButton = gtk_image_new (); gtk_container_add (GTK_CONTAINER (poMonitor->wButton), poMonitor->wImgButton); gtk_container_set_border_width (GTK_CONTAINER (poMonitor->wButton), 0); /* Add Value */ poMonitor->wValue = gtk_label_new (""); gtk_widget_show (poMonitor->wValue); gtk_box_pack_start (GTK_BOX (poMonitor->wImgBox), GTK_WIDGET (poMonitor->wValue), TRUE, FALSE, 0); /* Add Bar */ poMonitor->wBar = gtk_progress_bar_new(); gtk_box_pack_start (GTK_BOX (poMonitor->wBox), GTK_WIDGET (poMonitor->wBar), FALSE, FALSE, 0); /*gtk_widget_show (poMonitor->wBar);*/ if (p_iOrientation == GTK_ORIENTATION_HORIZONTAL) gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(poMonitor->wBar), GTK_PROGRESS_BOTTOM_TO_TOP); else gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(poMonitor->wBar), GTK_PROGRESS_LEFT_TO_RIGHT); SetMonitorFont (poPlugin); }/* genmon_set_orientation() */ /**************************************************************/ static gboolean genmon_set_size (XfcePanelPlugin *plugin, int size, genmon_t *poPlugin) /* Plugin API */ /* Set the size of the panel-docked monitor */ { struct monitor_t *poMonitor = &(poPlugin->oMonitor); if (xfce_panel_plugin_get_orientation (plugin) == GTK_ORIENTATION_HORIZONTAL) { if (size>BORDER) gtk_widget_set_size_request(GTK_WIDGET(poMonitor->wBar),8, size-BORDER*2); } else { if (size>BORDER) gtk_widget_set_size_request(GTK_WIDGET(poMonitor->wBar), size-BORDER*2, 8); } return TRUE; }/* genmon_set_size() */ /**************************************************************/ static void genmon_construct (XfcePanelPlugin *plugin) { genmon_t *genmon; xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); genmon = genmon_create_control (plugin); genmon_read_config (plugin, genmon); gtk_container_add (GTK_CONTAINER (plugin), genmon->oMonitor.wEventBox); SetMonitorFont (genmon); SetTimer (genmon); g_signal_connect (plugin, "free-data", G_CALLBACK (genmon_free), genmon); g_signal_connect (plugin, "save", G_CALLBACK (genmon_write_config), genmon); g_signal_connect (plugin, "orientation-changed", G_CALLBACK (genmon_set_orientation), genmon); g_signal_connect (plugin, "size-changed", G_CALLBACK (genmon_set_size), genmon); xfce_panel_plugin_menu_show_about (plugin); g_signal_connect (plugin, "about", G_CALLBACK (About), genmon); xfce_panel_plugin_menu_show_configure (plugin); g_signal_connect (plugin, "configure-plugin", G_CALLBACK (genmon_create_options), genmon); g_signal_connect (G_OBJECT (genmon->oMonitor.wButton), "clicked", G_CALLBACK (ExecOnClickCmd), genmon); } XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL (genmon_construct)