[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [E-devel] Pager patch



On Thu, 16 Nov 2006 19:40:58 +0100
lok <heka.lok@gmail.com> wrote:

> Hi,
> 
> I've made some changement on the pager config.
> The first one let the user choose the mouse button he wants for the two
> type of drag.
> And the second disable the wheel callback on the pager. The wheel
> callback on the pager works only if the pager is in a shelf "above
> everything". By default it's disabled because scrolling above the pager
> in this case make you switch by a step of 2 desktops (one is done by
> the pager's callback and the other by the E's default mousebinding).
> 
> The pager is probably the most used module, so I prefere to not commit
> this patch directly. (just to be sure to not be hunt down if I've made
> a mistake). And the patch also fix a small warning.
> 
> Lok

ok sorry about the double posting. 
I forgot to change two values before making the patch.
This one is the good one. (No need to apply the previous)

Lok
Index: pager/e_mod_config.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_config.c,v
retrieving revision 1.22
diff -u -u -r1.22 e_mod_config.c
--- pager/e_mod_config.c	3 Sep 2006 07:40:45 -0000	1.22
+++ pager/e_mod_config.c	16 Nov 2006 19:36:54 -0000
@@ -1,11 +1,37 @@
 #include "e.h"
 #include "e_mod_main.h"
 
+typedef enum _Pager_Grab_Button Pager_Grab_Button;
+enum _Pager_Grab_Button
+{
+   GRAB_BUTTON_DRAG,
+   GRAB_BUTTON_NOPLACE
+};
+
 struct _E_Config_Dialog_Data
 {
    int show_popup;
    double popup_speed;
    int drag_resist;
+   unsigned char btn_drag;
+   unsigned char btn_noplace;
+   int flip_desk;
+
+   struct
+     {
+	Ecore_X_Window bind_win;
+	E_Dialog *dia;
+	Evas_List *handlers;
+
+	unsigned char *button1;
+	unsigned char *button2;
+     } grab;
+
+   struct
+     {
+	Evas_Object *o_btn1;
+	Evas_Object *o_btn2;
+     } gui;
 };
 
 /* Protos */
@@ -15,6 +41,11 @@
 static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
 static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
+static void _advanced_update_button_label(E_Config_Dialog_Data *cfdata);
+static void _grab_wnd_show(void *data1, void *data2);
+static void _grab_wnd_hide(E_Config_Dialog_Data *cfdata);
+static int _grab_mouse_down_cb(void *data, int type, void *event);
+static int _grab_key_down_cb(void *data, int type, void *event);
 
 void 
 _config_pager_module(Config_Item *ci)
@@ -47,6 +78,9 @@
    cfdata->show_popup = pager_config->popup;
    cfdata->popup_speed = pager_config->popup_speed;
    cfdata->drag_resist = pager_config->drag_resist;
+   cfdata->btn_drag = pager_config->btn_drag;
+   cfdata->btn_noplace = pager_config->btn_noplace;
+   cfdata->flip_desk = pager_config->flip_desk;
 }
 
 static void *
@@ -111,6 +145,25 @@
    e_widget_framelist_object_append(of, ob);
    e_widget_list_object_append(o, of, 1, 1, 0.5);   
 
+   of = e_widget_frametable_add(evas, _("Buttons Settings"), 0);
+   ob = e_widget_label_add(evas, _("Drag and select button"));
+   e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
+   ob = e_widget_label_add(evas, _("Drag no place button"));
+   e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1);
+   ob = e_widget_button_add(evas, _("Click to set"), NULL, _grab_wnd_show, (void *)GRAB_BUTTON_DRAG, cfdata);
+   e_widget_frametable_object_append(of, ob, 2, 1, 1, 1, 1, 1, 0, 0);
+   cfdata->gui.o_btn1 = ob;
+   ob = e_widget_button_add(evas, _("Click to set"), NULL, _grab_wnd_show, (void *)GRAB_BUTTON_NOPLACE, cfdata);
+   e_widget_frametable_object_append(of, ob, 2, 2, 1, 1, 1, 1, 0, 0);
+   cfdata->gui.o_btn2 = ob;
+   _advanced_update_button_label(cfdata);
+   e_widget_list_object_append(o, of, 1, 1, 0.5);   
+   
+   of = e_widget_framelist_add(evas, _("Wheel callback"), 0);   
+   ob = e_widget_check_add(evas, _("Flip desktop on mouse wheel"), &(cfdata->flip_desk));
+   e_widget_framelist_object_append(of, ob);
+   e_widget_list_object_append(o, of, 1, 1, 0.5);   
+
    return o;
 }
 
