~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-3

« back to all changes in this revision

Viewing changes to src/cairo-dock-internal-position.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthieu Baerts (matttbe)
  • Date: 2010-08-09 23:26:12 UTC
  • mto: This revision was merged to the branch mainline in revision 13.
  • Revision ID: james.westby@ubuntu.com-20100809232612-pocdxliaxjdetm37
Tags: upstream-2.2.0~0beta4
ImportĀ upstreamĀ versionĀ 2.2.0~0beta4

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
#include "cairo-dock-modules.h"
21
 
#include "cairo-dock-dock-manager.h"
22
 
#include "cairo-dock-dock-factory.h"
23
 
#include "cairo-dock-dock-facility.h"
24
 
#include "cairo-dock-log.h"
25
 
#include "cairo-dock-X-utilities.h"
26
 
#include "cairo-dock-internal-accessibility.h"
27
 
#define _INTERNAL_MODULE_
28
 
#include "cairo-dock-internal-position.h"
29
 
 
30
 
CairoConfigPosition myPosition;
31
 
extern CairoDock *g_pMainDock;
32
 
 
33
 
static gboolean get_config (GKeyFile *pKeyFile, CairoConfigPosition *pPosition)
34
 
{
35
 
        gboolean bFlushConfFileNeeded = FALSE;
36
 
        
37
 
        pPosition->iGapX = cairo_dock_get_integer_key_value (pKeyFile, "Position", "x gap", &bFlushConfFileNeeded, 0, NULL, NULL);
38
 
        pPosition->iGapY = cairo_dock_get_integer_key_value (pKeyFile, "Position", "y gap", &bFlushConfFileNeeded, 0, NULL, NULL);
39
 
 
40
 
        pPosition->iScreenBorder = cairo_dock_get_integer_key_value (pKeyFile, "Position", "screen border", &bFlushConfFileNeeded, 0, NULL, NULL);
41
 
        if (pPosition->iScreenBorder >= CAIRO_DOCK_NB_POSITIONS)
42
 
                pPosition->iScreenBorder = 0;
43
 
 
44
 
        pPosition->fAlign = cairo_dock_get_double_key_value (pKeyFile, "Position", "alignment", &bFlushConfFileNeeded, 0.5, NULL, NULL);
45
 
        
46
 
        pPosition->bUseXinerama = cairo_dock_get_boolean_key_value (pKeyFile, "Position", "xinerama", &bFlushConfFileNeeded, 0, NULL, NULL);
47
 
        if (pPosition->bUseXinerama && ! cairo_dock_xinerama_is_available ())
48
 
        {
49
 
                cd_warning ("Sorry but either your X server does not have the Xinerama extension, or your version of Cairo-Dock was not built with the support of Xinerama.\n You can't place the dock on a particular screen");
50
 
                pPosition->bUseXinerama = FALSE;
51
 
        }
52
 
        if (pPosition->bUseXinerama)
53
 
                pPosition->iNumScreen = cairo_dock_get_integer_key_value (pKeyFile, "Position", "num screen", &bFlushConfFileNeeded, 0, NULL, NULL);
54
 
 
55
 
        return bFlushConfFileNeeded;
56
 
}
57
 
 
58
 
 
59
 
static void reload (CairoConfigPosition *pPrevPosition, CairoConfigPosition *pPosition)
60
 
