/**
* This file is a part of the Cairo-Dock project
*
* Copyright : (C) see the 'copyright' file.
* E-mail : see the 'copyright' file.
*
* This program 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.
*
* This program 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 this program. If not, see .
*/
#include
#include
#include
#include
#include "cd-mail-applet-config.h"
#include "cd-mail-applet-notifications.h"
#include "cd-mail-applet-struct.h"
#include "cd-mail-applet-accounts.h"
#include "cd-mail-applet-etpan.h"
#include "cd-mail-applet-init.h"
CD_APPLET_DEFINE_BEGIN (N_("mail"),
2, 0, 0,
CAIRO_DOCK_CATEGORY_APPLET_INTERNET,
N_("This applet is very useful to warn you when you get new e-mails\n"
"It can check in any kind of mailbox (yahoo, gmail, etc)\n"
"Left-click to launch the prefered mail application,\n"
"Middle-click to refresh all the mailboxes."),
"Tofe (Christophe Chapuis) & Fabounet (Fabrice Rey)")
CD_APPLET_DEFINE_COMMON_APPLET_INTERFACE
pInterface->load_custom_widget = cd_mail_load_custom_widget;
pInterface->save_custom_widget = cd_mail_save_custom_widget;
CD_APPLET_DEFINE_END
GLuint cd_mail_load_cube_calllist (void)
{
GLuint iCallList = glGenLists (1);
glNewList(iCallList, GL_COMPILE); // Go pour la compilation de la display list
glPolygonMode (GL_FRONT, GL_FILL);
double a = .5 / sqrt (2);
glBegin(GL_QUADS);
// Front Face (note that the texture's corners have to match the quad's corners)
//glColor3f(1.0f,0.5f,0.0f);
glNormal3f(0,0,1);
glTexCoord2d(0., 0.); glVertex3f(-a, a, a); // Bottom Left Of The Texture and Quad
glTexCoord2d(1., 0.); glVertex3f( a, a, a); // Bottom Right Of The Texture and Quad
glTexCoord2d(1., 1.); glVertex3f( a, -a, a); // Top Right Of The Texture and Quad
glTexCoord2d(0., 1.); glVertex3f(-a, -a, a); // Top Left Of The Texture and Quad
// Back Face
glNormal3f(0,0,-1);
glTexCoord2d(1., 0.); glVertex3f( -a, a, -a); // Bottom Right Of The Texture and Quad
glTexCoord2d(1., 1.); glVertex3f( -a, -a, -a); // Top Right Of The Texture and Quad
glTexCoord2d(0., 1.); glVertex3f(a, -a, -a); // Top Left Of The Texture and Quad
glTexCoord2d(0., 0.); glVertex3f(a, a, -a); // Bottom Left Of The Texture and Quad
// Top Face
//glColor3f(1.0f,0.f,1.0f);
glNormal3f(0,1,0);
glTexCoord2d(0., 1.); glVertex3f(-a, a, a); // Top Left Of The Texture and Quad
glTexCoord2d(0., 0.); glVertex3f(-a, a, -a); // Bottom Left Of The Texture and Quad
glTexCoord2d(1., 0.); glVertex3f( a, a, -a); // Bottom Right Of The Texture and Quad
glTexCoord2d(1., 1.); glVertex3f( a, a, a); // Top Right Of The Texture and Quad
// Bottom Face
glNormal3f(0,-1,0);
glTexCoord2d(1., 1.); glVertex3f( a, -a, -a); // Top Right Of The Texture and Quad
glTexCoord2d(0., 1.); glVertex3f(-a, -a, -a); // Top Left Of The Texture and Quad
glTexCoord2d(0., 0.); glVertex3f(-a, -a, a); // Bottom Left Of The Texture and Quad
glTexCoord2d(1., 0.); glVertex3f( a, -a, a); // Bottom Right Of The Texture and Quad
// Right face
//glColor3f(0.f,0.5f,1.0f);
glNormal3f(1,0,0);
glTexCoord2d(1., 0.); glVertex3f( a, a, -a); // Bottom Right Of The Texture and Quad
glTexCoord2d(1., 1.); glVertex3f( a, -a, -a); // Top Right Of The Texture and Quad
glTexCoord2d(0., 1.); glVertex3f( a, -a, a); // Top Left Of The Texture and Quad
glTexCoord2d(0., 0.); glVertex3f( a, a, a); // Bottom Left Of The Texture and Quad
// Left Face
glNormal3f(-1,0,0);
glTexCoord2d(0., 0.); glVertex3f(-a, a, -a); // Bottom Left Of The Texture and Quad
glTexCoord2d(1., 0.); glVertex3f(-a, a, a); // Bottom Right Of The Texture and Quad
glTexCoord2d(1., 1.); glVertex3f(-a, -a, a); // Top Right Of The Texture and Quad
glTexCoord2d(0., 1.); glVertex3f(-a, -a, -a); // Top Left Of The Texture and Quad
glEnd();
glEndList(); // Fini la display list
return iCallList;
}
static void _load_theme (GldiModuleInstance *myApplet, GError **erreur)
{
//\_______________ On charge le theme si necessaire, avec en priorite les images utilisateur.
if (myConfig.cNoMailUserImage != NULL)
{
gchar *cPath = cairo_dock_search_icon_s_path (myConfig.cNoMailUserImage, MAX (myIcon->image.iWidth, myIcon->image.iHeight));
if (! g_file_test (cPath, G_FILE_TEST_EXISTS))
{
g_free (myConfig.cNoMailUserImage);
myConfig.cNoMailUserImage = NULL;
}
g_free (cPath);
}
if (myConfig.cHasMailUserImage != NULL)
{
gchar *cPath = cairo_dock_search_icon_s_path (myConfig.cHasMailUserImage, MAX (myIcon->image.iWidth, myIcon->image.iHeight));
if (! g_file_test (cPath, G_FILE_TEST_EXISTS))
{
g_free (myConfig.cHasMailUserImage);
myConfig.cHasMailUserImage = NULL;
}
g_free (cPath);
}
if (myConfig.cThemePath != NULL && (myConfig.cNoMailUserImage == NULL || myConfig.cHasMailUserImage == NULL))
{
GError *tmp_erreur = NULL;
GDir *dir = g_dir_open (myConfig.cThemePath, 0, &tmp_erreur);
if (tmp_erreur != NULL)
{
g_propagate_error (erreur, tmp_erreur);
return ;
}
const gchar *cElementName;
gchar *cElementPath;
while ((cElementName = g_dir_read_name (dir)) != NULL)
{
cElementPath = g_strdup_printf ("%s/%s", myConfig.cThemePath, cElementName);
cd_debug (" Mail theme item: %s", cElementPath);
if (strncmp (cElementName, "no_mail", 7) == 0 && myConfig.cNoMailUserImage == NULL)
{
myConfig.cNoMailUserImage = cElementPath;
}
else if (strncmp (cElementName, "has_mail", 8) == 0 && myConfig.cHasMailUserImage == NULL)
{
myConfig.cHasMailUserImage = cElementPath;
}
else if (strncmp (cElementName, "new_mail_sound", 14) == 0 && myConfig.cNewMailUserSound == NULL)
{
myConfig.cNewMailUserSound = cElementPath;
}
else
{
g_free (cElementPath);
}
}
g_dir_close (dir);
}
if (myConfig.cNoMailUserImage == NULL || myConfig.cHasMailUserImage == NULL || myConfig.cNewMailUserSound == NULL)
{
cd_warning ("mail : couldn't find images, this theme is not valid");
}
// textures et calllist.
if (myData.iNoMailTexture != 0)
{
_cairo_dock_delete_texture (myData.iNoMailTexture);
myData.iNoMailTexture = 0;
}
if (myData.iHasMailTexture != 0)
{
_cairo_dock_delete_texture (myData.iHasMailTexture);
myData.iHasMailTexture = 0;
}
if (CD_APPLET_MY_CONTAINER_IS_OPENGL && myDesklet)
{
if (myConfig.cNoMailUserImage != NULL)
myData.iNoMailTexture = cairo_dock_create_texture_from_image(myConfig.cNoMailUserImage);
if (myConfig.cHasMailUserImage != NULL)
myData.iHasMailTexture = cairo_dock_create_texture_from_image(myConfig.cHasMailUserImage);
if (myData.iCubeCallList == 0)
myData.iCubeCallList = cd_mail_load_cube_calllist();
}
// on cree le repertoire de l'historique si necessaire.
myData.cWorkingDirPath = g_strdup_printf ("%s/mail", g_cCairoDockDataDir);
if (! g_file_test (myData.cWorkingDirPath, G_FILE_TEST_EXISTS))
{
cd_debug ("Plugin Mail : le dossier '%s' n'existe pas encore -> On le cree", myData.cWorkingDirPath);
if (g_mkdir (myData.cWorkingDirPath, 7*8*8+7*8+0) != 0)
{
cd_warning ("couldn't create directory '%s' !\nNo read history will be available.", myData.cWorkingDirPath);
}
}
}
CD_APPLET_INIT_BEGIN
if (myDesklet)
{
CD_APPLET_SET_DESKLET_RENDERER ("Simple");
}
//\_______________ On charge surfaces et textures.
GError *erreur = NULL;
_load_theme (myApplet, &erreur);
if (erreur != NULL)
{
cd_warning ("mail : %s", erreur->message);
g_error_free (erreur);
return;
}
//\_______________ On initialise tous les comptes et on lance un timer pour chacun.
myData.iPrevNbUnreadMails = G_MAXUINT;
cd_mail_init_accounts(myApplet);
//\_______________ On s'abonne aux notifications.
CD_APPLET_REGISTER_FOR_CLICK_EVENT;
CD_APPLET_REGISTER_FOR_BUILD_MENU_EVENT;
CD_APPLET_REGISTER_FOR_MIDDLE_CLICK_EVENT;
CD_APPLET_REGISTER_FOR_SCROLL_EVENT;
if (CD_APPLET_MY_CONTAINER_IS_OPENGL && myDesklet)
{
CD_APPLET_REGISTER_FOR_UPDATE_ICON_EVENT;
}
CD_APPLET_INIT_END
CD_APPLET_STOP_BEGIN
//\_______________ On se desabonne de nos notifications.
CD_APPLET_UNREGISTER_FOR_CLICK_EVENT;
CD_APPLET_UNREGISTER_FOR_BUILD_MENU_EVENT;
CD_APPLET_UNREGISTER_FOR_MIDDLE_CLICK_EVENT;
CD_APPLET_UNREGISTER_FOR_SCROLL_EVENT;
CD_APPLET_UNREGISTER_FOR_UPDATE_ICON_EVENT;
///CD_APPLET_MANAGE_APPLICATION (NULL);
CD_APPLET_STOP_END
CD_APPLET_RELOAD_BEGIN
//\_______________ On recharge les donnees qui ont pu changer.
if (CD_APPLET_MY_CONFIG_CHANGED )
{
CD_APPLET_UNREGISTER_FOR_UPDATE_ICON_EVENT;
GError *erreur = NULL;
_load_theme (myApplet, &erreur);
if (erreur != NULL)
{
cd_warning ("mail : when trying to load theme : %s", erreur->message);
g_error_free (erreur);
erreur = NULL;
}
if (CD_APPLET_MY_CONTAINER_IS_OPENGL && myDesklet)
{
CD_APPLET_REGISTER_FOR_UPDATE_ICON_EVENT;
}
cd_mail_init_accounts(myApplet); // la config vient d'etre rechargee, donc les comptes sont tout neufs.
}
CD_APPLET_RELOAD_END