Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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
}