diff options
author | SammysHP | 2019-08-29 20:57:00 +0200 |
---|---|---|
committer | SammysHP | 2019-08-29 20:57:00 +0200 |
commit | a8db532891f54565bea8cc69f2a4a47670aa91f9 (patch) | |
tree | 8753bbed0ea54a7fcabb300dd39d949eef83f5da /0001_system-skins.patch | |
parent | 65deaa3daa1bd6aad65c4d68d3e528f4f790bd98 (diff) | |
download | aur-a8db532891f54565bea8cc69f2a4a47670aa91f9.tar.gz |
Update to 2.5.1
2.5.0 was skipped.
Diffstat (limited to '0001_system-skins.patch')
-rw-r--r-- | 0001_system-skins.patch | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/0001_system-skins.patch b/0001_system-skins.patch new file mode 100644 index 000000000000..b24bd5f78e1f --- /dev/null +++ b/0001_system-skins.patch @@ -0,0 +1,209 @@ +commit d6868691ca02eeb4f2d71e63110e4f005f43bb56 +Author: SammysHP <sven@sammyshp.de> +Date: Tue May 2 13:07:11 2017 +0200 + + Read skins from system-wide directory + + This allows to set a system-wide skin directory during compile time: + $ make SKIN_SYS_DIR="/usr/share/free42/skins" + +diff --git a/gtk/Makefile b/gtk/Makefile +index 01c0daf..892468d 100644 +--- a/gtk/Makefile ++++ b/gtk/Makefile +@@ -84,6 +84,10 @@ SRCS += audio_alsa.cc + OBJS += audio_alsa.o + endif + ++ifdef SKIN_SYS_DIR ++CXXFLAGS += -DSKIN_SYS_DIR=\"$(SKIN_SYS_DIR)\" ++endif ++ + $(EXE): $(OBJS) + $(CXX) -o $(EXE) $(LDFLAGS) $(OBJS) $(LIBS) + +diff --git a/gtk/shell_skin.cc b/gtk/shell_skin.cc +index e6b3e19..a7bf09f 100644 +--- a/gtk/shell_skin.cc ++++ b/gtk/shell_skin.cc +@@ -83,7 +83,8 @@ static const SkinColor *skin_cmap; + + static GdkPixbuf *disp_image = NULL; + +-static char skin_label_buf[1024]; ++#define SKIN_LABEL_BUF_SIZE 1024 ++static char skin_label_buf[SKIN_LABEL_BUF_SIZE]; + static int skin_label_pos; + + static keymap_entry *keymap = NULL; +@@ -115,6 +116,12 @@ static int skin_open(const char *name, int open_layout); + static int skin_gets(char *buf, int buflen); + static void skin_close(); + ++#define SKIN_NAMES_LIST_SIZE 100 ++static int read_skins_from_dir(const char *dirname, char *skinnames[]); ++static void add_skin_menu_items(const char * const skinnames[], int nskins, ++ GtkWidget *w, GtkMenu *skin_menu, ++ const char * const skinfilter[], int nskinfilter); ++ + + static void addMenuItem(GtkMenu *menu, const char *name) { + bool checked = false; +@@ -129,6 +136,8 @@ static void addMenuItem(GtkMenu *menu, const char *name) { + + // Apparently, there is no way to retrieve the label from a menu item, + // so I have to store them and pass them to the callback explicitly. ++ if (skin_label_pos + strlen(name) >= SKIN_LABEL_BUF_SIZE) ++ return; // not enough space in buffer TODO + char *lbl = skin_label_buf + skin_label_pos; + strcpy(lbl, name); + skin_label_pos += strlen(name) + 1; +@@ -175,6 +184,16 @@ static int skin_open(const char *name, int open_layout) { + snprintf(namebuf, 1024, "%s/%s.%s", free42dirname, name, + open_layout ? "layout" : "gif"); + external_file = fopen(namebuf, "r"); ++ ++#ifdef SKIN_SYS_DIR ++ // if skin was not found built-in or in home directory, try system-wide ++ if (external_file == NULL) { ++ snprintf(namebuf, 1024, "%s/%s.%s", SKIN_SYS_DIR, name, ++ open_layout ? "layout" : "gif"); ++ external_file = fopen(namebuf, "r"); ++ } ++#endif ++ + return external_file != NULL; + } + +@@ -220,31 +239,14 @@ static int case_insens_comparator(const void *a, const void *b) { + return strcasecmp(*(const char **) a, *(const char **) b); + } + +-void skin_menu_update(GtkWidget *w) { +- int i, j; +- +- GtkMenu *skin_menu = (GtkMenu *) gtk_menu_item_get_submenu(GTK_MENU_ITEM(w)); +- GList *children = gtk_container_get_children(GTK_CONTAINER(skin_menu)); +- GList *item = children; +- while (item != NULL) { +- gtk_widget_destroy(GTK_WIDGET(item->data)); +- item = item->next; +- } +- g_list_free(children); +- +- skin_label_pos = 0; +- +- for (i = 0; i < skin_count; i++) +- addMenuItem(skin_menu, skin_name[i]); +- +- DIR *dir = opendir(free42dirname); ++static int read_skins_from_dir(const char *dirname, char *skinnames[]) { ++ DIR *dir = opendir(dirname); + if (dir == NULL) +- return; ++ return 0; + + struct dirent *dent; +- char *skinname[100]; + int nskins = 0; +- while ((dent = readdir(dir)) != NULL && nskins < 100) { ++ while ((dent = readdir(dir)) != NULL && nskins < SKIN_NAMES_LIST_SIZE) { + int namelen = strlen(dent->d_name); + char *skn; + if (namelen < 7) +@@ -255,28 +257,89 @@ void skin_menu_update(GtkWidget *w) { + // TODO - handle memory allocation failure + memcpy(skn, dent->d_name, namelen - 7); + skn[namelen - 7] = 0; +- skinname[nskins++] = skn; ++ skinnames[nskins++] = skn; + } + closedir(dir); + +- qsort(skinname, nskins, sizeof(char *), case_insens_comparator); ++ qsort(skinnames, nskins, sizeof(char *), case_insens_comparator); ++ ++ return nskins; ++} ++ ++static void add_skin_menu_items(const char * const skinnames[], int nskins, ++ GtkWidget *w, GtkMenu *skin_menu, ++ const char * const skinfilter[], int nskinfilter) { ++ int i, j; + bool have_separator = false; ++ + for (i = 0; i < nskins; i++) { ++ // filter out built-in skins + for (j = 0; j < skin_count; j++) +- if (strcmp(skinname[i], skin_name[j]) == 0) ++ if (strcmp(skinnames[i], skin_name[j]) == 0) ++ goto skip; ++ ++ // filter out skins from filter list (e.g. skins in home directory) ++ for (j = 0; j < nskinfilter; j++) ++ if (strcmp(skinnames[i], skinfilter[j]) == 0) + goto skip; ++ ++ // add separator if first skin in this set + if (!have_separator) { + GtkWidget *w = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(skin_menu), w); + gtk_widget_show(w); + have_separator = true; + } +- addMenuItem(skin_menu, skinname[i]); +- skip: +- free(skinname[i]); ++ ++ addMenuItem(skin_menu, skinnames[i]); ++skip:; + } + } + ++void skin_menu_update(GtkWidget *w) { ++ int i; ++ ++ // clear menu ++ GtkMenu *skin_menu = (GtkMenu *) gtk_menu_item_get_submenu(GTK_MENU_ITEM(w)); ++ GList *children = gtk_container_get_children(GTK_CONTAINER(skin_menu)); ++ GList *item = children; ++ while (item != NULL) { ++ gtk_widget_destroy(GTK_WIDGET(item->data)); ++ item = item->next; ++ } ++ g_list_free(children); ++ ++ skin_label_pos = 0; ++ ++ // add built-in skins ++ for (i = 0; i < skin_count; i++) ++ addMenuItem(skin_menu, skin_name[i]); ++ ++ // read skins from home directory ++ char *skins_home[SKIN_NAMES_LIST_SIZE]; ++ int n_skins_home = read_skins_from_dir(free42dirname, skins_home); ++ ++#ifdef SKIN_SYS_DIR ++ // read skins from system directory ++ char *skins_sys[SKIN_NAMES_LIST_SIZE]; ++ int n_skins_sys = read_skins_from_dir(SKIN_SYS_DIR, skins_sys); ++ ++ // add system-wide skins ++ add_skin_menu_items(skins_sys, n_skins_sys, w, skin_menu, skins_home, n_skins_home); ++#endif ++ ++ // add home directory skins ++ add_skin_menu_items(skins_home, n_skins_home, w, skin_menu, NULL, 0); ++ ++ // free memory ++ for (i = 0; i < n_skins_home; i++) ++ free(skins_home[i]); ++#ifdef SKIN_SYS_DIR ++ for (i = 0; i < n_skins_sys; i++) ++ free(skins_sys[i]); ++#endif ++} ++ + void skin_load(int *width, int *height) { + char line[1024]; + int success; |