~cairo-dock-team/cairo-dock-core/popup_from_shortkey

« back to all changes in this revision

Viewing changes to src/gldit/cairo-dock-application-facility.c

  • Committer: Fabrice Rey
  • Date: 2013-06-04 22:58:28 UTC
  • Revision ID: fabounet03@gmail.com-20130604225828-x8lg3mv9135jr114
updated various parts of the core to the new API (new icons type, 'delete' method, simplified functions, etc)

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
18
*/
19
19
 
20
 
#include <math.h>
21
 
#include <string.h>
22
 
#include <cairo.h>
23
 
#include <stdlib.h>
24
 
 
25
 
#include <X11/Xlib.h>
26
 
#include <X11/Xatom.h>
27
 
#include <X11/Xutil.h>
28
 
#include <gdk/gdkx.h>
29
 
 
30
 
#include "cairo-dock-icon-facility.h"  // cairo_dock_set_icon_name
 
20
#include "cairo-dock-icon-facility.h"  // gldi_icon_set_name
31
21
#include "cairo-dock-dialog-factory.h"
32
22
#include "cairo-dock-animations.h"
33
23
#include "cairo-dock-surface-factory.h"
34
24
#include "cairo-dock-applications-manager.h"
 
25
#include "cairo-dock-launcher-manager.h"
 
26
#include "cairo-dock-separator-manager.h"
 
27
#include "cairo-dock-applet-manager.h"
 
28
#include "cairo-dock-stack-icon-manager.h"
35
29
#include "cairo-dock-windows-manager.h"
36
30
#include "cairo-dock-log.h"
37
31
#include "cairo-dock-dock-manager.h"
39
33
#include "cairo-dock-dock-facility.h"  // cairo_dock_update_dock_size
40
34
#include "cairo-dock-desktop-manager.h"
41
35
#include "cairo-dock-indicator-manager.h"  // myIndicatorsParam.bUseClassIndic
 
36
#include "cairo-dock-class-icon-manager.h"  // gldi_class_icon_new
42
37
#include "cairo-dock-application-facility.h"
43
38
 
44
39
extern CairoDock *g_pMainDock;
180
175
                }
181
176
                else
182
177
                {
183
 
                        cairo_dock_redraw_icon (icon, CAIRO_CONTAINER (pParentDock));  // Si pas d'animation, on le fait pour redessiner l'indicateur.
 
178
                        cairo_dock_redraw_icon (icon);  // Si pas d'animation, on le fait pour redessiner l'indicateur.
184
179
                }
185
180
                if (pParentDock->iRefCount != 0)  // l'icone est dans un sous-dock, on veut que l'indicateur soit aussi dessine sur l'icone pointant sur ce sous-dock.
186
181
                {
188
183
                        Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pParentDock, &pMainDock);
189
184
                        if (pPointingIcon && pMainDock)
190
185
                        {
191
 
                                cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pMainDock));  // on se contente de redessiner cette icone sans l'animer. Une facon comme une autre de differencier ces 2 cas.
192
 
                        }
193
 
                }
194
 
        }
195
 
}
196
 
 
197
 
 
198
 
static void _load_class_icon (Icon *icon)
199
 
