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; }
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; }
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; }
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; }