OD_Window * od_wm_window_current_by_window_class_get(const char *name) { Eina_List *l = NULL; OD_Window *win = NULL; OD_Window *result = NULL; OD_Window *current = NULL; #if 0 printf("trying to find %s\n", name); #endif if ((current = evas_hash_find(clients_current, name)) == NULL) { for (l = clients; l; l = l->next) { if ((win = l->data)) { if (od_wm_iconified(win->id)) continue; if (win->applnk && win->applnk->data.applnk.winclass) { if (!strcmp(name, win->applnk->data.applnk.winclass)) { result = win; #if 0 fprintf(stderr, "%s(%8x)\n", name, win->id); #endif break; } } } } } return (result); }
OD_Window * od_wm_window_prev_by_window_class_get(const char *name) { Eina_List *l = NULL; Eina_List *tmp = NULL; Eina_List *last = NULL; OD_Window *win = NULL; OD_Window *result = NULL; OD_Window *current = NULL; if ((current = evas_hash_find(clients_current, name))) { clients_current = evas_hash_del(clients_current, name, current); for (l = clients; l; l = l->next) { if ((win = l->data)) { if (od_wm_iconified(win->id)) continue; if (win->applnk && win->applnk->data.applnk.winclass) { if (!strcmp(name, win->applnk->data.applnk.winclass)) { tmp = eina_list_append(tmp, win); } } } } for (l = tmp; l; l = l->next) { #if 0 fprintf(stderr, "%8x %8x\n", ((OD_Window *) l->data)->id, current->id); #endif if ((l->data == current) && (l->prev)) { result = l->prev->data; } } if (tmp) { last = eina_list_last(tmp); if (!result && last) result = last->data; } eina_list_free(tmp); } else { for (l = clients; l; l = l->next) { if ((win = l->data)) { if (win->applnk && win->applnk->data.applnk.winclass) { if (od_wm_iconified(win->id)) continue; if (!strcmp(name, win->applnk->data.applnk.winclass)) { result = win; #if 0 fprintf(stderr, "%s(%8x)\n", name, win->id); #endif break; } } } } } if (result) { clients_current = evas_hash_add(clients_current, name, result); } return (result); }
static void eina_bench_lookup_evas(int request) { Evas_Hash *hash = NULL; Eina_Array *array = NULL; int *tmp_val; Eina_Array_Iterator it; unsigned int i; unsigned int j; array = eina_array_new(10000); for (i = 0; i < (unsigned int)request; ++i) { char tmp_key[10]; tmp_val = malloc(sizeof (int)); if (!tmp_val) continue; eina_convert_itoa(i, tmp_key); *tmp_val = i; hash = evas_hash_add(hash, tmp_key, tmp_val); eina_array_push(array, tmp_val); } srand(time(NULL)); for (j = 0; j < 200; ++j) for (i = 0; i < (unsigned int)request; ++i) { char tmp_key[10]; eina_convert_itoa(rand() % request, tmp_key); tmp_val = evas_hash_find(hash, tmp_key); } evas_hash_free(hash); EINA_ARRAY_ITER_NEXT(array, i, tmp_val, it) free(tmp_val); eina_array_free(array); }
int od_sync_clients(void *data) { int num_clients; char *title = NULL; char *winclass = NULL; char buf[32]; OD_Window *owd = NULL; Eina_List *dirty = NULL; Eina_List *fresh = NULL; Eina_List *item = NULL; Eina_List *to_free = NULL; Ecore_X_Window *win = NULL; Ecore_X_Window *windows = NULL; dirty = clients; clients = NULL; windows = od_wm_get_clients(&num_clients); qsort(windows, num_clients, sizeof(Ecore_X_Window), od_window_id_comp); win = windows; while (num_clients--) { owd = NULL; if (!od_wm_ignored(*win)) { snprintf(buf, 32, "%8x", *win); if ((owd = evas_hash_find(clients_hash, buf))) { dirty = eina_list_remove(dirty, owd); if (!owd->minwin && od_wm_iconified(owd->id) && !options.ignore_min) { owd->minwin = od_icon_new_minwin(owd->id, od_wm_get_title(owd->id), od_wm_get_winclass(owd->id)); od_dock_add_minwin(owd->minwin); } else if (owd->minwin && !od_wm_iconified(owd->id)) { od_dock_del_icon(owd->minwin); owd->minwin = NULL; } else if (owd->minwin) { title = od_wm_get_title(owd->id); if (strcmp(title, owd->minwin->name) != 0) od_icon_name_change(owd->minwin, title); free(title); } } else { #if 0 fprintf(stderr, "New %8x window id\n", *win); #endif owd = (OD_Window *) malloc(sizeof(OD_Window)); memset(owd, 0, sizeof(OD_Window)); owd->id = *win; clients_hash = evas_hash_add(clients_hash, buf, owd); fresh = eina_list_append(fresh, owd); } clients = eina_list_append(clients, owd); } win++; } free(windows); /* pending windows that aren't present anymore */ to_free = dirty; while (dirty) { if (dirty->data) { owd = dirty->data; snprintf(buf, 32, "%8x", owd->id); #if 0 fprintf(stderr, "%s no longer exists\n", buf); #endif evas_hash_foreach(clients_current, od_wm_current_window_by_class_fix, owd); clients_hash = evas_hash_del(clients_hash, buf, owd); if (owd->minwin) od_dock_del_icon(owd->minwin); if ((owd->applnk) && (owd->applnk->data.applnk.count > 0)) { owd->applnk->data.applnk.count--; if (owd->applnk->data.applnk.count == 0) { od_icon_arrow_hide(owd->applnk); if (owd->applnk->launcher == 0) { od_dock_del_icon(owd->applnk); free(owd); } } } } dirty = dirty->next; } to_free = eina_list_free(to_free); to_free = fresh; while (fresh) { if (fresh->data) { owd = fresh->data; title = od_wm_get_title(owd->id); ecore_x_event_mask_set(owd->id, ECORE_X_EVENT_MASK_WINDOW_PROPERTY); winclass = od_wm_get_winclass(owd->id); item = dock.applnks; while (item) { OD_Icon *applnk = (OD_Icon *) item->data; if (applnk->data.applnk.winclass && strcmp(applnk->data.applnk.winclass, winclass) == 0) { owd->applnk = applnk; break; } item = item->next; } if (!owd->applnk) { owd->applnk = od_icon_new_applnk(od_icon_mapping_get(winclass), title, winclass); if (!options.ignore_run) od_dock_add_applnk(owd->applnk); } owd->applnk->data.applnk.count++; if (owd->applnk->data.applnk.count == 1) od_icon_arrow_show(owd->applnk); if (od_wm_iconified(owd->id) && !options.ignore_min) { owd->minwin = od_icon_new_minwin(owd->id, title, winclass); od_dock_add_minwin(owd->minwin); } #ifdef HAVE_IMLIB if (options.grab_app_icons) od_icon_grab(owd->applnk, owd->id); #endif free(title); free(winclass); } fresh->data = NULL; fresh = fresh->next; } to_free = eina_list_free(to_free); return 1; // keep going }