@@ -120,7 +173,135 @@
    pager_config->popup = cfdata->show_popup;
    pager_config->popup_speed = cfdata->popup_speed;
    pager_config->drag_resist = cfdata->drag_resist;
+   pager_config->btn_drag = cfdata->btn_drag;
+   pager_config->btn_noplace = cfdata->btn_noplace;
+   pager_config->flip_desk = cfdata->flip_desk;
    _pager_cb_config_updated();
    e_config_save_queue();
+   return 1;
+}
+
+static void
+_advanced_update_button_label(E_Config_Dialog_Data *cfdata)
+{
+   char label[strlen(_("Click to set"))];
+   
+   if (cfdata->btn_drag)
+     snprintf(label, strlen(_("Button "))+3, "Button %d", cfdata->btn_drag);
+   else
+     snprintf(label, strlen(_("Click to set"))+1, _("Click to set"));
+   e_widget_button_label_set(cfdata->gui.o_btn1, label);
+   
+   if (cfdata->btn_noplace)
+     snprintf(label, strlen(_("Button "))+3, "Button %d", cfdata->btn_noplace);
+   else
+     snprintf(label, strlen(_("Click to set"))+1, _("Click to set"));
+   e_widget_button_label_set(cfdata->gui.o_btn2, label);
+}
+
+static void
+_grab_wnd_show(void *data1, void *data2)
+{
+   E_Manager *man;
+   E_Config_Dialog_Data *cfdata;
+
+   man = e_manager_current_get();
+   cfdata = data2;
+
+   if ((Pager_Grab_Button)data1 == GRAB_BUTTON_DRAG)
+     {
+	cfdata->grab.button1 = &(cfdata->btn_drag);
+	cfdata->grab.button2 = &(cfdata->btn_noplace);
+     }
+   else
+     {
+	cfdata->grab.button1 = &(cfdata->btn_noplace);
+	cfdata->grab.button2 = &(cfdata->btn_drag);
+     }
+
+   cfdata->grab.dia = e_dialog_new(e_container_current_get(man), "Pager", "_pager_button_grab_dialog");
+   if (!cfdata->grab.dia) return;
+   e_dialog_title_set(cfdata->grab.dia, _("Pager Button Grab"));
+   e_dialog_icon_set(cfdata->grab.dia, "enlightenment/mouse_clean", 48);
+   e_dialog_text_set(cfdata->grab.dia, _("Please press a mouse button<br>"
+					 "Press <hilight>Escape</hilight> to abort.<br>"
+					 "Or <hilight>Del</hilight> to reset the button."));
+   e_win_centered_set(cfdata->grab.dia->win, 1);
+   e_win_borderless_set(cfdata->grab.dia->win, 1);
+
+   cfdata->grab.bind_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
+   ecore_x_window_show(cfdata->grab.bind_win);
+   e_grabinput_get(cfdata->grab.bind_win, 0, cfdata->grab.bind_win);
+
+   cfdata->grab.handlers = evas_list_append(cfdata->grab.handlers,
+			    ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
+				 _grab_key_down_cb, cfdata));
+   cfdata->grab.handlers = evas_list_append(cfdata->grab.handlers,
+			      ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
+				 _grab_mouse_down_cb, cfdata));
+
+   e_dialog_show(cfdata->grab.dia);
+}
+
+static void
+_grab_wnd_hide(E_Config_Dialog_Data *cfdata)
+{
+   while (cfdata->grab.handlers)
+     {
+	ecore_event_handler_del(cfdata->grab.handlers->data);
+	cfdata->grab.handlers = evas_list_remove_list(cfdata->grab.handlers, cfdata->grab.handlers);
+     }
+   cfdata->grab.handlers = NULL;
+   e_grabinput_release(cfdata->grab.bind_win, cfdata->grab.bind_win);
+   ecore_x_window_del(cfdata->grab.bind_win);
+   cfdata->grab.bind_win = 0;
+
+   e_object_del(E_OBJECT(cfdata->grab.dia));
+   cfdata->grab.dia = NULL;
+   _advanced_update_button_label(cfdata);
+}
+
+static int
+_grab_mouse_down_cb(void *data, int type, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+   Ecore_X_Event_Mouse_Button_Down *ev;
+   
+   ev = event;
+   cfdata = data;
+
+   if (ev->button != 3)
+     {
+	if (ev->button == *(cfdata->grab.button2))
+	  {
+	     *(cfdata->grab.button2) = *(cfdata->grab.button1);
+	     *(cfdata->grab.button1) = ev->button;
+	  }
+	else
+	  {
+	     *(cfdata->grab.button1) = ev->button;
+	  } 
+     }
+
+   _grab_wnd_hide(cfdata);
+   return 1;
+}
+
+static int
+_grab_key_down_cb(void *data, int type, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+   Ecore_X_Event_Key_Down *ev = event;
+
+   cfdata = data;
+
+   if (ev->win != cfdata->grab.bind_win) return 1;
+
+   if (!strcmp(ev->keyname, "Escape")) _grab_wnd_hide(cfdata);
+   if (!strcmp(ev->keyname, "Delete"))
+     {
+	*(cfdata->grab.button1) = 0;
+	_grab_wnd_hide(cfdata);
+     }
    return 1;
 }