{
200
 
        int iWidth = icon->iAllocatedWidth;
201
 
        int iHeight = icon->iAllocatedWidth;
202
 
        cairo_surface_t *pSurface = NULL;
203
 
        if (icon->pSubDock != NULL && !myIndicatorsParam.bUseClassIndic)  // icone de sous-dock avec un rendu specifique, on le redessinera lorsque les icones du sous-dock auront ete chargees.
204
 
        {
205
 
                pSurface = cairo_dock_create_blank_surface (iWidth, iHeight);
206
 
        }
207
 
        else
208
 
        {
209
 
                cd_debug ("%s (%dx%d)", __func__, iWidth, iHeight);
210
 
                pSurface = cairo_dock_create_surface_from_class (icon->cClass,
211
 
                        iWidth,
212
 
                        iHeight);
213
 
                if (pSurface == NULL)  // aucun inhibiteur ou aucune image correspondant a cette classe, on cherche a copier une des icones d'appli de cette classe.
214
 
                {
215
 
                        const GList *pApplis = cairo_dock_list_existing_appli_with_class (icon->cClass);
216
 
                        if (pApplis != NULL)
217
 
                        {
218
 
                                Icon *pOneIcon = (Icon *) (g_list_last ((GList*)pApplis)->data);  // on prend le dernier car les applis sont inserees a l'envers, et on veut avoir celle qui etait deja present dans le dock (pour 2 raison : continuite, et la nouvelle (en 1ere position) n'est pas forcement deja dans un dock, ce qui fausse le ratio).
219
 
                                cd_debug ("  load from %s (%dx%d)", pOneIcon->cName, iWidth, iHeight);
220
 
                                pSurface = cairo_dock_duplicate_inhibitor_surface_for_appli (pOneIcon,
221
 
                                        iWidth,
222
 
                                        iHeight);
223
 
                        }
224
 
                }
225
 
        }
226
 
        
227
 
        cairo_dock_load_image_buffer_from_surface (&icon->image, pSurface, iWidth, iHeight);
228
 
}
229
 
static Icon *cairo_dock_create_icon_for_class_subdock (Icon *pSameClassIcon, CairoDock *pClassDock)
230
 
{
231
 
        Icon *pFakeClassIcon = cairo_dock_new_icon ();
232
 
        pFakeClassIcon->iTrueType = CAIRO_DOCK_ICON_TYPE_CLASS_CONTAINER;
233
 
        pFakeClassIcon->iface.load_image = _load_class_icon;
234
 
        pFakeClassIcon->iGroup = pSameClassIcon->iGroup;
235
 
        
236
 
        pFakeClassIcon->cName = g_strdup (pSameClassIcon->cClass);
237
 
        pFakeClassIcon->cCommand = g_strdup (pSameClassIcon->cCommand);
238
 
        pFakeClassIcon->pMimeTypes = g_strdupv (pSameClassIcon->pMimeTypes);
239
 
        pFakeClassIcon->cClass = g_strdup (pSameClassIcon->cClass);
240
 
        pFakeClassIcon->fOrder = pSameClassIcon->fOrder;
241
 
        pFakeClassIcon->cParentDockName = g_strdup (pSameClassIcon->cParentDockName);
242
 
        pFakeClassIcon->bHasIndicator = pSameClassIcon->bHasIndicator;
243
 
        
244
 
        pFakeClassIcon->pSubDock = pClassDock;
245
 
        
246
 
        return pFakeClassIcon;
247
 
}
 
186
                                cairo_dock_redraw_icon (pPointingIcon);  // on se contente de redessiner cette icone sans l'animer. Une facon comme une autre de differencier ces 2 cas.
 
187
                        }
 
188
                }
 
189
        }
 
190
}
 
191
 
248
192
 
249
193
// this function is used when we have an appli that is not inhibited. we can place it either in its subdock or in the dock next to an inhibitor or in the main dock amongst the other applis
250
194
static CairoDock *_cairo_dock_set_parent_dock_name_for_appli (Icon *icon, CairoDock *pMainDock, const gchar *cMainDockName)
285
229
                        icon->cParentDockName = g_strdup (cairo_dock_get_class_subdock_name (icon->cClass));
286
230
                        
287
231
                        //\____________ link this sub-dock to the inhibitor, or to a fake appli icon.
288
 
                        if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pSameClassIcon) || CAIRO_DOCK_ICON_TYPE_IS_APPLET (pSameClassIcon))  // c'est un inhibiteur.
 
232
                        if (GLDI_OBJECT_IS_LAUNCHER_ICON (pSameClassIcon) || GLDI_OBJECT_IS_APPLET_ICON (pSameClassIcon))  // c'est un inhibiteur.
