Esempio n. 1
0
File: grid.c Progetto: UIKit0/mctrl
static int
grid_alloc_row_heights(grid_t* grid, WORD old_row_count, WORD new_row_count,
                       BOOL cannot_fail)
{
    WORD* row_heights;

    row_heights = realloc(grid->row_heights, new_row_count * sizeof(WORD));
    if(MC_ERR(row_heights == NULL)) {
        MC_TRACE("grid_alloc_row_heights: realloc() failed.");
        mc_send_notify(grid->notify_win, grid->win, NM_OUTOFMEMORY);

        if(cannot_fail  &&  grid->row_heights != NULL) {
            /* We need to be sync'ed with the underlying table, and if we
             * cannot have enough slots, we just fallback to the default
             * heights. */
            free(grid->row_heights);
            grid->row_heights = NULL;
        }

        return -1;
    }

    /* Set new rows to the default heights. */
    if(new_row_count > old_row_count) {
        memset(&row_heights[old_row_count], 0xff,
               (new_row_count - old_row_count) * sizeof(WORD));
    }

    grid->row_heights = row_heights;
    return 0;
}
Esempio n. 2
0
static int
html_goto_url(html_t* html, const void* url, BOOL unicode)
{
    IWebBrowser2* browser_iface;
    HRESULT hr;
    VARIANT var;

    hr = html->browser_obj->lpVtbl->QueryInterface(html->browser_obj,
                    &IID_IWebBrowser2, (void**)&browser_iface);
    if(MC_ERR(hr != S_OK  ||  browser_iface == NULL)) {
        MC_TRACE("html_goto_url: QueryInterface(IID_IWebBrowser2) failed [0x%lx]", hr);
        return -1;
    }

    V_VT(&var) = VT_BSTR;

    if(url != NULL  &&  ((unicode && ((WCHAR*)url)[0] != L'\0') ||
                         (!unicode && ((char*)url)[0] != '\0'))) {
        V_BSTR(&var) = html_bstr(url, (unicode ? MC_STRW : MC_STRA));
        if(MC_ERR(var.bstrVal == NULL)) {
            MC_TRACE("html_goto_url: html_bstr() failed.");
            mc_send_notify(html->notify_win, html->win, NM_OUTOFMEMORY);
            return -1;
        }
    } else {
        V_BSTR(&var) = url_blank;
    }

    browser_iface->lpVtbl->Navigate2(browser_iface, &var, NULL, NULL, NULL, NULL);
    browser_iface->lpVtbl->Release(browser_iface);

    if(V_BSTR(&var) != url_blank)
        html_SysFreeString(var.bstrVal);

    return 0;
}
Esempio n. 3
0
static int
menubar_set_menu(menubar_t* mb, HMENU menu, BOOL is_refresh)
{
    BYTE* buffer = NULL;
    TBBUTTON* buttons;
    TCHAR* labels;
    int i, n;

    MENUBAR_TRACE("menubar_set_menu(%p, %p)", mb, menu);

    if(menu == mb->menu  &&  !is_refresh)
        return 0;

    /* If dropped down, cancel it */
    if(mb->pressed_item >= 0) {
        menubar_ht_disable(mb);
        MENUBAR_SENDMSG(mb->win, WM_CANCELMODE, 0, 0);
    }

    /* Uninstall the old menu */
    if(mb->menu != NULL) {
        n = MENUBAR_SENDMSG(mb->win, TB_BUTTONCOUNT, 0, 0);
        for(i = 0; i < n; i++)
            MENUBAR_SENDMSG(mb->win, TB_DELETEBUTTON, 0, 0);
        mb->menu = NULL;
    }

    /* Install the new menu */
    n = (menu != NULL ? GetMenuItemCount(menu) : 0);
    if(MC_ERR(n < 0)) {
        MC_TRACE("menubar_set_menu: GetMenuItemCount() failed.");
        return -1;
    }

    if(n == 0) {
        mb->menu = menu;
        return 0;
    }

    buffer = (BYTE*) _malloca(n * sizeof(TBBUTTON) +
                              n * sizeof(TCHAR) * MENUBAR_ITEM_LABEL_MAXSIZE);
    if(MC_ERR(buffer == NULL)) {
        MC_TRACE("menubar_set_menu: _malloca() failed.");
        mc_send_notify(mb->notify_win, mb->win, NM_OUTOFMEMORY);
        return -1;
    }
    buttons = (TBBUTTON*) buffer;
    labels = (TCHAR*) (buffer + n * sizeof(TBBUTTON));

    memset(buttons, 0, n * sizeof(TBBUTTON));

    for(i = 0; i < n; i++) {
        UINT state;
        state = GetMenuState(menu, i, MF_BYPOSITION);

        buttons[i].iBitmap = I_IMAGENONE;
        buttons[i].fsState = 0;
        if(!(state & (MF_DISABLED | MF_GRAYED)))
            buttons[i].fsState |= TBSTATE_ENABLED;
        if((state & (MF_MENUBREAK | MF_MENUBARBREAK)) && i > 0)
            buttons[i-1].fsState |= TBSTATE_WRAP;

        if(state & MF_POPUP) {
            TCHAR* label = labels + i * MENUBAR_ITEM_LABEL_MAXSIZE;
            GetMenuString(menu, i, label, MENUBAR_ITEM_LABEL_MAXSIZE, MF_BYPOSITION);

            buttons[i].fsStyle = BTNS_AUTOSIZE | BTNS_DROPDOWN | BTNS_SHOWTEXT;
            buttons[i].dwData = i;
            buttons[i].iString = (INT_PTR) label;
            buttons[i].idCommand = i;
        } else {
            buttons[i].dwData = 0xffff;
            buttons[i].idCommand = 0xffff;
            if(state & MF_SEPARATOR) {
                buttons[i].fsStyle = BTNS_SEP;
                buttons[i].iBitmap = MENUBAR_SEPARATOR_WIDTH;
            }
        }
    }

    MENUBAR_SENDMSG(mb->win, TB_ADDBUTTONS, n, buttons);
    mb->menu = menu;
    _freea(buffer);
    return 0;
}
Esempio n. 4
0
static int
html_set_element_contents(html_t* html, const void* id, const void* contents,
                          BOOL unicode)
{
    BSTR bstr_id;
    BSTR bstr_contents;
    IWebBrowser2* browser_iface;
    IDispatch* dispatch_iface;
    IHTMLDocument3* doc_iface;
    IHTMLElement* elem_iface;
    HRESULT hr;
    int res = -1;

    if(MC_ERR(id == NULL  ||  (unicode && ((WCHAR*)id)[0] == L'\0')  ||
                              (!unicode && ((char*)id)[0] == '\0'))) {
        MC_TRACE("html_set_element_contents: Empty element ID.");
        SetLastError(ERROR_INVALID_PARAMETER);
        goto err_id;
    }
    bstr_id = html_bstr(id, (unicode ? MC_STRW : MC_STRA));
    if(MC_ERR(bstr_id == NULL)) {
        MC_TRACE("html_set_element_contents: html_bstr(id) failed.");
        mc_send_notify(html->notify_win, html->win, NM_OUTOFMEMORY);
        goto err_id;
    }

    bstr_contents = html_bstr(contents, (unicode ? MC_STRW : MC_STRA));
    if(MC_ERR(bstr_contents == NULL)) {
        MC_TRACE("html_set_element_contents: html_bstr(contents) failed");
        mc_send_notify(html->notify_win, html->win, NM_OUTOFMEMORY);
        goto err_contents;
    }

    hr = html->browser_obj->lpVtbl->QueryInterface(html->browser_obj,
                    &IID_IWebBrowser2, (void**)&browser_iface);
    if(MC_ERR(hr != S_OK  ||  browser_iface == NULL)) {
        MC_TRACE("html_set_element_contents: "
                 "QueryInterface(IID_IWebBrowser2) failed [0x%lx]", hr);
        goto err_browser;
    }

    hr = browser_iface->lpVtbl->get_Document(browser_iface, &dispatch_iface);
    if(MC_ERR(FAILED(hr)  ||  dispatch_iface == NULL)) {
        MC_TRACE("html_set_element_contents: get_Document() failed [0x%lx]", hr);
        goto err_dispatch;
    }

    hr = dispatch_iface->lpVtbl->QueryInterface(dispatch_iface,
                                    &IID_IHTMLDocument3, (void**)&doc_iface);
    if(MC_ERR(hr != S_OK  ||  doc_iface == NULL)) {
        MC_TRACE("html_set_element_contents: "
                 "QueryInterface(IID_IHTMLDocument3) failed [0x%lx]", hr);
        goto err_doc;
    }

    hr = doc_iface->lpVtbl->getElementById(doc_iface, bstr_id, &elem_iface);
    if(MC_ERR(FAILED(hr)  ||  elem_iface == NULL)) {
        MC_TRACE("html_set_element_contents: getElementById() failed [0x%lx]", hr);
        goto err_elem;
    }

    hr = elem_iface->lpVtbl->put_innerHTML(elem_iface, bstr_contents);
    if(MC_ERR(hr != S_OK)) {
        MC_TRACE("html_set_element_contents: put_innerHTML() failed [0x%lx]", hr);
        goto err_inner_html;
    }

    res = 0;

err_inner_html:
    elem_iface->lpVtbl->Release(elem_iface);
err_elem:
    doc_iface->lpVtbl->Release(doc_iface);
err_doc:
    dispatch_iface->lpVtbl->Release(dispatch_iface);
err_dispatch:
    browser_iface->lpVtbl->Release(browser_iface);
err_browser:
    html_SysFreeString(bstr_contents);
err_contents:
    html_SysFreeString(bstr_id);
err_id:
    return res;
}