Add an icon for linux and use it

This commit is contained in:
UnknownShadow200 2019-10-29 20:26:38 +11:00
parent d11038d6e9
commit cef3db9fe7
6 changed files with 80 additions and 30 deletions

BIN
misc/CCicon_nix32 Normal file

Binary file not shown.

BIN
misc/CCicon_nix64 Normal file

Binary file not shown.

View File

@ -30,6 +30,7 @@ CLANG64_PATH=/usr/bin/clang/osx64
ALL_FLAGS="-O1 -s -fno-stack-protector -fno-math-errno -w" ALL_FLAGS="-O1 -s -fno-stack-protector -fno-math-errno -w"
WIN32_FLAGS="-mwindows -nostartfiles -Wl,-e_main_real -DCC_NOMAIN" WIN32_FLAGS="-mwindows -nostartfiles -Wl,-e_main_real -DCC_NOMAIN"
WIN64_FLAGS="-mwindows -nostartfiles -Wl,-emain_real -DCC_NOMAIN" WIN64_FLAGS="-mwindows -nostartfiles -Wl,-emain_real -DCC_NOMAIN"
LINUX_FLAGS="-fvisibility=hidden -rdynamic -DCC_BUILD_X11ICON"
# ----------------------------- # -----------------------------
build_win32() { build_win32() {
@ -52,14 +53,16 @@ build_win64() {
build_nix32() { build_nix32() {
echo "Building linux32.." echo "Building linux32.."
cp $SOURCE_DIR/misc/CCicon_nix32 $SOURCE_DIR/src/CCicon_nix32.o
rm cc-nix32 rm cc-nix32
gcc *.c $ALL_FLAGS -fvisibility=hidden -rdynamic -DCC_COMMIT_SHA=\"$LATEST\" -m32 -o cc-nix32 -lX11 -lpthread -lGL -lm -lcurl -lopenal -ldl gcc *.c $ALL_FLAGS $LINUX_FLAGS CCicon_nix32.o -DCC_COMMIT_SHA=\"$LATEST\" -m32 -o cc-nix32 -lX11 -lpthread -lGL -lm -lcurl -lopenal -ldl
} }
build_nix64() { build_nix64() {
echo "Building linux64.." echo "Building linux64.."
cp $SOURCE_DIR/misc/CCicon_nix64 $SOURCE_DIR/src/CCicon_nix64.o
rm cc-nix64 rm cc-nix64
gcc *.c $ALL_FLAGS -fvisibility=hidden -rdynamic -DCC_COMMIT_SHA=\"$LATEST\" -m64 -o cc-nix64 -lX11 -lpthread -lGL -lm -lcurl -lopenal -ldl gcc *.c $ALL_FLAGS $LINUX_FLAGS CCicon_nix64.o -DCC_COMMIT_SHA=\"$LATEST\" -m64 -o cc-nix64 -lX11 -lpthread -lGL -lm -lcurl -lopenal -ldl
} }
build_osx32() { build_osx32() {

39
misc/linux_icon_gen.cs Normal file
View File

@ -0,0 +1,39 @@
using System.Drawing.Imaging;
using System.Drawing;
using System.IO;
namespace test {
public static class Program {
const string src = "CCIcon.ico";
const string dst = "CCIcon.c";
static void DumpIcon(StreamWriter sw, int width, int height) {
sw.WriteLine(width + "," + height + ",");
using (Icon icon = new Icon(src, width, height)) {
using (Bitmap bmp = icon.ToBitmap()) {
for (int y = 0; y < bmp.Height; y++) {
for (int x = 0; x < bmp.Width; x++) {
Color c = bmp.GetPixel(x, y);
int p = (c.A << 24) | (c.R << 16) | (c.G << 8) | c.B;
sw.Write("0x" + ((uint)p).ToString("X8") + ",");
}
sw.WriteLine();
}
}
}
}
public static void Main(string[] args) {
using (StreamWriter sw = new StreamWriter(dst)) {
sw.WriteLine("const unsigned long CCIcon_Data[] = {");
DumpIcon(sw, 64, 64);
DumpIcon(sw, 32, 32);
DumpIcon(sw, 16, 16);
sw.WriteLine("};");
sw.WriteLine("const int CCIcon_Size = sizeof(CCIcon_Data) / sizeof(unsigned long);");
}
}
}
}

View File

@ -42,22 +42,22 @@ void HttpRequest_Free(struct HttpRequest* request) {
*#########################################################################################################################*/ *#########################################################################################################################*/
#define HTTP_DEF_ELEMS 10 #define HTTP_DEF_ELEMS 10
struct RequestList { struct RequestList {
int Count, Capacity; int count, capacity;
struct HttpRequest* Entries; struct HttpRequest* entries;
struct HttpRequest DefaultEntries[HTTP_DEF_ELEMS]; struct HttpRequest defaultEntries[HTTP_DEF_ELEMS];
}; };
/* Expands request list buffer if there is no room for another request */ /* Expands request list buffer if there is no room for another request */
static void RequestList_EnsureSpace(struct RequestList* list) { static void RequestList_EnsureSpace(struct RequestList* list) {
if (list->Count < list->Capacity) return; if (list->count < list->capacity) return;
Utils_Resize((void**)&list->Entries, &list->Capacity, Utils_Resize((void**)&list->entries, &list->capacity,
sizeof(struct HttpRequest), HTTP_DEF_ELEMS, 10); sizeof(struct HttpRequest), HTTP_DEF_ELEMS, 10);
} }
/* Adds another request to end (for normal priority request) */ /* Adds another request to end (for normal priority request) */
static void RequestList_Append(struct RequestList* list, struct HttpRequest* item) { static void RequestList_Append(struct RequestList* list, struct HttpRequest* item) {
RequestList_EnsureSpace(list); RequestList_EnsureSpace(list);
list->Entries[list->Count++] = *item; list->entries[list->count++] = *item;
} }
/* Inserts a request at start (for high priority request) */ /* Inserts a request at start (for high priority request) */
@ -65,21 +65,21 @@ static void RequestList_Prepend(struct RequestList* list, struct HttpRequest* it
int i; int i;
RequestList_EnsureSpace(list); RequestList_EnsureSpace(list);
for (i = list->Count; i > 0; i--) { for (i = list->count; i > 0; i--) {
list->Entries[i] = list->Entries[i - 1]; list->entries[i] = list->entries[i - 1];
} }
list->Entries[0] = *item; list->entries[0] = *item;
list->Count++; list->count++;
} }
/* Removes the request at the given index */ /* Removes the request at the given index */
static void RequestList_RemoveAt(struct RequestList* list, int i) { static void RequestList_RemoveAt(struct RequestList* list, int i) {
if (i < 0 || i >= list->Count) Logger_Abort("Tried to remove element at list end"); if (i < 0 || i >= list->count) Logger_Abort("Tried to remove element at list end");
for (; i < list->Count - 1; i++) { for (; i < list->count - 1; i++) {
list->Entries[i] = list->Entries[i + 1]; list->entries[i] = list->entries[i + 1];
} }
list->Count--; list->count--;
} }
/* Finds index of request whose id matches the given id */ /* Finds index of request whose id matches the given id */
@ -87,11 +87,11 @@ static int RequestList_Find(struct RequestList* list, const String* id, struct H
String reqID; String reqID;
int i; int i;
for (i = 0; i < list->Count; i++) { for (i = 0; i < list->count; i++) {
reqID = String_FromRawArray(list->Entries[i].ID); reqID = String_FromRawArray(list->entries[i].ID);
if (!String_Equals(id, &reqID)) continue; if (!String_Equals(id, &reqID)) continue;
*item = list->Entries[i]; *item = list->entries[i];
return i; return i;
} }
return -1; return -1;
@ -99,14 +99,14 @@ static int RequestList_Find(struct RequestList* list, const String* id, struct H
/* Resets state to default */ /* Resets state to default */
static void RequestList_Init(struct RequestList* list) { static void RequestList_Init(struct RequestList* list) {
list->Capacity = HTTP_DEF_ELEMS; list->capacity = HTTP_DEF_ELEMS;
list->Count = 0; list->count = 0;
list->Entries = list->DefaultEntries; list->entries = list->defaultEntries;
} }
/* Frees any dynamically allocated memory, then resets state to default */ /* Frees any dynamically allocated memory, then resets state to default */
static void RequestList_Free(struct RequestList* list) { static void RequestList_Free(struct RequestList* list) {
if (list->Entries != list->DefaultEntries) Mem_Free(list->Entries); if (list->entries != list->defaultEntries) Mem_Free(list->entries);
RequestList_Init(list); RequestList_Init(list);
} }
@ -207,7 +207,7 @@ static void Http_CompleteRequest(struct HttpRequest* req) {
} else { } else {
/* normal case, replace older req */ /* normal case, replace older req */
HttpRequest_Free(&older); HttpRequest_Free(&older);
processedReqs.Entries[index] = *req; processedReqs.entries[index] = *req;
} }
} else { } else {
RequestList_Append(&processedReqs, req); RequestList_Append(&processedReqs, req);
@ -242,8 +242,8 @@ static void Http_CleanCacheTask(struct ScheduledTask* task) {
Mutex_Lock(processedMutex); Mutex_Lock(processedMutex);
{ {
TimeMS now = DateTime_CurrentUTC_MS(); TimeMS now = DateTime_CurrentUTC_MS();
for (i = processedReqs.Count - 1; i >= 0; i--) { for (i = processedReqs.count - 1; i >= 0; i--) {
item = &processedReqs.Entries[i]; item = &processedReqs.entries[i];
if (item->TimeDownloaded + (10 * 1000) >= now) continue; if (item->TimeDownloaded + (10 * 1000) >= now) continue;
HttpRequest_Free(item); HttpRequest_Free(item);
@ -334,11 +334,11 @@ static void Http_AddHeader(const char* key, const String* value);
static void Http_DownloadNextAsync(void) { static void Http_DownloadNextAsync(void) {
struct HttpRequest req; struct HttpRequest req;
if (http_terminate || !pendingReqs.Count) return; if (http_terminate || !pendingReqs.count) return;
/* already working on a request currently */ /* already working on a request currently */
if (http_curRequest.ID[0] != '\0') return; if (http_curRequest.ID[0] != '\0') return;
req = pendingReqs.Entries[0]; req = pendingReqs.entries[0];
RequestList_RemoveAt(&pendingReqs, 0); RequestList_RemoveAt(&pendingReqs, 0);
Http_DownloadAsync(&req); Http_DownloadAsync(&req);
} }
@ -845,8 +845,8 @@ static void Http_WorkerLoop(void) {
Mutex_Lock(pendingMutex); Mutex_Lock(pendingMutex);
{ {
stop = http_terminate; stop = http_terminate;
if (!stop && pendingReqs.Count) { if (!stop && pendingReqs.count) {
request = pendingReqs.Entries[0]; request = pendingReqs.entries[0];
hasRequest = true; hasRequest = true;
RequestList_RemoveAt(&pendingReqs, 0); RequestList_RemoveAt(&pendingReqs, 0);
} }

View File

@ -929,6 +929,14 @@ void Window_Create(int width, int height) {
Window_RefreshBounds(width, height); Window_RefreshBounds(width, height);
Window_Exists = true; Window_Exists = true;
Window_Handle = (void*)win_handle; Window_Handle = (void*)win_handle;
#ifdef CC_BUILD_X11ICON
Atom net_wm_icon = XInternAtom(win_display, "_NET_WM_ICON", false);
Atom xa_cardinal = XInternAtom(win_display, "CARDINAL", false);
extern const long CCIcon_Data[];
extern const int CCIcon_Size;
XChangeProperty(win_display, win_handle, net_wm_icon, xa_cardinal, 32, PropModeReplace, CCIcon_Data, CCIcon_Size);
#endif
} }
void Window_SetTitle(const String* title) { void Window_SetTitle(const String* title) {