aboutsummaryrefslogtreecommitdiff
path: root/callbacks.c
blob: 1daefc4c24c09d84e83b8580e7d8084f9e5f3664 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <gdk/gdkkeysyms.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <webkit/webkit.h>
#include <glib/gstdio.h>
#include "defaults.h"
#include "callbacks.h"

#include "sb.h"


/* key press callback function. NEEDED: a config.h where keys are defined */
gboolean cb_keypress (GtkWidget *widget, GdkEventKey *event) {
  
  guint(g) = event->keyval;

  /* yes while this may look like it doesn't follow coding standards, I find this sane */
  if ( (event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK ) {
    switch(g) {
      case GDK_KEY_l: grab_bar(); return TRUE; break;
      case GDK_KEY_f: show_search(TRUE);	return TRUE; break;
      case GDK_KEY_g: tab_and_go(); return TRUE; break;
      case GDK_KEY_Back: cb_go(FALSE); return TRUE; break;
      case GDK_KEY_Forward: cb_go(TRUE); return TRUE; break;
      case GDK_KEY_comma: cb_go(FALSE); return TRUE; break;
      case GDK_KEY_period: cb_go(TRUE); return TRUE; break;
      case GDK_KEY_o: history_command(); return TRUE; break;
      case GDK_KEY_h: toggle(); focus_view(); return TRUE; break;
      case GDK_KEY_Page_Up: tab_switch(FALSE); return TRUE; break;
      case GDK_KEY_Page_Down: tab_switch(TRUE); return TRUE; break;
      case GDK_KEY_t: tab_new(FALSE); gtk_widget_grab_focus(w.bar); return TRUE; break;
      case GDK_KEY_w: tab_close(); return TRUE; break;
      case GDK_KEY_bracketright: tab_zoom(TRUE); return TRUE; break;
      case GDK_KEY_bracketleft: tab_zoom(FALSE); return TRUE; break;
      case GDK_KEY_r: tab_reload(TRUE); return TRUE; break;
      case GDK_KEY_e: tab_reload(FALSE); return TRUE; break;
	    case GDK_KEY_s: tab_view_source(); return TRUE; break;
	    case GDK_KEY_Return: load_uri(g_strconcat(DEFAULT_SEARCH, gtk_entry_get_text(GTK_ENTRY(w.bar)), NULL)); return TRUE; break;
	    default: return FALSE; break;
    }
  }

  if (gtk_widget_has_focus(w.bar) && g == GDK_KEY_Escape) 
    {	
      gtk_widget_grab_focus(GTK_WIDGET(w.notebook)); 
      return TRUE; 
    }

  if (gtk_widget_has_focus(w.searchbar)) {
		if (g == GDK_KEY_Escape) {
      show_search(FALSE); 
      focus_view(); 
      return TRUE; 
    }

		if ((g == GDK_KEY_Return) && (event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)
    { 
      search(NULL, FALSE); 
    }
  }
  
  return FALSE; 
}

/* download callback */
void cb_download(WebKitWebView *web_view, GObject *d, gpointer user_data) {
  
  gchar *command;
  const gchar *download_url = webkit_download_get_uri(WEBKIT_DOWNLOAD(d));
  const gchar *requested_name = webkit_download_get_suggested_filename(WEBKIT_DOWNLOAD(d));

  command = g_new0(gchar, strlen(DEFAULT_DOWNLOAD_COMMAND) + strlen(DEFAULT_DOWNLOAD_LOCATION) + strlen(requested_name) + strlen(download_url) + 1);
  g_sprintf(command, DEFAULT_DOWNLOAD_COMMAND, DEFAULT_DOWNLOAD_LOCATION, requested_name, download_url);
  g_spawn_command_line_async(command, NULL);

  g_free(command);
}

/* entry callback */
void cb_entry (GtkWidget* entry, gpointer data) {
  
  struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(w.notebook));

  load_uri(g_strdup(gtk_entry_get_text (GTK_ENTRY (w.bar))));
  gtk_widget_grab_focus(GTK_WIDGET(t->view));
 
  if(w.hide) {
    gtk_widget_hide(w.bar);
  }
  
  w.hide = FALSE;
}

/* link hovering callback */
void cb_link_hover (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data) {

  if(link != NULL) { 
    gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, link);  
  }
  else { 
    gtk_statusbar_push(GTK_STATUSBAR(w.status), 0, ""); 
  }
}

/* go forward or backwards, simple enough */
void cb_go(gboolean b) {

  struct tab *t = get_tab(NULL, gtk_notebook_get_current_page(w.notebook));

  if (b) {
    webkit_web_view_go_forward(t->view); 
  }
  else {
    webkit_web_view_go_back(t->view);
  }
}


/* when the page load is commited, call this function */
void cb_load_status (GObject* object, GParamSpec* pspec, tab *t) {
  
  const gchar* uri = webkit_web_view_get_uri(t->view);
  WebKitLoadStatus status = webkit_web_view_get_load_status(t->view);
  
  switch(status) {
    case WEBKIT_LOAD_PROVISIONAL:
      break;
    case WEBKIT_LOAD_COMMITTED:
      
      if (gtk_notebook_get_current_page(w.notebook) ==  gtk_notebook_page_num(w.notebook, t->scroll)) {
        gtk_entry_set_text (GTK_ENTRY (w.bar), uri); 
      }
      
      FILE *history  = fopen(g_build_filename(g_get_home_dir(), DEFAULT_HISTORY_FILE, NULL), "a+");
      
      if(!history == NULL) {
      fprintf(history, "%s \n", uri);
      fclose(history);
      }

      break;
    case WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT:
        break;
    case WEBKIT_LOAD_FINISHED:
        break;
    case WEBKIT_LOAD_FAILED:
        break;
    default:
        break;
  }
}

/* title change callback */
void cb_title_changed(WebKitWebView *v, WebKitWebFrame *f, const char *title, tab *t) {

  gchar *tabtitle;

  if(gtk_notebook_get_current_page(w.notebook) ==  gtk_notebook_page_num(w.notebook, t->scroll)) {
    gtk_window_set_title(GTK_WINDOW(w.win), g_strconcat(title, NULL));
  }

  if(strlen(title) <  DEFAULT_TAB_LENGTH ) {
    tabtitle = g_strdup(title);
  } 
  else {
    tabtitle = g_strndup(title, DEFAULT_TAB_LENGTH);
     strcat(tabtitle, "...");
  }

  gtk_label_set_label(GTK_LABEL(t->label), tabtitle);
}