289
233
                        {
290
234
                                if (pSameClassIcon->pAppli != NULL)  // actuellement l'inhibiteur inhibe 1 seule appli.
291
235
                                {
299
243
                                                        CairoDock *pSameClassDock = gldi_dock_get (pSameClassIcon->cParentDockName);
300
244
                                                        if (pSameClassDock != NULL)
301
245
                                                        {
302
 
                                                                cairo_dock_set_icon_name (pSameClassIcon->cInitialName, pSameClassIcon, CAIRO_CONTAINER (pSameClassDock));  // on lui remet son nom de lanceur.
 
246
                                                                gldi_icon_set_name (pSameClassIcon, pSameClassIcon->cInitialName);  // on lui remet son nom de lanceur.
303
247
                                                        }
304
248
                                                }
305
249
                                                pSameClassIcon->pSubDock = pParentDock;
306
250
                                                CairoDock *pRootDock = gldi_dock_get (pSameClassIcon->cParentDockName);
307
251
                                                if (pRootDock != NULL)
308
 
                                                        cairo_dock_redraw_icon (pSameClassIcon, CAIRO_CONTAINER (pRootDock));  // on la redessine car elle prend l'indicateur de classe.
 
252
                                                        cairo_dock_redraw_icon (pSameClassIcon);  // on la redessine car elle prend l'indicateur de classe.
309
253
                                        }
310
254
                                        else if (pSameClassIcon->pSubDock != pParentDock)
311
255
                                                cd_warning ("this launcher (%s) already has a subdock, but it's not the class's subdock !", pSameClassIcon->cName);
325
269
                                //\______________ On cree une icone de paille.
326
270
                                cd_debug (" on cree un fake...");
327
271
                                CairoDock *pClassMateParentDock = gldi_dock_get (pSameClassIcon->cParentDockName);  // c'est en fait le main dock.
328
 
                                Icon *pFakeClassIcon = cairo_dock_create_icon_for_class_subdock (pSameClassIcon, pParentDock);
 
272
                                Icon *pFakeClassIcon = gldi_class_icon_new (pSameClassIcon, pParentDock);
329
273
                                
330
274
                                //\______________ On detache le classmate, on le place dans le sous-dock, et on lui substitue le faux.
331
275
                                cd_debug (" on detache %s pour la passer dans le sous-dock de sa classe", pSameClassIcon->cName);
338
282
                                cairo_dock_insert_icon_in_dock_full (pFakeClassIcon, pClassMateParentDock, ! CAIRO_DOCK_ANIMATE_ICON, ! CAIRO_DOCK_INSERT_SEPARATOR, NULL);
339
283
                                cairo_dock_redraw_container (CAIRO_CONTAINER (pClassMateParentDock));
340
284
                                
341
 
                                if (pFakeClassIcon->iSubdockViewType != 0)
 
285
                                ///if (pFakeClassIcon->iSubdockViewType != 0)
 
286
                                if (!myIndicatorsParam.bUseClassIndic)
342
287
                                        cairo_dock_trigger_redraw_subdock_content_on_icon (pFakeClassIcon);
343
288
                        }
344
289
                }
483
428
                                for (ic = pMainDock->icons; ic != NULL; ic = ic->next)
484
429
                                {
485
430
                                        pIcon = ic->data;
486
 
                                        if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pIcon)  // launcher, even without class
487
 
                                        || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pIcon)  // container icon (likely to contain some launchers)
488
 
                                        || (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pIcon) && pIcon->cClass != NULL)  // applet acting like a launcher
489
 
                                        || (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)))  // separator (user or auto).
 
431
                                        if (GLDI_OBJECT_IS_LAUNCHER_ICON (pIcon)  // launcher, even without class
 
432
                                        || GLDI_OBJECT_IS_STACK_ICON (pIcon)  // container icon (likely to contain some launchers)
 
433
                                        || (GLDI_OBJECT_IS_APPLET_ICON (pIcon) && pIcon->cClass != NULL)  // applet acting like a launcher
 
434
                                        || (GLDI_OBJECT_IS_SEPARATOR_ICON (pIcon)))  // separator (user or auto).
490
435
                                        {
491
436
                                                pLastLauncher = pIcon;
492
437
                                        }