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

[E-devel] Pager patch



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
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 18:14:57 -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 18:14:58 -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 > 1) pager_config->btn_drag = 1;
+   if (pager_config->btn_noplace > 1) pager_config->btn_noplace = 1;
 
    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 18:14:58 -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