diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index a59ac66..9ab2535 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -457,10 +457,10 @@ void launcher_load_icons(Launcher *launcher) launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(DEFAULT_ICON); launcherIcon->icon_size = 1; launcherIcon->icon_tooltip = entry.name ? strdup(entry.name) : strdup(entry.exec); - free_desktop_entry(&entry); launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); add_area(&launcherIcon->area, (Area *)launcher); } + free_desktop_entry(&entry); app = g_slist_next(app); } } diff --git a/src/server.c b/src/server.c index cc06234..e252465 100644 --- a/src/server.c +++ b/src/server.c @@ -427,8 +427,10 @@ void server_get_number_of_desktops() XFree(x_screen_size); int num_viewports = MAX(x_screen_width / work_area_width, 1) * MAX(x_screen_height / work_area_height, 1); - if (num_viewports <= 1) + if (num_viewports <= 1) { + server.num_desktops = 1; return; + } server.viewports = calloc(num_viewports, sizeof(Viewport)); int k = 0; @@ -473,8 +475,9 @@ GSList *get_desktop_names() int get_current_desktop() { - if (!server.viewports) - return get_property32(server.root_win, server.atom._NET_CURRENT_DESKTOP, XA_CARDINAL); + if (!server.viewports) { + return MAX(0, MIN(server.num_desktops - 1, get_property32(server.root_win, server.atom._NET_CURRENT_DESKTOP, XA_CARDINAL))); + } int num_results; long *work_area_size = server_get_property(server.root_win, server.atom._NET_WORKAREA, XA_CARDINAL, &num_results); @@ -507,7 +510,8 @@ int get_current_desktop() // fprintf(stderr, "Viewport pos: %d x %d\n", viewport_x, viewport_y); // fprintf(stderr, "Viewport i: %d\n", (viewport_y / work_area_height) * ncols + viewport_x / work_area_width); - return (viewport_y / work_area_height) * ncols + viewport_x / work_area_width; + int result = (viewport_y / work_area_height) * ncols + viewport_x / work_area_width; + return MAX(0, MIN(server.num_desktops - 1, result)); } void change_desktop(int desktop) diff --git a/src/util/area.c b/src/util/area.c index f2c2122..0d599a2 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -378,12 +378,11 @@ void draw(Area *a) a->pix = XCreatePixmap(server.display, server.root_win, a->width, a->height, server.depth); a->pix_by_state[a->has_mouse_over_effect ? a->mouse_state : 0] = a->pix; - // Add layer of root pixmap (or clear pixmap if real_transparency==true) if (!a->_clear) { - clear_pixmap(a->pix, 0, 0, a->width, a->height); - if (!server.real_transparency) { - XCopyArea(server.display, ((Panel *)a->panel)->temp_pmap, a->pix, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); - } + // Add layer of root pixmap (or clear pixmap if real_transparency==true) + if (server.real_transparency) + clear_pixmap(a->pix, 0, 0, a->width, a->height); + XCopyArea(server.display, ((Panel *)a->panel)->temp_pmap, a->pix, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); } else { a->_clear(a); } diff --git a/src/util/window.c b/src/util/window.c index d44ec0a..97452fd 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -108,13 +108,17 @@ gboolean window_is_hidden(Window win) int get_window_desktop(Window win) { - if (!server.viewports) - return MAX(0, MIN(server.num_desktops - 1, get_property32(win, server.atom._NET_WM_DESKTOP, XA_CARDINAL))); + if (!server.viewports) { + int desktop = get_property32(win, server.atom._NET_WM_DESKTOP, XA_CARDINAL); + if (desktop != ALL_DESKTOPS) + desktop = MAX(0, MIN(server.num_desktops - 1, desktop)); + return desktop; + } int x, y, w, h; get_window_coordinates(win, &x, &y, &w, &h); - int desktop = MIN(get_current_desktop(), server.num_desktops - 1); + int desktop = get_current_desktop(); // Window coordinates are relative to the current viewport, make them absolute x += server.viewports[desktop].x; y += server.viewports[desktop].y;