From: Christophe CURIS <christophe.cu...@free.fr>

In order to make code easier to maintain, the code related to creating the
Helper process (which helps by setting the background of the workspace) is
moved to a dedicated function, which have been moved to the same location
as the function for communicating with the helper.

Took opportunity to de-CamelCase the related names.

Signed-off-by: Christophe CURIS <christophe.cu...@free.fr>
---
 src/defaults.c | 67 ++----------------------------------------------------
 src/misc.c     | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/misc.h     |  3 +++
 3 files changed, 77 insertions(+), 65 deletions(-)

diff --git a/src/defaults.c b/src/defaults.c
index b069d08..a4b8261 100644
--- a/src/defaults.c
+++ b/src/defaults.c
@@ -32,7 +32,6 @@
 #include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <fcntl.h>
 #include <limits.h>
 #include <signal.h>
 
@@ -62,7 +61,6 @@
 #include "workspace.h"
 #include "properties.h"
 #include "misc.h"
-#include "event.h"
 #include "winmenu.h"
 
 #define MAX_SHORTCUT_LENGTH 32
@@ -2970,20 +2968,6 @@ static int setFrameSelectedBorderColor(WScreen * scr, 
WDefaultEntry * entry, voi
        return REFRESH_FRAME_BORDER;
 }
 
