1 /**
2 * This file is a part of the Cairo-Dock project
3 *
4 * Copyright : (C) see the 'copyright' file.
5 * E-mail : see the 'copyright' file.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 //\________________ Add your name in the copyright file (and / or modify your name here)
21
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "applet-struct.h"
26 #include "applet-draw.h"
27 #include "applet-rss.h"
28 #include "applet-notifications.h"
29
30
_new_url_to_conf(GldiModuleInstance * myApplet,const gchar * cNewURL)31 static void _new_url_to_conf (GldiModuleInstance *myApplet, const gchar *cNewURL)
32 {
33 if (g_strstr_len (cNewURL, -1, "http") != NULL) // On verifie que l'element glisser/copier commence bien par http
34 {
35 cd_debug ("RSSreader-debug : This seems to be a valid URL -> Let's continue...");
36 // on definit la nouvelle URL en conf.
37 g_free (myConfig.cUrl);
38 myConfig.cUrl = g_strdup (cNewURL);
39 cairo_dock_update_conf_file (CD_APPLET_MY_CONF_FILE,
40 G_TYPE_STRING,
41 "Configuration",
42 "url_rss_feed",
43 myConfig.cUrl,
44 G_TYPE_INVALID); // On l'ecrit dans le fichier de config
45
46 // on remet a zero les items actuels.
47 CD_APPLET_SET_NAME_FOR_MY_ICON (NULL); // pour mettre a jour le titre par la meme occasion.
48
49 g_free (myData.PrevFirstTitle);
50 myData.PrevFirstTitle = NULL;
51 cd_rssreader_free_item_list (myApplet);
52
53 // on recupere le nouveau flux.
54 CDRssItem *pItem = g_new0 (CDRssItem, 1); // on commence au debut de la liste (c'est le titre).
55 myData.pItemList = g_list_prepend (myData.pItemList, pItem);
56 pItem->cTitle = g_strdup (D_("Retrieving data..."));
57 myData.bInit = FALSE;
58 myData.bError = FALSE;
59
60 if (myDesklet)
61 cd_applet_update_my_icon (myApplet);
62
63 cd_rssreader_launch_task (myApplet); // On lance l'upload pour mettre a jour notre applet
64 }
65 else
66 {
67 cd_debug ("RSSreader-debug : It doesn't seem to be a valid URL.");
68 gldi_dialogs_remove_on_icon (myIcon);
69 gldi_dialog_show_temporary_with_icon (D_("It doesn't seem to be a valid URL."),
70 myIcon,
71 myContainer,
72 3000, // Suffisant
73 MY_APPLET_SHARE_DATA_DIR"/"MY_APPLET_ICON_FILE);
74 }
75 }
76
_paste_new_url_to_conf(GtkMenuItem * menu_item,GldiModuleInstance * myApplet)77 static void _paste_new_url_to_conf (GtkMenuItem *menu_item, GldiModuleInstance *myApplet)
78 {
79 CD_APPLET_ENTER;
80 GtkClipboard *pClipBoardSelection = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
81 gchar *cEntry = gtk_clipboard_wait_for_text (pClipBoardSelection);
82 cd_debug ("RSSreader-debug : Paste from clipboard -> \"%s\"", cEntry);
83 _new_url_to_conf (myApplet, cEntry);
84 CD_APPLET_LEAVE ();
85 }
86
87 //\___________ Define here the action to be taken when the user left-clicks on your icon or on its subdock or your desklet. The icon and the container that were clicked are available through the macros CD_APPLET_CLICKED_ICON and CD_APPLET_CLICKED_CONTAINER. CD_APPLET_CLICKED_ICON may be NULL if the user clicked in the container but out of icons.
88 CD_APPLET_ON_CLICK_BEGIN
89 cd_rssreader_show_dialog (myApplet);
90 CD_APPLET_ON_CLICK_END
91
92
_update_feeds(GldiModuleInstance * myApplet)93 static inline void _update_feeds (GldiModuleInstance *myApplet)
94 {
95 myData.bUpdateIsManual = TRUE;
96 // on ne met pas de message d'attente pour conserver les items actuels, on prefere afficher un dialogue signalant ou pas une modification.
97 if (! gldi_task_is_running (myData.pTask)) // sinon on va bloquer jusqu'a ce que la tache courante se termine, pour la relancer aussitot, ce qui n'a aucun interet.
98 cd_rssreader_launch_task (myApplet);
99 }
100 CD_APPLET_ON_MIDDLE_CLICK_BEGIN
101 _update_feeds (myApplet);
102 CD_APPLET_ON_MIDDLE_CLICK_END
103
104
105 CD_APPLET_ON_DROP_DATA_BEGIN
106 cd_debug ("RSSreader-debug : \"%s\" was dropped", CD_APPLET_RECEIVED_DATA);
107 _new_url_to_conf (myApplet, CD_APPLET_RECEIVED_DATA);
108 CD_APPLET_ON_DROP_DATA_END
109
110
111 //\___________ Define here the entries you want to add to the menu when the user right-clicks on your icon or on its subdock or your desklet. The icon and the container that were clicked are available through the macros CD_APPLET_CLICKED_ICON and CD_APPLET_CLICKED_CONTAINER. CD_APPLET_CLICKED_ICON may be NULL if the user clicked in the container but out of icons. The menu where you can add your entries is available throught the macro CD_APPLET_MY_MENU; you can add sub-menu to it if you want.
_start_browser(GtkMenuItem * menu_item,GldiModuleInstance * myApplet)112 static void _start_browser (GtkMenuItem *menu_item, GldiModuleInstance *myApplet)
113 {
114 if (myConfig.cSpecificWebBrowser != NULL) // une commande specifique est fournie.
115 cairo_dock_launch_command_printf ("%s %s", NULL, myConfig.cSpecificWebBrowser, myConfig.cUrl);
116 else // sinon on utilise la commande par defaut.
117 cairo_dock_fm_launch_uri (myConfig.cUrl);
118 }
_refresh(GtkMenuItem * menu_item,GldiModuleInstance * myApplet)119 static void _refresh (GtkMenuItem *menu_item, GldiModuleInstance *myApplet)
120 {
121 _update_feeds (myApplet);
122 }
123 CD_APPLET_ON_BUILD_MENU_BEGIN
124 CD_APPLET_ADD_IN_MENU_WITH_STOCK (D_("Paste a new RSS Url (drag and drop)"), GLDI_ICON_NAME_PASTE, _paste_new_url_to_conf, CD_APPLET_MY_MENU);
125
126 if (myConfig.cUrl != NULL) // On ajoute une entrée dans le menu SI il y a une url seulement
127 {
128 CD_APPLET_ADD_IN_MENU_WITH_STOCK (D_("Open with your web browser"), GLDI_ICON_NAME_EXECUTE, _start_browser, CD_APPLET_MY_MENU);
129 gchar *cLabel = g_strdup_printf ("%s (%s)", D_("Refresh"), D_("middle-click"));
130 CD_APPLET_ADD_IN_MENU_WITH_STOCK (cLabel, GLDI_ICON_NAME_REFRESH, _refresh, CD_APPLET_MY_MENU);
131 g_free (cLabel);
132 }
133 CD_APPLET_ON_BUILD_MENU_END
134
135
_redraw_desklet_idle(GldiModuleInstance * myApplet)136 static gboolean _redraw_desklet_idle (GldiModuleInstance *myApplet)
137 {
138 CD_APPLET_ENTER;
139 cd_applet_update_my_icon (myApplet);
140 myData.iSidRedrawIdle = 0;
141 CD_APPLET_LEAVE (FALSE);
142 //return FALSE;
143 }
144 CD_APPLET_ON_SCROLL_BEGIN
145 if (! myDesklet)
146 CD_APPLET_LEAVE (GLDI_NOTIFICATION_LET_PASS);
147
148 myData.iFirstDisplayedItem += (CD_APPLET_SCROLL_UP ? -1 : 1);
149 if (myData.iFirstDisplayedItem < 0) // on a scrolle trop haut.
150 {
151 myData.iFirstDisplayedItem = 0;
152 CD_APPLET_LEAVE (GLDI_NOTIFICATION_LET_PASS);
153 }
154 else
155 {
156 int n = g_list_length (myData.pItemList) - 1; // la 1ere ligne est le titre.
157 if (myData.iFirstDisplayedItem > n - 1) // on a scrolle trop bas.
158 {
159 myData.iFirstDisplayedItem = n - 1;
160 CD_APPLET_LEAVE (GLDI_NOTIFICATION_LET_PASS);
161 }
162 }
163 if (myData.iSidRedrawIdle == 0) // on planifie un redessin pour quand la boucle principale sera accessible, de facon a éviter de la surcharger en cas de scroll rapide.
164 myData.iSidRedrawIdle = g_idle_add ((GSourceFunc)_redraw_desklet_idle, myApplet);
165 CD_APPLET_ON_SCROLL_END
166