1 /* Workspace.c- workspace options
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 2012 Daniel Déchelotte (heavily inspired from file (c) Alfredo K. Kojima)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (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.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 typedef struct _Panel
{
31 CallbackRec callbacks
;
35 WMFrame
*autoDelayF
[2];
36 WMLabel
*autoDelayL
[4];
37 WMButton
*autoDelayB
[4][5];
38 WMTextField
*autoDelayT
[4];
44 #define ICON_FILE "dockclipdrawersection"
46 #define ARQUIVO_XIS "xis"
47 #define DELAY_ICON "timer%i"
48 #define DELAY_ICON_S "timer%is"
54 { "ClipAutoexpandDelay", N_("Delay before auto-expansion") },
55 { "ClipAutocollapseDelay", N_("Delay before auto-collapsing") },
56 { "ClipAutoraiseDelay", N_("Delay before auto-raise") },
57 { "ClipAutolowerDelay", N_("Delay before auto-lowering") }
61 static char *autoDelayPresetValues
[5] = { "0", "100", "250", "600", "1000" };
64 const char *disable_key
;
65 const char *icon_file
;
67 { "DisableDock", "dock" },
68 { "DisableClip", "clip" },
69 { "DisableDrawers", "drawer" }
72 static void showData(_Panel
*panel
);
73 static void storeData(_Panel
*panel
);
76 static void pushAutoDelayButton(WMWidget
*w
, void *data
)
78 _Panel
*panel
= (_Panel
*) data
;
80 for (i
= 0; i
< 4; i
++)
82 for (j
= 0; j
< 5; j
++)
84 if (w
== panel
->autoDelayB
[i
][j
])
86 WMSetTextFieldText(panel
->autoDelayT
[i
], autoDelayPresetValues
[j
]);
93 static void adjustButtonSelectionBasedOnValue(_Panel
*panel
, int row
, const char *value
)
100 for (j
= 0; j
< 5; j
++)
102 int isThatOne
= !strcmp(autoDelayPresetValues
[j
], value
);
103 WMSetButtonSelected(panel
->autoDelayB
[row
][j
], isThatOne
);
109 static void autoDelayChanged(void *observerData
, WMNotification
*notification
)
111 _Panel
*panel
= (_Panel
*) observerData
;
113 WMTextField
*anAutoDelayT
= (WMTextField
*) WMGetNotificationObject(notification
);
114 for (row
= 0; row
< 4; row
++)
116 if (anAutoDelayT
!= panel
->autoDelayT
[row
])
120 char *value
= WMGetTextFieldText(anAutoDelayT
);
121 adjustButtonSelectionBasedOnValue(panel
, row
, value
);
126 static void pushDockButton(WMWidget
*w
, void *data
)
128 _Panel
*panel
= (_Panel
*) data
;
129 WMButton
*button
= (WMButton
*) w
;
130 if (button
== panel
->docksB
[0] &&
131 !WMGetButtonSelected(panel
->docksB
[0]))
133 WMSetButtonSelected(panel
->docksB
[2], False
);
135 if (button
== panel
->docksB
[2] &&
136 WMGetButtonSelected(panel
->docksB
[2]))
138 WMSetButtonSelected(panel
->docksB
[0], True
);
142 static void createPanel(Panel
*p
)
144 _Panel
*panel
= (_Panel
*) p
;
145 WMScreen
*scr
= WMWidgetScreen(panel
->parent
);
146 WMPixmap
*icon1
, *icon2
;
148 RContext
*rc
= WMScreenRContext(scr
);
153 path
= LocateImage(ARQUIVO_XIS
);
155 xis
= RLoadImage(rc
, path
, 0);
157 wwarning(_("could not load image file %s"), path
);
162 panel
->box
= WMCreateBox(panel
->parent
);
163 WMSetViewExpandsToParent(WMWidgetView(panel
->box
), 2, 2, 2, 2);
165 /***************** Auto-delays *****************/
166 buf1
= wmalloc(strlen(DELAY_ICON
) + 1);
167 buf2
= wmalloc(strlen(DELAY_ICON_S
) + 1);
169 for (k
= 0; k
< 2; k
++)
171 panel
->autoDelayF
[k
] = WMCreateFrame(panel
->box
);
172 WMResizeWidget(panel
->autoDelayF
[k
], 365, 100);
173 WMMoveWidget(panel
->autoDelayF
[k
], 15, 10 + k
* 110);
175 WMSetFrameTitle(panel
->autoDelayF
[k
], _("Delays in milliseconds for autocollapsing clips"));
177 WMSetFrameTitle(panel
->autoDelayF
[k
], _("Delays in milliseconds for autoraising clips"));
179 for (i
= 0; i
< 2; i
++)
181 panel
->autoDelayL
[i
+ k
* 2] = WMCreateLabel(panel
->autoDelayF
[k
]);
182 WMResizeWidget(panel
->autoDelayL
[i
+ k
* 2], 165, 20);
183 WMMoveWidget(panel
->autoDelayL
[i
+ k
* 2], 10, 27 + 40 * i
);
184 WMSetLabelText(panel
->autoDelayL
[i
+ k
* 2], _(auto_delay
[i
+ k
* 2].string
));
185 WMSetLabelTextAlignment(panel
->autoDelayL
[i
+ k
* 2], WARight
);
187 for (j
= 0; j
< 5; j
++)
189 panel
->autoDelayB
[i
+ k
* 2][j
] = WMCreateCustomButton(panel
->autoDelayF
[k
], WBBStateChangeMask
);
190 WMResizeWidget(panel
->autoDelayB
[i
+ k
* 2][j
], 25, 25);
191 WMMoveWidget(panel
->autoDelayB
[i
+ k
* 2][j
], 175 + (25 * j
), 25 + 40 * i
);
192 WMSetButtonBordered(panel
->autoDelayB
[i
+ k
* 2][j
], False
);
193 WMSetButtonImagePosition(panel
->autoDelayB
[i
+ k
* 2][j
], WIPImageOnly
);
194 WMSetButtonAction(panel
->autoDelayB
[i
+ k
* 2][j
], pushAutoDelayButton
, panel
);
196 WMGroupButtons(panel
->autoDelayB
[i
+ k
* 2][0], panel
->autoDelayB
[i
+ k
* 2][j
]);
197 sprintf(buf1
, DELAY_ICON
, j
);
198 CreateImages(scr
, rc
, NULL
, buf1
, &icon1
, NULL
);
200 WMSetButtonImage(panel
->autoDelayB
[i
+ k
* 2][j
], icon1
);
201 WMReleasePixmap(icon1
);
203 wwarning(_("could not load icon file %s"), buf1
);
205 sprintf(buf2
, DELAY_ICON_S
, j
);
206 CreateImages(scr
, rc
, NULL
, buf2
, &icon2
, NULL
);
208 WMSetButtonAltImage(panel
->autoDelayB
[i
+ k
* 2][j
], icon2
);
209 WMReleasePixmap(icon2
);
211 wwarning(_("could not load icon file %s"), buf2
);
215 panel
->autoDelayT
[i
+ k
* 2] = WMCreateTextField(panel
->autoDelayF
[k
]);
216 WMResizeWidget(panel
->autoDelayT
[i
+ k
* 2], 36, 20);
217 WMMoveWidget(panel
->autoDelayT
[i
+ k
* 2], 310, 27 + 40 * i
);
218 WMAddNotificationObserver(autoDelayChanged
, panel
, WMTextDidChangeNotification
, panel
->autoDelayT
[i
+ k
* 2]);
221 WMMapSubwidgets(panel
->autoDelayF
[k
]);
226 /***************** Enable/disable clip/dock/drawers *****************/
227 panel
->dockF
= WMCreateFrame(panel
->box
);
228 WMResizeWidget(panel
->dockF
, 115, 210);
229 WMMoveWidget(panel
->dockF
, 390, 10);
230 WMSetFrameTitle(panel
->dockF
, _("Dock/Clip/Drawer"));
232 for (i
= 0; i
< 3; i
++)
234 panel
->docksB
[i
] = WMCreateButton(panel
->dockF
, WBTToggle
);
235 WMResizeWidget(panel
->docksB
[i
], 56, 56);
236 WMMoveWidget(panel
->docksB
[i
], 30, 20 + 62 * i
);
237 WMSetButtonImagePosition(panel
->docksB
[i
], WIPImageOnly
);
238 CreateImages(scr
, rc
, xis
, dock_config
[i
].icon_file
, &icon1
, &icon2
);
240 WMSetButtonImage(panel
->docksB
[i
], icon2
);
241 WMReleasePixmap(icon2
);
244 WMSetButtonAltImage(panel
->docksB
[i
], icon1
);
245 WMReleasePixmap(icon1
);
250 WMSetBalloonTextForView(_("Disable/enable the application Dock (the\n"
251 "vertical icon bar in the side of the screen)."), WMWidgetView(panel
->docksB
[i
]));
254 WMSetBalloonTextForView(_("Disable/enable the Clip (that thing with\n"
255 "a paper clip icon)."), WMWidgetView(panel
->docksB
[i
]));
258 WMSetBalloonTextForView(_("Disable/enable Drawers (a dock that stores\n"
259 "application icons horizontally). The dock is required."), WMWidgetView(panel
->docksB
[i
]));
262 WMSetButtonAction(panel
->docksB
[i
], pushDockButton
, panel
);
265 WMMapSubwidgets(panel
->dockF
);
270 WMRealizeWidget(panel
->box
);
271 WMMapSubwidgets(panel
->box
);
276 static void storeData(_Panel
*panel
)
279 for (i
= 0; i
< 4; i
++)
281 SetStringForKey(WMGetTextFieldText(panel
->autoDelayT
[i
]), auto_delay
[i
].key
);
283 for (i
= 0; i
< 3; i
++)
285 SetBoolForKey(!WMGetButtonSelected(panel
->docksB
[i
]), dock_config
[i
].disable_key
);
289 static void showData(_Panel
*panel
)
293 for (i
= 0; i
< 4; i
++)
295 value
= GetStringForKey(auto_delay
[i
].key
);
296 WMSetTextFieldText(panel
->autoDelayT
[i
], value
);
297 adjustButtonSelectionBasedOnValue(panel
, i
, value
);
299 for (i
= 0; i
< 3; i
++)
301 WMSetButtonSelected(panel
->docksB
[i
], !GetBoolForKey(dock_config
[i
].disable_key
));
305 Panel
*InitDocks(WMWidget
*parent
)
309 panel
= wmalloc(sizeof(_Panel
));
310 memset(panel
, 0, sizeof(_Panel
));
312 panel
->sectionName
= _("Dock Preferences");
314 panel
->description
= _("Dock and clip features.\n"
315 "Enable/disable the Dock and Clip, and tune some delays.");
317 panel
->parent
= parent
;
319 panel
->callbacks
.createWidgets
= createPanel
;
320 panel
->callbacks
.updateDomain
= storeData
;
322 AddSection(panel
, ICON_FILE
);