void MainWnd_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * lpDrawItem) { if (lpDrawItem->itemID == -1) return; RECT rect = lpDrawItem->rcItem; project_t *project = project_get(lpDrawItem->itemID); WCHAR *name = U2W(project_name(project)); HFONT hOldFont; // http://www.codeproject.com/KB/combobox/TransListBox.aspx switch (lpDrawItem->itemAction) { case ODA_SELECT: case ODA_DRAWENTIRE: if (lpDrawItem->itemState & ODS_SELECTED) { DrawState(lpDrawItem->hDC, NULL, NULL, (LPARAM)g_hListBoxSelectionBgBitmap, 0, rect.left, rect.top, 0, 0, DST_BITMAP); } else { RECT parentRect = rect; MapWindowPoints(g_hProjectListView, g_hMainWindow, (LPPOINT)&parentRect, 2); HDC hBitmapDC = CreateCompatibleDC(lpDrawItem->hDC); HBITMAP hOldBitmap = SelectBitmap(hBitmapDC, g_hMainWindowBgBitmap); BitBlt(lpDrawItem->hDC, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, hBitmapDC, parentRect.left, parentRect.top, SRCCOPY); SelectBitmap(hBitmapDC, hOldBitmap); DeleteDC(hBitmapDC); } DrawState(lpDrawItem->hDC, NULL, NULL, (LPARAM)g_hProjectIcon, 0, rect.left + 18, rect.top + 2, 0, 0, DST_ICON); SetTextAlign(lpDrawItem->hDC, TA_TOP | TA_LEFT); hOldFont = SelectFont(lpDrawItem->hDC, g_hNormalFont12); if (lpDrawItem->itemState & ODS_SELECTED) { SetTextColor(lpDrawItem->hDC, RGB(0xFF, 0xFF, 0xFF)); } else { SetTextColor(lpDrawItem->hDC, RGB(0x00, 0x00, 0x00)); } TextOut(lpDrawItem->hDC, rect.left + 39, rect.top + 1, name, wcslen(name)); SelectFont(lpDrawItem->hDC, hOldFont); } }
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpcs) { g_hMainWindow = hwnd; // see http://blogs.msdn.com/b/oldnewthing/archive/2011/10/28/10230811.aspx about WS_EX_TRANSPARENT g_hProjectListView = CreateWindowEx(WS_EX_TRANSPARENT, WC_LISTBOX, L"", WS_VISIBLE | WS_CHILD | LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWVARIABLE, 0, 0, 100, 200, hwnd, (HMENU) ID_PROJECT_LIST_VIEW, g_hinst, NULL); int count = project_count(); for (int i = 0; i < count; i++) { project_t *project = project_get(i); ListBox_AddItemData(g_hProjectListView, project); // item.iItem = i; // item.pszText = U2W(project_display_path(project)); // result = ListView_InsertItem(g_hwndProjectListView, &item); // assert(result >= 0); } ListBox_SetCurSel(g_hProjectListView, 0); LayoutSubviews(); return TRUE; }
static int http_github(http_connection_t *hc, const char *remain, void *opaque) { const char *pid = http_arg_get(&hc->hc_req_args, "project"); const char *key = http_arg_get(&hc->hc_req_args, "key"); if(pid == NULL) { trace(LOG_WARNING, "github: Missing 'project' in request"); return 400; } if(key == NULL) { trace(LOG_WARNING, "github: Missing 'key' in request"); return 400; } project_cfg(pc, pid); if(pc == NULL) { trace(LOG_DEBUG, "github: Project '%s' not configured", pid); return 404; } const char *mykey = cfg_get_str(pc, CFG("github", "key"), ""); if(strcmp(mykey, key)) { trace(LOG_WARNING, "github: Invalid key received (%s) for project %s", key, pid); return 403; } project_t *p = project_get(pid); const char *json = http_arg_get(&hc->hc_req_args, "payload"); if(json == NULL) { plog(p, "github", "github: Missing payload in request"); return 400; } char errbuf[256]; htsmsg_t *msg = htsmsg_json_deserialize(json, errbuf, sizeof(errbuf)); if(msg == NULL) { plog(p, "github", "github: Malformed JSON in github request -- %s", errbuf); return 400; } const char *ref = htsmsg_get_str(msg, "ref"); if(ref != NULL && !strncmp(ref, "refs/heads/", strlen("refs/heads/"))) ref += strlen("refs/heads/"); htsmsg_t *list = htsmsg_get_list(msg, "commits"); if(ref != NULL && list != NULL) { htsmsg_field_t *f; HTSMSG_FOREACH(f, list) { htsmsg_t *c = htsmsg_get_map_by_field(f); if(c == NULL) continue; const char *url = htsmsg_get_str(c, "url"); const char *msg = htsmsg_get_str(c, "message"); htsmsg_t *a = htsmsg_get_map(c, "author"); const char *author = a ? htsmsg_get_str(a, "name") : NULL; int added = count_list(c, "added"); int removed = count_list(c, "removed"); int modified = count_list(c, "modified"); int len; char buf[512]; char ctx[128]; url = url ? urlshorten(url) : NULL; snprintf(ctx, sizeof(ctx), "changes/%s", ref); len = snprintf(buf, sizeof(buf), "Commit in '"COLOR_BLUE"%s"COLOR_OFF"' by "COLOR_PURPLE"%s"COLOR_OFF" [", ref, author ?: "???"); if(added) len += snprintf(buf + len, sizeof(buf) - len, COLOR_GREEN "%d file%s added", added, added == 1 ? "" : "s"); if(modified) len += snprintf(buf + len, sizeof(buf) - len, COLOR_YELLOW "%s%d file%s modified", added ? ", " : "", modified, modified == 1 ? "" : "s"); if(removed) len += snprintf(buf + len, sizeof(buf) - len, COLOR_RED "%s%d file%s removed", added || modified ? ", " : "", removed, removed == 1 ? "" : "s"); snprintf(buf + len, sizeof(buf) - len, COLOR_OFF"]%s%s", url ? " " : "", url ?: ""); plog(p, ctx, "%s", buf); plog(p, ctx, "%s", msg); }