{
61
 
        //g_print ("%s (%d;%d)\n", __func__, pPosition->iGapX, pPosition->iGapY);
62
 
        CairoDock *pDock = g_pMainDock;
63
 
        
64
 
        if (pPosition->bUseXinerama)
65
 
        {
66
 
                pDock->iNumScreen = pPosition->iNumScreen;
67
 
                cairo_dock_get_screen_offsets (pPosition->iNumScreen, &pDock->iScreenOffsetX, &pDock->iScreenOffsetY);
68
 
        }
69
 
        else
70
 
        {
71
 
                pDock->iNumScreen = pDock->iScreenOffsetX = pDock->iScreenOffsetY = 0;
72
 
        }
73
 
        
74
 
        if (pPosition->bUseXinerama != pPrevPosition->bUseXinerama || pPosition->iNumScreen != pPrevPosition->iNumScreen)
75
 
        {
76
 
                cairo_dock_reposition_root_docks (TRUE);  // on replace tous les docks racines sauf le main dock.
77
 
        }
78
 
        
79
 
        CairoDockTypeHorizontality bWasHorizontal = pDock->container.bIsHorizontal;
80
 
        if (pPosition->iScreenBorder != pPrevPosition->iScreenBorder)
81
 
        {
82
 
                switch (pPosition->iScreenBorder)
83
 
                {
84
 
                        case CAIRO_DOCK_BOTTOM :
85
 
                                pDock->container.bIsHorizontal = CAIRO_DOCK_HORIZONTAL;
86
 
                                pDock->container.bDirectionUp = TRUE;
87
 
                        break;
88
 
                        case CAIRO_DOCK_TOP :
89
 
                                pDock->container.bIsHorizontal = CAIRO_DOCK_HORIZONTAL;
90
 
                                pDock->container.bDirectionUp = FALSE;
91
 
                        break;
92
 
                        case CAIRO_DOCK_RIGHT :
93
 
                                pDock->container.bIsHorizontal = CAIRO_DOCK_VERTICAL;
94
 
                                pDock->container.bDirectionUp = TRUE;
95
 
                        break;
96
 
                        case CAIRO_DOCK_LEFT :
97
 
                                pDock->container.bIsHorizontal = CAIRO_DOCK_VERTICAL;
98
 
                                pDock->container.bDirectionUp = FALSE;
99
 
                        break;
100
 
                }
101
 
                cairo_dock_update_dock_size (pDock);  // si bHorizonalDock a change, la taille max a change aussi.
102
 
                cairo_dock_synchronize_sub_docks_position (pDock, FALSE);
103
 
                cairo_dock_reload_buffers_in_all_docks (TRUE);
104
 
        }
105
 
        else
106
 
                cairo_dock_update_dock_size (pDock);  // si l'ecran a change, la taille max a change aussi.
107
 
        
108
 
        pDock->iGapX = pPosition->iGapX;
109
 
        pDock->iGapY = pPosition->iGapY;
110
 
        pDock->fAlign = pPosition->fAlign;
111
 
        cairo_dock_calculate_dock_icons (pDock);
112
 
        cairo_dock_place_root_dock (pDock);
113
 
        if (bWasHorizontal != pDock->container.bIsHorizontal)
114
 
                pDock->container.iWidth --;  // la taille dans le referentiel du dock ne change pas meme si on change d'horizontalite, par contre la taille de la fenetre change. On introduit donc un biais ici pour forcer le configure-event a faire son travail, sinon ca fausse le redraw.
115
 
        gtk_widget_queue_draw (pDock->container.pWidget);
116
 
}
117
 
 
118
 
 
119
 
DEFINE_PRE_INIT (Position)
120
 
{
121
 
        pModule->cModuleName = "Position";
122
 
        pModule->cTitle = N_("Position");
123
 
        pModule->cIcon = "icon-position.png";
124
 
        pModule->cDescription = N_("Set the position of the main dock.");
125
 
        pModule->iCategory = CAIRO_DOCK_CATEGORY_SYSTEM;
126
 
        pModule->iSizeOfConfig = sizeof (CairoConfigPosition);
127
 
        pModule->iSizeOfData = 0;
128
 
        
129
 
        pModule->reload = (CairoDockInternalModuleReloadFunc) reload;
130
 
        pModule->get_config = (CairoDockInternalModuleGetConfigFunc) get_config;
131
 
        pModule->reset_config = NULL;
132
 
        pModule->reset_data = NULL;
133
 
        
134
 
        pModule->pConfig = (CairoInternalModuleConfigPtr) &myPosition;
135
 
        pModule->pData = NULL;
136
 
}