static void wnck_pid_read_resource_usage_start_build_cache (GdkDisplay *gdisplay) { Display *xdisplay; int err; if (xres_idleid != 0) return; time (&start_update); xdisplay = GDK_DISPLAY_XDISPLAY (gdisplay); _wnck_error_trap_push (xdisplay); XResQueryClients (xdisplay, &xres_state.n_clients, &xres_state.clients); err = _wnck_error_trap_pop (xdisplay); if (err != Success) return; xres_state.next = (xres_state.n_clients > 0) ? 0 : -1; xres_state.xdisplay = xdisplay; xres_state.hashtable_pid = g_hash_table_new_full ( wnck_gulong_hash, wnck_gulong_equal, wnck_pid_read_resource_usage_free_hash, wnck_pid_read_resource_usage_free_hash); xres_idleid = g_idle_add_full ( G_PRIORITY_HIGH_IDLE, (GSourceFunc) wnck_pid_read_resource_usage_fill_cache, &xres_state, wnck_pid_read_resource_usage_xres_state_free); }
static void wnck_find_pid_for_resource_r (Display *xdisplay, Screen *screen, Window win_top, XID match_xid, XID mask, gulong *xid, gulong *pid) { Status qtres; int err; Window dummy; Window *children; guint n_children; int i; gulong found_pid = 0; while (gtk_events_pending ()) gtk_main_iteration (); found_pid = wnck_check_window_for_pid (screen, win_top, match_xid, mask); if (found_pid != 0) { *xid = win_top; *pid = found_pid; } _wnck_error_trap_push (xdisplay); qtres = XQueryTree (xdisplay, win_top, &dummy, &dummy, &children, &n_children); err = _wnck_error_trap_pop (xdisplay); if (!qtres || err != Success) return; for (i = 0; i < n_children; i++) { wnck_find_pid_for_resource_r (xdisplay, screen, children[i], match_xid, mask, xid, pid); if (*pid != 0) break; } if (children) XFree ((char *)children); }
void _wnck_get_wmclass (Window xwindow, char **res_class, char **res_name) { XClassHint ch; char UNUSED_VARIABLE *retval; _wnck_error_trap_push (); ch.res_name = NULL; ch.res_class = NULL; XGetClassHint (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xwindow, &ch); _wnck_error_trap_pop (); retval = NULL; if (res_class) *res_class = NULL; if (res_name) *res_name = NULL; if (ch.res_name) { if (res_name) *res_name = latin1_to_utf8 (ch.res_name); XFree (ch.res_name); } if (ch.res_class) { if (res_class) *res_class = latin1_to_utf8 (ch.res_class); XFree (ch.res_class); } }
/** * wnck_xid_read_resource_usage: * @gdk_display: a <classname>GdkDisplay</classname>. * @xid: an X window ID. * @usage: return location for the X resource usage of the application owning * the X window ID @xid. * * Looks for the X resource usage of the application owning the X window ID * @xid on display @gdisplay. If no resource usage can be found, then all * fields of @usage are set to 0. * * To properly work, this function requires the XRes extension on the X server. * * Since: 2.6 */ void wnck_xid_read_resource_usage (GdkDisplay *gdisplay, gulong xid, WnckResourceUsage *usage) { g_return_if_fail (usage != NULL); memset (usage, '\0', sizeof (*usage)); if (wnck_init_resource_usage (gdisplay) == WNCK_EXT_MISSING) return; #ifdef HAVE_XRES { Display *xdisplay; XResType *types; int n_types; unsigned long pixmap_bytes; int i; Atom pixmap_atom; Atom window_atom; Atom gc_atom; Atom picture_atom; Atom glyphset_atom; Atom font_atom; Atom colormap_entry_atom; Atom passive_grab_atom; Atom cursor_atom; types = NULL; n_types = 0; pixmap_bytes = 0; xdisplay = GDK_DISPLAY_XDISPLAY (gdisplay); _wnck_error_trap_push (xdisplay); XResQueryClientResources (xdisplay, xid, &n_types, &types); XResQueryClientPixmapBytes (xdisplay, xid, &pixmap_bytes); _wnck_error_trap_pop (xdisplay); usage->pixmap_bytes = pixmap_bytes; pixmap_atom = _wnck_atom_get ("PIXMAP"); window_atom = _wnck_atom_get ("WINDOW"); gc_atom = _wnck_atom_get ("GC"); font_atom = _wnck_atom_get ("FONT"); glyphset_atom = _wnck_atom_get ("GLYPHSET"); picture_atom = _wnck_atom_get ("PICTURE"); colormap_entry_atom = _wnck_atom_get ("COLORMAP ENTRY"); passive_grab_atom = _wnck_atom_get ("PASSIVE GRAB"); cursor_atom = _wnck_atom_get ("CURSOR"); i = 0; while (i < n_types) { int t = types[i].resource_type; if (t == pixmap_atom) usage->n_pixmaps += types[i].count; else if (t == window_atom) usage->n_windows += types[i].count; else if (t == gc_atom) usage->n_gcs += types[i].count; else if (t == picture_atom) usage->n_pictures += types[i].count; else if (t == glyphset_atom) usage->n_glyphsets += types[i].count; else if (t == font_atom) usage->n_fonts += types[i].count; else if (t == colormap_entry_atom) usage->n_colormap_entries += types[i].count; else if (t == passive_grab_atom) usage->n_passive_grabs += types[i].count; else if (t == cursor_atom) usage->n_cursors += types[i].count; else usage->n_other += types[i].count; ++i; } XFree(types); usage->total_bytes_estimate = usage->pixmap_bytes; /* FIXME look in the X server source and come up with better * answers here. Ideally we change XRes to return a number * like this since it can do things like divide the cost of * a shared resource among those sharing it. */ usage->total_bytes_estimate += usage->n_windows * 24; usage->total_bytes_estimate += usage->n_gcs * 24; usage->total_bytes_estimate += usage->n_pictures * 24; usage->total_bytes_estimate += usage->n_glyphsets * 24; usage->total_bytes_estimate += usage->n_fonts * 1024; usage->total_bytes_estimate += usage->n_colormap_entries * 24; usage->total_bytes_estimate += usage->n_passive_grabs * 24; usage->total_bytes_estimate += usage->n_cursors * 24; usage->total_bytes_estimate += usage->n_other * 24; } #else /* HAVE_XRES */ g_assert_not_reached (); #endif /* HAVE_XRES */ }