diff -ur orig/hildon-desktop-2.2.100/src/home/hd-home.c hildon-desktop-2.2.100/src/home/hd-home.c --- orig/hildon-desktop-2.2.100/src/home/hd-home.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/home/hd-home.c 2010-01-08 16:58:47.000000000 +0200 @@ -38,6 +38,8 @@ #include "hd-render-manager.h" #include "hd-clutter-cache.h" #include "hd-theme.h" +#include "hd-dbus.h" +#include "hd-title-bar.h" #include "hd-launcher-app.h" @@ -168,9 +170,17 @@ FN_STATE_LOCKED, // until turned off all key press are Fn-modified } fn_state; + /* For hd_home_desktop_key_press() */ + enum + { + SHIFT_STATE_NONE, // interpret the KeyPress as it is + SHIFT_STATE_NEXT, // the next key is shift-modified + SHIFT_STATE_LOCKED, // until turned off all key press are shift-modified + } shift_state; /* Fro hd_home_desktop_key_release(): * Don't change @fn_state if it was wasn't pressed alone. */ gboolean ignore_next_fn_release; + gboolean ignore_next_shift_release; /* Both are reset when the HDRM state is changed. */ }; @@ -198,6 +208,8 @@ static void hd_home_show_edit_button (HdHome *home); +static void hd_home_reset_fn_state (HdHome *home); + static void do_applet_release (HdHome *home, ClutterActor *applet, ClutterButtonEvent *event); @@ -523,11 +535,110 @@ guint32 unicode; unsigned pretend_fn; - if (STATE_NO_CALL_FROM_HOME (hd_render_manager_get_state ())) - return; + if (hd_render_manager_get_state()==HDRM_STATE_LAUNCHER) { + int d; + d=0; + switch(xev->keycode) { + case 24: + case 25: + case 26: + case 27: + case 28: + d=24; + break; + case 38: + case 39: + case 40: + case 41: + case 42: + d=33; + break; + case 52: + case 53: + case 54: + case 55: + case 56: + d=42; + break; + case 22: /* Backspace sends -1, which means up one level */ + d=23; + break; + } + if (d && conf_enable_launcher_navigator_accel) { + hd_launcher_activate(xev->keycode-d); + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+1024); + hd_dbus_send_event(s); + } + } + if (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV) { + int d,y; + d=0; + switch(xev->keycode) { + case 24: + case 25: + case 26: + case 27: + case 28: + d=24; + y=0; + break; + case 38: + case 39: + case 40: + case 41: + case 42: + d=38; + y=1; + break; + case 52: + case 53: + case 54: + case 55: + case 56: + d=52; + y=2; + break; + } + if (d && conf_enable_launcher_navigator_accel) { + if ((xev->state & (FN_MODIFIER|ShiftMask))||priv->fn_state||priv->shift_state) { + hd_task_navigator_activate(xev->keycode-d,y,1); + hd_home_reset_fn_state(home); + } else hd_task_navigator_activate(xev->keycode-d,y,0); + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+2048); + hd_dbus_send_event(s); + } + } + + if (STATE_NO_CALL_FROM_HOME (hd_render_manager_get_state ())) { + } else { + if (xev->keycode==113) { + hd_home_view_container_scroll_to_previous (HD_HOME_VIEW_CONTAINER (priv->view_container), 200); + return ; + } + if (xev->keycode==114) { + hd_home_view_container_scroll_to_next (HD_HOME_VIEW_CONTAINER (priv->view_container), -200); + return ; + } /* g_debug ("%s, display: %p, keymap: %p", __FUNCTION__, display, keymap); */ + if(conf_enable_home_contacts_phone) { pretend_fn = priv->fn_state != FN_STATE_NONE ? FN_MODIFIER : 0; g_debug ("%s. pretend_fn: %d", __FUNCTION__, pretend_fn); gdk_keymap_translate_keyboard_state (keymap, @@ -573,6 +684,18 @@ G_TYPE_STRING, buffer, G_TYPE_INVALID); } } + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+4096); + hd_dbus_send_event(s); + } + } if (xev->state & FN_MODIFIER) { @@ -584,6 +707,16 @@ priv->fn_state = FN_STATE_NONE; g_debug ("%s, FN state: %d", __FUNCTION__, priv->fn_state); } + if (xev->state & ShiftMask) + { + priv->shift_state = SHIFT_STATE_NONE; + priv->ignore_next_shift_release = TRUE; + } + else if (priv->shift_state == SHIFT_STATE_NEXT) + { + priv->shift_state = SHIFT_STATE_NONE; + g_debug ("%s, SHIFT state: %d", __FUNCTION__, priv->shift_state); + } } static void @@ -592,20 +725,37 @@ HdHome *home = userdata; HdHomePrivate *priv = home->priv; - if (STATE_NO_CALL_FROM_HOME (hd_render_manager_get_state ()) - || XkbKeycodeToKeysym(clutter_x11_get_default_display(), - xev->keycode, 0, 0) != FN_KEY) + if (STATE_NO_CALL_FROM_HOME (hd_render_manager_get_state ()) && (hd_render_manager_get_state()!=HDRM_STATE_TASK_NAV)) return; - if (priv->ignore_next_fn_release) - priv->ignore_next_fn_release = FALSE; - else if (priv->fn_state == FN_STATE_NONE) - priv->fn_state = FN_STATE_NEXT; - else if (priv->fn_state == FN_STATE_NEXT) - priv->fn_state = FN_STATE_LOCKED; - else - priv->fn_state = FN_STATE_NONE; - g_debug ("%s. FN state: %d", __FUNCTION__, priv->fn_state); + if(XkbKeycodeToKeysym(clutter_x11_get_default_display(), xev->keycode, 0, 0) == FN_KEY) { + if (priv->ignore_next_fn_release) + priv->ignore_next_fn_release = FALSE; + else if (priv->fn_state == FN_STATE_NONE) + priv->fn_state = FN_STATE_NEXT; + else if (priv->fn_state == FN_STATE_NEXT) + priv->fn_state = FN_STATE_LOCKED; + else + priv->fn_state = FN_STATE_NONE; + if(priv->fn_state && (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV)) { + hd_home_show_edit_button(home); + } + g_debug ("%s. FN state: %d", __FUNCTION__, priv->fn_state); + } + if(XkbKeycodeToKeysym(clutter_x11_get_default_display(), xev->keycode, 0, 0) == GDK_Shift_L) { + if (priv->ignore_next_shift_release) + priv->ignore_next_shift_release = FALSE; + else if (priv->shift_state == SHIFT_STATE_NONE) + priv->shift_state = SHIFT_STATE_NEXT; + else if (priv->shift_state == SHIFT_STATE_NEXT) + priv->shift_state = SHIFT_STATE_LOCKED; + else + priv->shift_state = SHIFT_STATE_NONE; + if(priv->shift_state && (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV)) { + hd_home_show_edit_button(home); + } + g_debug ("%s. SHIFT state: %d", __FUNCTION__, priv->shift_state); + } } static void @@ -613,6 +763,8 @@ { home->priv->fn_state = FN_STATE_NONE; home->priv->ignore_next_fn_release = FALSE; + home->priv->shift_state = SHIFT_STATE_NONE; + home->priv->ignore_next_shift_release = FALSE; } /* Called when a client message is sent to the root window. */ @@ -1621,6 +1773,8 @@ hd_home_hide_edit_button (home); + hd_home_reset_fn_state(home); + return FALSE; } diff -ur orig/hildon-desktop-2.2.100/src/home/hd-task-navigator.c hildon-desktop-2.2.100/src/home/hd-task-navigator.c --- orig/hildon-desktop-2.2.100/src/home/hd-task-navigator.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/home/hd-task-navigator.c 2010-01-10 13:38:46.000000000 +0200 @@ -420,6 +420,7 @@ * or in the application's they belong to. */ TNote *tnote; + time_t last_activated; } Thumbnail; /* }}} */ /* Thumbnail data structures }}} */ @@ -2579,7 +2580,7 @@ /* Called when a %Thumbnail.thwin is clicked. */ static gboolean -appthumb_clicked (const Thumbnail * apthumb) +appthumb_clicked (Thumbnail * apthumb) { if (animation_in_progress (Fly_effect_timeline) || animation_in_progress (Zoom_effect_timeline)) @@ -2594,6 +2595,7 @@ else g_signal_emit_by_name (Navigator, "thumbnail-clicked", apthumb->apwin); + apthumb->last_activated = time(NULL); return TRUE; } @@ -2680,6 +2682,7 @@ apthumb = g_new0 (Thumbnail, 1); apthumb->type = APPLICATION; + apthumb->last_activated = time(NULL); /* We're just in a MapNotify, it shouldn't happen. * mb_wm_object_signal_connect() will take reference * of apthumb->win. */ @@ -3900,5 +3903,44 @@ } /* %HdTaskNavigator }}} */ +static int hd_thumb_compare (gconstpointer a, gconstpointer b) +{ + return ((Thumbnail *)a)->last_activated - ((Thumbnail *)b)->last_activated; +} + +void hd_task_navigator_activate(int x, int y, int close) { + Layout lout; + int n; + GList *t; + if (y==-2) { + GList *s; + if(x<0)x+=NThumbnails; + s=g_list_sort(g_list_copy(Thumbnails), hd_thumb_compare); + t=g_list_nth(s,x); + if(t) { + if(close) appthumb_close_clicked((Thumbnail *)t->data); else + appthumb_clicked((Thumbnail *)t->data); + } + g_list_free(t); + return ; + } else + if (y==-1) { + n=x; + } else { + calc_layout(&lout); + if(lout.cells_per_row<=x) return ; + n=y*lout.cells_per_row+x; + } + if(n>=NThumbnails) return ; + t=Thumbnails; + while((n>0) && t) { + t=t->next; + n--; + } + if(t && !n ) { + if(close) appthumb_close_clicked((Thumbnail *)t->data); else + appthumb_clicked((Thumbnail *)t->data); + } +} /* vim: set foldmethod=marker: */ /* End of hd-task-navigator.c */ diff -ur orig/hildon-desktop-2.2.100/src/home/hd-task-navigator.h hildon-desktop-2.2.100/src/home/hd-task-navigator.h --- orig/hildon-desktop-2.2.100/src/home/hd-task-navigator.h 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/home/hd-task-navigator.h 2009-12-31 15:34:53.000000000 +0200 @@ -74,5 +74,6 @@ HdNote *hdnote); void hd_task_navigator_remove_notification (HdTaskNavigator *self, HdNote *hdnote); +void hd_task_navigator_activate(int x, int y, int close); #endif /* ! __HD_TASK_NAVIGATOR_H__ */ diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-app-mgr.c hildon-desktop-2.2.100/src/launcher/hd-app-mgr.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-app-mgr.c 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-app-mgr.c 2010-01-07 17:45:13.000000000 +0200 @@ -205,6 +205,15 @@ #define GCONF_SLIDE_OPEN_KEY "/system/osso/af/slide-open" #define GCONF_DISABLE_CALLUI_DIR "/apps/osso/hildon-desktop" #define GCONF_DISABLE_CALLUI_KEY "/apps/osso/hildon-desktop/disable_phone_gesture" +#define GCONF_KEY_ACTIONS_DIR "/apps/osso/hildon-desktop/key-actions" + +gboolean conf_enable_ctrl_backspace; +gboolean conf_enable_preset_shift_ctrl; +gboolean conf_enable_dbus_shift_ctrl; +gboolean conf_enable_home_contacts_phone; +gboolean conf_enable_launcher_navigator_accel; +gboolean conf_enable_dbus_launcher_navigator; +gboolean conf_default_launcher_positions; /* Forward declarations */ static void hd_app_mgr_dispose (GObject *gobject); @@ -402,6 +411,13 @@ self); hd_launcher_tree_populate (priv->tree); + conf_enable_ctrl_backspace=TRUE; + conf_enable_preset_shift_ctrl=TRUE; + conf_enable_dbus_shift_ctrl=TRUE; + conf_enable_home_contacts_phone=TRUE; + conf_enable_launcher_navigator_accel=TRUE; + conf_enable_dbus_launcher_navigator=TRUE; + conf_default_launcher_positions=FALSE; /* NOTE: Can we assume this when we start up? */ priv->unlocked = TRUE; priv->display_on = TRUE; @@ -429,6 +445,22 @@ hd_app_mgr_gconf_value_changed, (gpointer) self, NULL, NULL); + if(gconf_client_dir_exists(priv->gconf_client, GCONF_KEY_ACTIONS_DIR, NULL)) { + conf_enable_ctrl_backspace = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/ctrl_backspace", NULL); + conf_enable_preset_shift_ctrl = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/preset_shift_ctrl", NULL); + conf_enable_dbus_shift_ctrl = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/dbus_shift_ctrl", NULL); + conf_enable_home_contacts_phone = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/home_contacts_phone", NULL); + conf_enable_launcher_navigator_accel = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/launcher_navigator_accel", NULL); + conf_enable_dbus_launcher_navigator = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/dbus_launcher_navigator", NULL); + conf_default_launcher_positions = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/default_launcher_positions", NULL); + } } /* Start memory limits. */ diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-app-mgr.h hildon-desktop-2.2.100/src/launcher/hd-app-mgr.h --- orig/hildon-desktop-2.2.100/src/launcher/hd-app-mgr.h 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-app-mgr.h 2010-01-07 16:45:44.000000000 +0200 @@ -99,6 +99,14 @@ void hd_app_mgr_set_render_manager (GObject *rendermgr); +extern gboolean conf_enable_ctrl_backspace; +extern gboolean conf_enable_preset_shift_ctrl; +extern gboolean conf_enable_dbus_shift_ctrl; +extern gboolean conf_enable_home_contacts_phone; +extern gboolean conf_enable_launcher_navigator_accel; +extern gboolean conf_enable_dbus_launcher_navigator; +extern gboolean conf_default_launcher_positions; + G_END_DECLS #endif /* __HD_APP_MGR_H__ */ diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.c hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.c 2009-12-31 14:32:01.000000000 +0200 @@ -921,3 +921,15 @@ { return TRUE; } + +void hd_launcher_grid_activate(ClutterActor *actor, int p) +{ + HdLauncherGridPrivate *priv = HD_LAUNCHER_GRID_GET_PRIVATE (actor); + GList *l; + l=priv->tiles; + while((p>0) && l) { + l=l->next; + p--; + } + if(l && !p) hd_launcher_tile_activate(l->data); +} diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.h hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.h --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.h 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-grid.h 2009-12-27 20:34:14.000000000 +0200 @@ -74,6 +74,8 @@ float amount); void hd_launcher_grid_reset(HdLauncherGrid *grid); +void hd_launcher_grid_activate(ClutterActor *actor, int p); + /* Fixed sizes */ #define HD_LAUNCHER_GRID_MIN_HEIGHT \ (HD_LAUNCHER_PAGE_HEIGHT - HD_LAUNCHER_PAGE_YMARGIN) diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-item.c hildon-desktop-2.2.100/src/launcher/hd-launcher-item.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-item.c 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-item.c 2010-01-09 13:01:32.000000000 +0200 @@ -347,14 +347,18 @@ return TRUE; } +static int def_position=1000; + static guint _hd_launcher_app_main_position (const gchar *id) { static GData *main_apps = NULL; + if (!conf_default_launcher_positions) { + return def_position++; + } if (!main_apps) { g_datalist_init (&main_apps); - /* Main application group. */ g_datalist_set_data (&main_apps, "browser", (gpointer)1); g_datalist_set_data (&main_apps, "mediaplayer", (gpointer)2); @@ -401,7 +405,7 @@ GError *parse_error = NULL; GType item_type; gboolean no_display; - +g_warning("Parsing %s", id); g_return_val_if_fail (key_file != NULL, NULL); if (!g_key_file_has_group (key_file, HD_DESKTOP_ENTRY_GROUP)) diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-page.c hildon-desktop-2.2.100/src/launcher/hd-launcher-page.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-page.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-page.c 2009-12-31 14:31:53.000000000 +0200 @@ -937,3 +937,9 @@ priv = HD_LAUNCHER_PAGE_GET_PRIVATE (page); return priv->drag_distance; } + +void +hd_launcher_page_activate(ClutterActor *actor, int p) { + HdLauncherPagePrivate *priv = HD_LAUNCHER_PAGE_GET_PRIVATE (actor); + hd_launcher_grid_activate(priv->grid, p); +} diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-page.h hildon-desktop-2.2.100/src/launcher/hd-launcher-page.h --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-page.h 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-page.h 2009-12-27 20:34:43.000000000 +0200 @@ -87,6 +87,8 @@ void hd_launcher_page_set_drag_distance(HdLauncherPage *page, float d); float hd_launcher_page_get_drag_distance(HdLauncherPage *page); +void hd_launcher_page_activate(ClutterActor *actor, int p); + /* Fixed sizes. * FIXME: These should come from getting the screen size */ diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.c hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.c 2009-12-31 14:32:10.000000000 +0200 @@ -604,3 +604,9 @@ hd_launcher_tile_set_glow(tile, FALSE); priv->is_pressed = FALSE; } + +void hd_launcher_tile_activate(ClutterActor *actor) +{ + hd_launcher_tile_button_press(actor); + hd_launcher_tile_button_release(actor); +} diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.h hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.h --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.h 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher-tile.h 2009-12-27 20:33:44.000000000 +0200 @@ -76,6 +76,8 @@ void hd_launcher_tile_reset(HdLauncherTile *tile); +void hd_launcher_tile_activate(ClutterActor *actor); + /* Fixed size */ #define HD_LAUNCHER_TILE_HEIGHT (100) #define HD_LAUNCHER_TILE_WIDTH (142) diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher.c hildon-desktop-2.2.100/src/launcher/hd-launcher.c --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher.c 2010-01-02 14:21:51.000000000 +0200 @@ -109,6 +109,9 @@ static gboolean hd_launcher_background_clicked (HdLauncher *self, ClutterButtonEvent *event, gpointer *data); +static gboolean hd_launcher_key_pressed (HdLauncher *self, + ClutterButtonEvent *event, + gpointer *data); static void hd_launcher_populate_tree_starting (HdLauncherTree *tree, gpointer data); static void hd_launcher_populate_tree_finished (HdLauncherTree *tree, @@ -212,6 +215,8 @@ G_CALLBACK(hd_launcher_captured_event_cb), 0); g_signal_connect (self, "button-release-event", G_CALLBACK(hd_launcher_background_clicked), 0); + g_signal_connect (self, "key-pressed-event", + G_CALLBACK(hd_launcher_key_pressed), 0); /* App launch transition */ priv->launch_image = 0; @@ -851,3 +856,26 @@ return TRUE; } + +static gboolean +hd_launcher_key_pressed (HdLauncher *self, + ClutterButtonEvent *event, + gpointer *data) +{ +// HdLauncherPrivate *priv = HD_LAUNCHER_GET_PRIVATE (hd_launcher_get ()); + + hd_launcher_back_button_clicked(0, 0, 0); + + return TRUE; +} + +void +hd_launcher_activate(int p) { + HdLauncherPrivate *priv = HD_LAUNCHER_GET_PRIVATE (hd_launcher_get ()); + if(p==-1) { + hd_launcher_back_button_clicked(0, 0, 0); + return; + } + hd_launcher_page_activate(priv->active_page, p); +} + diff -ur orig/hildon-desktop-2.2.100/src/launcher/hd-launcher.h hildon-desktop-2.2.100/src/launcher/hd-launcher.h --- orig/hildon-desktop-2.2.100/src/launcher/hd-launcher.h 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/launcher/hd-launcher.h 2009-12-27 20:35:31.000000000 +0200 @@ -94,6 +94,8 @@ void hd_launcher_stop_loading_transition (void); +void hd_launcher_activate(int p); + /* left/right/top/bottom margin that is clicked on to go back */ #define HD_LAUNCHER_LEFT_MARGIN (68) /* layout guide F */ #define HD_LAUNCHER_RIGHT_MARGIN (68) /* layout guide F */ diff -ur orig/hildon-desktop-2.2.100/src/main.c hildon-desktop-2.2.100/src/main.c --- orig/hildon-desktop-2.2.100/src/main.c 2009-10-27 20:44:33.000000000 +0200 +++ hildon-desktop-2.2.100/src/main.c 2010-01-10 15:06:10.000000000 +0200 @@ -48,6 +48,7 @@ #include "hd-wm.h" #include "hd-theme.h" #include "hd-util.h" +#include "hd-dbus.h" #include "hd-volume-profile.h" #include "launcher/hd-app-mgr.h" #include "home/hd-render-manager.h" @@ -61,6 +62,8 @@ KEY_ACTION_TOGGLE_NON_COMP_MODE, KEY_ACTION_TAKE_SCREENSHOT, KEY_ACTION_XTERMINAL, + KEY_ACTION_SEND_DBUS, + KEY_ACTION_HOME, }; #ifdef MBWM_DEB_VERSION @@ -215,6 +218,10 @@ /* printf(" ### KEY_ACTION_TOGGLE_SWITCHER ###\n"); */ hd_render_manager_set_state (HDRM_STATE_TASK_NAV); break; + case KEY_ACTION_HOME: + /* printf(" ### KEY_ACTION_HOMRE ###\n"); */ + hd_render_manager_set_state (HDRM_STATE_HOME); + break; case KEY_ACTION_TOGGLE_NON_COMP_MODE: /* printf(" ### KEY_ACTION_TOGGLE_NON_COMP_MODE ###\n"); */ if (hd_render_manager_get_state () == HDRM_STATE_NON_COMPOSITED) @@ -239,6 +246,19 @@ break; } } +static void +key_binding_func_key (MBWindowManager *wm, + MBWMKeyBinding *binding, + void *userdata) +{ + int action; + char s[32]; + + action = (int)(userdata); + sprintf(s,"%i",action); + + hd_dbus_send_event (s); +} static ClutterX11FilterReturn clutter_x11_event_filter (XEvent *xev, ClutterEvent *cev, gpointer data) @@ -478,6 +498,7 @@ Display * dpy = NULL; MBWindowManager *wm; HdAppMgr *app_mgr; + char keys1[32], keys2[32], c; signal (SIGUSR1, dump_debug_info_sighand); signal (SIGHUP, relaunch); @@ -552,11 +573,34 @@ mb_wm_init (wm); g_assert (mb_wm_comp_mgr_enabled (wm->comp_mgr)); + if(conf_enable_ctrl_backspace) { + mb_wm_keys_binding_add_with_spec (wm, + "BackSpace", + key_binding_func, + NULL, + (void*)KEY_ACTION_TOGGLE_SWITCHER); mb_wm_keys_binding_add_with_spec (wm, "BackSpace", key_binding_func, NULL, (void*)KEY_ACTION_TOGGLE_SWITCHER); + } + if(conf_enable_preset_shift_ctrl) { + mb_wm_keys_binding_add_with_spec (wm, + "h", + key_binding_func, + NULL, + (void*)KEY_ACTION_HOME); + mb_wm_keys_binding_add_with_spec (wm, + "h", + key_binding_func, + NULL, + (void*)KEY_ACTION_HOME); + mb_wm_keys_binding_add_with_spec (wm, + "x", + key_binding_func, + NULL, + (void*)KEY_ACTION_XTERMINAL); mb_wm_keys_binding_add_with_spec (wm, "x", key_binding_func, @@ -572,7 +616,68 @@ key_binding_func, NULL, (void*)KEY_ACTION_TAKE_SCREENSHOT); + } + if(conf_enable_dbus_shift_ctrl) { + mb_wm_keys_binding_add_with_spec (wm, + "F7", + key_binding_func_key, + NULL, + (void*)247); + mb_wm_keys_binding_add_with_spec (wm, + "F8", + key_binding_func_key, + NULL, + (void*)248); + mb_wm_keys_binding_add_with_spec (wm, + "Space", + key_binding_func_key, + NULL, + (void*)(192+32)); + mb_wm_keys_binding_add_with_spec (wm, + "comma", + key_binding_func_key, + NULL, + (void*)(192+33)); + mb_wm_keys_binding_add_with_spec (wm, + "period", + key_binding_func_key, + NULL, + (void*)(192+34)); + mb_wm_keys_binding_add_with_spec (wm, + "Space", + key_binding_func_key, + NULL, + (void*)(192+36)); + mb_wm_keys_binding_add_with_spec (wm, + "comma", + key_binding_func_key, + NULL, + (void*)(192+37)); + mb_wm_keys_binding_add_with_spec (wm, + "period", + key_binding_func_key, + NULL, + (void*)(192+38)); + + strcpy(keys1,"a"); + strcpy(keys2,"a"); + for(c='a';c<='z';c++) if(!conf_enable_preset_shift_ctrl || ((c!='n') && (c!='p') && (c!='x') && (c!='h'))){ + keys1[strlen(keys1)-1]=c; + keys2[strlen(keys2)-1]=c; + mb_wm_keys_binding_add_with_spec (wm, + keys1, + key_binding_func_key, + NULL, + (void*)(192+c-'a'+1)); + mb_wm_keys_binding_add_with_spec (wm, + keys2, + key_binding_func_key, + NULL, + (void*)(192+c-'a'+1)); + } + } + clutter_x11_add_filter (clutter_x11_event_filter, wm); app_mgr = hd_app_mgr_get (); diff -ur orig/hildon-desktop-2.2.100/src/util/hd-dbus.c hildon-desktop-2.2.100/src/util/hd-dbus.c --- orig/hildon-desktop-2.2.100/src/util/hd-dbus.c 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/util/hd-dbus.c 2010-01-10 00:50:35.000000000 +0200 @@ -3,6 +3,7 @@ #include "hd-switcher.h" #include "hd-render-manager.h" #include "hd-volume-profile.h" +#include "hd-task-navigator.h" #include #include @@ -47,6 +48,90 @@ hd_render_manager_set_state (HDRM_STATE_TASK_NAV); return DBUS_HANDLER_RESULT_HANDLED; } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "set_state")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + switch(sigvalue) { + case HDRM_STATE_HOME : + case HDRM_STATE_HOME_PORTRAIT: + case HDRM_STATE_APP: + case HDRM_STATE_APP_PORTRAIT: + case HDRM_STATE_TASK_NAV: + case HDRM_STATE_LAUNCHER: + case HDRM_STATE_NON_COMPOSITED: + case HDRM_STATE_NON_COMP_PORT: + hd_render_manager_set_state (sigvalue); + break; + } + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "activate_window")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -1, 0); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "close_window")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -1, 1); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "activate_window_time")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -2, 0); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "close_window_time")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -2, 1); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -177,6 +262,37 @@ } } +void hd_dbus_send_event (char *value) +{ + DBusMessage *msg; + dbus_bool_t b; + DBusMessageIter args; + + if (sysbus_conn == NULL) { + g_warning ("%s: no D-Bus system bus connection", __func__); + return; + } + msg = dbus_message_new_signal("/com/nokia/hildon_desktop", "com.nokia.hildon_desktop", "KeyEvent"); + if (msg == NULL) { + g_warning ("%s: could not create message", __func__); + return; + } + + dbus_message_iter_init_append(msg, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &value)) { + g_warning("Out Of Memory!"); + return; + } + + b = dbus_connection_send(sysbus_conn, msg, NULL); + if (!b) { + g_warning ("%s: dbus_connection_send() failed", __func__); + } else { + dbus_connection_flush(sysbus_conn); + } + dbus_message_unref(msg); +} + DBusConnection * hd_dbus_init (HdCompMgr * hmgr) { diff -ur orig/hildon-desktop-2.2.100/src/util/hd-dbus.h hildon-desktop-2.2.100/src/util/hd-dbus.h --- orig/hildon-desktop-2.2.100/src/util/hd-dbus.h 2009-10-27 20:44:34.000000000 +0200 +++ hildon-desktop-2.2.100/src/util/hd-dbus.h 2009-12-24 14:06:31.000000000 +0200 @@ -16,5 +16,5 @@ const gchar *interface, const gchar *method, const gchar *launch_param); - +void hd_dbus_send_event (char *value); #endif