void autohide_hide(void* p) { Panel* panel = p; stop_autohide_timeout(panel); panel->is_hidden = 1; if (panel_strut_policy == STRUT_FOLLOW_SIZE) update_strut(p); XUnmapSubwindows(server.dsp, panel->main_win); // systray windows int diff = (panel_horizontal ? panel->area.height : panel->area.width) - panel_autohide_height; //printf("autohide_hide : diff %d, w %d, h %d\n", diff, panel->hidden_width, panel->hidden_height); if (panel_horizontal) { if (panel_position & TOP) XResizeWindow(server.dsp, panel->main_win, panel->hidden_width, panel->hidden_height); else XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy+diff, panel->hidden_width, panel->hidden_height); } else { if (panel_position & LEFT) XResizeWindow(server.dsp, panel->main_win, panel->hidden_width, panel->hidden_height); else XMoveResizeWindow(server.dsp, panel->main_win, panel->posx+diff, panel->posy, panel->hidden_width, panel->hidden_height); } panel_refresh = 1; }
void set_panel_window_geometry(Panel *panel) { update_strut(panel); // Fixed position and non-resizable window // Allow panel move and resize when tint2 reload config file int minwidth = panel_autohide ? panel->hidden_width : panel->area.width; int minheight = panel_autohide ? panel->hidden_height : panel->area.height; XSizeHints size_hints; size_hints.flags = PPosition | PMinSize | PMaxSize; size_hints.min_width = minwidth; size_hints.max_width = panel->area.width; size_hints.min_height = minheight; size_hints.max_height = panel->area.height; XSetWMNormalHints(server.display, panel->main_win, &size_hints); if (!panel->is_hidden) { if (panel_horizontal) { XMoveResizeWindow(server.display, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); } else { XMoveResizeWindow(server.display, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); } } else { int diff = (panel_horizontal ? panel->area.height : panel->area.width) - panel_autohide_height; if (panel_horizontal) { XMoveResizeWindow(server.display, panel->main_win, panel->posx, panel->posy + diff, panel->hidden_width, panel->hidden_height); } else { XMoveResizeWindow(server.display, panel->main_win, panel->posx + diff, panel->posy, panel->hidden_width, panel->hidden_height); } } }
void autohide_show(void* p) { Panel* panel = p; stop_autohide_timeout(panel); panel->is_hidden = 0; if (panel_strut_policy == STRUT_FOLLOW_SIZE) update_strut(p); XMapSubwindows(server.dsp, panel->main_win); // systray windows if (panel_horizontal) { if (panel_position & TOP) XResizeWindow(server.dsp, panel->main_win, panel->area.width, panel->area.height); else XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); } else { if (panel_position & LEFT) XResizeWindow(server.dsp, panel->main_win, panel->area.width, panel->area.height); else XMoveResizeWindow(server.dsp, panel->main_win, panel->posx, panel->posy, panel->area.width, panel->area.height); } refresh_systray = 1; // ugly hack, because we actually only need to call XSetBackgroundPixmap panel_refresh = 1; }
void set_panel_properties(Panel *p) { XStoreName (server.dsp, p->main_win, "tint2"); gsize len; gchar *name = g_locale_to_utf8("tint2", -1, NULL, &len, NULL); if (name != NULL) { XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); g_free(name); } // Dock long val = server.atom._NET_WM_WINDOW_TYPE_DOCK; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1); // Sticky and below other window val = ALLDESKTOP; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1); Atom state[4]; state[0] = server.atom._NET_WM_STATE_SKIP_PAGER; state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR; state[2] = server.atom._NET_WM_STATE_STICKY; state[3] = panel_layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE; int nb_atoms = panel_layer == NORMAL_LAYER ? 3 : 4; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nb_atoms); // Unfocusable XWMHints wmhints; if (panel_dock) { wmhints.icon_window = wmhints.window_group = p->main_win; wmhints.flags = StateHint | IconWindowHint; wmhints.initial_state = WithdrawnState; } else { wmhints.flags = InputHint; wmhints.input = False; } XSetWMHints(server.dsp, p->main_win, &wmhints); // Undecorated long prop[5] = { 2, 0, 0, 0, 0 }; XChangeProperty(server.dsp, p->main_win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5); // XdndAware - Register for Xdnd events int version=5; XChangeProperty(server.dsp, p->main_win, server.atom.XdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char*)&version, 1); update_strut(p); // Fixed position and non-resizable window // Allow panel move and resize when tint2 reload config file int minwidth = panel_autohide ? p->hidden_width : p->area.width; int minheight = panel_autohide ? p->hidden_height : p->area.height; XSizeHints size_hints; size_hints.flags = PPosition|PMinSize|PMaxSize; size_hints.min_width = minwidth; size_hints.max_width = p->area.width; size_hints.min_height = minheight; size_hints.max_height = p->area.height; XSetWMNormalHints(server.dsp, p->main_win, &size_hints); // Set WM_CLASS XClassHint* classhint = XAllocClassHint(); classhint->res_name = "tint2"; classhint->res_class = "Tint2"; XSetClassHint(server.dsp, p->main_win, classhint); XFree(classhint); }
void set_panel_properties(Panel *p) { XStoreName (server.dsp, p->main_win, panel_window_name); XSetIconName (server.dsp, p->main_win, panel_window_name); gsize len; gchar *name = g_locale_to_utf8(panel_window_name, -1, NULL, &len, NULL); if (name != NULL) { XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); XChangeProperty(server.dsp, p->main_win, server.atom._NET_WM_ICON_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len); g_free(name); } // Dock long val = panel_dock ? server.atom._NET_WM_WINDOW_TYPE_DOCK : server.atom._NET_WM_WINDOW_TYPE_SPLASH; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1); val = ALLDESKTOP; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1); Atom state[4]; state[0] = server.atom._NET_WM_STATE_SKIP_PAGER; state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR; state[2] = server.atom._NET_WM_STATE_STICKY; state[3] = panel_layer == BOTTOM_LAYER ? server.atom._NET_WM_STATE_BELOW : server.atom._NET_WM_STATE_ABOVE; int nb_atoms = panel_layer == NORMAL_LAYER ? 3 : 4; XChangeProperty (server.dsp, p->main_win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nb_atoms); XWMHints wmhints; memset(&wmhints, 0, sizeof(wmhints)); if (panel_dock) { // Necessary for placing the panel into the dock on Openbox and Fluxbox. // See https://code.google.com/p/tint2/issues/detail?id=465 wmhints.icon_window = wmhints.window_group = p->main_win; wmhints.flags = StateHint | IconWindowHint; wmhints.initial_state = WithdrawnState; } // We do not need keyboard input focus. wmhints.flags |= InputHint; wmhints.input = False; XSetWMHints(server.dsp, p->main_win, &wmhints); // Undecorated long prop[5] = { 2, 0, 0, 0, 0 }; XChangeProperty(server.dsp, p->main_win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5); // XdndAware - Register for Xdnd events Atom version=4; XChangeProperty(server.dsp, p->main_win, server.atom.XdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char*)&version, 1); update_strut(p); // Fixed position and non-resizable window // Allow panel move and resize when tint2 reload config file int minwidth = panel_autohide ? p->hidden_width : p->area.width; int minheight = panel_autohide ? p->hidden_height : p->area.height; XSizeHints size_hints; size_hints.flags = PPosition|PMinSize|PMaxSize; size_hints.min_width = minwidth; size_hints.max_width = p->area.width; size_hints.min_height = minheight; size_hints.max_height = p->area.height; XSetWMNormalHints(server.dsp, p->main_win, &size_hints); // Set WM_CLASS XClassHint* classhint = XAllocClassHint(); classhint->res_name = "tint2"; classhint->res_class = "Tint2"; XSetClassHint(server.dsp, p->main_win, classhint); XFree(classhint); }