All,

Raster suggested that I use the E_Action system to change desks
instead of my current method of 5 parameters which I thought was
clunky.

So I've added a generic IPC call to execute a named action, as well as
a new action which flips to a desk given the manager, container, zone,
row and column.
This IPC call executes E-Action.func.go exclusively, so it cannot be
used for mouse and keyboard actions I believe.

The number of parameters is variable, but is interpreted as follows:

5 params: manager container zone row column
4 params: container zone row column
3 params: zone row column
2 params: row column
1 param: column

I imagine this works correctly for parameters higher than 2, but I
don't have multihead or xinerama to test it here at work...

I also don't know what would cause there to be more than one manager
in the managers_list (multiple X servers running Enlightenment?), so I
don't know how to tell if 5 params even works : )

Please let me know what you think,
 Marc

-- 
http://www.diadems.com/
1 3 5
2 4 6 R
diff -u -r e/src/bin/e_actions.c /home/mcgmar0u/source/e/src/bin/e_actions.c
--- e/src/bin/e_actions.c	2005-07-06 13:17:03.000000000 -0500
+++ /home/mcgmar0u/source/e/src/bin/e_actions.c	2005-07-06 14:08:50.000000000 -0500
@@ -467,6 +467,122 @@
 }
 
 /***************************************************************************/
+ACT_FN_GO(desk_flip_to_complete)
+{
+	/*
+	 * NOTE:
+	 *
+	 * This function does not care if it is given a NULL Manager, as it walks the manager list itself
+	 *
+	 */
+
+	Evas_List *m, *c, *z;
+	E_Manager *man;
+	E_Container *con;
+	E_Zone *zone;
+
+	int
+		zoneCtr,
+		containerCtr,
+		managerCtr,
+		dx,
+		dy,
+		done
+	;
+	int
+		intParams[5],
+		maxParams,
+		actualParamCtr,
+		missingOptParamCount,
+		targetCtr
+	;
+	/*
+	 * Array sizes were decided as follows:
+	 *
+	 * n parameters * 3 chars max + (n - 1) spaces + 1 null terminator
+	 *
+	 * I think we have limited numbers of desktops to 64, so this might be 1 byte wasted for each parameter...
+	 *
+	 * tgtParams[20] = 5 parameters * 3 chars max + (5 - 1) spaces + null terminator
+	 */
+	char
+		tgtParams[20],
+		*currToken
+	;
+
+	maxParams = 5;
+	actualParamCtr = 0;
+	memset(intParams, 0, sizeof(intParams));
+	memset(tgtParams, 0, sizeof(tgtParams));
+	strncpy(tgtParams, params, sizeof(tgtParams) - 1);
+
+	/*
+	 * Extract the parameters from the string
+	 */
+	currToken = strtok(tgtParams, " ");
+
+	while (currToken != NULL) {
+		intParams[actualParamCtr] = atoi(currToken);
+		actualParamCtr++;
+		currToken = strtok(NULL, " ");
+	}
+
+	/*
+	 * Now shift the params towards the end of the array if we are missing optional ones
+	 *
+	 * Optional parameters default to zero
+	 */
+	if (actualParamCtr < maxParams) {
+		missingOptParamCount = maxParams - actualParamCtr;
+		for (targetCtr = maxParams - 1; targetCtr >= missingOptParamCount; targetCtr--) {
+			intParams[targetCtr] = intParams[targetCtr - missingOptParamCount];
+			intParams[targetCtr - missingOptParamCount] = 0;
+		}
+	}
+
+	done = 0;
+	managerCtr = 0;
+
+	for (m = e_manager_list(); m && done == 0; m = m->next) {
+		man = m->data;
+
+		if (managerCtr == intParams[0] && man) {
+
+			containerCtr = 0;
+
+			for (c = man->containers; c && done == 0; c = c->next) {	
+				con = c->data;
+
+				if (containerCtr == intParams[1] && con) {
+					zoneCtr = 0;
+
+					 for (z = con->zones; z && done == 0; z = z->next) {
+						zone = z->data;
+
+						if (zoneCtr == intParams[2] && zone) {
+							e_zone_desk_flip_to(zone, intParams[4], intParams[3]);	
+
+							done = 1;
+						 }
+
+						 zoneCtr++;
+					 }
+				}
+
+				containerCtr++;
+			}
+		}
+		managerCtr++;
+	}
+
+	if (done == 0) {
+		printf("Warning: Could not change to requested desk Manager(%i), Container(%i), Zone(%i), Row(%i), Column(%i)\n",
+			intParams[0], intParams[1], intParams[2], intParams[3], intParams[4]
+		);
+	}
+}
+
+/***************************************************************************/
 static void
 _e_actions_cb_menu_end(void *data, E_Menu *m)
 {
@@ -788,6 +904,8 @@
    
    ACT_GO(desk_linear_flip_to);
 
+   ACT_GO(desk_flip_to_complete);
+
    ACT_GO(menu_show);
    ACT_GO_MOUSE(menu_show);
    ACT_GO_KEY(menu_show);
diff -u -r e/src/bin/e_ipc_handlers.h /home/mcgmar0u/source/e/src/bin/e_ipc_handlers.h
--- e/src/bin/e_ipc_handlers.h	2005-07-06 13:17:03.000000000 -0500
+++ /home/mcgmar0u/source/e/src/bin/e_ipc_handlers.h	2005-07-06 14:05:30.000000000 -0500
@@ -4019,6 +4019,41 @@
 #endif
 #undef HDL
  
+/****************************************************************************/
+#define HDL E_IPC_OP_EXEC_ACTION
+#if (TYPE == E_REMOTE_OPTIONS)
+	OP("-exec-action", 2, "Executes an action given the name (OPT1) and a string of parameters (OPT2).", 0, HDL)
+#elif (TYPE == E_REMOTE_OUT)
+	REQ_2STRING(params[0], params[1], HDL);
+#elif (TYPE == E_WM_IN)
+	STRING2(actionName, paramList, e_2str, HDL);
+	{
+		Evas_List *m;
+		E_Manager *man;
+		E_Action
+			*act
+		;
+
+		man = NULL;
+
+		m = e_manager_list();
+		if (m) {
+			man = m->data;
+
+			if (man) {
+				act = e_action_find(actionName);
+
+				if (act && act->func.go) {
+					act->func.go(E_OBJECT(man), paramList);
+				}
+			}
+		}
+	}
+	END_STRING2(e_2str)
+#elif (TYPE == E_REMOTE_IN)
+#endif
+#undef HDL
+
 #if 0
 }
 #endif
diff -u -r e/src/bin/e_ipc_handlers_list.h /home/mcgmar0u/source/e/src/bin/e_ipc_handlers_list.h
--- e/src/bin/e_ipc_handlers_list.h	2005-07-06 13:17:03.000000000 -0500
+++ /home/mcgmar0u/source/e/src/bin/e_ipc_handlers_list.h	2005-07-06 13:49:54.000000000 -0500
@@ -196,3 +196,4 @@
 #define E_IPC_OP_FOCUS_SETTING_SET 196
 #define E_IPC_OP_FOCUS_SETTING_GET 197
 #define E_IPC_OP_FOCUS_SETTING_GET_REPLY 198
+#define E_IPC_OP_EXEC_ACTION 199

Reply via email to