]> Dogcows Code - chaz/tint2/blobdiff - src/util/common.c
launcher_apps_dir-v2.patch
[chaz/tint2] / src / util / common.c
index dd2f0113b94fceefd137b039f66c1176c6bc0a1b..224c4ea6a3d7357738f0de9929679f3cea77dc89 100644 (file)
@@ -3,7 +3,7 @@
 * Tint2 : common windows function
 *
 * Copyright (C) 2007 Pål Staurland (staura@gmail.com)
-* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
+* Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 #include <X11/extensions/Xrender.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
+#include <unistd.h>
+#include <fnmatch.h>
 
 #include "common.h"
 #include "../server.h"
@@ -44,7 +47,9 @@ void copy_file(const char *pathSrc, const char *pathDest)
        fileDest = fopen(pathDest, "wb");
        if (fileDest == NULL) return;
 
-       while ((nb = fread(line, 1, 100, fileSrc)) > 0) fwrite(line, 1, nb, fileDest);
+       while ((nb = fread(line, 1, 100, fileSrc)) > 0)
+               if ( nb != fwrite(line, 1, nb, fileDest))
+                       printf("Error while copying file %s to %s\n", pathSrc, pathDest);
 
        fclose (fileDest);
        fclose (fileSrc);
@@ -75,6 +80,23 @@ int parse_line (const char *line, char **key, char **value)
 }
 
 
+void tint_exec(const char *command)
+{
+       if (command) {
+               pid_t pid;
+               pid = fork();
+               if (pid == 0) {
+                       // change for the fork the signal mask
+//                     sigset_t sigset;
+//                     sigprocmask(SIG_SETMASK, &sigset, 0);
+//                     sigprocmask(SIG_UNBLOCK, &sigset, 0);
+                       execl("/bin/sh", "/bin/sh", "-c", command, NULL);
+                       _exit(0);
+               }
+       }
+}
+
+
 int hex_char_to_int (char c)
 {
        int r;
@@ -127,6 +149,45 @@ void get_color (char *hex, double *rgb)
 }
 
 
+void extract_values (const char *value, char **value1, char **value2, char **value3)
+{
+       char *b=0, *c=0;
+
+       if (*value1) free (*value1);
+       if (*value2) free (*value2);
+       if (*value3) free (*value3);
+
+       if ((b = strchr (value, ' '))) {
+               b[0] = '\0';
+               b++;
+       }
+       else {
+               *value2 = 0;
+               *value3 = 0;
+       }
+       *value1 = strdup (value);
+       g_strstrip(*value1);
+
+       if (b) {
+               if ((c = strchr (b, ' '))) {
+                       c[0] = '\0';
+                       c++;
+               }
+               else {
+                       c = 0;
+                       *value3 = 0;
+               }
+               *value2 = strdup (b);
+               g_strstrip(*value2);
+       }
+
+       if (c) {
+               *value3 = strdup (c);
+               g_strstrip(*value3);
+       }
+}
+
+
 void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright)
 {
        unsigned int x, y;
@@ -239,15 +300,27 @@ void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright
 
 void createHeuristicMask(DATA32* data, int w, int h)
 {
+       // first we need to find the mask color, therefore we check all 4 edge pixel and take the color which
+       // appears most often (we only need to check three edges, the 4th is implicitly clear)
+       unsigned int topLeft = data[0], topRight = data[w-1], bottomLeft = data[w*h-w], bottomRight = data[w*h-1];
+       int max = (topLeft == topRight) + (topLeft == bottomLeft) + (topLeft == bottomRight);
+       int maskPos = 0;
+       if ( max < (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight) ) {
+               max = (topRight == topLeft) + (topRight == bottomLeft) + (topRight == bottomRight);
+               maskPos = w-1;
+       }
+       if ( max < (bottomLeft == topRight) + (bottomLeft == topLeft) + (bottomLeft == bottomRight) )
+               maskPos = w*h-w;
+
+       // now mask out every pixel which has the same color as the edge pixels
        unsigned char* udata = (unsigned char*)data;
-       int b = udata[0];
-       int g = udata[1];
-       int r = udata[2];
+       unsigned char b = udata[4*maskPos];
+       unsigned char g = udata[4*maskPos+1];
+       unsigned char r = udata[4*maskPos+1];
        int i;
        for (i=0; i<h*w; ++i) {
-               if ( abs(b-*udata)<5 && abs(g-*(udata+1))<5 && abs(r-*(udata+2))<5 ) {
-                       *(udata+3) = 0;
-               }
+               if ( b-udata[0] == 0 && g-udata[1] == 0 && r-udata[2] == 0 )
+                       udata[3] = 0;
                udata += 4;
        }
 }
@@ -267,7 +340,51 @@ void render_image(Drawable d, int x, int y, int w, int h)
        Picture pict_drawable = XRenderCreatePicture(server.dsp, d, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0);
        XRenderComposite(server.dsp, PictOpIn, pict_image, None, pict_image, 0, 0, 0, 0, 0, 0, w, h);
        XRenderComposite(server.dsp, PictOpOver, pict_image, None, pict_drawable, 0, 0, 0, 0, x, y, w, h);
+       imlib_context_set_blend(1);
        XFreePixmap(server.dsp, pmap_tmp);
        XRenderFreePicture(server.dsp, pict_image);
        XRenderFreePicture(server.dsp, pict_drawable);
 }
+
+/**
+ * @brief
+ *  Scan given directory for files which are meet the given mask and sort them alphabetically
+ *
+ * @param path - directory path
+ * @param mask - filename mask
+ *
+ * @return files list
+ */
+GList *dir_scan_alpha(const char *path, const char *mask)
+{
+       GError *err = NULL;
+       GList *list = NULL;
+       const char *n;
+       gchar *fn;
+       struct stat st;
+
+       GDir *dir = g_dir_open(path, 0, &err);
+
+       if (!dir) {
+               fprintf(stderr, "%s\n", err->message);
+               g_error_free(err);
+       } else {
+               // Enumerate files
+               while ((n = g_dir_read_name(dir))) {
+                       if (!fnmatch(mask, n, FNM_PATHNAME)) {
+                               fn = g_build_filename(path, n, NULL);
+
+                               if (stat((char *)fn, &st) < 0)
+                                       continue;
+
+                               // Only regular files
+                               if (S_ISREG(st.st_mode))
+                                       list = g_list_prepend(list, (gpointer)fn);
+                       }
+               }
+
+               list = g_list_sort (list, (GCompareFunc) &strcmp);
+       }
+
+       return list;
+}
This page took 0.028741 seconds and 4 git commands to generate.