void meta_stack_update_window_tile_matches (MetaStack *stack, MetaWorkspace *workspace) { GList *windows, *tmp; if (stack->freeze_count > 0) return; windows = meta_stack_list_windows (stack, workspace); tmp = windows; while (tmp) { meta_window_compute_tile_match ((MetaWindow *) tmp->data); tmp = tmp->next; } g_list_free (windows); }
//TODO: response to screen-changed? void deepin_workspace_overview_populate(DeepinWorkspaceOverview* self, MetaWorkspace* ws) { DeepinWorkspaceOverviewPrivate* priv = self->priv; priv->workspace = ws; GdkScreen* screen = gdk_screen_get_default(); priv->primary = gdk_screen_get_primary_monitor(screen); gint n_monitors = gdk_screen_get_n_monitors(screen); priv->monitors = g_ptr_array_new_full(n_monitors, monitor_data_destroy); for (int i = 0; i < n_monitors; i++) { MonitorData* md = monitor_data_new(); g_ptr_array_add(priv->monitors, md); md->monitor = i; md->clones = g_ptr_array_new(); gdk_screen_get_monitor_geometry(screen, i, (GdkRectangle*)&md->mon_rect); /** * gdk_screen_get_monitor_workarea fails to honor struts, so I have to use xinerama * to get correct workarea */ const MetaXineramaScreenInfo* xinerama = meta_screen_get_xinerama_for_rect(ws->screen, &md->mon_rect); meta_workspace_get_work_area_for_xinerama(ws, xinerama->number, (GdkRectangle*)&md->mon_workarea); } GList* ls = meta_stack_list_windows(ws->screen->stack, priv->all_window_mode? NULL: ws); GList* l = ls; while (l) { MetaWindow* win = (MetaWindow*)l->data; if (win->type == META_WINDOW_NORMAL) { if (priv->present_xids && g_hash_table_size(priv->present_xids)) { if (g_hash_table_contains(priv->present_xids, GINT_TO_POINTER(win->xwindow))) { _clone_window(self, win); } } else { _clone_window(self, win); } } l = l->next; } g_list_free(ls); { priv->close_button = gtk_event_box_new(); gtk_event_box_set_above_child(GTK_EVENT_BOX(priv->close_button), FALSE); gtk_event_box_set_visible_window(GTK_EVENT_BOX(priv->close_button), FALSE); GtkWidget* image = gtk_image_new_from_file(METACITY_PKGDATADIR "/close.png"); gtk_container_add(GTK_CONTAINER(priv->close_button), image); deepin_fixed_put(DEEPIN_FIXED(self), priv->close_button, 0, 0); gtk_widget_set_opacity(self->priv->close_button, 0.0); g_object_connect(G_OBJECT(priv->close_button), "signal::leave-notify-event", on_close_button_leaved, self, "signal::button-release-event", on_close_button_clicked, self, NULL); } priv->dock_height = 0; MetaWindow *desktop_win = NULL, *dock_win = NULL; GList* windows = priv->workspace->mru_list; while (windows != NULL) { MetaWindow *w = (MetaWindow*)windows->data; if (w->type == META_WINDOW_DESKTOP) { desktop_win = w; } if (w->type == META_WINDOW_DOCK) { dock_win = w; } if (desktop_win && dock_win) break; windows = windows->next; } for (int i = 0; i < n_monitors; i++) { MonitorData* md = (MonitorData*)g_ptr_array_index(priv->monitors, i); if (i == priv->primary) { MetaRectangle r1 = {0, 0, 0, 0}, r2 = {0, 0, 0, 0}; cairo_surface_t* aux1 = NULL, *aux2 = NULL; if (desktop_win) { meta_window_get_outer_rect(desktop_win, &r1); aux1 = deepin_window_surface_manager_get_surface(desktop_win, 1.0); r1.x -= md->mon_rect.x; r1.y -= md->mon_rect.y; meta_verbose ("%s: desktop offset(%d, %d)\n", __func__, r1.x, r1.y); } if (dock_win) { meta_window_get_outer_rect(dock_win, &r2); aux2 = deepin_window_surface_manager_get_surface(dock_win, 1.0); priv->dock_height = r2.height; r2.x -= md->mon_rect.x; r2.y -= md->mon_rect.y; meta_verbose ("%s: dock offset(%d, %d)\n", __func__, r2.x, r2.y); } md->desktop_surface = deepin_window_surface_manager_get_combined3( deepin_background_cache_get_surface(md->monitor, 1.0), aux1, r1.x, r1.y, aux2, r2.x, r2.y, 1.0); } else { md->desktop_surface = deepin_background_cache_get_surface(md->monitor, 1.0); cairo_surface_reference(md->desktop_surface); } } gtk_widget_queue_resize(GTK_WIDGET(self)); }