-static void trackDeadProcess(pid_t pid, unsigned int status, void *client_data)
-{
-       WScreen *scr = (WScreen *) client_data;
-
-       /* Parameter not used, but tell the compiler that it is ok */
-       (void) pid;
-       (void) status;
-
-       close(scr->helper_fd);
-       scr->helper_fd = 0;
-       scr->helper_pid = 0;
-       scr->flags.backimage_helper_launched = 0;
-}
-
 static int setWorkspaceSpecificBack(WScreen * scr, WDefaultEntry * entry, void 
*tdata, void *bar)
 {
        WMPropList *value = tdata;
@@ -3004,62 +2988,15 @@ static int setWorkspaceSpecificBack(WScreen * scr, 
WDefaultEntry * entry, void *
                        return 0;
                }
        } else {
-               pid_t pid;
-               int filedes[2];
-
                if (WMGetPropListItemCount(value) == 0)
                        return 0;
 
-               if (pipe(filedes) < 0) {
-                       werror("pipe() failed:can't set workspace specific 
background image");
-
+               if (!start_bg_helper(scr)) {
                        WMReleasePropList(value);
                        return 0;
                }
 
-               pid = fork();
-               if (pid < 0) {
-                       werror("fork() failed:can't set workspace specific 
background image");
-                       if (close(filedes[0]) < 0)
-                               werror("could not close pipe");
-                       if (close(filedes[1]) < 0)
-                               werror("could not close pipe");
-
-               } else if (pid == 0) {
-                       char *dither;
-
-                       SetupEnvironment(scr);
-
-                       if (close(0) < 0)
-                               werror("could not close pipe");
-                       if (dup(filedes[0]) < 0) {
-                               werror("dup() failed:can't set workspace 
specific background image");
-                       }
-                       dither = wPreferences.no_dithering ? "-m" : "-d";
-                       if (wPreferences.smooth_workspace_back)
-                               execlp("wmsetbg", "wmsetbg", "-helper", "-S", 
dither, NULL);
-                       else
-                               execlp("wmsetbg", "wmsetbg", "-helper", dither, 
NULL);
-                       werror("could not execute wmsetbg");
-                       exit(1);
-               } else {
-
-                       if (fcntl(filedes[0], F_SETFD, FD_CLOEXEC) < 0) {
-                               werror("error setting close-on-exec flag");
-                       }
-                       if (fcntl(filedes[1], F_SETFD, FD_CLOEXEC) < 0) {
-                               werror("error setting close-on-exec flag");
-                       }
-
-                       scr->helper_fd = filedes[1];
-                       scr->helper_pid = pid;
-                       scr->flags.backimage_helper_launched = 1;
-
-                       wAddDeathHandler(pid, trackDeadProcess, scr);
-
-                       SendHelperMessage(scr, 'P', -1, 
wPreferences.pixmap_path);
-               }
-
+               SendHelperMessage(scr, 'P', -1, wPreferences.pixmap_path);
        }
 
        for (i = 0; i < WMGetPropListItemCount(value); i++) {
diff --git a/src/misc.c b/src/misc.c
index 26348d4..096052a 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <stdarg.h>
 #include <pwd.h>
 #include <math.h>
@@ -49,6 +50,8 @@
 #include "dialog.h"
 #include "xutil.h"
 #include "xmodifier.h"
+#include "main.h"
+#include "event.h"
 
 
 #define ICON_SIZE wPreferences.icon_size
@@ -906,6 +909,75 @@ static void UnescapeWM_CLASS(const char *str, char **name, 
char **class)
        }
 }
 
+static void track_bg_helper_death(pid_t pid, unsigned int status, void 
*client_data)
+{
+       WScreen *scr = (WScreen *) client_data;
+
+       /* Parameter not used, but tell the compiler that it is ok */
+       (void) pid;
+       (void) status;
+
+       close(scr->helper_fd);
+       scr->helper_fd = 0;
+       scr->helper_pid = 0;
+       scr->flags.backimage_helper_launched = 0;
+}
+
+Bool start_bg_helper(WScreen *scr)
+{
+       pid_t pid;
+       int filedes[2];
+
+       if (pipe(filedes) < 0) {
+               werror("pipe() failed:can't set workspace specific background 
image");
+               return False;
+       }
+
+       pid = fork();
+       if (pid < 0) {
+               werror("fork() failed:can't set workspace specific background 
image");
+               if (close(filedes[0]) < 0)
+                       werror("could not close pipe");
+               if (close(filedes[1]) < 0)
+                       werror("could not close pipe");
+               return False;
+
+       } else if (pid == 0) {
+               char *dither;
+
+               SetupEnvironment(scr);
+
+               if (close(0) < 0)
+                       werror("could not close pipe");
+               if (dup(filedes[0]) < 0) {
+                       werror("dup() failed:can't set workspace specific 
background image");
+               }
+               dither = wPreferences.no_dithering ? "-m" : "-d";
+               if (wPreferences.smooth_workspace_back)
+                       execlp("wmsetbg", "wmsetbg", "-helper", "-S", dither, 
NULL);
+               else
+                       execlp("wmsetbg", "wmsetbg", "-helper", dither, NULL);
+               werror("could not execute wmsetbg");
+               exit(1);
+
+       } else {
+               if (fcntl(filedes[0], F_SETFD, FD_CLOEXEC) < 0) {
+                       werror("error setting close-on-exec flag");
+               }
+               if (fcntl(filedes[1], F_SETFD, FD_CLOEXEC) < 0) {
+                       werror("error setting close-on-exec flag");
+               }
+
+               scr->helper_fd = filedes[1];
+               scr->helper_pid = pid;
+               scr->flags.backimage_helper_launched = 1;
+
+               wAddDeathHandler(pid, track_bg_helper_death, scr);
+
+               return True;
+       }
+}
+
 void SendHelperMessage(WScreen *scr, char type, int workspace, const char *msg)
 {
        char *buffer;
diff --git a/src/misc.h b/src/misc.h
index 74e02ac..36f08a0 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -33,6 +33,9 @@ void move_window(Window win, int from_x, int from_y, int 
to_x, int to_y);
 void SlideWindow(Window win, int from_x, int from_y, int to_x, int to_y);
 void SlideWindows(Window *wins[], int n, int from_x, int from_y, int to_x, int 
to_y);
 void ParseWindowName(WMPropList *value, char **winstance, char **wclass, const 
char *where);
+
+/* Helper is a 'wmsetbg' subprocess with sets the background for the current 
workspace */
+Bool start_bg_helper(WScreen *scr);
 void SendHelperMessage(WScreen *scr, char type, int workspace, const char 
*msg);
 
 char *ShrinkString(WMFont *font, const char *string, int width);
-- 
2.1.1


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to