g_hash_table_remove_all(window_table);
}
+static gboolean get_window_info_from_window_stack_dbus(GVariantIter *iter,
+ struct proc_app_window_info *window, gchar **name)
+{
+ gint32 pid;
+ gint32 x;
+ gint32 y;
+ gint32 w;
+ gint32 h;
+ gint32 layer;
+ gint32 opaque;
+ gint32 visibility;
+ gboolean is_transformed;
+ gboolean alpha;
+ gboolean is_focused;
+ gboolean is_mapped;
+ gboolean ret;
+
+ assert(window);
+ assert(name);
+
+ ret = g_variant_iter_next(iter, "("VISIBLE_WINDOW_INFO_V2_VALUE_TYPE")",
+ &pid, &x, &y, &w, &h, &is_transformed, &alpha,
+ &opaque, &visibility, &is_focused,
+ &is_mapped, &layer, name);
+
+ if (!ret)
+ return ret;
+
+ window->pid = (int)pid;
+ window->x = (int)x;
+ window->y = (int)y;
+ window->w = (int)w;
+ window->h = (int)h;
+ window->is_transformed = (bool)is_transformed;
+ window->alpha = (bool)alpha;
+ window->opaque = (int)opaque;
+ window->visibility = (int)visibility;
+ window->is_focused = (bool)is_focused;
+ window->is_mapped = (bool)is_mapped;
+ window->layer = (int)layer;
+
+ return ret;
+}
+
static int dbus_update_window_stack(pid_t pid, bool has_focus)
{
static GHashTable *window_table = NULL;
if (pid == 0)
is_valid_window_stack = true;
- while (g_variant_iter_loop(iter, "("VISIBLE_WINDOW_INFO_V2_VALUE_TYPE")",
- &window.pid, &window.x, &window.y, &window.w, &window.h,
- &window.is_transformed, &window.alpha, &window.opaque,
- &window.visibility, &window.is_focused,
- &window.is_mapped, &window.layer, &name)) {
- ++z;
- window.z = z;
+ while (1) {
+ if (!get_window_info_from_window_stack_dbus(iter, &window, &name))
+ break;
if (!name) {
is_valid_window_stack = false;
break;
}
+ ++z;
+ window.z = z;
+
/**
* A process (same pid) can have more than one window,
* so Although current window's focus information is different