2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
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.
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/>.
20
/******************************************************************************
22
This file is a part of the cairo-dock program,
23
released under the terms of the GNU General Public License.
25
Written by Fabrice Rey (for any bug report, please mail me to fabounet@users.berlios.de)
27
******************************************************************************/
32
#include "applet-struct.h"
33
#include "applet-animation.h"
34
#include "applet-notifications.h"
37
#define PENGUIN_NB_MESSAGES 13
38
static gchar *s_pMessage[PENGUIN_NB_MESSAGES] = {
39
N_("Hey, I'm here !"),
40
N_("Sorry but I'm busy right now."),
41
N_("I don't have time to play with you, I have to dig and mine all these icons."),
42
N_("Your dock is so messy ! Let me clean it."),
43
N_("Admit my superiority on you as a penguin !"),
44
N_("Wait, do you want to kill me ?!"),
45
N_("Do you know how much painful it is to be clicked on ??"),
46
N_("It's my dock now, mwahahaha !"),
47
N_("I want to be a pirate !"),
48
N_("You shall not pass !"),
49
N_("I'm your father !"),
50
N_("- What will we do tonight Cortex ?\n- The same thing as every nights, Minus. Try to take over the Dock !"),
56
CD_APPLET_ON_CLICK_PROTO
58
PenguinAnimation *pAnimation = penguin_get_current_animation ();
59
if (penguin_is_resting (pAnimation))
60
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
62
if ((myConfig.bFree && pClickedContainer == myContainer && myDock->iMouseX > (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX && myDock->iMouseX < (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX + pAnimation->iFrameWidth && myDock->iMouseY > myContainer->iHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight && myDock->iMouseY < myContainer->iHeight - myData.iCurrentPositionY) || (! myConfig.bFree && pClickedIcon == myIcon))
64
myData.iCurrentPositionY = (myConfig.bFree ? g_iDockLineWidth : 0);
65
PenguinAnimation *pAnimation = penguin_get_current_animation ();
67
int iRandom = g_random_int_range (0, 4);
68
if (iRandom == 0) // 1 chance sur 4.
69
iNewAnimation = penguin_choose_go_up_animation (myApplet);
71
iNewAnimation = penguin_choose_next_animation (myApplet, pAnimation);
72
penguin_set_new_animation (myApplet, iNewAnimation);
74
cairo_dock_stop_icon_animation (pClickedIcon);
75
CD_APPLET_ON_CLICK_END
78
static void _start_xpenguins (GtkMenuItem *menu_item, gpointer *data)
80
cairo_dock_launch_command ("xpenguins");
82
static void _stop_xpenguins (GtkMenuItem *menu_item, gpointer *data)
84
cairo_dock_launch_command ("xpenguins-stop");
86
static void _keep_quiet (GtkMenuItem *menu_item, CairoDockModuleInstance *myApplet)
88
//\_______________ On arrete tout.
89
if (myData.iSidRestartDelayed != 0)
91
g_source_remove (myData.iSidRestartDelayed);
92
myData.iSidRestartDelayed = 0;
94
cairo_dock_remove_notification_func (CAIRO_DOCK_UPDATE_DOCK_SLOW, (CairoDockNotificationFunc) penguin_update_container, myApplet);
95
cairo_dock_remove_notification_func (CAIRO_DOCK_UPDATE_ICON_SLOW, (CairoDockNotificationFunc) penguin_update_icon, myApplet);
97
//\_______________ On met l'animation de repos et on la dessine.
98
int iNewAnimation = penguin_choose_resting_animation (myApplet);
99
penguin_set_new_animation (myApplet, iNewAnimation);
100
myData.iCurrentPositionY = (myConfig.bFree ? g_iDockLineWidth : 0);
103
penguin_move_in_dock (myApplet);
107
penguin_move_in_icon (myApplet);
110
static void _wake_up (GtkMenuItem *menu_item, CairoDockModuleInstance *myApplet)
112
penguin_start_animating (myApplet);
114
CD_APPLET_ON_BUILD_MENU_PROTO
116
PenguinAnimation *pAnimation = penguin_get_current_animation ();
117
if(pAnimation == NULL)
118
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
120
if ((myConfig.bFree && pClickedContainer == myContainer && myDock->iMouseX > (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX && myDock->iMouseX < (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX + pAnimation->iFrameWidth && myDock->iMouseY > myContainer->iHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight && myDock->iMouseY < myContainer->iHeight - myData.iCurrentPositionY) || (! myConfig.bFree && pClickedIcon == myIcon))
122
if (pClickedIcon != myIcon && ! (CAIRO_DOCK_IS_APPLET (pClickedIcon) && pClickedIcon->pModuleInstance->pModule == myIcon->pModuleInstance->pModule))
124
g_print ("%s\n", myApplet->cConfFilePath);
125
cairo_dock_notify (CAIRO_DOCK_BUILD_MENU, myIcon, myContainer, CD_APPLET_MY_MENU);
126
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
129
GtkWidget *pMenuItem, *image;
131
CD_APPLET_ADD_SEPARATOR_IN_MENU (CD_APPLET_MY_MENU);
133
GtkWidget *pModuleSubMenu = CD_APPLET_ADD_SUB_MENU (D_("Hey, you there !"), CD_APPLET_MY_MENU);
134
//GtkWidget *pModuleSubMenu = CD_APPLET_CREATE_MY_SUB_MENU ();
135
if (penguin_is_resting (pAnimation))
137
CD_APPLET_ADD_IN_MENU(D_("Wake up"), _wake_up, pModuleSubMenu);
141
CD_APPLET_ADD_IN_MENU(D_("Keep quiet"), _keep_quiet, pModuleSubMenu);
144
CD_APPLET_ADD_IN_MENU(D_("Start XPenguins"), _start_xpenguins, pModuleSubMenu);
145
CD_APPLET_ADD_IN_MENU(D_("Stop XPenguins"), _stop_xpenguins, pModuleSubMenu);
146
CD_APPLET_ADD_ABOUT_IN_MENU (pModuleSubMenu);
147
CD_APPLET_ON_BUILD_MENU_END
150
gboolean CD_APPLET_ON_MIDDLE_CLICK_FUNC (CairoDockModuleInstance *myApplet, Icon *pClickedIcon, CairoContainer *pClickedContainer)
152
PenguinAnimation *pAnimation = penguin_get_current_animation ();
153
if(pAnimation == NULL)
154
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
156
if ((myConfig.bFree && pClickedContainer == myContainer && myDock->iMouseX > (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX && myDock->iMouseX < (myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX + pAnimation->iFrameWidth && myDock->iMouseY > myContainer->iHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight && myDock->iMouseY < myContainer->iHeight - myData.iCurrentPositionY) || (! myConfig.bFree && pClickedIcon == myIcon))
158
if (myData.pDialog != NULL)
160
cairo_dock_dialog_unreference (myData.pDialog);
161
myData.pDialog = NULL;
163
PenguinAnimation *pAnimation = penguin_get_current_animation ();
164
if (penguin_is_resting (pAnimation))
166
Icon *pIcon = cairo_dock_get_pointed_icon (myDock->icons);
168
myData.pDialog = cairo_dock_show_temporary_dialog (D_("Zzzzz"), pIcon, myContainer, 2000);
170
myData.pDialog = cairo_dock_show_general_message (D_("Zzzzz"), 2000);
172
else if (! pAnimation->bEnding && myData.iSidRestartDelayed == 0)
174
int iRandom = g_random_int_range (0, 5); // [a;b[
175
if (iRandom == 0) // 1 chance sur 5.
177
int iNewAnimation = penguin_choose_ending_animation (myApplet);
178
penguin_set_new_animation (myApplet, iNewAnimation);
180
else if (iRandom == 1 && ! myConfig.bFree)
182
CD_APPLET_ANIMATE_MY_ICON ("bounce", 3);
183
myData.pDialog = cairo_dock_show_temporary_dialog ("Olllééééé !", myIcon, myContainer, 2500);
187
iRandom = g_random_int_range (0, PENGUIN_NB_MESSAGES); // [a;b[
188
Icon *pIcon = cairo_dock_get_pointed_icon (myDock->icons);
189
const gchar *cMessage = D_(s_pMessage[iRandom]);
190
int iDuration = 1000 + 25 * g_utf8_strlen (cMessage, -1);
192
myData.pDialog = cairo_dock_show_temporary_dialog (cMessage, pIcon, myContainer, iDuration);
194
myData.pDialog = cairo_dock_show_general_message (cMessage, iDuration);
197
CD_APPLET_ON_MIDDLE_CLICK_END