From 48afecfd9c5a543e88b5590c6a5547e59bf8e307 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Sun, 16 Dec 2001 08:23:09 +0000 Subject: [PATCH] Rewrote mouse-properties capplet. --- capplets/mouse/Makefile.am | 52 +- capplets/mouse/double-click-maybe.png | Bin 0 -> 4491 bytes capplets/mouse/double-click-off.png | Bin 0 -> 4495 bytes capplets/mouse/double-click-on.png | Bin 0 -> 4627 bytes capplets/mouse/gnome-mouse-properties.c | 616 +++++++++------ capplets/mouse/gnome-mouse-properties.glade | 790 ++++++++++++++++++++ capplets/mouse/mouse-left.png | Bin 9532 -> 9676 bytes capplets/mouse/mouse-properties-capplet.c | 616 +++++++++------ capplets/mouse/mouse-right.png | Bin 9448 -> 9572 bytes 9 files changed, 1574 insertions(+), 500 deletions(-) create mode 100644 capplets/mouse/double-click-maybe.png create mode 100644 capplets/mouse/double-click-off.png create mode 100644 capplets/mouse/double-click-on.png create mode 100644 capplets/mouse/gnome-mouse-properties.glade diff --git a/capplets/mouse/Makefile.am b/capplets/mouse/Makefile.am index c08eb17b8..6c39ce955 100644 --- a/capplets/mouse/Makefile.am +++ b/capplets/mouse/Makefile.am @@ -1,54 +1,26 @@ -cappletname = mouse -cappletgroup = -bin_PROGRAMS = mouse-properties-control -bin_SCRIPTS = mouse-properties-capplet +bin_PROGRAMS = gnome-mouse-properties -mouse_properties_control_LDADD = $(GNOMECC_CAPPLETS_LIBS) +gnome_mouse_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) -mouse_properties_control_SOURCES = \ +gnome_mouse_properties_SOURCES = \ mouse-properties-capplet.c -DESKTOP_EXEC_LINE = gnomecc --run-capplet mouse-properties - -pixmap_DATA = mouse-left.png mouse-right.png - -defaultsdir= $(datadir)/control-center/defaults -defaults_DATA = mouse-properties.xml - -oafdir = $(datadir)/oaf -oaf_DATA = Bonobo_Control_Capplet_mouse_properties.oaf +pixmapdir = $(GNOMECC_PIXMAPS_DIR) +pixmap_DATA = \ + double-click-on.png \ + double-click-off.png \ + double-click-maybe.png \ + mouse-left-2.png \ + mouse-right-2.png +Gladedir = $(GNOMECC_GLADE_DIR) +Glade_DATA = gnome-mouse-properties.glade ## ## You should not need to modify anything below this line ## @INTLTOOL_DESKTOP_RULE@ -$(bin_SCRIPTS): $(top_srcdir)/capplets/common/wrapper-script.in - sed -e "s#@BINDIR@#$(bindir)#" -e "s#@CAPPLET_NAME@#$(cappletname)-properties#" < $< > $@ - chmod a+x $@ - -$(oaf_DATA): %.oaf: $(top_srcdir)/capplets/common/Bonobo_Control_Capplet_generic.oaf.in - sed -e "s#@BINDIR@#$(bindir)#" -e "s#@SHORT_CAPPLET_NAME@#$(cappletname)#" -e "s#@CAPPLET_BINARY_NAME@#$(bin_PROGRAMS)#" < $< > $@ - -####@###GNOMECC_CAPPLETS_DESKTOP_IN_RULE@ -$(desktop).in: %.desktop.in: %.desktop.in.in - sed -e "s#@DESKTOP_EXEC_LINE@#$(DESKTOP_EXEC_LINE)#" -e "s#Icon=.*#Icon=$(GNOMECC_ICONS_DIR)/${cappletname}-capplet.png#" < $< > ${cappletname}.desktop.in - -install-data-local: - $(mkinstalldirs) $(DESTDIR)$(datadir)/control-center/capplets/$(cappletgroup) - $(INSTALL_DATA) $(desktop) $(DESTDIR)$(datadir)/control-center/capplets/$(cappletgroup)$(desktop) - install-data-am: install-data-local -####@###GNOMECC_CAPPLETS_DESKTOP_IN_RULE@ INCLUDES = $(GNOMECC_CAPPLETS_CFLAGS) CLEANFILES = $(GNOMECC_CAPPLETS_CLEANFILES) -EXTRA_DIST = $(GNOMECC_CAPPLETS_EXTRA_DIST) $(oaf_DATA).in $(defaults_DATA) $(pixmap_DATA) -iconsdir = $(GNOMECC_ICONS_DIR) -Gladedir = $(GNOMECC_GLADE_DIR) -pixmapdir = $(GNOMECC_PIXMAPS_DIR) -Glade_DATA = $(cappletname)-properties.glade -icons_DATA = $(cappletname)-capplet.png -desktop = $(cappletname).desktop -oaffile = $(oaf_DATA) -all-local: $(desktop) diff --git a/capplets/mouse/double-click-maybe.png b/capplets/mouse/double-click-maybe.png new file mode 100644 index 0000000000000000000000000000000000000000..e464a6d965faa5abd47a272c669bbaa4db2823a6 GIT binary patch literal 4491 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 literal 0 HcmV?d00001 diff --git a/capplets/mouse/double-click-off.png b/capplets/mouse/double-click-off.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5272bd522396fb78df640a3bd0e7e7b8de3867 GIT binary patch literal 4495 zcmV;A5peE_P)LP*n(zw8*VmMTH^+qLmP> zN~^XX3`DA+B@!x1BT=briV@6`|I z-0K@-J3&>CbadWlum4*A_1atbKWt}!iPwOg0n>ugLF}NYKud@QP<5fx1v$(A%O>T$ z5F)S%Fafk6bbx6vbHF@==~_tIKqMHK5WWw3TnL50KoJE{ya1|LuV`BktAxbkZdc6p zfv^d_4^bEV8iZ9aT?l@xGcOVu_48)DFll2}=L6|r% ze7WDjOF#;tP;5)UDFTQAD3mC8#h=9ftrquvw)%Q#y1e?I&1U&|lL#Pzj4umOSMqpAgG02s7fu`X5 zgpP$lKsOEgoZtk^YXTvF&w*Ow_0a+{27+3d#k-LByBD{D6RiOR0TTi4Je5d5lA2-| z2R5cS6hS`_ydo`+&IoJ;vt5xXtrf6s4~RpL9YkgfYCtvvL5k6{Y)POJvm`E@##{4XTGeXEMHa3`!AX^1RMO^X&XXpk;-6u0!J)FwQ@+nOw?ls)3AW^)^M&?@TCFJ2;S_$p4W&( zwf2KJFqV)-xYFVR1PSPjAuI=En?Yx{<2$$ETkpWzC6rY}p2jQ-W>z3Jpax%B!U=)6 zHY!o$b4fEk2o9+o3cNsdISbeZscDW35!+?}+q@(Z+I3Xw@R5aBpsh`Gnjys3fV%;a z7-WXPCLuDI86ivyOc;Dst2S66h`h||jEyfe=Z$ZQUd{rh@c}*mkx3x9#xLq5RGx_-D1t#~JOA~3N5-w3R(!(7)&B)sO1h8!i&w%{gCm${N@0B011uU3Z~(l8G=(V#$!7W z<|61?hfpC~6qyrjJFYFzGjP%nPKfBa z_3dkq@A~$Ke|K8blRH+=9V>&L_KsCSH$h?%nGO@Oizw9kH!2v-km_KgeQm}xWA^Z% zm(2r>^BS6u$M(?dMm=bW-4ZZ!0j48N5+fmjjR;;6$04)3`=6)Z{hK%5DaRf^z=6jP zpvR4devGtQFqbIXO)LwQGp*pl1V%P7GE`g%p;4qZN17z-%;hLl)hI)Aqy*E{C0c^@ z)PM99m<;ADX4fQv7J3#)4Vvfnh3{l{^w*!^rt5d`)WH=_{%n=7xf~nUPW@CH*%Ar! zT@Ci6aof^L&w)D79)hA2^|-;;V|rf$s7kQmasZ?j+;|9$;N(qx(rz?UDo6olfGk;p zv6yI*pfOrt!n(A(C$sCTte`x$%HVXLL8{Q1pVsO5U}mR0v(Cv>Uo=l8$N*~!sVahK ztvoq}&_+$Dg|{9m9kaxxD5Moas2zD^$_&Dw2H{gMd1HmDz=TcA!a&%*8Ocqq#e#I~ z&NjtBcllD8xZ~|m)&^tyqL`gqr_Hv-X*)ANL6||O7gfcHZ=$FUoi{Yf3t$7Pp%L^S|X2%B|M^A5x)rd<*$1f$l@c{Jo9?1;-J{%G|cU+N72Y3l3v zUnzD+QpjXWB{(G*WpXk|6>4i2sOEM0ARmiBO({KOuD(JTH8z0ih(?A2Aw}2(dO*K9 zrU;oDQvcoTt6_m;otK2t*?vW!Np&HFKMboLC~OtxL>L7h2RVIZ4Ihtk>Z?c zQ3l)4RC17VEb4jG53dVw{uKaJCD_J+eT7mYCPzpy^e|xqLm#7kBy1uK6jPQ^rAoP} zc1s#0>iRn$@SmB!<#ta0`?o+9trU|S_nMsWI(gdT4+ipsf#R&!Ua5W!)ow%8984Sa zzU~p43Ip|*r%xS5o5sO39P|ZBSqB`_+5+Jm(1l*-LHkU)|6R*(?%X-?TK(Y1Kl6cq zIXw9B{@=g#?|Jga zKiW4n)mc1x>^T4UrLXeQkA8^AS$6E$L7YtT)SIs1#t-}+Pk!m2`RBc>L?Q36O{oLn1|5Rl8yX7`NI&d$mWQ`(IC`)Mn>npkduKjJa zxCf~$h^y;wYfu#V)6I{3><@qYqaXaF`+oZekL`c$;^HE495FLH&zHXZWl-ht;lnI# z-Gzpltb<1%#wbJq;%I`kVx5!6kMR1}-^Q(Pcr!o$`SYxvIm4g)@y8e6arb-PKGSKv zeWKN3?_d1Y!S8+d;osQ!9S&;=u6&iV62p`9w-A{C>)^g;kbhdc^64Kw@q-&ggd<0e za_jAHMnvdtY_PJj!nN03hpK`qd7k6F=f}71;ScfX)S&v??&++3Y_@8H<;K}7pZK%A zH;5QIommzZi#o-lOifQSH9cJm4|wm%vW&I0HHP(!QrGgQPM>D7JxLtLhzM0xp{m%X zOA%u+u1&jRnVH?>mRsIHQ2yb*gM0*dUO(C4xW4Nd2V~-n^;_2 z;??#C7kw#?W9|2P{P2m#nVz2J+H0@F`-;iV3^an!46dpK?*l8=5Y5=AjlbYAe$voQxA0#jAe!3L;u;Mr%GoSNn8tFK~d>vo=f_5c9)-+zA# zpxf>G<>h5PapHvk)Tci63#Hw~Ds9QK41lw1YZzmgUD!%ddX|=!P*utzXKnQ)=T=u( zIdK#*rkUOV>s-BCi-=H`IlYau6#0M?$B&_^WR37Dg0+U-yLWT;>>39S{FIfI6#ynC zCMJrah?ka@;u9xMMDz3W(Y}5AqJ8`Jjkh~51MsrG)O$~>)uJd%y!UL`w#=@puE7{n zQzkF@`HP1+cJv5&Ho#XEy^XVMtes+G?Gz_Z90wp9^Z=zSGFH!=!h27}+O~{_Kvj8+wREOtICbhIM~@sKP7~w0aPtCKow#Knz$0*AZ5n*a-iZo3}?+&#O(ChV)vC z+U@q}I?r>esv^rWj4@PIH3CtVc$g+$mim=vFHvSUFF(K6XA&R1rpvD-CF_dLV2mw_c z{j)5~(Rct^mTd_k^qXmBwbq6_&x@icvNTPjIF74JIk6c!v8v*n8=Z#`7z_rZBsCPE zEK5|CD2j-ph!Dcae};m_af~)~)A*KU*{GHp0-K+oKeV~IIhCgAOq!-sgTbJqsuRYT z1c*AFjvWjJG7i9u0kA_03~LuvCCjo=EKk#vG)-SdtKqw8nj#`tYw_L_LKrDQL`Hx@ z2qVP|X*m3U6h%c*6cgV2q$r9ggb;b}qrqU{s;Y8Hl1Q4SGB-D8+@-Sf@aJV&jxy?C zFrd|HjRYBja?atLBg?YUv!W<)O+Lu7^O0sK?2vAwY~4__sw!HoR(~)U#Ll@?>Kep& z@3pEbud15oxn7tDbWC^!{``Rl9;mCvF^7)hn4%~~S=L%R@{e%}RaG^LQsY`427@8> zLI}ihJPH6+Rq@zkkCjQ1Y=jUp?|tsQ&$Vv<{n$R*>;>E(9$$Roi6c5xEK9O1NanVWCExpU=}SB^A3bm*bAh6!nCi6I4tf{Vxq$fJ)w%KrWPdHCUnSzljY z-@SYHzb!8>AGX%^opYN}6m67cxlvVBx7BK$P1CeHKR>^@va*t0ef8DF7r*#LFBed$ zS+gV>TRTbW)nc{*w*bq)uDkEP`%Pt8?%1(o2Y1|YM>#Vyvmqiyk|aeO$3;UQ>2|xF zvMgKOZg=*Z-~1-3%CTd|ICSU`06TZ?d}!CMUC+1M?QZj338c=sepOXHRo%4Ku9s!m zU07J?rD$t(*WBEyat$U-q|v?%8-i4 zX%Q)$bG=rpwK6?Dea<;&XJ=>ABuPRX$HrQVwe{pqQ52g=l6YWXjM)&8%zM94RaLRD zu#inoPUc_v%2&#vFUUnIQ!}G|(W5;9+Xfk#jhG9SacakIlkWQyVk|f4jD@#jD zHiTfCDCMFk3V;tGcva0OCnw7W$RNwIYI1TiE6cKY>7|#l7hZUwnQ**B5qE(<$e5t! z0t-!yfsMw_?bwv8I#vaG!Kc~KOh zEX! zGZREaRaHbpLkPC9l3!a}8@?OHzSBzy{z?EY+T>htPcBl53^lJ~t6gTy^mgoC7!z17 hSYFhNFE#$+_P@_@k#p8aTJit@002ovPDHLkV1f?^je`IH literal 0 HcmV?d00001 diff --git a/capplets/mouse/double-click-on.png b/capplets/mouse/double-click-on.png new file mode 100644 index 0000000000000000000000000000000000000000..14c9da6b7db0742074447d28497225db19dc6008 GIT binary patch literal 4627 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 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "capplet-util.h" -#include "bonobo-property-editor-range.h" - +#include +#include #include +#include -/* Needed only for the mouse capplet */ -#include -#include - -/* Maximum number of mouse buttons we handle. */ -#define MAX_BUTTONS 10 - -/* Half the number of acceleration levels we support. */ -#define MAX_ACCEL 3 - -/* Maximum threshold we support. */ -#define MAX_THRESH 7 - -/* apply_settings - * - * Apply the settings of the property bag. This function is per-capplet, though - * there are some cases where it does not do anything. - */ - -static void -apply_settings (Bonobo_ConfigDatabase db) +enum { - unsigned char buttons[MAX_BUTTONS], i; - int nbuttons, num, den, idx_1 = 0, idx_3 = 1; - ulong accel, threshold; - gboolean rtol; - CORBA_Environment ev; + DOUBLE_CLICK_TEST_OFF, + DOUBLE_CLICK_TEST_MAYBE, + DOUBLE_CLICK_TEST_ON, +}; - CORBA_exception_init (&ev); +GladeXML *xml; +GdkPixbuf *left_handed_pixbuf; +GdkPixbuf *right_handed_pixbuf; +GdkPixbuf *double_click_on_pixbuf; +GdkPixbuf *double_click_maybe_pixbuf; +GdkPixbuf *double_click_off_pixbuf; +GConfClient *client; - rtol = bonobo_config_get_ulong (db, "/main/right-to-left", &ev); +gint double_click_state = DOUBLE_CLICK_TEST_OFF; +guint32 double_click_timestamp = 0; +guint test_maybe_timeout_id = 0; +guint test_on_timeout_id = 0; - nbuttons = XGetPointerMapping (GDK_DISPLAY (), buttons, MAX_BUTTONS); +#define LEFT_HANDED_KEY "/desktop/gnome/peripherals/mouse/left_handed" +#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" +#define MOTION_ACCELERATION_KEY "/desktop/gnome/peripherals/mouse/motion_acceleration" +#define MOTION_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/motion_threshold" +#define DRAG_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/drag_threshold" - for (i = 0; i < nbuttons; i++) { - if (buttons[i] == 1) - idx_1 = i; - else if (buttons[i] == ((nbuttons < 3) ? 2 : 3)) - idx_3 = i; - } - if ((rtol && idx_1 < idx_3) || (!rtol && idx_1 > idx_3)) { - buttons[idx_1] = ((nbuttons < 3) ? 2 : 3); - buttons[idx_3] = 1; - } - XSetPointerMapping (GDK_DISPLAY (), buttons, nbuttons); - - CORBA_exception_init (&ev); - - accel = bonobo_config_get_ulong (db, "/main/acceleration", &ev); - - if (accel < MAX_ACCEL) { - num = 1; - den = MAX_ACCEL - accel; - } else { - num = accel - MAX_ACCEL + 1; - den = 1; - } - - CORBA_exception_init (&ev); - - threshold = MAX_THRESH - bonobo_config_get_ulong (db, "/main/threshold", &ev); - - XChangePointerControl (GDK_DISPLAY (), True, True, - num, den, threshold); - - CORBA_exception_free (&ev); +/* normalilzation routines */ +/* All of our scales but double_click are on the range 1->10 as a result, we + * have a few routines to convert from whatever the gconf key is to our range. + */ +static gint +double_click_from_gconf (gint double_click) +{ + /* watch me be lazy */ + if (double_click < 150) + return 100; + else if (double_click < 250) + return 200; + else if (double_click < 350) + return 300; + else if (double_click < 450) + return 400; + else if (double_click < 550) + return 500; + else if (double_click < 650) + return 600; + else if (double_click < 750) + return 700; + else if (double_click < 850) + return 800; + else if (double_click < 950) + return 900; + else + return 1000; } -/* set_pixmap_file - * - * Load the given pixmap and put it in the given widget. FIXME: Should this be in libcommon? - */ -static void -set_pixmap_file (GtkWidget *widget, const gchar *filename) +static gfloat +motion_acceleration_from_gconf (gfloat motion_acceleration) { - GdkPixbuf *pixbuf; - GdkPixmap *pixmap; - GdkBitmap *mask; + motion_acceleration = CLAMP (motion_acceleration, 0.2, 6.0); + if (motion_acceleration >=1) + return motion_acceleration + 4; + return motion_acceleration * 5; +} - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (filename != NULL); - - pixbuf = gdk_pixbuf_new_from_file (filename); - - if (pixbuf) { - gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &mask, 100); - gtk_pixmap_set (GTK_PIXMAP (widget), - pixmap, mask); - gdk_pixbuf_unref (pixbuf); - } +static gfloat +motion_acceleration_to_gconf (gfloat motion_acceleration) +{ + motion_acceleration = CLAMP (motion_acceleration, 1.0, 10.0); + if (motion_acceleration < 5) + return motion_acceleration / 5.0; + return motion_acceleration - 4; +} +static gfloat +threshold_from_gconf (gfloat drag_threshold) +{ + return CLAMP (drag_threshold, 1, 10); } -static GtkWidget * -mouse_capplet_create_image_widget_canvas (gchar *filename) +/* Double Click handling */ + +static gboolean +test_maybe_timeout (gpointer data) { - GtkWidget *canvas; - GdkPixbuf *pixbuf; - double width, height; - gchar *filename_dup; + GtkWidget *darea; + darea = glade_xml_get_widget (xml, "double_click_darea"); + double_click_state = DOUBLE_CLICK_TEST_OFF; + gtk_widget_queue_draw (darea); - filename_dup = g_strdup (filename); - pixbuf = gdk_pixbuf_new_from_file (filename_dup); + *((gint *)data) = 0; - if (!pixbuf) { - g_warning ("Pixmap %s not found.", filename_dup); - g_free (filename_dup); - return NULL; + return FALSE; +} + +static gint +drawing_area_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer data) +{ + GtkWidget *scale; + GtkWidget *darea; + gint double_click_time; + + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + scale = glade_xml_get_widget (xml, "delay_scale"); + double_click_time = 1000 * gtk_range_get_value (GTK_RANGE (scale)); + darea = glade_xml_get_widget (xml, "double_click_darea"); + + if (test_maybe_timeout_id != 0) + gtk_timeout_remove (test_maybe_timeout_id); + if (test_on_timeout_id != 0) + gtk_timeout_remove (test_on_timeout_id); + + switch (double_click_state) { + case DOUBLE_CLICK_TEST_OFF: + double_click_state = DOUBLE_CLICK_TEST_MAYBE; + test_maybe_timeout_id = gtk_timeout_add (double_click_time, test_maybe_timeout, &test_maybe_timeout_id); + break; + case DOUBLE_CLICK_TEST_MAYBE: + if (event->time - double_click_timestamp < double_click_time) { + double_click_state = DOUBLE_CLICK_TEST_ON; + test_on_timeout_id = gtk_timeout_add (2500, test_maybe_timeout, &test_on_timeout_id); + } + break; + case DOUBLE_CLICK_TEST_ON: + double_click_state = DOUBLE_CLICK_TEST_OFF; + break; } + + double_click_timestamp = event->time; + gtk_widget_queue_draw (darea); + + return TRUE; +} + +static gint +drawing_area_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer data) +{ + static gboolean first_time = 1; + GdkPixbuf *pixbuf; + + if (first_time) { + gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | GDK_BUTTON_PRESS_MASK); + g_signal_connect (widget, "button_press_event", (GCallback) drawing_area_button_press_event, NULL); + first_time = 0; + } + + gdk_draw_rectangle (widget->window, + widget->style->white_gc, + TRUE, 0, 0, + widget->allocation.width, + widget->allocation.height); + + switch (double_click_state) { + case DOUBLE_CLICK_TEST_ON: + pixbuf = double_click_on_pixbuf; + break; + case DOUBLE_CLICK_TEST_MAYBE: + pixbuf = double_click_maybe_pixbuf; + break; + case DOUBLE_CLICK_TEST_OFF: + pixbuf = double_click_off_pixbuf; + break; + } + + gdk_pixbuf_render_to_drawable_alpha (pixbuf, + widget->window, + 0, 0, + (widget->allocation.width - gdk_pixbuf_get_width (pixbuf))/2, + (widget->allocation.height - gdk_pixbuf_get_height (pixbuf))/2, + -1, -1, + GDK_PIXBUF_ALPHA_FULL, + 0, + GDK_RGB_DITHER_NORMAL, + 0, 0); - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); + return TRUE; +} - canvas = gnome_canvas_new_aa(); - GTK_OBJECT_UNSET_FLAGS (GTK_WIDGET (canvas), GTK_CAN_FOCUS); - gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(canvas)), - gnome_canvas_pixbuf_get_type (), - "pixbuf", pixbuf, + + +/* capplet->gconf settings */ + +static void +left_handed_toggle_callback (GtkWidget *toggle, gpointer data) +{ + GtkWidget *image; + image = glade_xml_get_widget (xml, "orientation_image"); + if (GTK_TOGGLE_BUTTON (toggle)->active) + g_object_set (G_OBJECT (image), + "pixbuf", left_handed_pixbuf, + NULL); + else + g_object_set (G_OBJECT (image), + "pixbuf", right_handed_pixbuf, + NULL); + gconf_client_set_bool (client, LEFT_HANDED_KEY, + GTK_TOGGLE_BUTTON (toggle)->active, NULL); - gtk_widget_set_usize (canvas, width, height); - - gdk_pixbuf_unref (pixbuf); - gtk_widget_show (canvas); - g_free (filename_dup); - - return canvas; } -GtkWidget * -mouse_capplet_create_image_widget (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) +static void +double_click_callback (GtkAdjustment *adjustment, gpointer data) { - GtkWidget *canvas, *alignment; - gchar *full_path; + gint double_click; - if (!string1) - return NULL; + double_click = gtk_adjustment_get_value (adjustment) * 1000; + /* we normalize this to avoid loops */ + if (double_click != double_click_from_gconf (double_click)) { + gtk_adjustment_set_value (adjustment, (double_click_from_gconf (double_click))/1000.0); + return; + } - full_path = g_strdup_printf ("%s/%s", GNOMECC_PIXMAPS_DIR, string1); - canvas = mouse_capplet_create_image_widget_canvas (full_path); - g_free (full_path); - - g_return_val_if_fail (canvas != NULL, NULL); - - alignment = gtk_widget_new (gtk_alignment_get_type(), - "child", canvas, - "xalign", (double) 0, - "yalign", (double) 0, - "xscale", (double) 0, - "yscale", (double) 0, - NULL); - - gtk_widget_show (alignment); - - return alignment; + gconf_client_set_int (client, DOUBLE_CLICK_KEY, + double_click, + NULL); } - -/** - * xst_fool_the_linker: - * @void: - * - * We need to keep the symbol for the create image widget function - * so that libglade can find it to create the icons. - **/ -void capplet_fool_the_linker (void); -void -capplet_fool_the_linker (void) +static void +threshold_callback (GtkAdjustment *adjustment, gpointer key) { - mouse_capplet_create_image_widget (NULL, NULL, NULL, 0, 0); + gint threshold; + + threshold = (gint) rint (gtk_adjustment_get_value (adjustment)); + + gconf_client_set_int (client, (char *) key, + threshold, + NULL); } -/* create_dialog - * - * Create the dialog box and return it as a GtkWidget - */ - -static GtkWidget * -create_dialog (void) +static void +acceleration_callback (GtkAdjustment *adjustment, gpointer data) +{ + gfloat acceleration; + + acceleration = gtk_adjustment_get_value (adjustment); + gconf_client_set_float (client, MOTION_ACCELERATION_KEY, + motion_acceleration_to_gconf (acceleration), + NULL); +} + +/* gconf->capplet */ +static void +gconf_changed_callback (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { - GladeXML *dialog; GtkWidget *widget; + const gchar *key = gconf_entry_get_key (entry); - dialog = glade_xml_new (GNOMECC_GLADE_DIR "/mouse-properties.glade", "prefs_widget"); - widget = glade_xml_get_widget (dialog, "prefs_widget"); - gtk_object_set_data (GTK_OBJECT (widget), "glade-data", dialog); + if (! strcmp (key, LEFT_HANDED_KEY)) { + gboolean left_handed; - gtk_signal_connect_object (GTK_OBJECT (widget), "destroy", - GTK_SIGNAL_FUNC (gtk_object_destroy), - GTK_OBJECT (dialog)); + left_handed = gconf_value_get_bool (gconf_entry_get_value (entry)); + widget = glade_xml_get_widget (xml, "left_handed_toggle"); + if (left_handed != GTK_TOGGLE_BUTTON (widget)->active) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), left_handed); + } else if (! strcmp (key, DOUBLE_CLICK_KEY)) { + int double_click; - return widget; + double_click = gconf_value_get_int (gconf_entry_get_value (entry)); + double_click = double_click_from_gconf (double_click); + widget = glade_xml_get_widget (xml, "delay_scale"); + if (double_click != (gint) 1000*gtk_range_get_value (GTK_RANGE (widget))) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); + } else if (! strcmp (key, MOTION_ACCELERATION_KEY)) { + gfloat acceleration; + + acceleration = gconf_value_get_float (gconf_entry_get_value (entry)); + acceleration = motion_acceleration_from_gconf (acceleration); + widget = glade_xml_get_widget (xml, "accel_scale"); + if (ABS (acceleration - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), acceleration); + } else if (! strcmp (key, MOTION_THRESHOLD_KEY)) { + int threshold; + + threshold = gconf_value_get_int (gconf_entry_get_value (entry)); + threshold = threshold_from_gconf (threshold); + widget = glade_xml_get_widget (xml, "sensitivity_scale"); + if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); + } else if (! strcmp (key, DRAG_THRESHOLD_KEY)) { + int threshold; + + threshold = gconf_value_get_int (gconf_entry_get_value (entry)); + threshold = threshold_from_gconf (threshold); + widget = glade_xml_get_widget (xml, "drag_threshold_scale"); + if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); + } } -/* setup_dialog - * - * Set up the property editors for our dialog - */ - static void -setup_dialog (GtkWidget *widget, Bonobo_PropertyBag bag) +setup_dialog (void) { - GladeXML *dialog; - BonoboPEditor *ed; - GtkWidget *rbs[3]; + GtkSizeGroup *size_group; + GtkWidget *widget; + int double_click; + int threshold; + gfloat acceleration; - dialog = gtk_object_get_data (GTK_OBJECT (widget), "glade-data"); + client = gconf_client_get_default (); + gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (client, "/desktop/gnome/peripherals/mouse", + gconf_changed_callback, + NULL, NULL, NULL); - rbs[0] = WID ("right_handed_select"); - rbs[1] = WID ("left_handed_select"); - rbs[2] = NULL; - ed = BONOBO_PEDITOR (bonobo_peditor_option_radio_construct (rbs)); - bonobo_peditor_set_property (ed, bag, "right-to-left", TC_ulong, NULL); + /* Buttons page + */ + /* Left-handed toggle */ + left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); + right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); + widget = glade_xml_get_widget (xml, "left_handed_toggle"); + if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); + g_signal_connect (widget, "toggled", (GCallback) left_handed_toggle_callback, NULL); - ed = BONOBO_PEDITOR (bonobo_peditor_range_construct (WID ("acceleration_entry"))); - bonobo_peditor_set_property (ed, bag, "acceleration", TC_ulong, NULL); + widget = glade_xml_get_widget (xml, "orientation_image"); + if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) + g_object_set (G_OBJECT (widget), + "pixbuf", left_handed_pixbuf, + NULL); + else + g_object_set (G_OBJECT (widget), + "pixbuf", right_handed_pixbuf, + NULL); - ed = BONOBO_PEDITOR (bonobo_peditor_range_construct (WID ("sensitivity_entry"))); - bonobo_peditor_set_property (ed, bag, "threshold", TC_ulong, NULL); -} + /* Double-click time */ + double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); + double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); + double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); + widget = glade_xml_get_widget (xml, "double_click_darea"); + g_signal_connect (widget, "expose_event", (GCallback) drawing_area_expose_event, NULL); -/* get_legacy_settings - * - * Retrieve older gnome_config -style settings and store them in the - * configuration database. - * - * In most cases, it's best to use the COPY_FROM_LEGACY macro defined in - * capplets/common/capplet-util.h. - */ + double_click = gconf_client_get_int (client, DOUBLE_CLICK_KEY, NULL); + double_click = double_click_from_gconf (double_click); + widget = glade_xml_get_widget (xml, "delay_scale"); + gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) double_click_callback, + NULL); -static void -get_legacy_settings (Bonobo_ConfigDatabase db) -{ - gboolean val_boolean, def; - gulong val_ulong; + /* Cursors page */ + widget = glade_xml_get_widget (xml, "main_notebook"); + gtk_notebook_remove_page (GTK_NOTEBOOK (widget), 1); - COPY_FROM_LEGACY (boolean, "/main/right-to-left", bool, "/Desktop/Mouse/right-to-left"); - COPY_FROM_LEGACY (ulong, "/main/acceleration", int, "/Desktop/Mouse/aceleration=4"); - COPY_FROM_LEGACY (ulong, "/main/threshold", int, "/Desktop/Mouse/threshold=4"); + /* Motion page */ + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "acceleration_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "sensitivity_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "threshold_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "high_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "fast_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "large_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "low_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "slow_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "small_label")); + + widget = glade_xml_get_widget (xml, "accel_scale"); + acceleration = gconf_client_get_float (client, MOTION_ACCELERATION_KEY, NULL); + acceleration = motion_acceleration_from_gconf (acceleration); + gtk_range_set_value (GTK_RANGE (widget), acceleration); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) acceleration_callback, + NULL); + + widget = glade_xml_get_widget (xml, "sensitivity_scale"); + threshold = gconf_client_get_int (client, MOTION_THRESHOLD_KEY, NULL); + threshold = threshold_from_gconf (threshold); + gtk_range_set_value (GTK_RANGE (widget), threshold); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) threshold_callback, + MOTION_THRESHOLD_KEY); + + widget = glade_xml_get_widget (xml, "drag_threshold_scale"); + threshold = gconf_client_get_int (client, DRAG_THRESHOLD_KEY, NULL); + threshold = threshold_from_gconf (threshold); + gtk_range_set_value (GTK_RANGE (widget), threshold); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) threshold_callback, + DRAG_THRESHOLD_KEY); + + /* main dialog */ + widget = glade_xml_get_widget (xml, "mouse_properties_dialog"); + g_signal_connect (G_OBJECT (widget), + "destroy", + gtk_main_quit, NULL); + widget = glade_xml_get_widget (xml, "close_button"); + g_signal_connect (G_OBJECT (widget), + "clicked", + gtk_main_quit, NULL); } int -main (int argc, char **argv) +main (int argc, char *argv[]) { - const gchar *legacy_files[] = { "Desktop", NULL }; + gnome_program_init ("mouse-properties", + "0.1", + gnome_gtk_module_info_get (), + argc, argv, + NULL); - glade_gnome_init (); - capplet_init (argc, argv, legacy_files, apply_settings, create_dialog, setup_dialog, get_legacy_settings); + xml = glade_xml_new ("gnome-mouse-properties.glade", NULL, NULL); + setup_dialog (); + gtk_widget_show_all (glade_xml_get_widget (xml, "mouse_properties_dialog")); + gtk_main (); + + g_object_unref (G_OBJECT (client)); return 0; } diff --git a/capplets/mouse/gnome-mouse-properties.glade b/capplets/mouse/gnome-mouse-properties.glade new file mode 100644 index 000000000..e18b73dbf --- /dev/null +++ b/capplets/mouse/gnome-mouse-properties.glade @@ -0,0 +1,790 @@ + + + + + + Mouse Properties + GTK_WINDOW_TOPLEVEL + no + no + no + no + GTK_WIN_POS_NONE + + + + no + 8 + yes + + + + GTK_BUTTONBOX_END + 8 + yes + + + + yes + yes + yes + gtk-help + yes + yes + + + + + + yes + yes + yes + gtk-close + yes + yes + + + + + 0 + no + yes + GTK_PACK_END + + + + + + yes + yes + yes + GTK_POS_TOP + no + 2 + 2 + no + yes + + + + 4 + no + 4 + yes + + + + Mouse Orientation + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 8 + yes + + + + yes + _Left-handed mouse + no + yes + yes + yes + + + 0 + no + no + + + + + + Left-handed mouse mode switches the left and right buttons on the mouse. + GTK_JUSTIFY_LEFT + yes + 0 + 0 + 0 + 0 + yes + + + 0 + yes + yes + + + + + 0 + yes + yes + + + + + + 0.5 + 0.5 + 0 + 0 + yes + + + 0 + no + yes + + + + + + + 0 + yes + yes + + + + + + Double-click Delay + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 8 + yes + + + + no + 4 + yes + + + + _Delay (sec): + GTK_JUSTIFY_CENTER + no + 0.5 + 1 + 0 + 0 + delay_scale + yes + yes + + + 0 + no + no + + + + + + yes + yes + GTK_POS_TOP + 1 + GTK_UPDATE_DISCONTINUOUS + yes + 0.4 0.1 1.1 0.1 0.1 0.1 + + + 0 + yes + yes + + + + + 0 + no + yes + + + + + + Maximum time allowed between clicks when double-clicking. Use the box on the right to test. + GTK_JUSTIFY_LEFT + yes + 0 + 0 + 0 + 0 + yes + + + 0 + yes + yes + + + + + 0 + yes + yes + + + + + + 0.5 + 0.5 + 0 + 0 + yes + + + + 0 + GTK_SHADOW_ETCHED_OUT + yes + + + + 100 + 100 + yes + + + + + + + 0 + no + yes + + + + + + + 0 + yes + yes + + + + + + + + _Buttons + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + + 4 + Mouse Cursor + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 4 + no + 4 + yes + + + + yes + + + + + + You will need to restart your login session for this setting to take effect. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + + + + + + _Cursors + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + + 4 + no + 4 + yes + + + + Speed + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 4 + 4 + 2 + 4 + yes + + + + _Acceleration: + GTK_JUSTIFY_CENTER + no + accel_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + 1 + 0 + 1 + 0 + 0 + fill + fill + + + + + + _Sensitivity: + GTK_JUSTIFY_CENTER + no + sensitivity_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + 1 + 1 + 2 + 0 + 0 + fill + fill + + + + + + <i>Fast</i> + yes + GTK_JUSTIFY_CENTER + no + 0 + 0.5 + 0 + 0 + yes + + + 3 + 4 + 0 + 1 + 0 + 0 + fill + + + + + + + <i>High</i> + yes + GTK_JUSTIFY_CENTER + no + 0 + 0.5 + 0 + 0 + yes + + + 3 + 4 + 1 + 2 + 0 + 0 + fill + + + + + + + yes + GTK_UPDATE_DISCONTINUOUS + no + GTK_POS_TOP + 0 + yes + 1 1 10 1 1 1 + + + 2 + 3 + 1 + 2 + 0 + 0 + expand|fill + fill + + + + + + yes + GTK_UPDATE_DISCONTINUOUS + no + GTK_POS_RIGHT + 1 + yes + 1 1 10 1 1 1 + + + 2 + 3 + 0 + 1 + 0 + 0 + fill + fill + + + + + + <i>Slow</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 1 + 2 + 0 + 1 + 0 + 0 + fill + + + + + + + <i>Low</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 1 + 2 + 1 + 2 + 0 + 0 + fill + + + + + + 0 + no + yes + + + + + + Set the speed of your pointing device. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + yes + yes + + + + + + + 0 + yes + yes + + + + + + Drag and Drop + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 4 + yes + + + + _Threshold: + GTK_JUSTIFY_CENTER + no + drag_threshold_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + no + no + + + + + + <i>Small</i> + yes + GTK_JUSTIFY_CENTER + no + 0.0 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + + yes + no + GTK_POS_TOP + 0 + yes + GTK_UPDATE_DISCONTINUOUS + 1 1 10 1 1 1 + + + 0 + yes + yes + + + + + + <i>Large</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + 0 + no + yes + + + + + + Set the distance you need to move your cursor before dragging an item. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + yes + yes + + + + + + + 0 + yes + yes + + + + + + + + _Motion + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + 0 + yes + yes + + + + + 4 + yes + yes + + + + diff --git a/capplets/mouse/mouse-left.png b/capplets/mouse/mouse-left.png index 099a34d04a3ab8f43a91869187ccc77fd6d2d1f4..8eb13b49c29c0ecca300db14e409575e985fbacf 100644 GIT binary patch literal 9676 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 diff --git a/capplets/mouse/mouse-properties-capplet.c b/capplets/mouse/mouse-properties-capplet.c index 6d63f25b9..4b3057b9f 100644 --- a/capplets/mouse/mouse-properties-capplet.c +++ b/capplets/mouse/mouse-properties-capplet.c @@ -1,287 +1,443 @@ -/* -*- mode: c; style: linux -*- */ - -/* mouse-properties-capplet.c - * Copyright (C) 2001 Ximian, Inc. - * - * Written by Bradford Hovinen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "capplet-util.h" -#include "bonobo-property-editor-range.h" - +#include +#include #include +#include -/* Needed only for the mouse capplet */ -#include -#include - -/* Maximum number of mouse buttons we handle. */ -#define MAX_BUTTONS 10 - -/* Half the number of acceleration levels we support. */ -#define MAX_ACCEL 3 - -/* Maximum threshold we support. */ -#define MAX_THRESH 7 - -/* apply_settings - * - * Apply the settings of the property bag. This function is per-capplet, though - * there are some cases where it does not do anything. - */ - -static void -apply_settings (Bonobo_ConfigDatabase db) +enum { - unsigned char buttons[MAX_BUTTONS], i; - int nbuttons, num, den, idx_1 = 0, idx_3 = 1; - ulong accel, threshold; - gboolean rtol; - CORBA_Environment ev; + DOUBLE_CLICK_TEST_OFF, + DOUBLE_CLICK_TEST_MAYBE, + DOUBLE_CLICK_TEST_ON, +}; - CORBA_exception_init (&ev); +GladeXML *xml; +GdkPixbuf *left_handed_pixbuf; +GdkPixbuf *right_handed_pixbuf; +GdkPixbuf *double_click_on_pixbuf; +GdkPixbuf *double_click_maybe_pixbuf; +GdkPixbuf *double_click_off_pixbuf; +GConfClient *client; - rtol = bonobo_config_get_ulong (db, "/main/right-to-left", &ev); +gint double_click_state = DOUBLE_CLICK_TEST_OFF; +guint32 double_click_timestamp = 0; +guint test_maybe_timeout_id = 0; +guint test_on_timeout_id = 0; - nbuttons = XGetPointerMapping (GDK_DISPLAY (), buttons, MAX_BUTTONS); +#define LEFT_HANDED_KEY "/desktop/gnome/peripherals/mouse/left_handed" +#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" +#define MOTION_ACCELERATION_KEY "/desktop/gnome/peripherals/mouse/motion_acceleration" +#define MOTION_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/motion_threshold" +#define DRAG_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/drag_threshold" - for (i = 0; i < nbuttons; i++) { - if (buttons[i] == 1) - idx_1 = i; - else if (buttons[i] == ((nbuttons < 3) ? 2 : 3)) - idx_3 = i; - } - if ((rtol && idx_1 < idx_3) || (!rtol && idx_1 > idx_3)) { - buttons[idx_1] = ((nbuttons < 3) ? 2 : 3); - buttons[idx_3] = 1; - } - XSetPointerMapping (GDK_DISPLAY (), buttons, nbuttons); - - CORBA_exception_init (&ev); - - accel = bonobo_config_get_ulong (db, "/main/acceleration", &ev); - - if (accel < MAX_ACCEL) { - num = 1; - den = MAX_ACCEL - accel; - } else { - num = accel - MAX_ACCEL + 1; - den = 1; - } - - CORBA_exception_init (&ev); - - threshold = MAX_THRESH - bonobo_config_get_ulong (db, "/main/threshold", &ev); - - XChangePointerControl (GDK_DISPLAY (), True, True, - num, den, threshold); - - CORBA_exception_free (&ev); +/* normalilzation routines */ +/* All of our scales but double_click are on the range 1->10 as a result, we + * have a few routines to convert from whatever the gconf key is to our range. + */ +static gint +double_click_from_gconf (gint double_click) +{ + /* watch me be lazy */ + if (double_click < 150) + return 100; + else if (double_click < 250) + return 200; + else if (double_click < 350) + return 300; + else if (double_click < 450) + return 400; + else if (double_click < 550) + return 500; + else if (double_click < 650) + return 600; + else if (double_click < 750) + return 700; + else if (double_click < 850) + return 800; + else if (double_click < 950) + return 900; + else + return 1000; } -/* set_pixmap_file - * - * Load the given pixmap and put it in the given widget. FIXME: Should this be in libcommon? - */ -static void -set_pixmap_file (GtkWidget *widget, const gchar *filename) +static gfloat +motion_acceleration_from_gconf (gfloat motion_acceleration) { - GdkPixbuf *pixbuf; - GdkPixmap *pixmap; - GdkBitmap *mask; + motion_acceleration = CLAMP (motion_acceleration, 0.2, 6.0); + if (motion_acceleration >=1) + return motion_acceleration + 4; + return motion_acceleration * 5; +} - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (filename != NULL); - - pixbuf = gdk_pixbuf_new_from_file (filename); - - if (pixbuf) { - gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &mask, 100); - gtk_pixmap_set (GTK_PIXMAP (widget), - pixmap, mask); - gdk_pixbuf_unref (pixbuf); - } +static gfloat +motion_acceleration_to_gconf (gfloat motion_acceleration) +{ + motion_acceleration = CLAMP (motion_acceleration, 1.0, 10.0); + if (motion_acceleration < 5) + return motion_acceleration / 5.0; + return motion_acceleration - 4; +} +static gfloat +threshold_from_gconf (gfloat drag_threshold) +{ + return CLAMP (drag_threshold, 1, 10); } -static GtkWidget * -mouse_capplet_create_image_widget_canvas (gchar *filename) +/* Double Click handling */ + +static gboolean +test_maybe_timeout (gpointer data) { - GtkWidget *canvas; - GdkPixbuf *pixbuf; - double width, height; - gchar *filename_dup; + GtkWidget *darea; + darea = glade_xml_get_widget (xml, "double_click_darea"); + double_click_state = DOUBLE_CLICK_TEST_OFF; + gtk_widget_queue_draw (darea); - filename_dup = g_strdup (filename); - pixbuf = gdk_pixbuf_new_from_file (filename_dup); + *((gint *)data) = 0; - if (!pixbuf) { - g_warning ("Pixmap %s not found.", filename_dup); - g_free (filename_dup); - return NULL; + return FALSE; +} + +static gint +drawing_area_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer data) +{ + GtkWidget *scale; + GtkWidget *darea; + gint double_click_time; + + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + scale = glade_xml_get_widget (xml, "delay_scale"); + double_click_time = 1000 * gtk_range_get_value (GTK_RANGE (scale)); + darea = glade_xml_get_widget (xml, "double_click_darea"); + + if (test_maybe_timeout_id != 0) + gtk_timeout_remove (test_maybe_timeout_id); + if (test_on_timeout_id != 0) + gtk_timeout_remove (test_on_timeout_id); + + switch (double_click_state) { + case DOUBLE_CLICK_TEST_OFF: + double_click_state = DOUBLE_CLICK_TEST_MAYBE; + test_maybe_timeout_id = gtk_timeout_add (double_click_time, test_maybe_timeout, &test_maybe_timeout_id); + break; + case DOUBLE_CLICK_TEST_MAYBE: + if (event->time - double_click_timestamp < double_click_time) { + double_click_state = DOUBLE_CLICK_TEST_ON; + test_on_timeout_id = gtk_timeout_add (2500, test_maybe_timeout, &test_on_timeout_id); + } + break; + case DOUBLE_CLICK_TEST_ON: + double_click_state = DOUBLE_CLICK_TEST_OFF; + break; } + + double_click_timestamp = event->time; + gtk_widget_queue_draw (darea); + + return TRUE; +} + +static gint +drawing_area_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer data) +{ + static gboolean first_time = 1; + GdkPixbuf *pixbuf; + + if (first_time) { + gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | GDK_BUTTON_PRESS_MASK); + g_signal_connect (widget, "button_press_event", (GCallback) drawing_area_button_press_event, NULL); + first_time = 0; + } + + gdk_draw_rectangle (widget->window, + widget->style->white_gc, + TRUE, 0, 0, + widget->allocation.width, + widget->allocation.height); + + switch (double_click_state) { + case DOUBLE_CLICK_TEST_ON: + pixbuf = double_click_on_pixbuf; + break; + case DOUBLE_CLICK_TEST_MAYBE: + pixbuf = double_click_maybe_pixbuf; + break; + case DOUBLE_CLICK_TEST_OFF: + pixbuf = double_click_off_pixbuf; + break; + } + + gdk_pixbuf_render_to_drawable_alpha (pixbuf, + widget->window, + 0, 0, + (widget->allocation.width - gdk_pixbuf_get_width (pixbuf))/2, + (widget->allocation.height - gdk_pixbuf_get_height (pixbuf))/2, + -1, -1, + GDK_PIXBUF_ALPHA_FULL, + 0, + GDK_RGB_DITHER_NORMAL, + 0, 0); - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); + return TRUE; +} - canvas = gnome_canvas_new_aa(); - GTK_OBJECT_UNSET_FLAGS (GTK_WIDGET (canvas), GTK_CAN_FOCUS); - gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(canvas)), - gnome_canvas_pixbuf_get_type (), - "pixbuf", pixbuf, + + +/* capplet->gconf settings */ + +static void +left_handed_toggle_callback (GtkWidget *toggle, gpointer data) +{ + GtkWidget *image; + image = glade_xml_get_widget (xml, "orientation_image"); + if (GTK_TOGGLE_BUTTON (toggle)->active) + g_object_set (G_OBJECT (image), + "pixbuf", left_handed_pixbuf, + NULL); + else + g_object_set (G_OBJECT (image), + "pixbuf", right_handed_pixbuf, + NULL); + gconf_client_set_bool (client, LEFT_HANDED_KEY, + GTK_TOGGLE_BUTTON (toggle)->active, NULL); - gtk_widget_set_usize (canvas, width, height); - - gdk_pixbuf_unref (pixbuf); - gtk_widget_show (canvas); - g_free (filename_dup); - - return canvas; } -GtkWidget * -mouse_capplet_create_image_widget (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) +static void +double_click_callback (GtkAdjustment *adjustment, gpointer data) { - GtkWidget *canvas, *alignment; - gchar *full_path; + gint double_click; - if (!string1) - return NULL; + double_click = gtk_adjustment_get_value (adjustment) * 1000; + /* we normalize this to avoid loops */ + if (double_click != double_click_from_gconf (double_click)) { + gtk_adjustment_set_value (adjustment, (double_click_from_gconf (double_click))/1000.0); + return; + } - full_path = g_strdup_printf ("%s/%s", GNOMECC_PIXMAPS_DIR, string1); - canvas = mouse_capplet_create_image_widget_canvas (full_path); - g_free (full_path); - - g_return_val_if_fail (canvas != NULL, NULL); - - alignment = gtk_widget_new (gtk_alignment_get_type(), - "child", canvas, - "xalign", (double) 0, - "yalign", (double) 0, - "xscale", (double) 0, - "yscale", (double) 0, - NULL); - - gtk_widget_show (alignment); - - return alignment; + gconf_client_set_int (client, DOUBLE_CLICK_KEY, + double_click, + NULL); } - -/** - * xst_fool_the_linker: - * @void: - * - * We need to keep the symbol for the create image widget function - * so that libglade can find it to create the icons. - **/ -void capplet_fool_the_linker (void); -void -capplet_fool_the_linker (void) +static void +threshold_callback (GtkAdjustment *adjustment, gpointer key) { - mouse_capplet_create_image_widget (NULL, NULL, NULL, 0, 0); + gint threshold; + + threshold = (gint) rint (gtk_adjustment_get_value (adjustment)); + + gconf_client_set_int (client, (char *) key, + threshold, + NULL); } -/* create_dialog - * - * Create the dialog box and return it as a GtkWidget - */ - -static GtkWidget * -create_dialog (void) +static void +acceleration_callback (GtkAdjustment *adjustment, gpointer data) +{ + gfloat acceleration; + + acceleration = gtk_adjustment_get_value (adjustment); + gconf_client_set_float (client, MOTION_ACCELERATION_KEY, + motion_acceleration_to_gconf (acceleration), + NULL); +} + +/* gconf->capplet */ +static void +gconf_changed_callback (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { - GladeXML *dialog; GtkWidget *widget; + const gchar *key = gconf_entry_get_key (entry); - dialog = glade_xml_new (GNOMECC_GLADE_DIR "/mouse-properties.glade", "prefs_widget"); - widget = glade_xml_get_widget (dialog, "prefs_widget"); - gtk_object_set_data (GTK_OBJECT (widget), "glade-data", dialog); + if (! strcmp (key, LEFT_HANDED_KEY)) { + gboolean left_handed; - gtk_signal_connect_object (GTK_OBJECT (widget), "destroy", - GTK_SIGNAL_FUNC (gtk_object_destroy), - GTK_OBJECT (dialog)); + left_handed = gconf_value_get_bool (gconf_entry_get_value (entry)); + widget = glade_xml_get_widget (xml, "left_handed_toggle"); + if (left_handed != GTK_TOGGLE_BUTTON (widget)->active) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), left_handed); + } else if (! strcmp (key, DOUBLE_CLICK_KEY)) { + int double_click; - return widget; + double_click = gconf_value_get_int (gconf_entry_get_value (entry)); + double_click = double_click_from_gconf (double_click); + widget = glade_xml_get_widget (xml, "delay_scale"); + if (double_click != (gint) 1000*gtk_range_get_value (GTK_RANGE (widget))) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); + } else if (! strcmp (key, MOTION_ACCELERATION_KEY)) { + gfloat acceleration; + + acceleration = gconf_value_get_float (gconf_entry_get_value (entry)); + acceleration = motion_acceleration_from_gconf (acceleration); + widget = glade_xml_get_widget (xml, "accel_scale"); + if (ABS (acceleration - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), acceleration); + } else if (! strcmp (key, MOTION_THRESHOLD_KEY)) { + int threshold; + + threshold = gconf_value_get_int (gconf_entry_get_value (entry)); + threshold = threshold_from_gconf (threshold); + widget = glade_xml_get_widget (xml, "sensitivity_scale"); + if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); + } else if (! strcmp (key, DRAG_THRESHOLD_KEY)) { + int threshold; + + threshold = gconf_value_get_int (gconf_entry_get_value (entry)); + threshold = threshold_from_gconf (threshold); + widget = glade_xml_get_widget (xml, "drag_threshold_scale"); + if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) + gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); + } } -/* setup_dialog - * - * Set up the property editors for our dialog - */ - static void -setup_dialog (GtkWidget *widget, Bonobo_PropertyBag bag) +setup_dialog (void) { - GladeXML *dialog; - BonoboPEditor *ed; - GtkWidget *rbs[3]; + GtkSizeGroup *size_group; + GtkWidget *widget; + int double_click; + int threshold; + gfloat acceleration; - dialog = gtk_object_get_data (GTK_OBJECT (widget), "glade-data"); + client = gconf_client_get_default (); + gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (client, "/desktop/gnome/peripherals/mouse", + gconf_changed_callback, + NULL, NULL, NULL); - rbs[0] = WID ("right_handed_select"); - rbs[1] = WID ("left_handed_select"); - rbs[2] = NULL; - ed = BONOBO_PEDITOR (bonobo_peditor_option_radio_construct (rbs)); - bonobo_peditor_set_property (ed, bag, "right-to-left", TC_ulong, NULL); + /* Buttons page + */ + /* Left-handed toggle */ + left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); + right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); + widget = glade_xml_get_widget (xml, "left_handed_toggle"); + if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); + g_signal_connect (widget, "toggled", (GCallback) left_handed_toggle_callback, NULL); - ed = BONOBO_PEDITOR (bonobo_peditor_range_construct (WID ("acceleration_entry"))); - bonobo_peditor_set_property (ed, bag, "acceleration", TC_ulong, NULL); + widget = glade_xml_get_widget (xml, "orientation_image"); + if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) + g_object_set (G_OBJECT (widget), + "pixbuf", left_handed_pixbuf, + NULL); + else + g_object_set (G_OBJECT (widget), + "pixbuf", right_handed_pixbuf, + NULL); - ed = BONOBO_PEDITOR (bonobo_peditor_range_construct (WID ("sensitivity_entry"))); - bonobo_peditor_set_property (ed, bag, "threshold", TC_ulong, NULL); -} + /* Double-click time */ + double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); + double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); + double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); + widget = glade_xml_get_widget (xml, "double_click_darea"); + g_signal_connect (widget, "expose_event", (GCallback) drawing_area_expose_event, NULL); -/* get_legacy_settings - * - * Retrieve older gnome_config -style settings and store them in the - * configuration database. - * - * In most cases, it's best to use the COPY_FROM_LEGACY macro defined in - * capplets/common/capplet-util.h. - */ + double_click = gconf_client_get_int (client, DOUBLE_CLICK_KEY, NULL); + double_click = double_click_from_gconf (double_click); + widget = glade_xml_get_widget (xml, "delay_scale"); + gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) double_click_callback, + NULL); -static void -get_legacy_settings (Bonobo_ConfigDatabase db) -{ - gboolean val_boolean, def; - gulong val_ulong; + /* Cursors page */ + widget = glade_xml_get_widget (xml, "main_notebook"); + gtk_notebook_remove_page (GTK_NOTEBOOK (widget), 1); - COPY_FROM_LEGACY (boolean, "/main/right-to-left", bool, "/Desktop/Mouse/right-to-left"); - COPY_FROM_LEGACY (ulong, "/main/acceleration", int, "/Desktop/Mouse/aceleration=4"); - COPY_FROM_LEGACY (ulong, "/main/threshold", int, "/Desktop/Mouse/threshold=4"); + /* Motion page */ + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "acceleration_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "sensitivity_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "threshold_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "high_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "fast_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "large_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "low_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "slow_label")); + gtk_size_group_add_widget (size_group, + glade_xml_get_widget (xml, "small_label")); + + widget = glade_xml_get_widget (xml, "accel_scale"); + acceleration = gconf_client_get_float (client, MOTION_ACCELERATION_KEY, NULL); + acceleration = motion_acceleration_from_gconf (acceleration); + gtk_range_set_value (GTK_RANGE (widget), acceleration); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) acceleration_callback, + NULL); + + widget = glade_xml_get_widget (xml, "sensitivity_scale"); + threshold = gconf_client_get_int (client, MOTION_THRESHOLD_KEY, NULL); + threshold = threshold_from_gconf (threshold); + gtk_range_set_value (GTK_RANGE (widget), threshold); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) threshold_callback, + MOTION_THRESHOLD_KEY); + + widget = glade_xml_get_widget (xml, "drag_threshold_scale"); + threshold = gconf_client_get_int (client, DRAG_THRESHOLD_KEY, NULL); + threshold = threshold_from_gconf (threshold); + gtk_range_set_value (GTK_RANGE (widget), threshold); + g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), + "value_changed", + (GCallback) threshold_callback, + DRAG_THRESHOLD_KEY); + + /* main dialog */ + widget = glade_xml_get_widget (xml, "mouse_properties_dialog"); + g_signal_connect (G_OBJECT (widget), + "destroy", + gtk_main_quit, NULL); + widget = glade_xml_get_widget (xml, "close_button"); + g_signal_connect (G_OBJECT (widget), + "clicked", + gtk_main_quit, NULL); } int -main (int argc, char **argv) +main (int argc, char *argv[]) { - const gchar *legacy_files[] = { "Desktop", NULL }; + gnome_program_init ("mouse-properties", + "0.1", + gnome_gtk_module_info_get (), + argc, argv, + NULL); - glade_gnome_init (); - capplet_init (argc, argv, legacy_files, apply_settings, create_dialog, setup_dialog, get_legacy_settings); + xml = glade_xml_new ("gnome-mouse-properties.glade", NULL, NULL); + setup_dialog (); + gtk_widget_show_all (glade_xml_get_widget (xml, "mouse_properties_dialog")); + gtk_main (); + + g_object_unref (G_OBJECT (client)); return 0; } diff --git a/capplets/mouse/mouse-right.png b/capplets/mouse/mouse-right.png index a5ab832811ef4b6032759e7d07a684d6b5433a0f..022c69c09d095c45a1215e21af30cfe677c5313d 100644 GIT binary patch literal 9572 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 literal 9448 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