#include <Imlib2.h>
#include <signal.h>
-#include "version.h"
+#include <version.h>
#include "server.h"
#include "window.h"
#include "config.h"
int i;
// set global data
+ default_config();
default_timeout();
default_systray();
memset(&server, 0, sizeof(Server_global));
+#ifdef ENABLE_BATTERY
default_battery();
+#endif
default_clock();
default_taskbar();
default_tooltip();
- default_config();
+ default_panel();
// read options
for (i = 1; i < argc; ++i) {
}
}
// Set signal handler
+ signal_pending = 0;
struct sigaction sa = { .sa_handler = signal_handler };
sigaction(SIGUSR1, &sa, 0);
sigaction(SIGINT, &sa, 0);
sigaction(SIGTERM, &sa, 0);
sigaction(SIGHUP, &sa, 0);
- signal(SIGCHLD, SIG_IGN); // don't have to wait() after fork()
+// signal(SIGCHLD, SIG_IGN); // don't have to wait() after fork()
- // BSD is too stupid to support pselect(), therefore we have to use select and hope that we do not
- // end up in a race condition there
+ // BSD does not support pselect(), therefore we have to use select and hope that we do not
+ // end up in a race condition there (see 'man select()' on a linux machine for more information)
// block all signals, such that no race conditions occur before pselect in our main loop
// sigset_t block_mask;
// sigaddset(&block_mask, SIGINT);
XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
setlocale (LC_ALL, "");
+ // config file use '.' as decimal separator
+ setlocale(LC_NUMERIC, "POSIX");
// load default icon
gchar *path;
void cleanup()
{
-printf("*** cleanup()\n");
cleanup_timeout();
cleanup_systray();
- stop_net();
cleanup_panel();
cleanup_tooltip();
cleanup_clock();
imlib_context_set_image(default_icon);
imlib_free_image();
}
+ imlib_context_disconnect_display();
cleanup_server();
if (server.dsp) XCloseDisplay(server.dsp);
}
imlib_save_image(path);
imlib_free_image();
- XFreePixmap(server.dsp, panel->temp_pmap);
}
}
task_drag = click_task(panel, e->xbutton.x, e->xbutton.y);
- XLowerWindow (server.dsp, panel->main_win);
+ if (panel_layer == BOTTOM_LAYER)
+ XLowerWindow (server.dsp, panel->main_win);
}
void event_button_motion_notify (XEvent *e)
if (wm_menu && !tint2_handles_click(panel, &e->xbutton)) {
forward_click(e);
- XLowerWindow (server.dsp, panel->main_win);
+ if (panel_layer == BOTTOM_LAYER)
+ XLowerWindow (server.dsp, panel->main_win);
task_drag = 0;
return;
}
if ( click_clock(panel, e->xbutton.x, e->xbutton.y)) {
clock_action(e->xbutton.button);
- XLowerWindow (server.dsp, panel->main_win);
+ if (panel_layer == BOTTOM_LAYER)
+ XLowerWindow (server.dsp, panel->main_win);
task_drag = 0;
return;
}
Taskbar *tskbar;
if ( !(tskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y)) ) {
// TODO: check better solution to keep window below
- XLowerWindow (server.dsp, panel->main_win);
+ if (panel_layer == BOTTOM_LAYER)
+ XLowerWindow (server.dsp, panel->main_win);
task_drag = 0;
return;
}
window_action( click_task(panel, e->xbutton.x, e->xbutton.y), action);
// to keep window below
- XLowerWindow (server.dsp, panel->main_win);
+ if (panel_layer == BOTTOM_LAYER)
+ XLowerWindow (server.dsp, panel->main_win);
}
{
// change in root window (xrandr)
if (win == server.root_win) {
- get_monitors();
- init_config();
- config_read_file (config_path);
- init_panel();
- cleanup_config();
+ signal_pending = SIGUSR1;
return;
}
GSList *it;
struct timeval* timeout;
+start:
init (argc, argv);
- init_config();
init_X11();
i = 0;
}
init_panel();
- cleanup_config();
if (snapshot_path) {
get_snapshot(snapshot_path);
cleanup();
autohide_trigger_show(panel);
else if (e.type == LeaveNotify)
autohide_trigger_hide(panel);
- if (panel->is_hidden)
- continue; // discard further processing of this event because the panel is not visible yet
+ if (panel->is_hidden) {
+ if (e.type == ClientMessage && e.xclient.message_type == server.atom.XdndPosition)
+ autohide_show(panel);
+ else
+ continue; // discard further processing of this event because the panel is not visible yet
+ }
}
switch (e.type) {
case UnmapNotify:
case DestroyNotify:
if (e.xany.window == server.composite_manager) {
- // TODO: Stop real_transparency
- //signal_pending = SIGUSR2;
+ // Stop real_transparency
+ signal_pending = SIGUSR1;
break;
}
if (e.xany.window == g_tooltip.window || !systray.area.on_screen)
ev = &e.xclient;
if (ev->data.l[1] == server.atom._NET_WM_CM_S0) {
if (ev->data.l[2] == None)
- // TODO: Stop real_transparency
- //signal_pending = SIGUSR2;
- ;
+ // Stop real_transparency
+ signal_pending = SIGUSR1;
else
- // TODO: Start real_transparency
- //signal_pending = SIGUSR2;
- ;
+ // Start real_transparency
+ signal_pending = SIGUSR1;
}
- if (!systray.area.on_screen) break;
- if (e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) {
+ if (systray.area.on_screen && e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) {
net_message(&e.xclient);
}
else if (e.xclient.message_type == server.atom.XdndPosition) {
callback_timeout_expired();
- switch (signal_pending) {
- case SIGUSR1: // reload config file
- signal_pending = 0;
- init_config();
- config_read_file (config_path);
- init_panel();
- cleanup_config();
- break;
- case SIGINT:
- case SIGTERM:
- case SIGHUP:
- cleanup ();
- return 0;
+ if (signal_pending) {
+ cleanup();
+ if (signal_pending == SIGUSR1) {
+ // restart tint2
+ // SIGUSR1 used when : user's signal, composite manager stop/start or xrandr
+ FD_CLR (x11_fd, &fdset); // not sure if needed
+ goto start;
+ }
+ else {
+ // SIGINT, SIGTERM, SIGHUP
+ return 0;
+ }
}
}
}