Index: pager/e_mod_main.c
===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_main.c,v
retrieving revision 1.194
diff -u -u -r1.194 e_mod_main.c
--- pager/e_mod_main.c	15 Nov 2006 06:24:30 -0000	1.194
+++ pager/e_mod_main.c	16 Nov 2006 19:36:55 -0000
@@ -1318,8 +1318,8 @@
    pw = data;
    if (!pw) return;
    if (pw->border->lock_user_location) return;
-   /* FIXME: make this configurable */
-   if ((ev->button == 1) || (ev->button == 2))
+   if ((ev->button == pager_config->btn_drag) 
+	|| (ev->button == pager_config->btn_noplace))
      {
 	Evas_Coord ox, oy;
 
@@ -1332,7 +1332,8 @@
 	pw->drag.start = 1;
 	pw->drag.no_place = 0;
 	pw->drag.button = ev->button;
-	if (ev->button == 2) pw->drag.no_place = 1;
+	if (ev->button == pager_config->btn_noplace) 
+	  pw->drag.no_place = 1;
      }
 }
 
@@ -1345,8 +1346,8 @@
    ev = event_info;
    pw = data;
    if (!pw) return;
-   /* FIXME: make this configurable as above */
-   if ((ev->button == 1) || (ev->button == 2))
+   if ((ev->button == pager_config->btn_drag) 
+	|| (ev->button ==pager_config->btn_noplace))
      {  
 	if (!pw->drag.from_pager)
 	  {
@@ -1706,7 +1707,7 @@
    ev = event_info;
    pd = data;
 
-   e_zone_desk_linear_flip_by(pd->desk->zone, ev->z);
+   if (pager_config->flip_desk) e_zone_desk_linear_flip_by(pd->desk->zone, ev->z);
 }
 
 static int
@@ -1741,6 +1742,9 @@
    E_CONFIG_VAL(D, T, drag_resist, UINT);
    E_CONFIG_VAL(D, T, scale, UCHAR);
    E_CONFIG_VAL(D, T, resize, UCHAR);
+   E_CONFIG_VAL(D, T, btn_drag, UCHAR);
+   E_CONFIG_VAL(D, T, btn_noplace, UCHAR);
+   E_CONFIG_VAL(D, T, flip_desk, UINT);
 
    pager_config = e_config_domain_load("module.pager", conf_edd);
 
@@ -1752,12 +1756,19 @@
 	pager_config->drag_resist = 3;
 	pager_config->scale = 1;
 	pager_config->resize = PAGER_RESIZE_BOTH;
+	pager_config->btn_drag = 1;
+	pager_config->btn_noplace = 2;
+	pager_config->flip_desk = 0;
      }
    E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0);
    E_CONFIG_LIMIT(pager_config->popup, 0, 1);
    E_CONFIG_LIMIT(pager_config->drag_resist, 0, 50);
-   E_CONFIG_LIMIT(pager_config->scale, 0, 1);
    E_CONFIG_LIMIT(pager_config->resize, PAGER_RESIZE_HORZ, PAGER_RESIZE_BOTH);
+   E_CONFIG_LIMIT(pager_config->flip_desk, 0, 1);
+
+   if (pager_config->scale > 1) pager_config->scale = 1;
+   if (pager_config->btn_drag > 10) pager_config->btn_drag = 10;
+   if (pager_config->btn_noplace > 10) pager_config->btn_noplace = 10;
 
    pager_config->handlers = evas_list_append
      (pager_config->handlers, ecore_event_handler_add
Index: pager/e_mod_main.h
===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_main.h,v
retrieving revision 1.48
diff -u -u -r1.48 e_mod_main.h
--- pager/e_mod_main.h	6 Jun 2006 15:23:44 -0000	1.48
+++ pager/e_mod_main.h	16 Nov 2006 19:36:55 -0000
@@ -33,6 +33,10 @@
    Evas_List       *instances;
    E_Menu          *menu;
    Evas_List       *handlers;
+
+   unsigned char    btn_drag;
+   unsigned char    btn_noplace;
+   unsigned int     flip_desk;
 };
 
 struct _Config_Item